[
  {
    "path": ".deepsource.toml",
    "content": "version = 1\n\n[[analyzers]]\nname = \"go\"\nenabled = true\n\n  [analyzers.meta]\n  import_paths = [\"github.com/GoAdminGroup/go-admin\"]\n"
  },
  {
    "path": ".drone.yml",
    "content": "---\nkind: pipeline\ntype: docker\nname: api_mysql\n\ntrigger:\n  event:\n  - pull_request\n\nclone:\n  disable: true\n\nservices:\n- name: db_mysql\n  image: mysql:5.7\n  environment:\n    MYSQL_ROOT_PASSWORD: root\n    MYSQL_DATABASE: go-admin-test\n\nsteps:  \n- name: api\n  image: chg80333/goadmin-test:v9\n  environment:\n    GO111MODULE: on\n    GOPROXY: https://goproxy.cn\n  commands:\n  - cd /go/src/github.com/GoAdminGroup/go-admin\n  - git pull\n  - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST\n  - git checkout pr$DRONE_PULL_REQUEST\n  - go version\n  - sleep 80\n  - GOPROXY=https://goproxy.cn make mysql-test\n\n# ---\n# kind: pipeline\n# type: docker\n# name: api_mssql\n\n# trigger:\n#   event:\n#   - pull_request\n\n# clone:\n#   disable: true\n\n# volumes:\n# - name: data\n#   temp: {}\n\n# services:\n# - name: db_mssql\n#   image: mcr.microsoft.com/mssql/server:2017-latest\n#   volumes:\n#   - name: data\n#     path: /home/data\n#   environment:\n#     ACCEPT_EULA: Y\n#     SA_PASSWORD: Aa123456\n\n# steps:\n# - name: api\n#   image: chg80333/goadmin-test:v9\n#   volumes:\n#   - name: data\n#     path: /go/src/github.com/GoAdminGroup/go-admin/tests/data\n#   environment:\n#     GO111MODULE: on\n#     GOPROXY: https://goproxy.cn\n#   commands:\n#   - cd /go/src/github.com/GoAdminGroup/go-admin\n#   - git pull\n#   - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST\n#   - git checkout pr$DRONE_PULL_REQUEST\n#   - go version\n#   - sleep 80\n#   - GOPROXY=https://goproxy.cn make ms-test\n\n---\nkind: pipeline\ntype: docker\nname: api_postgres\n\ntrigger:\n  event:\n  - pull_request\n\nclone:\n  disable: true\n\nservices:\n- name: db_pgsql\n  image: postgres:10\n  environment:\n    POSTGRES_USER: postgres\n    POSTGRES_DB: go-admin-test\n    POSTGRES_PASSWORD: root \n\nsteps:  \n- name: api\n  image: chg80333/goadmin-test:v9\n  environment:\n    GO111MODULE: on\n    GOPROXY: https://goproxy.cn\n  commands:\n  - cd /go/src/github.com/GoAdminGroup/go-admin\n  - git pull\n  - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST\n  - git checkout pr$DRONE_PULL_REQUEST\n  - go version\n  - sleep 80\n  - GOPROXY=https://goproxy.cn make pg-test\n\n---\nkind: pipeline\ntype: docker\nname: api_sqlite\n\ntrigger:\n  event:\n  - pull_request\n\nclone:\n  disable: true\n\nsteps:  \n- name: api\n  image: chg80333/goadmin-test:v9\n  environment:\n    GO111MODULE: on\n    GOPROXY: https://goproxy.cn\n  commands:\n  - cd /go/src/github.com/GoAdminGroup/go-admin\n  - git pull\n  - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST\n  - git checkout pr$DRONE_PULL_REQUEST\n  - go version\n  - sleep 80\n  - GOPROXY=https://goproxy.cn make sqlite-test\n\n---\nkind: pipeline\ntype: docker\nname: frontend\n\ntrigger:\n  event:\n  - pull_request\n\nclone:\n  disable: true\n\nservices:\n- name: db_mysql\n  image: mysql:5.7\n  environment:\n    MYSQL_ROOT_PASSWORD: root\n    MYSQL_DATABASE: go-admin-test  \n\nsteps:\n- name: chrome\n  image: chg80333/goadmin-test:v9\n  environment:\n    GO111MODULE: on\n    GOPROXY: https://goproxy.cn\n  commands:\n  - cd /go/src/github.com/GoAdminGroup/go-admin\n  - git pull\n  - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST\n  - git checkout pr$DRONE_PULL_REQUEST\n  - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &\n  - sleep 8\n  - GOPROXY=https://goproxy.cn make web-test\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub:\npatreon:\nopen_collective: go-admin\nko_fi: \ntidelift:\ncommunity_bridge:\nliberapay:\nissuehunt:\notechie:\ncustom: ['https://www.paypal.me/cg80333']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]\"\nlabels: \"\\U0001F41Bbug\"\nassignees: ''\n\n---\n\n### Bug Description [describe the bug in detail]\n\n### How to reproduce [describe the steps how to reproduce the bug]\n\n### Expect [describe your expect result]\n\n### Reproduction code [here to show your codes or examples]\n\n### Versions\n\n- GoAdmin version: [e.g. 1.0.0]\n- golang version\n- Browser\n- OS [e.g. mac OS]\n\n### Others [screenshots or others info here]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report_zh.md",
    "content": "---\nname: Bug 报告\nabout: 提交bug帮助我们修复\ntitle: \"[BUG]\"\nlabels: \"\\U0001F41Bbug\"\nassignees: ''\n\n---\n\n### bug 描述 [详细地描述 bug，让大家都能理解]\n\n### 复现步骤 [清晰描述复现步骤，让别人也能看到问题]\n\n### 期望结果 [描述你原本期望看到的结果]\n\n### 复现代码 [提供可复现的代码，仓库，或线上示例]\n\n### 版本信息:\n\n- GoAdmin 版本：\n- golang 版本：\n- 浏览器环境：\n- 开发环境：\n\n### 其他信息 [如截图等其他信息可以贴在这里]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/proposal.md",
    "content": "---\nname: Proposal\nabout: Any advice for GoAdmin\ntitle: \"[Proposal]\"\nlabels: ''\nassignees: ''\n\n---\n\n### Description [describe your advice]\n\n### Solution [if any solutions, describe here]\n\n### Others [screenshots and other info]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/proposal_zh.md",
    "content": "---\nname: 功能需求\nabout: 对 GoAdmin 的需求或建议\ntitle: \"[Proposal]\"\nlabels: ''\nassignees: ''\n\n---\n\n### 需求描述 [详细地描述需求，让大家都能理解]\n\n### 解决方案 [如果你有解决方案，在这里清晰地阐述]\n\n### 其他信息 [如截图等其他信息可以贴在这里]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/questions.md",
    "content": "---\nname: Questions\nabout: Any questions when using GoAdmin\ntitle: \"[Question]\"\nlabels: ''\nassignees: ''\n\n---\n\n### Description [describe your questions]\n\n### Example code [If you have any code info]\n\n### Others [screenshots or other info]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/questions_zh.md",
    "content": "---\nname: 疑问或需要帮助 ❓\nabout: 关于 GoAdmin 的问题\ntitle: \"[Question]\"\nlabels: ''\nassignees: ''\n\n---\n\n### 问题描述 [详细地描述问题，让大家都能理解]\n\n### 示例代码 [如果有必要，展示代码，线上示例，或仓库]\n\n### 其他信息 [如截图等其他信息可以贴在这里]\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea\n.vscode\n.DS_Store\ndemo/config.json\ndemo/config\ndemo/deploy.yml\ndemo/hosts\ndemo/go-admin\ndemo/Makefile\ndemo/deploy.retry\nvendor/**\n!vendor/vendor.json\nlogs\nadm/build\ntemplate/login/assets/login\nuploads"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n- Using welcoming and inclusive language\n- Being respectful of differing viewpoints and experiences\n- Gracefully accepting constructive criticism\n- Focusing on what is best for the community\n- Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n- The use of sexualized language or imagery and unwelcome sexual attention or advances\n- Trolling, insulting/derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or electronic address, without explicit permission\n- Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at chg80333@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nIf you want to contribute, but not sure what to do, here's a list of things that I always need help with:\n\n* Translations\n    * README.md\n    * [docs](https://github.com/GoAdminGroup/docs/issues/1)\n* Bug-hunting\n* Finding security problems\n* Themes and Plugins\n\nSee [manual](https://github.com/GoAdminGroup/go-admin/projects/3) for more information.\n\nYou can view all open issues on github, which is usually a good starting point if you want to start contributing:\n\nhttps://github.com/search?q=org%3AGoAdminGroup+is%3Aopen+is%3Aissue+archived%3Afalse&type=Issues\n\n## how to\n\nGoAdmin uses GitHub to manage reviews of pull requests:\n\n- If you have a trivial fix or improvement, go ahead and create a pull request.\n- If you plan to do something more involved, discuss your ideas on the relevant GitHub issue.\n\nFor now, you need to add your fork as a remote on the original **\\$GOPATH**/src/github.com/GoAdminGroup/go-admin clone, so:\n\n```bash\n\n$ go get github.com/GoAdminGroup/go-admin\n$ cd $GOPATH/src/github.com/GoAdminGroup/go-admin # GOPATH is $HOME/go by default.\n\n$ git remote add <FORK_NAME> <FORK_URL>\n```\n\nAnd before you commit, remember to execute the command: \n\n```\nmake test\n```\n\nSee the Makefile for more details.\n\nNotice: `go get` return `package github.com/GoAdminGroup/go-admin: no Go files in /go/src/github.com/GoAdminGroup/go-admin` is normal.\n\n### Dependency management\n\nWe uses [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) to manage dependencies on external packages.\nThis requires a working Go environment with version 1.13 or greater and git installed.\n\nTo add or update a new dependency, use the `go get` command:\n\n```bash\n# Pick the latest tagged release.\ngo get example.com/some/module/pkg\n\n# Pick a specific version.\ngo get example.com/some/module/pkg@vX.Y.Z\n```\n\nTidy up the `go.mod` and `go.sum` files:\n\n```bash\ngo mod tidy\ngo mod vendor\ngit add go.mod go.sum vendor\ngit commit\n```\n\nYou have to commit the changes to `go.mod` and `go.sum` before submitting the pull request.\n\n# Support\n\nYou can also donate or become a patreon, which helps out covering server costs and potentially make it possible to put out bounties:\n\n* **Support on [Open Collective](https://opencollective.com/go-admin)**\n* Donate via [PayPal](https://paypal.me/cg80333)\n\n# Members\n\nIf you are a member of the official GoAdmin developer Team:\n\n* [Discussions](http://forum.go-admin.cn)\n* [Tasks](https://github.com/GoAdminGroup/go-admin/projects)\n* [Chat](https://t.me/joinchat/NlyH6Bch2QARZkArithKvg)"
  },
  {
    "path": "CONTRIBUTING_CN.md",
    "content": "# 贡献\n\n如果你想要对项目作出贡献，却不知道怎么做，下面有一些帮助：\n\n* 翻译\n    * README.md\n    * [docs](https://github.com/GoAdminGroup/docs/issues/1)\n* 寻找BUG\n* 寻找安全问题\n* 主题和插件\n\n在这里：[功能规划](https://github.com/GoAdminGroup/go-admin/projects/3) 可以获得更多信息。\n\n你也可以看一下所有开放的issues，从这里去入手：\n\nhttps://github.com/search?q=org%3AGoAdminGroup+is%3Aopen+is%3Aissue+archived%3Afalse&type=Issues\n\n## 如何做贡献\n\nGoAdmin 使用 GitHub 来管理项目代码：\n\n- 如果你发现一些微不足道的fix或者功能增加，直接提pr即可；\n- 如果你有一些提议，那么你可以先开一个issue进行讨论；\n\n然后，你需要fork远程的master分支到你本地 **\\$GOPATH**/src/github.com/GoAdminGroup/go-admin ：\n\n```bash\n\n$ go get github.com/GoAdminGroup/go-admin\n$ cd $GOPATH/src/github.com/GoAdminGroup/go-admin # GOPATH is $HOME/go by default.\n\n$ git remote add <FORK_NAME> <FORK_URL>\n```\n\n在你提交代码之前，记得执行下面这个命令： \n\n```\nmake test\n```\n\n看根目录下的```Makefile```获得更多信息。\n\n注意了： `go get` 返回 `package github.com/GoAdminGroup/go-admin: no Go files in /go/src/github.com/GoAdminGroup/go-admin` 是正常的。\n\n### 依赖管理\n\n我们使用 [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) 来管理依赖。\n这需要 golang 版本大于1.11，以及安装了 git\n\n要增加或更新依赖，就使用 `go get` 命令：\n\n```bash\n# Pick the latest tagged release.\ngo get example.com/some/module/pkg\n\n# Pick a specific version.\ngo get example.com/some/module/pkg@vX.Y.Z\n```\n\n整理好 `go.mod` 和 `go.sum`：\n\n```bash\ngo mod tidy\ngo mod vendor\ngit add go.mod go.sum vendor\ngit commit\n```\n\n直接提交 `go.mod` and `go.sum` 的修改。\n\n# 赞助\n\n你可以捐助或参与众筹来帮助我们维护服务器费用，以及提供一些奖金资助项目发展。\n\n* **Support on [Open Collective](https://opencollective.com/go-admin)**\n* Donate via [PayPal](https://paypal.me/cg80333)\n\n# 成员\n\n如果你已经是GoAdmin的官方开发组成员：\n\n* [Discussions](http://forum.go-admin.cn)\n* [Tasks](https://github.com/GoAdminGroup/go-admin/projects)\n* [Chat](https://t.me/joinchat/NlyH6Bch2QARZkArithKvg)"
  },
  {
    "path": "DONATION.md",
    "content": "# Donation List 捐赠名单（排名不分先后）"
  },
  {
    "path": "Dockerfile",
    "content": "# This file describes the standard way to build GoAdmin develop env image, and using container\n#\n# Usage:\n#\n# # Assemble the code dev environment, get related database tools in docker-compose.yml, It is slow the first time.\n# docker build -t goadmin:1.0 .\n#\n# # Mount your source code to container for quick developing:\n# docker run -v `pwd`:/home/goadmin --name -d goadmin:1.0\n# docker exec -it goadmin /bin/bash\n# # if your local code has been changed ,you can restart the container to take effect\n# docker restart goadmin\n#  \n\nFROM golang:latest\nMAINTAINER josingcjx\nCOPY . /home/goadmin\nENV GOPATH=$GOPATH:/home/goadmin/ GOPROXY=https://mirrors.aliyun.com/goproxy,https://goproxy.cn,direct\nRUN apt-get update --fix-missing && \\\n    apt-get install -y zip vim postgresql mysql-common default-mysql-server && \\\n    tar -C / -xvf /home/goadmin/tools/godependacy.tgz \n    #if install dependacy tools failed, you can copy local's to remote\n    #mkdir -p /go/bin  && \\\n    #mv /home/goadmin/tools/{gotest,goimports,golint,golangci-lint,adm} /go/bin\n    #go get golang.org/x/tools/cmd/goimports && \\\n    #go get github.com/rakyll/gotest && \\\n    #go get -u golang.org/x/lint/golint && \\\n    #go install github.com/GoAdminGroup/adm@latest && \\\n    #go get -u github.com/golangci/golangci-lint/cmd/golangci-lint\nWORKDIR /home/goadmin"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "Makefile",
    "content": "GOCMD = go\nGOBUILD = $(GOCMD) build\n\nTEST_CONFIG_PATH=./../../common/config.json\nTEST_CONFIG_PQ_PATH=./../../common/config_pg.json\nTEST_CONFIG_SQLITE_PATH=./../../common/config_sqlite.json\nTEST_CONFIG_MS_PATH=./../../common/config_ms.json\nTEST_FRAMEWORK_DIR=./tests/frameworks\n\n## database configs\nMYSQL_HOST = db_mysql\nMYSQL_PORT = 3306\nMYSQL_USER = root\nMYSQL_PWD = root\n\nPOSTGRESSQL_HOST = db_pgsql\nPOSTGRESSQL_PORT = 5432\nPOSTGRESSQL_USER = postgres\nPOSTGRESSQL_PWD = root\n\nTEST_DB = go-admin-test\n\nall: test\n\n## tests\n\ntest: cp-mod black-box-test web-test restore-mod\n\n## tests: black box tests\n\nblack-box-test: mysql-test pg-test sqlite-test ms-test\n\nmysql-test: $(TEST_FRAMEWORK_DIR)/*\n\tgo get github.com/ugorji/go/codec@none\n\tfor file in $^ ; do \\\n\tmake import-mysql ; \\\n\tgo test -mod=mod -gcflags=all=-l -v ./$${file}/... -args $(TEST_CONFIG_PATH) ; \\\n\tdone\n\nsqlite-test: $(TEST_FRAMEWORK_DIR)/*\n\tfor file in $^ ; do \\\n\tmake import-sqlite ; \\\n\tgo test -mod=mod -gcflags=all=-l ./$${file}/... -args $(TEST_CONFIG_SQLITE_PATH) ; \\\n\tdone\n\npg-test: $(TEST_FRAMEWORK_DIR)/*\n\tfor file in $^ ; do \\\n\tmake import-postgresql ; \\\n\tgo test -mod=mod -gcflags=all=-l ./$${file}/... -args $(TEST_CONFIG_PQ_PATH) ; \\\n\tdone\n\nms-test: $(TEST_FRAMEWORK_DIR)/*\n\tfor file in $^ ; do \\\n\tmake import-mssql ; \\\n\tgo test -mod=mod -gcflags=all=-l ./$${file}/... -args $(TEST_CONFIG_MS_PATH) ; \\\n\tdone\n\n## tests: user acceptance tests\n\nweb-test: import-mysql\n\tgo test -mod=mod ./tests/web/...\n\trm -rf ./tests/web/User*\n\nweb-test-debug: import-mysql\n\tgo test -mod=mod ./tests/web/... -args true\n\n## tests: unit tests\n\nunit-test:\n\tgo test -mod=mod ./adm/...\n\tgo test -mod=mod ./context/...\n\tgo test -mod=mod ./modules/...\n\tgo test -mod=mod ./plugins/admin/controller/...\n\tgo test -mod=mod ./plugins/admin/modules/parameter/...\n\tgo test -mod=mod ./plugins/admin/modules/table/...\n\tgo test -mod=mod ./plugins/admin/modules/...\n\n## tests: helpers\n\nimport-sqlite:\n\trm -rf ./tests/common/admin.db\n\tcp ./tests/data/admin.db ./tests/common/admin.db\n\nimport-mysql:\n\tmysql -h$(MYSQL_HOST) -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PWD} -e \"create database if not exists \\`${TEST_DB}\\`\"\n\tmysql -h$(MYSQL_HOST) -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PWD} ${TEST_DB} < ./tests/data/admin.sql\n\nimport-postgresql:\n\tPGPASSWORD=${POSTGRESSQL_PWD} dropdb -h ${POSTGRESSQL_HOST} -p ${POSTGRESSQL_PORT} -U ${POSTGRESSQL_USER} ${TEST_DB}\n\tPGPASSWORD=${POSTGRESSQL_PWD} createdb -h ${POSTGRESSQL_HOST} -p ${POSTGRESSQL_PORT} -U ${POSTGRESSQL_USER} ${TEST_DB}\n\tPGPASSWORD=${POSTGRESSQL_PWD} psql -h ${POSTGRESSQL_HOST} -p ${POSTGRESSQL_PORT} -d ${TEST_DB} -U ${POSTGRESSQL_USER} -f ./tests/data/admin_pg.sql\n\nimport-mssql:\n\t/opt/mssql-tools/bin/sqlcmd -S db_mssql -U SA -P Aa123456 -Q \"RESTORE DATABASE [goadmin] FROM DISK = N'/home/data/admin_ms.bak' WITH FILE = 1, NOUNLOAD, REPLACE, RECOVERY, STATS = 5\"\n\nbackup-mssql:\n\tdocker exec mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Aa123456 -Q \"BACKUP DATABASE [goadmin] TO DISK = N'/home/data/admin_ms.bak' WITH NOFORMAT, NOINIT, NAME = 'goadmin-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10\"\n\ncp-mod:\n\tcp go.mod go.mod.old\n\tcp go.sum go.sum.old\n\nrestore-mod:\n\tmv go.mod.old go.mod\n\tmv go.sum.old go.sum\n\n## code style check\n\nlint: fmt golint govet cilint\n\nfmt:\n\tGO111MODULE=off go fmt ./...\n\tGO111MODULE=off goimports -l -w .\n\ngovet:\n\tGO111MODULE=off go vet ./...\n\ncilint:\n\tGO111MODULE=off golangci-lint run\n\ngolint:\n\tGO111MODULE=off golint ./...\n\nbuild-tmpl:\n    ## form tmpl build\n\tadm compile tpl --src ./template/types/tmpls/ --dist ./template/types/tmpl.go --package types --var tmpls\n    ## generator tmpl build\n\tadm compile tpl --src ./plugins/admin/modules/table/tmpl --dist ./plugins/admin/modules/table/tmpl.go --package table --var tmpls\n\n.PHONY: all fmt golint govet cp-mod restore-mod test black-box-test mysql-test sqlite-test import-sqlite import-mysql import-postgresql pg-test lint cilint cli\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <a href=\"https://github.com/GoAdminGroup/go-admin\">\n    <img width=\"48%\" alt=\"go-admin\" src=\"http://quick.go-admin.cn/official/assets/imgs/github_logo.png\">\n  </a>\n</p>\n\n<p align=\"center\">\n    the missing golang data admin panel builder tool.\n</p>\n\n<p align=\"center\">\n    <a href=\"https://book.go-admin.cn/en\">Documentation</a> | \n\t<a href=\"http://doc.go-admin.cn/zh/\">中文文档</a> | \n    <a href=\"./README_CN.md\">中文介绍</a> |\n    <a href=\"https://demo.go-admin.com\">DEMO</a> |\n    <a href=\"https://demo.go-admin.cn\">中文DEMO</a> |\n    <a href=\"https://twitter.com/cg3365688034\">Twitter</a> |\n    <a href=\"http://discuss.go-admin.com\">Forum</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"http://drone.go-admin.com/GoAdminGroup/go-admin\"><img alt=\"Build Status\" src=\"http://drone.go-admin.com/api/badges/GoAdminGroup/go-admin/status.svg?ref=refs/heads/master\"></a>\n  <a href=\"https://goreportcard.com/report/github.com/GoAdminGroup/go-admin\"><img alt=\"Go Report Card\" src=\"https://goreportcard.com/badge/github.com/GoAdminGroup/go-admin\"></a>\n  <a href=\"https://goreportcard.com/report/github.com/GoAdminGroup/go-admin\"><img alt=\"golang\" src=\"https://img.shields.io/badge/awesome-golang-blue.svg\"></a>\n  <a href=\"https://discord.gg/usAaEpCP\"><img alt=\"discord\" src=\"https://img.shields.io/badge/chat%20on-Discord-blue.svg\"></a>\n  <a href=\"https://t.me/joinchat/NlyH6Bch2QARZkArithKvg\" rel=\"nofollow\"><img alt=\"telegram\" src=\"https://img.shields.io/badge/chat%20on-telegram-blue\" style=\"max-width:100%;\"></a>  \n  <a href=\"https://raw.githubusercontent.com/GoAdminGroup/go-admin/master/LICENSE\" rel=\"nofollow\"><img src=\"https://img.shields.io/badge/license-Apache2.0-blue.svg\" alt=\"license\" data-canonical-src=\"https://img.shields.io/badge/license-Apache2.0-blue.svg\" style=\"max-width:100%;\"></a>\n</p> \n\n<p align=\"center\">\n    Inspired by <a href=\"https://github.com/z-song/laravel-admin\" target=\"_blank\">laravel-admin</a>\n</p>\n\n## Preface\n\nGoAdmin is a toolkit to help you build a data visualization admin panel for your golang app.\n\nOnline demo: [https://demo.go-admin.com](https://demo.go-admin.com)\n\n![interface](http://file.go-admin.cn/introduction/interface_en_3.png)\n\n## Features\n\n- 🚀 **Fast**: build a production admin panel app in **ten** minutes.\n- 🎨 **Theming**: beautiful ui themes supported(default adminlte, more themes are coming.)\n- 🔢 **Plugins**: many plugins to use(more useful and powerful plugins are coming.)\n- ✅ **Rbac**: out of box rbac auth system.\n- ⚙️ **Frameworks**: support most of the go web frameworks.\n\n## Translation\nWe need your help: [https://github.com/GoAdminGroup/docs/issues/1](https://github.com/GoAdminGroup/docs/issues/1)\n\n## Who is using\n\n[Comment the issue to tell us](https://github.com/GoAdminGroup/go-admin/issues/71).\n\n## How to\n\nFollowing three steps to run it.\n\n```shell\n$ mkdir new_project && cd new_project\n$ go install github.com/GoAdminGroup/adm@latest\n$ adm init web\n```\n\n## Example\n\nQuick follow up example: \n\n- [pure golang](https://github.com/GoAdminGroup/example), simple and less dependency\n- [golang with frontend template](https://github.com/GoAdminGroup/example_with_frontend), change template by yourself\n- [golang with vue](https://github.com/GoAdminGroup/example_with_vue), if you have vue experience\n\nSee the [docs](https://book.go-admin.cn) for more details.\n\n## Backers\n\n Your support will help me do better! [[Become a backer](https://opencollective.com/go-admin#backer)]\n <a href=\"https://opencollective.com/go-admin#backers\" target=\"_blank\"><img src=\"https://opencollective.com/go-admin/backers.svg?width=890\"></a>\n\n## Contribution\n\n[here for contribution guide](CONTRIBUTING.md)\n\n<strong>here to join into the develop team</strong>\n\n[join telegram](https://t.me/joinchat/NlyH6Bch2QARZkArithKvg)\n"
  },
  {
    "path": "README_CN.md",
    "content": "<p align=\"center\">\n  <a href=\"https://github.com/GoAdminGroup/go-admin\">\n    <img width=\"48%\" alt=\"go-admin\" src=\"http://quick.go-admin.cn/official/assets/imgs/github_logo.png\">\n  </a>\n</p>\n<p align=\"center\">\n    遗失的Golang编写的数据可视化与管理平台构建框架\n</p>\n<p align=\"center\">\n  <a href=\"http://drone.go-admin.com/GoAdminGroup/go-admin\"><img alt=\"Build Status\" src=\"http://drone.go-admin.com/api/badges/GoAdminGroup/go-admin/status.svg?ref=refs/heads/master\"></a>\n  <a href=\"https://goreportcard.com/report/github.com/GoAdminGroup/go-admin\"><img alt=\"Go Report Card\" src=\"https://goreportcard.com/badge/github.com/GoAdminGroup/go-admin\"></a>\n  <a href=\"https://goreportcard.com/report/github.com/GoAdminGroup/go-admin\"><img alt=\"golang\" src=\"https://img.shields.io/badge/awesome-golang-blue.svg\"></a>\n  <a href=\"https://discord.gg/usAaEpCP\"><img alt=\"discord\" src=\"https://img.shields.io/badge/chat%20on-Discord-blue.svg\"></a>\n  <a href=\"https://t.me/joinchat/NlyH6Bch2QARZkArithKvg\" rel=\"nofollow\"><img alt=\"telegram\" src=\"https://img.shields.io/badge/chat%20on-telegram-blue\" style=\"max-width:100%;\"></a>  \n  <a href=\"https://raw.githubusercontent.com/GoAdminGroup/go-admin/master/LICENSE\" rel=\"nofollow\"><img src=\"https://img.shields.io/badge/license-Apache2.0-blue.svg\" alt=\"license\" data-canonical-src=\"https://img.shields.io/badge/license-Apache2.0-blue.svg\" style=\"max-width:100%;\"></a>\n</p>\n<p align=\"center\">\n    由<a href=\"https://github.com/z-song/laravel-admin\" target=\"_blank\">laravel-admin</a>启发\n</p>\n\n## 前言\n\nGoAdmin 可以帮助你的golang应用快速实现数据可视化，搭建一个数据管理平台。\n\n[文档](http://doc.go-admin.cn/zh) | [论坛](http://discuss.go-admin.com) | [Demo](https://demo.go-admin.cn) | [上手例子](https://github.com/GoAdminGroup/example/blob/master/README_CN.md) | [GoAdmin+vue 例子](https://github.com/GoAdminGroup/goadmin-vue-example)\n\n\n![](http://file.go-admin.cn/introduction/interface_3.png)\n\n## 特征\n\n- 🚀 **高生产效率**: 10分钟内做一个好看的管理后台\n- 🎨 **主题**: 默认为adminlte，更多好看的主题正在制作中，欢迎给我们留言\n- 🔢 **插件化**: 提供插件使用，真正实现一个插件解决不了问题，那就两个\n- ✅ **认证**: 开箱即用的rbac认证系统\n- ⚙️ **框架支持**: 支持大部分框架接入，让你更容易去上手和扩展\n\n## 例子\n\n- [纯golang](https://github.com/GoAdminGroup/example), 简单很少依赖\n- [golang + 前端模版](https://github.com/GoAdminGroup/example_with_frontend), 你可以自己修改模版\n- [golang + vue](https://github.com/GoAdminGroup/example_with_vue), 如果你会vue的话，不妨试试\n\n## 翻译\n我们需要您的帮忙： [https://github.com/GoAdminGroup/docs/issues/1](https://github.com/GoAdminGroup/docs/issues/1)\n\n## 谁在使用GoAdmin\n\n[评论这个issue告诉我们](https://github.com/GoAdminGroup/go-admin/issues/71).\n\n## 使用\n\n```shell\n$ go install github.com/GoAdminGroup/adm@latest\n$ mkdir new_project && cd new_project\n$ adm init web -l cn\n```\n\n运行后将会启动一个网页安装程序，根据程序内容填写安装运行即可。\n\n## 贡献\n\n[这里有一份贡献指南](CONTRIBUTING_CN.md)\n\n非常欢迎提pr，<strong>这里可以加入开发小组</strong>\n\n<strong>QQ群</strong>：[694446792](https://qm.qq.com/q/bp3hsYyUzS)，记得备注加群来意\n\n这里是[开发计划](https://github.com/GoAdminGroup/go-admin/projects)\n\n<strong>[点击这里申请加微信群（记得备注加群）](http://quick.go-admin.cn/resource/wechat_qrcode_02.jpg)</strong>\n\n<strong>注：在社区中如有问题提问，请务必清晰描述，包括但不限于问题详叙/问题代码/复现方法/已经尝试过的方法。</strong>\n\n## 十分感谢\n\ninspired by [laravel-admin](https://github.com/z-song/laravel-admin)\n\n## 打赏\n\n留下您的github/gitee用户名，我们将会展示在[捐赠名单](DONATION.md)中。\n\n<img src=\"http://quick.go-admin.cn/official/assets/imgs/shoukuan.jpg\" width=\"650\" />"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Reporting a Vulnerability\n\nPlease report security issues to `chg80333@gmail.com`"
  },
  {
    "path": "adapter/adapter.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage adapter\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// WebFrameWork is an interface which is used as an adapter of\n// framework and goAdmin. It must implement two methods. Use registers\n// the routes and the corresponding handlers. Content writes the\n// response to the corresponding context of framework.\ntype WebFrameWork interface {\n\t// Name return the web framework name.\n\tName() string\n\n\t// Use method inject the plugins to the web framework engine which is the\n\t// first parameter.\n\tUse(app interface{}, plugins []plugins.Plugin) error\n\n\t// Content add the panel html response of the given callback function to\n\t// the web framework context which is the first parameter.\n\tContent(ctx interface{}, fn types.GetPanelFn, fn2 context.NodeProcessor, navButtons ...types.Button)\n\n\t// User get the auth user model from the given web framework context.\n\tUser(ctx interface{}) (models.UserModel, bool)\n\n\t// AddHandler inject the route and handlers of GoAdmin to the web framework.\n\tAddHandler(method, path string, handlers context.Handlers)\n\n\tDisableLog()\n\n\tStatic(prefix, path string)\n\n\tRun() error\n\n\t// Helper functions\n\t// ================================\n\n\tSetApp(app interface{}) error\n\tSetConnection(db.Connection)\n\tGetConnection() db.Connection\n\tSetContext(ctx interface{}) WebFrameWork\n\tGetCookie() (string, error)\n\tLang() string\n\tPath() string\n\tMethod() string\n\tRequest() *http.Request\n\tFormParam() url.Values\n\tQuery() url.Values\n\tIsPjax() bool\n\tRedirect()\n\tSetContentType()\n\tWrite(body []byte)\n\tCookieKey() string\n\tHTMLContentType() string\n}\n\n// BaseAdapter is a base adapter contains some helper functions.\ntype BaseAdapter struct {\n\tdb db.Connection\n}\n\n// SetConnection set the db connection.\nfunc (base *BaseAdapter) SetConnection(conn db.Connection) {\n\tbase.db = conn\n}\n\n// GetConnection get the db connection.\nfunc (base *BaseAdapter) GetConnection() db.Connection {\n\treturn base.db\n}\n\n// HTMLContentType return the default content type header.\nfunc (*BaseAdapter) HTMLContentType() string {\n\treturn \"text/html; charset=utf-8\"\n}\n\n// CookieKey return the cookie key.\nfunc (*BaseAdapter) CookieKey() string {\n\treturn auth.DefaultCookieKey\n}\n\n// GetUser is a helper function get the auth user model from the context.\nfunc (*BaseAdapter) GetUser(ctx interface{}, wf WebFrameWork) (models.UserModel, bool) {\n\tcookie, err := wf.SetContext(ctx).GetCookie()\n\n\tif err != nil {\n\t\treturn models.UserModel{}, false\n\t}\n\n\tuser, exist := auth.GetCurUser(cookie, wf.GetConnection())\n\treturn user.ReleaseConn(), exist\n}\n\n// GetUse is a helper function adds the plugins to the framework.\nfunc (*BaseAdapter) GetUse(app interface{}, plugin []plugins.Plugin, wf WebFrameWork) error {\n\tif err := wf.SetApp(app); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, plug := range plugin {\n\t\tfor path, handlers := range plug.GetHandler() {\n\t\t\tif plug.Prefix() == \"\" {\n\t\t\t\twf.AddHandler(path.Method, path.URL, handlers)\n\t\t\t} else {\n\t\t\t\twf.AddHandler(path.Method, config.Url(\"/\"+plug.Prefix()+path.URL), handlers)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (*BaseAdapter) Run() error         { panic(\"not implement\") }\nfunc (*BaseAdapter) DisableLog()        { panic(\"not implement\") }\nfunc (*BaseAdapter) Static(_, _ string) { panic(\"not implement\") }\n\n// GetContent is a helper function of adapter.Content\nfunc (base *BaseAdapter) GetContent(ctx interface{}, getPanelFn types.GetPanelFn, wf WebFrameWork,\n\tnavButtons types.Buttons, fn context.NodeProcessor) {\n\n\tvar (\n\t\tnewBase          = wf.SetContext(ctx)\n\t\tcookie, hasError = newBase.GetCookie()\n\t)\n\n\tif hasError != nil || cookie == \"\" {\n\t\tnewBase.Redirect()\n\t\treturn\n\t}\n\n\tuser, authSuccess := auth.GetCurUser(cookie, wf.GetConnection())\n\n\tif !authSuccess {\n\t\tnewBase.Redirect()\n\t\treturn\n\t}\n\n\tvar (\n\t\tpanel types.Panel\n\t\terr   error\n\t)\n\n\tgctx := context.NewContext(newBase.Request())\n\n\tif !auth.CheckPermissions(user, newBase.Path(), newBase.Method(), newBase.FormParam()) {\n\t\tpanel = template.WarningPanel(gctx, errors.NoPermission, template.NoPermission403Page)\n\t} else {\n\t\tpanel, err = getPanelFn(ctx)\n\t\tif err != nil {\n\t\t\tpanel = template.WarningPanel(gctx, err.Error())\n\t\t}\n\t}\n\n\tfn(panel.Callbacks...)\n\n\ttmpl, tmplName := template.Default(gctx).GetTemplate(newBase.IsPjax())\n\n\tbuf := new(bytes.Buffer)\n\thasError = tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(gctx, &types.NewPageParam{\n\t\tUser:         user,\n\t\tMenu:         menu.GetGlobalMenu(user, wf.GetConnection(), newBase.Lang()).SetActiveClass(config.URLRemovePrefix(newBase.Path())),\n\t\tPanel:        panel.GetContent(config.IsProductionEnvironment()),\n\t\tAssets:       template.GetComponentAssetImportHTML(gctx),\n\t\tButtons:      navButtons.CheckPermission(user),\n\t\tTmplHeadHTML: template.Default(gctx).GetHeadHTML(),\n\t\tTmplFootJS:   template.Default(gctx).GetFootJS(),\n\t\tIframe:       newBase.Query().Get(constant.IframeKey) == \"true\",\n\t}))\n\n\tif hasError != nil {\n\t\tlogger.Error(fmt.Sprintf(\"error: %s adapter content, \", newBase.Name()), hasError)\n\t}\n\n\tnewBase.SetContentType()\n\tnewBase.Write(buf.Bytes())\n}\n"
  },
  {
    "path": "adapter/beego/beego.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage beego\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\tgctx \"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/astaxie/beego\"\n\t\"github.com/astaxie/beego/context\"\n)\n\n// Beego structure value is a Beego GoAdmin adapter.\ntype Beego struct {\n\tadapter.BaseAdapter\n\tctx *context.Context\n\tapp *beego.App\n}\n\nfunc init() {\n\tengine.Register(new(Beego))\n}\n\n// User implements the method Adapter.User.\nfunc (bee *Beego) User(ctx interface{}) (models.UserModel, bool) {\n\treturn bee.GetUser(ctx, bee)\n}\n\n// Use implements the method Adapter.Use.\nfunc (bee *Beego) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn bee.GetUse(app, plugs, bee)\n}\n\n// Content implements the method Adapter.Content.\nfunc (bee *Beego) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn gctx.NodeProcessor, navButtons ...types.Button) {\n\tbee.GetContent(ctx, getPanelFn, bee, navButtons, fn)\n}\n\ntype HandlerFunc func(ctx *context.Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) beego.FilterFunc {\n\treturn func(ctx *context.Context) {\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(*context.Context))\n\t\t})\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (bee *Beego) SetApp(app interface{}) error {\n\tvar (\n\t\teng *beego.App\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*beego.App); !ok {\n\t\treturn errors.New(\"beego adapter SetApp: wrong parameter\")\n\t}\n\tbee.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (bee *Beego) AddHandler(method, path string, handlers gctx.Handlers) {\n\tbee.app.Handlers.AddMethod(method, path, func(c *context.Context) {\n\t\tfor key, value := range c.Input.Params() {\n\t\t\tif c.Request.URL.RawQuery == \"\" {\n\t\t\t\tc.Request.URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t} else {\n\t\t\t\tc.Request.URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t}\n\t\t}\n\t\tctx := gctx.NewContext(c.Request)\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.ResponseWriter.Header().Add(key, head[0])\n\t\t}\n\t\tc.ResponseWriter.WriteHeader(ctx.Response.StatusCode)\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\tc.WriteString(buf.String())\n\t\t}\n\t})\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Beego) Name() string {\n\treturn \"beego\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Beego) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx *context.Context\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(*context.Context); !ok {\n\t\tpanic(\"beego adapter SetContext: wrong parameter\")\n\t}\n\treturn &Beego{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (bee *Beego) Redirect() {\n\tbee.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (bee *Beego) SetContentType() {\n\tbee.ctx.ResponseWriter.Header().Set(\"Content-Type\", bee.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (bee *Beego) Write(body []byte) {\n\t_, _ = bee.ctx.ResponseWriter.Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (bee *Beego) GetCookie() (string, error) {\n\treturn bee.ctx.GetCookie(bee.CookieKey()), nil\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (bee *Beego) Lang() string {\n\treturn bee.ctx.Request.URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (bee *Beego) Path() string {\n\treturn bee.ctx.Request.URL.Path\n}\n\n// Method implements the method Adapter.Method.\nfunc (bee *Beego) Method() string {\n\treturn bee.ctx.Request.Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (bee *Beego) FormParam() url.Values {\n\t_ = bee.ctx.Request.ParseMultipartForm(32 << 20)\n\treturn bee.ctx.Request.PostForm\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (bee *Beego) IsPjax() bool {\n\treturn bee.ctx.Request.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (bee *Beego) Query() url.Values {\n\treturn bee.ctx.Request.URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (bee *Beego) Request() *http.Request {\n\treturn bee.ctx.Request\n}"
  },
  {
    "path": "adapter/beego2/beego2.go",
    "content": "package beego2\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\tgctx \"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/beego/beego/v2/server/web\"\n\t\"github.com/beego/beego/v2/server/web/context\"\n)\n\ntype Beego2 struct {\n\tadapter.BaseAdapter\n\tctx *context.Context\n\tapp *web.HttpServer\n}\n\nfunc init() {\n\tengine.Register(new(Beego2))\n}\n\nfunc (*Beego2) Name() string {\n\treturn \"beego2\"\n}\n\nfunc (bee2 *Beego2) Use(app interface{}, plugins []plugins.Plugin) error {\n\treturn bee2.GetUse(app, plugins, bee2)\n}\n\nfunc (bee2 *Beego2) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn gctx.NodeProcessor, navButtons ...types.Button) {\n\tbee2.GetContent(ctx, getPanelFn, bee2, navButtons, fn)\n}\n\nfunc (bee2 *Beego2) User(ctx interface{}) (models.UserModel, bool) {\n\treturn bee2.GetUser(ctx, bee2)\n}\n\nfunc (bee2 *Beego2) AddHandler(method, path string, handlers gctx.Handlers) {\n\tbee2.app.Handlers.AddMethod(method, path, func(c *context.Context) {\n\t\tfor key, value := range c.Input.Params() {\n\t\t\tif c.Request.URL.RawQuery == \"\" {\n\t\t\t\tc.Request.URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t} else {\n\t\t\t\tc.Request.URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t}\n\t\t}\n\t\tctx := gctx.NewContext(c.Request)\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.ResponseWriter.Header().Add(key, head[0])\n\t\t}\n\t\tc.ResponseWriter.WriteHeader(ctx.Response.StatusCode)\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\tc.WriteString(buf.String())\n\t\t}\n\t})\n}\n\nfunc (bee2 *Beego2) SetApp(app interface{}) error {\n\tvar (\n\t\teng *web.HttpServer\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*web.HttpServer); !ok {\n\t\treturn errors.New(\"beego2 adapter SetApp: wrong parameter\")\n\t}\n\tbee2.app = eng\n\treturn nil\n}\n\nfunc (*Beego2) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx *context.Context\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(*context.Context); !ok {\n\t\tpanic(\"beego2 adapter SetContext: wrong parameter\")\n\t}\n\treturn &Beego2{ctx: ctx}\n}\n\nfunc (bee2 *Beego2) GetCookie() (string, error) {\n\treturn bee2.ctx.GetCookie(bee2.CookieKey()), nil\n}\n\nfunc (bee2 *Beego2) Lang() string {\n\treturn bee2.ctx.Request.URL.Query().Get(\"__ga_lang\")\n}\n\nfunc (bee2 *Beego2) Path() string {\n\treturn bee2.ctx.Request.URL.Path\n}\n\nfunc (bee2 *Beego2) Method() string {\n\treturn bee2.ctx.Request.Method\n}\n\nfunc (bee2 *Beego2) FormParam() url.Values {\n\t_ = bee2.ctx.Request.ParseMultipartForm(32 << 20)\n\treturn bee2.ctx.Request.PostForm\n}\n\nfunc (bee2 *Beego2) Query() url.Values {\n\treturn bee2.ctx.Request.URL.Query()\n}\n\nfunc (bee2 *Beego2) IsPjax() bool {\n\treturn bee2.ctx.Request.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\nfunc (bee2 *Beego2) Redirect() {\n\tbee2.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))\n}\n\nfunc (bee2 *Beego2) SetContentType() {\n\tbee2.ctx.ResponseWriter.Header().Set(\"Content-Type\", bee2.HTMLContentType())\n}\n\nfunc (bee2 *Beego2) Write(body []byte) {\n\t_, _ = bee2.ctx.ResponseWriter.Write(body)\n}\n\n// Request implements the method Adapter.Request.\nfunc (bee2 *Beego2) Request() *http.Request {\n\treturn bee2.ctx.Request\n}"
  },
  {
    "path": "adapter/buffalo/buffalo.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage buffalo\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\tneturl \"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/gobuffalo/buffalo\"\n)\n\n// Buffalo structure value is a Buffalo GoAdmin adapter.\ntype Buffalo struct {\n\tadapter.BaseAdapter\n\tctx buffalo.Context\n\tapp *buffalo.App\n}\n\nfunc init() {\n\tengine.Register(new(Buffalo))\n}\n\n// User implements the method Adapter.User.\nfunc (bu *Buffalo) User(ctx interface{}) (models.UserModel, bool) {\n\treturn bu.GetUser(ctx, bu)\n}\n\n// Use implements the method Adapter.Use.\nfunc (bu *Buffalo) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn bu.GetUse(app, plugs, bu)\n}\n\n// Content implements the method Adapter.Content.\nfunc (bu *Buffalo) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tbu.GetContent(ctx, getPanelFn, bu, btns, fn)\n}\n\ntype HandlerFunc func(ctx buffalo.Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) buffalo.Handler {\n\treturn func(ctx buffalo.Context) error {\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(buffalo.Context))\n\t\t})\n\t\treturn nil\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (bu *Buffalo) SetApp(app interface{}) error {\n\tvar (\n\t\teng *buffalo.App\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*buffalo.App); !ok {\n\t\treturn errors.New(\"buffalo adapter SetApp: wrong parameter\")\n\t}\n\tbu.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (bu *Buffalo) AddHandler(method, path string, handlers context.Handlers) {\n\turl := path\n\treg1 := regexp.MustCompile(\":(.*?)/\")\n\treg2 := regexp.MustCompile(\":(.*?)$\")\n\turl = reg1.ReplaceAllString(url, \"{$1}/\")\n\turl = reg2.ReplaceAllString(url, \"{$1}\")\n\n\tgetHandleFunc(bu.app, strings.ToUpper(method))(url, func(c buffalo.Context) error {\n\n\t\tif c.Request().URL.Path[len(c.Request().URL.Path)-1] == '/' {\n\t\t\tc.Request().URL.Path = c.Request().URL.Path[:len(c.Request().URL.Path)-1]\n\t\t}\n\n\t\tctx := context.NewContext(c.Request())\n\n\t\tparams := c.Params().(neturl.Values)\n\n\t\tfor key, param := range params {\n\t\t\tif c.Request().URL.RawQuery == \"\" {\n\t\t\t\tc.Request().URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + param[0]\n\t\t\t} else {\n\t\t\t\tc.Request().URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + param[0]\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Response().Header().Set(key, head[0])\n\t\t}\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\tc.Response().WriteHeader(ctx.Response.StatusCode)\n\t\t\t_, _ = c.Response().Write(buf.Bytes())\n\t\t} else {\n\t\t\tc.Response().WriteHeader(ctx.Response.StatusCode)\n\t\t}\n\t\treturn nil\n\t})\n}\n\n// HandleFun is type of route methods of buffalo.\ntype HandleFun func(p string, h buffalo.Handler) *buffalo.RouteInfo\n\nfunc getHandleFunc(eng *buffalo.App, method string) HandleFun {\n\tswitch method {\n\tcase \"GET\":\n\t\treturn eng.GET\n\tcase \"POST\":\n\t\treturn eng.POST\n\tcase \"PUT\":\n\t\treturn eng.PUT\n\tcase \"DELETE\":\n\t\treturn eng.DELETE\n\tcase \"HEAD\":\n\t\treturn eng.HEAD\n\tcase \"OPTIONS\":\n\t\treturn eng.OPTIONS\n\tcase \"PATCH\":\n\t\treturn eng.PATCH\n\tdefault:\n\t\tpanic(\"wrong method\")\n\t}\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Buffalo) Name() string {\n\treturn \"buffalo\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Buffalo) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx buffalo.Context\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(buffalo.Context); !ok {\n\t\tpanic(\"buffalo adapter SetContext: wrong parameter\")\n\t}\n\treturn &Buffalo{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (bu *Buffalo) Redirect() {\n\t_ = bu.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (bu *Buffalo) SetContentType() {\n\tbu.ctx.Response().Header().Set(\"Content-Type\", bu.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (bu *Buffalo) Write(body []byte) {\n\tbu.ctx.Response().WriteHeader(http.StatusOK)\n\t_, _ = bu.ctx.Response().Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (bu *Buffalo) GetCookie() (string, error) {\n\treturn bu.ctx.Cookies().Get(bu.CookieKey())\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (bu *Buffalo) Lang() string {\n\treturn bu.ctx.Request().URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (bu *Buffalo) Path() string {\n\treturn bu.ctx.Request().URL.Path\n}\n\n// Method implements the method Adapter.Method.\nfunc (bu *Buffalo) Method() string {\n\treturn bu.ctx.Request().Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (bu *Buffalo) FormParam() neturl.Values {\n\t_ = bu.ctx.Request().ParseMultipartForm(32 << 20)\n\treturn bu.ctx.Request().PostForm\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (bu *Buffalo) IsPjax() bool {\n\treturn bu.ctx.Request().Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (bu *Buffalo) Query() neturl.Values {\n\treturn bu.ctx.Request().URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (bu *Buffalo) Request() *http.Request {\n\treturn bu.ctx.Request()\n}"
  },
  {
    "path": "adapter/chi/chi.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage chi\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\tcfg \"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/go-chi/chi\"\n)\n\n// Chi structure value is a Chi GoAdmin adapter.\ntype Chi struct {\n\tadapter.BaseAdapter\n\tctx Context\n\tapp *chi.Mux\n}\n\nfunc init() {\n\tengine.Register(new(Chi))\n}\n\n// User implements the method Adapter.User.\nfunc (ch *Chi) User(ctx interface{}) (models.UserModel, bool) {\n\treturn ch.GetUser(ctx, ch)\n}\n\n// Use implements the method Adapter.Use.\nfunc (ch *Chi) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn ch.GetUse(app, plugs, ch)\n}\n\n// Content implements the method Adapter.Content.\nfunc (ch *Chi) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tch.GetContent(ctx, getPanelFn, ch, btns, fn)\n}\n\ntype HandlerFunc func(ctx Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) http.HandlerFunc {\n\treturn func(writer http.ResponseWriter, request *http.Request) {\n\t\tctx := Context{\n\t\t\tRequest:  request,\n\t\t\tResponse: writer,\n\t\t}\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(Context))\n\t\t})\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (ch *Chi) SetApp(app interface{}) error {\n\tvar (\n\t\teng *chi.Mux\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*chi.Mux); !ok {\n\t\treturn errors.New(\"chi adapter SetApp: wrong parameter\")\n\t}\n\tch.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (ch *Chi) AddHandler(method, path string, handlers context.Handlers) {\n\turl := path\n\treg1 := regexp.MustCompile(\":(.*?)/\")\n\treg2 := regexp.MustCompile(\":(.*?)$\")\n\turl = reg1.ReplaceAllString(url, \"{$1}/\")\n\turl = reg2.ReplaceAllString(url, \"{$1}\")\n\n\tif len(url) > 1 && url[0] == '/' && url[1] == '/' {\n\t\turl = url[1:]\n\t}\n\n\tgetHandleFunc(ch.app, strings.ToUpper(method))(url, func(w http.ResponseWriter, r *http.Request) {\n\n\t\tif r.URL.Path[len(r.URL.Path)-1] == '/' {\n\t\t\tr.URL.Path = r.URL.Path[:len(r.URL.Path)-1]\n\t\t}\n\n\t\tctx := context.NewContext(r)\n\n\t\tparams := chi.RouteContext(r.Context()).URLParams\n\n\t\tfor i := 0; i < len(params.Values); i++ {\n\t\t\tif r.URL.RawQuery == \"\" {\n\t\t\t\tr.URL.RawQuery += strings.ReplaceAll(params.Keys[i], \":\", \"\") + \"=\" + params.Values[i]\n\t\t\t} else {\n\t\t\t\tr.URL.RawQuery += \"&\" + strings.ReplaceAll(params.Keys[i], \":\", \"\") + \"=\" + params.Values[i]\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tw.Header().Set(key, head[0])\n\t\t}\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\tw.WriteHeader(ctx.Response.StatusCode)\n\t\t\t_, _ = w.Write(buf.Bytes())\n\t\t} else {\n\t\t\tw.WriteHeader(ctx.Response.StatusCode)\n\t\t}\n\t})\n}\n\n// HandleFun is type of route methods of chi.\ntype HandleFun func(pattern string, handlerFn http.HandlerFunc)\n\nfunc getHandleFunc(eng *chi.Mux, method string) HandleFun {\n\tswitch method {\n\tcase \"GET\":\n\t\treturn eng.Get\n\tcase \"POST\":\n\t\treturn eng.Post\n\tcase \"PUT\":\n\t\treturn eng.Put\n\tcase \"DELETE\":\n\t\treturn eng.Delete\n\tcase \"HEAD\":\n\t\treturn eng.Head\n\tcase \"OPTIONS\":\n\t\treturn eng.Options\n\tcase \"PATCH\":\n\t\treturn eng.Patch\n\tdefault:\n\t\tpanic(\"wrong method\")\n\t}\n}\n\n// Context wraps the Request and Response object of Chi.\ntype Context struct {\n\tRequest  *http.Request\n\tResponse http.ResponseWriter\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Chi) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx Context\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(Context); !ok {\n\t\tpanic(\"chi adapter SetContext: wrong parameter\")\n\t}\n\treturn &Chi{ctx: ctx}\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Chi) Name() string {\n\treturn \"chi\"\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (ch *Chi) Redirect() {\n\thttp.Redirect(ch.ctx.Response, ch.ctx.Request, cfg.Url(cfg.GetLoginUrl()), http.StatusFound)\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (ch *Chi) SetContentType() {\n\tch.ctx.Response.Header().Set(\"Content-Type\", ch.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (ch *Chi) Write(body []byte) {\n\tch.ctx.Response.WriteHeader(http.StatusOK)\n\t_, _ = ch.ctx.Response.Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (ch *Chi) GetCookie() (string, error) {\n\tcookie, err := ch.ctx.Request.Cookie(ch.CookieKey())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn cookie.Value, err\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (ch *Chi) Lang() string {\n\treturn ch.ctx.Request.URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (ch *Chi) Path() string {\n\treturn ch.ctx.Request.URL.Path\n}\n\n// Method implements the method Adapter.Method.\nfunc (ch *Chi) Method() string {\n\treturn ch.ctx.Request.Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (ch *Chi) FormParam() url.Values {\n\t_ = ch.ctx.Request.ParseMultipartForm(32 << 20)\n\treturn ch.ctx.Request.PostForm\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (ch *Chi) IsPjax() bool {\n\treturn ch.ctx.Request.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (ch *Chi) Query() url.Values {\n\treturn ch.ctx.Request.URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (ch *Chi) Request() *http.Request {\n\treturn ch.ctx.Request\n}"
  },
  {
    "path": "adapter/echo/echo.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage echo\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/labstack/echo/v4\"\n)\n\n// Echo structure value is an Echo GoAdmin adapter.\ntype Echo struct {\n\tadapter.BaseAdapter\n\tctx echo.Context\n\tapp *echo.Echo\n}\n\nfunc init() {\n\tengine.Register(new(Echo))\n}\n\n// User implements the method Adapter.User.\nfunc (e *Echo) User(ctx interface{}) (models.UserModel, bool) {\n\treturn e.GetUser(ctx, e)\n}\n\n// Use implements the method Adapter.Use.\nfunc (e *Echo) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn e.GetUse(app, plugs, e)\n}\n\n// Content implements the method Adapter.Content.\nfunc (e *Echo) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\te.GetContent(ctx, getPanelFn, e, btns, fn)\n}\n\ntype HandlerFunc func(ctx echo.Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) echo.HandlerFunc {\n\treturn func(ctx echo.Context) error {\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(echo.Context))\n\t\t})\n\t\treturn nil\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (e *Echo) SetApp(app interface{}) error {\n\tvar (\n\t\teng *echo.Echo\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*echo.Echo); !ok {\n\t\treturn errors.New(\"echo adapter SetApp: wrong parameter\")\n\t}\n\te.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (e *Echo) AddHandler(method, path string, handlers context.Handlers) {\n\te.app.Add(strings.ToUpper(method), path, func(c echo.Context) error {\n\t\tctx := context.NewContext(c.Request())\n\n\t\tfor _, key := range c.ParamNames() {\n\t\t\tif c.Request().URL.RawQuery == \"\" {\n\t\t\t\tc.Request().URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + c.Param(key)\n\t\t\t} else {\n\t\t\t\tc.Request().URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + c.Param(key)\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Response().Header().Set(key, head[0])\n\t\t}\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\t_ = c.String(ctx.Response.StatusCode, buf.String())\n\t\t} else {\n\t\t\tc.Response().WriteHeader(ctx.Response.StatusCode)\n\t\t}\n\t\treturn nil\n\t})\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Echo) Name() string {\n\treturn \"echo\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Echo) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx echo.Context\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(echo.Context); !ok {\n\t\tpanic(\"echo adapter SetContext: wrong parameter\")\n\t}\n\treturn &Echo{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (e *Echo) Redirect() {\n\t_ = e.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (e *Echo) SetContentType() {\n\te.ctx.Response().Header().Set(\"Content-Type\", e.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (e *Echo) Write(body []byte) {\n\te.ctx.Response().WriteHeader(http.StatusOK)\n\t_, _ = e.ctx.Response().Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (e *Echo) GetCookie() (string, error) {\n\tcookie, err := e.ctx.Cookie(e.CookieKey())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn cookie.Value, err\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (e *Echo) Lang() string {\n\treturn e.ctx.Request().URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (e *Echo) Path() string {\n\treturn e.ctx.Request().URL.Path\n}\n\n// Method implements the method Adapter.Method.\nfunc (e *Echo) Method() string {\n\treturn e.ctx.Request().Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (e *Echo) FormParam() url.Values {\n\t_ = e.ctx.Request().ParseMultipartForm(32 << 20)\n\treturn e.ctx.Request().PostForm\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (e *Echo) IsPjax() bool {\n\treturn e.ctx.Request().Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (e *Echo) Query() url.Values {\n\treturn e.ctx.Request().URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (e *Echo) Request() *http.Request {\n\treturn e.ctx.Request()\n}"
  },
  {
    "path": "adapter/fasthttp/fasthttp.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage fasthttp\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/buaazp/fasthttprouter\"\n\t\"github.com/valyala/fasthttp\"\n)\n\n// Fasthttp structure value is a Fasthttp GoAdmin adapter.\ntype Fasthttp struct {\n\tadapter.BaseAdapter\n\tctx *fasthttp.RequestCtx\n\tapp *fasthttprouter.Router\n}\n\nfunc init() {\n\tengine.Register(new(Fasthttp))\n}\n\n// User implements the method Adapter.User.\nfunc (fast *Fasthttp) User(ctx interface{}) (models.UserModel, bool) {\n\treturn fast.GetUser(ctx, fast)\n}\n\n// Use implements the method Adapter.Use.\nfunc (fast *Fasthttp) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn fast.GetUse(app, plugs, fast)\n}\n\n// Content implements the method Adapter.Content.\nfunc (fast *Fasthttp) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tfast.GetContent(ctx, getPanelFn, fast, btns, fn)\n}\n\ntype HandlerFunc func(ctx *fasthttp.RequestCtx) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) fasthttp.RequestHandler {\n\treturn func(ctx *fasthttp.RequestCtx) {\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(*fasthttp.RequestCtx))\n\t\t})\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (fast *Fasthttp) SetApp(app interface{}) error {\n\tvar (\n\t\teng *fasthttprouter.Router\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*fasthttprouter.Router); !ok {\n\t\treturn errors.New(\"fasthttp adapter SetApp: wrong parameter\")\n\t}\n\n\tfast.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (fast *Fasthttp) AddHandler(method, path string, handlers context.Handlers) {\n\tfast.app.Handle(strings.ToUpper(method), path, func(c *fasthttp.RequestCtx) {\n\t\thttpreq := convertCtx(c)\n\t\tctx := context.NewContext(httpreq)\n\n\t\tvar params = make(map[string]string)\n\t\tc.VisitUserValues(func(i []byte, i2 interface{}) {\n\t\t\tif value, ok := i2.(string); ok {\n\t\t\t\tparams[string(i)] = value\n\t\t\t}\n\t\t})\n\n\t\tfor key, value := range params {\n\t\t\tif httpreq.URL.RawQuery == \"\" {\n\t\t\t\thttpreq.URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t} else {\n\t\t\t\thttpreq.URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Response.Header.Set(key, head[0])\n\t\t}\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\t_, _ = c.WriteString(buf.String())\n\t\t}\n\t\tc.Response.SetStatusCode(ctx.Response.StatusCode)\n\t})\n}\n\nfunc convertCtx(ctx *fasthttp.RequestCtx) *http.Request {\n\tvar r http.Request\n\n\tbody := ctx.PostBody()\n\tr.Method = string(ctx.Method())\n\tr.Proto = \"HTTP/1.1\"\n\tr.ProtoMajor = 1\n\tr.ProtoMinor = 1\n\tr.RequestURI = string(ctx.RequestURI())\n\tr.ContentLength = int64(len(body))\n\tr.Host = string(ctx.Host())\n\tr.RemoteAddr = ctx.RemoteAddr().String()\n\n\thdr := make(http.Header)\n\tctx.Request.Header.VisitAll(func(k, v []byte) {\n\t\tsk := string(k)\n\t\tsv := string(v)\n\t\tswitch sk {\n\t\tcase \"Transfer-Encoding\":\n\t\t\tr.TransferEncoding = append(r.TransferEncoding, sv)\n\t\tdefault:\n\t\t\thdr.Set(sk, sv)\n\t\t}\n\t})\n\tr.Header = hdr\n\tr.Body = &netHTTPBody{body}\n\trURL, err := url.ParseRequestURI(r.RequestURI)\n\tif err != nil {\n\t\tctx.Logger().Printf(\"cannot parse requestURI %q: %s\", r.RequestURI, err)\n\t\tctx.Error(\"Internal Server Error\", fasthttp.StatusInternalServerError)\n\t\treturn &r\n\t}\n\tr.URL = rURL\n\treturn &r\n}\n\ntype netHTTPBody struct {\n\tb []byte\n}\n\nfunc (r *netHTTPBody) Read(p []byte) (int, error) {\n\tif len(r.b) == 0 {\n\t\treturn 0, io.EOF\n\t}\n\tn := copy(p, r.b)\n\tr.b = r.b[n:]\n\treturn n, nil\n}\n\nfunc (r *netHTTPBody) Close() error {\n\tr.b = r.b[:0]\n\treturn nil\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Fasthttp) Name() string {\n\treturn \"fasthttp\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Fasthttp) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx *fasthttp.RequestCtx\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(*fasthttp.RequestCtx); !ok {\n\t\tpanic(\"fasthttp adapter SetContext: wrong parameter\")\n\t}\n\treturn &Fasthttp{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (fast *Fasthttp) Redirect() {\n\tfast.ctx.Redirect(config.Url(config.GetLoginUrl()), http.StatusFound)\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (fast *Fasthttp) SetContentType() {\n\tfast.ctx.Response.Header.Set(\"Content-Type\", fast.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (fast *Fasthttp) Write(body []byte) {\n\t_, _ = fast.ctx.Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (fast *Fasthttp) GetCookie() (string, error) {\n\treturn string(fast.ctx.Request.Header.Cookie(fast.CookieKey())), nil\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (fast *Fasthttp) Lang() string {\n\treturn string(fast.ctx.Request.URI().QueryArgs().Peek(\"__ga_lang\"))\n}\n\n// Path implements the method Adapter.Path.\nfunc (fast *Fasthttp) Path() string {\n\treturn string(fast.ctx.Path())\n}\n\n// Method implements the method Adapter.Method.\nfunc (fast *Fasthttp) Method() string {\n\treturn string(fast.ctx.Method())\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (fast *Fasthttp) FormParam() url.Values {\n\tf, _ := fast.ctx.MultipartForm()\n\tif f != nil {\n\t\treturn f.Value\n\t}\n\treturn url.Values{}\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (fast *Fasthttp) IsPjax() bool {\n\treturn string(fast.ctx.Request.Header.Peek(constant.PjaxHeader)) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (fast *Fasthttp) Query() url.Values {\n\tqueryStr := fast.ctx.URI().QueryString()\n\tqueryObj, err := url.Parse(string(queryStr))\n\n\tif err != nil {\n\t\treturn url.Values{}\n\t}\n\n\treturn queryObj.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (fast *Fasthttp) Request() *http.Request {\n\treturn convertCtx(fast.ctx)\n}"
  },
  {
    "path": "adapter/gear/gear.go",
    "content": "/***\n# File Name: ../../adapter/gear/gear.go\n# Author: eavesmy\n# Email: eavesmy@gmail.com\n# Created Time: 2021年06月03日 星期四 19时05分06秒\n***/\n\npackage gear\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/teambition/gear\"\n)\n\n// Gear structure value is a Gin GoAdmin adapter.\ntype Gear struct {\n\tadapter.BaseAdapter\n\tctx    *gear.Context\n\tapp    *gear.App\n\trouter *gear.Router\n}\n\nfunc init() {\n\tengine.Register(new(Gear))\n}\n\n// User implements the method Adapter.User.\nfunc (gears *Gear) User(ctx interface{}) (models.UserModel, bool) {\n\treturn gears.GetUser(ctx, gears)\n}\n\n// Use implements the method Adapter.Use.\nfunc (gears *Gear) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn gears.GetUse(app, plugs, gears)\n}\n\n// Content implements the method Adapter.Content.\nfunc (gears *Gear) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tgears.GetContent(ctx, getPanelFn, gears, btns, fn)\n}\n\ntype HandlerFunc func(ctx *gear.Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) gear.Middleware {\n\treturn func(ctx *gear.Context) error {\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(*gear.Context))\n\t\t})\n\t\treturn nil\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (gears *Gear) SetApp(app interface{}) error {\n\tgears.app = app.(*gear.App)\n\tgears.router = gear.NewRouter()\n\tvar (\n\t\teng *gear.App\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*gear.App); !ok {\n\t\treturn errors.New(\"beego adapter SetApp: wrong parameter\")\n\t}\n\tgears.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (gears *Gear) AddHandler(method, path string, handlers context.Handlers) {\n\n\tif gears.router == nil {\n\t\tgears.router = gear.NewRouter()\n\t}\n\n\tgears.router.Handle(strings.ToUpper(method), path, func(c *gear.Context) error {\n\n\t\tctx := context.NewContext(c.Req)\n\n\t\tnewPath := path\n\n\t\treg1 := regexp.MustCompile(\":(.*?)/\")\n\t\treg2 := regexp.MustCompile(\":(.*?)$\")\n\n\t\tparams := reg1.FindAllString(newPath, -1)\n\t\tnewPath = reg1.ReplaceAllString(newPath, \"\")\n\t\tparams = append(params, reg2.FindAllString(newPath, -1)...)\n\n\t\tfor _, param := range params {\n\t\t\tp := utils.ReplaceAll(param, \":\", \"\", \"/\", \"\")\n\n\t\t\tif c.Req.URL.RawQuery == \"\" {\n\t\t\t\tc.Req.URL.RawQuery += p + \"=\" + c.Param(p)\n\t\t\t} else {\n\t\t\t\tc.Req.URL.RawQuery += \"&\" + p + \"=\" + c.Param(p)\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Res.Header().Add(key, head[0])\n\t\t}\n\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\n\t\t\treturn c.End(ctx.Response.StatusCode, buf.Bytes())\n\t\t}\n\n\t\tc.Status(ctx.Response.StatusCode)\n\t\treturn nil\n\t})\n\n\tgears.app.UseHandler(gears.router)\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Gear) Name() string {\n\treturn \"gear\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Gear) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx *gear.Context\n\t\tok  bool\n\t)\n\n\tif ctx, ok = contextInterface.(*gear.Context); !ok {\n\t\tpanic(\"gear adapter SetContext: wrong parameter\")\n\t}\n\n\treturn &Gear{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (gears *Gear) Redirect() {\n\tgears.ctx.Redirect(config.Url(config.GetLoginUrl()))\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (gears *Gear) SetContentType() {\n\tgears.ctx.Res.Header().Set(\"Content-Type\", gears.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (gears *Gear) Write(body []byte) {\n\tgears.ctx.End(http.StatusOK, body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (gears *Gear) GetCookie() (string, error) {\n\treturn gears.ctx.Cookies.Get(gears.CookieKey())\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (gears *Gear) Lang() string {\n\treturn gears.ctx.Req.URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (gears *Gear) Path() string {\n\treturn gears.ctx.Req.URL.Path\n}\n\n// Method implements the method Adapter.Method.\nfunc (gears *Gear) Method() string {\n\treturn gears.ctx.Req.Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (gears *Gear) FormParam() url.Values {\n\t_ = gears.ctx.Req.ParseMultipartForm(32 << 20)\n\treturn gears.ctx.Req.PostForm\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (gears *Gear) IsPjax() bool {\n\treturn gears.ctx.Req.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (gears *Gear) Query() url.Values {\n\treturn gears.ctx.Req.URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (gears *Gear) Request() *http.Request {\n\treturn gears.ctx.Req\n}"
  },
  {
    "path": "adapter/gf/gf.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage gf\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/gogf/gf/net/ghttp\"\n)\n\n// Gf structure value is a Gf GoAdmin adapter.\ntype Gf struct {\n\tadapter.BaseAdapter\n\tctx *ghttp.Request\n\tapp *ghttp.Server\n}\n\nfunc init() {\n\tengine.Register(new(Gf))\n}\n\n// User implements the method Adapter.User.\nfunc (gf *Gf) User(ctx interface{}) (models.UserModel, bool) {\n\treturn gf.GetUser(ctx, gf)\n}\n\n// Use implements the method Adapter.Use.\nfunc (gf *Gf) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn gf.GetUse(app, plugs, gf)\n}\n\n// Content implements the method Adapter.Content.\nfunc (gf *Gf) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tgf.GetContent(ctx, getPanelFn, gf, btns, fn)\n}\n\ntype HandlerFunc func(ctx *ghttp.Request) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) ghttp.HandlerFunc {\n\treturn func(ctx *ghttp.Request) {\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(*ghttp.Request))\n\t\t})\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (gf *Gf) SetApp(app interface{}) error {\n\tvar (\n\t\teng *ghttp.Server\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*ghttp.Server); !ok {\n\t\treturn errors.New(\"gf adapter SetApp: wrong parameter\")\n\t}\n\tgf.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (gf *Gf) AddHandler(method, path string, handlers context.Handlers) {\n\tgf.app.BindHandler(strings.ToUpper(method)+\":\"+path, func(c *ghttp.Request) {\n\t\tctx := context.NewContext(c.Request)\n\n\t\tnewPath := path\n\n\t\treg1 := regexp.MustCompile(\":(.*?)/\")\n\t\treg2 := regexp.MustCompile(\":(.*?)$\")\n\n\t\tparams := reg1.FindAllString(newPath, -1)\n\t\tnewPath = reg1.ReplaceAllString(newPath, \"\")\n\t\tparams = append(params, reg2.FindAllString(newPath, -1)...)\n\n\t\tfor _, param := range params {\n\t\t\tp := utils.ReplaceAll(param, \":\", \"\", \"/\", \"\")\n\n\t\t\tif c.Request.URL.RawQuery == \"\" {\n\t\t\t\tc.Request.URL.RawQuery += p + \"=\" + c.GetRequestString(p)\n\t\t\t} else {\n\t\t\t\tc.Request.URL.RawQuery += \"&\" + p + \"=\" + c.GetRequestString(p)\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Response.Header().Add(key, head[0])\n\t\t}\n\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\tc.Response.WriteStatus(ctx.Response.StatusCode, buf.Bytes())\n\t\t} else {\n\t\t\tc.Response.WriteStatus(ctx.Response.StatusCode)\n\t\t}\n\t})\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Gf) Name() string {\n\treturn \"gf\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Gf) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx *ghttp.Request\n\t\tok  bool\n\t)\n\n\tif ctx, ok = contextInterface.(*ghttp.Request); !ok {\n\t\tpanic(\"gf adapter SetContext: wrong parameter\")\n\t}\n\treturn &Gf{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (gf *Gf) Redirect() {\n\tgf.ctx.Response.RedirectTo(config.Url(config.GetLoginUrl()))\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (gf *Gf) SetContentType() {\n\tgf.ctx.Response.Header().Add(\"Content-Type\", gf.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (gf *Gf) Write(body []byte) {\n\tgf.ctx.Response.WriteStatus(http.StatusOK, body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (gf *Gf) GetCookie() (string, error) {\n\treturn gf.ctx.Cookie.Get(gf.CookieKey()), nil\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (gf *Gf) Lang() string {\n\treturn gf.ctx.Request.URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (gf *Gf) Path() string {\n\treturn gf.ctx.URL.Path\n}\n\n// Method implements the method Adapter.Method.\nfunc (gf *Gf) Method() string {\n\treturn gf.ctx.Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (gf *Gf) FormParam() url.Values {\n\treturn gf.ctx.Form\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (gf *Gf) IsPjax() bool {\n\treturn gf.ctx.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (gf *Gf) Query() url.Values {\n\treturn gf.ctx.Request.URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (gf *Gf) Request() *http.Request {\n\treturn gf.ctx.Request\n}"
  },
  {
    "path": "adapter/gf2/gf2.go",
    "content": "package gf2\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/gogf/gf/v2/net/ghttp\"\n)\n\ntype GF2 struct {\n\tadapter.BaseAdapter\n\tctx *ghttp.Request\n\tapp *ghttp.Server\n}\n\nfunc init() {\n\tengine.Register(new(GF2))\n}\n\nfunc (*GF2) Name() string {\n\treturn \"gf2\"\n}\n\nfunc (gf2 *GF2) Use(app interface{}, plugins []plugins.Plugin) error {\n\treturn gf2.GetUse(app, plugins, gf2)\n}\n\nfunc (gf2 *GF2) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tgf2.GetContent(ctx, getPanelFn, gf2, btns, fn)\n}\n\nfunc (gf2 *GF2) User(ctx interface{}) (models.UserModel, bool) {\n\treturn gf2.GetUser(ctx, gf2)\n}\n\nfunc (gf2 *GF2) AddHandler(method, path string, handlers context.Handlers) {\n\tgf2.app.BindHandler(strings.ToUpper(method)+\":\"+path, func(c *ghttp.Request) {\n\t\tctx := context.NewContext(c.Request)\n\n\t\tnewPath := path\n\n\t\treg1 := regexp.MustCompile(\":(.*?)/\")\n\t\treg2 := regexp.MustCompile(\":(.*?)$\")\n\n\t\tparams := reg1.FindAllString(newPath, -1)\n\t\tnewPath = reg1.ReplaceAllString(newPath, \"\")\n\t\tparams = append(params, reg2.FindAllString(newPath, -1)...)\n\n\t\tfor _, param := range params {\n\t\t\tp := utils.ReplaceAll(param, \":\", \"\", \"/\", \"\")\n\n\t\t\tif c.Request.URL.RawQuery == \"\" {\n\t\t\t\tc.Request.URL.RawQuery += p + \"=\" + c.GetRequest(p).String()\n\t\t\t} else {\n\t\t\t\tc.Request.URL.RawQuery += \"&\" + p + \"=\" + c.GetRequest(p).String()\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Response.Header().Add(key, head[0])\n\t\t}\n\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\tc.Response.WriteStatus(ctx.Response.StatusCode, buf.Bytes())\n\t\t} else {\n\t\t\tc.Response.WriteStatus(ctx.Response.StatusCode)\n\t\t}\n\t})\n}\n\nfunc (gf2 *GF2) SetApp(app interface{}) error {\n\tvar (\n\t\teng *ghttp.Server\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*ghttp.Server); !ok {\n\t\treturn errors.New(\"gf2 adapter SetApp: wrong parameter\")\n\t}\n\tgf2.app = eng\n\treturn nil\n}\n\nfunc (*GF2) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx *ghttp.Request\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(*ghttp.Request); !ok {\n\t\tpanic(\"gf2 adapter SetContext: wrong parameter\")\n\t}\n\treturn &GF2{ctx: ctx}\n}\n\nfunc (gf2 *GF2) GetCookie() (string, error) {\n\treturn gf2.ctx.Cookie.Get(gf2.CookieKey()).String(), nil\n}\n\nfunc (gf2 *GF2) Lang() string {\n\treturn gf2.ctx.Request.URL.Query().Get(\"__ga_lang\")\n}\n\nfunc (gf2 *GF2) Path() string {\n\treturn gf2.ctx.URL.Path\n}\n\nfunc (gf2 *GF2) Method() string {\n\treturn gf2.ctx.Method\n}\n\nfunc (gf2 *GF2) FormParam() url.Values {\n\treturn gf2.ctx.Form\n}\n\nfunc (gf2 *GF2) Query() url.Values {\n\treturn gf2.ctx.Request.URL.Query()\n}\n\nfunc (gf2 *GF2) IsPjax() bool {\n\treturn gf2.ctx.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\nfunc (gf2 *GF2) Redirect() {\n\tgf2.ctx.Response.RedirectTo(config.Url(config.GetLoginUrl()))\n}\n\nfunc (gf2 *GF2) SetContentType() {\n\tgf2.ctx.Response.Header().Add(\"Content-Type\", gf2.HTMLContentType())\n}\n\nfunc (gf2 *GF2) Write(body []byte) {\n\tgf2.ctx.Response.WriteStatus(http.StatusOK, body)\n}\n\n// Request implements the method Adapter.Request.\nfunc (gf2 *GF2) Request() *http.Request {\n\treturn gf2.ctx.Request\n}"
  },
  {
    "path": "adapter/gin/gin.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage gin\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/gin-gonic/gin\"\n)\n\n// Gin structure value is a Gin GoAdmin adapter.\ntype Gin struct {\n\tadapter.BaseAdapter\n\tctx *gin.Context\n\tapp *gin.Engine\n}\n\nfunc init() {\n\tengine.Register(new(Gin))\n}\n\n// User implements the method Adapter.User.\nfunc (gins *Gin) User(ctx interface{}) (models.UserModel, bool) {\n\treturn gins.GetUser(ctx, gins)\n}\n\n// Use implements the method Adapter.Use.\nfunc (gins *Gin) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn gins.GetUse(app, plugs, gins)\n}\n\n// Content implements the method Adapter.Content.\nfunc (gins *Gin) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tgins.GetContent(ctx, getPanelFn, gins, btns, fn)\n}\n\ntype HandlerFunc func(ctx *gin.Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) gin.HandlerFunc {\n\treturn func(ctx *gin.Context) {\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(*gin.Context))\n\t\t})\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (gins *Gin) SetApp(app interface{}) error {\n\tvar (\n\t\teng *gin.Engine\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*gin.Engine); !ok {\n\t\treturn errors.New(\"gin adapter SetApp: wrong parameter\")\n\t}\n\tgins.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (gins *Gin) AddHandler(method, path string, handlers context.Handlers) {\n\tgins.app.Handle(strings.ToUpper(method), path, func(c *gin.Context) {\n\t\tctx := context.NewContext(c.Request)\n\n\t\tfor _, param := range c.Params {\n\t\t\tif c.Request.URL.RawQuery == \"\" {\n\t\t\t\tc.Request.URL.RawQuery += strings.ReplaceAll(param.Key, \":\", \"\") + \"=\" + param.Value\n\t\t\t} else {\n\t\t\t\tc.Request.URL.RawQuery += \"&\" + strings.ReplaceAll(param.Key, \":\", \"\") + \"=\" + param.Value\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Header(key, head[0])\n\t\t}\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\tc.String(ctx.Response.StatusCode, buf.String())\n\t\t} else {\n\t\t\tc.Status(ctx.Response.StatusCode)\n\t\t}\n\t})\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Gin) Name() string {\n\treturn \"gin\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Gin) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx *gin.Context\n\t\tok  bool\n\t)\n\n\tif ctx, ok = contextInterface.(*gin.Context); !ok {\n\t\tpanic(\"gin adapter SetContext: wrong parameter\")\n\t}\n\n\treturn &Gin{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (gins *Gin) Redirect() {\n\tgins.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))\n\tgins.ctx.Abort()\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (*Gin) SetContentType() {}\n\n// Write implements the method Adapter.Write.\nfunc (gins *Gin) Write(body []byte) {\n\tgins.ctx.Data(http.StatusOK, gins.HTMLContentType(), body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (gins *Gin) GetCookie() (string, error) {\n\treturn gins.ctx.Cookie(gins.CookieKey())\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (gins *Gin) Lang() string {\n\treturn gins.ctx.Request.URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (gins *Gin) Path() string {\n\treturn gins.ctx.Request.URL.Path\n}\n\n// Method implements the method Adapter.Method.\nfunc (gins *Gin) Method() string {\n\treturn gins.ctx.Request.Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (gins *Gin) FormParam() url.Values {\n\t_ = gins.ctx.Request.ParseMultipartForm(32 << 20)\n\treturn gins.ctx.Request.PostForm\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (gins *Gin) IsPjax() bool {\n\treturn gins.ctx.Request.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (gins *Gin) Query() url.Values {\n\treturn gins.ctx.Request.URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (gins *Gin) Request() *http.Request {\n\treturn gins.ctx.Request\n}"
  },
  {
    "path": "adapter/gofiber/gofiber.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage gofiber\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/gofiber/fiber/v2\"\n\t\"github.com/valyala/fasthttp\"\n)\n\n// Fasthttp structure value is a Fasthttp GoAdmin adapter.\ntype Gofiber struct {\n\tadapter.BaseAdapter\n\tctx *fiber.Ctx\n\tapp *fiber.App\n}\n\nfunc init() {\n\tengine.Register(new(Gofiber))\n}\n\n// User implements the method Adapter.User.\nfunc (gof *Gofiber) User(ctx interface{}) (models.UserModel, bool) {\n\treturn gof.GetUser(ctx, gof)\n}\n\n// Use implements the method Adapter.Use.\nfunc (gof *Gofiber) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn gof.GetUse(app, plugs, gof)\n}\n\n// Content implements the method Adapter.Content.\nfunc (gof *Gofiber) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tgof.GetContent(ctx, getPanelFn, gof, btns, fn)\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (gof *Gofiber) SetApp(app interface{}) error {\n\tvar (\n\t\teng *fiber.App\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*fiber.App); !ok {\n\t\treturn errors.New(\"fiber.App adapter SetApp: wrong parameter\")\n\t}\n\n\tgof.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (gof *Gofiber) AddHandler(method, path string, handlers context.Handlers) {\n\n\tgof.app.Add(strings.ToUpper(method), path, func(c *fiber.Ctx) error {\n\n\t\thttpreq := convertCtx(c.Context())\n\t\tctx := context.NewContext(httpreq)\n\n\t\tfor _, key := range c.Route().Params {\n\t\t\tif httpreq.URL.RawQuery == \"\" {\n\t\t\t\thttpreq.URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + c.Params(key)\n\t\t\t} else {\n\t\t\t\thttpreq.URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + c.Params(key)\n\t\t\t}\n\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Set(key, head[0])\n\n\t\t}\n\n\t\treturn c.Status(ctx.Response.StatusCode).SendStream(ctx.Response.Body)\n\n\t})\n\n}\n\nfunc convertCtx(ctx *fasthttp.RequestCtx) *http.Request {\n\tvar r http.Request\n\n\tbody := ctx.PostBody()\n\tr.Method = string(ctx.Method())\n\tr.Proto = \"HTTP/1.1\"\n\tr.ProtoMajor = 1\n\tr.ProtoMinor = 1\n\tr.RequestURI = string(ctx.RequestURI())\n\tr.ContentLength = int64(len(body))\n\tr.Host = string(ctx.Host())\n\tr.RemoteAddr = ctx.RemoteAddr().String()\n\n\thdr := make(http.Header)\n\tctx.Request.Header.VisitAll(func(k, v []byte) {\n\t\tsk := string(k)\n\t\tsv := string(v)\n\t\tswitch sk {\n\t\tcase \"Transfer-Encoding\":\n\t\t\tr.TransferEncoding = append(r.TransferEncoding, sv)\n\t\tdefault:\n\t\t\thdr.Set(sk, sv)\n\t\t}\n\t})\n\tr.Header = hdr\n\tr.Body = &netHTTPBody{body}\n\trURL, err := url.ParseRequestURI(r.RequestURI)\n\tif err != nil {\n\t\tctx.Logger().Printf(\"cannot parse requestURI %q: %s\", r.RequestURI, err)\n\t\tctx.Error(\"Internal Server Error\", fasthttp.StatusInternalServerError)\n\t\treturn &r\n\t}\n\tr.URL = rURL\n\treturn &r\n}\n\ntype netHTTPBody struct {\n\tb []byte\n}\n\nfunc (r *netHTTPBody) Read(p []byte) (int, error) {\n\tif len(r.b) == 0 {\n\t\treturn 0, io.EOF\n\t}\n\tn := copy(p, r.b)\n\tr.b = r.b[n:]\n\treturn n, nil\n}\n\nfunc (r *netHTTPBody) Close() error {\n\tr.b = r.b[:0]\n\treturn nil\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Gofiber) Name() string {\n\treturn \"gofiber\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Gofiber) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx *fiber.Ctx\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(*fiber.Ctx); !ok {\n\t\tpanic(\"gofiber adapter SetContext: wrong parameter\")\n\t}\n\treturn &Gofiber{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (gof *Gofiber) Redirect() {\n\t_ = gof.ctx.Redirect(config.Url(config.GetLoginUrl()), http.StatusFound)\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (gof *Gofiber) SetContentType() {\n\tgof.ctx.Response().Header.Set(\"Content-Type\", gof.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (gof *Gofiber) Write(body []byte) {\n\t_, _ = gof.ctx.Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (gof *Gofiber) GetCookie() (string, error) {\n\treturn string(gof.ctx.Cookies(gof.CookieKey())), nil\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (gof *Gofiber) Lang() string {\n\treturn string(gof.ctx.Request().URI().QueryArgs().Peek(\"__ga_lang\"))\n}\n\n// Path implements the method Adapter.Path.\nfunc (gof *Gofiber) Path() string {\n\treturn string(gof.ctx.Path())\n}\n\n// Method implements the method Adapter.Method.\nfunc (gof *Gofiber) Method() string {\n\treturn string(gof.ctx.Method())\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (gof *Gofiber) FormParam() url.Values {\n\tf, _ := gof.ctx.MultipartForm()\n\tif f != nil {\n\t\treturn f.Value\n\t}\n\treturn url.Values{}\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (gof *Gofiber) IsPjax() bool {\n\treturn string(gof.ctx.Request().Header.Peek(constant.PjaxHeader)) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (gof *Gofiber) Query() url.Values {\n\tqueryStr := gof.ctx.Context().QueryArgs().QueryString()\n\tqueryObj, err := url.Parse(string(queryStr))\n\n\tif err != nil {\n\t\treturn url.Values{}\n\t}\n\n\treturn queryObj.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (gof *Gofiber) Request() *http.Request {\n\treturn convertCtx(gof.ctx.Context())\n}"
  },
  {
    "path": "adapter/gorilla/gorilla.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage gorilla\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/gorilla/mux\"\n)\n\n// Gorilla structure value is a Gorilla GoAdmin adapter.\ntype Gorilla struct {\n\tadapter.BaseAdapter\n\tctx Context\n\tapp *mux.Router\n}\n\nfunc init() {\n\tengine.Register(new(Gorilla))\n}\n\n// User implements the method Adapter.User.\nfunc (g *Gorilla) User(ctx interface{}) (models.UserModel, bool) {\n\treturn g.GetUser(ctx, g)\n}\n\n// Use implements the method Adapter.Use.\nfunc (g *Gorilla) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn g.GetUse(app, plugs, g)\n}\n\n// Content implements the method Adapter.Content.\nfunc (g *Gorilla) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tg.GetContent(ctx, getPanelFn, g, btns, fn)\n}\n\ntype HandlerFunc func(ctx Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) http.HandlerFunc {\n\treturn func(writer http.ResponseWriter, request *http.Request) {\n\t\tctx := Context{\n\t\t\tRequest:  request,\n\t\t\tResponse: writer,\n\t\t}\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(Context))\n\t\t})\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (g *Gorilla) SetApp(app interface{}) error {\n\tvar (\n\t\teng *mux.Router\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*mux.Router); !ok {\n\t\treturn errors.New(\"gorilla adapter SetApp: wrong parameter\")\n\t}\n\tg.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (g *Gorilla) AddHandler(method, path string, handlers context.Handlers) {\n\n\treg1 := regexp.MustCompile(\":(.*?)/\")\n\treg2 := regexp.MustCompile(\":(.*?)$\")\n\n\tu := path\n\tu = reg1.ReplaceAllString(u, \"{$1}/\")\n\tu = reg2.ReplaceAllString(u, \"{$1}\")\n\n\tg.app.HandleFunc(u, func(w http.ResponseWriter, r *http.Request) {\n\t\tctx := context.NewContext(r)\n\n\t\tparams := mux.Vars(r)\n\n\t\tfor key, param := range params {\n\t\t\tif r.URL.RawQuery == \"\" {\n\t\t\t\tr.URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + param\n\t\t\t} else {\n\t\t\t\tr.URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + param\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tw.Header().Add(key, head[0])\n\t\t}\n\n\t\tif ctx.Response.Body == nil {\n\t\t\tw.WriteHeader(ctx.Response.StatusCode)\n\t\t\treturn\n\t\t}\n\n\t\tw.WriteHeader(ctx.Response.StatusCode)\n\n\t\tbuf := new(bytes.Buffer)\n\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\n\t\t_, err := w.Write(buf.Bytes())\n\t\tif err != nil {\n\t\t\tw.WriteHeader(http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\t}).Methods(strings.ToUpper(method))\n}\n\n// Context wraps the Request and Response object of Gorilla.\ntype Context struct {\n\tRequest  *http.Request\n\tResponse http.ResponseWriter\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Gorilla) Name() string {\n\treturn \"gorilla\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Gorilla) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx Context\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(Context); !ok {\n\t\tpanic(\"gorilla adapter SetContext: wrong parameter\")\n\t}\n\n\treturn &Gorilla{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (g *Gorilla) Redirect() {\n\thttp.Redirect(g.ctx.Response, g.ctx.Request, config.Url(config.GetLoginUrl()), http.StatusFound)\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (g *Gorilla) SetContentType() {\n\tg.ctx.Response.Header().Set(\"Content-Type\", g.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (g *Gorilla) Write(body []byte) {\n\t_, _ = g.ctx.Response.Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (g *Gorilla) GetCookie() (string, error) {\n\tcookie, err := g.ctx.Request.Cookie(g.CookieKey())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn cookie.Value, err\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (g *Gorilla) Lang() string {\n\treturn g.ctx.Request.URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (g *Gorilla) Path() string {\n\treturn g.ctx.Request.RequestURI\n}\n\n// Method implements the method Adapter.Method.\nfunc (g *Gorilla) Method() string {\n\treturn g.ctx.Request.Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (g *Gorilla) FormParam() url.Values {\n\t_ = g.ctx.Request.ParseMultipartForm(32 << 20)\n\treturn g.ctx.Request.PostForm\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (g *Gorilla) IsPjax() bool {\n\treturn g.ctx.Request.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (g *Gorilla) Query() url.Values {\n\treturn g.ctx.Request.URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (g *Gorilla) Request() *http.Request {\n\treturn g.ctx.Request\n}"
  },
  {
    "path": "adapter/iris/iris.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage iris\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/kataras/iris/v12\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n)\n\n// Iris structure value is an Iris GoAdmin adapter.\ntype Iris struct {\n\tadapter.BaseAdapter\n\tctx iris.Context\n\tapp *iris.Application\n}\n\nfunc init() {\n\tengine.Register(new(Iris))\n}\n\n// User implements the method Adapter.User.\nfunc (is *Iris) User(ctx interface{}) (models.UserModel, bool) {\n\treturn is.GetUser(ctx, is)\n}\n\n// Use implements the method Adapter.Use.\nfunc (is *Iris) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn is.GetUse(app, plugs, is)\n}\n\n// Content implements the method Adapter.Content.\nfunc (is *Iris) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tis.GetContent(ctx, getPanelFn, is, btns, fn)\n}\n\ntype HandlerFunc func(ctx iris.Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) iris.Handler {\n\treturn func(ctx iris.Context) {\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(iris.Context))\n\t\t})\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (is *Iris) SetApp(app interface{}) error {\n\tvar (\n\t\teng *iris.Application\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*iris.Application); !ok {\n\t\treturn errors.New(\"iris adapter SetApp: wrong parameter\")\n\t}\n\tis.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (is *Iris) AddHandler(method, path string, handlers context.Handlers) {\n\tis.app.Handle(strings.ToUpper(method), path, func(c iris.Context) {\n\t\tctx := context.NewContext(c.Request())\n\n\t\tvar params = map[string]string{}\n\t\tc.Params().Visit(func(key string, value string) {\n\t\t\tparams[key] = value\n\t\t})\n\n\t\tfor key, value := range params {\n\t\t\tif c.Request().URL.RawQuery == \"\" {\n\t\t\t\tc.Request().URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t} else {\n\t\t\t\tc.Request().URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tc.Header(key, head[0])\n\t\t}\n\t\tc.StatusCode(ctx.Response.StatusCode)\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\t_, _ = c.WriteString(buf.String())\n\t\t}\n\t})\n}\n\n// Name implements the method Adapter.Name.\nfunc (*Iris) Name() string {\n\treturn \"iris\"\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*Iris) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx iris.Context\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(iris.Context); !ok {\n\t\tpanic(\"iris adapter SetContext: wrong parameter\")\n\t}\n\n\treturn &Iris{ctx: ctx}\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (is *Iris) Redirect() {\n\tis.ctx.Redirect(config.Url(config.GetLoginUrl()), http.StatusFound)\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (is *Iris) SetContentType() {\n\tis.ctx.Header(\"Content-Type\", is.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (is *Iris) Write(body []byte) {\n\t_, _ = is.ctx.Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (is *Iris) GetCookie() (string, error) {\n\treturn is.ctx.GetCookie(is.CookieKey()), nil\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (is *Iris) Lang() string {\n\treturn is.ctx.Request().URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (is *Iris) Path() string {\n\treturn is.ctx.Path()\n}\n\n// Method implements the method Adapter.Method.\nfunc (is *Iris) Method() string {\n\treturn is.ctx.Method()\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (is *Iris) FormParam() url.Values {\n\treturn is.ctx.FormValues()\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (is *Iris) IsPjax() bool {\n\treturn is.ctx.GetHeader(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (is *Iris) Query() url.Values {\n\treturn is.ctx.Request().URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (is *Iris) Request() *http.Request {\n\treturn is.ctx.Request()\n}"
  },
  {
    "path": "adapter/nethttp/nethttp.go",
    "content": "package nethttp\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\tcfg \"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype NetHTTP struct {\n\tadapter.BaseAdapter\n\tctx Context\n\tapp *http.ServeMux\n}\n\nfunc init() {\n\tengine.Register(new(NetHTTP))\n}\n\n// User implements the method Adapter.User.\nfunc (nh *NetHTTP) User(ctx interface{}) (models.UserModel, bool) {\n\treturn nh.GetUser(ctx, nh)\n}\n\n// Use implements the method Adapter.Use.\nfunc (nh *NetHTTP) Use(app interface{}, plugs []plugins.Plugin) error {\n\treturn nh.GetUse(app, plugs, nh)\n}\n\n// Content implements the method Adapter.Content.\nfunc (nh *NetHTTP) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {\n\tnh.GetContent(ctx, getPanelFn, nh, btns, fn)\n}\n\ntype HandlerFunc func(ctx Context) (types.Panel, error)\n\nfunc Content(handler HandlerFunc) http.HandlerFunc {\n\treturn func(writer http.ResponseWriter, request *http.Request) {\n\t\tctx := Context{\n\t\t\tRequest:  request,\n\t\t\tResponse: writer,\n\t\t}\n\t\tengine.Content(ctx, func(ctx interface{}) (types.Panel, error) {\n\t\t\treturn handler(ctx.(Context))\n\t\t})\n\t}\n}\n\n// SetApp implements the method Adapter.SetApp.\nfunc (nh *NetHTTP) SetApp(app interface{}) error {\n\tvar (\n\t\teng *http.ServeMux\n\t\tok  bool\n\t)\n\tif eng, ok = app.(*http.ServeMux); !ok {\n\t\treturn errors.New(\"net/http adapter SetApp: wrong parameter\")\n\t}\n\tnh.app = eng\n\treturn nil\n}\n\n// AddHandler implements the method Adapter.AddHandler.\nfunc (nh *NetHTTP) AddHandler(method, path string, handlers context.Handlers) {\n\turl := path\n\treg1 := regexp.MustCompile(\":(.*?)/\")\n\treg2 := regexp.MustCompile(\":(.*?)$\")\n\turl = reg1.ReplaceAllString(url, \"{$1}/\")\n\turl = reg2.ReplaceAllString(url, \"{$1}\")\n\n\tif len(url) > 1 && url[0] == '/' && url[1] == '/' {\n\t\turl = url[1:]\n\t}\n\n\tpattern := fmt.Sprintf(\"%s %s\", strings.ToUpper(method), url)\n\n\tnh.app.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {\n\t\tif r.URL.Path[len(r.URL.Path)-1] == '/' {\n\t\t\tr.URL.Path = r.URL.Path[:len(r.URL.Path)-1]\n\t\t}\n\n\t\tctx := context.NewContext(r)\n\n\t\tparams := getPathParams(url, r.URL.Path)\n\t\tfor key, value := range params {\n\t\t\tif r.URL.RawQuery == \"\" {\n\t\t\t\tr.URL.RawQuery += strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t} else {\n\t\t\t\tr.URL.RawQuery += \"&\" + strings.ReplaceAll(key, \":\", \"\") + \"=\" + value\n\t\t\t}\n\t\t}\n\n\t\tctx.SetHandlers(handlers).Next()\n\t\tfor key, head := range ctx.Response.Header {\n\t\t\tw.Header().Set(key, head[0])\n\t\t}\n\t\tif ctx.Response.Body != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t_, _ = buf.ReadFrom(ctx.Response.Body)\n\t\t\tw.WriteHeader(ctx.Response.StatusCode)\n\t\t\t_, _ = w.Write(buf.Bytes())\n\t\t} else {\n\t\t\tw.WriteHeader(ctx.Response.StatusCode)\n\t\t}\n\t})\n}\n\n// HandleFun is type of route methods of chi.\ntype HandleFun func(pattern string, handlerFn http.HandlerFunc)\n\n// Context wraps the Request and Response object of Chi.\ntype Context struct {\n\tRequest  *http.Request\n\tResponse http.ResponseWriter\n}\n\n// SetContext implements the method Adapter.SetContext.\nfunc (*NetHTTP) SetContext(contextInterface interface{}) adapter.WebFrameWork {\n\tvar (\n\t\tctx Context\n\t\tok  bool\n\t)\n\tif ctx, ok = contextInterface.(Context); !ok {\n\t\tpanic(\"net/http adapter SetContext: wrong parameter\")\n\t}\n\treturn &NetHTTP{ctx: ctx}\n}\n\n// Name implements the method Adapter.Name.\nfunc (*NetHTTP) Name() string {\n\treturn \"net/http\"\n}\n\n// Redirect implements the method Adapter.Redirect.\nfunc (nh *NetHTTP) Redirect() {\n\thttp.Redirect(nh.ctx.Response, nh.ctx.Request, cfg.Url(cfg.GetLoginUrl()), http.StatusFound)\n}\n\n// SetContentType implements the method Adapter.SetContentType.\nfunc (nh *NetHTTP) SetContentType() {\n\tnh.ctx.Response.Header().Set(\"Content-Type\", nh.HTMLContentType())\n}\n\n// Write implements the method Adapter.Write.\nfunc (nh *NetHTTP) Write(body []byte) {\n\tnh.ctx.Response.WriteHeader(http.StatusOK)\n\t_, _ = nh.ctx.Response.Write(body)\n}\n\n// GetCookie implements the method Adapter.GetCookie.\nfunc (nh *NetHTTP) GetCookie() (string, error) {\n\tcookie, err := nh.ctx.Request.Cookie(nh.CookieKey())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn cookie.Value, err\n}\n\n// Lang implements the method Adapter.Lang.\nfunc (nh *NetHTTP) Lang() string {\n\treturn nh.ctx.Request.URL.Query().Get(\"__ga_lang\")\n}\n\n// Path implements the method Adapter.Path.\nfunc (nh *NetHTTP) Path() string {\n\treturn nh.ctx.Request.URL.Path\n}\n\n// Method implements the method Adapter.Method.\nfunc (nh *NetHTTP) Method() string {\n\treturn nh.ctx.Request.Method\n}\n\n// FormParam implements the method Adapter.FormParam.\nfunc (nh *NetHTTP) FormParam() url.Values {\n\t_ = nh.ctx.Request.ParseMultipartForm(32 << 20)\n\treturn nh.ctx.Request.PostForm\n}\n\n// IsPjax implements the method Adapter.IsPjax.\nfunc (nh *NetHTTP) IsPjax() bool {\n\treturn nh.ctx.Request.Header.Get(constant.PjaxHeader) == \"true\"\n}\n\n// Query implements the method Adapter.Query.\nfunc (nh *NetHTTP) Query() url.Values {\n\treturn nh.ctx.Request.URL.Query()\n}\n\n// Request implements the method Adapter.Request.\nfunc (nh *NetHTTP) Request() *http.Request {\n\treturn nh.ctx.Request\n}\n\n// getPathParams extracts path parameters from a URL based on a given pattern.\nfunc getPathParams(pattern, url string) map[string]string {\n\tparams := make(map[string]string)\n\n\t// Convert pattern to regex\n\tplaceholderRegex := regexp.MustCompile(`\\{(\\w+)\\}`)\n\tregexPattern := \"^\" + placeholderRegex.ReplaceAllStringFunc(pattern, func(s string) string {\n\t\treturn `(?P<` + s[1:len(s)-1] + `>\\w+)`\n\t}) + `$`\n\n\t// Compile regex\n\tregex := regexp.MustCompile(regexPattern)\n\n\t// Match the URL against the regex\n\tmatch := regex.FindStringSubmatch(url)\n\tif match == nil {\n\t\treturn nil\n\t}\n\n\t// Extract named groups\n\tfor i, name := range regex.SubexpNames() {\n\t\tif i != 0 && name != \"\" { // Ignore the whole match at index 0\n\t\t\tparams[name] = match[i]\n\t\t}\n\t}\n\n\treturn params\n}\n"
  },
  {
    "path": "context/context.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage context\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n)\n\nconst abortIndex int8 = math.MaxInt8 / 2\n\n// Context is the simplify version of web framework context.\n// But it is important which will be used in plugins to custom\n// the request and response. And adapter will help to transform\n// the Context to the web framework`s context. It has three attributes.\n// Request and response are belongs to net/http package. UserValue\n// is the custom key-value store of context.\ntype Context struct {\n\tRequest   *http.Request\n\tResponse  *http.Response\n\tUserValue map[string]interface{}\n\tindex     int8\n\thandlers  Handlers\n}\n\n// Path is used in the matching of request and response. Url stores the\n// raw register url. RegUrl contains the wildcard which on behalf of\n// the route params.\ntype Path struct {\n\tURL    string\n\tMethod string\n}\n\ntype RouterMap map[string]Router\n\nfunc (r RouterMap) Get(name string) Router {\n\treturn r[name]\n}\n\ntype Router struct {\n\tMethods []string\n\tPatten  string\n}\n\nfunc (r Router) Method() string {\n\treturn r.Methods[0]\n}\n\nfunc (r Router) GetURL(value ...string) string {\n\tu := r.Patten\n\tfor i := 0; i < len(value); i += 2 {\n\t\tu = strings.ReplaceAll(u, \":__\"+value[i], value[i+1])\n\t}\n\treturn u\n}\n\ntype NodeProcessor func(...Node)\n\ntype Node struct {\n\tPath     string\n\tMethod   string\n\tHandlers []Handler\n\tValue    map[string]interface{}\n}\n\n// SetUserValue set the value of user context.\nfunc (ctx *Context) SetUserValue(key string, value interface{}) {\n\tctx.UserValue[key] = value\n}\n\n// GetUserValue get the value of key.\nfunc (ctx *Context) GetUserValue(key string) interface{} {\n\treturn ctx.UserValue[key]\n}\n\n// Path return the url path.\nfunc (ctx *Context) Path() string {\n\treturn ctx.Request.URL.Path\n}\n\n// Abort abort the context.\nfunc (ctx *Context) Abort() {\n\tctx.index = abortIndex\n}\n\n// Next should be used only inside middleware.\nfunc (ctx *Context) Next() {\n\tctx.index++\n\tfor s := int8(len(ctx.handlers)); ctx.index < s; ctx.index++ {\n\t\tctx.handlers[ctx.index](ctx)\n\t}\n}\n\n// SetHandlers set the handlers of Context.\nfunc (ctx *Context) SetHandlers(handlers Handlers) *Context {\n\tctx.handlers = handlers\n\treturn ctx\n}\n\n// Method return the request method.\nfunc (ctx *Context) Method() string {\n\treturn ctx.Request.Method\n}\n\n// NewContext used in adapter which return a Context with request\n// and slice of UserValue and a default Response.\nfunc NewContext(req *http.Request) *Context {\n\n\treturn &Context{\n\t\tRequest:   req,\n\t\tUserValue: make(map[string]interface{}),\n\t\tResponse: &http.Response{\n\t\t\tStatusCode: http.StatusOK,\n\t\t\tHeader:     make(http.Header),\n\t\t},\n\t\tindex: -1,\n\t}\n}\n\nconst (\n\tHeaderContentType = \"Content-Type\"\n\n\tHeaderLastModified    = \"Last-Modified\"\n\tHeaderIfModifiedSince = \"If-Modified-Since\"\n\tHeaderCacheControl    = \"Cache-Control\"\n\tHeaderETag            = \"ETag\"\n\n\tHeaderContentDisposition = \"Content-Disposition\"\n\tHeaderContentLength      = \"Content-Length\"\n\tHeaderContentEncoding    = \"Content-Encoding\"\n\n\tGzipHeaderValue      = \"gzip\"\n\tHeaderAcceptEncoding = \"Accept-Encoding\"\n\tHeaderVary           = \"Vary\"\n\n\tThemeKey = \"__ga_theme\"\n)\n\nfunc (ctx *Context) BindJSON(data interface{}) error {\n\tif ctx.Request.Body != nil {\n\t\tb, err := io.ReadAll(ctx.Request.Body)\n\t\tif err == nil {\n\t\t\treturn json.Unmarshal(b, data)\n\t\t}\n\t\treturn err\n\t}\n\treturn errors.New(\"empty request body\")\n}\n\nfunc (ctx *Context) MustBindJSON(data interface{}) {\n\tif ctx.Request.Body != nil {\n\t\tb, err := io.ReadAll(ctx.Request.Body)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\terr = json.Unmarshal(b, data)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\tpanic(\"empty request body\")\n}\n\n// Write save the given status code, headers and body string into the response.\nfunc (ctx *Context) Write(code int, header map[string]string, Body string) {\n\tctx.Response.StatusCode = code\n\tfor key, head := range header {\n\t\tctx.AddHeader(key, head)\n\t}\n\tctx.Response.Body = io.NopCloser(strings.NewReader(Body))\n}\n\n// JSON serializes the given struct as JSON into the response body.\n// It also sets the Content-Type as \"application/json\".\nfunc (ctx *Context) JSON(code int, Body map[string]interface{}) {\n\tctx.Response.StatusCode = code\n\tctx.SetContentType(\"application/json\")\n\tBodyStr, err := json.Marshal(Body)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tctx.Response.Body = io.NopCloser(bytes.NewReader(BodyStr))\n}\n\n// DataWithHeaders save the given status code, headers and body data into the response.\nfunc (ctx *Context) DataWithHeaders(code int, header map[string]string, data []byte) {\n\tctx.Response.StatusCode = code\n\tfor key, head := range header {\n\t\tctx.AddHeader(key, head)\n\t}\n\tctx.Response.Body = io.NopCloser(bytes.NewBuffer(data))\n}\n\n// Data writes some data into the body stream and updates the HTTP code.\nfunc (ctx *Context) Data(code int, contentType string, data []byte) {\n\tctx.Response.StatusCode = code\n\tctx.SetContentType(contentType)\n\tctx.Response.Body = io.NopCloser(bytes.NewBuffer(data))\n}\n\n// Redirect add redirect url to header.\nfunc (ctx *Context) Redirect(path string) {\n\tctx.Response.StatusCode = http.StatusFound\n\tctx.SetContentType(\"text/html; charset=utf-8\")\n\tctx.AddHeader(\"Location\", path)\n}\n\n// HTML output html response.\nfunc (ctx *Context) HTML(code int, body string) {\n\tctx.SetContentType(\"text/html; charset=utf-8\")\n\tctx.SetStatusCode(code)\n\tctx.WriteString(body)\n}\n\n// HTMLByte output html response.\nfunc (ctx *Context) HTMLByte(code int, body []byte) {\n\tctx.SetContentType(\"text/html; charset=utf-8\")\n\tctx.SetStatusCode(code)\n\tctx.Response.Body = io.NopCloser(bytes.NewBuffer(body))\n}\n\n// WriteString save the given body string into the response.\nfunc (ctx *Context) WriteString(body string) {\n\tctx.Response.Body = io.NopCloser(strings.NewReader(body))\n}\n\n// SetStatusCode save the given status code into the response.\nfunc (ctx *Context) SetStatusCode(code int) {\n\tctx.Response.StatusCode = code\n}\n\n// SetContentType save the given content type header into the response header.\nfunc (ctx *Context) SetContentType(contentType string) {\n\tctx.AddHeader(HeaderContentType, contentType)\n}\n\nfunc (ctx *Context) SetLastModified(modtime time.Time) {\n\tif !IsZeroTime(modtime) {\n\t\tctx.AddHeader(HeaderLastModified, modtime.UTC().Format(http.TimeFormat)) // or modtime.UTC()?\n\t}\n}\n\nvar unixEpochTime = time.Unix(0, 0)\n\n// IsZeroTime reports whether t is obviously unspecified (either zero or Unix()=0).\nfunc IsZeroTime(t time.Time) bool {\n\treturn t.IsZero() || t.Equal(unixEpochTime)\n}\n\n// ParseTime parses a time header (such as the Date: header),\n// trying each forth formats\n// that are allowed by HTTP/1.1:\n// time.RFC850, and time.ANSIC.\nvar ParseTime = func(text string) (t time.Time, err error) {\n\tt, err = time.Parse(http.TimeFormat, text)\n\tif err != nil {\n\t\treturn http.ParseTime(text)\n\t}\n\n\treturn\n}\n\nfunc (ctx *Context) WriteNotModified() {\n\t// RFC 7232 section 4.1:\n\t// a sender SHOULD NOT generate representation metadata other than the\n\t// above listed fields unless said metadata exists for the purpose of\n\t// guiding cache updates (e.g.,\" Last-Modified\" might be useful if the\n\t// response does not have an ETag field).\n\tdelete(ctx.Response.Header, HeaderContentType)\n\tdelete(ctx.Response.Header, HeaderContentLength)\n\tif ctx.Headers(HeaderETag) != \"\" {\n\t\tdelete(ctx.Response.Header, HeaderLastModified)\n\t}\n\tctx.SetStatusCode(http.StatusNotModified)\n}\n\nfunc (ctx *Context) CheckIfModifiedSince(modtime time.Time) (bool, error) {\n\tif method := ctx.Method(); method != http.MethodGet && method != http.MethodHead {\n\t\treturn false, errors.New(\"skip: method\")\n\t}\n\tims := ctx.Headers(HeaderIfModifiedSince)\n\tif ims == \"\" || IsZeroTime(modtime) {\n\t\treturn false, errors.New(\"skip: zero time\")\n\t}\n\tt, err := ParseTime(ims)\n\tif err != nil {\n\t\treturn false, errors.New(\"skip: \" + err.Error())\n\t}\n\t// sub-second precision, so\n\t// use mtime < t+1s instead of mtime <= t to check for unmodified.\n\tif modtime.UTC().Before(t.Add(1 * time.Second)) {\n\t\treturn false, nil\n\t}\n\treturn true, nil\n}\n\n// LocalIP return the request client ip.\nfunc (ctx *Context) LocalIP() string {\n\txForwardedFor := ctx.Request.Header.Get(\"X-Forwarded-For\")\n\tip := strings.TrimSpace(strings.Split(xForwardedFor, \",\")[0])\n\tif ip != \"\" {\n\t\treturn ip\n\t}\n\n\tip = strings.TrimSpace(ctx.Request.Header.Get(\"X-Real-Ip\"))\n\tif ip != \"\" {\n\t\treturn ip\n\t}\n\n\tif ip, _, err := net.SplitHostPort(strings.TrimSpace(ctx.Request.RemoteAddr)); err == nil {\n\t\treturn ip\n\t}\n\n\treturn \"127.0.0.1\"\n}\n\n// SetCookie save the given cookie obj into the response Set-Cookie header.\nfunc (ctx *Context) SetCookie(cookie *http.Cookie) {\n\tif v := cookie.String(); v != \"\" {\n\t\tctx.AddHeader(\"Set-Cookie\", v)\n\t}\n}\n\n// Query get the query parameter of url.\nfunc (ctx *Context) Query(key string) string {\n\treturn ctx.Request.URL.Query().Get(key)\n}\n\n// QueryAll get the query parameters of url.\nfunc (ctx *Context) QueryAll(key string) []string {\n\treturn ctx.Request.URL.Query()[key]\n}\n\n// QueryDefault get the query parameter of url. If it is empty, return the default.\nfunc (ctx *Context) QueryDefault(key, def string) string {\n\tvalue := ctx.Query(key)\n\tif value == \"\" {\n\t\treturn def\n\t}\n\treturn value\n}\n\n// Lang get the query parameter of url with given key __ga_lang.\nfunc (ctx *Context) Lang() string {\n\treturn ctx.Query(\"__ga_lang\")\n}\n\n// Theme get the request theme with given key __ga_theme.\nfunc (ctx *Context) Theme() string {\n\tqueryTheme := ctx.Query(ThemeKey)\n\tif queryTheme != \"\" {\n\t\treturn queryTheme\n\t}\n\tcookieTheme := ctx.Cookie(ThemeKey)\n\tif cookieTheme != \"\" {\n\t\treturn cookieTheme\n\t}\n\treturn ctx.RefererQuery(ThemeKey)\n}\n\n// Headers get the value of request headers key.\nfunc (ctx *Context) Headers(key string) string {\n\treturn ctx.Request.Header.Get(key)\n}\n\n// Referer get the url string of request header Referer.\nfunc (ctx *Context) Referer() string {\n\treturn ctx.Headers(\"Referer\")\n}\n\n// RefererURL get the url.URL object of request header Referer.\nfunc (ctx *Context) RefererURL() *url.URL {\n\tref := ctx.Headers(\"Referer\")\n\tif ref == \"\" {\n\t\treturn nil\n\t}\n\tu, err := url.Parse(ref)\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn u\n}\n\n// RefererQuery retrieve the value of given key from url.URL object of request header Referer.\nfunc (ctx *Context) RefererQuery(key string) string {\n\tif u := ctx.RefererURL(); u != nil {\n\t\treturn u.Query().Get(key)\n\t}\n\treturn \"\"\n}\n\n// FormValue get the value of request form key.\nfunc (ctx *Context) FormValue(key string) string {\n\treturn ctx.Request.FormValue(key)\n}\n\n// PostForm get the values of request form.\nfunc (ctx *Context) PostForm() url.Values {\n\t_ = ctx.Request.ParseMultipartForm(32 << 20)\n\treturn ctx.Request.PostForm\n}\n\nfunc (ctx *Context) WantHTML() bool {\n\treturn ctx.Method() == \"GET\" && strings.Contains(ctx.Headers(\"Accept\"), \"html\")\n}\n\nfunc (ctx *Context) WantJSON() bool {\n\treturn strings.Contains(ctx.Headers(\"Accept\"), \"json\")\n}\n\n// AddHeader adds the key, value pair to the header.\nfunc (ctx *Context) AddHeader(key, value string) {\n\tctx.Response.Header.Add(key, value)\n}\n\n// PjaxUrl add pjax url header.\nfunc (ctx *Context) PjaxUrl(url string) {\n\tctx.Response.Header.Add(constant.PjaxUrlHeader, url)\n}\n\n// IsPjax check request is pjax or not.\nfunc (ctx *Context) IsPjax() bool {\n\treturn ctx.Headers(constant.PjaxHeader) == \"true\"\n}\n\n// IsIframe check request is iframe or not.\nfunc (ctx *Context) IsIframe() bool {\n\treturn ctx.Query(constant.IframeKey) == \"true\" || ctx.Headers(constant.IframeKey) == \"true\"\n}\n\n// SetHeader set the key, value pair to the header.\nfunc (ctx *Context) SetHeader(key, value string) {\n\tctx.Response.Header.Set(key, value)\n}\n\nfunc (ctx *Context) GetContentType() string {\n\treturn ctx.Request.Header.Get(\"Content-Type\")\n}\n\nfunc (ctx *Context) Cookie(name string) string {\n\tfor _, ck := range ctx.Request.Cookies() {\n\t\tif ck.Name == name {\n\t\t\treturn ck.Value\n\t\t}\n\t}\n\treturn \"\"\n}\n\n// User return the current login user.\nfunc (ctx *Context) User() interface{} {\n\treturn ctx.UserValue[\"user\"]\n}\n\n// ServeContent serves content, headers are autoset\n// receives three parameters, it's low-level function, instead you can use .ServeFile(string,bool)/SendFile(string,string)\n//\n// You can define your own \"Content-Type\" header also, after this function call\n// Doesn't implements resuming (by range), use ctx.SendFile instead\nfunc (ctx *Context) ServeContent(content io.ReadSeeker, filename string, modtime time.Time, gzipCompression bool) error {\n\tif modified, err := ctx.CheckIfModifiedSince(modtime); !modified && err == nil {\n\t\tctx.WriteNotModified()\n\t\treturn nil\n\t}\n\n\tif ctx.GetContentType() == \"\" {\n\t\tctx.SetContentType(filename)\n\t}\n\n\tbuf, _ := io.ReadAll(content)\n\tctx.Response.Body = io.NopCloser(bytes.NewBuffer(buf))\n\treturn nil\n}\n\n// ServeFile serves a view file, to send a file ( zip for example) to the client you should use the SendFile(serverfilename,clientfilename)\nfunc (ctx *Context) ServeFile(filename string, gzipCompression bool) error {\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%d\", http.StatusNotFound)\n\t}\n\tdefer func() {\n\t\t_ = f.Close()\n\t}()\n\tfi, _ := f.Stat()\n\tif fi.IsDir() {\n\t\treturn ctx.ServeFile(path.Join(filename, \"index.html\"), gzipCompression)\n\t}\n\n\treturn ctx.ServeContent(f, fi.Name(), fi.ModTime(), gzipCompression)\n}\n\ntype HandlerMap map[Path]Handlers\n\n// App is the key struct of the package. App as a member of plugin\n// entity contains the request and the corresponding handler. Prefix\n// is the url prefix and MiddlewareList is for control flow.\ntype App struct {\n\tRequests    []Path\n\tHandlers    HandlerMap\n\tMiddlewares Handlers\n\tPrefix      string\n\n\tRouters    RouterMap\n\trouteIndex int\n\trouteANY   bool\n}\n\n// NewApp return an empty app.\nfunc NewApp() *App {\n\treturn &App{\n\t\tRequests:    make([]Path, 0),\n\t\tHandlers:    make(HandlerMap),\n\t\tPrefix:      \"/\",\n\t\tMiddlewares: make([]Handler, 0),\n\t\trouteIndex:  -1,\n\t\tRouters:     make(RouterMap),\n\t}\n}\n\n// Handler defines the handler used by the middleware as return value.\ntype Handler func(ctx *Context)\n\n// Handlers is the array of Handler\ntype Handlers []Handler\n\n// AppendReqAndResp stores the request info and handle into app.\n// support the route parameter. The route parameter will be recognized as\n// wildcard store into the RegUrl of Path struct. For example:\n//\n//\t/user/:id      => /user/(.*)\n//\t/user/:id/info => /user/(.*?)/info\n//\n// The RegUrl will be used to recognize the incoming path and find\n// the handler.\nfunc (app *App) AppendReqAndResp(url, method string, handler []Handler) {\n\n\tapp.Requests = append(app.Requests, Path{\n\t\tURL:    join(app.Prefix, url),\n\t\tMethod: method,\n\t})\n\tapp.routeIndex++\n\n\tapp.Handlers[Path{\n\t\tURL:    join(app.Prefix, url),\n\t\tMethod: method,\n\t}] = append(app.Middlewares, handler...)\n}\n\n// Find is public helper method for findPath of tree.\nfunc (app *App) Find(url, method string) []Handler {\n\tapp.routeANY = false\n\treturn app.Handlers[Path{URL: url, Method: method}]\n}\n\n// POST is a shortcut for app.AppendReqAndResp(url, \"post\", handler).\nfunc (app *App) POST(url string, handler ...Handler) *App {\n\tapp.routeANY = false\n\tapp.AppendReqAndResp(url, \"post\", handler)\n\treturn app\n}\n\n// GET is a shortcut for app.AppendReqAndResp(url, \"get\", handler).\nfunc (app *App) GET(url string, handler ...Handler) *App {\n\tapp.routeANY = false\n\tapp.AppendReqAndResp(url, \"get\", handler)\n\treturn app\n}\n\n// DELETE is a shortcut for app.AppendReqAndResp(url, \"delete\", handler).\nfunc (app *App) DELETE(url string, handler ...Handler) *App {\n\tapp.routeANY = false\n\tapp.AppendReqAndResp(url, \"delete\", handler)\n\treturn app\n}\n\n// PUT is a shortcut for app.AppendReqAndResp(url, \"put\", handler).\nfunc (app *App) PUT(url string, handler ...Handler) *App {\n\tapp.routeANY = false\n\tapp.AppendReqAndResp(url, \"put\", handler)\n\treturn app\n}\n\n// OPTIONS is a shortcut for app.AppendReqAndResp(url, \"options\", handler).\nfunc (app *App) OPTIONS(url string, handler ...Handler) *App {\n\tapp.routeANY = false\n\tapp.AppendReqAndResp(url, \"options\", handler)\n\treturn app\n}\n\n// HEAD is a shortcut for app.AppendReqAndResp(url, \"head\", handler).\nfunc (app *App) HEAD(url string, handler ...Handler) *App {\n\tapp.routeANY = false\n\tapp.AppendReqAndResp(url, \"head\", handler)\n\treturn app\n}\n\n// ANY registers a route that matches all the HTTP methods.\n// GET, POST, PUT, HEAD, OPTIONS, DELETE.\nfunc (app *App) ANY(url string, handler ...Handler) *App {\n\tapp.routeANY = true\n\tapp.AppendReqAndResp(url, \"post\", handler)\n\tapp.AppendReqAndResp(url, \"get\", handler)\n\tapp.AppendReqAndResp(url, \"delete\", handler)\n\tapp.AppendReqAndResp(url, \"put\", handler)\n\tapp.AppendReqAndResp(url, \"options\", handler)\n\tapp.AppendReqAndResp(url, \"head\", handler)\n\treturn app\n}\n\nfunc (app *App) Name(name string) {\n\tif app.routeANY {\n\t\tapp.Routers[name] = Router{\n\t\t\tMethods: []string{\"POST\", \"GET\", \"DELETE\", \"PUT\", \"OPTIONS\", \"HEAD\"},\n\t\t\tPatten:  app.Requests[app.routeIndex].URL,\n\t\t}\n\t} else {\n\t\tapp.Routers[name] = Router{\n\t\t\tMethods: []string{app.Requests[app.routeIndex].Method},\n\t\t\tPatten:  app.Requests[app.routeIndex].URL,\n\t\t}\n\t}\n}\n\n// Group add middlewares and prefix for App.\nfunc (app *App) Group(prefix string, middleware ...Handler) *RouterGroup {\n\treturn &RouterGroup{\n\t\tapp:         app,\n\t\tMiddlewares: append(app.Middlewares, middleware...),\n\t\tPrefix:      slash(prefix),\n\t}\n}\n\n// RouterGroup is a group of routes.\ntype RouterGroup struct {\n\tapp         *App\n\tMiddlewares Handlers\n\tPrefix      string\n}\n\n// AppendReqAndResp stores the request info and handle into app.\n// support the route parameter. The route parameter will be recognized as\n// wildcard store into the RegUrl of Path struct. For example:\n//\n//\t/user/:id      => /user/(.*)\n//\t/user/:id/info => /user/(.*?)/info\n//\n// The RegUrl will be used to recognize the incoming path and find\n// the handler.\nfunc (g *RouterGroup) AppendReqAndResp(url, method string, handler []Handler) {\n\n\tg.app.Requests = append(g.app.Requests, Path{\n\t\tURL:    join(g.Prefix, url),\n\t\tMethod: method,\n\t})\n\tg.app.routeIndex++\n\n\tvar h = make([]Handler, len(g.Middlewares))\n\tcopy(h, g.Middlewares)\n\n\tg.app.Handlers[Path{\n\t\tURL:    join(g.Prefix, url),\n\t\tMethod: method,\n\t}] = append(h, handler...)\n}\n\n// POST is a shortcut for app.AppendReqAndResp(url, \"post\", handler).\nfunc (g *RouterGroup) POST(url string, handler ...Handler) *RouterGroup {\n\tg.app.routeANY = false\n\tg.AppendReqAndResp(url, \"post\", handler)\n\treturn g\n}\n\n// GET is a shortcut for app.AppendReqAndResp(url, \"get\", handler).\nfunc (g *RouterGroup) GET(url string, handler ...Handler) *RouterGroup {\n\tg.app.routeANY = false\n\tg.AppendReqAndResp(url, \"get\", handler)\n\treturn g\n}\n\n// DELETE is a shortcut for app.AppendReqAndResp(url, \"delete\", handler).\nfunc (g *RouterGroup) DELETE(url string, handler ...Handler) *RouterGroup {\n\tg.app.routeANY = false\n\tg.AppendReqAndResp(url, \"delete\", handler)\n\treturn g\n}\n\n// PUT is a shortcut for app.AppendReqAndResp(url, \"put\", handler).\nfunc (g *RouterGroup) PUT(url string, handler ...Handler) *RouterGroup {\n\tg.app.routeANY = false\n\tg.AppendReqAndResp(url, \"put\", handler)\n\treturn g\n}\n\n// OPTIONS is a shortcut for app.AppendReqAndResp(url, \"options\", handler).\nfunc (g *RouterGroup) OPTIONS(url string, handler ...Handler) *RouterGroup {\n\tg.app.routeANY = false\n\tg.AppendReqAndResp(url, \"options\", handler)\n\treturn g\n}\n\n// HEAD is a shortcut for app.AppendReqAndResp(url, \"head\", handler).\nfunc (g *RouterGroup) HEAD(url string, handler ...Handler) *RouterGroup {\n\tg.app.routeANY = false\n\tg.AppendReqAndResp(url, \"head\", handler)\n\treturn g\n}\n\n// ANY registers a route that matches all the HTTP methods.\n// GET, POST, PUT, HEAD, OPTIONS, DELETE.\nfunc (g *RouterGroup) ANY(url string, handler ...Handler) *RouterGroup {\n\tg.app.routeANY = true\n\tg.AppendReqAndResp(url, \"post\", handler)\n\tg.AppendReqAndResp(url, \"get\", handler)\n\tg.AppendReqAndResp(url, \"delete\", handler)\n\tg.AppendReqAndResp(url, \"put\", handler)\n\tg.AppendReqAndResp(url, \"options\", handler)\n\tg.AppendReqAndResp(url, \"head\", handler)\n\treturn g\n}\n\nfunc (g *RouterGroup) Name(name string) {\n\tg.app.Name(name)\n}\n\n// Group add middlewares and prefix for RouterGroup.\nfunc (g *RouterGroup) Group(prefix string, middleware ...Handler) *RouterGroup {\n\treturn &RouterGroup{\n\t\tapp:         g.app,\n\t\tMiddlewares: append(g.Middlewares, middleware...),\n\t\tPrefix:      join(slash(g.Prefix), slash(prefix)),\n\t}\n}\n\n// slash fix the path which has wrong format problem.\n//\n//\t\"\"      => \"/\"\n//\t\"abc/\"  => \"/abc\"\n//\t\"/abc/\" => \"/abc\"\n//\t\"/abc\"  => \"/abc\"\n//\t\"/\"     => \"/\"\nfunc slash(prefix string) string {\n\tprefix = strings.TrimSpace(prefix)\n\tif prefix == \"\" || prefix == \"/\" {\n\t\treturn \"/\"\n\t}\n\tif prefix[0] != '/' {\n\t\tif prefix[len(prefix)-1] == '/' {\n\t\t\treturn \"/\" + prefix[:len(prefix)-1]\n\t\t}\n\t\treturn \"/\" + prefix\n\t}\n\tif prefix[len(prefix)-1] == '/' {\n\t\treturn prefix[:len(prefix)-1]\n\t}\n\treturn prefix\n}\n\n// join join the path.\nfunc join(prefix, suffix string) string {\n\tif prefix == \"/\" {\n\t\treturn suffix\n\t}\n\tif suffix == \"/\" {\n\t\treturn prefix\n\t}\n\treturn prefix + suffix\n}\n"
  },
  {
    "path": "context/context_test.go",
    "content": "package context\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc TestSlash(t *testing.T) {\n\tassert.Equal(t, \"/abc\", slash(\"/abc\"))\n\tassert.Equal(t, \"/\", slash(\"\"))\n\tassert.Equal(t, \"/abc\", slash(\"abc/\"))\n\tassert.Equal(t, \"/\", slash(\"/\"))\n\tassert.Equal(t, \"/abc\", slash(\"/abc/\"))\n\tassert.Equal(t, \"/\", slash(\"//\"))\n}\n\nfunc TestJoin(t *testing.T) {\n\tassert.Equal(t, \"/abc/abc\", join(slash(\"/abc\"), slash(\"/abc\")))\n\tassert.Equal(t, \"/\", join(slash(\"/\"), slash(\"/\")))\n\tassert.Equal(t, \"/abc\", join(slash(\"/\"), slash(\"/abc\")))\n\tassert.Equal(t, \"/abc\", join(slash(\"abc/\"), slash(\"/\")))\n\tassert.Equal(t, \"/abc\", join(slash(\"/abc/\"), slash(\"/\")))\n}\n\nfunc TestTree(t *testing.T) {\n\ttree := tree()\n\ttree.addPath(stringToArr(\"/adm\"), \"GET\", []Handler{func(ctx *Context) { fmt.Println(1) }})\n\ttree.addPath(stringToArr(\"/admi\"), \"GET\", []Handler{func(ctx *Context) { fmt.Println(1) }})\n\ttree.addPath(stringToArr(\"/admin\"), \"GET\", []Handler{func(ctx *Context) { fmt.Println(1) }})\n\ttree.addPath(stringToArr(\"/admin/menu/new\"), \"POST\", []Handler{func(ctx *Context) { fmt.Println(1) }})\n\ttree.addPath(stringToArr(\"/admin/menu/new\"), \"GET\", []Handler{func(ctx *Context) { fmt.Println(1) }})\n\ttree.addPath(stringToArr(\"/admin/info/:__prefix\"), \"GET\", []Handler{\n\t\tfunc(ctx *Context) { fmt.Println(\"auth\") },\n\t\tfunc(ctx *Context) { fmt.Println(\"init\") },\n\t\tfunc(ctx *Context) { fmt.Println(\"info\") },\n\t})\n\ttree.addPath(stringToArr(\"/admin/info/:__prefix/detail\"), \"GET\", []Handler{\n\t\tfunc(ctx *Context) { fmt.Println(\"auth\") },\n\t\tfunc(ctx *Context) { fmt.Println(\"detail\") },\n\t})\n\n\tfmt.Println(\"/admin/menu/new\", \"GET\")\n\th := tree.findPath(stringToArr(\"/admin/menu/new\"), \"GET\")\n\tassert.Equal(t, h != nil, true)\n\tprintHandler(h)\n\tfmt.Println(\"/admin/menu/new\", \"POST\")\n\th = tree.findPath(stringToArr(\"/admin/menu/new\"), \"POST\")\n\tassert.Equal(t, h != nil, true)\n\tprintHandler(h)\n\tfmt.Println(\"/admin/me/new\", \"POST\")\n\th = tree.findPath(stringToArr(\"/admin/me/new\"), \"POST\")\n\tassert.Equal(t, h == nil, true)\n\tprintHandler(h)\n\tfmt.Println(\"/admin/info/user\", \"GET\")\n\th = tree.findPath(stringToArr(\"/admin/info/user\"), \"GET\")\n\tassert.Equal(t, h != nil, true)\n\tprintHandler(h)\n\tfmt.Println(\"/admin/info/user/detail\", \"GET\")\n\th = tree.findPath(stringToArr(\"/admin/info/user/detail\"), \"GET\")\n\tassert.Equal(t, h != nil, true)\n\tprintHandler(h)\n\tfmt.Println(\"=========== printChildren ===========\")\n\ttree.printChildren()\n}\n\nfunc printHandler(h []Handler) {\n\tfor _, value := range h {\n\t\tvalue(&Context{})\n\t}\n}\n"
  },
  {
    "path": "context/trie.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage context\n\nimport \"fmt\"\n\ntype node struct {\n\tchildren []*node\n\tvalue    string\n\tmethod   []string\n\thandle   [][]Handler\n}\n\nfunc tree() *node {\n\treturn &node{\n\t\tchildren: make([]*node, 0),\n\t\tvalue:    \"/\",\n\t\thandle:   nil,\n\t}\n}\n\nfunc (n *node) hasMethod(method string) int {\n\tfor k, m := range n.method {\n\t\tif m == method {\n\t\t\treturn k\n\t\t}\n\t}\n\treturn -1\n}\n\nfunc (n *node) addMethodAndHandler(method string, handler []Handler) {\n\tn.method = append(n.method, method)\n\tn.handle = append(n.handle, handler)\n}\n\nfunc (n *node) addChild(child *node) {\n\tn.children = append(n.children, child)\n}\n\nfunc (n *node) addContent(value string) *node {\n\tvar child = n.search(value)\n\tif child == nil {\n\t\tchild = &node{\n\t\t\tchildren: make([]*node, 0),\n\t\t\tvalue:    value,\n\t\t}\n\t\tn.addChild(child)\n\t}\n\treturn child\n}\n\nfunc (n *node) search(value string) *node {\n\tfor _, child := range n.children {\n\t\tif child.value == value || child.value == \"*\" {\n\t\t\treturn child\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (n *node) addPath(paths []string, method string, handler []Handler) {\n\tchild := n\n\tfor i := 0; i < len(paths); i++ {\n\t\tchild = child.addContent(paths[i])\n\t}\n\tchild.addMethodAndHandler(method, handler)\n}\n\nfunc (n *node) findPath(paths []string, method string) []Handler {\n\tchild := n\n\tfor i := 0; i < len(paths); i++ {\n\t\tchild = child.search(paths[i])\n\t\tif child == nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tmethodIndex := child.hasMethod(method)\n\tif methodIndex == -1 {\n\t\treturn nil\n\t}\n\n\treturn child.handle[methodIndex]\n}\n\nfunc (n *node) print() {\n\tfmt.Println(n)\n}\n\nfunc (n *node) printChildren() {\n\tn.print()\n\tfor _, child := range n.children {\n\t\tchild.printChildren()\n\t}\n}\n\nfunc stringToArr(path string) []string {\n\tvar (\n\t\tpaths      = make([]string, 0)\n\t\tstart      = 0\n\t\tend        int\n\t\tisWildcard = false\n\t)\n\tfor i := 0; i < len(path); i++ {\n\t\tif i == 0 && path[0] == '/' {\n\t\t\tstart = 1\n\t\t\tcontinue\n\t\t}\n\t\tif path[i] == ':' {\n\t\t\tisWildcard = true\n\t\t}\n\t\tif i == len(path)-1 {\n\t\t\tend = i + 1\n\t\t\tif isWildcard {\n\t\t\t\tpaths = append(paths, \"*\")\n\t\t\t} else {\n\t\t\t\tpaths = append(paths, path[start:end])\n\t\t\t}\n\t\t}\n\t\tif path[i] == '/' {\n\t\t\tend = i\n\t\t\tif isWildcard {\n\t\t\t\tpaths = append(paths, \"*\")\n\t\t\t} else {\n\t\t\t\tpaths = append(paths, path[start:end])\n\t\t\t}\n\t\t\tstart = i + 1\n\t\t\tisWildcard = false\n\t\t}\n\t}\n\treturn paths\n}\n"
  },
  {
    "path": "data/admin.mssql",
    "content": "\n\nCREATE TABLE [goadmin_menu] (\n [id] int   identity(1,1) ,\n [parent_id] int   NOT NULL DEFAULT 0,\n [type] tinyint   NOT NULL DEFAULT 0,\n [order] int   NOT NULL DEFAULT '0',\n [title] varchar(50)   NOT NULL,\n [icon] varchar(50)   NOT NULL,\n [uri] varchar(3000)   NOT NULL DEFAULT '',\n [header] varchar(150)   DEFAULT NULL,\n [uuid] varchar(150)   DEFAULT NULL,\n [plugin_name] varchar(150)   NOT NULL DEFAULT '',\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n PRIMARY KEY ([id]),\n) \nset  IDENTITY_INSERT [goadmin_menu] ON \nINSERT INTO[goadmin_menu] ([id],[parent_id],[type],[order],[title],[icon],[uri],[header],[created_at],[updated_at])\nVALUES\n\t(1,0,1,2,'Admin','fa-tasks','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,1,1,2,'Users','fa-users','/info/manager',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(3,1,1,3,'Roles','fa-user','/info/roles',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(4,1,1,4,'Permission','fa-ban','/info/permission',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(5,1,1,5,'Menu','fa-bars','/menu',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(6,1,1,6,'Operation log','fa-history','/info/op',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(7,0,1,1,'Dashboard','fa-bar-chart','/',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');\nset  IDENTITY_INSERT [goadmin_menu] OFF \n\n\n\n\nCREATE TABLE[goadmin_operation_log] (\n [id] int   identity(1,1) ,\n [user_id] int   NOT NULL,\n [path] varchar(255)   NOT NULL,\n [method] varchar(10)   NOT NULL,\n [ip] varchar(15)   NOT NULL,\n [input] text   NOT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([id]),\n) \n\n\nCREATE TABLE[goadmin_site] (\n [id] int   identity(1,1) ,\n [key] varchar(100)   NOT NULL,\n [value] text   NOT NULL,\n [state] tinyint   NOT NULL DEFAULT 0,\n [description] varchar(3000)   DEFAULT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([id]),\n)\n\n\nCREATE TABLE[goadmin_permissions] (\n [id] int   identity(1,1) ,\n [name] varchar(50)   NOT NULL,\n [slug] varchar(50)   NOT NULL,\n [http_method] varchar(255)   DEFAULT NULL,\n [http_path] text   NOT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([id]),\n) \n\nset  IDENTITY_INSERT [goadmin_permissions] ON \n\nINSERT INTO[goadmin_permissions] ([id],[name],[slug],[http_method],[http_path],[created_at],[updated_at])\nVALUES\n\t(1,'All permission','*','','*','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'Dashboard','dashboard','GET,PUT,POST,DELETE','/','2019-09-10 00:00:00','2019-09-10 00:00:00');\n\nset  IDENTITY_INSERT [goadmin_permissions] OFF \n\n\n\n\nCREATE TABLE[goadmin_role_menu] (\n [role_id] int   NOT NULL,\n [menu_id] int   NOT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n PRIMARY KEY([role_id],[menu_id])\n) \n\n\n\nINSERT INTO[goadmin_role_menu] ([role_id],[menu_id],[created_at],[updated_at])\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,8,'2019-09-11 10:20:55','2019-09-11 10:20:55'),\n\t(2,8,'2019-09-11 10:20:55','2019-09-11 10:20:55');\n\n\n\n\n\nCREATE TABLE[goadmin_role_permissions] (\n [role_id] int   NOT NULL,\n [permission_id] int   NOT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([role_id],[permission_id])\n) \n\n\nINSERT INTO[goadmin_role_permissions] ([role_id],[permission_id],[created_at],[updated_at])\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,2,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n\n\n\nCREATE TABLE[goadmin_role_users] (\n [role_id] int   NOT NULL,\n [user_id] int   NOT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([role_id],[user_id])\n) \n\n\nINSERT INTO[goadmin_role_users] ([role_id],[user_id],[created_at],[updated_at])\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n\n\n\nCREATE TABLE[goadmin_roles] (\n [id] int   identity(1,1) ,\n [name] varchar(50)   NOT NULL UNIQUE,\n [slug] varchar(50)   NOT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([id]),\n) \n\nset  IDENTITY_INSERT [goadmin_roles] ON \n\nINSERT INTO[goadmin_roles] ([id],[name],[slug],[created_at],[updated_at])\nVALUES\n\t(1,'Administrator','administrator','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'Operator','operator','2019-09-10 00:00:00','2019-09-10 00:00:00');\n\nset  IDENTITY_INSERT [goadmin_roles] OFF\n\n\nCREATE TABLE[goadmin_session] (\n [id] int   identity(1,1) ,\n [sid] varchar(50)   DEFAULT '',\n [values] varchar(3000)   DEFAULT '',\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([id])\n)  \n\n\n\n\nCREATE TABLE[goadmin_user_permissions] (\n [user_id] int   NOT NULL,\n [permission_id] int   NOT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY  ([user_id],[permission_id])\n) \n\n\nINSERT INTO[goadmin_user_permissions] ([user_id],[permission_id],[created_at],[updated_at])\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n\n\n\n\nCREATE TABLE[goadmin_users] (\n [id] int   identity(1,1) ,\n [username] varchar(100)   NOT NULL UNIQUE,\n [password] varchar(100)   NOT NULL DEFAULT '',\n [name] varchar(100)   NOT NULL,\n [avatar] varchar(255)   DEFAULT NULL,\n [remember_token] varchar(100)   DEFAULT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([id]),\n) \n\nset  IDENTITY_INSERT [goadmin_users] ON \n\nINSERT INTO[goadmin_users] ([id],[username],[password],[name],[avatar],[remember_token],[created_at],[updated_at])\nVALUES\n\t(1,'admin','$2a$10$U3F/NSaf2kaVbyXTBp7ppOn0jZFyRqXRnYXB.AMioCjXl3Ciaj4oy','admin','','tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'operator','$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.','Operator','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');\nset  IDENTITY_INSERT [goadmin_users] OFF \n\n\n"
  },
  {
    "path": "data/admin.pgsql",
    "content": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 9.5.14\n-- Dumped by pg_dump version 10.5\n\nSET statement_timeout = 0;\nSET lock_timeout = 0;\nSET idle_in_transaction_session_timeout = 0;\nSET client_encoding = 'UTF8';\nSET standard_conforming_strings = on;\nSELECT pg_catalog.set_config('search_path', '', false);\nSET check_function_bodies = false;\nSET client_min_messages = warning;\nSET row_security = off;\n\n--\n-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: \n--\n\nCREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;\n\n\n--\n-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: \n--\n\nCOMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';\n\n\n--\n-- Name: goadmin_menu_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_menu_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_menu_myid_seq OWNER TO postgres;\n\nSET default_tablespace = '';\n\nSET default_with_oids = false;\n\n--\n-- Name: goadmin_menu; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_menu (\n    id integer DEFAULT nextval('public.goadmin_menu_myid_seq'::regclass) NOT NULL,\n    parent_id integer DEFAULT 0 NOT NULL,\n    type integer DEFAULT 0,\n    \"order\" integer DEFAULT 0 NOT NULL,\n    title character varying(50) NOT NULL,\n    header character varying(100),\n    plugin_name character varying(100) NOT NULL,\n    icon character varying(50) NOT NULL,\n    uri character varying(3000) NOT NULL,\n    uuid character varying(100),\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_menu OWNER TO postgres;\n\n--\n-- Name: goadmin_operation_log_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_operation_log_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_operation_log_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_operation_log; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_operation_log (\n    id integer DEFAULT nextval('public.goadmin_operation_log_myid_seq'::regclass) NOT NULL,\n    user_id integer NOT NULL,\n    path character varying(255) NOT NULL,\n    method character varying(10) NOT NULL,\n    ip character varying(15) NOT NULL,\n    input text NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_operation_log OWNER TO postgres;\n\n--\n-- Name: goadmin_site_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_site_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_site_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_site; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_site (\n    id integer DEFAULT nextval('public.goadmin_site_myid_seq'::regclass) NOT NULL,\n    key character varying(100) NOT NULL,\n    value text NOT NULL,\n    type integer DEFAULT 0,\n    description character varying(3000),\n    state integer DEFAULT 0,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_site OWNER TO postgres;\n\n--\n-- Name: goadmin_permissions_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_permissions_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_permissions_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_permissions; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_permissions (\n    id integer DEFAULT nextval('public.goadmin_permissions_myid_seq'::regclass) NOT NULL,\n    name character varying(50) NOT NULL,\n    slug character varying(50) NOT NULL,\n    http_method character varying(255),\n    http_path text NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_permissions OWNER TO postgres;\n\n--\n-- Name: goadmin_role_menu; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_role_menu (\n    role_id integer NOT NULL,\n    menu_id integer NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_role_menu OWNER TO postgres;\n\n--\n-- Name: goadmin_role_permissions; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_role_permissions (\n    role_id integer NOT NULL,\n    permission_id integer NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_role_permissions OWNER TO postgres;\n\n--\n-- Name: goadmin_role_users; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_role_users (\n    role_id integer NOT NULL,\n    user_id integer NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_role_users OWNER TO postgres;\n\n--\n-- Name: goadmin_roles_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_roles_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_roles_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_roles; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_roles (\n    id integer DEFAULT nextval('public.goadmin_roles_myid_seq'::regclass) NOT NULL,\n    name character varying NOT NULL,\n    slug character varying NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_roles OWNER TO postgres;\n\n--\n-- Name: goadmin_session_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_session_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_session_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_session; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_session (\n    id integer DEFAULT nextval('public.goadmin_session_myid_seq'::regclass) NOT NULL,\n    sid character varying(50) NOT NULL,\n    \"values\" character varying(3000) NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_session OWNER TO postgres;\n\n--\n-- Name: goadmin_user_permissions; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_user_permissions (\n    user_id integer NOT NULL,\n    permission_id integer NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_user_permissions OWNER TO postgres;\n\n--\n-- Name: goadmin_users_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_users_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_users_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_users; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_users (\n    id integer DEFAULT nextval('public.goadmin_users_myid_seq'::regclass) NOT NULL,\n    username character varying(100) NOT NULL,\n    password character varying(100) NOT NULL,\n    name character varying(100) NOT NULL,\n    avatar character varying(255),\n    remember_token character varying(100),\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_users OWNER TO postgres;\n\n--\n-- Data for Name: goadmin_menu; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_menu (id, parent_id, type, \"order\", title, plugin_name, header, icon, uri, created_at, updated_at) FROM stdin;\n1\t0\t1\t2\tAdmin\t\t\\N\tfa-tasks\t\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t1\t1\t2\tUsers\t\t\\N\tfa-users\t/info/manager\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n3\t1\t1\t3\tRoles\t\t\\N\tfa-user\t/info/roles\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n4\t1\t1\t4\tPermission\t\t\\N\tfa-ban\t/info/permission\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n5\t1\t1\t5\tMenu\t\t\\N\tfa-bars\t/menu\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n6\t1\t1\t6\tOperation log\t\t\\N\tfa-history\t/info/op\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n7\t0\t1\t1\tDashboard\t\t\\N\tfa-bar-chart\t/\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_operation_log; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_operation_log (id, user_id, path, method, ip, input, created_at, updated_at) FROM stdin;\n\\.\n\n\n--\n-- Data for Name: goadmin_site; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_site (id, key, value, description, state, created_at, updated_at) FROM stdin;\n\\.\n\n\n--\n-- Data for Name: goadmin_permissions; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_permissions (id, name, slug, http_method, http_path, created_at, updated_at) FROM stdin;\n1\tAll permission\t*\t\t*\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\tDashboard\tdashboard\tGET,PUT,POST,DELETE\t/\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_role_menu; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_role_menu (role_id, menu_id, created_at, updated_at) FROM stdin;\n1\t1\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n1\t7\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t7\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_role_permissions; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_role_permissions (role_id, permission_id, created_at, updated_at) FROM stdin;\n1\t1\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n1\t2\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t2\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n\\.\n\n\n--\n-- Data for Name: goadmin_role_users; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_role_users (role_id, user_id, created_at, updated_at) FROM stdin;\n1\t1\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t2\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_roles; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_roles (id, name, slug, created_at, updated_at) FROM stdin;\n1\tAdministrator\tadministrator\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\tOperator\toperator\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_session; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_session (id, sid, \"values\", created_at, updated_at) FROM stdin;\n\\.\n\n\n--\n-- Data for Name: goadmin_user_permissions; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_user_permissions (user_id, permission_id, created_at, updated_at) FROM stdin;\n1\t1\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t2\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n\\.\n\n\n--\n-- Data for Name: goadmin_users; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_users (id, username, password, name, avatar, remember_token, created_at, updated_at) FROM stdin;\n1\tadmin\t$2a$10$OxWYJJGTP2gi00l2x06QuOWqw5VR47MQCJ0vNKnbMYfrutij10Hwe\tadmin\t\ttlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\toperator\t$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.\tOperator\t\t\\N\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Name: goadmin_menu_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_menu_myid_seq', 7, true);\n\n\n--\n-- Name: goadmin_operation_log_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_operation_log_myid_seq', 1, true);\n\n\n--\n-- Name: goadmin_permissions_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_permissions_myid_seq', 2, true);\n\n\n--\n-- Name: goadmin_roles_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_roles_myid_seq', 2, true);\n\n\n--\n-- Name: goadmin_site_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_site_myid_seq', 1, true);\n\n\n--\n-- Name: goadmin_session_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_session_myid_seq', 1, true);\n\n\n--\n-- Name: goadmin_users_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_users_myid_seq', 2, true);\n\n\n--\n-- Name: goadmin_menu goadmin_menu_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_menu\n    ADD CONSTRAINT goadmin_menu_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_operation_log goadmin_operation_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_operation_log\n    ADD CONSTRAINT goadmin_operation_log_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_permissions goadmin_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_permissions\n    ADD CONSTRAINT goadmin_permissions_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_roles goadmin_roles_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_roles\n    ADD CONSTRAINT goadmin_roles_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_site goadmin_site_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_site\n    ADD CONSTRAINT goadmin_site_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_session goadmin_session_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_session\n    ADD CONSTRAINT goadmin_session_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_users goadmin_users_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_users\n    ADD CONSTRAINT goadmin_users_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: postgres\n--\n\nREVOKE ALL ON SCHEMA public FROM PUBLIC;\nREVOKE ALL ON SCHEMA public FROM postgres;\nGRANT ALL ON SCHEMA public TO postgres;\nGRANT ALL ON SCHEMA public TO PUBLIC;\n\n\n--\n-- PostgreSQL database dump complete\n--\n\n"
  },
  {
    "path": "data/admin.sql",
    "content": "# ************************************************************\n# Sequel Pro SQL dump\n# Version 4468\n#\n# http://www.sequelpro.com/\n# https://github.com/sequelpro/sequelpro\n#\n# Host: 127.0.0.1 (MySQL 5.7.19)\n# Database: godmin\n# Generation Time: 2019-09-12 04:16:47 +0000\n# ************************************************************\n\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n/*!40101 SET NAMES utf8 */;\n/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n\n\n# Dump of table goadmin_menu\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_menu`;\n\nCREATE TABLE `goadmin_menu` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `parent_id` int(11) unsigned NOT NULL DEFAULT '0',\n  `type` tinyint(4) unsigned NOT NULL DEFAULT '0',\n  `order` int(11) unsigned NOT NULL DEFAULT '0',\n  `title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `icon` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `uri` varchar(3000) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `header` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `plugin_name` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `uuid` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_menu` WRITE;\n/*!40000 ALTER TABLE `goadmin_menu` DISABLE KEYS */;\n\nINSERT INTO `goadmin_menu` (`id`, `parent_id`, `type`, `order`, `title`, `icon`, `uri`, `plugin_name`, `header`, `created_at`, `updated_at`)\nVALUES\n\t(1,0,1,2,'Admin','fa-tasks','','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,1,1,2,'Users','fa-users','/info/manager','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(3,1,1,3,'Roles','fa-user','/info/roles','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(4,1,1,4,'Permission','fa-ban','/info/permission','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(5,1,1,5,'Menu','fa-bars','/menu','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(6,1,1,6,'Operation log','fa-history','/info/op','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(7,0,1,1,'Dashboard','fa-bar-chart','/','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_menu` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_operation_log\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_operation_log`;\n\nCREATE TABLE `goadmin_operation_log` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `user_id` int(11) unsigned NOT NULL,\n  `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `method` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `ip` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `input` text COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  KEY `admin_operation_log_user_id_index` (`user_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n\n# Dump of table goadmin_site\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_site`;\n\nCREATE TABLE `goadmin_site` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `key` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `value` longtext COLLATE utf8mb4_unicode_ci,\n  `description` varchar(3000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `state` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n\n# Dump of table goadmin_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_permissions`;\n\nCREATE TABLE `goadmin_permissions` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `http_method` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `http_path` text COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_permissions_name_unique` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_permissions` (`id`, `name`, `slug`, `http_method`, `http_path`, `created_at`, `updated_at`)\nVALUES\n\t(1,'All permission','*','','*','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'Dashboard','dashboard','GET,PUT,POST,DELETE','/','2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_role_menu\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_menu`;\n\nCREATE TABLE `goadmin_role_menu` (\n  `role_id` int(11) unsigned NOT NULL,\n  `menu_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  KEY `admin_role_menu_role_id_menu_id_index` (`role_id`,`menu_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_menu` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_menu` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_menu` (`role_id`, `menu_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,8,'2019-09-11 10:20:55','2019-09-11 10:20:55'),\n\t(2,8,'2019-09-11 10:20:55','2019-09-11 10:20:55');\n\n/*!40000 ALTER TABLE `goadmin_role_menu` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_role_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_permissions`;\n\nCREATE TABLE `goadmin_role_permissions` (\n  `role_id` int(11) unsigned NOT NULL,\n  `permission_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_role_permissions` (`role_id`,`permission_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_permissions` (`role_id`, `permission_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,2,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_role_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_role_users\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_users`;\n\nCREATE TABLE `goadmin_role_users` (\n  `role_id` int(11) unsigned NOT NULL,\n  `user_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_user_roles` (`role_id`,`user_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_users` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_users` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_users` (`role_id`, `user_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_role_users` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_roles\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_roles`;\n\nCREATE TABLE `goadmin_roles` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_roles_name_unique` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_roles` WRITE;\n/*!40000 ALTER TABLE `goadmin_roles` DISABLE KEYS */;\n\nINSERT INTO `goadmin_roles` (`id`, `name`, `slug`, `created_at`, `updated_at`)\nVALUES\n\t(1,'Administrator','administrator','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'Operator','operator','2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_roles` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_session\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_session`;\n\nCREATE TABLE `goadmin_session` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `sid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `values` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n\n\n# Dump of table goadmin_user_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_user_permissions`;\n\nCREATE TABLE `goadmin_user_permissions` (\n  `user_id` int(11) unsigned NOT NULL,\n  `permission_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_user_permissions` (`user_id`,`permission_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_user_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_user_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_user_permissions` (`user_id`, `permission_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_user_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_users\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_users`;\n\nCREATE TABLE `goadmin_users` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `username` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `password` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_users_username_unique` (`username`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_users` WRITE;\n/*!40000 ALTER TABLE `goadmin_users` DISABLE KEYS */;\n\nINSERT INTO `goadmin_users` (`id`, `username`, `password`, `name`, `avatar`, `remember_token`, `created_at`, `updated_at`)\nVALUES\n\t(1,'admin','$2a$10$U3F/NSaf2kaVbyXTBp7ppOn0jZFyRqXRnYXB.AMioCjXl3Ciaj4oy','admin','','tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'operator','$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.','Operator','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_users` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n\n/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n"
  },
  {
    "path": "data/migrations/admin_2020_04_14_100427_ms.sql",
    "content": "CREATE TABLE[goadmin_site] (\n [id] int   identity(1,1) ,\n [key] varchar(100)   NOT NULL,\n [value] text   NOT NULL,\n [state] tinyint   NOT NULL DEFAULT 0,\n [description] varchar(3000)   NOT NULL,\n [created_at] datetime NULL DEFAULT GETDATE(),\n [updated_at] datetime NULL DEFAULT GETDATE(),\n  PRIMARY KEY ([id]),\n)\n"
  },
  {
    "path": "data/migrations/admin_2020_04_14_100427_mysql.sql",
    "content": "CREATE TABLE `goadmin_site` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `key` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `value` longtext COLLATE utf8mb4_unicode_ci,\n  `description` varchar(3000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `state` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"
  },
  {
    "path": "data/migrations/admin_2020_04_14_100427_postgres.sql",
    "content": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 9.5.14\n-- Dumped by pg_dump version 10.5\n\nSET statement_timeout = 0;\nSET lock_timeout = 0;\nSET idle_in_transaction_session_timeout = 0;\nSET client_encoding = 'EUC_CN';\nSET standard_conforming_strings = on;\nSELECT pg_catalog.set_config('search_path', '', false);\nSET check_function_bodies = false;\nSET client_min_messages = warning;\nSET row_security = off;\n\nSET default_tablespace = '';\n\nSET default_with_oids = false;\n\n--\n-- Name: goadmin_site_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_site_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\nALTER TABLE public.goadmin_site_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_site; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_site (\n    id integer DEFAULT nextval('public.goadmin_site_myid_seq'::regclass) NOT NULL,\n    key character varying(100) NOT NULL,\n    value text NOT NULL,\n    type integer DEFAULT 0,\n    description character varying(3000),\n    state integer DEFAULT 0,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_site OWNER TO postgres;\n\n--\n-- Data for Name: goadmin_site; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_site (id, key, value, type, description, state, created_at, updated_at) FROM stdin;\n\\.\n\n\n--\n-- Name: goadmin_site goadmin_site_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_site\n    ADD CONSTRAINT goadmin_site_pkey PRIMARY KEY (id);\n\n\n--\n-- PostgreSQL database dump complete\n--\n\n"
  },
  {
    "path": "data/migrations/admin_2020_04_14_100427_sqlite.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"goadmin_site\" (\n`id` integer PRIMARY KEY autoincrement,\n`key` CHAR(100) COLLATE NOCASE NOT NULL,\n`value` text COLLATE NOCASE NOT NULL,\n`state` INT NOT NULL DEFAULT '0',\n`description` CHAR(3000) COLLATE NOCASE,\n`created_at` TIMESTAMP default CURRENT_TIMESTAMP,\n`updated_at` TIMESTAMP default CURRENT_TIMESTAMP\n);"
  },
  {
    "path": "data/migrations/admin_2020_08_04_092427_ms.sql",
    "content": "ALTER TABLE goadmin_menu\nADD plugin_name varchar(150) NOT NULL DEFAULT '',\nADD uuid varchar(150) NOT NULL DEFAULT '';"
  },
  {
    "path": "data/migrations/admin_2020_08_04_092427_mysql.sql",
    "content": "ALTER TABLE goadmin_menu\nADD COLUMN `uuid` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\nADD COLUMN `plugin_name` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';"
  },
  {
    "path": "data/migrations/admin_2020_08_04_092427_postgres.sql",
    "content": "ALTER TABLE goadmin_menu\nADD COLUMN plugin_name character varying(150) NOT NULL DEFAULT '',\nADD COLUMN uuid character varying(150) NOT NULL DEFAULT '';"
  },
  {
    "path": "data/migrations/admin_2020_08_04_092427_sqlite.sql",
    "content": "ALTER TABLE goadmin_menu\nADD COLUMN `uuid` varchar(150) NOT NULL DEFAULT '',\nADD COLUMN `plugin_name` varchar(150) NOT NULL DEFAULT '';"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: \"3.3\"\nservices:\n  mysql:\n    image: mysql:5.6\n    container_name: mysql\n    ports:\n      - \"3306:3306\"\n    volumes:\n      - mysql:/data\n    networks:\n      - goadmin\n    environment:\n      - MYSQL_ROOT_PASSWORD=goadmin\n  postgres:\n    image: postgres:latest\n    container_name: postgres\n    ports:\n      - \"5432:5432\"\n    volumes:\n      - postgres:/data\n    networks:\n      - goadmin\n    environment:\n      - POSTGRES_PASSWORD=goadmin\n  goadmin:\n    image: josingcjx/goadmin:1.1\n    tty: true\n    container_name: goadmin\n    volumes:\n      - .:/home/goadmin\n    networks:\n      - goadmin\n    command:\n      - /bin/bash\n  portainer:\n    image: portainer/portainer:latest\n    container_name: portainer\n    restart: always\n    ports:\n      - \"9000:9000\"\n    networks:\n      - goadmin\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - portainer:/data\nnetworks:\n  goadmin: {}\nvolumes:\n  portainer: {}\n  postgres: {}\n  mysql: {}\n"
  },
  {
    "path": "engine/engine.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage engine\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\terrors2 \"errors\"\n\t\"fmt\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\t\"runtime/debug\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapter\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/modules/system\"\n\t\"github.com/GoAdminGroup/go-admin/modules/ui\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// Engine is the core component of goAdmin. It has two attributes.\n// PluginList is an array of plugin. Adapter is the adapter of\n// web framework context and goAdmin context. The relationship of adapter and\n// plugin is that the adapter use the plugin which contains routers and\n// controller methods to inject into the framework entity and make it work.\ntype Engine struct {\n\tPluginList   plugins.Plugins\n\tAdapter      adapter.WebFrameWork\n\tServices     service.List\n\tNavButtons   *types.Buttons\n\tconfig       *config.Config\n\tannounceLock sync.Once\n}\n\n// Default return the default engine instance.\nfunc Default() *Engine {\n\tengine = &Engine{\n\t\tAdapter:    defaultAdapter,\n\t\tServices:   service.GetServices(),\n\t\tNavButtons: new(types.Buttons),\n\t}\n\treturn engine\n}\n\n// Use enable the adapter.\nfunc (eng *Engine) Use(router interface{}) error {\n\tif eng.Adapter == nil {\n\t\temptyAdapterPanic()\n\t}\n\n\teng.Services.Add(auth.InitCSRFTokenSrv(eng.DefaultConnection()))\n\teng.initSiteSetting()\n\teng.initJumpNavButtons()\n\teng.initPlugins()\n\n\tprintInitMsg(language.Get(\"initialize success\"))\n\n\treturn eng.Adapter.Use(router, eng.PluginList)\n}\n\n// AddPlugins add the plugins\nfunc (eng *Engine) AddPlugins(plugs ...plugins.Plugin) *Engine {\n\n\tif len(plugs) == 0 {\n\t\treturn eng\n\t}\n\n\tfor _, plug := range plugs {\n\t\teng.PluginList = eng.PluginList.Add(plug)\n\t}\n\n\treturn eng\n}\n\n// AddPluginList add the plugins\nfunc (eng *Engine) AddPluginList(plugs plugins.Plugins) *Engine {\n\n\tif len(plugs) == 0 {\n\t\treturn eng\n\t}\n\n\tfor _, plug := range plugs {\n\t\teng.PluginList = eng.PluginList.Add(plug)\n\t}\n\n\treturn eng\n}\n\n// FindPluginByName find the register plugin by given name.\nfunc (eng *Engine) FindPluginByName(name string) (plugins.Plugin, bool) {\n\tfor _, plug := range eng.PluginList {\n\t\tif plug.Name() == name {\n\t\t\treturn plug, true\n\t\t}\n\t}\n\treturn nil, false\n}\n\n// AddAuthService customize the auth logic with given callback function.\nfunc (eng *Engine) AddAuthService(processor auth.Processor) *Engine {\n\teng.Services.Add(\"auth\", auth.NewService(processor))\n\treturn eng\n}\n\n// ============================\n// Config APIs\n// ============================\n\nfunc (eng *Engine) announce() *Engine {\n\tif eng.config.Debug {\n\t\teng.announceLock.Do(func() {\n\t\t\tfmt.Printf(language.Get(\"goadmin is now running. \\nrunning in \\\"debug\\\" mode. switch to \\\"release\\\" mode in production.\\n\\n\"))\n\t\t})\n\t}\n\treturn eng\n}\n\n// AddConfig set the global config.\nfunc (eng *Engine) AddConfig(cfg *config.Config) *Engine {\n\treturn eng.setConfig(cfg).announce().initDatabase()\n}\n\n// setConfig set the config of engine.\nfunc (eng *Engine) setConfig(cfg *config.Config) *Engine {\n\teng.config = config.Initialize(cfg)\n\tsysCheck, themeCheck := template.CheckRequirements()\n\tif !sysCheck {\n\t\tlogger.Panicf(language.Get(\"wrong goadmin version, theme %s required goadmin version are %s\"),\n\t\t\teng.config.Theme, strings.Join(template.Default().GetRequirements(), \",\"))\n\t}\n\tif !themeCheck {\n\t\tlogger.Panicf(language.Get(\"wrong theme version, goadmin %s required version of theme %s is %s\"),\n\t\t\tsystem.Version(), eng.config.Theme, strings.Join(system.RequireThemeVersion()[eng.config.Theme], \",\"))\n\t}\n\treturn eng\n}\n\n// AddConfigFromJSON set the global config from json file.\nfunc (eng *Engine) AddConfigFromJSON(path string) *Engine {\n\tcfg := config.ReadFromJson(path)\n\treturn eng.setConfig(&cfg).announce().initDatabase()\n}\n\n// AddConfigFromYAML set the global config from yaml file.\nfunc (eng *Engine) AddConfigFromYAML(path string) *Engine {\n\tcfg := config.ReadFromYaml(path)\n\treturn eng.setConfig(&cfg).announce().initDatabase()\n}\n\n// AddConfigFromINI set the global config from ini file.\nfunc (eng *Engine) AddConfigFromINI(path string) *Engine {\n\tcfg := config.ReadFromINI(path)\n\treturn eng.setConfig(&cfg).announce().initDatabase()\n}\n\n// InitDatabase initialize all database connection.\nfunc (eng *Engine) initDatabase() *Engine {\n\tprintInitMsg(language.Get(\"initialize database connections\"))\n\tfor driver, databaseCfg := range eng.config.Databases.GroupByDriver() {\n\t\teng.Services.Add(driver, db.GetConnectionByDriver(driver).InitDB(databaseCfg))\n\t}\n\tif defaultAdapter == nil {\n\t\temptyAdapterPanic()\n\t}\n\tdefaultConnection := db.GetConnection(eng.Services)\n\tdefaultAdapter.SetConnection(defaultConnection)\n\teng.Adapter.SetConnection(defaultConnection)\n\treturn eng\n}\n\n// AddAdapter add the adapter of engine.\nfunc (eng *Engine) AddAdapter(ada adapter.WebFrameWork) *Engine {\n\teng.Adapter = ada\n\tdefaultAdapter = ada\n\treturn eng\n}\n\n// defaultAdapter is the default adapter of engine.\nvar defaultAdapter adapter.WebFrameWork\n\nvar engine *Engine\n\n// navButtons is the default buttons in the navigation bar.\nvar navButtons = new(types.Buttons)\n\nfunc emptyAdapterPanic() {\n\tlogger.Panic(language.Get(\"adapter is nil, import the default adapter or use addadapter method add the adapter\"))\n}\n\n// Register set default adapter of engine.\nfunc Register(ada adapter.WebFrameWork) {\n\tif ada == nil {\n\t\temptyAdapterPanic()\n\t}\n\tdefaultAdapter = ada\n}\n\n// User call the User method of defaultAdapter.\nfunc User(ctx interface{}) (models.UserModel, bool) {\n\treturn defaultAdapter.User(ctx)\n}\n\n// User call the User method of engine adapter.\nfunc (eng *Engine) User(ctx interface{}) (models.UserModel, bool) {\n\treturn eng.Adapter.User(ctx)\n}\n\n// ============================\n// DB Connection APIs\n// ============================\n\n// DB return the db connection of given driver.\nfunc (eng *Engine) DB(driver string) db.Connection {\n\treturn db.GetConnectionFromService(eng.Services.Get(driver))\n}\n\n// DefaultConnection return the default db connection.\nfunc (eng *Engine) DefaultConnection() db.Connection {\n\treturn eng.DB(eng.config.Databases.GetDefault().Driver)\n}\n\n// MysqlConnection return the mysql db connection of given driver.\nfunc (eng *Engine) MysqlConnection() db.Connection {\n\treturn db.GetConnectionFromService(eng.Services.Get(db.DriverMysql))\n}\n\n// MssqlConnection return the mssql db connection of given driver.\nfunc (eng *Engine) MssqlConnection() db.Connection {\n\treturn db.GetConnectionFromService(eng.Services.Get(db.DriverMssql))\n}\n\n// PostgresqlConnection return the postgresql db connection of given driver.\nfunc (eng *Engine) PostgresqlConnection() db.Connection {\n\treturn db.GetConnectionFromService(eng.Services.Get(db.DriverPostgresql))\n}\n\n// SqliteConnection return the sqlite db connection of given driver.\nfunc (eng *Engine) SqliteConnection() db.Connection {\n\treturn db.GetConnectionFromService(eng.Services.Get(db.DriverSqlite))\n}\n\n// OceanBaseConnection return the OceanBase db connection of given driver.\nfunc (eng *Engine) OceanBaseConnection() db.Connection {\n\treturn db.GetConnectionFromService(eng.Services.Get(db.DriverOceanBase))\n}\n\ntype ConnectionSetter func(db.Connection)\n\n// ResolveConnection resolve the specified driver connection.\nfunc (eng *Engine) ResolveConnection(setter ConnectionSetter, driver string) *Engine {\n\tsetter(eng.DB(driver))\n\treturn eng\n}\n\n// ResolveMysqlConnection resolve the mysql connection.\nfunc (eng *Engine) ResolveMysqlConnection(setter ConnectionSetter) *Engine {\n\teng.ResolveConnection(setter, db.DriverMysql)\n\treturn eng\n}\n\n// ResolveMssqlConnection resolve the mssql connection.\nfunc (eng *Engine) ResolveMssqlConnection(setter ConnectionSetter) *Engine {\n\teng.ResolveConnection(setter, db.DriverMssql)\n\treturn eng\n}\n\n// ResolveSqliteConnection resolve the sqlite connection.\nfunc (eng *Engine) ResolveSqliteConnection(setter ConnectionSetter) *Engine {\n\teng.ResolveConnection(setter, db.DriverSqlite)\n\treturn eng\n}\n\n// ResolvePostgresqlConnection resolve the postgres connection.\nfunc (eng *Engine) ResolvePostgresqlConnection(setter ConnectionSetter) *Engine {\n\teng.ResolveConnection(setter, db.DriverPostgresql)\n\treturn eng\n}\n\ntype Setter func(*Engine)\n\n// Clone copy a new Engine.\nfunc (eng *Engine) Clone(e *Engine) *Engine {\n\te = eng\n\treturn eng\n}\n\n// ClonedBySetter copy a new Engine by a setter callback function.\nfunc (eng *Engine) ClonedBySetter(setter Setter) *Engine {\n\tsetter(eng)\n\treturn eng\n}\n\nfunc (eng *Engine) deferHandler(conn db.Connection) context.Handler {\n\treturn func(ctx *context.Context) {\n\t\tdefer func(ctx *context.Context) {\n\t\t\tif user, ok := ctx.UserValue[\"user\"].(models.UserModel); ok {\n\t\t\t\tvar input []byte\n\t\t\t\tform := ctx.Request.MultipartForm\n\t\t\t\tif form != nil {\n\t\t\t\t\tinput, _ = json.Marshal((*form).Value)\n\t\t\t\t}\n\n\t\t\t\tmodels.OperationLog().SetConn(conn).New(user.Id, ctx.Path(), ctx.Method(), ctx.LocalIP(), string(input))\n\t\t\t}\n\n\t\t\tif err := recover(); err != nil {\n\t\t\t\tlogger.Error(err)\n\t\t\t\tlogger.Error(string(debug.Stack()))\n\n\t\t\t\tvar (\n\t\t\t\t\terrMsg string\n\t\t\t\t\tok     bool\n\t\t\t\t\te      error\n\t\t\t\t)\n\n\t\t\t\tif errMsg, ok = err.(string); !ok {\n\t\t\t\t\tif e, ok = err.(error); ok {\n\t\t\t\t\t\terrMsg = e.Error()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif errMsg == \"\" {\n\t\t\t\t\terrMsg = \"system error\"\n\t\t\t\t}\n\n\t\t\t\tif ctx.WantJSON() {\n\t\t\t\t\tresponse.Error(ctx, errMsg)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\teng.errorPanelHTML(ctx, new(bytes.Buffer), errors2.New(errMsg))\n\t\t\t}\n\t\t}(ctx)\n\t\tctx.Next()\n\t}\n}\n\n// wrapWithAuthMiddleware wrap a auth middleware to the given handler.\nfunc (eng *Engine) wrapWithAuthMiddleware(handler context.Handler) context.Handlers {\n\tconn := db.GetConnection(eng.Services)\n\treturn []context.Handler{eng.deferHandler(conn), response.OffLineHandler, auth.Middleware(conn), handler}\n}\n\n// wrapWithAuthMiddleware wrap a auth middleware to the given handler.\nfunc (eng *Engine) wrap(handler context.Handler) context.Handlers {\n\tconn := db.GetConnection(eng.Services)\n\treturn []context.Handler{eng.deferHandler(conn), response.OffLineHandler, handler}\n}\n\n// ============================\n// Initialize methods\n// ============================\n\n// AddNavButtons add the nav buttons.\nfunc (eng *Engine) AddNavButtons(title template2.HTML, icon string, action types.Action) *Engine {\n\tbtn := types.GetNavButton(title, icon, action)\n\t*eng.NavButtons = append(*eng.NavButtons, btn)\n\treturn eng\n}\n\n// AddNavButtonsRaw add the nav buttons.\nfunc (eng *Engine) AddNavButtonsRaw(btns ...types.Button) *Engine {\n\t*eng.NavButtons = append(*eng.NavButtons, btns...)\n\treturn eng\n}\n\ntype navJumpButtonParam struct {\n\tExist      bool\n\tIcon       string\n\tBtnName    string\n\tURL        string\n\tTitle      string\n\tTitleScore string\n}\n\nfunc (eng *Engine) addJumpNavButton(param navJumpButtonParam) *Engine {\n\tif param.Exist {\n\t\t*eng.NavButtons = (*eng.NavButtons).AddNavButton(param.Icon, param.BtnName,\n\t\t\taction.JumpInNewTab(config.Url(param.URL),\n\t\t\t\tlanguage.GetWithScope(param.Title, param.TitleScore)))\n\t}\n\treturn eng\n}\n\nfunc printInitMsg(msg string) {\n\tlogger.Info(msg)\n}\n\nfunc (eng *Engine) initJumpNavButtons() {\n\tprintInitMsg(language.Get(\"initialize navigation buttons\"))\n\tfor _, param := range eng.initNavJumpButtonParams() {\n\t\teng.addJumpNavButton(param)\n\t}\n\tnavButtons = eng.NavButtons\n\teng.Services.Add(ui.ServiceKey, ui.NewService(eng.NavButtons))\n}\n\nfunc (eng *Engine) initPlugins() {\n\n\tprintInitMsg(language.Get(\"initialize plugins\"))\n\n\teng.AddPlugins(admin.NewAdmin()).AddPluginList(plugins.Get())\n\n\tvar plugGenerators = make(table.GeneratorList)\n\n\tfor i := range eng.PluginList {\n\t\tif eng.PluginList[i].Name() != \"admin\" {\n\t\t\tprintInitMsg(\"--> \" + eng.PluginList[i].Name())\n\t\t\teng.PluginList[i].InitPlugin(eng.Services)\n\t\t\tif !eng.PluginList[i].GetInfo().SkipInstallation {\n\t\t\t\teng.AddGenerator(\"plugin_\"+eng.PluginList[i].Name(), eng.PluginList[i].GetSettingPage())\n\t\t\t}\n\t\t\tplugGenerators = plugGenerators.Combine(eng.PluginList[i].GetGenerators())\n\t\t}\n\t}\n\tadm := eng.AdminPlugin().AddGenerators(plugGenerators)\n\tadm.InitPlugin(eng.Services)\n\tplugins.Add(adm)\n}\n\nfunc (eng *Engine) initNavJumpButtonParams() []navJumpButtonParam {\n\treturn []navJumpButtonParam{\n\t\t{\n\t\t\tExist:      !eng.config.HideConfigCenterEntrance,\n\t\t\tIcon:       icon.Gear,\n\t\t\tBtnName:    types.NavBtnSiteName,\n\t\t\tURL:        \"/info/site/edit\",\n\t\t\tTitle:      \"site setting\",\n\t\t\tTitleScore: \"config\",\n\t\t}, {\n\t\t\tExist:      !eng.config.HideToolEntrance && eng.config.IsNotProductionEnvironment(),\n\t\t\tIcon:       icon.Wrench,\n\t\t\tBtnName:    types.NavBtnToolName,\n\t\t\tURL:        \"/info/generate/new\",\n\t\t\tTitle:      \"code generate tool\",\n\t\t\tTitleScore: \"tool\",\n\t\t}, {\n\t\t\tExist:      !eng.config.HideAppInfoEntrance,\n\t\t\tIcon:       icon.Info,\n\t\t\tBtnName:    types.NavBtnInfoName,\n\t\t\tURL:        \"/application/info\",\n\t\t\tTitle:      \"site info\",\n\t\t\tTitleScore: \"system\",\n\t\t}, {\n\t\t\tExist:      !eng.config.HidePluginEntrance,\n\t\t\tIcon:       icon.Th,\n\t\t\tBtnName:    types.NavBtnPlugName,\n\t\t\tURL:        \"/plugins\",\n\t\t\tTitle:      \"plugins\",\n\t\t\tTitleScore: \"plugin\",\n\t\t},\n\t}\n}\n\nfunc (eng *Engine) initSiteSetting() {\n\n\tprintInitMsg(language.Get(\"initialize configuration\"))\n\n\terr := eng.config.Update(models.Site().\n\t\tSetConn(eng.DefaultConnection()).\n\t\tInit(eng.config.ToMap()).\n\t\tAllToMap())\n\tif err != nil {\n\t\tlogger.Panic(err)\n\t}\n\teng.Services.Add(\"config\", config.SrvWithConfig(eng.config))\n\n\terrors.Init()\n}\n\n// ============================\n// HTML Content Render APIs\n// ============================\n\n// Content call the Content method of engine adapter.\n// If adapter is nil, it will panic.\nfunc (eng *Engine) Content(ctx interface{}, panel types.GetPanelFn) {\n\tif eng.Adapter == nil {\n\t\temptyAdapterPanic()\n\t}\n\teng.Adapter.Content(ctx, panel, eng.AdminPlugin().GetAddOperationFn(), *eng.NavButtons...)\n}\n\n// Content call the Content method of defaultAdapter.\n// If defaultAdapter is nil, it will panic.\nfunc Content(ctx interface{}, panel types.GetPanelFn) {\n\tif defaultAdapter == nil {\n\t\temptyAdapterPanic()\n\t}\n\tdefaultAdapter.Content(ctx, panel, engine.AdminPlugin().GetAddOperationFn(), *navButtons...)\n}\n\n// Data inject the route and corresponding handler to the web framework.\nfunc (eng *Engine) Data(method, url string, handler context.Handler, noAuth ...bool) {\n\tif len(noAuth) > 0 && noAuth[0] {\n\t\teng.Adapter.AddHandler(method, url, eng.wrap(handler))\n\t} else {\n\t\teng.Adapter.AddHandler(method, url, eng.wrapWithAuthMiddleware(handler))\n\t}\n}\n\n// HTML inject the route and corresponding handler wrapped by the given function to the web framework.\nfunc (eng *Engine) HTML(method, url string, fn types.GetPanelInfoFn, noAuth ...bool) {\n\n\tvar handler = func(ctx *context.Context) {\n\t\tpanel, err := fn(ctx)\n\t\tif err != nil {\n\t\t\tpanel = template.WarningPanel(ctx, err.Error())\n\t\t}\n\n\t\teng.AdminPlugin().GetAddOperationFn()(panel.Callbacks...)\n\n\t\tvar (\n\t\t\ttmpl, tmplName = template.Default(ctx).GetTemplate(ctx.IsPjax())\n\n\t\t\tuser = auth.Auth(ctx)\n\t\t\tbuf  = new(bytes.Buffer)\n\t\t)\n\n\t\thasError := tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{\n\t\t\tUser:         user,\n\t\t\tMenu:         menu.GetGlobalMenu(user, eng.Adapter.GetConnection(), ctx.Lang()).SetActiveClass(config.URLRemovePrefix(ctx.Path())),\n\t\t\tPanel:        panel.GetContent(eng.config.IsProductionEnvironment()),\n\t\t\tAssets:       template.GetComponentAssetImportHTML(ctx),\n\t\t\tButtons:      eng.NavButtons.CheckPermission(user),\n\t\t\tTmplHeadHTML: template.Default(ctx).GetHeadHTML(),\n\t\t\tTmplFootJS:   template.Default(ctx).GetFootJS(),\n\t\t\tIframe:       ctx.IsIframe(),\n\t\t}))\n\n\t\tif hasError != nil {\n\t\t\tlogger.Error(fmt.Sprintf(\"error: %s adapter content, \", eng.Adapter.Name()), hasError)\n\t\t}\n\n\t\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n\t}\n\n\tif len(noAuth) > 0 && noAuth[0] {\n\t\teng.Adapter.AddHandler(method, url, eng.wrap(handler))\n\t} else {\n\t\teng.Adapter.AddHandler(method, url, eng.wrapWithAuthMiddleware(handler))\n\t}\n}\n\n// HTMLFile inject the route and corresponding handler which returns the panel content of given html file path\n// to the web framework.\nfunc (eng *Engine) HTMLFile(method, url, path string, data map[string]interface{}, noAuth ...bool) {\n\n\tvar handler = func(ctx *context.Context) {\n\n\t\tcbuf := new(bytes.Buffer)\n\n\t\tt, err := template2.ParseFiles(path)\n\t\tif err != nil {\n\t\t\teng.errorPanelHTML(ctx, cbuf, err)\n\t\t\treturn\n\t\t} else if err := t.Execute(cbuf, data); err != nil {\n\t\t\teng.errorPanelHTML(ctx, cbuf, err)\n\t\t\treturn\n\t\t}\n\n\t\tvar (\n\t\t\ttmpl, tmplName = template.Default(ctx).GetTemplate(ctx.IsPjax())\n\n\t\t\tuser = auth.Auth(ctx)\n\t\t\tbuf  = new(bytes.Buffer)\n\t\t)\n\n\t\thasError := tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{\n\t\t\tUser: user,\n\t\t\tMenu: menu.GetGlobalMenu(user, eng.Adapter.GetConnection(), ctx.Lang()).SetActiveClass(eng.config.URLRemovePrefix(ctx.Path())),\n\t\t\tPanel: types.Panel{\n\t\t\t\tContent: template.HTML(cbuf.String()),\n\t\t\t},\n\t\t\tAssets:       template.GetComponentAssetImportHTML(ctx),\n\t\t\tButtons:      eng.NavButtons.CheckPermission(user),\n\t\t\tTmplHeadHTML: template.Default(ctx).GetHeadHTML(),\n\t\t\tTmplFootJS:   template.Default(ctx).GetFootJS(),\n\t\t\tIframe:       ctx.IsIframe(),\n\t\t}))\n\n\t\tif hasError != nil {\n\t\t\tlogger.Error(fmt.Sprintf(\"error: %s adapter content, \", eng.Adapter.Name()), hasError)\n\t\t}\n\n\t\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n\t}\n\n\tif len(noAuth) > 0 && noAuth[0] {\n\t\teng.Adapter.AddHandler(method, url, eng.wrap(handler))\n\t} else {\n\t\teng.Adapter.AddHandler(method, url, eng.wrapWithAuthMiddleware(handler))\n\t}\n}\n\n// HTMLFiles inject the route and corresponding handler which returns the panel content of given html files path\n// to the web framework.\nfunc (eng *Engine) HTMLFiles(method, url string, data map[string]interface{}, files ...string) {\n\teng.Adapter.AddHandler(method, url, eng.wrapWithAuthMiddleware(eng.htmlFilesHandler(data, files...)))\n}\n\n// HTMLFilesNoAuth inject the route and corresponding handler which returns the panel content of given html files path\n// to the web framework without auth check.\nfunc (eng *Engine) HTMLFilesNoAuth(method, url string, data map[string]interface{}, files ...string) {\n\teng.Adapter.AddHandler(method, url, eng.wrap(eng.htmlFilesHandler(data, files...)))\n}\n\n// HTMLFiles inject the route and corresponding handler which returns the panel content of given html files path\n// to the web framework.\nfunc (eng *Engine) htmlFilesHandler(data map[string]interface{}, files ...string) context.Handler {\n\treturn func(ctx *context.Context) {\n\n\t\tcbuf := new(bytes.Buffer)\n\n\t\tt, err := template2.ParseFiles(files...)\n\t\tif err != nil {\n\t\t\teng.errorPanelHTML(ctx, cbuf, err)\n\t\t\treturn\n\t\t} else if err := t.Execute(cbuf, data); err != nil {\n\t\t\teng.errorPanelHTML(ctx, cbuf, err)\n\t\t\treturn\n\t\t}\n\n\t\tvar (\n\t\t\ttmpl, tmplName = template.Default(ctx).GetTemplate(ctx.IsPjax())\n\n\t\t\tuser = auth.Auth(ctx)\n\t\t\tbuf  = new(bytes.Buffer)\n\t\t)\n\n\t\thasError := tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{\n\t\t\tUser: user,\n\t\t\tMenu: menu.GetGlobalMenu(user, eng.Adapter.GetConnection(), ctx.Lang()).SetActiveClass(eng.config.URLRemovePrefix(ctx.Path())),\n\t\t\tPanel: types.Panel{\n\t\t\t\tContent: template.HTML(cbuf.String()),\n\t\t\t},\n\t\t\tAssets:       template.GetComponentAssetImportHTML(ctx),\n\t\t\tButtons:      eng.NavButtons.CheckPermission(user),\n\t\t\tTmplHeadHTML: template.Default(ctx).GetHeadHTML(),\n\t\t\tTmplFootJS:   template.Default(ctx).GetFootJS(),\n\t\t\tIframe:       ctx.IsIframe(),\n\t\t}))\n\n\t\tif hasError != nil {\n\t\t\tlogger.Error(fmt.Sprintf(\"error: %s adapter content, \", eng.Adapter.Name()), hasError)\n\t\t}\n\n\t\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n\t}\n}\n\n// errorPanelHTML add an error panel html to context response.\nfunc (eng *Engine) errorPanelHTML(ctx *context.Context, buf *bytes.Buffer, err error) {\n\n\tuser := auth.Auth(ctx)\n\ttmpl, tmplName := template.Default(ctx).GetTemplate(ctx.IsPjax())\n\n\thasError := tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{\n\t\tUser:         user,\n\t\tMenu:         menu.GetGlobalMenu(user, eng.Adapter.GetConnection(), ctx.Lang()).SetActiveClass(eng.config.URLRemovePrefix(ctx.Path())),\n\t\tPanel:        template.WarningPanel(ctx, err.Error()).GetContent(eng.config.IsProductionEnvironment()),\n\t\tAssets:       template.GetComponentAssetImportHTML(ctx),\n\t\tButtons:      (*eng.NavButtons).CheckPermission(user),\n\t\tTmplHeadHTML: template.Default(ctx).GetHeadHTML(),\n\t\tTmplFootJS:   template.Default(ctx).GetFootJS(),\n\t\tIframe:       ctx.IsIframe(),\n\t}))\n\n\tif hasError != nil {\n\t\tlogger.Error(fmt.Sprintf(\"error: %s adapter content, \", eng.Adapter.Name()), hasError)\n\t}\n\n\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n}\n\n// ============================\n// Admin Plugin APIs\n// ============================\n\n// AddGenerators add the admin generators.\nfunc (eng *Engine) AddGenerators(list ...table.GeneratorList) *Engine {\n\tplug, exist := eng.FindPluginByName(\"admin\")\n\tif exist {\n\t\tplug.(*admin.Admin).AddGenerators(list...)\n\t\treturn eng\n\t}\n\teng.PluginList = append(eng.PluginList, admin.NewAdmin(list...))\n\treturn eng\n}\n\n// AdminPlugin get the admin plugin. if not exist, create one.\nfunc (eng *Engine) AdminPlugin() *admin.Admin {\n\tplug, exist := eng.FindPluginByName(\"admin\")\n\tif exist {\n\t\treturn plug.(*admin.Admin)\n\t}\n\tadm := admin.NewAdmin()\n\teng.PluginList = append(eng.PluginList, adm)\n\treturn adm\n}\n\n// SetCaptcha set the captcha config.\nfunc (eng *Engine) SetCaptcha(captcha map[string]string) *Engine {\n\teng.AdminPlugin().SetCaptcha(captcha)\n\treturn eng\n}\n\n// SetCaptchaDriver set the captcha config with driver.\nfunc (eng *Engine) SetCaptchaDriver(driver string) *Engine {\n\teng.AdminPlugin().SetCaptcha(map[string]string{\"driver\": driver})\n\treturn eng\n}\n\n// AddGenerator add table model generator.\nfunc (eng *Engine) AddGenerator(key string, g table.Generator) *Engine {\n\teng.AdminPlugin().AddGenerator(key, g)\n\treturn eng\n}\n\n// AddGlobalDisplayProcessFn call types.AddGlobalDisplayProcessFn.\nfunc (eng *Engine) AddGlobalDisplayProcessFn(f types.FieldFilterFn) *Engine {\n\ttypes.AddGlobalDisplayProcessFn(f)\n\treturn eng\n}\n\n// AddDisplayFilterLimit call types.AddDisplayFilterLimit.\nfunc (eng *Engine) AddDisplayFilterLimit(limit int) *Engine {\n\ttypes.AddLimit(limit)\n\treturn eng\n}\n\n// AddDisplayFilterTrimSpace call types.AddDisplayFilterTrimSpace.\nfunc (eng *Engine) AddDisplayFilterTrimSpace() *Engine {\n\ttypes.AddTrimSpace()\n\treturn eng\n}\n\n// AddDisplayFilterSubstr call types.AddDisplayFilterSubstr.\nfunc (eng *Engine) AddDisplayFilterSubstr(start int, end int) *Engine {\n\ttypes.AddSubstr(start, end)\n\treturn eng\n}\n\n// AddDisplayFilterToTitle call types.AddDisplayFilterToTitle.\nfunc (eng *Engine) AddDisplayFilterToTitle() *Engine {\n\ttypes.AddToTitle()\n\treturn eng\n}\n\n// AddDisplayFilterToUpper call types.AddDisplayFilterToUpper.\nfunc (eng *Engine) AddDisplayFilterToUpper() *Engine {\n\ttypes.AddToUpper()\n\treturn eng\n}\n\n// AddDisplayFilterToLower call types.AddDisplayFilterToLower.\nfunc (eng *Engine) AddDisplayFilterToLower() *Engine {\n\ttypes.AddToUpper()\n\treturn eng\n}\n\n// AddDisplayFilterXssFilter call types.AddDisplayFilterXssFilter.\nfunc (eng *Engine) AddDisplayFilterXssFilter() *Engine {\n\ttypes.AddXssFilter()\n\treturn eng\n}\n\n// AddDisplayFilterXssJsFilter call types.AddDisplayFilterXssJsFilter.\nfunc (eng *Engine) AddDisplayFilterXssJsFilter() *Engine {\n\ttypes.AddXssJsFilter()\n\treturn eng\n}\n"
  },
  {
    "path": "examples/beego/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/beego\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\t\"github.com/astaxie/beego\"\n)\n\nfunc main() {\n\tapp := beego.NewApp()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tUrlPrefix:   \"admin\",\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tLanguage:    language.CN,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tbeego.SetStaticPath(\"/uploads\", \"uploads\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\t// you can custom your pages like:\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tbeego.BConfig.Listen.HTTPAddr = \"127.0.0.1\"\n\tbeego.BConfig.Listen.HTTPPort = 9087\n\tgo app.Run()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/beego2/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/beego2\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\t\"github.com/beego/beego/v2/server/web\"\n)\n\nfunc main() {\n\tapp := web.NewHttpSever()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"123456\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tUrlPrefix:   \"admin\",\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tLanguage:    language.CN,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\texamplePlugin := example.NewExample()\n\n\tweb.SetStaticPath(\"/uploads\", \"uploads\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tapp.Cfg.Listen.HTTPSAddr = \"127.0.0.1\"\n\tapp.Cfg.Listen.HTTPPort = 9087\n\tgo app.Run(\"\")\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/buffalo/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/buffalo\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\t\"github.com/gobuffalo/buffalo\"\n)\n\nfunc main() {\n\tbu := buffalo.New(buffalo.Options{\n\t\tEnv:  \"test\",\n\t\tAddr: \"127.0.0.1:9033\",\n\t})\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(bu); err != nil {\n\t\tpanic(err)\n\t}\n\n\tbu.ServeFiles(\"/uploads\", http.Dir(\"./uploads\"))\n\n\t// you can custom your pages like:\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tgo func() {\n\t\t_ = bu.Serve()\n\t}()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/chi/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/chi\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\t\"github.com/go-chi/chi\"\n)\n\nfunc main() {\n\tr := chi.NewRouter()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\tworkDir, _ := os.Getwd()\n\tfilesDir := filepath.Join(workDir, \"uploads\")\n\tFileServer(r, \"/uploads\", http.Dir(filesDir))\n\n\t// you can custom your pages like:\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tgo func() {\n\t\t_ = http.ListenAndServe(\":3333\", r)\n\t}()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n\n// FileServer conveniently sets up a http.FileServer handler to serve\n// static files from a http.FileSystem.\nfunc FileServer(r chi.Router, path string, root http.FileSystem) {\n\tif strings.ContainsAny(path, \"{}*\") {\n\t\tpanic(\"FileServer does not permit URL parameters.\")\n\t}\n\n\tfs := http.StripPrefix(path, http.FileServer(root))\n\n\tif path != \"/\" && path[len(path)-1] != '/' {\n\t\tr.Get(path, http.RedirectHandler(path+\"/\", http.StatusMovedPermanently).ServeHTTP)\n\t\tpath += \"/\"\n\t}\n\tpath += \"*\"\n\n\tr.Get(path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tfs.ServeHTTP(w, r)\n\t}))\n}\n"
  },
  {
    "path": "examples/datamodel/authors.go",
    "content": "package datamodel\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\n// GetAuthorsTable return the model of table author.\nfunc GetAuthorsTable(ctx *context.Context) (authorsTable table.Table) {\n\n\tauthorsTable = table.NewDefaultTable(ctx, table.DefaultConfig())\n\n\t// connect your custom connection\n\t// authorsTable = table.NewDefaultTable(ctx, table.DefaultConfigWithDriverAndConnection(\"mysql\", \"admin\"))\n\n\tinfo := authorsTable.GetInfo()\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(\"First Name\", \"first_name\", db.Varchar)\n\tinfo.AddField(\"Last Name\", \"last_name\", db.Varchar)\n\tinfo.AddField(\"Email\", \"email\", db.Varchar)\n\tinfo.AddField(\"Birthdate\", \"birthdate\", db.Date)\n\tinfo.AddField(\"Added\", \"added\", db.Timestamp)\n\n\tinfo.SetTable(\"authors\").SetTitle(\"Authors\").SetDescription(\"Authors\")\n\n\tformList := authorsTable.GetForm()\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(\"First Name\", \"first_name\", db.Varchar, form.Text)\n\tformList.AddField(\"Last Name\", \"last_name\", db.Varchar, form.Text)\n\tformList.AddField(\"Email\", \"email\", db.Varchar, form.Text)\n\tformList.AddField(\"Birthdate\", \"birthdate\", db.Date, form.Text)\n\tformList.AddField(\"Added\", \"added\", db.Timestamp, form.Text)\n\n\tformList.SetTable(\"authors\").SetTitle(\"Authors\").SetDescription(\"Authors\")\n\n\treturn\n}\n"
  },
  {
    "path": "examples/datamodel/bootstrap.go",
    "content": "package datamodel\n"
  },
  {
    "path": "examples/datamodel/config.json",
    "content": "{\n  \"database\": {\n    \"default\": {\n      \"host\": \"127.0.0.1\",\n      \"port\": \"3306\",\n      \"user\": \"root\",\n      \"pwd\": \"root\",\n      \"name\": \"godmin\",\n      \"max_idle_con\": 50,\n      \"max_open_con\": 150,\n      \"driver\": \"mysql\"\n    }\n  },\n  \"domain\": \"localhost\",\n  \"prefix\": \"admin\",\n  \"store\": {\n    \"path\": \"./uploads\",\n    \"prefix\": \"uploads\"\n  },\n  \"language\": \"cn\",\n  \"index\": \"/\",\n  \"debug\": true,\n  \"color_scheme\": \"skin-black\"\n}"
  },
  {
    "path": "examples/datamodel/content.go",
    "content": "package datamodel\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\ttmpl \"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/chart_legend\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/description\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/infobox\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/productlist\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/progress_group\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/smallbox\"\n)\n\n// GetContent return the content of index page.\nfunc GetContent(ctx *context.Context) (types.Panel, error) {\n\n\tcomponents := tmpl.Default(ctx)\n\tcolComp := components.Col()\n\n\t/**************************\n\t * Info Box\n\t/**************************/\n\n\tinfobox1 := infobox.New().\n\t\tSetText(\"CPU TRAFFIC\").\n\t\tSetColor(\"aqua\").\n\t\tSetNumber(\"100\").\n\t\tSetIcon(\"ion-ios-gear-outline\").\n\t\tGetContent()\n\n\tinfobox2 := infobox.New().\n\t\tSetText(\"Likes\").\n\t\tSetColor(\"red\").\n\t\tSetNumber(\"1030.00<small>$</small>\").\n\t\tSetIcon(icon.GooglePlus).\n\t\tGetContent()\n\n\tinfobox3 := infobox.New().\n\t\tSetText(\"Sales\").\n\t\tSetColor(\"green\").\n\t\tSetNumber(\"760\").\n\t\tSetIcon(\"ion-ios-cart-outline\").\n\t\tGetContent()\n\n\tinfobox4 := infobox.New().\n\t\tSetText(\"New Members\").\n\t\tSetColor(\"yellow\").\n\t\tSetNumber(\"2,349\").\n\t\tSetIcon(\"ion-ios-people-outline\"). // svg is ok\n\t\tGetContent()\n\n\tvar size = types.Size(6, 3, 0).XS(12)\n\tinfoboxCol1 := colComp.SetSize(size).SetContent(infobox1).GetContent()\n\tinfoboxCol2 := colComp.SetSize(size).SetContent(infobox2).GetContent()\n\tinfoboxCol3 := colComp.SetSize(size).SetContent(infobox3).GetContent()\n\tinfoboxCol4 := colComp.SetSize(size).SetContent(infobox4).GetContent()\n\trow1 := components.Row().SetContent(infoboxCol1 + infoboxCol2 + infoboxCol3 + infoboxCol4).GetContent()\n\n\t/**************************\n\t * Box\n\t/**************************/\n\n\ttable := components.Table().SetInfoList([]map[string]types.InfoItem{\n\t\t{\n\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t}, {\n\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t}, {\n\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t}, {\n\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t},\n\t}).SetThead(types.Thead{\n\t\t{Head: \"Order ID\"},\n\t\t{Head: \"Item\"},\n\t\t{Head: \"Status\"},\n\t\t{Head: \"Popularity\"},\n\t}).GetContent()\n\n\tboxInfo := components.Box().\n\t\tWithHeadBorder().\n\t\tSetHeader(\"Latest Orders\").\n\t\tSetHeadColor(\"#f7f7f7\").\n\t\tSetBody(table).\n\t\tSetFooter(`<div class=\"clearfix\"><a href=\"javascript:void(0)\" class=\"btn btn-sm btn-info btn-flat pull-left\">处理订单</a><a href=\"javascript:void(0)\" class=\"btn btn-sm btn-default btn-flat pull-right\">查看所有新订单</a> </div>`).\n\t\tGetContent()\n\n\ttableCol := colComp.SetSize(types.SizeMD(8)).SetContent(row1 + boxInfo).GetContent()\n\n\t/**************************\n\t * Product List\n\t/**************************/\n\n\tproductList := productlist.New().SetData([]map[string]string{\n\t\t{\n\t\t\t\"img\":         \"http://adminlte.io/themes/AdminLTE/dist/img/default-50x50.gif\",\n\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\"label\":       \"free\",\n\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t}, {\n\t\t\t\"img\":         \"http://adminlte.io/themes/AdminLTE/dist/img/default-50x50.gif\",\n\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\"label\":       \"free\",\n\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t}, {\n\t\t\t\"img\":         \"http://adminlte.io/themes/AdminLTE/dist/img/default-50x50.gif\",\n\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\"label\":       \"free\",\n\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t}, {\n\t\t\t\"img\":         \"http://adminlte.io/themes/AdminLTE/dist/img/default-50x50.gif\",\n\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\"label\":       \"free\",\n\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t},\n\t}).GetContent()\n\n\tboxWarning := components.Box().SetTheme(\"warning\").WithHeadBorder().SetHeader(\"Recently Added Products\").\n\t\tSetBody(productList).\n\t\tSetFooter(`<a href=\"javascript:void(0)\" class=\"uppercase\">View All Products</a>`).\n\t\tGetContent()\n\n\tnewsCol := colComp.SetSize(types.SizeMD(4)).SetContent(boxWarning).GetContent()\n\n\trow5 := components.Row().SetContent(tableCol + newsCol).GetContent()\n\n\t/**************************\n\t * Box\n\t/**************************/\n\n\tline := chartjs.Line()\n\n\tlineChart := line.\n\t\tSetID(\"salechart\").\n\t\tSetHeight(180).\n\t\tSetTitle(\"Sales: 1 Jan, 2019 - 30 Jul, 2019\").\n\t\tSetLabels([]string{\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\"}).\n\t\tAddDataSet(\"Electronics\").\n\t\tDSData([]float64{65, 59, 80, 81, 56, 55, 40}).\n\t\tDSFill(false).\n\t\tDSBorderColor(\"rgb(210, 214, 222)\").\n\t\tDSLineTension(0.1).\n\t\tAddDataSet(\"Digital Goods\").\n\t\tDSData([]float64{28, 48, 40, 19, 86, 27, 90}).\n\t\tDSFill(false).\n\t\tDSBorderColor(\"rgba(60,141,188,1)\").\n\t\tDSLineTension(0.1).\n\t\tGetContent()\n\n\ttitle := `<p class=\"text-center\"><strong>Goal Completion</strong></p>`\n\tprogressGroup := progress_group.New().\n\t\tSetTitle(\"Add Products to Cart\").\n\t\tSetColor(\"#76b2d4\").\n\t\tSetDenominator(200).\n\t\tSetMolecular(160).\n\t\tSetPercent(80).\n\t\tGetContent()\n\n\tprogressGroup1 := progress_group.New().\n\t\tSetTitle(\"Complete Purchase\").\n\t\tSetColor(\"#f17c6e\").\n\t\tSetDenominator(400).\n\t\tSetMolecular(310).\n\t\tSetPercent(80).\n\t\tGetContent()\n\n\tprogressGroup2 := progress_group.New().\n\t\tSetTitle(\"Visit Premium Page\").\n\t\tSetColor(\"#ace0ae\").\n\t\tSetDenominator(800).\n\t\tSetMolecular(490).\n\t\tSetPercent(80).\n\t\tGetContent()\n\n\tprogressGroup3 := progress_group.New().\n\t\tSetTitle(\"Send Inquiries\").\n\t\tSetColor(\"#fdd698\").\n\t\tSetDenominator(500).\n\t\tSetMolecular(250).\n\t\tSetPercent(50).\n\t\tGetContent()\n\n\tboxInternalCol1 := colComp.SetContent(lineChart).SetSize(types.SizeMD(8)).GetContent()\n\tboxInternalCol2 := colComp.\n\t\tSetContent(template.HTML(title) + progressGroup + progressGroup1 + progressGroup2 + progressGroup3).\n\t\tSetSize(types.SizeMD(4)).\n\t\tGetContent()\n\n\tboxInternalRow := components.Row().SetContent(boxInternalCol1 + boxInternalCol2).GetContent()\n\n\tdescription1 := description.New().\n\t\tSetPercent(\"17\").\n\t\tSetNumber(\"¥140,100\").\n\t\tSetTitle(\"TOTAL REVENUE\").\n\t\tSetArrow(\"up\").\n\t\tSetColor(\"green\").\n\t\tSetBorder(\"right\").\n\t\tGetContent()\n\n\tdescription2 := description.New().\n\t\tSetPercent(\"2\").\n\t\tSetNumber(\"440,560\").\n\t\tSetTitle(\"TOTAL REVENUE\").\n\t\tSetArrow(\"down\").\n\t\tSetColor(\"red\").\n\t\tSetBorder(\"right\").\n\t\tGetContent()\n\n\tdescription3 := description.New().\n\t\tSetPercent(\"12\").\n\t\tSetNumber(\"¥140,050\").\n\t\tSetTitle(\"TOTAL REVENUE\").\n\t\tSetArrow(\"up\").\n\t\tSetColor(\"green\").\n\t\tSetBorder(\"right\").\n\t\tGetContent()\n\n\tdescription4 := description.New().\n\t\tSetPercent(\"1\").\n\t\tSetNumber(\"30943\").\n\t\tSetTitle(\"TOTAL REVENUE\").\n\t\tSetArrow(\"up\").\n\t\tSetColor(\"green\").\n\t\tGetContent()\n\n\tsize2 := types.SizeXS(6).SM(3)\n\tboxInternalCol3 := colComp.SetContent(description1).SetSize(size2).GetContent()\n\tboxInternalCol4 := colComp.SetContent(description2).SetSize(size2).GetContent()\n\tboxInternalCol5 := colComp.SetContent(description3).SetSize(size2).GetContent()\n\tboxInternalCol6 := colComp.SetContent(description4).SetSize(size2).GetContent()\n\n\tboxInternalRow2 := components.Row().SetContent(boxInternalCol3 + boxInternalCol4 + boxInternalCol5 + boxInternalCol6).GetContent()\n\n\tbox := components.Box().WithHeadBorder().SetHeader(\"Monthly Recap Report\").\n\t\tSetBody(boxInternalRow).\n\t\tSetFooter(boxInternalRow2).\n\t\tGetContent()\n\n\tboxcol := colComp.SetContent(box).SetSize(types.SizeMD(12)).GetContent()\n\trow2 := components.Row().SetContent(boxcol).GetContent()\n\n\t/**************************\n\t * Small Box\n\t/**************************/\n\n\tsmallbox1 := smallbox.New().SetColor(\"blue\").SetIcon(\"ion-ios-gear-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"345￥\").GetContent()\n\tsmallbox2 := smallbox.New().SetColor(\"yellow\").SetIcon(\"ion-ios-cart-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"80%\").GetContent()\n\tsmallbox3 := smallbox.New().SetColor(\"red\").SetIcon(\"fa-user\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"645￥\").GetContent()\n\tsmallbox4 := smallbox.New().SetColor(\"green\").SetIcon(\"ion-ios-cart-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"889￥\").GetContent()\n\n\tcol1 := colComp.SetSize(size).SetContent(smallbox1).GetContent()\n\tcol2 := colComp.SetSize(size).SetContent(smallbox2).GetContent()\n\tcol3 := colComp.SetSize(size).SetContent(smallbox3).GetContent()\n\tcol4 := colComp.SetSize(size).SetContent(smallbox4).GetContent()\n\n\trow3 := components.Row().SetContent(col1 + col2 + col3 + col4).GetContent()\n\n\t/**************************\n\t * Pie Chart\n\t/**************************/\n\n\tpie := chartjs.Pie().\n\t\tSetHeight(170).\n\t\tSetLabels([]string{\"Navigator\", \"Opera\", \"Safari\", \"FireFox\", \"IE\", \"Chrome\"}).\n\t\tSetID(\"pieChart\").\n\t\tAddDataSet(\"Chrome\").\n\t\tDSData([]float64{100, 300, 600, 400, 500, 700}).\n\t\tDSBackgroundColor([]chartjs.Color{\n\t\t\t\"rgb(255, 205, 86)\", \"rgb(54, 162, 235)\", \"rgb(255, 99, 132)\", \"rgb(255, 205, 86)\", \"rgb(54, 162, 235)\", \"rgb(255, 99, 132)\",\n\t\t}).\n\t\tGetContent()\n\n\tlegend := chart_legend.New().SetData([]map[string]string{\n\t\t{\n\t\t\t\"label\": \" Chrome\",\n\t\t\t\"color\": \"red\",\n\t\t}, {\n\t\t\t\"label\": \" IE\",\n\t\t\t\"color\": \"Green\",\n\t\t}, {\n\t\t\t\"label\": \" FireFox\",\n\t\t\t\"color\": \"yellow\",\n\t\t}, {\n\t\t\t\"label\": \" Sarafri\",\n\t\t\t\"color\": \"blue\",\n\t\t}, {\n\t\t\t\"label\": \" Opera\",\n\t\t\t\"color\": \"light-blue\",\n\t\t}, {\n\t\t\t\"label\": \" Navigator\",\n\t\t\t\"color\": \"gray\",\n\t\t},\n\t}).GetContent()\n\n\tboxDanger := components.Box().SetTheme(\"danger\").WithHeadBorder().SetHeader(\"Browser Usage\").\n\t\tSetBody(components.Row().\n\t\t\tSetContent(colComp.SetSize(types.SizeMD(8)).\n\t\t\t\tSetContent(pie).\n\t\t\t\tGetContent() + colComp.SetSize(types.SizeMD(4)).\n\t\t\t\tSetContent(legend).\n\t\t\t\tGetContent()).GetContent()).\n\t\tSetFooter(`<p class=\"text-center\"><a href=\"javascript:void(0)\" class=\"uppercase\">View All Users</a></p>`).\n\t\tGetContent()\n\n\ttabs := components.Tabs().SetData([]map[string]template.HTML{\n\t\t{\n\t\t\t\"title\": \"tabs1\",\n\t\t\t\"content\": template.HTML(`<b>How to use:</b>\n\n                <p>Exactly like the original bootstrap tabs except you should use\n                  the custom wrapper <code>.nav-tabs-custom</code> to achieve this style.</p>\n                A wonderful serenity has taken possession of my entire soul,\n                like these sweet mornings of spring which I enjoy with my whole heart.\n                I am alone, and feel the charm of existence in this spot,\n                which was created for the bliss of souls like mine. I am so happy,\n                my dear friend, so absorbed in the exquisite sense of mere tranquil existence,\n                that I neglect my talents. I should be incapable of drawing a single stroke\n                at the present moment; and yet I feel that I never was a greater artist than now.`),\n\t\t}, {\n\t\t\t\"title\": \"tabs2\",\n\t\t\t\"content\": template.HTML(`\n                The European languages are members of the same family. Their separate existence is a myth.\n                For science, music, sport, etc, Europe uses the same vocabulary. The languages only differ\n                in their grammar, their pronunciation and their most common words. Everyone realizes why a\n                new common language would be desirable: one could refuse to pay expensive translators. To\n                achieve this, it would be necessary to have uniform grammar, pronunciation and more common\n                words. If several languages coalesce, the grammar of the resulting language is more simple\n                and regular than that of the individual languages.\n              `),\n\t\t}, {\n\t\t\t\"title\": \"tabs3\",\n\t\t\t\"content\": template.HTML(`\n                Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n                Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,\n                when an unknown printer took a galley of type and scrambled it to make a type specimen book.\n                It has survived not only five centuries, but also the leap into electronic typesetting,\n                remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset\n                sheets containing Lorem Ipsum passages, and more recently with desktop publishing software\n                like Aldus PageMaker including versions of Lorem Ipsum.\n              `),\n\t\t},\n\t}).GetContent()\n\n\tbuttonTest := `<button type=\"button\" class=\"btn btn-primary\" data-toggle=\"modal\" data-target=\"#exampleModal\" data-whatever=\"@mdo\">Open modal for @mdo</button>`\n\tpopupForm := `<form>\n          <div class=\"form-group\">\n            <label for=\"recipient-name\" class=\"col-form-label\">Recipient:</label>\n            <input type=\"text\" class=\"form-control\" id=\"recipient-name\">\n          </div>\n          <div class=\"form-group\">\n            <label for=\"message-text\" class=\"col-form-label\">Message:</label>\n            <textarea class=\"form-control\" id=\"message-text\"></textarea>\n          </div>\n        </form>`\n\tpopup := components.Popup().SetID(\"exampleModal\").\n\t\tSetFooter(\"Save Change\").\n\t\tSetTitle(\"this is a popup\").\n\t\tSetBody(template.HTML(popupForm)).\n\t\tGetContent()\n\n\tcol5 := colComp.SetSize(types.SizeMD(8)).SetContent(tabs + template.HTML(buttonTest)).GetContent()\n\tcol6 := colComp.SetSize(types.SizeMD(4)).SetContent(boxDanger + popup).GetContent()\n\n\trow4 := components.Row().SetContent(col5 + col6).GetContent()\n\n\treturn types.Panel{\n\t\tContent:     row3 + row2 + row5 + row4,\n\t\tTitle:       \"Dashboard\",\n\t\tDescription: \"dashboard example\",\n\t}, nil\n}\n"
  },
  {
    "path": "examples/datamodel/goadmin_super_users.go",
    "content": "package datamodel\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\nfunc GetGoadminSuperUsersTable(ctx *context.Context) table.Table {\n\n\tgoadminSuperUsers := table.NewDefaultTable(ctx, table.DefaultConfigWithDriver(\"mysql\"))\n\n\tinfo := goadminSuperUsers.GetInfo().HideFilterArea()\n\n\tinfo.AddField(\"Id\", \"id\", db.Int).FieldFilterable()\n\tinfo.AddField(\"Username\", \"username\", db.Varchar)\n\tinfo.AddField(\"Password\", \"password\", db.Varchar)\n\tinfo.AddField(\"Name\", \"name\", db.Varchar)\n\tinfo.AddField(\"Avatar\", \"avatar\", db.Varchar)\n\tinfo.AddField(\"Remember_token\", \"remember_token\", db.Varchar)\n\tinfo.AddField(\"Created_at\", \"created_at\", db.Timestamp)\n\tinfo.AddField(\"Updated_at\", \"updated_at\", db.Timestamp)\n\n\tinfo.SetTable(\"goadmin_super_users\").SetTitle(\"GoadminSuperUsers\").SetDescription(\"GoadminSuperUsers\")\n\n\tformList := goadminSuperUsers.GetForm()\n\tformList.AddField(\"Id\", \"id\", db.Int, form.Default)\n\tformList.AddField(\"Username\", \"username\", db.Varchar, form.Text)\n\tformList.AddField(\"Password\", \"password\", db.Varchar, form.Password)\n\tformList.AddField(\"Name\", \"name\", db.Varchar, form.Text)\n\tformList.AddField(\"Avatar\", \"avatar\", db.Varchar, form.Text)\n\tformList.AddField(\"Remember_token\", \"remember_token\", db.Varchar, form.Text)\n\tformList.AddField(\"Created_at\", \"created_at\", db.Timestamp, form.Datetime)\n\tformList.AddField(\"Updated_at\", \"updated_at\", db.Timestamp, form.Datetime)\n\n\tformList.SetTable(\"goadmin_super_users\").SetTitle(\"GoadminSuperUsers\").SetDescription(\"GoadminSuperUsers\")\n\n\treturn goadminSuperUsers\n}\n"
  },
  {
    "path": "examples/datamodel/mysql_types.go",
    "content": "package datamodel\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\n// GetAllTypesTable return the model of table types.\nfunc GetAllTypesTable() table.Table {\n\n\tallTypesTable := table.NewDefaultTable(nil, table.DefaultConfigWithDriver(\"mysql\"))\n\n\tinfo := allTypesTable.GetInfo()\n\n\tinfo.AddField(\"Id\", \"id\", db.Int)\n\tinfo.AddField(\"Type_1\", \"type_1\", db.Tinyint)\n\tinfo.AddField(\"Type_2\", \"type_2\", db.Smallint)\n\tinfo.AddField(\"Type_3\", \"type_3\", db.Mediumint)\n\tinfo.AddField(\"Type_4\", \"type_4\", db.Bigint)\n\tinfo.AddField(\"Type_5\", \"type_5\", db.Float)\n\tinfo.AddField(\"Type_6\", \"type_6\", db.Double)\n\tinfo.AddField(\"Type_7\", \"type_7\", db.Double)\n\tinfo.AddField(\"Type_8\", \"type_8\", db.Double)\n\tinfo.AddField(\"Type_9\", \"type_9\", db.Decimal)\n\tinfo.AddField(\"Type_10\", \"type_10\", db.Bit)\n\tinfo.AddField(\"Type_11\", \"type_11\", db.Tinyint)\n\tinfo.AddField(\"Type_12\", \"type_12\", db.Tinyint)\n\tinfo.AddField(\"Type_13\", \"type_13\", db.Decimal)\n\tinfo.AddField(\"Type_14\", \"type_14\", db.Decimal)\n\tinfo.AddField(\"Type_15\", \"type_15\", db.Decimal)\n\tinfo.AddField(\"Type_16\", \"type_16\", db.Char)\n\tinfo.AddField(\"Type_17\", \"type_17\", db.Varchar)\n\tinfo.AddField(\"Type_18\", \"type_18\", db.Tinytext)\n\tinfo.AddField(\"Type_19\", \"type_19\", db.Text)\n\tinfo.AddField(\"Type_20\", \"type_20\", db.Mediumtext)\n\tinfo.AddField(\"Type_21\", \"type_21\", db.Longtext)\n\tinfo.AddField(\"Type_22\", \"type_22\", db.Tinyblob)\n\tinfo.AddField(\"Type_23\", \"type_23\", db.Mediumblob)\n\tinfo.AddField(\"Type_24\", \"type_24\", db.Blob)\n\tinfo.AddField(\"Type_25\", \"type_25\", db.Longblob)\n\tinfo.AddField(\"Type_26\", \"type_26\", db.Binary)\n\tinfo.AddField(\"Type_27\", \"type_27\", db.Varbinary)\n\tinfo.AddField(\"Type_28\", \"type_28\", db.Enum)\n\tinfo.AddField(\"Type_29\", \"type_29\", db.Set)\n\tinfo.AddField(\"Type_30\", \"type_30\", db.Date)\n\tinfo.AddField(\"Type_31\", \"type_31\", db.Datetime)\n\tinfo.AddField(\"Type_32\", \"type_32\", db.Timestamp)\n\tinfo.AddField(\"Type_33\", \"type_33\", db.Time)\n\tinfo.AddField(\"Type_34\", \"type_34\", db.Year)\n\tinfo.AddField(\"Type_35\", \"type_35\", db.Geometry)\n\tinfo.AddField(\"Type_36\", \"type_36\", db.Point)\n\tinfo.AddField(\"Type_39\", \"type_39\", db.Multilinestring)\n\tinfo.AddField(\"Type_41\", \"type_41\", db.Multipolygon)\n\tinfo.AddField(\"Type_37\", \"type_37\", db.Linestring)\n\tinfo.AddField(\"Type_38\", \"type_38\", db.Polygon)\n\tinfo.AddField(\"Type_40\", \"type_40\", db.Multipoint)\n\tinfo.AddField(\"Type_42\", \"type_42\", db.Geometrycollection)\n\tinfo.AddField(\"Type_50\", \"type_50\", db.Double)\n\tinfo.AddField(\"Type_51\", \"type_51\", db.JSON)\n\n\tinfo.SetTable(\"all_types\").SetTitle(\"All_types\").SetDescription(\"All_types\")\n\n\tformList := allTypesTable.GetForm()\n\n\tformList.AddField(\"Id\", \"id\", db.Int, form.Default)\n\tformList.AddField(\"Type_1\", \"type_1\", db.Tinyint, form.Number)\n\tformList.AddField(\"Type_2\", \"type_2\", db.Smallint, form.Number)\n\tformList.AddField(\"Type_3\", \"type_3\", db.Mediumint, form.Number)\n\tformList.AddField(\"Type_4\", \"type_4\", db.Bigint, form.Number)\n\tformList.AddField(\"Type_5\", \"type_5\", db.Float, form.Text)\n\tformList.AddField(\"Type_6\", \"type_6\", db.Double, form.Text)\n\tformList.AddField(\"Type_7\", \"type_7\", db.Double, form.Text)\n\tformList.AddField(\"Type_8\", \"type_8\", db.Double, form.Text)\n\tformList.AddField(\"Type_9\", \"type_9\", db.Decimal, form.Text)\n\tformList.AddField(\"Type_10\", \"type_10\", db.Bit, form.Text)\n\tformList.AddField(\"Type_11\", \"type_11\", db.Tinyint, form.Number)\n\tformList.AddField(\"Type_12\", \"type_12\", db.Tinyint, form.Number)\n\tformList.AddField(\"Type_13\", \"type_13\", db.Decimal, form.Text)\n\tformList.AddField(\"Type_14\", \"type_14\", db.Decimal, form.Text)\n\tformList.AddField(\"Type_15\", \"type_15\", db.Decimal, form.Text)\n\tformList.AddField(\"Type_16\", \"type_16\", db.Char, form.Text)\n\tformList.AddField(\"Type_17\", \"type_17\", db.Varchar, form.Text)\n\tformList.AddField(\"Type_18\", \"type_18\", db.Tinytext, form.RichText)\n\tformList.AddField(\"Type_19\", \"type_19\", db.Text, form.RichText)\n\tformList.AddField(\"Type_20\", \"type_20\", db.Mediumtext, form.RichText)\n\tformList.AddField(\"Type_21\", \"type_21\", db.Longtext, form.RichText)\n\tformList.AddField(\"Type_22\", \"type_22\", db.Tinyblob, form.Text)\n\tformList.AddField(\"Type_23\", \"type_23\", db.Mediumblob, form.Text)\n\tformList.AddField(\"Type_24\", \"type_24\", db.Blob, form.Text)\n\tformList.AddField(\"Type_25\", \"type_25\", db.Longblob, form.Text)\n\tformList.AddField(\"Type_26\", \"type_26\", db.Binary, form.Text)\n\tformList.AddField(\"Type_27\", \"type_27\", db.Varbinary, form.Text)\n\tformList.AddField(\"Type_28\", \"type_28\", db.Enum, form.Text)\n\tformList.AddField(\"Type_29\", \"type_29\", db.Set, form.Text)\n\tformList.AddField(\"Type_30\", \"type_30\", db.Date, form.Datetime)\n\tformList.AddField(\"Type_31\", \"type_31\", db.Datetime, form.Datetime)\n\tformList.AddField(\"Type_32\", \"type_32\", db.Timestamp, form.Datetime)\n\tformList.AddField(\"Type_33\", \"type_33\", db.Time, form.Datetime)\n\tformList.AddField(\"Type_34\", \"type_34\", db.Year, form.Datetime)\n\tformList.AddField(\"Type_35\", \"type_35\", db.Geometry, form.Text)\n\tformList.AddField(\"Type_36\", \"type_36\", db.Point, form.Text)\n\tformList.AddField(\"Type_39\", \"type_39\", db.Multilinestring, form.Text)\n\tformList.AddField(\"Type_41\", \"type_41\", db.Multipolygon, form.Text)\n\tformList.AddField(\"Type_37\", \"type_37\", db.Linestring, form.Text)\n\tformList.AddField(\"Type_38\", \"type_38\", db.Polygon, form.Text)\n\tformList.AddField(\"Type_40\", \"type_40\", db.Multipoint, form.Text)\n\tformList.AddField(\"Type_42\", \"type_42\", db.Geometrycollection, form.Text)\n\tformList.AddField(\"Type_50\", \"type_50\", db.Double, form.Text)\n\tformList.AddField(\"Type_51\", \"type_51\", db.JSON, form.Text)\n\n\tformList.SetTable(\"all_types\").SetTitle(\"All_types\").SetDescription(\"All_types\")\n\n\treturn allTypesTable\n}\n"
  },
  {
    "path": "examples/datamodel/posts.go",
    "content": "package datamodel\n\nimport (\n\ttemplate2 \"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n\teditType \"github.com/GoAdminGroup/go-admin/template/types/table\"\n)\n\n// GetPostsTable return the model of table posts.\nfunc GetPostsTable(ctx *context.Context) (postsTable table.Table) {\n\n\tpostsTable = table.NewDefaultTable(ctx, table.DefaultConfig().SetExportable(true))\n\n\tinfo := postsTable.GetInfo()\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(\"Title\", \"title\", db.Varchar)\n\tinfo.AddField(\"AuthorID\", \"author_id\", db.Varchar).FieldDisplay(func(value types.FieldModel) interface{} {\n\t\treturn template.Default(ctx).\n\t\t\tLink().\n\t\t\tSetURL(\"/admin/info/authors/detail?__goadmin_detail_pk=\" + value.Value).\n\t\t\tSetContent(template2.HTML(value.Value)).\n\t\t\tOpenInNewTab().\n\t\t\tSetTabTitle(\"Author Detail\").\n\t\t\tGetContent()\n\t})\n\tinfo.AddField(\"AuthorName\", \"name\", db.Varchar).FieldDisplay(func(value types.FieldModel) interface{} {\n\t\tfirst, _ := value.Row[\"authors_goadmin_join_first_name\"].(string)\n\t\tlast, _ := value.Row[\"authors_goadmin_join_last_name\"].(string)\n\t\treturn first + \" \" + last\n\t})\n\tinfo.AddField(\"AuthorFirstName\", \"first_name\", db.Varchar).FieldJoin(types.Join{\n\t\tField:     \"author_id\",\n\t\tJoinField: \"id\",\n\t\tTable:     \"authors\",\n\t}).FieldHide()\n\tinfo.AddField(\"AuthorLastName\", \"last_name\", db.Varchar).FieldJoin(types.Join{\n\t\tField:     \"author_id\",\n\t\tJoinField: \"id\",\n\t\tTable:     \"authors\",\n\t}).FieldHide()\n\tinfo.AddField(\"Description\", \"description\", db.Varchar)\n\tinfo.AddField(\"Content\", \"content\", db.Varchar).FieldEditAble(editType.Textarea)\n\tinfo.AddField(\"Date\", \"date\", db.Varchar)\n\tinfo.AddField(\"AuthorCreatedAt\", \"created_at\", db.Varchar).FieldJoin(types.Join{\n\t\tField:     \"author_id\",\n\t\tJoinField: \"id\",\n\t\tTable:     \"authors\",\n\t})\n\tinfo.AddField(\"Created_at\", \"created_at\", db.Varchar).FieldFilterable()\n\n\tinfo.SetTable(\"posts\").SetTitle(\"Posts\").SetDescription(\"Posts\")\n\n\tformList := postsTable.GetForm()\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(\"Title\", \"title\", db.Varchar, form.Text)\n\tformList.AddField(\"Description\", \"description\", db.Varchar, form.Text)\n\tformList.AddField(\"Content\", \"content\", db.Varchar, form.RichText).FieldEnableFileUpload()\n\tformList.AddField(\"Date\", \"date\", db.Varchar, form.Datetime)\n\tformList.EnableAjax(\"Request Success\", \"Request Failed\")\n\n\tformList.SetTable(\"posts\").SetTitle(\"Posts\").SetDescription(\"Posts\")\n\n\treturn\n}\n"
  },
  {
    "path": "examples/datamodel/tables.go",
    "content": "package datamodel\n\nimport \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n// Generators is a map of table models.\n//\n// The key of generators is the prefix of table info url.\n// The corresponding value is the Form and TableName data.\n//\n// http://{{config.Domain}}:{{Port}}/{{config.Prefix}}/info/{{key}}\n//\n// example:\n//\n// \"posts\"   => http://localhost:9033/admin/info/posts\n// \"authors\" => http://localhost:9033/admin/info/authors\n//\nvar Generators = map[string]table.Generator{\n\t\"posts\":   GetPostsTable,\n\t\"authors\": GetAuthorsTable,\n}\n"
  },
  {
    "path": "examples/datamodel/user.go",
    "content": "package datamodel\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\tform2 \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n\tselection \"github.com/GoAdminGroup/go-admin/template/types/form/select\"\n\teditType \"github.com/GoAdminGroup/go-admin/template/types/table\"\n)\n\n// GetUserTable return the model of table user.\nfunc GetUserTable(ctx *context.Context) (userTable table.Table) {\n\n\tuserTable = table.NewDefaultTable(ctx, table.Config{\n\t\tDriver:     db.DriverMysql,\n\t\tCanAdd:     true,\n\t\tEditable:   true,\n\t\tDeletable:  true,\n\t\tExportable: true,\n\t\tConnection: table.DefaultConnectionName,\n\t\tPrimaryKey: table.PrimaryKey{\n\t\t\tType: db.Int,\n\t\t\tName: table.DefaultPrimaryKeyName,\n\t\t},\n\t})\n\n\tinfo := userTable.GetInfo().SetFilterFormLayout(form.LayoutThreeCol)\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(\"Name\", \"name\", db.Varchar).FieldEditAble(editType.Text).\n\t\tFieldFilterable(types.FilterType{Operator: types.FilterOperatorLike})\n\tinfo.AddField(\"Gender\", \"gender\", db.Tinyint).FieldDisplay(func(model types.FieldModel) interface{} {\n\t\tif model.Value == \"0\" {\n\t\t\treturn \"men\"\n\t\t}\n\t\tif model.Value == \"1\" {\n\t\t\treturn \"women\"\n\t\t}\n\t\treturn \"unknown\"\n\t}).FieldEditAble(editType.Switch).FieldEditOptions(types.FieldOptions{\n\t\t{Value: \"0\", Text: \"👦\"},\n\t\t{Value: \"1\", Text: \"👧\"},\n\t}).FieldFilterable(types.FilterType{FormType: form.SelectSingle}).FieldFilterOptions(types.FieldOptions{\n\t\t{Value: \"0\", Text: \"men\"},\n\t\t{Value: \"1\", Text: \"women\"},\n\t})\n\tinfo.AddColumn(\"Personality\", func(value types.FieldModel) interface{} {\n\t\treturn \"handsome\"\n\t})\n\tinfo.AddColumnButtons(ctx, \"see more\", types.GetColumnButton(\"see more\", icon.Info,\n\t\taction.PopUp(\"/see/more/example\", \"see more\", func(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\treturn true, \"ok\", \"<h1>Detail</h1><p>balabala</p>\"\n\t\t})))\n\tinfo.AddField(\"Phone\", \"phone\", db.Varchar).FieldFilterable()\n\tinfo.AddField(\"City\", \"city\", db.Varchar).FieldFilterable()\n\tinfo.AddField(\"Avatar\", \"avatar\", db.Varchar).FieldDisplay(func(value types.FieldModel) interface{} {\n\t\treturn template.Default(ctx).Image().\n\t\t\tSetSrc(`//quick.go-admin.cn/demo/assets/dist/img/gopher_avatar.png`).\n\t\t\tSetHeight(\"120\").SetWidth(\"120\").WithModal().GetContent()\n\t})\n\tinfo.AddField(\"CreatedAt\", \"created_at\", db.Timestamp).\n\t\tFieldFilterable(types.FilterType{FormType: form.DatetimeRange})\n\tinfo.AddField(\"UpdatedAt\", \"updated_at\", db.Timestamp).FieldEditAble(editType.Datetime)\n\n\tinfo.AddActionButton(ctx, \"google\", action.Jump(\"https://google.com\"))\n\tinfo.AddActionButton(ctx, \"Audit\", action.Ajax(\"/admin/audit\",\n\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\tfmt.Println(\"PostForm\", ctx.PostForm())\n\t\t\treturn true, \"success\", \"\"\n\t\t}))\n\tinfo.AddActionButton(ctx, \"Preview\", action.PopUp(\"/admin/preview\", \"Preview\",\n\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\treturn true, \"\", \"<h2>hello world</h2>\"\n\t\t}))\n\tinfo.AddButton(ctx, \"jump\", icon.User, action.JumpInNewTab(\"/admin/info/authors\", \"authors\"))\n\tinfo.AddButton(ctx, \"popup\", icon.Terminal, action.PopUp(\"/admin/popup\", \"Popup Example\",\n\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\treturn true, \"\", \"<h2>hello world</h2>\"\n\t\t}))\n\n\tinfo.AddButton(ctx, \"iframe\", icon.Tv, action.PopUpWithIframe(\"/admin/iframe\", \"Iframe Example\",\n\t\taction.IframeData{Src: \"/admin/info/authors\"}, \"900px\", \"560px\"))\n\tinfo.AddButton(ctx, \"form\", icon.Folder, action.PopUpWithForm(action.PopUpData{\n\t\tId:     \"/admin/popup/form\",\n\t\tTitle:  \"Popup Form Example\",\n\t\tWidth:  \"900px\",\n\t\tHeight: \"430px\",\n\t}, func(panel *types.FormPanel) *types.FormPanel {\n\t\tpanel.AddField(\"Name\", \"name\", db.Varchar, form.Text)\n\t\tpanel.AddField(\"Age\", \"age\", db.Int, form.Number)\n\t\tpanel.AddField(\"HomePage\", \"homepage\", db.Varchar, form.Url).FieldDefault(\"http://google.com\")\n\t\tpanel.AddField(\"Email\", \"email\", db.Varchar, form.Email).FieldDefault(\"xxxx@xxx.com\")\n\t\tpanel.AddField(\"Birthday\", \"birthday\", db.Varchar, form.Date).FieldDefault(\"2010-09-03 18:09:05\")\n\t\tpanel.AddField(\"Time\", \"time\", db.Varchar, form.Datetime).FieldDefault(\"2010-09-05\")\n\t\tpanel.EnableAjax(\"Request Success\", \"Request Failed\")\n\t\treturn panel\n\t}, \"/admin/popup/form\"))\n\n\tinfo.AddButton(ctx, \"ajax\", icon.Android, action.Ajax(\"/admin/ajax\",\n\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\treturn true, \"success\", \"\"\n\t\t}))\n\tinfo.AddSelectBox(ctx, \"gender\", types.FieldOptions{\n\t\t{Value: \"0\", Text: \"men\"},\n\t\t{Value: \"1\", Text: \"women\"},\n\t}, action.FieldFilter(\"gender\"))\n\n\tinfo.SetTable(\"users\").SetTitle(\"Users\").SetDescription(\"Users\")\n\n\tformList := userTable.GetForm()\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(\"Ip\", \"ip\", db.Varchar, form.Text)\n\tformList.AddField(\"Name\", \"name\", db.Varchar, form.Text)\n\tformList.AddField(\"Gender\", \"gender\", db.Tinyint, form.Radio).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"men\", Value: \"0\"},\n\t\t\t{Text: \"women\", Value: \"1\"},\n\t\t})\n\tformList.AddField(\"Country\", \"country\", db.Tinyint, form.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"China\", Value: \"0\"},\n\t\t\t{Text: \"America\", Value: \"1\"},\n\t\t\t{Text: \"England\", Value: \"2\"},\n\t\t\t{Text: \"Canada\", Value: \"3\"},\n\t\t}).FieldDefault(\"0\").FieldOnChooseAjax(\"city\", \"/choose/country\",\n\t\tfunc(ctx *context.Context) (bool, string, interface{}) {\n\t\t\tcountry := ctx.FormValue(\"value\")\n\t\t\tvar data = make(selection.Options, 0)\n\t\t\tswitch country {\n\t\t\tcase \"0\":\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"Beijing\", ID: \"beijing\"},\n\t\t\t\t\t{Text: \"ShangHai\", ID: \"shangHai\"},\n\t\t\t\t\t{Text: \"GuangZhou\", ID: \"guangZhou\"},\n\t\t\t\t\t{Text: \"ShenZhen\", ID: \"shenZhen\"},\n\t\t\t\t}\n\t\t\tcase \"1\":\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"Los Angeles\", ID: \"los angeles\"},\n\t\t\t\t\t{Text: \"Washington, dc\", ID: \"washington, dc\"},\n\t\t\t\t\t{Text: \"New York\", ID: \"new york\"},\n\t\t\t\t\t{Text: \"Las Vegas\", ID: \"las vegas\"},\n\t\t\t\t}\n\t\t\tcase \"2\":\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"London\", ID: \"london\"},\n\t\t\t\t\t{Text: \"Cambridge\", ID: \"cambridge\"},\n\t\t\t\t\t{Text: \"Manchester\", ID: \"manchester\"},\n\t\t\t\t\t{Text: \"Liverpool\", ID: \"liverpool\"},\n\t\t\t\t}\n\t\t\tcase \"3\":\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"Vancouver\", ID: \"vancouver\"},\n\t\t\t\t\t{Text: \"Toronto\", ID: \"toronto\"},\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"Beijing\", ID: \"beijing\"},\n\t\t\t\t\t{Text: \"ShangHai\", ID: \"shangHai\"},\n\t\t\t\t\t{Text: \"GuangZhou\", ID: \"guangZhou\"},\n\t\t\t\t\t{Text: \"ShenZhen\", ID: \"shenZhen\"},\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true, \"ok\", data\n\t\t}, \"\", `'phone':$(\".phone\").val(),`)\n\tformList.AddField(\"Phone\", \"phone\", db.Varchar, form.Custom).\n\t\tFieldCustomContent(`\n<span class=\"input-group-addon\"><i class=\"fa fa-pencil fa-fw\"></i></span>\n<input type=\"text\" name=\"{{.Field}}\" value=\"{{.Value}}\" class=\"form-control {{.Field}}\" placeholder=\"please input {{.Head}}\">`)\n\tformList.AddField(\"City\", \"city\", db.Varchar, form.SelectSingle).\n\t\tFieldOptionInitFn(func(val types.FieldModel) types.FieldOptions {\n\t\t\treturn types.FieldOptions{\n\t\t\t\t{Value: val.Value, Text: val.Value, Selected: true},\n\t\t\t}\n\t\t}).FieldOptions(types.FieldOptions{\n\t\t{Text: \"Beijing\", Value: \"beijing\"},\n\t\t{Text: \"ShangHai\", Value: \"shanghai\"},\n\t\t{Text: \"GuangZhou\", Value: \"guangzhou\"},\n\t\t{Text: \"ShenZhen\", Value: \"shenzhen\"},\n\t})\n\tformList.AddField(\"Custom Field\", \"role\", db.Varchar, form.Text).\n\t\tFieldPostFilterFn(func(value types.PostFieldModel) interface{} {\n\t\t\tfmt.Println(\"user custom field\", value)\n\t\t\treturn \"\"\n\t\t})\n\n\tformList.AddField(\"UpdatedAt\", \"updated_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\tformList.AddField(\"CreatedAt\", \"created_at\", db.Timestamp, form.Datetime).FieldDisableWhenCreate()\n\n\tuserTable.GetForm().SetTabGroups(types.\n\t\tNewTabGroups(\"id\", \"ip\", \"name\", \"gender\", \"country\", \"city\").\n\t\tAddGroup(\"phone\", \"role\", \"created_at\", \"updated_at\")).\n\t\tSetTabHeaders(\"profile1\", \"profile2\")\n\n\tformList.SetTable(\"users\").SetTitle(\"Users\").SetDescription(\"Users\")\n\n\tformList.SetPostHook(func(values form2.Values) error {\n\t\tfmt.Println(\"userTable.GetForm().PostHook\", values)\n\t\treturn nil\n\t})\n\n\treturn\n}\n"
  },
  {
    "path": "examples/echo/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/echo\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/labstack/echo/v4\"\n)\n\nfunc main() {\n\te := echo.New()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tDebug:    true,\n\t\tLanguage: language.CN,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(e); err != nil {\n\t\tpanic(err)\n\t}\n\n\te.Static(\"/uploads\", \"./uploads\")\n\n\t// you can custom your pages like:\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\t// Start server\n\tgo e.Logger.Fatal(e.Start(\":1323\"))\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/fasthttp/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/fasthttp\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/buaazp/fasthttprouter\"\n\t\"github.com/valyala/fasthttp\"\n)\n\nfunc main() {\n\trouter := fasthttprouter.New()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tDebug:    true,\n\t\tLanguage: language.CN,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(router); err != nil {\n\t\tpanic(err)\n\t}\n\n\trouter.ServeFiles(\"/uploads/*filepath\", \"./uploads\")\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tgo func() {\n\t\t_ = fasthttp.ListenAndServe(\":8897\", router.Handler)\n\t}()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/gear/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gear\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/sword\"\n\t\"github.com/teambition/gear\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n)\n\nfunc main() {\n\n\tapp := gear.New()\n\n\te := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\n\t\t\t\t//Driver: config.DriverSqlite,\n\t\t\t\t//File:   \"../datamodel/admin.db\",\n\t\t\t},\n\t\t},\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tUrlPrefix:          \"admin\",\n\t\tLanguage:           language.CN,\n\t\tIndexUrl:           \"/\",\n\t\tDebug:              true,\n\t\tAccessAssetsLogOff: true,\n\t\tAnimation: config.PageAnimation{\n\t\t\tType: \"fadeInUp\",\n\t\t},\n\t\tColorScheme:       adminlte.ColorschemeSkinBlack,\n\t\tBootstrapFilePath: \"./../datamodel/bootstrap.go\",\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// e.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := e.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddDisplayFilterXssJsFilter().\n\t\tAddPlugins(examplePlugin).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\t// customize your pages\n\n\te.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tgo func() {\n\t\tapp.Start(\":8099\")\n\t}()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\te.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/gf/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gf\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\t\"github.com/gogf/gf/frame/g\"\n)\n\nfunc main() {\n\ts := g.Server()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\n\t\t\t\t//Driver: config.DriverSqlite,\n\t\t\t\t//File:   \"../datamodel/admin.db\",\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.CN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(s); err != nil {\n\t\tpanic(err)\n\t}\n\n\ts.AddStaticPath(\"/uploads\", \"./uploads\")\n\n\t// customize your pages\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\ts.SetPort(9033)\n\tgo s.Run()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/gf2/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gf2\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\t\"github.com/gogf/gf/v2/frame/g\"\n)\n\nfunc main() {\n\ts := g.Server()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"123456\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\n\t\t\t\t//Driver: config.DriverSqlite,\n\t\t\t\t//File:   \"../datamodel/admin.db\",\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.CN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\texamplePlugin := example.NewExample()\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssFilter().\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(s); err != nil {\n\t\tpanic(err)\n\t}\n\n\ts.AddStaticPath(\"/uploads\", \"./uploads\")\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\ts.SetPort(9033)\n\tgo s.Run()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n\n}\n"
  },
  {
    "path": "examples/gin/main.go",
    "content": "package main\n\nimport (\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gin\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/sword\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\t\"github.com/gin-gonic/gin\"\n)\n\nfunc main() {\n\tgin.SetMode(gin.ReleaseMode)\n\tgin.DefaultWriter = ioutil.Discard\n\n\tr := gin.New()\n\n\te := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\n\t\t\t\t//Driver: config.DriverSqlite,\n\t\t\t\t//File:   \"../datamodel/admin.db\",\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:           language.CN,\n\t\tIndexUrl:           \"/\",\n\t\tDebug:              true,\n\t\tAccessAssetsLogOff: true,\n\t\tAnimation: config.PageAnimation{\n\t\t\tType: \"fadeInUp\",\n\t\t},\n\t\tColorScheme:       adminlte.ColorschemeSkinBlack,\n\t\tBootstrapFilePath: \"./../datamodel/bootstrap.go\",\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// e.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := e.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddDisplayFilterXssJsFilter().\n\t\tAddPlugins(examplePlugin).\n\t\tUse(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\tr.Static(\"/uploads\", \"./uploads\")\n\n\t// customize your pages\n\n\te.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tgo func() {\n\t\t_ = r.Run(\":9033\")\n\t}()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\te.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/gofiber/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gofiber\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\n\t\"github.com/gofiber/fiber/v2\"\n)\n\nfunc main() {\n\n\tapp := fiber.New(fiber.Config{\n\t\tServerHeader: \"Fiber\",\n\t})\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tDebug:    true,\n\t\tLanguage: language.CN,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\t_ = app.Listen(\":8897\")\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/gorilla/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gorilla\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/gorilla/mux\"\n)\n\nfunc main() {\n\tapp := mux.NewRouter()\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t\tDebug:     true,\n\t\tLanguage:  language.EN,\n\t}\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\tapp.PathPrefix(\"/uploads/\").Handler(http.StripPrefix(\"/uploads/\", http.FileServer(http.Dir(\"./uploads\"))))\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tgo func() {\n\t\t_ = http.ListenAndServe(\":9033\", app)\n\t}()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/iris/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/iris\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/kataras/iris/v12\"\n)\n\nfunc main() {\n\tapp := iris.Default()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tIndexUrl: \"/\",\n\t\tDebug:    true,\n\t\tLanguage: language.CN,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\tapp.HandleDir(\"/uploads\", \"./uploads\", iris.DirOptions{\n\t\tIndexName: \"/index.html\",\n\t\tShowList:  false,\n\t})\n\n\t// you can custom your pages like:\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tgo func() {\n\t\t_ = app.Run(iris.Addr(\":8099\"))\n\t}()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n"
  },
  {
    "path": "examples/nethttp/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/nethttp\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/examples/datamodel\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n)\n\nfunc main() {\n\tr := http.NewServeMux()\n\n\teng := engine.Default()\n\n\tcfg := config.Config{\n\t\tEnv: config.EnvLocal,\n\t\tDatabases: config.DatabaseList{\n\t\t\t\"default\": {\n\t\t\t\tHost:            \"127.0.0.1\",\n\t\t\t\tPort:            \"3306\",\n\t\t\t\tUser:            \"root\",\n\t\t\t\tPwd:             \"root\",\n\t\t\t\tName:            \"godmin\",\n\t\t\t\tMaxIdleConns:    50,\n\t\t\t\tMaxOpenConns:    150,\n\t\t\t\tConnMaxLifetime: time.Hour,\n\t\t\t\tDriver:          config.DriverMysql,\n\t\t\t},\n\t\t},\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\t// customize a plugin\n\n\texamplePlugin := example.NewExample()\n\n\t// load from golang.Plugin\n\t//\n\t// examplePlugin := plugins.LoadFromPlugin(\"../datamodel/example.so\")\n\n\t// customize the login page\n\t// example: https://github.com/GoAdminGroup/demo.go-admin.cn/blob/master/main.go#L39\n\t//\n\t// template.AddComp(\"login\", datamodel.LoginPage)\n\n\t// load config from json file\n\t//\n\t// eng.AddConfigFromJSON(\"../datamodel/config.json\")\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddGenerators(datamodel.Generators).\n\t\tAddDisplayFilterXssJsFilter().\n\t\t// add generator, first parameter is the url prefix of table when visit.\n\t\t// example:\n\t\t//\n\t\t// \"user\" => http://localhost:9033/admin/info/user\n\t\t//\n\t\tAddGenerator(\"user\", datamodel.GetUserTable).\n\t\tAddPlugins(examplePlugin).\n\t\tUse(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\tworkDir, _ := os.Getwd()\n\tfilesDir := filepath.Join(workDir, \"uploads\")\n\tFileServer(r, \"/uploads\", http.Dir(filesDir))\n\n\t// you can custom your pages like:\n\n\teng.HTML(\"GET\", \"/admin\", datamodel.GetContent)\n\n\tgo func() {\n\t\t_ = http.ListenAndServe(\":3333\", r)\n\t}()\n\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n\n// FileServer conveniently sets up a http.FileServer handler to serve\n// static files from a http.FileSystem.\nfunc FileServer(r *http.ServeMux, path string, root http.FileSystem) {\n\tif strings.ContainsAny(path, \"{}*\") {\n\t\tpanic(\"FileServer does not permit URL parameters.\")\n\t}\n\n\tfs := http.StripPrefix(path, http.FileServer(root))\n\n\tif path != \"/\" && path[len(path)-1] != '/' {\n\t\tr.HandleFunc(\"GET \"+path, http.RedirectHandler(path+\"/\", http.StatusMovedPermanently).ServeHTTP)\n\t\tpath += \"/\"\n\t}\n\tpath += \"*\"\n\n\tr.HandleFunc(\"GET \"+path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tfs.ServeHTTP(w, r)\n\t}))\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/GoAdminGroup/go-admin\n\ngo 1.22.10\n\nrequire (\n\tgithub.com/360EntSecGroup-Skylar/excelize v1.4.1\n\tgithub.com/GoAdminGroup/html v0.0.1\n\tgithub.com/GoAdminGroup/themes v0.0.48\n\tgithub.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e\n\tgithub.com/agiledragon/gomonkey v2.0.2+incompatible\n\tgithub.com/astaxie/beego v1.12.1\n\tgithub.com/beego/beego/v2 v2.2.0\n\tgithub.com/buaazp/fasthttprouter v0.1.1\n\tgithub.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e\n\tgithub.com/gavv/httpexpect v2.0.0+incompatible\n\tgithub.com/gin-gonic/gin v1.3.0\n\tgithub.com/go-chi/chi v1.5.5\n\tgithub.com/go-sql-driver/mysql v1.8.1\n\tgithub.com/gobuffalo/buffalo v1.1.0\n\tgithub.com/gofiber/fiber/v2 v2.52.4\n\tgithub.com/gogf/gf v1.16.9\n\tgithub.com/gogf/gf/v2 v2.6.4\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/gorilla/mux v1.8.0\n\tgithub.com/kataras/iris/v12 v12.2.10\n\tgithub.com/labstack/echo/v4 v4.11.4\n\tgithub.com/lib/pq v1.10.5\n\tgithub.com/magiconair/properties v1.8.6\n\tgithub.com/mattn/go-sqlite3 v2.0.3+incompatible\n\tgithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b\n\tgithub.com/sclevine/agouti v3.0.0+incompatible\n\tgithub.com/stretchr/testify v1.9.0\n\tgithub.com/teambition/gear v1.27.3\n\tgithub.com/valyala/fasthttp v1.52.0\n\tgo.uber.org/zap v1.19.1\n\tgolang.org/x/crypto v0.31.0\n\tgolang.org/x/text v0.21.0\n\tgopkg.in/ini.v1 v1.67.0\n\tgopkg.in/natefinch/lumberjack.v2 v2.2.1\n\tgopkg.in/yaml.v2 v2.4.0\n\txorm.io/xorm v1.0.2\n)\n\nrequire (\n\tfilippo.io/edwards25519 v1.1.0 // indirect\n\tgithub.com/BurntSushi/toml v1.3.2 // indirect\n\tgithub.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 // indirect\n\tgithub.com/CloudyKit/jet/v6 v6.2.0 // indirect\n\tgithub.com/Joker/jade v1.1.3 // indirect\n\tgithub.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 // indirect\n\tgithub.com/ajg/form v1.5.1 // indirect\n\tgithub.com/andybalholm/brotli v1.1.0 // indirect\n\tgithub.com/aymerick/douceur v0.2.0 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28 // indirect\n\tgithub.com/clbanning/mxj/v2 v2.7.0 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/dustin/go-humanize v1.0.1 // indirect\n\tgithub.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect\n\tgithub.com/fatih/color v1.15.0 // indirect\n\tgithub.com/fatih/structs v1.1.0 // indirect\n\tgithub.com/felixge/httpsnoop v1.0.1 // indirect\n\tgithub.com/flosch/pongo2/v4 v4.0.2 // indirect\n\tgithub.com/fsnotify/fsnotify v1.7.0 // indirect\n\tgithub.com/gin-contrib/sse v0.1.0 // indirect\n\tgithub.com/go-http-utils/cookie v1.3.1 // indirect\n\tgithub.com/go-http-utils/negotiator v1.0.0 // indirect\n\tgithub.com/go-logr/logr v1.2.4 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/gobuffalo/envy v1.10.2 // indirect\n\tgithub.com/gobuffalo/events v1.4.3 // indirect\n\tgithub.com/gobuffalo/flect v1.0.0 // indirect\n\tgithub.com/gobuffalo/github_flavored_markdown v1.1.3 // indirect\n\tgithub.com/gobuffalo/grift v1.5.2 // indirect\n\tgithub.com/gobuffalo/helpers v0.6.7 // indirect\n\tgithub.com/gobuffalo/logger v1.0.7 // indirect\n\tgithub.com/gobuffalo/meta v0.3.3 // indirect\n\tgithub.com/gobuffalo/nulls v0.4.2 // indirect\n\tgithub.com/gobuffalo/plush/v4 v4.1.18 // indirect\n\tgithub.com/gobuffalo/refresh v1.13.3 // indirect\n\tgithub.com/gobuffalo/tags/v3 v3.1.4 // indirect\n\tgithub.com/gobuffalo/validate/v3 v3.3.3 // indirect\n\tgithub.com/gofrs/uuid v4.2.0+incompatible // indirect\n\tgithub.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/golang/snappy v0.0.4 // indirect\n\tgithub.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 // indirect\n\tgithub.com/gomodule/redigo v2.0.0+incompatible // indirect\n\tgithub.com/google/go-querystring v1.1.0 // indirect\n\tgithub.com/gorilla/css v1.0.0 // indirect\n\tgithub.com/gorilla/handlers v1.5.1 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.2.1 // indirect\n\tgithub.com/gorilla/websocket v1.5.1 // indirect\n\tgithub.com/grokify/html-strip-tags-go v0.0.1 // indirect\n\tgithub.com/hashicorp/golang-lru v0.5.4 // indirect\n\tgithub.com/imkira/go-interpol v1.1.0 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.0.1 // indirect\n\tgithub.com/iris-contrib/schema v0.0.6 // indirect\n\tgithub.com/joho/godotenv v1.4.0 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kataras/blocks v0.0.8 // indirect\n\tgithub.com/kataras/golog v0.1.11 // indirect\n\tgithub.com/kataras/pio v0.0.13 // indirect\n\tgithub.com/kataras/sitemap v0.0.6 // indirect\n\tgithub.com/kataras/tunnel v0.0.4 // indirect\n\tgithub.com/klauspost/compress v1.17.6 // indirect\n\tgithub.com/labstack/gommon v0.4.2 // indirect\n\tgithub.com/mailgun/raymond/v2 v2.0.48 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mattn/go-runewidth v0.0.15 // indirect\n\tgithub.com/microcosm-cc/bluemonday v1.0.26 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect\n\tgithub.com/monoculum/formam v3.5.5+incompatible // indirect\n\tgithub.com/moul/http2curl v1.0.0 // indirect\n\tgithub.com/olekukonko/tablewriter v0.0.5 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n\tgithub.com/prometheus/client_model v0.5.0 // indirect\n\tgithub.com/prometheus/common v0.48.0 // indirect\n\tgithub.com/prometheus/procfs v0.12.0 // indirect\n\tgithub.com/rivo/uniseg v0.4.4 // indirect\n\tgithub.com/rogpeppe/go-internal v1.10.0 // indirect\n\tgithub.com/russross/blackfriday/v2 v2.1.0 // indirect\n\tgithub.com/schollz/closestmatch v2.1.0+incompatible // indirect\n\tgithub.com/sergi/go-diff v1.2.0 // indirect\n\tgithub.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect\n\tgithub.com/sirupsen/logrus v1.9.0 // indirect\n\tgithub.com/smartystreets/goconvey v1.8.1 // indirect\n\tgithub.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d // indirect\n\tgithub.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e // indirect\n\tgithub.com/spf13/cobra v1.6.1 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgithub.com/syndtr/goleveldb v1.0.0 // indirect\n\tgithub.com/tdewolff/minify/v2 v2.20.14 // indirect\n\tgithub.com/tdewolff/parse/v2 v2.7.8 // indirect\n\tgithub.com/teambition/trie-mux v1.5.2 // indirect\n\tgithub.com/ugorji/go/codec v1.2.12 // indirect\n\tgithub.com/valyala/bytebufferpool v1.0.0 // indirect\n\tgithub.com/valyala/fasttemplate v1.2.2 // indirect\n\tgithub.com/valyala/tcplisten v1.0.0 // indirect\n\tgithub.com/vmihailenco/msgpack/v5 v5.4.1 // indirect\n\tgithub.com/vmihailenco/tagparser/v2 v2.0.0 // indirect\n\tgithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect\n\tgithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect\n\tgithub.com/xeipuuv/gojsonschema v1.2.0 // indirect\n\tgithub.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect\n\tgithub.com/yosssi/ace v0.0.5 // indirect\n\tgithub.com/yudai/gojsondiff v1.0.0 // indirect\n\tgithub.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect\n\tgithub.com/yudai/pp v2.0.1+incompatible // indirect\n\tgo.opentelemetry.io/otel v1.14.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.14.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.14.0 // indirect\n\tgo.uber.org/atomic v1.9.0 // indirect\n\tgo.uber.org/multierr v1.7.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect\n\tgolang.org/x/net v0.21.0 // indirect\n\tgolang.org/x/sys v0.28.0 // indirect\n\tgolang.org/x/term v0.27.0 // indirect\n\tgolang.org/x/time v0.5.0 // indirect\n\tgoogle.golang.org/protobuf v1.32.0 // indirect\n\tgopkg.in/go-playground/assert.v1 v1.2.1 // indirect\n\tgopkg.in/go-playground/validator.v8 v8.18.2 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\txorm.io/builder v0.3.7 // indirect\n)\n\nreplace github.com/ugorji/go => github.com/ugorji/go v1.2.11\n"
  },
  {
    "path": "go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=\nfilippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=\nfilippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=\ngitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=\ngitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=\ngithub.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0gHwBYyfo5Jcjv/Ks=\ngithub.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=\ngithub.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=\ngithub.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=\ngithub.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=\ngithub.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c=\ngithub.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno=\ngithub.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME=\ngithub.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4=\ngithub.com/GoAdminGroup/html v0.0.1 h1:SdWNWl4OKPsvDk2GDp5ZKD6ceWoN8n4Pj6cUYxavUd0=\ngithub.com/GoAdminGroup/html v0.0.1/go.mod h1:A1laTJaOx8sQ64p2dE8IqtstDeCNBHEazrEp7hR5VvM=\ngithub.com/GoAdminGroup/themes v0.0.48 h1:OveEEoFBCBTU5kNicqnvs0e/pL6uZKNQU1RAP9kmNFA=\ngithub.com/GoAdminGroup/themes v0.0.48/go.mod h1:w/5P0WCmM8iv7DYE5scIT8AODYMoo6zj/bVlzAbgOaU=\ngithub.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc=\ngithub.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=\ngithub.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk=\ngithub.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM=\ngithub.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=\ngithub.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e h1:n+DcnTNkQnHlwpsrHoQtkrJIO7CBx029fw6oR4vIob4=\ngithub.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e/go.mod h1:Bdzq+51GR4/0DIhaICZEOm+OHvXGwwB2trKZ8B4Y6eQ=\ngithub.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM=\ngithub.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0=\ngithub.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM=\ngithub.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=\ngithub.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=\ngithub.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw=\ngithub.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=\ngithub.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=\ngithub.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=\ngithub.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=\ngithub.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/astaxie/beego v1.12.1 h1:dfpuoxpzLVgclveAXe4PyNKqkzgm5zF4tgF2B3kkM2I=\ngithub.com/astaxie/beego v1.12.1/go.mod h1:kPBWpSANNbSdIqOc8SUL9h+1oyBMZhROeYsXQDbidWQ=\ngithub.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=\ngithub.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=\ngithub.com/beego/beego/v2 v2.2.0 h1:x2yCNL9x74vqAXRdFBw5HCzB8AwownALpBWEOitivow=\ngithub.com/beego/beego/v2 v2.2.0/go.mod h1:kqiwel3TqpZHYtI08GWnleCtBc0LqtawsmfFDxY9POY=\ngithub.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=\ngithub.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=\ngithub.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=\ngithub.com/buaazp/fasthttprouter v0.1.1 h1:4oAnN0C3xZjylvZJdP35cxfclyn4TYkW6Y+DSvS+h8Q=\ngithub.com/buaazp/fasthttprouter v0.1.1/go.mod h1:h/Ap5oRVLeItGKTVBb+heQPks+HdIUtGmI4H5WCYijM=\ngithub.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28 h1:LdXxtjzvZYhhUaonAaAKArG3pyC67kGL3YY+6hGG8G4=\ngithub.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=\ngithub.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=\ngithub.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=\ngithub.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=\ngithub.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=\ngithub.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=\ngithub.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e h1:LzwWXEScfcTu7vUZNlDDWDARoSGEtvlDKK2BYHowNeE=\ngithub.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=\ngithub.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0=\ngithub.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\ngithub.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=\ngithub.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=\ngithub.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=\ngithub.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=\ngithub.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=\ngithub.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=\ngithub.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=\ngithub.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=\ngithub.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc=\ngithub.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8=\ngithub.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=\ngithub.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=\ngithub.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=\ngithub.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=\ngithub.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw=\ngithub.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8=\ngithub.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc=\ngithub.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=\ngithub.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=\ngithub.com/gin-gonic/gin v1.3.0 h1:kCmZyPklC0gVdL728E6Aj20uYBJV93nj/TkwBTKhFbs=\ngithub.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=\ngithub.com/go-chi/chi v1.5.5 h1:vOB/HbEMt9QqBqErz07QehcOKHaWFtuj87tTDVz2qXE=\ngithub.com/go-chi/chi v1.5.5/go.mod h1:C9JqLr3tIYjDOZpzn+BCuxY8z8vmca43EeMgyZt7irw=\ngithub.com/go-http-utils/cookie v1.3.1 h1:GCdTeqVV5vDcjP7LrgYpH8pbt3dOYKS+Wrs7Jo3/k/w=\ngithub.com/go-http-utils/cookie v1.3.1/go.mod h1:ATl4rfG3bEemjiVa+8WIfgNcBUWdYBTasfXKjJ3Avt8=\ngithub.com/go-http-utils/negotiator v1.0.0 h1:Qp1zofD6Nw7KXApXa3pAjehP06Js0ILguEBCnHhZeVA=\ngithub.com/go-http-utils/negotiator v1.0.0/go.mod h1:mTQe1sH0XhdFkeDiWpCY3QSk7Apo5jwOlIwLWJbJe2c=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=\ngithub.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=\ngithub.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=\ngithub.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=\ngithub.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=\ngithub.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gobuffalo/buffalo v1.1.0 h1:6y1fUC47QWevaM1ImukJFHNgxiRIT+Y74VcP4ZQaz80=\ngithub.com/gobuffalo/buffalo v1.1.0/go.mod h1:lLsx9Y8bFYu9uvQyIEB3M0QA908ChHUPjwOGumZWARU=\ngithub.com/gobuffalo/envy v1.10.2 h1:EIi03p9c3yeuRCFPOKcSfajzkLb3hrRjEpHGI8I2Wo4=\ngithub.com/gobuffalo/envy v1.10.2/go.mod h1:qGAGwdvDsaEtPhfBzb3o0SfDea8ByGn9j8bKmVft9z8=\ngithub.com/gobuffalo/events v1.4.3 h1:JYDq7NbozP10zaN9Ijfem6Ozox2KacU2fU38RyquXM8=\ngithub.com/gobuffalo/events v1.4.3/go.mod h1:2BwfpV5X63t8xkUcVqIv4IbyAobJazRSVu1F1pgf3rc=\ngithub.com/gobuffalo/flect v0.3.0/go.mod h1:5pf3aGnsvqvCj50AVni7mJJF8ICxGZ8HomberC3pXLE=\ngithub.com/gobuffalo/flect v1.0.0 h1:eBFmskjXZgAOagiTXJH25Nt5sdFwNRcb8DKZsIsAUQI=\ngithub.com/gobuffalo/flect v1.0.0/go.mod h1:l9V6xSb4BlXwsxEMj3FVEub2nkdQjWhPvD8XTTlHPQc=\ngithub.com/gobuffalo/github_flavored_markdown v1.1.3 h1:rSMPtx9ePkFB22vJ+dH+m/EUBS8doQ3S8LeEXcdwZHk=\ngithub.com/gobuffalo/github_flavored_markdown v1.1.3/go.mod h1:IzgO5xS6hqkDmUh91BW/+Qxo/qYnvfzoz3A7uLkg77I=\ngithub.com/gobuffalo/grift v1.5.2 h1:mC0vHRs+nXz+JhkH3sv+rVnnTQRDXrUrOXOPYpgPjpo=\ngithub.com/gobuffalo/grift v1.5.2/go.mod h1:Uf/3T2AR1Vv+t84EPmxCjqQ8oyJwXs0FAoLMFUn/JVs=\ngithub.com/gobuffalo/helpers v0.6.7 h1:C9CedoRSfgWg2ZoIkVXgjI5kgmSpL34Z3qdnzpfNVd8=\ngithub.com/gobuffalo/helpers v0.6.7/go.mod h1:j0u1iC1VqlCaJEEVkZN8Ia3TEzfj/zoXANqyJExTMTA=\ngithub.com/gobuffalo/here v0.6.7/go.mod h1:vuCfanjqckTuRlqAitJz6QC4ABNnS27wLb816UhsPcc=\ngithub.com/gobuffalo/httptest v1.5.2 h1:GpGy520SfY1QEmyPvaqmznTpG4gEQqQ82HtHqyNEreM=\ngithub.com/gobuffalo/httptest v1.5.2/go.mod h1:FA23yjsWLGj92mVV74Qtc8eqluc11VqcWr8/C1vxt4g=\ngithub.com/gobuffalo/logger v1.0.7 h1:LTLwWelETXDYyqF/ASf0nxaIcdEOIJNxRokPcfI/xbU=\ngithub.com/gobuffalo/logger v1.0.7/go.mod h1:u40u6Bq3VVvaMcy5sRBclD8SXhBYPS0Qk95ubt+1xJM=\ngithub.com/gobuffalo/meta v0.3.3 h1:GwPWdbdnp4JrKASvMLa03OtmzISq7z/nE7T6aMqzoYM=\ngithub.com/gobuffalo/meta v0.3.3/go.mod h1:o4B099IUFUfK4555Guqxz1zHAqyuUQ/KtHXi8WvVeFE=\ngithub.com/gobuffalo/nulls v0.4.2 h1:GAqBR29R3oPY+WCC7JL9KKk9erchaNuV6unsOSZGQkw=\ngithub.com/gobuffalo/nulls v0.4.2/go.mod h1:EElw2zmBYafU2R9W4Ii1ByIj177wA/pc0JdjtD0EsH8=\ngithub.com/gobuffalo/plush/v4 v4.1.18 h1:bnPjdMTEUQHqj9TNX2Ck3mxEXYZa+0nrFMNM07kpX9g=\ngithub.com/gobuffalo/plush/v4 v4.1.18/go.mod h1:xi2tJIhFI4UdzIL8sxZtzGYOd2xbBpcFbLZlIPGGZhU=\ngithub.com/gobuffalo/refresh v1.13.3 h1:HYQlI6RiqWUf2yzCXvUHAYqm9M9/teVnox+mjzo/9rQ=\ngithub.com/gobuffalo/refresh v1.13.3/go.mod h1:NkzgLKZGk5suOvgvOD0/VALog0fH29Ib7fwym9JmRxA=\ngithub.com/gobuffalo/tags/v3 v3.1.4 h1:X/ydLLPhgXV4h04Hp2xlbI2oc5MDaa7eub6zw8oHjsM=\ngithub.com/gobuffalo/tags/v3 v3.1.4/go.mod h1:ArRNo3ErlHO8BtdA0REaZxijuWnWzF6PUXngmMXd2I0=\ngithub.com/gobuffalo/validate/v3 v3.3.3 h1:o7wkIGSvZBYBd6ChQoLxkz2y1pfmhbI4jNJYh6PuNJ4=\ngithub.com/gobuffalo/validate/v3 v3.3.3/go.mod h1:YC7FsbJ/9hW/VjQdmXPvFqvRis4vrRYFxr69WiNZw6g=\ngithub.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=\ngithub.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=\ngithub.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM=\ngithub.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=\ngithub.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=\ngithub.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=\ngithub.com/gogf/gf v1.16.9 h1:Q803UmmRo59+Ws08sMVFOcd8oNpkSWL9vS33hlo/Cyk=\ngithub.com/gogf/gf v1.16.9/go.mod h1:8Q/kw05nlVRp+4vv7XASBsMe9L1tsVKiGoeP2AHnlkk=\ngithub.com/gogf/gf/v2 v2.6.4 h1:w7HXdH9mcTsn/aE13CkaDbRArmAL1KS3FuQqDi6u74Y=\ngithub.com/gogf/gf/v2 v2.6.4/go.mod h1:x2XONYcI4hRQ/4gMNbWHmZrNzSEIg20s2NULbzom5k0=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=\ngithub.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=\ngithub.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 h1:k4Tw0nt6lwro3Uin8eqoET7MDA4JnT8YgbCjc/g5E3k=\ngithub.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=\ngithub.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=\ngithub.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=\ngithub.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=\ngithub.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=\ngithub.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=\ngithub.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=\ngithub.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=\ngithub.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=\ngithub.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=\ngithub.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=\ngithub.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=\ngithub.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI=\ngithub.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=\ngithub.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=\ngithub.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0=\ngithub.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk=\ngithub.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA=\ngithub.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=\ngithub.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/iris-contrib/httpexpect/v2 v2.15.2 h1:T9THsdP1woyAqKHwjkEsbCnMefsAFvk8iJJKokcJ3Go=\ngithub.com/iris-contrib/httpexpect/v2 v2.15.2/go.mod h1:JLDgIqnFy5loDSUv1OA2j0mb6p/rDhiCqigP22Uq9xE=\ngithub.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw=\ngithub.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA=\ngithub.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=\ngithub.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=\ngithub.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=\ngithub.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kataras/blocks v0.0.8 h1:MrpVhoFTCR2v1iOOfGng5VJSILKeZZI+7NGfxEh3SUM=\ngithub.com/kataras/blocks v0.0.8/go.mod h1:9Jm5zx6BB+06NwA+OhTbHW1xkMOYxahnqTN5DveZ2Yg=\ngithub.com/kataras/golog v0.1.11 h1:dGkcCVsIpqiAMWTlebn/ZULHxFvfG4K43LF1cNWSh20=\ngithub.com/kataras/golog v0.1.11/go.mod h1:mAkt1vbPowFUuUGvexyQ5NFW6djEgGyxQBIARJ0AH4A=\ngithub.com/kataras/iris/v12 v12.2.10 h1:rEJVM7qMoyhv8wpgkA1yGxibFcONE0jkJ70LFLibTAA=\ngithub.com/kataras/iris/v12 v12.2.10/go.mod h1:z4+E+kLMqZ7U4WtDsYfFnG7BjMTXLkdzMAXLVMLnMNs=\ngithub.com/kataras/pio v0.0.13 h1:x0rXVX0fviDTXOOLOmr4MUxOabu1InVSTu5itF8CXCM=\ngithub.com/kataras/pio v0.0.13/go.mod h1:k3HNuSw+eJ8Pm2lA4lRhg3DiCjVgHlP8hmXApSej3oM=\ngithub.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY=\ngithub.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4=\ngithub.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA=\ngithub.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=\ngithub.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8=\ngithub.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRyEbQJfxen8=\ngithub.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=\ngithub.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=\ngithub.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=\ngithub.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=\ngithub.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=\ngithub.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=\ngithub.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw=\ngithub.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=\ngithub.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=\ngithub.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=\ngithub.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=\ngithub.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=\ngithub.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=\ngithub.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=\ngithub.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=\ngithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=\ngithub.com/microcosm-cc/bluemonday v1.0.20/go.mod h1:yfBmMi8mxvaZut3Yytv+jTXRY8mxyjJ0/kQBTElld50=\ngithub.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58=\ngithub.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=\ngithub.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=\ngithub.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=\ngithub.com/monoculum/formam v3.5.5+incompatible h1:iPl5csfEN96G2N2mGu8V/ZB62XLf9ySTpC8KRH6qXec=\ngithub.com/monoculum/formam v3.5.5+incompatible/go.mod h1:RKgILGEJq24YyJ2ban8EO0RUVSJlF1pGsEvoLEACr/Q=\ngithub.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs=\ngithub.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=\ngithub.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=\ngithub.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=\ngithub.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=\ngithub.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=\ngithub.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=\ngithub.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=\ngithub.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\ngithub.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=\ngithub.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=\ngithub.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=\ngithub.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=\ngithub.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=\ngithub.com/psanford/memfs v0.0.0-20210214183328-a001468d78ef h1:NKxTG6GVGbfMXc2mIk+KphcH6hagbVXhcFkbTgYleTI=\ngithub.com/psanford/memfs v0.0.0-20210214183328-a001468d78ef/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI=\ngithub.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=\ngithub.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=\ngithub.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=\ngithub.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=\ngithub.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=\ngithub.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo=\ngithub.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=\ngithub.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk=\ngithub.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g=\ngithub.com/sclevine/agouti v3.0.0+incompatible h1:8IBJS6PWz3uTlMP3YBIR5f+KAldcGuOeFkFbUWfBgK4=\ngithub.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=\ngithub.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=\ngithub.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=\ngithub.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=\ngithub.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=\ngithub.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=\ngithub.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=\ngithub.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=\ngithub.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY=\ngithub.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=\ngithub.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=\ngithub.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60=\ngithub.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d h1:yKm7XZV6j9Ev6lojP2XaIshpT4ymkqhMeSghO5Ps00E=\ngithub.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=\ngithub.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8=\ngithub.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=\ngithub.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=\ngithub.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=\ngithub.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=\ngithub.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=\ngithub.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=\ngithub.com/tdewolff/minify/v2 v2.20.14 h1:sktSuVixRwk0ryQjqvKBu/uYS+MWmkwEFMEWtFZ+TdE=\ngithub.com/tdewolff/minify/v2 v2.20.14/go.mod h1:qnIJbnG2dSzk7LIa/UUwgN2OjS8ir6RRlqc0T/1q2xY=\ngithub.com/tdewolff/parse/v2 v2.7.8 h1:1cnVqa8L63xFkc2vfRsZTM6Qy35nJpTvQ2Uvdv3vbvs=\ngithub.com/tdewolff/parse/v2 v2.7.8/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA=\ngithub.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=\ngithub.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo=\ngithub.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=\ngithub.com/teambition/gear v1.27.3 h1:iWUOJYdBwxU+SZP5aZ2ZYR5FnRGmdgrMbbSpOCZo0go=\ngithub.com/teambition/gear v1.27.3/go.mod h1:d3Nmr6rRPnH5lYSK33W9IDhsaxp/8n14vRrUZu9dP9c=\ngithub.com/teambition/trie-mux v1.5.2 h1:ALTagFwKZXkn1vfSRlODlmoZg+NMeWAm4dyBPQI6a8w=\ngithub.com/teambition/trie-mux v1.5.2/go.mod h1:0Woh4KOHSN9bkJ66eWmLs8ltrEKw+fnZbFaHFfbMrtc=\ngithub.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=\ngithub.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=\ngithub.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=\ngithub.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=\ngithub.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0=\ngithub.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ=\ngithub.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=\ngithub.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=\ngithub.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=\ngithub.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=\ngithub.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=\ngithub.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=\ngithub.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=\ngithub.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=\ngithub.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY=\ngithub.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=\ngithub.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA=\ngithub.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0=\ngithub.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA=\ngithub.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=\ngithub.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M=\ngithub.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=\ngithub.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI=\ngithub.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngithub.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=\ngo.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=\ngo.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=\ngo.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=\ngo.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=\ngo.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=\ngo.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM=\ngo.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=\ngo.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=\ngo.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=\ngo.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4=\ngo.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec=\ngo.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=\ngo.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=\ngo.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=\ngolang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=\ngolang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=\ngolang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=\ngolang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=\ngolang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=\ngolang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=\ngolang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=\ngolang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=\ngolang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200117065230-39095c1d176c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\ngoogle.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=\ngopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=\ngopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ=\ngopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=\ngopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=\ngopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\ngopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nmoul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs=\nmoul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE=\nxorm.io/builder v0.3.7 h1:2pETdKRK+2QG4mLX4oODHEhn5Z8j1m8sXa7jfu+/SZI=\nxorm.io/builder v0.3.7/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE=\nxorm.io/xorm v1.0.2 h1:kZlCh9rqd1AzGwWitcrEEqHE1h1eaZE/ujU5/2tWEtg=\nxorm.io/xorm v1.0.2/go.mod h1:o4vnEsQ5V2F1/WK6w4XTwmiWJeGj82tqjAnHe44wVHY=\n"
  },
  {
    "path": "modules/auth/auth.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage auth\n\nimport (\n\t\"log\"\n\t\"sync\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\n// Auth get the user model from Context.\nfunc Auth(ctx *context.Context) models.UserModel {\n\treturn ctx.User().(models.UserModel)\n}\n\n// Check check the password and username and return the user model.\nfunc Check(password string, username string, conn db.Connection) (user models.UserModel, ok bool) {\n\n\tuser = models.User().SetConn(conn).FindByUserName(username)\n\n\tif user.IsEmpty() {\n\t\tok = false\n\t} else {\n\t\tif comparePassword(password, user.Password) {\n\t\t\tok = true\n\t\t\tuser = user.WithRoles().WithPermissions().WithMenus()\n\t\t\tuser.UpdatePwd(EncodePassword([]byte(password)))\n\t\t} else {\n\t\t\tok = false\n\t\t}\n\t}\n\treturn\n}\n\nfunc comparePassword(comPwd, pwdHash string) bool {\n\terr := bcrypt.CompareHashAndPassword([]byte(pwdHash), []byte(comPwd))\n\treturn err == nil\n}\n\n// EncodePassword encode the password.\nfunc EncodePassword(pwd []byte) string {\n\thash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn string(hash)\n}\n\n// SetCookie set the cookie.\nfunc SetCookie(ctx *context.Context, user models.UserModel, conn db.Connection) error {\n\tses, err := InitSession(ctx, conn)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn ses.Add(\"user_id\", user.Id)\n}\n\n// DelCookie delete the cookie from Context.\nfunc DelCookie(ctx *context.Context, conn db.Connection) error {\n\tses, err := InitSession(ctx, conn)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn ses.Clear()\n}\n\ntype TokenService struct {\n\ttokens CSRFToken\n\tlock   sync.Mutex\n\tconn   db.Connection\n}\n\nfunc (s *TokenService) Name() string {\n\treturn TokenServiceKey\n}\n\nfunc InitCSRFTokenSrv(conn db.Connection) (string, service.Service) {\n\tlist, err := db.WithDriver(conn).Table(\"goadmin_session\").\n\t\tWhere(\"values\", \"=\", \"__csrf_token__\").\n\t\tAll()\n\tif db.CheckError(err, db.QUERY) {\n\t\tlogger.Error(\"csrf token query from database error: \", err)\n\t}\n\ttokens := make(CSRFToken, len(list))\n\tfor i := 0; i < len(list); i++ {\n\t\ttokens[i] = list[i][\"sid\"].(string)\n\t}\n\treturn TokenServiceKey, &TokenService{\n\t\ttokens: tokens,\n\t\tconn:   conn,\n\t}\n}\n\nconst (\n\tTokenServiceKey = \"token_csrf_helper\"\n\tServiceKey      = \"auth\"\n)\n\nfunc GetTokenService(s interface{}) *TokenService {\n\tif srv, ok := s.(*TokenService); ok {\n\t\treturn srv\n\t}\n\tlog.Panicf(\"wrong service: %+v\", s)\n\treturn nil\n}\n\n// AddToken add the token to the CSRFToken.\nfunc (s *TokenService) AddToken() string {\n\ts.lock.Lock()\n\tdefer s.lock.Unlock()\n\ttokenStr := modules.Uuid()\n\ts.tokens = append(s.tokens, tokenStr)\n\t_, err := db.WithDriver(s.conn).Table(\"goadmin_session\").Insert(dialect.H{\n\t\t\"sid\":    tokenStr,\n\t\t\"values\": \"__csrf_token__\",\n\t})\n\tif db.CheckError(err, db.INSERT) {\n\t\tlogger.Error(\"csrf token insert into database error: \", err)\n\t}\n\treturn tokenStr\n}\n\n// CheckToken check the given token with tokens in the CSRFToken, if exist\n// return true.\nfunc (s *TokenService) CheckToken(toCheckToken string) (ok bool) {\n\tdefer func() {\n\t\tif ok {\n\t\t\terr := db.WithDriver(s.conn).Table(\"goadmin_session\").\n\t\t\t\tWhere(\"sid\", \"=\", toCheckToken).\n\t\t\t\tWhere(\"values\", \"=\", \"__csrf_token__\").\n\t\t\t\tDelete()\n\t\t\tif db.CheckError(err, db.DELETE) {\n\t\t\t\tlogger.Error(\"csrf token delete from database error: \", err)\n\t\t\t}\n\t\t}\n\t}()\n\n\tfor i := 0; i < len(s.tokens); i++ {\n\t\tif (s.tokens)[i] == toCheckToken {\n\t\t\ts.tokens = append((s.tokens)[:i], (s.tokens)[i+1:]...)\n\t\t\tok = true\n\t\t\treturn\n\t\t}\n\t}\n\n\titem, err := db.WithDriver(s.conn).Table(\"goadmin_session\").\n\t\tWhere(\"sid\", \"=\", toCheckToken).\n\t\tWhere(\"values\", \"=\", \"__csrf_token__\").\n\t\tFirst()\n\tif item != nil && err == nil {\n\t\tok = true\n\t\treturn\n\t}\n\treturn\n}\n\n// CSRFToken is type of a csrf token list.\ntype CSRFToken []string\n\ntype Processor func(ctx *context.Context) (model models.UserModel, exist bool, msg string)\n\ntype Service struct {\n\tP Processor\n}\n\nfunc (s *Service) Name() string {\n\treturn \"auth\"\n}\n\nfunc GetService(s interface{}) *Service {\n\tif srv, ok := s.(*Service); ok {\n\t\treturn srv\n\t}\n\tlog.Panicf(\"wrong service: %+v\", s)\n\treturn nil\n}\n\nfunc NewService(processor Processor) *Service {\n\treturn &Service{\n\t\tP: processor,\n\t}\n}\n"
  },
  {
    "path": "modules/auth/auth_test.go",
    "content": "package auth\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestEncodePassword(t *testing.T) {\n\tpwd := EncodePassword([]byte(\"123456\"))\n\tassert.Equal(t, comparePassword(\"123456\", pwd), true)\n}\n"
  },
  {
    "path": "modules/auth/middleware.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage auth\n\nimport (\n\t\"net/http\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/page\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// Invoker contains the callback functions which are used\n// in the route middleware.\ntype Invoker struct {\n\tprefix                 string\n\tauthFailCallback       MiddlewareCallback\n\tpermissionDenyCallback MiddlewareCallback\n\tconn                   db.Connection\n}\n\n// Middleware is the default auth middleware of plugins.\nfunc Middleware(conn db.Connection) context.Handler {\n\treturn DefaultInvoker(conn).Middleware()\n}\n\n// DefaultInvoker return a default Invoker.\nfunc DefaultInvoker(conn db.Connection) *Invoker {\n\treturn &Invoker{\n\t\tprefix: config.Prefix(),\n\t\tauthFailCallback: func(ctx *context.Context) {\n\t\t\tif ctx.Request.URL.Path == config.Url(config.GetLoginUrl()) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ctx.Request.URL.Path == config.Url(\"/logout\") {\n\t\t\t\tctx.Write(302, map[string]string{\n\t\t\t\t\t\"Location\": config.Url(config.GetLoginUrl()),\n\t\t\t\t}, ``)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tparam := \"\"\n\t\t\tif ref := ctx.Referer(); ref != \"\" {\n\t\t\t\tparam = \"?ref=\" + url.QueryEscape(ref)\n\t\t\t}\n\n\t\t\tu := config.Url(config.GetLoginUrl() + param)\n\t\t\t_, err := ctx.Request.Cookie(DefaultCookieKey)\n\t\t\treferer := ctx.Referer()\n\n\t\t\tif (ctx.Headers(constant.PjaxHeader) == \"\" && ctx.Method() != \"GET\") ||\n\t\t\t\terr != nil ||\n\t\t\t\treferer == \"\" {\n\t\t\t\tctx.Write(302, map[string]string{\n\t\t\t\t\t\"Location\": u,\n\t\t\t\t}, ``)\n\t\t\t} else {\n\t\t\t\tmsg := language.Get(\"login overdue, please login again\")\n\t\t\t\tctx.HTML(http.StatusOK, `<script>\n\tif (typeof(swal) === \"function\") {\n\t\tswal({\n\t\t\ttype: \"info\",\n\t\t\ttitle: \"`+language.Get(\"login info\")+`\",\n\t\t\ttext: \"`+msg+`\",\n\t\t\tshowCancelButton: false,\n\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\tconfirmButtonText: '`+language.Get(\"got it\")+`',\n        })\n\t\tsetTimeout(function(){ location.href = \"`+u+`\"; }, 3000);\n\t} else {\n\t\talert(\"`+msg+`\")\n\t\tlocation.href = \"`+u+`\"\n    }\n</script>`)\n\t\t\t}\n\t\t},\n\t\tpermissionDenyCallback: func(rawCtx *context.Context) {\n\t\t\tif rawCtx.Headers(constant.PjaxHeader) == \"\" && rawCtx.Method() != \"GET\" {\n\t\t\t\trawCtx.JSON(http.StatusForbidden, map[string]interface{}{\n\t\t\t\t\t\"code\": http.StatusForbidden,\n\t\t\t\t\t\"msg\":  language.Get(errors.PermissionDenied),\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tpage.SetPageContent(rawCtx, Auth(rawCtx), func(ctx interface{}) (types.Panel, error) {\n\t\t\t\t\treturn template2.WarningPanel(rawCtx, errors.PermissionDenied, template2.NoPermission403Page), nil\n\t\t\t\t}, conn)\n\t\t\t}\n\t\t},\n\t\tconn: conn,\n\t}\n}\n\n// SetPrefix return the default Invoker with the given prefix.\nfunc SetPrefix(prefix string, conn db.Connection) *Invoker {\n\ti := DefaultInvoker(conn)\n\ti.prefix = prefix\n\treturn i\n}\n\n// SetAuthFailCallback set the authFailCallback of Invoker.\nfunc (invoker *Invoker) SetAuthFailCallback(callback MiddlewareCallback) *Invoker {\n\tinvoker.authFailCallback = callback\n\treturn invoker\n}\n\n// SetPermissionDenyCallback set the permissionDenyCallback of Invoker.\nfunc (invoker *Invoker) SetPermissionDenyCallback(callback MiddlewareCallback) *Invoker {\n\tinvoker.permissionDenyCallback = callback\n\treturn invoker\n}\n\n// MiddlewareCallback is type of callback function.\ntype MiddlewareCallback func(ctx *context.Context)\n\n// Middleware get the auth middleware from Invoker.\nfunc (invoker *Invoker) Middleware() context.Handler {\n\treturn func(ctx *context.Context) {\n\t\tuser, authOk, permissionOk := Filter(ctx, invoker.conn)\n\n\t\tif authOk && permissionOk {\n\t\t\tctx.SetUserValue(\"user\", user)\n\t\t\tctx.Next()\n\t\t\treturn\n\t\t}\n\n\t\tif !authOk {\n\t\t\tinvoker.authFailCallback(ctx)\n\t\t\tctx.Abort()\n\t\t\treturn\n\t\t}\n\n\t\tif !permissionOk {\n\t\t\tctx.SetUserValue(\"user\", user)\n\t\t\tinvoker.permissionDenyCallback(ctx)\n\t\t\tctx.Abort()\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Filter retrieve the user model from Context and check the permission\n// at the same time.\nfunc Filter(ctx *context.Context, conn db.Connection) (models.UserModel, bool, bool) {\n\tvar (\n\t\tid float64\n\t\tok bool\n\n\t\tuser     = models.User()\n\t\tses, err = InitSession(ctx, conn)\n\t)\n\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"retrieve auth user failed %+v\", err)\n\t\treturn user, false, false\n\t}\n\n\tif id, ok = ses.Get(\"user_id\").(float64); !ok {\n\t\treturn user, false, false\n\t}\n\n\tuser, ok = GetCurUserByID(int64(id), conn)\n\n\tif !ok {\n\t\treturn user, false, false\n\t}\n\n\treturn user, true, CheckPermissions(user, ctx.Request.URL.String(), ctx.Method(), ctx.PostForm())\n}\n\nconst defaultUserIDSesKey = \"user_id\"\n\n// GetUserID return the user id from the session.\nfunc GetUserID(sesKey string, conn db.Connection) int64 {\n\tid, err := GetSessionByKey(sesKey, defaultUserIDSesKey, conn)\n\tif err != nil {\n\t\tlogger.Error(\"retrieve auth user failed\", err)\n\t\treturn -1\n\t}\n\tif idFloat64, ok := id.(float64); ok {\n\t\treturn int64(idFloat64)\n\t}\n\treturn -1\n}\n\n// GetCurUser return the user model.\nfunc GetCurUser(sesKey string, conn db.Connection) (user models.UserModel, ok bool) {\n\n\tif sesKey == \"\" {\n\t\tok = false\n\t\treturn\n\t}\n\n\tid := GetUserID(sesKey, conn)\n\tif id == -1 {\n\t\tok = false\n\t\treturn\n\t}\n\treturn GetCurUserByID(id, conn)\n}\n\n// GetCurUserByID return the user model of given user id.\nfunc GetCurUserByID(id int64, conn db.Connection) (user models.UserModel, ok bool) {\n\n\tuser = models.User().SetConn(conn).Find(id)\n\n\tif user.IsEmpty() {\n\t\tok = false\n\t\treturn\n\t}\n\n\tif user.Avatar == \"\" || config.GetStore().Prefix == \"\" {\n\t\tuser.Avatar = \"\"\n\t} else {\n\t\tuser.Avatar = config.GetStore().URL(user.Avatar)\n\t}\n\n\tuser = user.WithRoles().WithPermissions().WithMenus()\n\n\tok = user.HasMenu()\n\n\treturn\n}\n\n// CheckPermissions check the permission of the user.\nfunc CheckPermissions(user models.UserModel, path, method string, param url.Values) bool {\n\treturn user.CheckPermissionByUrlMethod(path, method, param)\n}\n"
  },
  {
    "path": "modules/auth/middleware_test.go",
    "content": "package auth\n\nimport (\n\t\"net/url\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestCheckPermissions(t *testing.T) {\n\n\tconfig.Initialize(&config.Config{\n\t\tUrlPrefix: \"admin\",\n\t})\n\n\tuser := models.UserModel{\n\t\tPermissions: []models.PermissionModel{\n\t\t\t{\n\t\t\t\tName:       \"/\",\n\t\t\t\tSlug:       \"/\",\n\t\t\t\tHttpMethod: []string{\"GET\"},\n\t\t\t\tHttpPath:   []string{\"/\"},\n\t\t\t}, {\n\t\t\t\tName:       \"/info/user\",\n\t\t\t\tSlug:       \"/\",\n\t\t\t\tHttpMethod: []string{\"GET\"},\n\t\t\t\tHttpPath:   []string{\"/info/user\"},\n\t\t\t}, {\n\t\t\t\tName:       \"/info/user/edit\",\n\t\t\t\tSlug:       \"/\",\n\t\t\t\tHttpMethod: []string{\"GET\"},\n\t\t\t\tHttpPath:   []string{\"/info/user/edit\"},\n\t\t\t}, {\n\t\t\t\tName:       \"/info/normal_manager?id=2\",\n\t\t\t\tSlug:       \"/\",\n\t\t\t\tHttpMethod: []string{\"GET\"},\n\t\t\t\tHttpPath:   []string{\"/info/normal_manager?id=2\"},\n\t\t\t}, {\n\t\t\t\tName:       \"/info/normal_manager/edit?id=2\",\n\t\t\t\tSlug:       \"/\",\n\t\t\t\tHttpMethod: []string{\"GET\"},\n\t\t\t\tHttpPath:   []string{\"/info/normal_manager/edit?id=2\"},\n\t\t\t}, {\n\t\t\t\tName:       \"/info/user_list?user_type=10\",\n\t\t\t\tSlug:       \"/\",\n\t\t\t\tHttpMethod: []string{\"GET\"},\n\t\t\t\tHttpPath:   []string{\"/info/user_list?user_type=10\"},\n\t\t\t}, {\n\t\t\t\tName:       \"/info/user_list?user_type=20\",\n\t\t\t\tSlug:       \"/\",\n\t\t\t\tHttpMethod: []string{\"GET\"},\n\t\t\t\tHttpPath:   []string{\"/info/user_list?user_type=20\"},\n\t\t\t}, {\n\t\t\t\tName:       \"/delete/user\",\n\t\t\t\tSlug:       \"/\",\n\t\t\t\tHttpMethod: []string{\"POST\"},\n\t\t\t\tHttpPath:   []string{\"/delete/user\"},\n\t\t\t},\n\t\t},\n\t}\n\n\tparam := make(url.Values)\n\n\tassert.Equal(t, CheckPermissions(user, \"/admin/\", \"GET\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin\", \"GET\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/\", \"GET\", param), false)\n\tassert.Equal(t, CheckPermissions(user, \"/admin\", \"POST\", param), false)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/users\", \"GET\", param), false)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/user\", \"GET\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/user\", \"get\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/normal_manager/edit?__goadmin_edit_pk=2&__columns=id,roles,created_at,updated_at\", \"get\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/normal_manager/edit?__goadmin_edit_pk=2\", \"get\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/normal_manager/edit?__goadmin_edit_pk=3&__columns=id,roles,created_at,updated_at\", \"get\", param), false)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/normal_manager/edit?__columns=id,roles,created_at,updated_at&id=3\", \"get\", param), false)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/user\", \"post\", param), false)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/user/edit?id=3\", \"get\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/logout?j=asdf\", \"post\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/user_list?user_type=20\", \"get\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/info/user_list?__goadmin_edit_pk=3&user_type=20\", \"get\", param), true)\n\tassert.Equal(t, CheckPermissions(user, \"/admin/delete/user\", \"post\", param), true)\n}\n"
  },
  {
    "path": "modules/auth/session.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage auth\n\nimport (\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n)\n\nconst DefaultCookieKey = \"go_admin_session\"\n\n// NewDBDriver return the default PersistenceDriver.\nfunc newDBDriver(conn db.Connection) *DBDriver {\n\treturn &DBDriver{\n\t\tconn:      conn,\n\t\ttableName: \"goadmin_session\",\n\t}\n}\n\n// PersistenceDriver is a driver of storing and getting the session info.\ntype PersistenceDriver interface {\n\tLoad(string) (map[string]interface{}, error)\n\tUpdate(sid string, values map[string]interface{}) error\n}\n\n// GetSessionByKey get the session value by key.\nfunc GetSessionByKey(sesKey, key string, conn db.Connection) (interface{}, error) {\n\tm, err := newDBDriver(conn).Load(sesKey)\n\treturn m[key], err\n}\n\n// Session contains info of session.\ntype Session struct {\n\tExpires time.Duration\n\tCookie  string\n\tValues  map[string]interface{}\n\tDriver  PersistenceDriver\n\tSid     string\n\tContext *context.Context\n}\n\n// Config wraps the Session info.\ntype Config struct {\n\tExpires time.Duration\n\tCookie  string\n}\n\n// UpdateConfig update the Expires and Cookie of Session.\nfunc (ses *Session) UpdateConfig(config Config) {\n\tses.Expires = config.Expires\n\tses.Cookie = config.Cookie\n}\n\n// Get get the session value.\nfunc (ses *Session) Get(key string) interface{} {\n\treturn ses.Values[key]\n}\n\n// Add add the session value of key.\nfunc (ses *Session) Add(key string, value interface{}) error {\n\tses.Values[key] = value\n\tif err := ses.Driver.Update(ses.Sid, ses.Values); err != nil {\n\t\treturn err\n\t}\n\tcookie := http.Cookie{\n\t\tName:     ses.Cookie,\n\t\tValue:    ses.Sid,\n\t\tMaxAge:   config.GetSessionLifeTime(),\n\t\tExpires:  time.Now().Add(ses.Expires),\n\t\tHttpOnly: true,\n\t\tPath:     \"/\",\n\t}\n\tif config.GetDomain() != \"\" {\n\t\tcookie.Domain = config.GetDomain()\n\t}\n\tses.Context.SetCookie(&cookie)\n\treturn nil\n}\n\n// Clear clear a Session.\nfunc (ses *Session) Clear() error {\n\tses.Values = map[string]interface{}{}\n\treturn ses.Driver.Update(ses.Sid, ses.Values)\n}\n\n// UseDriver set the driver of the Session.\nfunc (ses *Session) UseDriver(driver PersistenceDriver) {\n\tses.Driver = driver\n}\n\n// StartCtx return a Session from the given Context.\nfunc (ses *Session) StartCtx(ctx *context.Context) (*Session, error) {\n\tif cookie, err := ctx.Request.Cookie(ses.Cookie); err == nil && cookie.Value != \"\" {\n\t\tses.Sid = cookie.Value\n\t\tvalueFromDriver, err := ses.Driver.Load(cookie.Value)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif len(valueFromDriver) > 0 {\n\t\t\tses.Values = valueFromDriver\n\t\t}\n\t} else {\n\t\tses.Sid = modules.Uuid()\n\t}\n\tses.Context = ctx\n\treturn ses, nil\n}\n\n// InitSession return the default Session.\nfunc InitSession(ctx *context.Context, conn db.Connection) (*Session, error) {\n\n\tsessions := new(Session)\n\tsessions.UpdateConfig(Config{\n\t\tExpires: time.Second * time.Duration(config.GetSessionLifeTime()),\n\t\tCookie:  DefaultCookieKey,\n\t})\n\n\tsessions.UseDriver(newDBDriver(conn))\n\tsessions.Values = make(map[string]interface{})\n\n\treturn sessions.StartCtx(ctx)\n}\n\n// DBDriver is a driver which uses database as a persistence tool.\ntype DBDriver struct {\n\tconn      db.Connection\n\ttableName string\n}\n\n// Load implements the PersistenceDriver.Load.\nfunc (driver *DBDriver) Load(sid string) (map[string]interface{}, error) {\n\tsesModel, err := driver.table().Where(\"sid\", \"=\", sid).First()\n\n\tif db.CheckError(err, db.QUERY) {\n\t\treturn nil, err\n\t}\n\n\tif sesModel == nil {\n\t\treturn map[string]interface{}{}, nil\n\t}\n\n\tvar values map[string]interface{}\n\terr = json.Unmarshal([]byte(sesModel[\"values\"].(string)), &values)\n\treturn values, err\n}\n\nfunc (driver *DBDriver) deleteOverdueSession() {\n\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\tlogger.Error(err)\n\t\t\tpanic(err)\n\t\t}\n\t}()\n\n\tvar (\n\t\tduration   = strconv.Itoa(config.GetSessionLifeTime() + 1000)\n\t\tdriverName = config.GetDatabases().GetDefault().Driver\n\t\traw        = ``\n\t)\n\n\tif db.DriverPostgresql == driverName {\n\t\traw = `extract(epoch from now()) - ` + duration + ` > extract(epoch from created_at)`\n\t} else if db.DriverMysql == driverName {\n\t\traw = `unix_timestamp(created_at) < unix_timestamp() - ` + duration\n\t} else if db.DriverSqlite == driverName {\n\t\traw = `strftime('%s', created_at) < strftime('%s', 'now') - ` + duration\n\t} else if db.DriverMssql == driverName {\n\t\traw = `DATEDIFF(second, [created_at], GETDATE()) > ` + duration\n\t} else if db.DriverOceanBase == driverName {\n\t\traw = `unix_timestamp(created_at) < unix_timestamp() - ` + duration\n\t}\n\n\tif raw != \"\" {\n\t\t_ = driver.table().WhereRaw(raw).Delete()\n\t}\n}\n\n// Update implements the PersistenceDriver.Update.\nfunc (driver *DBDriver) Update(sid string, values map[string]interface{}) error {\n\n\tgo driver.deleteOverdueSession()\n\n\tif sid != \"\" {\n\t\tif len(values) == 0 {\n\t\t\terr := driver.table().Where(\"sid\", \"=\", sid).Delete()\n\t\t\tif db.CheckError(err, db.DELETE) {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tvaluesByte, err := json.Marshal(values)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tsesValue := string(valuesByte)\n\t\tsesModel, _ := driver.table().Where(\"sid\", \"=\", sid).First()\n\t\tif sesModel == nil {\n\t\t\tif !config.GetNoLimitLoginIP() {\n\t\t\t\terr = driver.table().Where(\"values\", \"=\", sesValue).Delete()\n\t\t\t\tif db.CheckError(err, db.DELETE) {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\t_, err := driver.table().Insert(dialect.H{\n\t\t\t\t\"values\": sesValue,\n\t\t\t\t\"sid\":    sid,\n\t\t\t})\n\t\t\tif db.CheckError(err, db.INSERT) {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\t_, err := driver.table().\n\t\t\t\tWhere(\"sid\", \"=\", sid).\n\t\t\t\tUpdate(dialect.H{\n\t\t\t\t\t\"values\": sesValue,\n\t\t\t\t})\n\t\t\tif db.CheckError(err, db.UPDATE) {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (driver *DBDriver) table() *db.SQL {\n\treturn db.Table(driver.tableName).WithDriver(driver.conn)\n}\n"
  },
  {
    "path": "modules/collection/collection.go",
    "content": "package collection\n\ntype Collection []map[string]interface{}\n\n// Where filters the collection by a given key / value pair.\nfunc (c Collection) Where(key string, values ...interface{}) Collection {\n\tvar d = make([]map[string]interface{}, 0)\n\tif len(values) < 1 {\n\t\tfor _, value := range c {\n\t\t\tif isTrue(value[key]) {\n\t\t\t\td = append(d, value)\n\t\t\t}\n\t\t}\n\t} else if len(values) < 2 {\n\t\tfor _, value := range c {\n\t\t\tif value[key] == values[0] {\n\t\t\t\td = append(d, value)\n\t\t\t}\n\t\t}\n\t} else if values[0].(string) == \"=\" {\n\t\tfor _, value := range c {\n\t\t\tif value[key] == values[1] {\n\t\t\t\td = append(d, value)\n\t\t\t}\n\t\t}\n\t}\n\treturn d\n}\n\nfunc (c Collection) Length() int {\n\treturn len(c)\n}\n\nfunc (c Collection) FirstGet(key string) interface{} {\n\treturn c[0][key]\n}\n\nfunc isTrue(a interface{}) bool {\n\tswitch a := a.(type) {\n\tcase uint:\n\t\treturn a != uint(0)\n\tcase uint8:\n\t\treturn a != uint8(0)\n\tcase uint16:\n\t\treturn a != uint16(0)\n\tcase uint32:\n\t\treturn a != uint32(0)\n\tcase uint64:\n\t\treturn a != uint64(0)\n\tcase int:\n\t\treturn a != int(0)\n\tcase int8:\n\t\treturn a != int8(0)\n\tcase int16:\n\t\treturn a != int16(0)\n\tcase int32:\n\t\treturn a != int32(0)\n\tcase int64:\n\t\treturn a != int64(0)\n\tcase float32:\n\t\treturn a != float32(0)\n\tcase float64:\n\t\treturn a != float64(0)\n\tcase string:\n\t\treturn a != \"\"\n\tcase bool:\n\t\treturn a\n\tdefault:\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "modules/collection/collection_test.go",
    "content": "package collection\n"
  },
  {
    "path": "modules/config/config.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage config\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"gopkg.in/ini.v1\"\n\t\"gopkg.in/yaml.v2\"\n)\n\n// Database is a type of database connection config.\n//\n// Because a little difference of different database driver.\n// The Config has multiple options but may not be used.\n// Such as the sqlite driver only use the File option which\n// can be ignored when the driver is mysql.\n//\n// If the Dsn is configured, when driver is mysql/postgresql/\n// mssql, the other configurations will be ignored, except for\n// MaxIdleConns and MaxOpenConns.\ntype Database struct {\n\tHost       string `json:\"host,omitempty\" yaml:\"host,omitempty\" ini:\"host,omitempty\"`\n\tPort       string `json:\"port,omitempty\" yaml:\"port,omitempty\" ini:\"port,omitempty\"`\n\tUser       string `json:\"user,omitempty\" yaml:\"user,omitempty\" ini:\"user,omitempty\"`\n\tPwd        string `json:\"pwd,omitempty\" yaml:\"pwd,omitempty\" ini:\"pwd,omitempty\"`\n\tName       string `json:\"name,omitempty\" yaml:\"name,omitempty\" ini:\"name,omitempty\"`\n\tDriver     string `json:\"driver,omitempty\" yaml:\"driver,omitempty\" ini:\"driver,omitempty\"`\n\tDriverMode string `json:\"driver_mode,omitempty\" yaml:\"driver_mode,omitempty\" ini:\"driver_mode,omitempty\"`\n\tFile       string `json:\"file,omitempty\" yaml:\"file,omitempty\" ini:\"file,omitempty\"`\n\tDsn        string `json:\"dsn,omitempty\" yaml:\"dsn,omitempty\" ini:\"dsn,omitempty\"`\n\n\tMaxIdleConns    int           `json:\"max_idle_con,omitempty\" yaml:\"max_idle_con,omitempty\" ini:\"max_idle_con,omitempty\"`\n\tMaxOpenConns    int           `json:\"max_open_con,omitempty\" yaml:\"max_open_con,omitempty\" ini:\"max_open_con,omitempty\"`\n\tConnMaxLifetime time.Duration `json:\"conn_max_life_time,omitempty\" yaml:\"conn_max_life_time,omitempty\" ini:\"conn_max_life_time,omitempty\"`\n\tConnMaxIdleTime time.Duration `json:\"conn_max_idle_time,omitempty\" yaml:\"conn_max_idle_time,omitempty\" ini:\"conn_max_idle_time,omitempty\"`\n\n\tParams map[string]string `json:\"params,omitempty\" yaml:\"params,omitempty\" ini:\"params,omitempty\"`\n}\n\nfunc (d Database) GetDSN() string {\n\tif d.Dsn != \"\" {\n\t\treturn d.Dsn\n\t}\n\n\tif d.Driver == DriverMysql {\n\t\treturn d.User + \":\" + d.Pwd + \"@tcp(\" + d.Host + \":\" + d.Port + \")/\" +\n\t\t\td.Name + d.ParamStr()\n\t}\n\tif d.Driver == DriverPostgresql {\n\t\treturn fmt.Sprintf(\"host=%s port=%s user=%s password=%s dbname=%s\"+d.ParamStr(),\n\t\t\td.Host, d.Port, d.User, d.Pwd, d.Name)\n\t}\n\tif d.Driver == DriverMssql {\n\t\treturn fmt.Sprintf(\"user id=%s;password=%s;server=%s;port=%s;database=%s;\"+d.ParamStr(),\n\t\t\td.User, d.Pwd, d.Host, d.Port, d.Name)\n\t}\n\tif d.Driver == DriverSqlite {\n\t\treturn d.File + d.ParamStr()\n\t}\n\tif d.Driver == DriverOceanBase {\n\t\treturn d.User + \":\" + d.Pwd + \"@tcp(\" + d.Host + \":\" + d.Port + \")/\" +\n\t\t\td.Name + d.ParamStr()\n\t}\n\treturn \"\"\n}\n\nfunc (d Database) ParamStr() string {\n\tp := \"\"\n\tif d.Params == nil {\n\t\td.Params = make(map[string]string)\n\t}\n\tif d.Driver == DriverMysql || d.Driver == DriverSqlite || d.Driver == DriverOceanBase {\n\t\tif d.Driver == DriverMysql || d.Driver == DriverOceanBase {\n\t\t\tif _, ok := d.Params[\"charset\"]; !ok {\n\t\t\t\td.Params[\"charset\"] = \"utf8mb4\"\n\t\t\t}\n\t\t}\n\t\tif len(d.Params) > 0 {\n\t\t\tp = \"?\"\n\t\t\tfor k, v := range d.Params {\n\t\t\t\tp += k + \"=\" + v + \"&\"\n\t\t\t}\n\t\t\tp = p[:len(p)-1]\n\t\t}\n\t}\n\tif d.Driver == DriverMssql {\n\t\tif _, ok := d.Params[\"encrypt\"]; !ok {\n\t\t\td.Params[\"encrypt\"] = \"disable\"\n\t\t}\n\t\tfor k, v := range d.Params {\n\t\t\tp += k + \"=\" + v + \";\"\n\t\t}\n\t\tp = p[:len(p)-1]\n\t}\n\tif d.Driver == DriverPostgresql {\n\t\tif _, ok := d.Params[\"sslmode\"]; !ok {\n\t\t\td.Params[\"sslmode\"] = \"disable\"\n\t\t}\n\t\tp = \" \"\n\t\tfor k, v := range d.Params {\n\t\t\tp += k + \"=\" + v + \" \"\n\t\t}\n\t\tp = p[:len(p)-1]\n\t}\n\treturn p\n}\n\n// DatabaseList is a map of Database.\ntype DatabaseList map[string]Database\n\n// GetDefault get the default Database.\nfunc (d DatabaseList) GetDefault() Database {\n\treturn d[\"default\"]\n}\n\n// Add add a Database to the DatabaseList.\nfunc (d DatabaseList) Add(key string, db Database) {\n\td[key] = db\n}\n\n// GroupByDriver group the Databases with the drivers.\nfunc (d DatabaseList) GroupByDriver() map[string]DatabaseList {\n\tdrivers := make(map[string]DatabaseList)\n\tfor key, item := range d {\n\t\tif driverList, ok := drivers[item.Driver]; ok {\n\t\t\tdriverList.Add(key, item)\n\t\t} else {\n\t\t\tdrivers[item.Driver] = make(DatabaseList)\n\t\t\tdrivers[item.Driver].Add(key, item)\n\t\t}\n\t}\n\treturn drivers\n}\n\nfunc (d DatabaseList) JSON() string {\n\treturn utils.JSON(d)\n}\n\nfunc (d DatabaseList) Copy() DatabaseList {\n\tvar c = make(DatabaseList)\n\tfor k, v := range d {\n\t\tc[k] = v\n\t}\n\treturn c\n}\n\nfunc (d DatabaseList) Connections() []string {\n\tconns := make([]string, len(d))\n\tcount := 0\n\tfor key := range d {\n\t\tconns[count] = key\n\t\tcount++\n\t}\n\treturn conns\n}\n\nfunc GetDatabaseListFromJSON(m string) DatabaseList {\n\tvar d = make(DatabaseList)\n\tif m == \"\" {\n\t\tpanic(\"wrong config\")\n\t}\n\t_ = json.Unmarshal([]byte(m), &d)\n\treturn d\n}\n\nconst (\n\t// EnvTest is a const value of test environment.\n\tEnvTest = \"test\"\n\t// EnvLocal is a const value of local environment.\n\tEnvLocal = \"local\"\n\t// EnvProd is a const value of production environment.\n\tEnvProd = \"prod\"\n\n\t// DriverMysql is a const value of mysql driver.\n\tDriverMysql = \"mysql\"\n\t// DriverSqlite is a const value of sqlite driver.\n\tDriverSqlite = \"sqlite\"\n\t// DriverPostgresql is a const value of postgresql driver.\n\tDriverPostgresql = \"postgresql\"\n\t// DriverMssql is a const value of mssql driver.\n\tDriverMssql = \"mssql\"\n\t// DriverOceanBase is a const value of mysql driver.\n\tDriverOceanBase = \"oceanbase\"\n)\n\n// Store is the file store config. Path is the local store path.\n// and prefix is the url prefix used to visit it.\ntype Store struct {\n\tPath   string `json:\"path,omitempty\" yaml:\"path,omitempty\" ini:\"path,omitempty\"`\n\tPrefix string `json:\"prefix,omitempty\" yaml:\"prefix,omitempty\" ini:\"prefix,omitempty\"`\n}\n\nfunc (s Store) URL(suffix string) string {\n\tif len(suffix) > 4 && suffix[:4] == \"http\" {\n\t\treturn suffix\n\t}\n\tif s.Prefix == \"\" {\n\t\tif suffix[0] == '/' {\n\t\t\treturn suffix\n\t\t}\n\t\treturn \"/\" + suffix\n\t}\n\tif s.Prefix[0] == '/' {\n\t\tif suffix[0] == '/' {\n\t\t\treturn s.Prefix + suffix\n\t\t}\n\t\treturn s.Prefix + \"/\" + suffix\n\t}\n\tif suffix[0] == '/' {\n\t\tif len(s.Prefix) > 4 && s.Prefix[:4] == \"http\" {\n\t\t\treturn s.Prefix + suffix\n\t\t}\n\t\treturn \"/\" + s.Prefix + suffix\n\t}\n\tif len(s.Prefix) > 4 && s.Prefix[:4] == \"http\" {\n\t\treturn s.Prefix + \"/\" + suffix\n\t}\n\treturn \"/\" + s.Prefix + \"/\" + suffix\n}\n\nfunc (s Store) JSON() string {\n\tif s.Path == \"\" && s.Prefix == \"\" {\n\t\treturn \"\"\n\t}\n\treturn utils.JSON(s)\n}\n\nfunc GetStoreFromJSON(m string) Store {\n\tvar s Store\n\tif m == \"\" {\n\t\treturn s\n\t}\n\t_ = json.Unmarshal([]byte(m), &s)\n\treturn s\n}\n\n// Config type is the global config of goAdmin. It will be\n// initialized in the engine.\ntype Config struct {\n\t// An map supports multi database connection. The first\n\t// element of Databases is the default connection. See the\n\t// file connection.go.\n\tDatabases DatabaseList `json:\"database,omitempty\" yaml:\"database,omitempty\" ini:\"database,omitempty\"`\n\n\t// The application unique ID. Once generated, don't modify.\n\tAppID string `json:\"app_id,omitempty\" yaml:\"app_id,omitempty\" ini:\"app_id,omitempty\"`\n\n\t// The cookie domain used in the auth modules. see\n\t// the session.go.\n\tDomain string `json:\"domain,omitempty\" yaml:\"domain,omitempty\" ini:\"domain,omitempty\"`\n\n\t// Used to set as the localize language which show in the\n\t// interface.\n\tLanguage string `json:\"language,omitempty\" yaml:\"language,omitempty\" ini:\"language,omitempty\"`\n\n\t// The global url prefix.\n\tUrlPrefix string `json:\"prefix,omitempty\" yaml:\"prefix,omitempty\" ini:\"prefix,omitempty\"`\n\n\t// The theme name of template.\n\tTheme string `json:\"theme,omitempty\" yaml:\"theme,omitempty\" ini:\"theme,omitempty\"`\n\n\t// The path where files will be stored into.\n\tStore Store `json:\"store,omitempty\" yaml:\"store,omitempty\" ini:\"store,omitempty\"`\n\n\t// The title of web page.\n\tTitle string `json:\"title,omitempty\" yaml:\"title,omitempty\" ini:\"title,omitempty\"`\n\n\t// Logo is the top text in the sidebar.\n\tLogo template.HTML `json:\"logo,omitempty\" yaml:\"logo,omitempty\" ini:\"logo,omitempty\"`\n\n\t// Mini-logo is the top text in the sidebar when folding.\n\tMiniLogo template.HTML `json:\"mini_logo,omitempty\" yaml:\"mini_logo,omitempty\" ini:\"mini_logo,omitempty\"`\n\n\t// The url redirect to after login.\n\tIndexUrl string `json:\"index,omitempty\" yaml:\"index,omitempty\" ini:\"index,omitempty\"`\n\n\t// Login page URL\n\tLoginUrl string `json:\"login_url,omitempty\" yaml:\"login_url,omitempty\" ini:\"login_url,omitempty\"`\n\n\t// Debug mode\n\tDebug bool `json:\"debug,omitempty\" yaml:\"debug,omitempty\" ini:\"debug,omitempty\"`\n\n\t// Env is the environment,which maybe local,test,prod.\n\tEnv string `json:\"env,omitempty\" yaml:\"env,omitempty\" ini:\"env,omitempty\"`\n\n\t// Info log path.\n\tInfoLogPath string `json:\"info_log,omitempty\" yaml:\"info_log,omitempty\" ini:\"info_log,omitempty\"`\n\n\t// Error log path.\n\tErrorLogPath string `json:\"error_log,omitempty\" yaml:\"error_log,omitempty\" ini:\"error_log,omitempty\"`\n\n\t// Access log path.\n\tAccessLogPath string `json:\"access_log,omitempty\" yaml:\"access_log,omitempty\" ini:\"access_log,omitempty\"`\n\n\t// Access assets log off\n\tAccessAssetsLogOff bool `json:\"access_assets_log_off,omitempty\" yaml:\"access_assets_log_off,omitempty\" ini:\"access_assets_log_off,omitempty\"`\n\n\t// Sql operator record log switch.\n\tSqlLog bool `json:\"sql_log,omitempty\" yaml:\"sql_log,omitempty\" ini:\"sql_log,omitempty\"`\n\n\tAccessLogOff bool `json:\"access_log_off,omitempty\" yaml:\"access_log_off,omitempty\" ini:\"access_log_off,omitempty\"`\n\tInfoLogOff   bool `json:\"info_log_off,omitempty\" yaml:\"info_log_off,omitempty\" ini:\"info_log_off,omitempty\"`\n\tErrorLogOff  bool `json:\"error_log_off,omitempty\" yaml:\"error_log_off,omitempty\" ini:\"error_log_off,omitempty\"`\n\n\tLogger Logger `json:\"logger,omitempty\" yaml:\"logger,omitempty\" ini:\"logger,omitempty\"`\n\n\t// Color scheme.\n\tColorScheme string `json:\"color_scheme,omitempty\" yaml:\"color_scheme,omitempty\" ini:\"color_scheme,omitempty\"`\n\n\t// Session valid time duration,units are seconds. Default 7200.\n\tSessionLifeTime int `json:\"session_life_time,omitempty\" yaml:\"session_life_time,omitempty\" ini:\"session_life_time,omitempty\"`\n\n\t// Assets visit link.\n\tAssetUrl string `json:\"asset_url,omitempty\" yaml:\"asset_url,omitempty\" ini:\"asset_url,omitempty\"`\n\n\t// File upload engine,default \"local\"\n\tFileUploadEngine FileUploadEngine `json:\"file_upload_engine,omitempty\" yaml:\"file_upload_engine,omitempty\" ini:\"file_upload_engine,omitempty\"`\n\n\t// Custom html in the tag head.\n\tCustomHeadHtml template.HTML `json:\"custom_head_html,omitempty\" yaml:\"custom_head_html,omitempty\" ini:\"custom_head_html,omitempty\"`\n\n\t// Custom html after body.\n\tCustomFootHtml template.HTML `json:\"custom_foot_html,omitempty\" yaml:\"custom_foot_html,omitempty\" ini:\"custom_foot_html,omitempty\"`\n\n\t// Footer Info html\n\tFooterInfo template.HTML `json:\"footer_info,omitempty\" yaml:\"footer_info,omitempty\" ini:\"footer_info,omitempty\"`\n\n\t// Login page title\n\tLoginTitle string `json:\"login_title,omitempty\" yaml:\"login_title,omitempty\" ini:\"login_title,omitempty\"`\n\n\t// Login page logo\n\tLoginLogo template.HTML `json:\"login_logo,omitempty\" yaml:\"login_logo,omitempty\" ini:\"login_logo,omitempty\"`\n\n\t// Auth user table\n\tAuthUserTable string `json:\"auth_user_table,omitempty\" yaml:\"auth_user_table,omitempty\" ini:\"auth_user_table,omitempty\"`\n\n\t// Extra config info\n\tExtra ExtraInfo `json:\"extra,omitempty\" yaml:\"extra,omitempty\" ini:\"extra,omitempty\"`\n\n\t// Page animation\n\tAnimation PageAnimation `json:\"animation,omitempty\" yaml:\"animation,omitempty\" ini:\"animation,omitempty\"`\n\n\t// Limit login with different IPs\n\tNoLimitLoginIP bool `json:\"no_limit_login_ip,omitempty\" yaml:\"no_limit_login_ip,omitempty\" ini:\"no_limit_login_ip,omitempty\"`\n\n\t// When site off is true, website will be closed\n\tSiteOff bool `json:\"site_off,omitempty\" yaml:\"site_off,omitempty\" ini:\"site_off,omitempty\"`\n\n\t// Hide config center entrance flag\n\tHideConfigCenterEntrance bool `json:\"hide_config_center_entrance,omitempty\" yaml:\"hide_config_center_entrance,omitempty\" ini:\"hide_config_center_entrance,omitempty\"`\n\n\t// Prohibit config modification\n\tProhibitConfigModification bool `json:\"prohibit_config_modification,omitempty\" yaml:\"prohibit_config_modification,omitempty\" ini:\"prohibit_config_modification,omitempty\"`\n\n\t// Hide app info entrance flag\n\tHideAppInfoEntrance bool `json:\"hide_app_info_entrance,omitempty\" yaml:\"hide_app_info_entrance,omitempty\" ini:\"hide_app_info_entrance,omitempty\"`\n\n\t// Hide tool entrance flag\n\tHideToolEntrance bool `json:\"hide_tool_entrance,omitempty\" yaml:\"hide_tool_entrance,omitempty\" ini:\"hide_tool_entrance,omitempty\"`\n\n\tHidePluginEntrance bool `json:\"hide_plugin_entrance,omitempty\" yaml:\"hide_plugin_entrance,omitempty\" ini:\"hide_plugin_entrance,omitempty\"`\n\n\tCustom404HTML template.HTML `json:\"custom_404_html,omitempty\" yaml:\"custom_404_html,omitempty\" ini:\"custom_404_html,omitempty\"`\n\n\tCustom403HTML template.HTML `json:\"custom_403_html,omitempty\" yaml:\"custom_403_html,omitempty\" ini:\"custom_403_html,omitempty\"`\n\n\tCustom500HTML template.HTML `json:\"custom_500_html,omitempty\" yaml:\"custom_500_html,omitempty\" ini:\"custom_500_html,omitempty\"`\n\n\t// Update Process Function\n\tUpdateProcessFn UpdateConfigProcessFn `json:\"-\" yaml:\"-\" ini:\"-\"`\n\n\t// Favicon string `json:\"favicon,omitempty\" yaml:\"favicon,omitempty\" ini:\"favicon,omitempty\"`\n\n\t// Is open admin plugin json api\n\tOpenAdminApi bool `json:\"open_admin_api,omitempty\" yaml:\"open_admin_api,omitempty\" ini:\"open_admin_api,omitempty\"`\n\n\tHideVisitorUserCenterEntrance bool `json:\"hide_visitor_user_center_entrance,omitempty\" yaml:\"hide_visitor_user_center_entrance,omitempty\" ini:\"hide_visitor_user_center_entrance,omitempty\"`\n\n\tExcludeThemeComponents []string `json:\"exclude_theme_components,omitempty\" yaml:\"exclude_theme_components,omitempty\" ini:\"exclude_theme_components,omitempty\"`\n\n\tBootstrapFilePath string `json:\"bootstrap_file_path,omitempty\" yaml:\"bootstrap_file_path,omitempty\" ini:\"bootstrap_file_path,omitempty\"`\n\n\tGoModFilePath string `json:\"go_mod_file_path,omitempty\" yaml:\"go_mod_file_path,omitempty\" ini:\"go_mod_file_path,omitempty\"`\n\n\tAllowDelOperationLog bool `json:\"allow_del_operation_log,omitempty\" yaml:\"allow_del_operation_log,omitempty\" ini:\"allow_del_operation_log,omitempty\"`\n\n\tOperationLogOff bool `json:\"operation_log_off,omitempty\" yaml:\"operation_log_off,omitempty\" ini:\"operation_log_off,omitempty\"`\n\n\tAssetRootPath string `json:\"asset_root_path,omitempty\" yaml:\"asset_root_path,omitempty\" ini:\"asset_root_path,omitempty\"`\n\n\tURLFormat URLFormat `json:\"url_format,omitempty\" yaml:\"url_format,omitempty\" ini:\"url_format,omitempty\"`\n\n\tprefix string       `json:\"-\" yaml:\"-\" ini:\"-\"`\n\tlock   sync.RWMutex `json:\"-\" yaml:\"-\" ini:\"-\"`\n}\n\ntype Logger struct {\n\tEncoder EncoderCfg `json:\"encoder,omitempty\" yaml:\"encoder,omitempty\" ini:\"encoder,omitempty\"`\n\tRotate  RotateCfg  `json:\"rotate,omitempty\" yaml:\"rotate,omitempty\" ini:\"rotate,omitempty\"`\n\tLevel   int8       `json:\"level,omitempty\" yaml:\"level,omitempty\" ini:\"level,omitempty\"`\n}\n\ntype EncoderCfg struct {\n\tTimeKey       string `json:\"time_key,omitempty\" yaml:\"time_key,omitempty\" ini:\"time_key,omitempty\"`\n\tLevelKey      string `json:\"level_key,omitempty\" yaml:\"level_key,omitempty\" ini:\"level_key,omitempty\"`\n\tNameKey       string `json:\"name_key,omitempty\" yaml:\"name_key,omitempty\" ini:\"name_key,omitempty\"`\n\tCallerKey     string `json:\"caller_key,omitempty\" yaml:\"caller_key,omitempty\" ini:\"caller_key,omitempty\"`\n\tMessageKey    string `json:\"message_key,omitempty\" yaml:\"message_key,omitempty\" ini:\"message_key,omitempty\"`\n\tStacktraceKey string `json:\"stacktrace_key,omitempty\" yaml:\"stacktrace_key,omitempty\" ini:\"stacktrace_key,omitempty\"`\n\tLevel         string `json:\"level,omitempty\" yaml:\"level,omitempty\" ini:\"level,omitempty\"`\n\tTime          string `json:\"time,omitempty\" yaml:\"time,omitempty\" ini:\"time,omitempty\"`\n\tDuration      string `json:\"duration,omitempty\" yaml:\"duration,omitempty\" ini:\"duration,omitempty\"`\n\tCaller        string `json:\"caller,omitempty\" yaml:\"caller,omitempty\" ini:\"caller,omitempty\"`\n\tEncoding      string `json:\"encoding,omitempty\" yaml:\"encoding,omitempty\" ini:\"encoding,omitempty\"`\n}\n\ntype RotateCfg struct {\n\tMaxSize    int  `json:\"max_size,omitempty\" yaml:\"max_size,omitempty\" ini:\"max_size,omitempty\"`\n\tMaxBackups int  `json:\"max_backups,omitempty\" yaml:\"max_backups,omitempty\" ini:\"max_backups,omitempty\"`\n\tMaxAge     int  `json:\"max_age,omitempty\" yaml:\"max_age,omitempty\" ini:\"max_age,omitempty\"`\n\tCompress   bool `json:\"compress,omitempty\" yaml:\"compress,omitempty\" ini:\"compress,omitempty\"`\n}\n\ntype URLFormat struct {\n\tInfo       string `json:\"info,omitempty\" yaml:\"info,omitempty\" ini:\"info,omitempty\"`\n\tDetail     string `json:\"detail,omitempty\" yaml:\"detail,omitempty\" ini:\"detail,omitempty\"`\n\tCreate     string `json:\"create,omitempty\" yaml:\"create,omitempty\" ini:\"create,omitempty\"`\n\tDelete     string `json:\"delete,omitempty\" yaml:\"delete,omitempty\" ini:\"delete,omitempty\"`\n\tExport     string `json:\"export,omitempty\" yaml:\"export,omitempty\" ini:\"export,omitempty\"`\n\tEdit       string `json:\"edit,omitempty\" yaml:\"edit,omitempty\" ini:\"edit,omitempty\"`\n\tShowEdit   string `json:\"show_edit,omitempty\" yaml:\"show_edit,omitempty\" ini:\"show_edit,omitempty\"`\n\tShowCreate string `json:\"show_create,omitempty\" yaml:\"show_create,omitempty\" ini:\"show_create,omitempty\"`\n\tUpdate     string `json:\"update,omitempty\" yaml:\"update,omitempty\" ini:\"update,omitempty\"`\n}\n\nfunc (f URLFormat) SetDefault() URLFormat {\n\tf.Detail = utils.SetDefault(f.Detail, \"\", \"/info/:__prefix/detail\")\n\tf.ShowEdit = utils.SetDefault(f.ShowEdit, \"\", \"/info/:__prefix/edit\")\n\tf.ShowCreate = utils.SetDefault(f.ShowCreate, \"\", \"/info/:__prefix/new\")\n\tf.Edit = utils.SetDefault(f.Edit, \"\", \"/edit/:__prefix\")\n\tf.Create = utils.SetDefault(f.Create, \"\", \"/new/:__prefix\")\n\tf.Delete = utils.SetDefault(f.Delete, \"\", \"/delete/:__prefix\")\n\tf.Export = utils.SetDefault(f.Export, \"\", \"/export/:__prefix\")\n\tf.Info = utils.SetDefault(f.Info, \"\", \"/info/:__prefix\")\n\tf.Update = utils.SetDefault(f.Update, \"\", \"/update/:__prefix\")\n\treturn f\n}\n\ntype ExtraInfo map[string]interface{}\n\ntype UpdateConfigProcessFn func(values form.Values) (form.Values, error)\n\n// see more: https://daneden.github.io/animate.css/\ntype PageAnimation struct {\n\tType     string  `json:\"type,omitempty\" yaml:\"type,omitempty\" ini:\"type,omitempty\"`\n\tDuration float32 `json:\"duration,omitempty\" yaml:\"duration,omitempty\" ini:\"duration,omitempty\"`\n\tDelay    float32 `json:\"delay,omitempty\" yaml:\"delay,omitempty\" ini:\"delay,omitempty\"`\n}\n\nfunc (p PageAnimation) JSON() string {\n\tif p.Type == \"\" {\n\t\treturn \"\"\n\t}\n\treturn utils.JSON(p)\n}\n\n// FileUploadEngine is a file upload engine.\ntype FileUploadEngine struct {\n\tName   string                 `json:\"name,omitempty\" yaml:\"name,omitempty\" ini:\"name,omitempty\"`\n\tConfig map[string]interface{} `json:\"config,omitempty\" yaml:\"config,omitempty\" ini:\"config,omitempty\"`\n}\n\nfunc (f FileUploadEngine) JSON() string {\n\tif f.Name == \"\" {\n\t\treturn \"\"\n\t}\n\tif len(f.Config) == 0 {\n\t\tf.Config = nil\n\t}\n\treturn utils.JSON(f)\n}\n\nfunc GetFileUploadEngineFromJSON(m string) FileUploadEngine {\n\tvar f FileUploadEngine\n\tif m == \"\" {\n\t\treturn f\n\t}\n\t_ = json.Unmarshal([]byte(m), &f)\n\treturn f\n}\n\n// GetIndexURL get the index url with prefix.\nfunc (c *Config) GetIndexURL() string {\n\tindex := c.Index()\n\tif index == \"/\" {\n\t\treturn c.Prefix()\n\t}\n\n\treturn c.Prefix() + index\n}\n\n// Url get url with the given suffix.\nfunc (c *Config) Url(suffix string) string {\n\tif c.prefix == \"/\" {\n\t\treturn suffix\n\t}\n\tif suffix == \"/\" {\n\t\treturn c.prefix\n\t}\n\treturn c.prefix + suffix\n}\n\n// IsTestEnvironment check the environment if it is test.\nfunc (c *Config) IsTestEnvironment() bool {\n\treturn c.Env == EnvTest\n}\n\n// IsLocalEnvironment check the environment if it is local.\nfunc (c *Config) IsLocalEnvironment() bool {\n\treturn c.Env == EnvLocal\n}\n\n// IsProductionEnvironment check the environment if it is production.\nfunc (c *Config) IsProductionEnvironment() bool {\n\treturn c.Env == EnvProd\n}\n\n// IsNotProductionEnvironment check the environment if it is not production.\nfunc (c *Config) IsNotProductionEnvironment() bool {\n\treturn c.Env != EnvProd\n}\n\nfunc (c *Config) IsAllowConfigModification() bool {\n\treturn !c.ProhibitConfigModification\n}\n\n// URLRemovePrefix remove prefix from the given url.\nfunc (c *Config) URLRemovePrefix(url string) string {\n\tif url == c.prefix {\n\t\treturn \"/\"\n\t}\n\tif c.prefix == \"/\" {\n\t\treturn url\n\t}\n\treturn strings.Replace(url, c.prefix, \"\", 1)\n}\n\n// Index return the index url without prefix.\nfunc (c *Config) Index() string {\n\tif c.IndexUrl == \"\" {\n\t\treturn \"/\"\n\t}\n\tif c.IndexUrl[0] != '/' {\n\t\treturn \"/\" + c.IndexUrl\n\t}\n\treturn c.IndexUrl\n}\n\n// Prefix return the prefix.\nfunc (c *Config) Prefix() string {\n\treturn c.prefix\n}\n\n// AssertPrefix return the prefix of assert.\nfunc (c *Config) AssertPrefix() string {\n\tif c.prefix == \"/\" {\n\t\treturn \"\"\n\t}\n\treturn c.prefix\n}\n\nfunc (c *Config) AddUpdateProcessFn(fn UpdateConfigProcessFn) *Config {\n\tc.UpdateProcessFn = fn\n\treturn c\n}\n\n// PrefixFixSlash return the prefix fix the slash error.\nfunc (c *Config) PrefixFixSlash() string {\n\tif c.UrlPrefix == \"/\" {\n\t\treturn \"\"\n\t}\n\tif c.UrlPrefix != \"\" && c.UrlPrefix[0] != '/' {\n\t\treturn \"/\" + c.UrlPrefix\n\t}\n\treturn c.UrlPrefix\n}\n\nfunc (c *Config) Copy() *Config {\n\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\n\tvar (\n\t\tnewCfg   = new(Config)\n\t\tsrcType  = reflect.TypeOf(c).Elem()\n\t\tsrcVal   = reflect.ValueOf(c).Elem()\n\t\tdistType = reflect.TypeOf(newCfg).Elem()\n\t\tdistVal  = reflect.ValueOf(newCfg).Elem()\n\t)\n\n\tfor i := 0; i < distType.NumField(); i++ {\n\t\tv := distVal.Field(i)\n\t\tif distType.Field(i).Type.String() == \"config.DatabaseList\" {\n\t\t\tnewCfg.Databases = c.Databases.Copy()\n\t\t} else if v.CanInterface() {\n\t\t\tfor j := 0; j < srcType.NumField(); j++ {\n\t\t\t\tif distType.Field(i).Name == srcType.Field(j).Name {\n\t\t\t\t\tv.Set(reflect.ValueOf(srcVal.Field(i).Interface()))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tnewCfg.prefix = c.prefix\n\n\treturn newCfg\n}\n\nfunc (c *Config) ToMap() map[string]string {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\n\tvar (\n\t\tm     = make(map[string]string)\n\t\trType = reflect.TypeOf(c).Elem()\n\t\trVal  = reflect.ValueOf(c).Elem()\n\t)\n\n\tfor i := 0; i < rType.NumField(); i++ {\n\t\tv := rVal.Field(i)\n\t\tif !v.CanInterface() {\n\t\t\tcontinue\n\t\t}\n\t\tt := rType.Field(i)\n\t\tkeyName := t.Tag.Get(\"json\")\n\t\tif keyName == \"-\" {\n\t\t\tcontinue\n\t\t}\n\t\tkeyName = keyName[:len(keyName)-10]\n\t\tswitch t.Type.Kind() {\n\t\tcase reflect.Bool:\n\t\t\tm[keyName] = strconv.FormatBool(v.Bool())\n\t\tcase reflect.String:\n\t\t\tif keyName == \"prefix\" {\n\t\t\t\tkeyName = \"url_prefix\"\n\t\t\t} else if keyName == \"index\" {\n\t\t\t\tkeyName = \"index_url\"\n\t\t\t} else if keyName == \"info_log\" || keyName == \"error_log\" || keyName == \"access_log\" {\n\t\t\t\tkeyName += \"_path\"\n\t\t\t}\n\t\t\tm[keyName] = v.String()\n\t\tcase reflect.Int:\n\t\t\tm[keyName] = fmt.Sprintf(\"%d\", v.Int())\n\t\tcase reflect.Struct:\n\t\t\tswitch t.Type.String() {\n\t\t\tcase \"config.PageAnimation\":\n\t\t\t\tm[\"animation_type\"] = c.Animation.Type\n\t\t\t\tm[\"animation_duration\"] = fmt.Sprintf(\"%.2f\", c.Animation.Duration)\n\t\t\t\tm[\"animation_delay\"] = fmt.Sprintf(\"%.2f\", c.Animation.Delay)\n\t\t\tcase \"config.Logger\":\n\t\t\t\tm[\"logger_rotate_max_size\"] = strconv.Itoa(c.Logger.Rotate.MaxSize)\n\t\t\t\tm[\"logger_rotate_max_backups\"] = strconv.Itoa(c.Logger.Rotate.MaxBackups)\n\t\t\t\tm[\"logger_rotate_max_age\"] = strconv.Itoa(c.Logger.Rotate.MaxAge)\n\t\t\t\tm[\"logger_rotate_compress\"] = strconv.FormatBool(c.Logger.Rotate.Compress)\n\n\t\t\t\tm[\"logger_encoder_time_key\"] = c.Logger.Encoder.TimeKey\n\t\t\t\tm[\"logger_encoder_level_key\"] = c.Logger.Encoder.LevelKey\n\t\t\t\tm[\"logger_encoder_name_key\"] = c.Logger.Encoder.NameKey\n\t\t\t\tm[\"logger_encoder_caller_key\"] = c.Logger.Encoder.CallerKey\n\t\t\t\tm[\"logger_encoder_message_key\"] = c.Logger.Encoder.MessageKey\n\t\t\t\tm[\"logger_encoder_stacktrace_key\"] = c.Logger.Encoder.StacktraceKey\n\t\t\t\tm[\"logger_encoder_level\"] = c.Logger.Encoder.Level\n\t\t\t\tm[\"logger_encoder_time\"] = c.Logger.Encoder.Time\n\t\t\t\tm[\"logger_encoder_duration\"] = c.Logger.Encoder.Duration\n\t\t\t\tm[\"logger_encoder_caller\"] = c.Logger.Encoder.Caller\n\t\t\t\tm[\"logger_encoder_encoding\"] = c.Logger.Encoder.Encoding\n\t\t\t\tm[\"logger_level\"] = strconv.Itoa(int(c.Logger.Level))\n\t\t\tcase \"config.DatabaseList\":\n\t\t\t\tm[\"databases\"] = utils.JSON(v.Interface())\n\t\t\tcase \"config.FileUploadEngine\":\n\t\t\t\tm[\"file_upload_engine\"] = c.FileUploadEngine.JSON()\n\t\t\t}\n\t\tcase reflect.Map:\n\t\t\tif t.Type.String() == \"config.ExtraInfo\" {\n\t\t\t\tif len(c.Extra) == 0 {\n\t\t\t\t\tm[\"extra\"] = \"\"\n\t\t\t\t} else {\n\t\t\t\t\tm[\"extra\"] = utils.JSON(c.Extra)\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tm[keyName] = utils.JSON(v.Interface())\n\t\t}\n\t}\n\treturn m\n}\n\nfunc (c *Config) Update(m map[string]string) error {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\trType := reflect.TypeOf(c).Elem()\n\trVal := reflect.ValueOf(c).Elem()\n\tfor i := 0; i < rType.NumField(); i++ {\n\t\tv := rVal.Field(i)\n\t\tif !v.CanInterface() {\n\t\t\tcontinue\n\t\t}\n\t\tt := rType.Field(i)\n\t\tkeyName := t.Tag.Get(\"json\")\n\t\tif keyName == \"-\" {\n\t\t\tcontinue\n\t\t}\n\t\tkeyName = keyName[:len(keyName)-10]\n\t\tswitch t.Type.Kind() {\n\t\tcase reflect.Bool:\n\t\t\tif mv, ok := m[keyName]; ok {\n\t\t\t\tv.Set(reflect.ValueOf(utils.ParseBool(mv)))\n\t\t\t}\n\t\tcase reflect.String:\n\t\t\tif t.Type.String() == \"template.HTML\" {\n\t\t\t\tif mv, ok := m[keyName]; ok {\n\t\t\t\t\tv.Set(reflect.ValueOf(template.HTML(mv)))\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif keyName == \"prefix\" {\n\t\t\t\tkeyName = \"url_prefix\"\n\t\t\t} else if keyName == \"index\" {\n\t\t\t\tkeyName = \"index_url\"\n\t\t\t} else if keyName == \"info_log\" || keyName == \"error_log\" || keyName == \"access_log\" {\n\t\t\t\tkeyName += \"_path\"\n\t\t\t}\n\t\t\tif mv, ok := m[keyName]; ok {\n\t\t\t\tif keyName == \"info_log\" || keyName == \"error_log\" || keyName == \"access_log\" {\n\t\t\t\t\tv.Set(reflect.ValueOf(utils.SetDefault(mv, v.String(), v.String())))\n\t\t\t\t} else if keyName == \"app_id\" {\n\t\t\t\t\tv.Set(reflect.ValueOf(utils.SetDefault(mv, \"\", v.String())))\n\t\t\t\t} else if keyName == \"color_scheme\" {\n\t\t\t\t\tif m[\"theme\"] == \"adminlte\" {\n\t\t\t\t\t\tv.Set(reflect.ValueOf(mv))\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tv.Set(reflect.ValueOf(mv))\n\t\t\t\t}\n\t\t\t}\n\t\tcase reflect.Int:\n\t\t\tses, _ := strconv.Atoi(m[keyName])\n\t\t\tif ses != 0 {\n\t\t\t\tv.Set(reflect.ValueOf(ses))\n\t\t\t}\n\t\tcase reflect.Struct:\n\t\t\tswitch t.Type.String() {\n\t\t\tcase \"config.PageAnimation\":\n\t\t\t\tc.Animation.Type = m[\"animation_type\"]\n\t\t\t\tc.Animation.Duration = utils.ParseFloat32(m[\"animation_duration\"])\n\t\t\t\tc.Animation.Delay = utils.ParseFloat32(m[\"animation_delay\"])\n\t\t\tcase \"config.Logger\":\n\t\t\t\tc.Logger.Rotate.MaxSize, _ = strconv.Atoi(m[\"logger_rotate_max_size\"])\n\t\t\t\tc.Logger.Rotate.MaxBackups, _ = strconv.Atoi(m[\"logger_rotate_max_backups\"])\n\t\t\t\tc.Logger.Rotate.MaxAge, _ = strconv.Atoi(m[\"logger_rotate_max_age\"])\n\t\t\t\tc.Logger.Rotate.Compress = utils.ParseBool(m[\"logger_rotate_compress\"])\n\n\t\t\t\tc.Logger.Encoder.Encoding = m[\"logger_encoder_encoding\"]\n\t\t\t\tloggerLevel, _ := strconv.Atoi(m[\"logger_level\"])\n\t\t\t\tc.Logger.Level = int8(loggerLevel)\n\n\t\t\t\tif c.Logger.Encoder.Encoding == \"json\" {\n\t\t\t\t\tc.Logger.Encoder.TimeKey = m[\"logger_encoder_time_key\"]\n\t\t\t\t\tc.Logger.Encoder.LevelKey = m[\"logger_encoder_level_key\"]\n\t\t\t\t\tc.Logger.Encoder.NameKey = m[\"logger_encoder_name_key\"]\n\t\t\t\t\tc.Logger.Encoder.CallerKey = m[\"logger_encoder_caller_key\"]\n\t\t\t\t\tc.Logger.Encoder.MessageKey = m[\"logger_encoder_message_key\"]\n\t\t\t\t\tc.Logger.Encoder.StacktraceKey = m[\"logger_encoder_stacktrace_key\"]\n\t\t\t\t\tc.Logger.Encoder.Level = m[\"logger_encoder_level\"]\n\t\t\t\t\tc.Logger.Encoder.Time = m[\"logger_encoder_time\"]\n\t\t\t\t\tc.Logger.Encoder.Duration = m[\"logger_encoder_duration\"]\n\t\t\t\t\tc.Logger.Encoder.Caller = m[\"logger_encoder_caller\"]\n\t\t\t\t}\n\n\t\t\t\tinitLogger(c)\n\t\t\tcase \"config.FileUploadEngine\":\n\t\t\t\tc.FileUploadEngine = GetFileUploadEngineFromJSON(m[\"file_upload_engine\"])\n\t\t\t}\n\t\tcase reflect.Map:\n\t\t\tif t.Type.String() == \"config.ExtraInfo\" && m[\"extra\"] != \"\" {\n\t\t\t\tvar extra = make(map[string]interface{})\n\t\t\t\t_ = json.Unmarshal([]byte(m[\"extra\"]), &extra)\n\t\t\t\tc.Extra = extra\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// eraseSens erase sensitive info.\nfunc (c *Config) EraseSens() *Config {\n\tfor key := range c.Databases {\n\t\tc.Databases[key] = Database{\n\t\t\tDriver: c.Databases[key].Driver,\n\t\t}\n\t}\n\treturn c\n}\n\nvar (\n\t_global        = new(Config)\n\tcount          uint32\n\tinitializeLock sync.Mutex\n)\n\n// ReadFromJson read the Config from a JSON file.\nfunc ReadFromJson(path string) Config {\n\tjsonByte, err := os.ReadFile(path)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar cfg Config\n\n\terr = json.Unmarshal(jsonByte, &cfg)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn cfg\n}\n\n// ReadFromYaml read the Config from a YAML file.\nfunc ReadFromYaml(path string) Config {\n\tjsonByte, err := os.ReadFile(path)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar cfg Config\n\n\terr = yaml.Unmarshal(jsonByte, &cfg)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn cfg\n}\n\n// ReadFromINI read the Config from a INI file.\nfunc ReadFromINI(path string) Config {\n\tiniCfg, err := ini.Load(path)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tvar cfg = Config{\n\t\tDatabases: make(DatabaseList),\n\t}\n\n\terr = iniCfg.MapTo(&cfg)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfor _, child := range iniCfg.ChildSections(\"database\") {\n\t\tvar d Database\n\t\terr = child.MapTo(&d)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tcfg.Databases[child.Name()[9:]] = d\n\t}\n\n\treturn cfg\n}\n\nfunc SetDefault(cfg *Config) *Config {\n\tcfg.Title = utils.SetDefault(cfg.Title, \"\", \"GoAdmin\")\n\tcfg.LoginTitle = utils.SetDefault(cfg.LoginTitle, \"\", \"GoAdmin\")\n\tcfg.Logo = template.HTML(utils.SetDefault(string(cfg.Logo), \"\", \"<b>Go</b>Admin\"))\n\tcfg.MiniLogo = template.HTML(utils.SetDefault(string(cfg.MiniLogo), \"\", \"<b>G</b>A\"))\n\tcfg.Theme = utils.SetDefault(cfg.Theme, \"\", \"adminlte\")\n\tcfg.IndexUrl = utils.SetDefault(cfg.IndexUrl, \"\", \"/info/manager\")\n\tcfg.LoginUrl = utils.SetDefault(cfg.LoginUrl, \"\", \"/login\")\n\tcfg.AuthUserTable = utils.SetDefault(cfg.AuthUserTable, \"\", \"goadmin_users\")\n\tcfg.ColorScheme = utils.SetDefault(cfg.ColorScheme, \"\", \"skin-black\")\n\tcfg.AssetRootPath = utils.SetDefault(cfg.AssetRootPath, \"\", \"./public/\")\n\tcfg.AssetRootPath = filepath.ToSlash(cfg.AssetRootPath)\n\tcfg.FileUploadEngine.Name = utils.SetDefault(cfg.FileUploadEngine.Name, \"\", \"local\")\n\tcfg.Env = utils.SetDefault(cfg.Env, \"\", EnvProd)\n\tif cfg.SessionLifeTime == 0 {\n\t\t// default two hours\n\t\tcfg.SessionLifeTime = 7200\n\t}\n\tcfg.AppID = utils.Uuid(12)\n\tif cfg.UrlPrefix == \"\" {\n\t\tcfg.prefix = \"/\"\n\t} else if cfg.UrlPrefix[0] != '/' {\n\t\tcfg.prefix = \"/\" + cfg.UrlPrefix\n\t} else {\n\t\tcfg.prefix = cfg.UrlPrefix\n\t}\n\tcfg.URLFormat = cfg.URLFormat.SetDefault()\n\treturn cfg\n}\n\n// Initialize initialize the config.\nfunc Initialize(cfg *Config) *Config {\n\n\tinitializeLock.Lock()\n\tdefer initializeLock.Unlock()\n\n\tif atomic.LoadUint32(&count) != 0 {\n\t\tpanic(\"can not initialize config twice\")\n\t}\n\tatomic.StoreUint32(&count, 1)\n\n\tinitLogger(SetDefault(cfg))\n\n\t_global = cfg\n\n\treturn _global\n}\n\nfunc initLogger(cfg *Config) {\n\tlogger.InitWithConfig(logger.Config{\n\t\tInfoLogOff:         cfg.InfoLogOff,\n\t\tErrorLogOff:        cfg.ErrorLogOff,\n\t\tAccessLogOff:       cfg.AccessLogOff,\n\t\tSqlLogOpen:         cfg.SqlLog,\n\t\tInfoLogPath:        cfg.InfoLogPath,\n\t\tErrorLogPath:       cfg.ErrorLogPath,\n\t\tAccessLogPath:      cfg.AccessLogPath,\n\t\tAccessAssetsLogOff: cfg.AccessAssetsLogOff,\n\t\tRotate: logger.RotateCfg{\n\t\t\tMaxSize:    cfg.Logger.Rotate.MaxSize,\n\t\t\tMaxBackups: cfg.Logger.Rotate.MaxBackups,\n\t\t\tMaxAge:     cfg.Logger.Rotate.MaxAge,\n\t\t\tCompress:   cfg.Logger.Rotate.Compress,\n\t\t},\n\t\tEncode: logger.EncoderCfg{\n\t\t\tTimeKey:       cfg.Logger.Encoder.TimeKey,\n\t\t\tLevelKey:      cfg.Logger.Encoder.LevelKey,\n\t\t\tNameKey:       cfg.Logger.Encoder.NameKey,\n\t\t\tCallerKey:     cfg.Logger.Encoder.CallerKey,\n\t\t\tMessageKey:    cfg.Logger.Encoder.MessageKey,\n\t\t\tStacktraceKey: cfg.Logger.Encoder.StacktraceKey,\n\t\t\tLevel:         cfg.Logger.Encoder.Level,\n\t\t\tTime:          cfg.Logger.Encoder.Time,\n\t\t\tDuration:      cfg.Logger.Encoder.Duration,\n\t\t\tCaller:        cfg.Logger.Encoder.Caller,\n\t\t\tEncoding:      cfg.Logger.Encoder.Encoding,\n\t\t},\n\t\tDebug: cfg.Debug,\n\t\tLevel: cfg.Logger.Level,\n\t})\n}\n\n// AssertPrefix return the prefix of assert.\nfunc AssertPrefix() string {\n\treturn _global.AssertPrefix()\n}\n\n// GetIndexURL get the index url with prefix.\nfunc GetIndexURL() string {\n\treturn _global.GetIndexURL()\n}\n\n// IsProductionEnvironment check the environment if it is production.\nfunc IsProductionEnvironment() bool {\n\treturn _global.IsProductionEnvironment()\n}\n\n// IsNotProductionEnvironment check the environment if it is not production.\nfunc IsNotProductionEnvironment() bool {\n\treturn _global.IsNotProductionEnvironment()\n}\n\n// URLRemovePrefix remove prefix from the given url.\nfunc URLRemovePrefix(url string) string {\n\treturn _global.URLRemovePrefix(url)\n}\n\nfunc Url(suffix string) string {\n\treturn _global.Url(suffix)\n}\n\nfunc GetURLFormats() URLFormat {\n\treturn _global.URLFormat\n}\n\n// Prefix return the prefix.\nfunc Prefix() string {\n\treturn _global.prefix\n}\n\n// PrefixFixSlash return the prefix fix the slash error.\nfunc PrefixFixSlash() string {\n\treturn _global.PrefixFixSlash()\n}\n\n// Get gets the config.\nfunc Get() *Config {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\n\treturn _global.Copy().EraseSens()\n}\n\n// Getter methods\n// ============================\n\nfunc GetDatabases() DatabaseList {\n\tvar list = make(DatabaseList, len(_global.Databases))\n\tfor key := range _global.Databases {\n\t\tlist[key] = Database{\n\t\t\tDriver:     _global.Databases[key].Driver,\n\t\t\tDriverMode: _global.Databases[key].DriverMode,\n\t\t}\n\t}\n\treturn list\n}\n\nfunc GetDomain() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Domain\n}\n\nfunc GetLanguage() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Language\n}\n\nfunc GetAppID() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.AppID\n}\n\nfunc GetUrlPrefix() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.UrlPrefix\n}\n\nfunc GetOpenAdminApi() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.OpenAdminApi\n}\n\nfunc GetAllowDelOperationLog() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.AllowDelOperationLog\n}\n\nfunc GetOperationLogOff() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.OperationLogOff\n}\n\nfunc GetCustom500HTML() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Custom500HTML\n}\n\nfunc GetCustom404HTML() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Custom404HTML\n}\n\nfunc GetCustom403HTML() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Custom403HTML\n}\n\nfunc GetTheme() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Theme\n}\n\nfunc GetStore() Store {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Store\n}\n\nfunc GetTitle() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Title\n}\n\nfunc GetAssetRootPath() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.AssetRootPath\n}\n\nfunc GetLogo() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Logo\n}\n\nfunc GetSiteOff() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.SiteOff\n}\n\nfunc GetMiniLogo() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.MiniLogo\n}\n\nfunc GetIndexUrl() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.IndexUrl\n}\n\nfunc GetLoginUrl() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.LoginUrl\n}\n\nfunc GetDebug() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Debug\n}\n\nfunc GetEnv() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Env\n}\n\nfunc GetInfoLogPath() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.InfoLogPath\n}\n\nfunc GetErrorLogPath() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.ErrorLogPath\n}\n\nfunc GetAccessLogPath() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.AccessLogPath\n}\n\nfunc GetSqlLog() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.SqlLog\n}\n\nfunc GetAccessLogOff() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.AccessLogOff\n}\nfunc GetInfoLogOff() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.InfoLogOff\n}\nfunc GetErrorLogOff() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.ErrorLogOff\n}\n\nfunc GetColorScheme() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.ColorScheme\n}\n\nfunc GetSessionLifeTime() int {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.SessionLifeTime\n}\n\nfunc GetAssetUrl() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.AssetUrl\n}\n\nfunc GetFileUploadEngine() FileUploadEngine {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.FileUploadEngine\n}\n\nfunc GetCustomHeadHtml() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.CustomHeadHtml\n}\n\nfunc GetCustomFootHtml() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.CustomFootHtml\n}\n\nfunc GetFooterInfo() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.FooterInfo\n}\n\nfunc GetLoginTitle() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.LoginTitle\n}\n\nfunc GetLoginLogo() template.HTML {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.LoginLogo\n}\n\nfunc GetAuthUserTable() string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.AuthUserTable\n}\n\nfunc GetExtra() map[string]interface{} {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Extra\n}\n\nfunc GetAnimation() PageAnimation {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.Animation\n}\n\nfunc GetNoLimitLoginIP() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.NoLimitLoginIP\n}\n\nfunc GetHideVisitorUserCenterEntrance() bool {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.HideVisitorUserCenterEntrance\n}\n\nfunc GetExcludeThemeComponents() []string {\n\t_global.lock.RLock()\n\tdefer _global.lock.RUnlock()\n\treturn _global.ExcludeThemeComponents\n}\n\ntype Service struct {\n\tC *Config\n}\n\nfunc (s *Service) Name() string {\n\treturn \"config\"\n}\n\nfunc SrvWithConfig(c *Config) *Service {\n\treturn &Service{c}\n}\n\nfunc GetService(s interface{}) *Config {\n\tif srv, ok := s.(*Service); ok {\n\t\treturn srv.C\n\t}\n\tpanic(\"wrong service\")\n}\n"
  },
  {
    "path": "modules/config/config.ini",
    "content": "domain = localhost\nprefix = admin\nlanguage = en\nindex = /\ndebug = true\nopen_admin_api = true\ncolor_scheme = skin-black\n\n[database.default]\n\nhost = 127.0.0.1\nport = 5432\nuser = postgres\npwd = root\nname = go-admin-test\nmax_idle_con = 50\nmax_open_con = 150\ndriver = postgresql\n\n[store]\n\npath = ./uploads\nprefix = uploads\n"
  },
  {
    "path": "modules/config/config.yaml",
    "content": "---\ndatabase:\n  default:\n    host: 127.0.0.1\n    port: '1433'\n    user: sa\n    pwd: Aa123456\n    name: goadmin\n    max_idle_con: 50\n    max_open_con: 150\n    driver: mssql\ndomain: localhost\nprefix: admin\nstore:\n  path: \"./uploads\"\n  prefix: uploads\nlanguage: en\nindex: \"/\"\ndebug: true\nopen_admin_api: true\ncolor_scheme: skin-black"
  },
  {
    "path": "modules/config/config_test.go",
    "content": "package config\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestConfig_GetIndexUrl(t *testing.T) {\n\tInitialize(&Config{\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().GetIndexURL(), \"/admin\")\n\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"/admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().GetIndexURL(), \"/admin\")\n\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"/admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().GetIndexURL(), \"/admin\")\n}\n\nfunc TestConfig_Index(t *testing.T) {\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().Index(), \"/\")\n}\n\nfunc TestConfig_Prefix(t *testing.T) {\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().Prefix(), \"/admin\")\n\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"/admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().Prefix(), \"/admin\")\n}\n\nfunc TestConfig_Url(t *testing.T) {\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().Url(\"/info/user\"), \"/admin/info/user\")\n\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"/admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().Url(\"/info/user\"), \"/admin/info/user\")\n\tassert.Equal(t, Get().Url(\"/info/user\") != \"/admin/info/user/\", true)\n}\n\nfunc TestConfig_UrlRemovePrefix(t *testing.T) {\n\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"/admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().URLRemovePrefix(\"/admin/info/user\"), \"/info/user\")\n}\n\nfunc TestConfig_PrefixFixSlash(t *testing.T) {\n\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"/admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().PrefixFixSlash(), \"/admin\")\n\n\ttestSetCfg(&Config{\n\t\tUrlPrefix: \"admin\",\n\t\tIndexUrl:  \"/\",\n\t})\n\n\tassert.Equal(t, Get().PrefixFixSlash(), \"/admin\")\n}\n\nfunc TestSet(t *testing.T) {\n\ttestSetCfg(&Config{Theme: \"abc\"})\n\ttestSetCfg(&Config{Theme: \"bcd\"})\n\tassert.Equal(t, Get().Theme, \"bcd\")\n}\n\nfunc TestStore_URL(t *testing.T) {\n\ttestSetCfg(&Config{\n\t\tStore: Store{\n\t\t\tPrefix: \"/file\",\n\t\t\tPath:   \"./uploads\",\n\t\t},\n\t})\n\n\tassert.Equal(t, Get().Store.URL(\"/xxxxxx.png\"), \"/file/xxxxxx.png\")\n\n\ttestSetCfg(&Config{\n\t\tStore: Store{\n\t\t\tPrefix: \"http://xxxxx.com/xxxx/file\",\n\t\t\tPath:   \"./uploads\",\n\t\t},\n\t})\n\n\tassert.Equal(t, Get().Store.URL(\"/xxxxxx.png\"), \"http://xxxxx.com/xxxx/file/xxxxxx.png\")\n\n\ttestSetCfg(&Config{\n\t\tStore: Store{\n\t\t\tPrefix: \"/file\",\n\t\t\tPath:   \"./uploads\",\n\t\t},\n\t})\n\n\tassert.Equal(t, Get().Store.URL(\"http://xxxxx.com/xxxx/file/xxxx.png\"), \"http://xxxxx.com/xxxx/file/xxxx.png\")\n}\n\nfunc TestDatabase_ParamStr(t *testing.T) {\n\tcfg := Database{\n\t\tDriver: DriverMysql,\n\t\tParams: map[string]string{\n\t\t\t\"parseTime\": \"true\",\n\t\t},\n\t}\n\tassert.Equal(t, cfg.ParamStr(), \"?charset=utf8mb4&parseTime=true\")\n}\n\nfunc TestReadFromYaml(t *testing.T) {\n\tcfg := ReadFromYaml(\"./config.yaml\")\n\tassert.Equal(t, cfg.Databases.GetDefault().Driver, \"mssql\")\n\tassert.Equal(t, cfg.Domain, \"localhost\")\n\tassert.Equal(t, cfg.UrlPrefix, \"admin\")\n\tassert.Equal(t, cfg.Store.Path, \"./uploads\")\n\tassert.Equal(t, cfg.IndexUrl, \"/\")\n\tassert.Equal(t, cfg.Debug, true)\n\tassert.Equal(t, cfg.OpenAdminApi, true)\n\tassert.Equal(t, cfg.ColorScheme, \"skin-black\")\n}\n\nfunc TestReadFromINI(t *testing.T) {\n\tcfg := ReadFromINI(\"./config.ini\")\n\tassert.Equal(t, cfg.Databases.GetDefault().Driver, \"postgresql\")\n\tassert.Equal(t, cfg.Domain, \"localhost\")\n\tassert.Equal(t, cfg.UrlPrefix, \"admin\")\n\tassert.Equal(t, cfg.Store.Path, \"./uploads\")\n\tassert.Equal(t, cfg.IndexUrl, \"/\")\n\tassert.Equal(t, cfg.Debug, true)\n\tassert.Equal(t, cfg.OpenAdminApi, true)\n\tassert.Equal(t, cfg.ColorScheme, \"skin-black\")\n}\n\nfunc testSetCfg(cfg *Config) {\n\tcount = 0\n\tInitialize(cfg)\n}\n\nfunc TestUpdate(t *testing.T) {\n\tm := map[string]string{\n\t\t\"access_assets_log_off\":             `true`,\n\t\t\"access_log_off\":                    `false`,\n\t\t\"access_log_path\":                   \"\",\n\t\t\"allow_del_operation_log\":           `false`,\n\t\t\"animation\":                         `{\"type\":\"fadeInUp\",\"duration\":0,\"delay\":0}`,\n\t\t\"animation_delay\":                   `0.00`,\n\t\t\"animation_duration\":                `0`,\n\t\t\"animation_type\":                    `fadeInUp`,\n\t\t\"app_id\":                            `70rv3KwjwjXE`,\n\t\t\"asset_root_path\":                   `./public/`,\n\t\t\"asset_url\":                         \"\",\n\t\t\"auth_user_table\":                   `goadmin_users`,\n\t\t\"bootstrap_file_path\":               `./../datamodel/bootstrap.go`,\n\t\t\"color_scheme\":                      `skin-black`,\n\t\t\"custom_403_html\":                   \"\",\n\t\t\"custom_404_html\":                   \"\",\n\t\t\"custom_500_html\":                   \"\",\n\t\t\"custom_foot_html\":                  \"\",\n\t\t\"custom_head_html\":                  ` <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"//quick.go-admin.cn/official/assets/imgs/icons.ico/favicon-32x32.png\">`,\n\t\t\"databases\":                         `{\"default\":{\"host\":\"127.0.0.1\",\"port\":\"3306\",\"user\":\"root\",\"pwd\":\"root\",\"name\":\"godmin\",\"max_idle_con\":50,\"max_open_con\":150,\"driver\":\"mysql\",\"file\":\"\",\"dsn\":\"\"}}`,\n\t\t\"debug\":                             `true`,\n\t\t\"domain\":                            \"\",\n\t\t\"env\":                               `test`,\n\t\t\"error_log_off\":                     `false`,\n\t\t\"error_log_path\":                    \"\",\n\t\t\"exclude_theme_components\":          `null`,\n\t\t\"extra\":                             \"\",\n\t\t\"file_upload_engine\":                `{\"name\":\"local\",\"config\":null}`,\n\t\t\"footer_info\":                       \"\",\n\t\t\"go_mod_file_path\":                  \"\",\n\t\t\"hide_app_info_entrance\":            `false`,\n\t\t\"hide_config_center_entrance\":       `false`,\n\t\t\"hide_plugin_entrance\":              `false`,\n\t\t\"hide_tool_entrance\":                `false`,\n\t\t\"hide_visitor_user_center_entrance\": `false`,\n\t\t\"index_url\":                         `/`,\n\t\t\"info_log_off\":                      `false`,\n\t\t\"info_log_path\":                     \"\",\n\t\t\"language\":                          `zh`,\n\t\t\"logger_encoder_caller\":             `full`,\n\t\t\"logger_encoder_caller_key\":         `caller`,\n\t\t\"logger_encoder_duration\":           `string`,\n\t\t\"logger_encoder_encoding\":           `console`,\n\t\t\"logger_encoder_level\":              `capitalColor`,\n\t\t\"logger_encoder_level_key\":          `level`,\n\t\t\"logger_encoder_message_key\":        `msg`,\n\t\t\"logger_encoder_name_key\":           `logger`,\n\t\t\"logger_encoder_stacktrace_key\":     `stacktrace`,\n\t\t\"logger_encoder_time\":               `iso8601`,\n\t\t\"logger_encoder_time_key\":           `ts`,\n\t\t\"logger_level\":                      `0`,\n\t\t\"logger_rotate_compress\":            `false`,\n\t\t\"logger_rotate_max_age\":             `30`,\n\t\t\"logger_rotate_max_backups\":         `5`,\n\t\t\"logger_rotate_max_size\":            `10`,\n\t\t\"login_logo\":                        \"\",\n\t\t\"login_title\":                       `GoAdmin`,\n\t\t\"login_url\":                         `/login`,\n\t\t\"logo\":                              `<b>Go</b>Admin`,\n\t\t\"mini_logo\":                         `<b>G</b>A`,\n\t\t\"no_limit_login_ip\":                 `false`,\n\t\t\"open_admin_api\":                    `false`,\n\t\t\"operation_log_off\":                 `false`,\n\t\t\"plugin_file_path\":                  `/go/src/github.com/GoAdminGroup/go-admin/examples/gin/plugins.go`,\n\t\t\"session_life_time\":                 `7200`,\n\t\t\"site_off\":                          `false`,\n\t\t\"sql_log\":                           `true`,\n\t\t\"store\":                             `{\"path\":\"./uploads\",\"prefix\":\"uploads\"}`,\n\t\t\"theme\":                             `sword`,\n\t\t\"title\":                             `GoAdmin`,\n\t\t\"url_prefix\":                        `admin`,\n\t}\n\tc := &Config{}\n\tc2 := &Config{}\n\tif c.Update(m) == nil {\n\t\tif c.Language != c2.Language ||\n\t\t\tc.Domain != c2.Domain ||\n\t\t\tc.Theme != c2.Theme ||\n\t\t\tc.Title != c2.Title ||\n\t\t\tc.Logo != c2.Logo ||\n\t\t\tc.MiniLogo != c2.MiniLogo ||\n\t\t\tc.Debug != c2.Debug ||\n\t\t\tc.SiteOff != c2.SiteOff ||\n\t\t\tc.AccessLogOff != c2.AccessLogOff ||\n\t\t\tc.InfoLogOff != c2.InfoLogOff ||\n\t\t\tc.ErrorLogOff != c2.ErrorLogOff ||\n\t\t\tc.AccessAssetsLogOff != c2.AccessAssetsLogOff ||\n\t\t\tc.InfoLogPath != c2.InfoLogPath ||\n\t\t\tc.ErrorLogPath != c2.ErrorLogPath ||\n\t\t\tc.AccessLogPath != c2.AccessLogPath ||\n\t\t\tc.SqlLog != c2.SqlLog ||\n\t\t\tc.Logger.Rotate.MaxSize != c2.Logger.Rotate.MaxSize ||\n\t\t\tc.Logger.Rotate.MaxBackups != c2.Logger.Rotate.MaxBackups ||\n\t\t\tc.Logger.Rotate.MaxAge != c2.Logger.Rotate.MaxAge ||\n\t\t\tc.Logger.Rotate.Compress != c2.Logger.Rotate.Compress ||\n\t\t\tc.Logger.Encoder.Encoding != c2.Logger.Encoder.Encoding ||\n\t\t\tc.Logger.Level != c2.Logger.Level ||\n\t\t\tc.Logger.Encoder.TimeKey != c2.Logger.Encoder.TimeKey ||\n\t\t\tc.Logger.Encoder.LevelKey != c2.Logger.Encoder.LevelKey ||\n\t\t\tc.Logger.Encoder.NameKey != c2.Logger.Encoder.NameKey ||\n\t\t\tc.Logger.Encoder.CallerKey != c2.Logger.Encoder.CallerKey ||\n\t\t\tc.Logger.Encoder.MessageKey != c2.Logger.Encoder.MessageKey ||\n\t\t\tc.Logger.Encoder.StacktraceKey != c2.Logger.Encoder.StacktraceKey ||\n\t\t\tc.Logger.Encoder.Level != c2.Logger.Encoder.Level ||\n\t\t\tc.Logger.Encoder.Time != c2.Logger.Encoder.Time ||\n\t\t\tc.Logger.Encoder.Duration != c2.Logger.Encoder.Duration ||\n\t\t\tc.Logger.Encoder.Caller != c2.Logger.Encoder.Caller ||\n\t\t\tc.ColorScheme != c2.ColorScheme ||\n\t\t\tc.SessionLifeTime != c2.SessionLifeTime ||\n\t\t\tc.CustomHeadHtml != c2.CustomHeadHtml ||\n\t\t\tc.CustomFootHtml != c2.CustomFootHtml ||\n\t\t\tc.Custom404HTML != c2.Custom404HTML ||\n\t\t\tc.Custom403HTML != c2.Custom403HTML ||\n\t\t\tc.Custom500HTML != c2.Custom500HTML ||\n\t\t\tc.BootstrapFilePath != c2.BootstrapFilePath ||\n\t\t\tc.GoModFilePath != c2.GoModFilePath ||\n\t\t\tc.FooterInfo != c2.FooterInfo ||\n\t\t\tc.LoginTitle != c2.LoginTitle ||\n\t\t\tc.AssetUrl != c2.AssetUrl ||\n\t\t\tc.LoginLogo != c2.LoginLogo ||\n\t\t\tc.NoLimitLoginIP != c2.NoLimitLoginIP ||\n\t\t\tc.AllowDelOperationLog != c2.AllowDelOperationLog ||\n\t\t\tc.OperationLogOff != c2.OperationLogOff ||\n\t\t\tc.HideConfigCenterEntrance != c2.HideConfigCenterEntrance ||\n\t\t\tc.HideAppInfoEntrance != c2.HideAppInfoEntrance ||\n\t\t\tc.HideToolEntrance != c2.HideToolEntrance ||\n\t\t\tc.HidePluginEntrance != c2.HidePluginEntrance ||\n\t\t\tc.FileUploadEngine.Name != c2.FileUploadEngine.Name ||\n\t\t\tc.Animation.Type != c2.Animation.Type ||\n\t\t\tc.Animation.Duration != c2.Animation.Duration ||\n\t\t\tc.Animation.Delay != c2.Animation.Delay ||\n\t\t\t!reflect.DeepEqual(c.Extra, c2.Extra) {\n\t\t\tpanic(\"c.Extra\")\n\t\t}\n\t}\n}\n\nfunc TestToMap(t *testing.T) {\n\tc := &Config{\n\t\tUrlPrefix: \"/admin\",\n\t\tIndexUrl:  \"/\",\n\t\tMiniLogo:  \"<asdfadsf>\",\n\t\tAnimation: PageAnimation{\n\t\t\tType: \"12313213\",\n\t\t},\n\t\tSessionLifeTime:        40,\n\t\tExcludeThemeComponents: []string{\"asdfas\", \"sadfasf\"},\n\t}\n\tm := c.ToMap()\n\tfmt.Println(m)\n\tfmt.Println(m[\"prefix\"], m[\"animation_type\"], m[\"mini_logo\"])\n\n\tarr := []string{\n\t\t\"language\", \"databases\", \"domain\", \"url_prefix\", \"theme\", \"store\", \"title\", \"logo\", \"mini_logo\", \"index_url\",\n\t\t\"site_off\", \"login_url\", \"debug\", \"env\", \"open_admin_api\", \"hide_visitor_user_center_entrance\",\n\t\t\"info_log_path\", \"error_log_path\", \"access_log_path\", \"sql_log\", \"access_log_off\", \"info_log_off\", \"error_log_off\",\n\t\t\"access_assets_log_off\",\n\t\t\"logger_rotate_max_size\", \"logger_rotate_max_backups\", \"logger_rotate_max_age\", \"logger_rotate_compress\",\n\t\t\"logger_encoder_time_key\", \"logger_encoder_level_key\", \"logger_encoder_name_key\", \"logger_encoder_caller_key\",\n\t\t\"logger_encoder_message_key\", \"logger_encoder_stacktrace_key\", \"logger_encoder_level\", \"logger_encoder_time\",\n\t\t\"logger_encoder_duration\", \"logger_encoder_caller\", \"logger_encoder_encoding\", \"logger_level\",\n\t\t\"color_scheme\", \"session_life_time\", \"asset_url\", \"file_upload_engine\", \"custom_head_html\", \"custom_foot_html\",\n\t\t\"custom_404_html\", \"custom_403_html\", \"custom_500_html\", \"bootstrap_file_path\", \"go_mod_file_path\", \"footer_info\",\n\t\t\"app_id\", \"login_title\", \"login_logo\", \"auth_user_table\", \"exclude_theme_components\",\n\t\t\"extra\",\n\t\t\"animation_type\", \"animation_duration\", \"animation_delay\",\n\t\t\"no_limit_login_ip\", \"allow_del_operation_log\", \"operation_log_off\",\n\t\t\"hide_config_center_entrance\", \"hide_app_info_entrance\", \"hide_tool_entrance\", \"hide_plugin_entrance\",\n\t\t\"asset_root_path\",\n\t}\n\n\tfor key := range m {\n\t\tif !utils.InArray(arr, key) {\n\t\t\tpanic(key)\n\t\t}\n\t}\n\n\tfmt.Println(len(arr), len(m))\n}\n"
  },
  {
    "path": "modules/constant/constant.go",
    "content": "package constant\n\nconst (\n\t// PjaxHeader is default pjax http header key.\n\tPjaxHeader = \"X-PJAX\"\n\n\t// PjaxUrlHeader is default pjax url http header key.\n\tPjaxUrlHeader = \"X-PJAX-Url\"\n\n\t// Title is default title of the project.\n\tTitle = \"GoAdmin\"\n\n\tContextNodeNeedAuth = \"need_auth\"\n\n\tIframeKey   = \"__goadmin_iframe\"\n\tIframeIDKey = \"__goadmin_iframe_id\"\n)\n"
  },
  {
    "path": "modules/db/base.go",
    "content": "package db\n\nimport (\n\t\"database/sql\"\n\t\"errors\"\n\t\"sync\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"xorm.io/xorm\"\n)\n\n// Base is a common Connection.\ntype Base struct {\n\tDbList  map[string]*sql.DB\n\tOnce    sync.Once\n\tConfigs config.DatabaseList\n}\n\n// Close implements the method Connection.Close.\nfunc (db *Base) Close() []error {\n\terrs := make([]error, 0)\n\tfor _, d := range db.DbList {\n\t\terrs = append(errs, d.Close())\n\t}\n\treturn errs\n}\n\n// GetDB implements the method Connection.GetDB.\nfunc (db *Base) GetDB(key string) *sql.DB {\n\treturn db.DbList[key]\n}\n\nfunc (db *Base) CreateDB(name string, beans ...interface{}) error {\n\tcfg := db.GetConfig(name)\n\tif cfg.Driver == \"\" {\n\t\treturn errors.New(\"wrong connection name\")\n\t}\n\tengine, err := xorm.NewEngine(cfg.Driver, cfg.GetDSN())\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() {\n\t\t_ = engine.Close()\n\t}()\n\terr = engine.Sync(beans...)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (db *Base) GetConfig(name string) config.Database {\n\treturn db.Configs[name]\n}\n"
  },
  {
    "path": "modules/db/connection.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n)\n\nconst (\n\t// DriverMysql is a const value of mysql driver.\n\tDriverMysql = \"mysql\"\n\t// DriverSqlite is a const value of sqlite driver.\n\tDriverSqlite = \"sqlite\"\n\t// DriverPostgresql is a const value of postgresql driver.\n\tDriverPostgresql = \"postgresql\"\n\t// DriverMssql is a const value of mssql driver.\n\tDriverMssql = \"mssql\"\n\t// DriverOceanBase is a const value of oceanbase driver.\n\tDriverOceanBase = \"oceanbase\"\n)\n\n// Connection is a connection handler of database.\ntype Connection interface {\n\t// Query is the query method of sql.\n\tQuery(query string, args ...interface{}) ([]map[string]interface{}, error)\n\n\t// Exec is the exec method of sql.\n\tExec(query string, args ...interface{}) (sql.Result, error)\n\n\t// QueryWithConnection is the query method with given connection of sql.\n\tQueryWithConnection(conn, query string, args ...interface{}) ([]map[string]interface{}, error)\n\tQueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error)\n\tQueryWith(tx *sql.Tx, conn, query string, args ...interface{}) ([]map[string]interface{}, error)\n\n\t// ExecWithConnection is the exec method with given connection of sql.\n\tExecWithConnection(conn, query string, args ...interface{}) (sql.Result, error)\n\tExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error)\n\tExecWith(tx *sql.Tx, conn, query string, args ...interface{}) (sql.Result, error)\n\n\tBeginTxWithReadUncommitted() *sql.Tx\n\tBeginTxWithReadCommitted() *sql.Tx\n\tBeginTxWithRepeatableRead() *sql.Tx\n\tBeginTx() *sql.Tx\n\tBeginTxWithLevel(level sql.IsolationLevel) *sql.Tx\n\n\tBeginTxWithReadUncommittedAndConnection(conn string) *sql.Tx\n\tBeginTxWithReadCommittedAndConnection(conn string) *sql.Tx\n\tBeginTxWithRepeatableReadAndConnection(conn string) *sql.Tx\n\tBeginTxAndConnection(conn string) *sql.Tx\n\tBeginTxWithLevelAndConnection(conn string, level sql.IsolationLevel) *sql.Tx\n\n\t// InitDB initialize the database connections.\n\tInitDB(cfg map[string]config.Database) Connection\n\n\t// GetName get the connection name.\n\tName() string\n\n\tClose() []error\n\n\tGetDelimiter() string\n\tGetDelimiter2() string\n\tGetDelimiters() []string\n\n\tGetDB(key string) *sql.DB\n\n\tGetConfig(name string) config.Database\n\n\tCreateDB(name string, beans ...interface{}) error\n}\n\n// GetConnectionByDriver return the Connection by given driver name.\nfunc GetConnectionByDriver(driver string) Connection {\n\tswitch driver {\n\tcase \"mysql\":\n\t\treturn GetMysqlDB()\n\tcase \"mssql\":\n\t\treturn GetMssqlDB()\n\tcase \"sqlite\":\n\t\treturn GetSqliteDB()\n\tcase \"postgresql\":\n\t\treturn GetPostgresqlDB()\n\tcase \"oceanbase\":\n\t\treturn GetOceanBaseDB()\n\tdefault:\n\t\tpanic(\"driver not found!\")\n\t}\n}\n\nfunc GetConnectionFromService(srv interface{}) Connection {\n\tif v, ok := srv.(Connection); ok {\n\t\treturn v\n\t}\n\tpanic(\"wrong service\")\n}\n\nfunc GetConnection(srvs service.List) Connection {\n\tif v, ok := srvs.Get(config.GetDatabases().GetDefault().Driver).(Connection); ok {\n\t\treturn v\n\t}\n\tpanic(\"wrong service\")\n}\n\nfunc GetAggregationExpression(driver, field, headField, delimiter string) string {\n\tswitch driver {\n\tcase \"postgresql\":\n\t\treturn fmt.Sprintf(\"string_agg(%s::character varying, '%s') as %s\", field, delimiter, headField)\n\tcase \"mysql\":\n\t\treturn fmt.Sprintf(\"group_concat(%s separator '%s') as %s\", field, delimiter, headField)\n\tcase \"sqlite\":\n\t\treturn fmt.Sprintf(\"group_concat(%s, '%s') as %s\", field, delimiter, headField)\n\tcase \"mssql\":\n\t\treturn fmt.Sprintf(\"string_agg(%s, '%s') as [%s]\", field, delimiter, headField)\n\tcase \"oceanbase\":\n\t\treturn fmt.Sprintf(\"group_concat(%s separator '%s') as %s\", field, delimiter, headField)\n\n\tdefault:\n\t\tpanic(\"wrong driver\")\n\t}\n}\n\nconst (\n\tINSERT = 0\n\tDELETE = 1\n\tUPDATE = 2\n\tQUERY  = 3\n)\n\nvar ignoreErrors = [...][]string{\n\t// insert\n\t{\n\t\t\"LastInsertId is not supported\",\n\t\t\"There is no generated identity value\",\n\t\t\"LastInsertId is not supported by this driver\",\n\t},\n\t// delete\n\t{\n\t\t\"no affect\",\n\t},\n\t// update\n\t{\n\t\t\"LastInsertId is not supported\",\n\t\t\"There is no generated identity value\",\n\t\t\"no affect\",\n\t\t\"LastInsertId is not supported by this driver\",\n\t},\n\t// query\n\t{\n\t\t\"LastInsertId is not supported\",\n\t\t\"There is no generated identity value\",\n\t\t\"no affect\",\n\t\t\"out of index\",\n\t\t\"LastInsertId is not supported by this driver\",\n\t},\n}\n\nfunc CheckError(err error, t int) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tfor _, msg := range ignoreErrors[t] {\n\t\tif strings.Contains(err.Error(), msg) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "modules/db/converter.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\t\"database/sql\"\n)\n\n// SetColVarType set the column type.\nfunc SetColVarType(colVar *[]interface{}, i int, typeName string) {\n\tdt := DT(typeName)\n\tswitch {\n\tcase Contains(dt, BoolTypeList):\n\t\tvar s sql.NullBool\n\t\t(*colVar)[i] = &s\n\tcase Contains(dt, IntTypeList):\n\t\tvar s sql.NullInt64\n\t\t(*colVar)[i] = &s\n\tcase Contains(dt, FloatTypeList):\n\t\tvar s sql.NullFloat64\n\t\t(*colVar)[i] = &s\n\tcase Contains(dt, UintTypeList):\n\t\tvar s []uint8\n\t\t(*colVar)[i] = &s\n\tcase Contains(dt, StringTypeList):\n\t\tvar s sql.NullString\n\t\t(*colVar)[i] = &s\n\tdefault:\n\t\tvar s interface{}\n\t\t(*colVar)[i] = &s\n\t}\n}\n\n// SetResultValue set the result value.\nfunc SetResultValue(result *map[string]interface{}, index string, colVar interface{}, typeName string) {\n\tdt := DT(typeName)\n\tswitch {\n\tcase Contains(dt, BoolTypeList):\n\t\ttemp := *(colVar.(*sql.NullBool))\n\t\tif temp.Valid {\n\t\t\t(*result)[index] = temp.Bool\n\t\t} else {\n\t\t\t(*result)[index] = nil\n\t\t}\n\tcase Contains(dt, IntTypeList):\n\t\ttemp := *(colVar.(*sql.NullInt64))\n\t\tif temp.Valid {\n\t\t\t(*result)[index] = temp.Int64\n\t\t} else {\n\t\t\t(*result)[index] = nil\n\t\t}\n\tcase Contains(dt, FloatTypeList):\n\t\ttemp := *(colVar.(*sql.NullFloat64))\n\t\tif temp.Valid {\n\t\t\t(*result)[index] = temp.Float64\n\t\t} else {\n\t\t\t(*result)[index] = nil\n\t\t}\n\tcase Contains(dt, UintTypeList):\n\t\t(*result)[index] = *(colVar.(*[]uint8))\n\tcase Contains(dt, StringTypeList):\n\t\ttemp := *(colVar.(*sql.NullString))\n\t\tif temp.Valid {\n\t\t\t(*result)[index] = temp.String\n\t\t} else {\n\t\t\t(*result)[index] = nil\n\t\t}\n\tdefault:\n\t\tif colVar2, ok := colVar.(*interface{}); ok {\n\t\t\tif colVar, ok = (*colVar2).(int64); ok {\n\t\t\t\t(*result)[index] = colVar\n\t\t\t} else if colVar, ok = (*colVar2).(string); ok {\n\t\t\t\t(*result)[index] = colVar\n\t\t\t} else if colVar, ok = (*colVar2).(float64); ok {\n\t\t\t\t(*result)[index] = colVar\n\t\t\t} else if colVar, ok = (*colVar2).([]uint8); ok {\n\t\t\t\t(*result)[index] = colVar\n\t\t\t} else {\n\t\t\t\t(*result)[index] = colVar\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "modules/db/dialect/common.go",
    "content": "package dialect\n\nimport \"fmt\"\n\ntype commonDialect struct {\n\tdelimiter  string\n\tdelimiter2 string\n}\n\nfunc (c commonDialect) Insert(comp *SQLComponent) string {\n\tcomp.prepareInsert(c.delimiter, c.delimiter2)\n\treturn comp.Statement\n}\n\nfunc (c commonDialect) Delete(comp *SQLComponent) string {\n\tcomp.Statement = \"delete from \" + c.WrapTableName(comp) + comp.getWheres(c.delimiter, c.delimiter2)\n\treturn comp.Statement\n}\n\nfunc (c commonDialect) Update(comp *SQLComponent) string {\n\tcomp.prepareUpdate(c.delimiter, c.delimiter2)\n\treturn comp.Statement\n}\n\nfunc (c commonDialect) Count(comp *SQLComponent) string {\n\tcomp.prepareUpdate(c.delimiter, c.delimiter2)\n\treturn comp.Statement\n}\n\nfunc (c commonDialect) Select(comp *SQLComponent) string {\n\tcomp.Statement = \"select \" + comp.getFields(c.delimiter, c.delimiter2) + \" from \" + c.WrapTableName(comp) + comp.getJoins(c.delimiter, c.delimiter2) +\n\t\tcomp.getWheres(c.delimiter, c.delimiter2) + comp.getGroupBy() + comp.getOrderBy() + comp.getLimit() + comp.getOffset()\n\treturn comp.Statement\n}\n\nfunc (c commonDialect) ShowColumns(table string) string {\n\treturn fmt.Sprintf(\"select * from information_schema.columns where table_name = '%s'\", table)\n}\n\nfunc (c commonDialect) GetName() string {\n\treturn \"common\"\n}\n\nfunc (c commonDialect) WrapTableName(comp *SQLComponent) string {\n\treturn c.delimiter + comp.TableName + c.delimiter2\n}\n\nfunc (c commonDialect) ShowTables() string {\n\treturn \"show tables\"\n}\n\nfunc (c commonDialect) ShowColumnsWithComment(schema, table string) string {\n\treturn \"\"\n}\n\nfunc (c commonDialect) GetDelimiter() string {\n\treturn c.delimiter\n}\n\nfunc (c commonDialect) GetDelimiter2() string {\n\treturn c.delimiter2\n}\n\nfunc (c commonDialect) GetDelimiters() []string {\n\treturn []string{c.delimiter, c.delimiter2}\n}\n"
  },
  {
    "path": "modules/db/dialect/dialect.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage dialect\n\nimport (\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n)\n\n// Dialect is methods set of different driver.\ntype Dialect interface {\n\t// GetName get dialect's name\n\tGetName() string\n\n\t// ShowColumns show columns of specified table\n\tShowColumns(table string) string\n\n\t// ShowColumnsWithComment show columns with coment of specified table\n\tShowColumnsWithComment(schema, table string) string\n\n\t// ShowTables show tables of database\n\tShowTables() string\n\n\t// Insert\n\tInsert(comp *SQLComponent) string\n\n\t// Delete\n\tDelete(comp *SQLComponent) string\n\n\t// Update\n\tUpdate(comp *SQLComponent) string\n\n\t// Select\n\tSelect(comp *SQLComponent) string\n\n\t// GetDelimiter return the delimiter of Dialect.\n\tGetDelimiter() string\n}\n\n// GetDialect return the default Dialect.\nfunc GetDialect() Dialect {\n\treturn GetDialectByDriver(config.GetDatabases().GetDefault().Driver)\n}\n\n// GetDialectByDriver return the Dialect of given driver.\nfunc GetDialectByDriver(driver string) Dialect {\n\tswitch driver {\n\tcase \"mysql\":\n\t\treturn mysql{\n\t\t\tcommonDialect: commonDialect{delimiter: \"`\", delimiter2: \"`\"},\n\t\t}\n\tcase \"mssql\":\n\t\treturn mssql{\n\t\t\tcommonDialect: commonDialect{delimiter: \"[\", delimiter2: \"]\"},\n\t\t}\n\tcase \"postgresql\":\n\t\treturn postgresql{\n\t\t\tcommonDialect: commonDialect{delimiter: `\"`, delimiter2: `\"`},\n\t\t}\n\tcase \"sqlite\":\n\t\treturn sqlite{\n\t\t\tcommonDialect: commonDialect{delimiter: \"`\", delimiter2: \"`\"},\n\t\t}\n\tcase \"oceanbase\":\n\t\treturn oceanbase{\n\t\t\tcommonDialect: commonDialect{delimiter: \"`\", delimiter2: \"`\"},\n\t\t}\n\tdefault:\n\t\treturn commonDialect{delimiter: \"`\", delimiter2: \"`\"}\n\t}\n}\n\n// H is a shorthand of map.\ntype H map[string]interface{}\n\n// SQLComponent is a sql components set.\ntype SQLComponent struct {\n\tFields     []string\n\tFunctions  []string\n\tTableName  string\n\tWheres     []Where\n\tLeftjoins  []Join\n\tArgs       []interface{}\n\tOrder      string\n\tOffset     string\n\tLimit      string\n\tWhereRaws  string\n\tUpdateRaws []RawUpdate\n\tGroup      string\n\tStatement  string\n\tValues     H\n}\n\n// Where contains the operation and field.\ntype Where struct {\n\tOperation string\n\tField     string\n\tQmark     string\n}\n\n// Join contains the table and field and operation.\ntype Join struct {\n\tTable     string\n\tFieldA    string\n\tOperation string\n\tFieldB    string\n}\n\n// RawUpdate contains the expression and arguments.\ntype RawUpdate struct {\n\tExpression string\n\tArgs       []interface{}\n}\n\n// *******************************\n// internal help function\n// *******************************\n\nfunc (sql *SQLComponent) getLimit() string {\n\tif sql.Limit == \"\" {\n\t\treturn \"\"\n\t}\n\treturn \" limit \" + sql.Limit + \" \"\n}\n\nfunc (sql *SQLComponent) getOffset() string {\n\tif sql.Offset == \"\" {\n\t\treturn \"\"\n\t}\n\treturn \" offset \" + sql.Offset + \" \"\n}\n\nfunc (sql *SQLComponent) getOrderBy() string {\n\tif sql.Order == \"\" {\n\t\treturn \"\"\n\t}\n\treturn \" order by \" + sql.Order + \" \"\n}\n\nfunc (sql *SQLComponent) getGroupBy() string {\n\tif sql.Group == \"\" {\n\t\treturn \"\"\n\t}\n\treturn \" group by \" + sql.Group + \" \"\n}\n\nfunc (sql *SQLComponent) getJoins(delimiter, delimiter2 string) string {\n\tif len(sql.Leftjoins) == 0 {\n\t\treturn \"\"\n\t}\n\tjoins := \"\"\n\tfor _, join := range sql.Leftjoins {\n\t\tjoins += \" left join \" + wrap(delimiter, delimiter2, join.Table) + \" on \" +\n\t\t\tsql.processLeftJoinField(join.FieldA, delimiter, delimiter2) + \" \" + join.Operation + \" \" +\n\t\t\tsql.processLeftJoinField(join.FieldB, delimiter, delimiter2) + \" \"\n\t}\n\treturn joins\n}\n\nfunc (sql *SQLComponent) processLeftJoinField(field, delimiter, delimiter2 string) string {\n\tarr := strings.Split(field, \".\")\n\tif len(arr) > 0 {\n\t\treturn delimiter + arr[0] + delimiter2 + \".\" + delimiter + arr[1] + delimiter2\n\t}\n\treturn field\n}\n\nfunc (sql *SQLComponent) getFields(delimiter, delimiter2 string) string {\n\tif len(sql.Fields) == 0 {\n\t\treturn \"*\"\n\t}\n\tfields := \"\"\n\tif len(sql.Leftjoins) == 0 {\n\t\tfor k, field := range sql.Fields {\n\t\t\tif sql.Functions[k] != \"\" {\n\t\t\t\tfields += sql.Functions[k] + \"(\" + wrap(delimiter, delimiter2, field) + \"),\"\n\t\t\t} else {\n\t\t\t\tfields += wrap(delimiter, delimiter2, field) + \",\"\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor _, field := range sql.Fields {\n\t\t\tarr := strings.Split(field, \".\")\n\t\t\tif len(arr) > 1 {\n\t\t\t\tfields += wrap(delimiter, delimiter2, arr[0]) + \".\" + wrap(delimiter, delimiter2, arr[1]) + \",\"\n\t\t\t} else {\n\t\t\t\tfields += wrap(delimiter, delimiter2, field) + \",\"\n\t\t\t}\n\t\t}\n\t}\n\treturn fields[:len(fields)-1]\n}\n\nfunc wrap(delimiter, delimiter2, field string) string {\n\tif field == \"*\" {\n\t\treturn \"*\"\n\t}\n\treturn delimiter + field + delimiter2\n}\n\nfunc (sql *SQLComponent) getWheres(delimiter, delimiter2 string) string {\n\tif len(sql.Wheres) == 0 {\n\t\tif sql.WhereRaws != \"\" {\n\t\t\treturn \" where \" + sql.WhereRaws\n\t\t}\n\t\treturn \"\"\n\t}\n\twheres := \" where \"\n\tvar arr []string\n\tfor _, where := range sql.Wheres {\n\t\tarr = strings.Split(where.Field, \".\")\n\t\tif len(arr) > 1 {\n\t\t\twheres += arr[0] + \".\" + wrap(delimiter, delimiter2, arr[1]) + \" \" + where.Operation + \" \" + where.Qmark + \" and \"\n\t\t} else {\n\t\t\twheres += wrap(delimiter, delimiter2, where.Field) + \" \" + where.Operation + \" \" + where.Qmark + \" and \"\n\t\t}\n\t}\n\n\tif sql.WhereRaws != \"\" {\n\t\treturn wheres + sql.WhereRaws\n\t}\n\treturn wheres[:len(wheres)-5]\n}\n\nfunc (sql *SQLComponent) prepareUpdate(delimiter, delimiter2 string) {\n\tfields := \"\"\n\targs := make([]interface{}, 0)\n\n\tif len(sql.Values) != 0 {\n\n\t\tfor key, value := range sql.Values {\n\t\t\tfields += wrap(delimiter, delimiter2, key) + \" = ?, \"\n\t\t\targs = append(args, value)\n\t\t}\n\n\t\tif len(sql.UpdateRaws) == 0 {\n\t\t\tfields = fields[:len(fields)-2]\n\t\t} else {\n\t\t\tfor i := 0; i < len(sql.UpdateRaws); i++ {\n\t\t\t\tif i == len(sql.UpdateRaws)-1 {\n\t\t\t\t\tfields += sql.UpdateRaws[i].Expression + \" \"\n\t\t\t\t} else {\n\t\t\t\t\tfields += sql.UpdateRaws[i].Expression + \",\"\n\t\t\t\t}\n\t\t\t\targs = append(args, sql.UpdateRaws[i].Args...)\n\t\t\t}\n\t\t}\n\n\t\tsql.Args = append(args, sql.Args...)\n\t} else {\n\t\tif len(sql.UpdateRaws) == 0 {\n\t\t\tpanic(\"prepareUpdate: wrong parameter\")\n\t\t} else {\n\t\t\tfor i := 0; i < len(sql.UpdateRaws); i++ {\n\t\t\t\tif i == len(sql.UpdateRaws)-1 {\n\t\t\t\t\tfields += sql.UpdateRaws[i].Expression + \" \"\n\t\t\t\t} else {\n\t\t\t\t\tfields += sql.UpdateRaws[i].Expression + \",\"\n\t\t\t\t}\n\t\t\t\targs = append(args, sql.UpdateRaws[i].Args...)\n\t\t\t}\n\t\t}\n\t\tsql.Args = append(args, sql.Args...)\n\t}\n\n\tsql.Statement = \"update \" + delimiter + sql.TableName + delimiter2 + \" set \" + fields + sql.getWheres(delimiter, delimiter2)\n}\n\nfunc (sql *SQLComponent) prepareInsert(delimiter, delimiter2 string) {\n\tfields := \" (\"\n\tquesMark := \"(\"\n\n\tfor key, value := range sql.Values {\n\t\tfields += wrap(delimiter, delimiter2, key) + \",\"\n\t\tquesMark += \"?,\"\n\t\tsql.Args = append(sql.Args, value)\n\t}\n\tfields = fields[:len(fields)-1] + \")\"\n\tquesMark = quesMark[:len(quesMark)-1] + \")\"\n\n\tsql.Statement = \"insert into \" + delimiter + sql.TableName + delimiter2 + fields + \" values \" + quesMark\n}\n"
  },
  {
    "path": "modules/db/dialect/mssql.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage dialect\n\nimport \"fmt\"\n\ntype mssql struct {\n\tcommonDialect\n}\n\nfunc (mssql) GetName() string {\n\treturn \"mssql\"\n}\n\nfunc (mssql) ShowColumnsWithComment(schema, table string) string {\n\treturn fmt.Sprintf(\"select column_name, data_type from information_schema.columns where table_name = '%s'\", table)\n}\n\nfunc (mssql) ShowColumns(table string) string {\n\treturn fmt.Sprintf(\"select column_name, data_type from information_schema.columns where table_name = '%s'\", table)\n}\n\nfunc (mssql) ShowTables() string {\n\treturn \"select * from information_schema.TABLES\"\n}\n"
  },
  {
    "path": "modules/db/dialect/mysql.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage dialect\n\ntype mysql struct {\n\tcommonDialect\n}\n\nfunc (mysql) GetName() string {\n\treturn \"mysql\"\n}\n\nfunc (mysql) ShowColumnsWithComment(schema, table string) string {\n\treturn `SELECT \n\t\t\tCOLUMN_NAME Field, DATA_TYPE Type, IS_NULLABLE 'Null', COLUMN_KEY 'Key', COLUMN_DEFAULT 'Default', EXTRA Extra, COLUMN_COMMENT Comment \n\t\tFROM information_schema.COLUMNS \n\t\tWHERE \n\t\t\ttable_name = '` + table + `'\n\t\tAND\n\t\t\ttable_schema = '` + schema + `'`\n}\n\nfunc (mysql) ShowColumns(table string) string {\n\treturn \"show columns in \" + table\n}\n\nfunc (mysql) ShowTables() string {\n\treturn \"show tables\"\n}\n"
  },
  {
    "path": "modules/db/dialect/oceanbase.go",
    "content": "package dialect\n\ntype oceanbase struct {\n\tcommonDialect\n}\n\nfunc (oceanbase) GetName() string {\n\treturn \"oceanbase\"\n}\n\nfunc (oceanbase) ShowColumnsWithComment(schema, table string) string {\n\treturn \"show columns in \" + table\n}\n\nfunc (oceanbase) ShowColumns(table string) string {\n\treturn \"show columns in \" + table\n}\n\nfunc (oceanbase) ShowTables() string {\n\treturn \"show tables\"\n}\n"
  },
  {
    "path": "modules/db/dialect/postgresql.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage dialect\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype postgresql struct {\n\tcommonDialect\n}\n\nfunc (postgresql) GetName() string {\n\treturn \"postgresql\"\n}\n\nfunc (postgresql) ShowColumnsWithComment(schema, table string) string {\n\ttableArr := strings.Split(table, \"\\\".\\\"\")\n\tif len(tableArr) > 1 {\n\t\treturn fmt.Sprintf(\"select * from information_schema.columns where table_name = '%s' and table_schema = '%s'\", tableArr[1], tableArr[0])\n\t} else {\n\t\treturn fmt.Sprintf(\"select * from information_schema.columns where table_name = '%s'\", table)\n\t}\n}\n\nfunc (postgresql) ShowTables() string {\n\treturn \"SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema';\"\n}\n\nfunc (postgresql) ShowColumns(table string) string {\n\ttableArr := strings.Split(table, \"\\\".\\\"\")\n\tif len(tableArr) > 1 {\n\t\treturn fmt.Sprintf(\"select * from information_schema.columns where table_name = '%s' and table_schema = '%s'\", tableArr[1], tableArr[0])\n\t} else {\n\t\treturn fmt.Sprintf(\"select * from information_schema.columns where table_name = '%s'\", table)\n\t}\n}\n"
  },
  {
    "path": "modules/db/dialect/sqlite.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage dialect\n\ntype sqlite struct {\n\tcommonDialect\n}\n\nfunc (sqlite) GetName() string {\n\treturn \"sqlite\"\n}\n\nfunc (sqlite) ShowColumnsWithComment(schema, table string) string {\n\treturn \"PRAGMA table_info(\" + table + \");\"\n}\n\nfunc (sqlite) ShowColumns(table string) string {\n\treturn \"PRAGMA table_info(\" + table + \");\"\n}\n\nfunc (sqlite) ShowTables() string {\n\treturn \"SELECT name as tablename FROM sqlite_master WHERE type ='table'\"\n}\n"
  },
  {
    "path": "modules/db/drivers/mssql/mssql.go",
    "content": "package mssql\n\nimport _ \"github.com/denisenkom/go-mssqldb\" // Import the mssql driver.\n"
  },
  {
    "path": "modules/db/drivers/mysql/mysql.go",
    "content": "package mysql\n\nimport _ \"github.com/go-sql-driver/mysql\" // Import the mysql driver.\n"
  },
  {
    "path": "modules/db/drivers/oceanbase/oceanbase.go",
    "content": "package oceanbase\n\n//oceanbase-ce can use mysql driver\nimport _ \"github.com/go-sql-driver/mysql\" // Import the mysql driver.\n"
  },
  {
    "path": "modules/db/drivers/postgres/postgres.go",
    "content": "package postgres\n\nimport _ \"github.com/lib/pq\" // Import the postgresql driver.\n"
  },
  {
    "path": "modules/db/drivers/sqlite/sqlite.go",
    "content": "package sqlite\n\nimport _ \"github.com/mattn/go-sqlite3\" // Import the sqlite driver.\n"
  },
  {
    "path": "modules/db/mssql.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n)\n\n// Mssql is a Connection of mssql.\ntype Mssql struct {\n\tBase\n}\n\n// GetMssqlDB return the global mssql connection.\nfunc GetMssqlDB() *Mssql {\n\treturn &Mssql{\n\t\tBase: Base{\n\t\t\tDbList: make(map[string]*sql.DB),\n\t\t},\n\t}\n}\n\n// GetDelimiter implements the method Connection.GetDelimiter.\nfunc (db *Mssql) GetDelimiter() string {\n\treturn \"[\"\n}\n\n// GetDelimiter2 implements the method Connection.GetDelimiter2.\nfunc (db *Mssql) GetDelimiter2() string {\n\treturn \"]\"\n}\n\n// GetDelimiters implements the method Connection.GetDelimiters.\nfunc (db *Mssql) GetDelimiters() []string {\n\treturn []string{\"[\", \"]\"}\n}\n\n// Name implements the method Connection.Name.\nfunc (db *Mssql) Name() string {\n\treturn \"mssql\"\n}\n\n// TODO: 整理优化\n\nfunc replaceStringFunc(pattern, src string, rpl func(s string) string) (string, error) {\n\n\tr, err := regexp.Compile(pattern)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tbytes := r.ReplaceAllFunc([]byte(src), func(bytes []byte) []byte {\n\t\treturn []byte(rpl(string(bytes)))\n\t})\n\n\treturn string(bytes), nil\n}\n\nfunc replace(pattern string, replace, src []byte) ([]byte, error) {\n\n\tr, err := regexp.Compile(pattern)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn r.ReplaceAll(src, replace), nil\n}\n\nfunc replaceString(pattern, rep, src string) (string, error) {\n\tr, e := replace(pattern, []byte(rep), []byte(src))\n\treturn string(r), e\n}\n\nfunc matchAllString(pattern string, src string) ([][]string, error) {\n\tr, err := regexp.Compile(pattern)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn r.FindAllStringSubmatch(src, -1), nil\n}\n\nfunc isMatch(pattern string, src []byte) bool {\n\tr, err := regexp.Compile(pattern)\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn r.Match(src)\n}\n\nfunc isMatchString(pattern string, src string) bool {\n\treturn isMatch(pattern, []byte(src))\n}\n\nfunc matchString(pattern string, src string) ([]string, error) {\n\tr, err := regexp.Compile(pattern)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn r.FindStringSubmatch(src), nil\n}\n\n// 从Gf框架复制\n// 在执行sql之前对sql进行进一步处理\nfunc (db *Mssql) handleSqlBeforeExec(query string) string {\n\tindex := 0\n\tstr, _ := replaceStringFunc(\"\\\\?\", query, func(s string) string {\n\t\tindex++\n\t\treturn fmt.Sprintf(\"@p%d\", index)\n\t})\n\n\tstr, _ = replaceString(\"\\\"\", \"\", str)\n\n\treturn db.parseSql(str)\n}\n\n//将MYSQL的SQL语法转换为MSSQL的语法\n//1.由于mssql不支持limit写法所以需要对mysql中的limit用法做转换\nfunc (db *Mssql) parseSql(sql string) string {\n\t//下面的正则表达式匹配出SELECT和INSERT的关键字后分别做不同的处理，如有LIMIT则将LIMIT的关键字也匹配出\n\tpatten := `^\\s*(?i)(SELECT)|(LIMIT\\s*(\\d+)\\s*,\\s*(\\d+))`\n\tif !isMatchString(patten, sql) {\n\t\t//fmt.Println(\"not matched..\")\n\t\treturn sql\n\t}\n\n\tres, err := matchAllString(patten, sql)\n\tif err != nil {\n\t\t//fmt.Println(\"MatchString error.\", err)\n\t\treturn \"\"\n\t}\n\n\tindex := 0\n\tkeyword := strings.TrimSpace(res[index][0])\n\tkeyword = strings.ToUpper(keyword)\n\n\tindex++\n\tswitch keyword {\n\tcase \"SELECT\":\n\t\t//不含LIMIT关键字则不处理\n\t\tif len(res) < 2 || (!strings.HasPrefix(res[index][0], \"LIMIT\") && !strings.HasPrefix(res[index][0], \"limit\")) {\n\t\t\tbreak\n\t\t}\n\n\t\t//不含LIMIT则不处理\n\t\tif !isMatchString(\"((?i)SELECT)(.+)((?i)LIMIT)\", sql) {\n\t\t\tbreak\n\t\t}\n\n\t\t//判断SQL中是否含有order by\n\t\tselectStr := \"\"\n\t\torderbyStr := \"\"\n\t\thaveOrderby := isMatchString(\"((?i)SELECT)(.+)((?i)ORDER BY)\", sql)\n\t\tif haveOrderby {\n\t\t\t//取order by 前面的字符串\n\t\t\tqueryExpr, _ := matchString(\"((?i)SELECT)(.+)((?i)ORDER BY)\", sql)\n\n\t\t\tif len(queryExpr) != 4 || !strings.EqualFold(queryExpr[1], \"SELECT\") || !strings.EqualFold(queryExpr[3], \"ORDER BY\") {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tselectStr = queryExpr[2]\n\n\t\t\t//取order by表达式的值\n\t\t\torderbyExpr, _ := matchString(\"((?i)ORDER BY)(.+)((?i)LIMIT)\", sql)\n\t\t\tif len(orderbyExpr) != 4 || !strings.EqualFold(orderbyExpr[1], \"ORDER BY\") || !strings.EqualFold(orderbyExpr[3], \"LIMIT\") {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\torderbyStr = orderbyExpr[2]\n\t\t} else {\n\t\t\tqueryExpr, _ := matchString(\"((?i)SELECT)(.+)((?i)LIMIT)\", sql)\n\t\t\tif len(queryExpr) != 4 || !strings.EqualFold(queryExpr[1], \"SELECT\") || !strings.EqualFold(queryExpr[3], \"LIMIT\") {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tselectStr = queryExpr[2]\n\t\t}\n\n\t\t//取limit后面的取值范围\n\t\tfirst, limit := 0, 0\n\t\tfor i := 1; i < len(res[index]); i++ {\n\t\t\tif strings.TrimSpace(res[index][i]) == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif strings.HasPrefix(res[index][i], \"LIMIT\") || strings.HasPrefix(res[index][i], \"limit\") {\n\t\t\t\tfirst, _ = strconv.Atoi(res[index][i+1])\n\t\t\t\tlimit, _ = strconv.Atoi(res[index][i+2])\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif haveOrderby {\n\t\t\tsql = fmt.Sprintf(\"SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY %s) as ROWNUMBER_, %s   ) as TMP_ WHERE TMP_.ROWNUMBER_ > %d AND TMP_.ROWNUMBER_ <= %d\", orderbyStr, selectStr, first, limit)\n\t\t} else {\n\t\t\tif first == 0 {\n\t\t\t\tfirst = limit\n\t\t\t} else {\n\t\t\t\tfirst = limit - first\n\t\t\t}\n\t\t\tsql = fmt.Sprintf(\"SELECT * FROM (SELECT TOP %d * FROM (SELECT TOP %d %s) as TMP1_ ) as TMP2_ \", first, limit, selectStr)\n\t\t}\n\tdefault:\n\t}\n\treturn sql\n}\n\n// QueryWithConnection implements the method Connection.QueryWithConnection.\nfunc (db *Mssql) QueryWithConnection(con string, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\tquery = db.handleSqlBeforeExec(query)\n\treturn CommonQuery(db.DbList[con], query, args...)\n}\n\n// ExecWithConnection implements the method Connection.ExecWithConnection.\nfunc (db *Mssql) ExecWithConnection(con string, query string, args ...interface{}) (sql.Result, error) {\n\tquery = db.handleSqlBeforeExec(query)\n\treturn CommonExec(db.DbList[con], query, args...)\n}\n\n// Query implements the method Connection.Query.\nfunc (db *Mssql) Query(query string, args ...interface{}) ([]map[string]interface{}, error) {\n\tquery = db.handleSqlBeforeExec(query)\n\treturn CommonQuery(db.DbList[\"default\"], query, args...)\n}\n\n// Exec implements the method Connection.Exec.\nfunc (db *Mssql) Exec(query string, args ...interface{}) (sql.Result, error) {\n\tquery = db.handleSqlBeforeExec(query)\n\treturn CommonExec(db.DbList[\"default\"], query, args...)\n}\n\nfunc (db *Mssql) QueryWith(tx *sql.Tx, conn, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\tif tx != nil {\n\t\treturn db.QueryWithTx(tx, query, args...)\n\t}\n\treturn db.QueryWithConnection(conn, query, args...)\n}\n\nfunc (db *Mssql) ExecWith(tx *sql.Tx, conn, query string, args ...interface{}) (sql.Result, error) {\n\tif tx != nil {\n\t\treturn db.ExecWithTx(tx, query, args...)\n\t}\n\treturn db.ExecWithConnection(conn, query, args...)\n}\n\n// InitDB implements the method Connection.InitDB.\nfunc (db *Mssql) InitDB(cfgs map[string]config.Database) Connection {\n\tdb.Configs = cfgs\n\tdb.Once.Do(func() {\n\t\tfor conn, cfg := range cfgs {\n\n\t\t\tsqlDB, err := sql.Open(\"sqlserver\", cfg.GetDSN())\n\n\t\t\tif sqlDB == nil {\n\t\t\t\tpanic(\"invalid connection\")\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\t_ = sqlDB.Close()\n\t\t\t\tpanic(err.Error())\n\t\t\t}\n\n\t\t\tsqlDB.SetMaxIdleConns(cfg.MaxIdleConns)\n\t\t\tsqlDB.SetMaxOpenConns(cfg.MaxOpenConns)\n\t\t\tsqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)\n\t\t\tsqlDB.SetConnMaxIdleTime(cfg.ConnMaxIdleTime)\n\n\t\t\tdb.DbList[conn] = sqlDB\n\n\t\t\tif err := sqlDB.Ping(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t})\n\treturn db\n}\n\n// BeginTxWithReadUncommitted starts a transaction with level LevelReadUncommitted.\nfunc (db *Mssql) BeginTxWithReadUncommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommitted starts a transaction with level LevelReadCommitted.\nfunc (db *Mssql) BeginTxWithReadCommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableRead starts a transaction with level LevelRepeatableRead.\nfunc (db *Mssql) BeginTxWithRepeatableRead() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelRepeatableRead)\n}\n\n// BeginTx starts a transaction with level LevelDefault.\nfunc (db *Mssql) BeginTx() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelDefault)\n}\n\n// BeginTxWithLevel starts a transaction with given transaction isolation level.\nfunc (db *Mssql) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], level)\n}\n\n// BeginTxWithReadUncommittedAndConnection starts a transaction with level LevelReadUncommitted and connection.\nfunc (db *Mssql) BeginTxWithReadUncommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommittedAndConnection starts a transaction with level LevelReadCommitted and connection.\nfunc (db *Mssql) BeginTxWithReadCommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableReadAndConnection starts a transaction with level LevelRepeatableRead and connection.\nfunc (db *Mssql) BeginTxWithRepeatableReadAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelRepeatableRead)\n}\n\n// BeginTxAndConnection starts a transaction with level LevelDefault and connection.\nfunc (db *Mssql) BeginTxAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelDefault)\n}\n\n// BeginTxWithLevelAndConnection starts a transaction with given transaction isolation level and connection.\nfunc (db *Mssql) BeginTxWithLevelAndConnection(conn string, level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], level)\n}\n\n// QueryWithTx is query method within the transaction.\nfunc (db *Mssql) QueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\tquery = db.handleSqlBeforeExec(query)\n\treturn CommonQueryWithTx(tx, query, args...)\n}\n\n// ExecWithTx is exec method within the transaction.\nfunc (db *Mssql) ExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error) {\n\tquery = db.handleSqlBeforeExec(query)\n\treturn CommonExecWithTx(tx, query, args...)\n}\n"
  },
  {
    "path": "modules/db/mysql.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\t\"database/sql\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n)\n\n// SQLTx is an in-progress database transaction.\ntype SQLTx struct {\n\tTx *sql.Tx\n}\n\n// Mysql is a Connection of mysql.\ntype Mysql struct {\n\tBase\n}\n\n// GetMysqlDB return the global mysql connection.\nfunc GetMysqlDB() *Mysql {\n\treturn &Mysql{\n\t\tBase: Base{\n\t\t\tDbList: make(map[string]*sql.DB),\n\t\t},\n\t}\n}\n\n// Name implements the method Connection.Name.\nfunc (db *Mysql) Name() string {\n\treturn \"mysql\"\n}\n\n// GetDelimiter implements the method Connection.GetDelimiter.\nfunc (db *Mysql) GetDelimiter() string {\n\treturn \"`\"\n}\n\n// GetDelimiter2 implements the method Connection.GetDelimiter2.\nfunc (db *Mysql) GetDelimiter2() string {\n\treturn \"`\"\n}\n\n// GetDelimiters implements the method Connection.GetDelimiters.\nfunc (db *Mysql) GetDelimiters() []string {\n\treturn []string{\"`\", \"`\"}\n}\n\n// InitDB implements the method Connection.InitDB.\nfunc (db *Mysql) InitDB(cfgs map[string]config.Database) Connection {\n\tdb.Configs = cfgs\n\tdb.Once.Do(func() {\n\t\tfor conn, cfg := range cfgs {\n\n\t\t\tsqlDB, err := sql.Open(\"mysql\", cfg.GetDSN())\n\n\t\t\tif err != nil {\n\t\t\t\tif sqlDB != nil {\n\t\t\t\t\t_ = sqlDB.Close()\n\t\t\t\t}\n\t\t\t\tpanic(err)\n\t\t\t}\n\n\t\t\t// Largest set up the database connection reduce time wait\n\t\t\tsqlDB.SetMaxIdleConns(cfg.MaxIdleConns)\n\t\t\tsqlDB.SetMaxOpenConns(cfg.MaxOpenConns)\n\t\t\tsqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)\n\t\t\tsqlDB.SetConnMaxIdleTime(cfg.ConnMaxIdleTime)\n\n\t\t\tdb.DbList[conn] = sqlDB\n\n\t\t\tif err := sqlDB.Ping(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t})\n\treturn db\n}\n\n// QueryWithConnection implements the method Connection.QueryWithConnection.\nfunc (db *Mysql) QueryWithConnection(con string, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQuery(db.DbList[con], query, args...)\n}\n\n// ExecWithConnection implements the method Connection.ExecWithConnection.\nfunc (db *Mysql) ExecWithConnection(con string, query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExec(db.DbList[con], query, args...)\n}\n\n// Query implements the method Connection.Query.\nfunc (db *Mysql) Query(query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQuery(db.DbList[\"default\"], query, args...)\n}\n\n// Exec implements the method Connection.Exec.\nfunc (db *Mysql) Exec(query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExec(db.DbList[\"default\"], query, args...)\n}\n\n// QueryWithTx is query method within the transaction.\nfunc (db *Mysql) QueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQueryWithTx(tx, query, args...)\n}\n\n// ExecWithTx is exec method within the transaction.\nfunc (db *Mysql) ExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExecWithTx(tx, query, args...)\n}\n\nfunc (db *Mysql) QueryWith(tx *sql.Tx, conn, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\tif tx != nil {\n\t\treturn db.QueryWithTx(tx, query, args...)\n\t}\n\treturn db.QueryWithConnection(conn, query, args...)\n}\n\nfunc (db *Mysql) ExecWith(tx *sql.Tx, conn, query string, args ...interface{}) (sql.Result, error) {\n\tif tx != nil {\n\t\treturn db.ExecWithTx(tx, query, args...)\n\t}\n\treturn db.ExecWithConnection(conn, query, args...)\n}\n\n// BeginTxWithReadUncommitted starts a transaction with level LevelReadUncommitted.\nfunc (db *Mysql) BeginTxWithReadUncommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommitted starts a transaction with level LevelReadCommitted.\nfunc (db *Mysql) BeginTxWithReadCommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableRead starts a transaction with level LevelRepeatableRead.\nfunc (db *Mysql) BeginTxWithRepeatableRead() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelRepeatableRead)\n}\n\n// BeginTx starts a transaction with level LevelDefault.\nfunc (db *Mysql) BeginTx() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelDefault)\n}\n\n// BeginTxWithLevel starts a transaction with given transaction isolation level.\nfunc (db *Mysql) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], level)\n}\n\n// BeginTxWithReadUncommittedAndConnection starts a transaction with level LevelReadUncommitted and connection.\nfunc (db *Mysql) BeginTxWithReadUncommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommittedAndConnection starts a transaction with level LevelReadCommitted and connection.\nfunc (db *Mysql) BeginTxWithReadCommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableReadAndConnection starts a transaction with level LevelRepeatableRead and connection.\nfunc (db *Mysql) BeginTxWithRepeatableReadAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelRepeatableRead)\n}\n\n// BeginTxAndConnection starts a transaction with level LevelDefault and connection.\nfunc (db *Mysql) BeginTxAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelDefault)\n}\n\n// BeginTxWithLevelAndConnection starts a transaction with given transaction isolation level and connection.\nfunc (db *Mysql) BeginTxWithLevelAndConnection(conn string, level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], level)\n}\n"
  },
  {
    "path": "modules/db/oceanbase.go",
    "content": "package db\n\nimport (\n\t\"database/sql\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n)\n\n// OceanBase is a Connection of OceanBase.\ntype OceanBase struct {\n\tBase\n}\n\n// GetOceanBaseDB return the global OceanBase connection.\nfunc GetOceanBaseDB() *OceanBase {\n\treturn &OceanBase{\n\t\tBase: Base{\n\t\t\tDbList: make(map[string]*sql.DB),\n\t\t},\n\t}\n}\n\n// Name implements the method Connection.Name.\nfunc (db *OceanBase) Name() string {\n\treturn \"OceanBase\"\n}\n\n// GetDelimiter implements the method Connection.GetDelimiter.\nfunc (db *OceanBase) GetDelimiter() string {\n\treturn \"`\"\n}\n\n// GetDelimiter2 implements the method Connection.GetDelimiter2.\nfunc (db *OceanBase) GetDelimiter2() string {\n\treturn \"`\"\n}\n\n// GetDelimiters implements the method Connection.GetDelimiters.\nfunc (db *OceanBase) GetDelimiters() []string {\n\treturn []string{\"`\", \"`\"}\n}\n\n// InitDB implements the method Connection.InitDB.\nfunc (db *OceanBase) InitDB(cfgs map[string]config.Database) Connection {\n\tdb.Configs = cfgs\n\tdb.Once.Do(func() {\n\t\tfor conn, cfg := range cfgs {\n\n\t\t\tsqlDB, err := sql.Open(\"mysql\", cfg.GetDSN())\n\n\t\t\tif err != nil {\n\t\t\t\tif sqlDB != nil {\n\t\t\t\t\t_ = sqlDB.Close()\n\t\t\t\t}\n\t\t\t\tpanic(err)\n\t\t\t}\n\n\t\t\t// Largest set up the database connection reduce time wait\n\t\t\tsqlDB.SetMaxIdleConns(cfg.MaxIdleConns)\n\t\t\tsqlDB.SetMaxOpenConns(cfg.MaxOpenConns)\n\t\t\tsqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)\n\t\t\tsqlDB.SetConnMaxIdleTime(cfg.ConnMaxIdleTime)\n\n\t\t\tdb.DbList[conn] = sqlDB\n\n\t\t\tif err := sqlDB.Ping(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t})\n\treturn db\n}\n\n// QueryWithConnection implements the method Connection.QueryWithConnection.\nfunc (db *OceanBase) QueryWithConnection(con string, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQuery(db.DbList[con], query, args...)\n}\n\n// ExecWithConnection implements the method Connection.ExecWithConnection.\nfunc (db *OceanBase) ExecWithConnection(con string, query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExec(db.DbList[con], query, args...)\n}\n\n// Query implements the method Connection.Query.\nfunc (db *OceanBase) Query(query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQuery(db.DbList[\"default\"], query, args...)\n}\n\n// Exec implements the method Connection.Exec.\nfunc (db *OceanBase) Exec(query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExec(db.DbList[\"default\"], query, args...)\n}\n\n// QueryWithTx is query method within the transaction.\nfunc (db *OceanBase) QueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQueryWithTx(tx, query, args...)\n}\n\n// ExecWithTx is exec method within the transaction.\nfunc (db *OceanBase) ExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExecWithTx(tx, query, args...)\n}\n\nfunc (db *OceanBase) QueryWith(tx *sql.Tx, conn, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\tif tx != nil {\n\t\treturn db.QueryWithTx(tx, query, args...)\n\t}\n\treturn db.QueryWithConnection(conn, query, args...)\n}\n\nfunc (db *OceanBase) ExecWith(tx *sql.Tx, conn, query string, args ...interface{}) (sql.Result, error) {\n\tif tx != nil {\n\t\treturn db.ExecWithTx(tx, query, args...)\n\t}\n\treturn db.ExecWithConnection(conn, query, args...)\n}\n\n// BeginTxWithReadUncommitted starts a transaction with level LevelReadUncommitted.\nfunc (db *OceanBase) BeginTxWithReadUncommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommitted starts a transaction with level LevelReadCommitted.\nfunc (db *OceanBase) BeginTxWithReadCommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableRead starts a transaction with level LevelRepeatableRead.\nfunc (db *OceanBase) BeginTxWithRepeatableRead() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelRepeatableRead)\n}\n\n// BeginTx starts a transaction with level LevelDefault.\nfunc (db *OceanBase) BeginTx() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelDefault)\n}\n\n// BeginTxWithLevel starts a transaction with given transaction isolation level.\nfunc (db *OceanBase) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], level)\n}\n\n// BeginTxWithReadUncommittedAndConnection starts a transaction with level LevelReadUncommitted and connection.\nfunc (db *OceanBase) BeginTxWithReadUncommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommittedAndConnection starts a transaction with level LevelReadCommitted and connection.\nfunc (db *OceanBase) BeginTxWithReadCommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableReadAndConnection starts a transaction with level LevelRepeatableRead and connection.\nfunc (db *OceanBase) BeginTxWithRepeatableReadAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelRepeatableRead)\n}\n\n// BeginTxAndConnection starts a transaction with level LevelDefault and connection.\nfunc (db *OceanBase) BeginTxAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelDefault)\n}\n\n// BeginTxWithLevelAndConnection starts a transaction with given transaction isolation level and connection.\nfunc (db *OceanBase) BeginTxWithLevelAndConnection(conn string, level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], level)\n}\n"
  },
  {
    "path": "modules/db/performer.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"regexp\"\n\t\"strings\"\n)\n\n// CommonQuery is a common method of query.\nfunc CommonQuery(db *sql.DB, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\n\trs, err := db.Query(query, args...)\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdefer func() {\n\t\tif rs != nil {\n\t\t\t_ = rs.Close()\n\t\t}\n\t}()\n\n\tcol, colErr := rs.Columns()\n\n\tif colErr != nil {\n\t\treturn nil, colErr\n\t}\n\n\ttypeVal, err := rs.ColumnTypes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// TODO: regular expressions for sqlite, use the dialect module\n\t// tell the drive to reduce the performance loss\n\tresults := make([]map[string]interface{}, 0)\n\n\tr, _ := regexp.Compile(`\\\\((.*)\\\\)`)\n\tfor rs.Next() {\n\t\tvar colVar = make([]interface{}, len(col))\n\t\tfor i := 0; i < len(col); i++ {\n\t\t\ttypeName := strings.ToUpper(r.ReplaceAllString(typeVal[i].DatabaseTypeName(), \"\"))\n\t\t\tSetColVarType(&colVar, i, typeName)\n\t\t}\n\t\tresult := make(map[string]interface{})\n\t\tif scanErr := rs.Scan(colVar...); scanErr != nil {\n\t\t\treturn nil, scanErr\n\t\t}\n\t\tfor j := 0; j < len(col); j++ {\n\t\t\ttypeName := strings.ToUpper(r.ReplaceAllString(typeVal[j].DatabaseTypeName(), \"\"))\n\t\t\tSetResultValue(&result, col[j], colVar[j], typeName)\n\t\t}\n\t\tresults = append(results, result)\n\t}\n\tif err := rs.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn results, nil\n}\n\n// CommonExec is a common method of exec.\nfunc CommonExec(db *sql.DB, query string, args ...interface{}) (sql.Result, error) {\n\n\trs, err := db.Exec(query, args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn rs, nil\n}\n\n// CommonQueryWithTx is a common method of query.\nfunc CommonQueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\n\trs, err := tx.Query(query, args...)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdefer func() {\n\t\tif rs != nil {\n\t\t\t_ = rs.Close()\n\t\t}\n\t}()\n\n\tcol, colErr := rs.Columns()\n\n\tif colErr != nil {\n\t\treturn nil, colErr\n\t}\n\n\ttypeVal, err := rs.ColumnTypes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// TODO: regular expressions for sqlite, use the dialect module\n\t// tell the drive to reduce the performance loss\n\tresults := make([]map[string]interface{}, 0)\n\n\tr, _ := regexp.Compile(`\\\\((.*)\\\\)`)\n\tfor rs.Next() {\n\t\tvar colVar = make([]interface{}, len(col))\n\t\tfor i := 0; i < len(col); i++ {\n\t\t\ttypeName := strings.ToUpper(r.ReplaceAllString(typeVal[i].DatabaseTypeName(), \"\"))\n\t\t\tSetColVarType(&colVar, i, typeName)\n\t\t}\n\t\tresult := make(map[string]interface{})\n\t\tif scanErr := rs.Scan(colVar...); scanErr != nil {\n\t\t\treturn nil, scanErr\n\t\t}\n\t\tfor j := 0; j < len(col); j++ {\n\t\t\ttypeName := strings.ToUpper(r.ReplaceAllString(typeVal[j].DatabaseTypeName(), \"\"))\n\t\t\tSetResultValue(&result, col[j], colVar[j], typeName)\n\t\t}\n\t\tresults = append(results, result)\n\t}\n\tif err := rs.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn results, nil\n}\n\n// CommonExecWithTx is a common method of exec.\nfunc CommonExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error) {\n\trs, err := tx.Exec(query, args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn rs, nil\n}\n\n// CommonBeginTxWithLevel starts a transaction with given transaction isolation level and db connection.\nfunc CommonBeginTxWithLevel(db *sql.DB, level sql.IsolationLevel) *sql.Tx {\n\ttx, err := db.BeginTx(context.Background(), &sql.TxOptions{Isolation: level})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn tx\n}\n"
  },
  {
    "path": "modules/db/postgresql.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\t\"database/sql\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n)\n\n// Postgresql is a Connection of postgresql.\ntype Postgresql struct {\n\tBase\n}\n\n// GetPostgresqlDB return the global postgresql connection.\nfunc GetPostgresqlDB() *Postgresql {\n\treturn &Postgresql{\n\t\tBase: Base{\n\t\t\tDbList: make(map[string]*sql.DB),\n\t\t},\n\t}\n}\n\n// Name implements the method Connection.Name.\nfunc (db *Postgresql) Name() string {\n\treturn \"postgresql\"\n}\n\n// GetDelimiter implements the method Connection.GetDelimiter.\nfunc (db *Postgresql) GetDelimiter() string {\n\treturn `\"`\n}\n\n// GetDelimiter2 implements the method Connection.GetDelimiter2.\nfunc (db *Postgresql) GetDelimiter2() string {\n\treturn `\"`\n}\n\n// GetDelimiters implements the method Connection.GetDelimiters.\nfunc (db *Postgresql) GetDelimiters() []string {\n\treturn []string{`\"`, `\"`}\n}\n\n// QueryWithConnection implements the method Connection.QueryWithConnection.\nfunc (db *Postgresql) QueryWithConnection(con string, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQuery(db.DbList[con], filterQuery(query), args...)\n}\n\n// ExecWithConnection implements the method Connection.ExecWithConnection.\nfunc (db *Postgresql) ExecWithConnection(con string, query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExec(db.DbList[con], filterQuery(query), args...)\n}\n\n// Query implements the method Connection.Query.\nfunc (db *Postgresql) Query(query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQuery(db.DbList[\"default\"], filterQuery(query), args...)\n}\n\n// Exec implements the method Connection.Exec.\nfunc (db *Postgresql) Exec(query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExec(db.DbList[\"default\"], filterQuery(query), args...)\n}\n\nfunc (db *Postgresql) QueryWith(tx *sql.Tx, conn, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\tif tx != nil {\n\t\treturn db.QueryWithTx(tx, query, args...)\n\t}\n\treturn db.QueryWithConnection(conn, query, args...)\n}\n\nfunc (db *Postgresql) ExecWith(tx *sql.Tx, conn, query string, args ...interface{}) (sql.Result, error) {\n\tif tx != nil {\n\t\treturn db.ExecWithTx(tx, query, args...)\n\t}\n\treturn db.ExecWithConnection(conn, query, args...)\n}\n\nfunc filterQuery(query string) string {\n\tqueCount := strings.Count(query, \"?\")\n\tfor i := 1; i < queCount+1; i++ {\n\t\tquery = strings.Replace(query, \"?\", \"$\"+strconv.Itoa(i), 1)\n\t}\n\tquery = strings.ReplaceAll(query, \"`\", \"\")\n\t// TODO: add \" to the keyword\n\treturn strings.ReplaceAll(query, \"by order \", `by \"order\" `)\n}\n\n// InitDB implements the method Connection.InitDB.\nfunc (db *Postgresql) InitDB(cfgList map[string]config.Database) Connection {\n\tdb.Configs = cfgList\n\tdb.Once.Do(func() {\n\t\tfor conn, cfg := range cfgList {\n\t\t\tsqlDB, err := sql.Open(\"postgres\", cfg.GetDSN())\n\t\t\tif err != nil {\n\t\t\t\tif sqlDB != nil {\n\t\t\t\t\t_ = sqlDB.Close()\n\t\t\t\t}\n\t\t\t\tpanic(err)\n\t\t\t}\n\n\t\t\tsqlDB.SetMaxIdleConns(cfg.MaxIdleConns)\n\t\t\tsqlDB.SetMaxOpenConns(cfg.MaxOpenConns)\n\t\t\tsqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)\n\t\t\tsqlDB.SetConnMaxIdleTime(cfg.ConnMaxIdleTime)\n\n\t\t\tdb.DbList[conn] = sqlDB\n\n\t\t\tif err := sqlDB.Ping(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t})\n\treturn db\n}\n\n// BeginTxWithReadUncommitted starts a transaction with level LevelReadUncommitted.\nfunc (db *Postgresql) BeginTxWithReadUncommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommitted starts a transaction with level LevelReadCommitted.\nfunc (db *Postgresql) BeginTxWithReadCommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableRead starts a transaction with level LevelRepeatableRead.\nfunc (db *Postgresql) BeginTxWithRepeatableRead() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelRepeatableRead)\n}\n\n// BeginTx starts a transaction with level LevelDefault.\nfunc (db *Postgresql) BeginTx() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelDefault)\n}\n\n// BeginTxWithLevel starts a transaction with given transaction isolation level.\nfunc (db *Postgresql) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], level)\n}\n\n// BeginTxWithReadUncommittedAndConnection starts a transaction with level LevelReadUncommitted and connection.\nfunc (db *Postgresql) BeginTxWithReadUncommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommittedAndConnection starts a transaction with level LevelReadCommitted and connection.\nfunc (db *Postgresql) BeginTxWithReadCommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableReadAndConnection starts a transaction with level LevelRepeatableRead and connection.\nfunc (db *Postgresql) BeginTxWithRepeatableReadAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelRepeatableRead)\n}\n\n// BeginTxAndConnection starts a transaction with level LevelDefault and connection.\nfunc (db *Postgresql) BeginTxAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelDefault)\n}\n\n// BeginTxWithLevelAndConnection starts a transaction with given transaction isolation level and connection.\nfunc (db *Postgresql) BeginTxWithLevelAndConnection(conn string, level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], level)\n}\n\n// QueryWithTx is query method within the transaction.\nfunc (db *Postgresql) QueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQueryWithTx(tx, filterQuery(query), args...)\n}\n\n// ExecWithTx is exec method within the transaction.\nfunc (db *Postgresql) ExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExecWithTx(tx, filterQuery(query), args...)\n}\n"
  },
  {
    "path": "modules/db/sqlite.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\t\"database/sql\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n)\n\n// Sqlite is a Connection of sqlite.\ntype Sqlite struct {\n\tBase\n}\n\n// GetSqliteDB return the global sqlite connection.\nfunc GetSqliteDB() *Sqlite {\n\treturn &Sqlite{\n\t\tBase: Base{\n\t\t\tDbList: make(map[string]*sql.DB),\n\t\t},\n\t}\n}\n\n// Name implements the method Connection.Name.\nfunc (db *Sqlite) Name() string {\n\treturn \"sqlite\"\n}\n\n// GetDelimiter implements the method Connection.GetDelimiter.\nfunc (db *Sqlite) GetDelimiter() string {\n\treturn \"`\"\n}\n\n// GetDelimiter2 implements the method Connection.GetDelimiter2.\nfunc (db *Sqlite) GetDelimiter2() string {\n\treturn \"`\"\n}\n\n// GetDelimiters implements the method Connection.GetDelimiters.\nfunc (db *Sqlite) GetDelimiters() []string {\n\treturn []string{\"`\", \"`\"}\n}\n\n// QueryWithConnection implements the method Connection.QueryWithConnection.\nfunc (db *Sqlite) QueryWithConnection(con string, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQuery(db.DbList[con], query, args...)\n}\n\n// ExecWithConnection implements the method Connection.ExecWithConnection.\nfunc (db *Sqlite) ExecWithConnection(con string, query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExec(db.DbList[con], query, args...)\n}\n\n// Query implements the method Connection.Query.\nfunc (db *Sqlite) Query(query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQuery(db.DbList[\"default\"], query, args...)\n}\n\n// Exec implements the method Connection.Exec.\nfunc (db *Sqlite) Exec(query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExec(db.DbList[\"default\"], query, args...)\n}\n\nfunc (db *Sqlite) QueryWith(tx *sql.Tx, conn, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\tif tx != nil {\n\t\treturn db.QueryWithTx(tx, query, args...)\n\t}\n\treturn db.QueryWithConnection(conn, query, args...)\n}\n\nfunc (db *Sqlite) ExecWith(tx *sql.Tx, conn, query string, args ...interface{}) (sql.Result, error) {\n\tif tx != nil {\n\t\treturn db.ExecWithTx(tx, query, args...)\n\t}\n\treturn db.ExecWithConnection(conn, query, args...)\n}\n\n// InitDB implements the method Connection.InitDB.\nfunc (db *Sqlite) InitDB(cfgList map[string]config.Database) Connection {\n\tdb.Configs = cfgList\n\tdb.Once.Do(func() {\n\t\tfor conn, cfg := range cfgList {\n\t\t\tsqlDB, err := sql.Open(\"sqlite3\", cfg.GetDSN())\n\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\n\t\t\tsqlDB.SetMaxIdleConns(cfg.MaxIdleConns)\n\t\t\tsqlDB.SetMaxOpenConns(cfg.MaxOpenConns)\n\t\t\tsqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)\n\t\t\tsqlDB.SetConnMaxIdleTime(cfg.ConnMaxIdleTime)\n\n\t\t\tdb.DbList[conn] = sqlDB\n\n\t\t\tif err := sqlDB.Ping(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t})\n\treturn db\n}\n\n// BeginTxWithReadUncommitted starts a transaction with level LevelReadUncommitted.\nfunc (db *Sqlite) BeginTxWithReadUncommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommitted starts a transaction with level LevelReadCommitted.\nfunc (db *Sqlite) BeginTxWithReadCommitted() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableRead starts a transaction with level LevelRepeatableRead.\nfunc (db *Sqlite) BeginTxWithRepeatableRead() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelRepeatableRead)\n}\n\n// BeginTx starts a transaction with level LevelDefault.\nfunc (db *Sqlite) BeginTx() *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], sql.LevelDefault)\n}\n\n// BeginTxWithLevel starts a transaction with given transaction isolation level.\nfunc (db *Sqlite) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[\"default\"], level)\n}\n\n// BeginTxWithReadUncommittedAndConnection starts a transaction with level LevelReadUncommitted and connection.\nfunc (db *Sqlite) BeginTxWithReadUncommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadUncommitted)\n}\n\n// BeginTxWithReadCommittedAndConnection starts a transaction with level LevelReadCommitted and connection.\nfunc (db *Sqlite) BeginTxWithReadCommittedAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelReadCommitted)\n}\n\n// BeginTxWithRepeatableReadAndConnection starts a transaction with level LevelRepeatableRead and connection.\nfunc (db *Sqlite) BeginTxWithRepeatableReadAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelRepeatableRead)\n}\n\n// BeginTxAndConnection starts a transaction with level LevelDefault and connection.\nfunc (db *Sqlite) BeginTxAndConnection(conn string) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], sql.LevelDefault)\n}\n\n// BeginTxWithLevelAndConnection starts a transaction with given transaction isolation level and connection.\nfunc (db *Sqlite) BeginTxWithLevelAndConnection(conn string, level sql.IsolationLevel) *sql.Tx {\n\treturn CommonBeginTxWithLevel(db.DbList[conn], level)\n}\n\n// QueryWithTx is query method within the transaction.\nfunc (db *Sqlite) QueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error) {\n\treturn CommonQueryWithTx(tx, query, args...)\n}\n\n// ExecWithTx is exec method within the transaction.\nfunc (db *Sqlite) ExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error) {\n\treturn CommonExecWithTx(tx, query, args...)\n}\n"
  },
  {
    "path": "modules/db/statement.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\tdbsql \"database/sql\"\n\t\"errors\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n)\n\n// SQL wraps the Connection and driver dialect methods.\ntype SQL struct {\n\tdialect.SQLComponent\n\tdiver   Connection\n\tdialect dialect.Dialect\n\tconn    string\n\ttx      *dbsql.Tx\n}\n\n// SQLPool is a object pool of SQL.\nvar SQLPool = sync.Pool{\n\tNew: func() interface{} {\n\t\treturn &SQL{\n\t\t\tSQLComponent: dialect.SQLComponent{\n\t\t\t\tFields:     make([]string, 0),\n\t\t\t\tTableName:  \"\",\n\t\t\t\tArgs:       make([]interface{}, 0),\n\t\t\t\tWheres:     make([]dialect.Where, 0),\n\t\t\t\tLeftjoins:  make([]dialect.Join, 0),\n\t\t\t\tUpdateRaws: make([]dialect.RawUpdate, 0),\n\t\t\t\tWhereRaws:  \"\",\n\t\t\t\tOrder:      \"\",\n\t\t\t\tGroup:      \"\",\n\t\t\t\tLimit:      \"\",\n\t\t\t},\n\t\t\tdiver:   nil,\n\t\t\tdialect: nil,\n\t\t}\n\t},\n}\n\n// H is a shorthand of map.\ntype H map[string]interface{}\n\n// newSQL get a new SQL from SQLPool.\nfunc newSQL() *SQL {\n\treturn SQLPool.Get().(*SQL)\n}\n\n// *******************************\n// process method\n// *******************************\n\n// TableName return a SQL with given table and default connection.\nfunc Table(table string) *SQL {\n\tsql := newSQL()\n\tsql.TableName = table\n\tsql.conn = \"default\"\n\treturn sql\n}\n\n// WithDriver return a SQL with given driver.\nfunc WithDriver(conn Connection) *SQL {\n\tsql := newSQL()\n\tsql.diver = conn\n\tsql.dialect = dialect.GetDialectByDriver(conn.Name())\n\tsql.conn = \"default\"\n\treturn sql\n}\n\n// WithDriverAndConnection return a SQL with given driver and connection name.\nfunc WithDriverAndConnection(connName string, conn Connection) *SQL {\n\tsql := newSQL()\n\tsql.diver = conn\n\tsql.dialect = dialect.GetDialectByDriver(conn.Name())\n\tsql.conn = connName\n\treturn sql\n}\n\n// WithDriver return a SQL with given driver.\nfunc (sql *SQL) WithDriver(conn Connection) *SQL {\n\tsql.diver = conn\n\tsql.dialect = dialect.GetDialectByDriver(conn.Name())\n\treturn sql\n}\n\n// WithConnection set the connection name of SQL.\nfunc (sql *SQL) WithConnection(conn string) *SQL {\n\tsql.conn = conn\n\treturn sql\n}\n\n// WithTx set the database transaction object of SQL.\nfunc (sql *SQL) WithTx(tx *dbsql.Tx) *SQL {\n\tsql.tx = tx\n\treturn sql\n}\n\n// TableName set table of SQL.\nfunc (sql *SQL) Table(table string) *SQL {\n\tsql.clean()\n\tsql.TableName = table\n\treturn sql\n}\n\n// Select set select fields.\nfunc (sql *SQL) Select(fields ...string) *SQL {\n\tsql.Fields = fields\n\tsql.Functions = make([]string, len(fields))\n\treg, _ := regexp.Compile(`(.*?)\\((.*?)\\)`)\n\tfor k, field := range fields {\n\t\tres := reg.FindAllStringSubmatch(field, -1)\n\t\tif len(res) > 0 && len(res[0]) > 2 {\n\t\t\tsql.Functions[k] = res[0][1]\n\t\t\tsql.Fields[k] = res[0][2]\n\t\t}\n\t}\n\treturn sql\n}\n\n// OrderBy set order fields.\nfunc (sql *SQL) OrderBy(fields ...string) *SQL {\n\tif len(fields) == 0 {\n\t\tpanic(\"wrong order field\")\n\t}\n\tfor i := 0; i < len(fields); i++ {\n\t\tif i == len(fields)-2 {\n\t\t\tsql.Order += \" \" + sql.wrap(fields[i]) + \" \" + fields[i+1]\n\t\t\treturn sql\n\t\t}\n\t\tsql.Order += \" \" + sql.wrap(fields[i]) + \" and \"\n\t}\n\treturn sql\n}\n\n// OrderByRaw set order by.\nfunc (sql *SQL) OrderByRaw(order string) *SQL {\n\tif order != \"\" {\n\t\tsql.Order += \" \" + order\n\t}\n\treturn sql\n}\n\nfunc (sql *SQL) GroupBy(fields ...string) *SQL {\n\tif len(fields) == 0 {\n\t\tpanic(\"wrong group by field\")\n\t}\n\tfor i := 0; i < len(fields); i++ {\n\t\tif i == len(fields)-1 {\n\t\t\tsql.Group += \" \" + sql.wrap(fields[i])\n\t\t} else {\n\t\t\tsql.Group += \" \" + sql.wrap(fields[i]) + \",\"\n\t\t}\n\t}\n\treturn sql\n}\n\n// GroupByRaw set group by.\nfunc (sql *SQL) GroupByRaw(group string) *SQL {\n\tif group != \"\" {\n\t\tsql.Group += \" \" + group\n\t}\n\treturn sql\n}\n\n// Skip set offset value.\nfunc (sql *SQL) Skip(offset int) *SQL {\n\tsql.Offset = strconv.Itoa(offset)\n\treturn sql\n}\n\n// Take set limit value.\nfunc (sql *SQL) Take(take int) *SQL {\n\tsql.Limit = strconv.Itoa(take)\n\treturn sql\n}\n\n// Where add the where operation and argument value.\nfunc (sql *SQL) Where(field string, operation string, arg interface{}) *SQL {\n\tsql.Wheres = append(sql.Wheres, dialect.Where{\n\t\tField:     field,\n\t\tOperation: operation,\n\t\tQmark:     \"?\",\n\t})\n\tsql.Args = append(sql.Args, arg)\n\treturn sql\n}\n\n// WhereIn add the where operation of \"in\" and argument values.\nfunc (sql *SQL) WhereIn(field string, arg []interface{}) *SQL {\n\tif len(arg) == 0 {\n\t\tpanic(\"wrong parameter\")\n\t}\n\tsql.Wheres = append(sql.Wheres, dialect.Where{\n\t\tField:     field,\n\t\tOperation: \"in\",\n\t\tQmark:     \"(\" + strings.Repeat(\"?,\", len(arg)-1) + \"?)\",\n\t})\n\tsql.Args = append(sql.Args, arg...)\n\treturn sql\n}\n\n// WhereNotIn add the where operation of \"not in\" and argument values.\nfunc (sql *SQL) WhereNotIn(field string, arg []interface{}) *SQL {\n\tif len(arg) == 0 {\n\t\tpanic(\"wrong parameter\")\n\t}\n\tsql.Wheres = append(sql.Wheres, dialect.Where{\n\t\tField:     field,\n\t\tOperation: \"not in\",\n\t\tQmark:     \"(\" + strings.Repeat(\"?,\", len(arg)-1) + \"?)\",\n\t})\n\tsql.Args = append(sql.Args, arg...)\n\treturn sql\n}\n\n// Find query the sql result with given id assuming that primary key name is \"id\".\nfunc (sql *SQL) Find(arg interface{}) (map[string]interface{}, error) {\n\treturn sql.Where(\"id\", \"=\", arg).First()\n}\n\n// Count query the count of query results.\nfunc (sql *SQL) Count() (int64, error) {\n\tvar (\n\t\tres    map[string]interface{}\n\t\terr    error\n\t\tdriver = sql.diver.Name()\n\t)\n\n\tif res, err = sql.Select(\"count(*)\").First(); err != nil {\n\t\treturn 0, err\n\t}\n\n\tif driver == DriverPostgresql {\n\t\treturn res[\"count\"].(int64), nil\n\t} else if driver == DriverMssql {\n\t\treturn res[\"\"].(int64), nil\n\t}\n\n\treturn res[\"count(*)\"].(int64), nil\n}\n\n// Sum sum the value of given field.\nfunc (sql *SQL) Sum(field string) (float64, error) {\n\tvar (\n\t\tres map[string]interface{}\n\t\terr error\n\t\tkey = \"sum(\" + sql.wrap(field) + \")\"\n\t)\n\tif res, err = sql.Select(\"sum(\" + field + \")\").First(); err != nil {\n\t\treturn 0, err\n\t}\n\n\tif res == nil {\n\t\treturn 0, nil\n\t}\n\n\tif r, ok := res[key].(float64); ok {\n\t\treturn r, nil\n\t} else if r, ok := res[key].([]uint8); ok {\n\t\treturn strconv.ParseFloat(string(r), 64)\n\t} else {\n\t\treturn 0, nil\n\t}\n}\n\n// Max find the maximal value of given field.\nfunc (sql *SQL) Max(field string) (interface{}, error) {\n\tvar (\n\t\tres map[string]interface{}\n\t\terr error\n\t\tkey = \"max(\" + sql.wrap(field) + \")\"\n\t)\n\tif res, err = sql.Select(\"max(\" + field + \")\").First(); err != nil {\n\t\treturn 0, err\n\t}\n\n\tif res == nil {\n\t\treturn 0, nil\n\t}\n\n\treturn res[key], nil\n}\n\n// Min find the minimal value of given field.\nfunc (sql *SQL) Min(field string) (interface{}, error) {\n\tvar (\n\t\tres map[string]interface{}\n\t\terr error\n\t\tkey = \"min(\" + sql.wrap(field) + \")\"\n\t)\n\tif res, err = sql.Select(\"min(\" + field + \")\").First(); err != nil {\n\t\treturn 0, err\n\t}\n\n\tif res == nil {\n\t\treturn 0, nil\n\t}\n\n\treturn res[key], nil\n}\n\n// Avg find the average value of given field.\nfunc (sql *SQL) Avg(field string) (interface{}, error) {\n\tvar (\n\t\tres map[string]interface{}\n\t\terr error\n\t\tkey = \"avg(\" + sql.wrap(field) + \")\"\n\t)\n\tif res, err = sql.Select(\"avg(\" + field + \")\").First(); err != nil {\n\t\treturn 0, err\n\t}\n\n\tif res == nil {\n\t\treturn 0, nil\n\t}\n\n\treturn res[key], nil\n}\n\n// WhereRaw set WhereRaws and arguments.\nfunc (sql *SQL) WhereRaw(raw string, args ...interface{}) *SQL {\n\tsql.WhereRaws = raw\n\tsql.Args = append(sql.Args, args...)\n\treturn sql\n}\n\n// UpdateRaw set UpdateRaw.\nfunc (sql *SQL) UpdateRaw(raw string, args ...interface{}) *SQL {\n\tsql.UpdateRaws = append(sql.UpdateRaws, dialect.RawUpdate{\n\t\tExpression: raw,\n\t\tArgs:       args,\n\t})\n\treturn sql\n}\n\n// LeftJoin add a left join info.\nfunc (sql *SQL) LeftJoin(table string, fieldA string, operation string, fieldB string) *SQL {\n\tsql.Leftjoins = append(sql.Leftjoins, dialect.Join{\n\t\tFieldA:    fieldA,\n\t\tFieldB:    fieldB,\n\t\tTable:     table,\n\t\tOperation: operation,\n\t})\n\treturn sql\n}\n\n// *******************************\n// Transaction method\n// *******************************\n\n// TxFn is the transaction callback function.\ntype TxFn func(tx *dbsql.Tx) (error, map[string]interface{})\n\n// WithTransaction call the callback function within the transaction and\n// catch the error.\nfunc (sql *SQL) WithTransaction(fn TxFn) (res map[string]interface{}, err error) {\n\n\ttx := sql.diver.BeginTxAndConnection(sql.conn)\n\n\tdefer func() {\n\t\tif p := recover(); p != nil {\n\t\t\t// a panic occurred, rollback and repanic\n\t\t\t_ = tx.Rollback()\n\t\t\tpanic(p)\n\t\t} else if err != nil {\n\t\t\t// something went wrong, rollback\n\t\t\t_ = tx.Rollback()\n\t\t} else {\n\t\t\t// all good, commit\n\t\t\terr = tx.Commit()\n\t\t}\n\t}()\n\n\terr, res = fn(tx)\n\treturn\n}\n\n// WithTransactionByLevel call the callback function within the transaction\n// of given transaction level and catch the error.\nfunc (sql *SQL) WithTransactionByLevel(level dbsql.IsolationLevel, fn TxFn) (res map[string]interface{}, err error) {\n\n\ttx := sql.diver.BeginTxWithLevelAndConnection(sql.conn, level)\n\n\tdefer func() {\n\t\tif p := recover(); p != nil {\n\t\t\t// a panic occurred, rollback and repanic\n\t\t\t_ = tx.Rollback()\n\t\t\tpanic(p)\n\t\t} else if err != nil {\n\t\t\t// something went wrong, rollback\n\t\t\t_ = tx.Rollback()\n\t\t} else {\n\t\t\t// all good, commit\n\t\t\terr = tx.Commit()\n\t\t}\n\t}()\n\n\terr, res = fn(tx)\n\treturn\n}\n\n// *******************************\n// terminal method\n// -------------------------------\n// sql args order:\n// update ... => where ...\n// *******************************\n\n// First query the result and return the first row.\nfunc (sql *SQL) First() (map[string]interface{}, error) {\n\tdefer RecycleSQL(sql)\n\n\tsql.dialect.Select(&sql.SQLComponent)\n\n\tres, err := sql.diver.QueryWith(sql.tx, sql.conn, sql.Statement, sql.Args...)\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(res) < 1 {\n\t\treturn nil, errors.New(\"out of index\")\n\t}\n\treturn res[0], nil\n}\n\n// All query all the result and return.\nfunc (sql *SQL) All() ([]map[string]interface{}, error) {\n\tdefer RecycleSQL(sql)\n\n\tsql.dialect.Select(&sql.SQLComponent)\n\n\treturn sql.diver.QueryWith(sql.tx, sql.conn, sql.Statement, sql.Args...)\n}\n\n// ShowColumns show columns info.\nfunc (sql *SQL) ShowColumns() ([]map[string]interface{}, error) {\n\tdefer RecycleSQL(sql)\n\n\treturn sql.diver.QueryWithConnection(sql.conn, sql.dialect.ShowColumns(sql.TableName))\n}\n\n// ShowColumnsWithComment show columns info.\nfunc (sql *SQL) ShowColumnsWithComment(database string) ([]map[string]interface{}, error) {\n\tdefer RecycleSQL(sql)\n\n\treturn sql.diver.QueryWithConnection(sql.conn, sql.dialect.ShowColumnsWithComment(database, sql.TableName))\n}\n\n// ShowTables show table info.\nfunc (sql *SQL) ShowTables() ([]string, error) {\n\tdefer RecycleSQL(sql)\n\n\tmodels, err := sql.diver.QueryWithConnection(sql.conn, sql.dialect.ShowTables())\n\n\tif err != nil {\n\t\treturn []string{}, err\n\t}\n\n\ttables := make([]string, 0)\n\tif len(models) == 0 {\n\t\treturn tables, nil\n\t}\n\n\tkey := \"Tables_in_\" + sql.TableName\n\tif sql.diver.Name() == DriverPostgresql || sql.diver.Name() == DriverSqlite {\n\t\tkey = \"tablename\"\n\t} else if sql.diver.Name() == DriverMssql {\n\t\tkey = \"TABLE_NAME\"\n\t} else if _, ok := models[0][key].(string); !ok {\n\t\tkey = \"Tables_in_\" + strings.ToLower(sql.TableName)\n\t}\n\n\tfor i := 0; i < len(models); i++ {\n\t\t// skip sqlite system tables\n\t\tif sql.diver.Name() == DriverSqlite && models[i][key].(string) == \"sqlite_sequence\" {\n\t\t\tcontinue\n\t\t}\n\n\t\ttables = append(tables, models[i][key].(string))\n\t}\n\n\treturn tables, nil\n}\n\n// Update exec the update method of given key/value pairs.\nfunc (sql *SQL) Update(values dialect.H) (int64, error) {\n\tdefer RecycleSQL(sql)\n\n\tsql.Values = values\n\n\tsql.dialect.Update(&sql.SQLComponent)\n\n\tres, err := sql.diver.ExecWith(sql.tx, sql.conn, sql.Statement, sql.Args...)\n\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif affectRow, _ := res.RowsAffected(); affectRow < 1 {\n\t\treturn 0, errors.New(\"no affect row\")\n\t}\n\n\treturn res.LastInsertId()\n}\n\n// Delete exec the delete method.\nfunc (sql *SQL) Delete() error {\n\tdefer RecycleSQL(sql)\n\n\tsql.dialect.Delete(&sql.SQLComponent)\n\n\tres, err := sql.diver.ExecWith(sql.tx, sql.conn, sql.Statement, sql.Args...)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif affectRow, _ := res.RowsAffected(); affectRow < 1 {\n\t\treturn errors.New(\"no affect row\")\n\t}\n\n\treturn nil\n}\n\n// Exec exec the exec method.\nfunc (sql *SQL) Exec() (int64, error) {\n\tdefer RecycleSQL(sql)\n\n\tsql.dialect.Update(&sql.SQLComponent)\n\n\tres, err := sql.diver.ExecWith(sql.tx, sql.conn, sql.Statement, sql.Args...)\n\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif affectRow, _ := res.RowsAffected(); affectRow < 1 {\n\t\treturn 0, errors.New(\"no affect row\")\n\t}\n\n\treturn res.LastInsertId()\n}\n\nconst postgresInsertCheckTableName = \"goadmin_menu|goadmin_permissions|goadmin_roles|goadmin_users\"\n\n// Insert exec the insert method of given key/value pairs.\nfunc (sql *SQL) Insert(values dialect.H) (int64, error) {\n\tdefer RecycleSQL(sql)\n\n\tsql.Values = values\n\n\tsql.dialect.Insert(&sql.SQLComponent)\n\n\tif sql.diver.Name() == DriverPostgresql && (strings.Contains(postgresInsertCheckTableName, sql.TableName)) {\n\n\t\tresMap, err := sql.diver.QueryWith(sql.tx, sql.conn, sql.Statement+\" RETURNING id\", sql.Args...)\n\n\t\tif err != nil {\n\n\t\t\t// Fixed java h2 database postgresql mode\n\t\t\t_, err := sql.diver.QueryWith(sql.tx, sql.conn, sql.Statement, sql.Args...)\n\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\n\t\t\tres, err := sql.diver.QueryWithConnection(sql.conn, `SELECT max(\"id\") as \"id\" FROM \"`+sql.TableName+`\"`)\n\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\n\t\t\tif len(res) != 0 {\n\t\t\t\treturn res[0][\"id\"].(int64), nil\n\t\t\t}\n\n\t\t\treturn 0, err\n\t\t}\n\n\t\tif len(resMap) == 0 {\n\t\t\treturn 0, errors.New(\"no affect row\")\n\t\t}\n\n\t\treturn resMap[0][\"id\"].(int64), nil\n\t}\n\n\tres, err := sql.diver.ExecWith(sql.tx, sql.conn, sql.Statement, sql.Args...)\n\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif affectRow, _ := res.RowsAffected(); affectRow < 1 {\n\t\treturn 0, errors.New(\"no affect row\")\n\t}\n\n\treturn res.LastInsertId()\n}\n\nfunc (sql *SQL) wrap(field string) string {\n\treturn sql.diver.GetDelimiter() + field + sql.diver.GetDelimiter2()\n}\n\nfunc (sql *SQL) clean() {\n\tsql.Functions = make([]string, 0)\n\tsql.Group = \"\"\n\tsql.Values = make(map[string]interface{})\n\tsql.Fields = make([]string, 0)\n\tsql.TableName = \"\"\n\tsql.Wheres = make([]dialect.Where, 0)\n\tsql.Leftjoins = make([]dialect.Join, 0)\n\tsql.Args = make([]interface{}, 0)\n\tsql.Order = \"\"\n\tsql.Offset = \"\"\n\tsql.Limit = \"\"\n\tsql.WhereRaws = \"\"\n\tsql.UpdateRaws = make([]dialect.RawUpdate, 0)\n\tsql.Statement = \"\"\n}\n\n// RecycleSQL clear the SQL and put into the pool.\nfunc RecycleSQL(sql *SQL) {\n\n\tlogger.LogSQL(sql.Statement, sql.Args)\n\n\tsql.clean()\n\n\tsql.conn = \"\"\n\tsql.diver = nil\n\tsql.tx = nil\n\tsql.dialect = nil\n\n\tSQLPool.Put(sql)\n}\n"
  },
  {
    "path": "modules/db/statement_mssql_test.go",
    "content": "package db\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n)\n\nvar driverTestMssqlConn Connection\n\nfunc InitMssql() {\n\tdriverTestMssqlConn = testConn(DriverMssql, config.Database{\n\t\tHost: \"127.0.0.1\",\n\t\tPort: \"1433\",\n\t\tUser: \"sa\",\n\t\tPwd:  \"Aa123456\",\n\t\tName: \"goadmin\",\n\t})\n}\n\nfunc TestMssqlSQL_WhereIn(t *testing.T)         { testSQLWhereIn(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Count(t *testing.T)           { testSQLCount(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Select(t *testing.T)          { testSQLSelect(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_OrderBy(t *testing.T)         { testSQLOrderBy(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_GroupBy(t *testing.T)         { testSQLGroupBy(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Skip(t *testing.T)            { testSQLSkip(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Take(t *testing.T)            { testSQLTake(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Where(t *testing.T)           { testSQLWhere(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_WhereNotIn(t *testing.T)      { testSQLWhereNotIn(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Find(t *testing.T)            { testSQLFind(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Sum(t *testing.T)             { testSQLSum(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Max(t *testing.T)             { testSQLMax(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Min(t *testing.T)             { testSQLMin(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Avg(t *testing.T)             { testSQLAvg(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_WhereRaw(t *testing.T)        { testSQLWhereRaw(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_UpdateRaw(t *testing.T)       { testSQLUpdateRaw(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_LeftJoin(t *testing.T)        { testSQLLeftJoin(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_WithTransaction(t *testing.T) { testSQLWithTransaction(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_WithTransactionByLevel(t *testing.T) {\n\ttestSQLWithTransactionByLevel(t, driverTestMssqlConn)\n}\nfunc TestMssqlSQL_First(t *testing.T)       { testSQLFirst(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_All(t *testing.T)         { testSQLAll(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_ShowColumns(t *testing.T) { testSQLShowColumns(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_ShowTables(t *testing.T)  { testSQLShowTables(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Update(t *testing.T)      { testSQLUpdate(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Delete(t *testing.T)      { testSQLDelete(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Exec(t *testing.T)        { testSQLExec(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Insert(t *testing.T)      { testSQLInsert(t, driverTestMssqlConn) }\nfunc TestMssqlSQL_Wrap(t *testing.T)        { testSQLWrap(t, driverTestMssqlConn) }\n"
  },
  {
    "path": "modules/db/statement_mysql_test.go",
    "content": "package db\n\nimport (\n\t\"fmt\"\n\t\"os/exec\"\n\t\"testing\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n)\n\nvar driverTestMysqlConn Connection\n\nconst (\n\tdriverTestDBName = \"go-admin-statement-test\"\n)\n\nfunc InitMysql() {\n\tc := testConnDSN(DriverMysql, fmt.Sprintf(\"root:root@tcp(127.0.0.1:3306)/%s\", driverTestDBName))\n\t_, err := c.Exec(fmt.Sprintf(\"create database if not exists `%s`\", driverTestDBName))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tcmd := exec.Command(\"mysql\", \"-u\", \"root\", \"-proot\", driverTestDBName,\n\t\t\"-e\", \"source \"+testCurrentPath()+\"/../../data/admin.sql\")\n\terr = cmd.Run()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdriverTestMysqlConn = testConnDSN(DriverMysql, fmt.Sprintf(\"root:root@tcp(127.0.0.1:3306)/%s\", driverTestDBName))\n}\n\nfunc TestMysqlSQL_WhereIn(t *testing.T)         { testSQLWhereIn(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Count(t *testing.T)           { testSQLCount(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Select(t *testing.T)          { testSQLSelect(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_OrderBy(t *testing.T)         { testSQLOrderBy(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_GroupBy(t *testing.T)         { testSQLGroupBy(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Skip(t *testing.T)            { testSQLSkip(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Take(t *testing.T)            { testSQLTake(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Where(t *testing.T)           { testSQLWhere(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_WhereNotIn(t *testing.T)      { testSQLWhereNotIn(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Find(t *testing.T)            { testSQLFind(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Sum(t *testing.T)             { testSQLSum(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Max(t *testing.T)             { testSQLMax(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Min(t *testing.T)             { testSQLMin(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Avg(t *testing.T)             { testSQLAvg(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_WhereRaw(t *testing.T)        { testSQLWhereRaw(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_UpdateRaw(t *testing.T)       { testSQLUpdateRaw(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_LeftJoin(t *testing.T)        { testSQLLeftJoin(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_WithTransaction(t *testing.T) { testSQLWithTransaction(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_WithTransactionByLevel(t *testing.T) {\n\ttestSQLWithTransactionByLevel(t, driverTestMysqlConn)\n}\nfunc TestMysqlSQL_First(t *testing.T)       { testSQLFirst(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_All(t *testing.T)         { testSQLAll(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_ShowColumns(t *testing.T) { testSQLShowColumns(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_ShowTables(t *testing.T)  { testSQLShowTables(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Update(t *testing.T)      { testSQLUpdate(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Delete(t *testing.T)      { testSQLDelete(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Exec(t *testing.T)        { testSQLExec(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Insert(t *testing.T)      { testSQLInsert(t, driverTestMysqlConn) }\nfunc TestMysqlSQL_Wrap(t *testing.T)        { testSQLWrap(t, driverTestMysqlConn) }\n"
  },
  {
    "path": "modules/db/statement_postgresql_test.go",
    "content": "package db\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"testing\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n)\n\nvar driverTestPgConn Connection\n\nfunc InitPostgresql() {\n\n\tcmd := exec.Command(\"createdb -p 5433 -U postgres \" + driverTestDBName)\n\tcmd.Env = os.Environ()\n\tcmd.Env = append(cmd.Env, \"PGPASSWORD=root\")\n\t_ = cmd.Run()\n\n\tcmd = exec.Command(\"psql\", \"-h\", \"localhost\", \"-U\", \"root\", \"-proot\", \"-d\", driverTestDBName,\n\t\t\"-f\", path.Dir(path.Dir(testCurrentPath()))+\"/data/admin.pgsql\")\n\tcmd.Env = os.Environ()\n\tcmd.Env = append(cmd.Env, \"PGPASSWORD=root\")\n\terr := cmd.Run()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdriverTestPgConn = testConnDSN(DriverPostgresql, fmt.Sprintf(\"host=127.0.0.1 port=5433 user=postgres \"+\n\t\t\"password=root dbname=%s sslmode=disable\", driverTestDBName))\n}\n\nfunc TestPgSQL_WhereIn(t *testing.T)         { testSQLWhereIn(t, driverTestPgConn) }\nfunc TestPgSQL_Count(t *testing.T)           { testSQLCount(t, driverTestPgConn) }\nfunc TestPgSQL_Select(t *testing.T)          { testSQLSelect(t, driverTestPgConn) }\nfunc TestPgSQL_OrderBy(t *testing.T)         { testSQLOrderBy(t, driverTestPgConn) }\nfunc TestPgSQL_GroupBy(t *testing.T)         { testSQLGroupBy(t, driverTestPgConn) }\nfunc TestPgSQL_Skip(t *testing.T)            { testSQLSkip(t, driverTestPgConn) }\nfunc TestPgSQL_Take(t *testing.T)            { testSQLTake(t, driverTestPgConn) }\nfunc TestPgSQL_Where(t *testing.T)           { testSQLWhere(t, driverTestPgConn) }\nfunc TestPgSQL_WhereNotIn(t *testing.T)      { testSQLWhereNotIn(t, driverTestPgConn) }\nfunc TestPgSQL_Find(t *testing.T)            { testSQLFind(t, driverTestPgConn) }\nfunc TestPgSQL_Sum(t *testing.T)             { testSQLSum(t, driverTestPgConn) }\nfunc TestPgSQL_Max(t *testing.T)             { testSQLMax(t, driverTestPgConn) }\nfunc TestPgSQL_Min(t *testing.T)             { testSQLMin(t, driverTestPgConn) }\nfunc TestPgSQL_Avg(t *testing.T)             { testSQLAvg(t, driverTestPgConn) }\nfunc TestPgSQL_WhereRaw(t *testing.T)        { testSQLWhereRaw(t, driverTestPgConn) }\nfunc TestPgSQL_UpdateRaw(t *testing.T)       { testSQLUpdateRaw(t, driverTestPgConn) }\nfunc TestPgSQL_LeftJoin(t *testing.T)        { testSQLLeftJoin(t, driverTestPgConn) }\nfunc TestPgSQL_WithTransaction(t *testing.T) { testSQLWithTransaction(t, driverTestPgConn) }\nfunc TestPgSQL_WithTransactionByLevel(t *testing.T) {\n\ttestSQLWithTransactionByLevel(t, driverTestPgConn)\n}\nfunc TestPgSQL_First(t *testing.T)       { testSQLFirst(t, driverTestPgConn) }\nfunc TestPgSQL_All(t *testing.T)         { testSQLAll(t, driverTestPgConn) }\nfunc TestPgSQL_ShowColumns(t *testing.T) { testSQLShowColumns(t, driverTestPgConn) }\nfunc TestPgSQL_ShowTables(t *testing.T)  { testSQLShowTables(t, driverTestPgConn) }\nfunc TestPgSQL_Update(t *testing.T)      { testSQLUpdate(t, driverTestPgConn) }\nfunc TestPgSQL_Delete(t *testing.T)      { testSQLDelete(t, driverTestPgConn) }\nfunc TestPgSQL_Exec(t *testing.T)        { testSQLExec(t, driverTestPgConn) }\nfunc TestPgSQL_Insert(t *testing.T)      { testSQLInsert(t, driverTestPgConn) }\nfunc TestPgSQL_Wrap(t *testing.T)        { testSQLWrap(t, driverTestPgConn) }\n"
  },
  {
    "path": "modules/db/statement_sqlite_test.go",
    "content": "package db\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n)\n\nvar driverTestSQLiteConn Connection\n\nfunc InitSqlite() {\n\tdriverTestSQLiteConn = testConn(DriverSqlite, config.Database{File: \"/admin.db\"})\n}\n\nfunc TestSQLiteSQL_WhereIn(t *testing.T)         { testSQLWhereIn(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Count(t *testing.T)           { testSQLCount(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Select(t *testing.T)          { testSQLSelect(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_OrderBy(t *testing.T)         { testSQLOrderBy(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_GroupBy(t *testing.T)         { testSQLGroupBy(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Skip(t *testing.T)            { testSQLSkip(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Take(t *testing.T)            { testSQLTake(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Where(t *testing.T)           { testSQLWhere(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_WhereNotIn(t *testing.T)      { testSQLWhereNotIn(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Find(t *testing.T)            { testSQLFind(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Sum(t *testing.T)             { testSQLSum(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Max(t *testing.T)             { testSQLMax(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Min(t *testing.T)             { testSQLMin(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Avg(t *testing.T)             { testSQLAvg(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_WhereRaw(t *testing.T)        { testSQLWhereRaw(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_UpdateRaw(t *testing.T)       { testSQLUpdateRaw(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_LeftJoin(t *testing.T)        { testSQLLeftJoin(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_WithTransaction(t *testing.T) { testSQLWithTransaction(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_WithTransactionByLevel(t *testing.T) {\n\ttestSQLWithTransactionByLevel(t, driverTestSQLiteConn)\n}\nfunc TestSQLiteSQL_First(t *testing.T)       { testSQLFirst(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_All(t *testing.T)         { testSQLAll(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_ShowColumns(t *testing.T) { testSQLShowColumns(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_ShowTables(t *testing.T)  { testSQLShowTables(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Update(t *testing.T)      { testSQLUpdate(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Delete(t *testing.T)      { testSQLDelete(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Exec(t *testing.T)        { testSQLExec(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Insert(t *testing.T)      { testSQLInsert(t, driverTestSQLiteConn) }\nfunc TestSQLiteSQL_Wrap(t *testing.T)        { testSQLWrap(t, driverTestSQLiteConn) }\n"
  },
  {
    "path": "modules/db/statement_test.go",
    "content": "package db\n\nimport (\n\t\"database/sql\"\n\t\"testing\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc testSQLWhereIn(t *testing.T, conn Connection) {\n\n\titem, _ := WithDriver(conn).Table(\"goadmin_users\").WhereIn(\"id\", []interface{}{\"1\", \"2\"}).First()\n\tassert.Equal(t, len(item), 2)\n\n\t_, _ = WithDriver(conn).WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\t\titem, _ := WithDriver(conn).WithTx(tx).Table(\"goadmin_users\").WhereIn(\"id\", []interface{}{\"1\", \"2\"}).All()\n\t\tassert.Equal(t, len(item), 2)\n\t\treturn nil, nil\n\t})\n}\n\nfunc testSQLCount(t *testing.T, conn Connection) {\n\tcount, _ := WithDriver(conn).Table(\"goadmin_users\").Count()\n\tassert.Equal(t, count, int64(2))\n}\n\n// TODO\nfunc testSQLSelect(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLOrderBy(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLGroupBy(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLSkip(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLTake(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLWhere(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLWhereNotIn(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLFind(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLSum(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLMax(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLMin(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLAvg(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLWhereRaw(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLUpdateRaw(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLLeftJoin(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLWithTransaction(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLWithTransactionByLevel(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLFirst(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLAll(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLShowColumns(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLShowTables(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLUpdate(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLDelete(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLExec(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLInsert(t *testing.T, conn Connection) {}\n\n// TODO\nfunc testSQLWrap(t *testing.T, conn Connection) {}\n"
  },
  {
    "path": "modules/db/types.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage db\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"strconv\"\n)\n\n// DatabaseType is the database field type.\ntype DatabaseType string\n\nconst (\n\t// =================================\n\t// integer\n\t// =================================\n\n\tInt       DatabaseType = \"INT\"\n\tTinyint   DatabaseType = \"TINYINT\"\n\tMediumint DatabaseType = \"MEDIUMINT\"\n\tSmallint  DatabaseType = \"SMALLINT\"\n\tBigint    DatabaseType = \"BIGINT\"\n\tBit       DatabaseType = \"BIT\"\n\tInt8      DatabaseType = \"INT8\"\n\tInt4      DatabaseType = \"INT4\"\n\tInt2      DatabaseType = \"INT2\"\n\n\tInteger     DatabaseType = \"INTEGER\"\n\tNumeric     DatabaseType = \"NUMERIC\"\n\tSmallserial DatabaseType = \"SMALLSERIAL\"\n\tSerial      DatabaseType = \"SERIAL\"\n\tBigserial   DatabaseType = \"BIGSERIAL\"\n\tMoney       DatabaseType = \"MONEY\"\n\n\t// =================================\n\t// float\n\t// =================================\n\n\tReal    DatabaseType = \"REAL\"\n\tFloat   DatabaseType = \"FLOAT\"\n\tFloat4  DatabaseType = \"FLOAT4\"\n\tFloat8  DatabaseType = \"FLOAT8\"\n\tDouble  DatabaseType = \"DOUBLE\"\n\tDecimal DatabaseType = \"DECIMAL\"\n\n\tDoubleprecision DatabaseType = \"DOUBLEPRECISION\"\n\n\t// =================================\n\t// string\n\t// =================================\n\n\tDate      DatabaseType = \"DATE\"\n\tTime      DatabaseType = \"TIME\"\n\tYear      DatabaseType = \"YEAR\"\n\tDatetime  DatabaseType = \"DATETIME\"\n\tTimestamp DatabaseType = \"TIMESTAMP\"\n\n\tText       DatabaseType = \"TEXT\"\n\tLongtext   DatabaseType = \"LONGTEXT\"\n\tMediumtext DatabaseType = \"MEDIUMTEXT\"\n\tTinytext   DatabaseType = \"TINYTEXT\"\n\n\tVarchar DatabaseType = \"VARCHAR\"\n\tChar    DatabaseType = \"CHAR\"\n\tBpchar  DatabaseType = \"BPCHAR\"\n\tJSON    DatabaseType = \"JSON\"\n\n\tBlob       DatabaseType = \"BLOB\"\n\tTinyblob   DatabaseType = \"TINYBLOB\"\n\tMediumblob DatabaseType = \"MEDIUMBLOB\"\n\tLongblob   DatabaseType = \"LONGBLOB\"\n\n\tInterval DatabaseType = \"INTERVAL\"\n\tBoolean  DatabaseType = \"BOOLEAN\"\n\tBool     DatabaseType = \"BOOL\"\n\n\tPoint   DatabaseType = \"POINT\"\n\tLine    DatabaseType = \"LINE\"\n\tLseg    DatabaseType = \"LSEG\"\n\tBox     DatabaseType = \"BOX\"\n\tPath    DatabaseType = \"PATH\"\n\tPolygon DatabaseType = \"POLYGON\"\n\tCircle  DatabaseType = \"CIRCLE\"\n\n\tCidr    DatabaseType = \"CIDR\"\n\tInet    DatabaseType = \"INET\"\n\tMacaddr DatabaseType = \"MACADDR\"\n\n\tCharacter        DatabaseType = \"CHARACTER\"\n\tVaryingcharacter DatabaseType = \"VARYINGCHARACTER\"\n\tNchar            DatabaseType = \"NCHAR\"\n\tNativecharacter  DatabaseType = \"NATIVECHARACTER\"\n\tNvarchar         DatabaseType = \"NVARCHAR\"\n\tClob             DatabaseType = \"CLOB\"\n\n\tBinary    DatabaseType = \"BINARY\"\n\tVarbinary DatabaseType = \"VARBINARY\"\n\tEnum      DatabaseType = \"ENUM\"\n\tSet       DatabaseType = \"SET\"\n\n\tGeometry DatabaseType = \"GEOMETRY\"\n\n\tMultilinestring    DatabaseType = \"MULTILINESTRING\"\n\tMultipolygon       DatabaseType = \"MULTIPOLYGON\"\n\tLinestring         DatabaseType = \"LINESTRING\"\n\tMultipoint         DatabaseType = \"MULTIPOINT\"\n\tGeometrycollection DatabaseType = \"GEOMETRYCOLLECTION\"\n\n\tName DatabaseType = \"NAME\"\n\tUUID DatabaseType = \"UUID\"\n\n\tTimestamptz DatabaseType = \"TIMESTAMPTZ\"\n\tTimetz      DatabaseType = \"TIMETZ\"\n)\n\n// DT turn the string value into DatabaseType.\nfunc DT(s string) DatabaseType {\n\treturn DatabaseType(s)\n}\n\n// GetDTAndCheck check the DatabaseType.\nfunc GetDTAndCheck(s string) DatabaseType {\n\tss := DatabaseType(s)\n\tif !Contains(ss, BoolTypeList) &&\n\t\t!Contains(ss, IntTypeList) &&\n\t\t!Contains(ss, FloatTypeList) &&\n\t\t!Contains(ss, UintTypeList) &&\n\t\t!Contains(ss, StringTypeList) {\n\t\tpanic(\"wrong type: \" + s)\n\t}\n\treturn ss\n}\n\nvar (\n\t// StringTypeList is a DatabaseType list of string.\n\tStringTypeList = []DatabaseType{Date, Time, Year, Datetime, Timestamptz, Timestamp, Timetz,\n\t\tVarchar, Char, Mediumtext, Longtext, Tinytext,\n\t\tText, JSON, Blob, Tinyblob, Mediumblob, Longblob,\n\t\tInterval, Point, Bpchar,\n\t\tLine, Lseg, Box, Path, Polygon, Circle, Cidr, Inet, Macaddr, Character, Varyingcharacter,\n\t\tNchar, Nativecharacter, Nvarchar, Clob, Binary, Varbinary, Enum, Set, Geometry, Multilinestring,\n\t\tMultipolygon, Linestring, Multipoint, Geometrycollection, Name, UUID, Timestamptz,\n\t\tName, UUID, Inet}\n\n\t// BoolTypeList is a DatabaseType list of bool.\n\tBoolTypeList = []DatabaseType{Bool, Boolean}\n\n\t// IntTypeList is a DatabaseType list of integer.\n\tIntTypeList = []DatabaseType{Int4, Int2, Int8,\n\t\tInt,\n\t\tTinyint,\n\t\tMediumint,\n\t\tSmallint,\n\t\tSmallserial, Serial, Bigserial,\n\t\tInteger,\n\t\tBigint}\n\n\t// FloatTypeList is a DatabaseType list of float.\n\tFloatTypeList = []DatabaseType{Float, Float4, Float8, Double, Real, Doubleprecision}\n\n\t// UintTypeList is a DatabaseType list of uint.\n\tUintTypeList = []DatabaseType{Decimal, Bit, Money, Numeric}\n)\n\n// Contains check the given DatabaseType is in the list or not.\nfunc Contains(v DatabaseType, a []DatabaseType) bool {\n\tfor _, i := range a {\n\t\tif i == v {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Value is a string.\ntype Value string\n\n// ToInt64 turn the string to a int64.\nfunc (v Value) ToInt64() int64 {\n\tvalue, err := strconv.ParseInt(string(v), 10, 64)\n\tif err != nil {\n\t\tpanic(\"wrong value\")\n\t}\n\treturn value\n}\n\n// String return the string value.\nfunc (v Value) String() string {\n\treturn string(v)\n}\n\n// HTML return the template.HTML value.\nfunc (v Value) HTML() template.HTML {\n\treturn template.HTML(v)\n}\n\nfunc GetValueFromDatabaseType(typ DatabaseType, value interface{}, json bool) Value {\n\tif json {\n\t\treturn GetValueFromJSONOfDatabaseType(typ, value)\n\t} else {\n\t\treturn GetValueFromSQLOfDatabaseType(typ, value)\n\t}\n}\n\n// GetValueFromDatabaseType return Value of given DatabaseType and interface.\nfunc GetValueFromSQLOfDatabaseType(typ DatabaseType, value interface{}) Value {\n\tswitch {\n\tcase Contains(typ, StringTypeList):\n\t\tif v, ok := value.(string); ok {\n\t\t\treturn Value(v)\n\t\t}\n\t\tif v2, ok2 := value.([]byte); ok2 {\n\t\t\treturn Value(string(v2))\n\t\t}\n\t\treturn \"\"\n\tcase Contains(typ, BoolTypeList):\n\t\tif v, ok := value.(bool); ok {\n\t\t\tif v {\n\t\t\t\treturn \"true\"\n\t\t\t}\n\t\t\treturn \"false\"\n\t\t}\n\t\tif v, ok := value.(int64); ok {\n\t\t\tif v == 0 {\n\t\t\t\treturn \"false\"\n\t\t\t}\n\t\t\treturn \"true\"\n\t\t}\n\t\treturn \"false\"\n\tcase Contains(typ, IntTypeList):\n\t\tif v, ok := value.(int64); ok {\n\t\t\treturn Value(fmt.Sprintf(\"%d\", v))\n\t\t}\n\t\treturn \"0\"\n\tcase Contains(typ, FloatTypeList):\n\t\tif v, ok := value.(float64); ok {\n\t\t\treturn Value(fmt.Sprintf(\"%f\", v))\n\t\t}\n\t\treturn \"0\"\n\tcase Contains(typ, UintTypeList):\n\t\tif v, ok := value.([]uint8); ok {\n\t\t\treturn Value(string(v))\n\t\t}\n\t\treturn \"0\"\n\t}\n\tpanic(\"wrong type：\" + string(typ))\n}\n\n// GetValueFromJSONOfDatabaseType return Value of given DatabaseType and interface from JSON string value.\nfunc GetValueFromJSONOfDatabaseType(typ DatabaseType, value interface{}) Value {\n\tswitch {\n\tcase Contains(typ, StringTypeList):\n\t\tif v, ok := value.(string); ok {\n\t\t\treturn Value(v)\n\t\t}\n\t\treturn \"\"\n\tcase Contains(typ, BoolTypeList):\n\t\tif v, ok := value.(bool); ok {\n\t\t\tif v {\n\t\t\t\treturn \"true\"\n\t\t\t}\n\t\t\treturn \"false\"\n\t\t}\n\t\treturn \"false\"\n\tcase Contains(typ, IntTypeList):\n\t\tif v, ok := value.(float64); ok {\n\t\t\treturn Value(fmt.Sprintf(\"%d\", int64(v)))\n\t\t}\n\t\treturn Value(fmt.Sprintf(\"%d\", value))\n\tcase Contains(typ, FloatTypeList):\n\t\treturn Value(fmt.Sprintf(\"%f\", value))\n\tcase Contains(typ, UintTypeList):\n\t\tif v, ok := value.([]uint8); ok {\n\t\t\treturn Value(string(v))\n\t\t}\n\t\treturn \"0\"\n\t}\n\tpanic(\"wrong type：\" + string(typ))\n}\n"
  },
  {
    "path": "modules/db/types_test.go",
    "content": "package db\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t\"github.com/magiconair/properties/assert\"\n)\n\nconst (\n\ttypeTestdbName            = \"go-admin-type-test\"\n\ttypeTesttableName         = \"all_types\"\n\ttypeTestpostgresCreateSql = `CREATE TABLE public.%s\n(\n    id integer NOT NULL,\n    type_1 smallint,\n    type_2 bigint,\n    type_3 numeric,\n    type_4 real,\n    type_5 double precision,\n    type_6 smallint NOT NULL DEFAULT nextval('all_types_type_6_seq'::regclass),\n    type_7 integer NOT NULL DEFAULT nextval('all_types_type_7_seq'::regclass),\n    type_8 bigint NOT NULL DEFAULT nextval('all_types_type_8_seq'::regclass),\n    type_9 money,\n    type_10 character varying COLLATE pg_catalog.\"default\",\n    type_11 character(1) COLLATE pg_catalog.\"default\",\n    type_12 text COLLATE pg_catalog.\"default\",\n    type_13 timestamp with time zone,\n    type_14 time with time zone,\n    type_15 date,\n    type_16 timestamp without time zone,\n    type_17 interval,\n    type_18 point,\n    type_19 line,\n    type_20 lseg,\n    type_21 box,\n    type_22 path,\n    type_23 polygon,\n    type_24 circle,\n    type_25 cidr,\n    type_26 inet,\n    type_27 macaddr,\n\ttype_28 boolean,\n    CONSTRAINT all_types_pkey PRIMARY KEY (id)\n)\nWITH (\n    OIDS = FALSE\n)\nTABLESPACE pg_default;\n\nALTER TABLE public.all_types\n    OWNER to postgres;`\n)\n\nfunc TestMysqlGetTypeFromString(t *testing.T) {\n\n\tconn := testConnDSN(DriverMysql, fmt.Sprintf(\"root:root@tcp(127.0.0.1:3306)/%s\", typeTestdbName))\n\t_, err := conn.Exec(fmt.Sprintf(\"create database if not exists `%s`\", typeTestdbName))\n\tassert.Equal(t, err, nil)\n\t_, err = conn.Exec(fmt.Sprintf(\"DROP TABLE IF EXISTS `%s`;\", typeTesttableName))\n\tassert.Equal(t, err, nil)\n\t_, err = conn.Exec(fmt.Sprintf(`CREATE TABLE `+\"`\"+`%s`+\"`\"+` (\n  id int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `+testDelimiter(\"type_1\")+` tinyint(11) DEFAULT NULL,\n  `+testDelimiter(\"type_2\")+` smallint(11) DEFAULT NULL,\n  `+testDelimiter(\"type_3\")+` mediumint(11) DEFAULT NULL,\n  `+testDelimiter(\"type_4\")+` bigint(11) DEFAULT NULL,\n  `+testDelimiter(\"type_5\")+` float DEFAULT NULL,\n  `+testDelimiter(\"type_6\")+` double(5,3) DEFAULT NULL,\n  `+testDelimiter(\"type_7\")+` double DEFAULT NULL,\n  `+testDelimiter(\"type_8\")+` double(5,3) DEFAULT NULL,\n  `+testDelimiter(\"type_9\")+` decimal(11,0) DEFAULT NULL,\n  `+testDelimiter(\"type_10\")+` bit(11) DEFAULT NULL,\n  `+testDelimiter(\"type_11\")+` tinyint(1) DEFAULT NULL,\n  `+testDelimiter(\"type_12\")+` tinyint(1) DEFAULT NULL,\n  `+testDelimiter(\"type_13\")+` decimal(10,5) DEFAULT NULL,\n  `+testDelimiter(\"type_14\")+` decimal(10,0) DEFAULT NULL,\n  `+testDelimiter(\"type_15\")+` decimal(10,0) DEFAULT NULL,\n  `+testDelimiter(\"type_16\")+` char(11) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `+testDelimiter(\"type_17\")+` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `+testDelimiter(\"type_18\")+` tinytext COLLATE utf8mb4_unicode_ci,\n  `+testDelimiter(\"type_19\")+` text COLLATE utf8mb4_unicode_ci,\n  `+testDelimiter(\"type_20\")+` mediumtext COLLATE utf8mb4_unicode_ci,\n  `+testDelimiter(\"type_21\")+` longtext COLLATE utf8mb4_unicode_ci,\n  `+testDelimiter(\"type_22\")+` tinyblob,\n  `+testDelimiter(\"type_23\")+` mediumblob,\n  `+testDelimiter(\"type_24\")+` blob,\n  `+testDelimiter(\"type_25\")+` longblob,\n  `+testDelimiter(\"type_26\")+` binary(1) DEFAULT NULL,\n  `+testDelimiter(\"type_27\")+` varbinary(1) DEFAULT NULL,\n  `+testDelimiter(\"type_28\")+` enum('RED','GREEN','BLUE') COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `+testDelimiter(\"type_29\")+` set('RED','GREEN','BLUE') COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `+testDelimiter(\"type_30\")+` date DEFAULT NULL,\n  `+testDelimiter(\"type_31\")+` datetime DEFAULT NULL,\n  `+testDelimiter(\"type_32\")+` timestamp NULL DEFAULT NULL,\n  `+testDelimiter(\"type_33\")+` time DEFAULT NULL,\n  `+testDelimiter(\"type_34\")+` year(4) DEFAULT NULL,\n  `+testDelimiter(\"type_35\")+` geometry DEFAULT NULL,\n  `+testDelimiter(\"type_36\")+` point DEFAULT NULL,\n  `+testDelimiter(\"type_39\")+` multilinestring DEFAULT NULL,\n  `+testDelimiter(\"type_41\")+` multipolygon DEFAULT NULL,\n  `+testDelimiter(\"type_37\")+` linestring DEFAULT NULL,\n  `+testDelimiter(\"type_38\")+` polygon DEFAULT NULL,\n  `+testDelimiter(\"type_40\")+` multipoint DEFAULT NULL,\n  `+testDelimiter(\"type_42\")+` geometrycollection DEFAULT NULL,\n  `+testDelimiter(\"type_50\")+` double(5,2) DEFAULT NULL,\n  `+testDelimiter(\"type_51\")+` json DEFAULT NULL,\n  PRIMARY KEY (`+\"`\"+`id`+\"`\"+`)\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`, typeTesttableName))\n\n\tassert.Equal(t, err, nil)\n\n\t_, err = conn.Exec(`INSERT INTO ` + testDelimiter(typeTesttableName) + ` (id, type_1, type_2, type_3, type_4, type_5, type_6, type_7, type_8, type_9, type_10, type_11, type_12, type_13, type_14, type_15, type_16, type_17, type_18, type_19, type_20, type_21, type_22, type_23, type_24, type_25, type_26, type_27, type_28, type_29, type_30, type_31, type_32, type_33, type_34, type_35, type_36, type_39, type_41, type_37, type_38, type_40, type_42, type_50, type_51)\nVALUES\n\t(1, 1, 1, 1, 1, 1, 1.000, 1, 1.000, 1, 0, 1, 1, 1.00000, 1, 1, '1', '1', '1', '1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2001', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);`)\n\n\tassert.Equal(t, err, nil)\n\n\ttypeField := \"Type\"\n\tfieldField := \"Field\"\n\n\tconn = testConnDSN(DriverMysql, fmt.Sprintf(\"root:root@tcp(127.0.0.1:3306)/%s?charset=utf8mb4\", typeTestdbName))\n\n\tconfig.Initialize(&config.Config{\n\t\tSqlLog: true,\n\t})\n\n\tcolumnsModel, _ := WithDriver(conn).Table(typeTesttableName).ShowColumns()\n\titem, err := WithDriver(conn).Table(typeTesttableName).First()\n\n\tfor _, model := range columnsModel {\n\t\tfieldTypeName := strings.ToUpper(testGetType(model[typeField].(string)))\n\t\tGetDTAndCheck(fieldTypeName)\n\t\tGetValueFromSQLOfDatabaseType(DatabaseType(fieldTypeName), item[model[fieldField].(string)])\n\t}\n\tassert.Equal(t, err, nil)\n}\n\nfunc TestPostgresqlGetTypeFromString(t *testing.T) {\n\n\t// pg 11\n\ttestPG(t, \"5433\")\n\t// pg 12\n\t//testPG(t, \"5434\")\n}\n\nfunc testPG(t *testing.T, port string) {\n\tconnStatement := \"host=127.0.0.1 port=\" + port + \" user=postgres password=root dbname=%s sslmode=disable\"\n\n\tconn := testConnDSN(DriverPostgresql, fmt.Sprintf(connStatement, typeTestdbName))\n\tfmt.Println(\"creating database\")\n\t_, err := conn.Exec(fmt.Sprintf(`SELECT 'CREATE DATABASE %s' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '%s')`, typeTestdbName, typeTestdbName))\n\tassert.Equal(t, err, nil)\n\tfmt.Println(\"drop table\")\n\t_, err = conn.Exec(fmt.Sprintf(\"DROP TABLE IF EXISTS `%s`;\", typeTesttableName))\n\tassert.Equal(t, err, nil)\n\tfmt.Println(\"create sequence all_types_type_6_seq\")\n\t_, err = conn.Exec(`CREATE SEQUENCE IF NOT EXISTS public.all_types_type_6_seq START 1;`)\n\tassert.Equal(t, err, nil)\n\tfmt.Println(\"create sequence all_types_type_7_seq\")\n\t_, err = conn.Exec(`CREATE SEQUENCE IF NOT EXISTS public.all_types_type_7_seq START 1;`)\n\tassert.Equal(t, err, nil)\n\tfmt.Println(\"create sequence all_types_type_8_seq\")\n\t_, err = conn.Exec(`CREATE SEQUENCE IF NOT EXISTS public.all_types_type_8_seq START 1;`)\n\tassert.Equal(t, err, nil)\n\tfmt.Println(\"create table\")\n\t_, err = conn.Exec(fmt.Sprintf(typeTestpostgresCreateSql, typeTesttableName))\n\n\tassert.Equal(t, err, nil)\n\n\tfmt.Println(\"insert data\")\n\t_, err = conn.Exec(`INSERT INTO public.` + typeTesttableName + `(\n\tid, type_1, type_2, type_3, type_4, type_5, type_6, type_7, type_8, type_9, type_10, type_11, type_12, type_13, type_14, type_15, type_16, type_17, type_18, type_19, type_20, type_21, type_22, type_23, type_24, type_25, type_26, type_27, type_28)\n\tVALUES (1, 1, 1, 0.3, 1, 1, 1, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'n');`)\n\n\tassert.Equal(t, err, nil)\n\n\ttypeField := \"udt_name\"\n\tfieldField := \"column_name\"\n\n\tconn = testConnDSN(DriverPostgresql, fmt.Sprintf(connStatement, typeTestdbName))\n\n\tconfig.Initialize(&config.Config{\n\t\tSqlLog: true,\n\t})\n\n\tcolumnsModel, _ := WithDriver(conn).Table(typeTesttableName).ShowColumns()\n\titem, err := WithDriver(conn).Table(typeTesttableName).First()\n\n\tfor _, model := range columnsModel {\n\t\tfieldTypeName := strings.ToUpper(testGetType(model[typeField].(string)))\n\t\tfmt.Println(\"fieldTypeName\", fieldTypeName)\n\t\tGetDTAndCheck(fieldTypeName)\n\t\tfmt.Println(model[fieldField].(string), GetValueFromSQLOfDatabaseType(DatabaseType(fieldTypeName), item[model[fieldField].(string)]))\n\t}\n\n\tassert.Equal(t, err, nil)\n}\n\n// *******************************\n// test helper methods\n// *******************************\n\nfunc testGetType(typeName string) string {\n\tr, _ := regexp.Compile(`\\((.*?)\\)`)\n\ttypeName = r.ReplaceAllString(typeName, \"\")\n\treturn strings.ToLower(strings.ReplaceAll(typeName, \" unsigned\", \"\"))\n}\n\nfunc testConnDSN(driver, dsn string) Connection {\n\treturn GetConnectionByDriver(driver).InitDB(map[string]config.Database{\n\t\t\"default\": {Dsn: dsn},\n\t})\n}\n\nfunc testConn(driver string, cfg config.Database) Connection {\n\tcfg.Driver = driver\n\tcfg.MaxIdleConns = 10\n\tcfg.MaxOpenConns = 80\n\tcfg.ConnMaxLifetime = time.Hour\n\tcfg.ConnMaxIdleTime = 0\n\treturn GetConnectionByDriver(driver).InitDB(map[string]config.Database{\n\t\t\"default\": cfg,\n\t})\n}\n\nfunc testDelimiter(s string) string {\n\treturn \"`\" + s + \"`\"\n}\n\nfunc testCurrentPath() string {\n\tdir, err := os.Getwd()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn dir\n}\n"
  },
  {
    "path": "modules/errors/error.go",
    "content": "package errors\n\nimport (\n\t\"errors\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n)\n\nvar (\n\tMsg         string\n\tMsgHTML     template.HTML\n\tMsgWithIcon template.HTML\n)\n\nconst (\n\tPermissionDenied     = \"permission denied\"\n\tWrongID              = \"wrong id\"\n\tOperationNotAllow    = \"operation not allow\"\n\tEditFailWrongToken   = \"edit fail, wrong token\"\n\tCreateFailWrongToken = \"create fail, wrong token\"\n\tNoPermission         = \"no permission\"\n\tSiteOff              = \"site is off\"\n)\n\nfunc WrongPK(pk string) string {\n\treturn \"wrong \" + pk\n}\n\nfunc Init() {\n\tMsg = language.Get(\"error\")\n\tMsgHTML = language.GetFromHtml(\"error\")\n\tMsgWithIcon = icon.Icon(icon.Warning, 2) + MsgHTML + `!`\n\n\tPageError404 = errors.New(language.Get(\"not found\"))\n\tPageError500 = errors.New(language.Get(\"internal error\"))\n\tPageError403 = errors.New(language.Get(\"permission denied\"))\n\tPageError401 = errors.New(language.Get(\"unauthorized\"))\n}\n\ntype PageError error\n\nvar (\n\tPageError404 PageError\n\tPageError500 PageError\n\tPageError403 PageError\n\tPageError401 PageError\n)\n"
  },
  {
    "path": "modules/file/file.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage file\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"os\"\n\t\"path\"\n\t\"sync\"\n\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n)\n\n// Uploader is a file uploader which contains the method Upload.\ntype Uploader interface {\n\tUpload(*multipart.Form) error\n}\n\n// UploaderGenerator is a function return an Uploader.\ntype UploaderGenerator func() Uploader\n\nvar uploaderList = map[string]UploaderGenerator{\n\t\"local\": GetLocalFileUploader,\n}\n\nvar upMu sync.Mutex\n\n// AddUploader makes a uploader generator available by the provided theme name.\n// If Add is called twice with the same name or if uploader is nil,\n// it panics.\nfunc AddUploader(name string, up UploaderGenerator) {\n\tupMu.Lock()\n\tdefer upMu.Unlock()\n\tif up == nil {\n\t\tpanic(\"uploader generator is nil\")\n\t}\n\tif _, dup := uploaderList[name]; dup {\n\t\tpanic(\"add uploader generator twice \" + name)\n\t}\n\tuploaderList[name] = up\n}\n\n// GetFileEngine return the Uploader of given name.\nfunc GetFileEngine(name string) Uploader {\n\tif up, ok := uploaderList[name]; ok {\n\t\treturn up()\n\t}\n\tpanic(\"wrong uploader name\")\n}\n\n// UploadFun is a function to process the uploading logic.\ntype UploadFun func(*multipart.FileHeader, string) (string, error)\n\n// Upload receive the return value of given UploadFun and put them into the form.\nfunc Upload(c UploadFun, form *multipart.Form) error {\n\tvar (\n\t\tsuffix   string\n\t\tfilename string\n\t)\n\n\tfor k := range form.File {\n\t\tfor _, fileObj := range form.File[k] {\n\t\t\tsuffix = path.Ext(fileObj.Filename)\n\t\t\tfilename = modules.Uuid() + suffix\n\n\t\t\tpathStr, err := c(fileObj, filename)\n\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tform.Value[k] = append(form.Value[k], pathStr)\n\t\t\tform.Value[k+\"_size\"] = append(form.Value[k+\"_size\"], fmt.Sprintf(\"%d\", fileObj.Size))\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// SaveMultipartFile used in a local Uploader which help to save file in the local path.\nfunc SaveMultipartFile(fh *multipart.FileHeader, path string) error {\n\tf, err := fh.Open()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif ff, ok := f.(*os.File); ok {\n\t\t// Windows can't rename files that are opened.\n\t\tif err := f.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// If renaming fails we try the normal copying method.\n\t\t// Renaming could fail if the files are on different devices.\n\t\tif os.Rename(ff.Name(), path) == nil {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Reopen f for the code below.\n\t\tf, err = fh.Open()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tdefer func() {\n\t\tif err2 := f.Close(); err2 != nil {\n\t\t\terr = err2\n\t\t}\n\t}()\n\n\tff, err := os.Create(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer func() {\n\t\tif err2 := ff.Close(); err2 != nil {\n\t\t\terr = err2\n\t\t}\n\t}()\n\t_, err = copyZeroAlloc(ff, f)\n\treturn err\n}\n\nfunc copyZeroAlloc(w io.Writer, r io.Reader) (int64, error) {\n\tbuf := copyBufPool.Get().([]byte)\n\tn, err := io.CopyBuffer(w, r, buf)\n\tcopyBufPool.Put(buf)\n\treturn n, err\n}\n\nvar copyBufPool = sync.Pool{\n\tNew: func() interface{} {\n\t\treturn make([]byte, 4096)\n\t},\n}\n"
  },
  {
    "path": "modules/file/local.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage file\n\nimport (\n\t\"mime/multipart\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n)\n\n// LocalFileUploader is an Uploader of local file engine.\ntype LocalFileUploader struct {\n\tBasePath string\n}\n\n// GetLocalFileUploader return the default Uploader.\nfunc GetLocalFileUploader() Uploader {\n\treturn &LocalFileUploader{\n\t\tconfig.GetStore().Path,\n\t}\n}\n\n// Upload implements the Uploader.Upload.\nfunc (local *LocalFileUploader) Upload(form *multipart.Form) error {\n\treturn Upload(func(fileObj *multipart.FileHeader, filename string) (string, error) {\n\t\tif err := SaveMultipartFile(fileObj, (*local).BasePath+\"/\"+filename); err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\treturn filename, nil\n\t}, form)\n}\n"
  },
  {
    "path": "modules/language/cn.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport \"strings\"\n\nvar cn = LangSet{\n\t\"managers\":        \"管理员\",\n\t\"managers manage\": \"管理员管理\",\n\t\"name\":            \"用户名\",\n\t\"nickname\":        \"昵称\",\n\t\"role\":            \"角色\",\n\t\"createdat\":       \"创建时间\",\n\t\"updatedat\":       \"更新时间\",\n\t\"path\":            \"路径\",\n\t\"submit\":          \"提交\",\n\t\"filter\":          \"筛选\",\n\n\t\"new\":             \"新建\",\n\t\"export\":          \"导出\",\n\t\"action\":          \"操作\",\n\t\"toggle dropdown\": \"下拉\",\n\t\"delete\":          \"删除\",\n\t\"refresh\":         \"刷新\",\n\t\"back\":            \"返回\",\n\t\"reset\":           \"重置\",\n\t\"save\":            \"保存\",\n\t\"edit\":            \"编辑\",\n\t\"expand\":          \"展开\",\n\t\"collapse\":        \"折叠\",\n\t\"online\":          \"在线\",\n\t\"setting\":         \"设置\",\n\t\"sign out\":        \"登出\",\n\t\"home\":            \"首页\",\n\t\"all\":             \"全部\",\n\t\"more\":            \"更多\",\n\t\"browse\":          \"打开\",\n\t\"remove\":          \"移除\",\n\n\t\"permission manage\": \"权限管理\",\n\t\"menus\":             \"菜单\",\n\t\"menus manage\":      \"菜单管理\",\n\t\"roles manage\":      \"角色管理\",\n\t\"operation log\":     \"操作日志\",\n\t\"method\":            \"方法\",\n\t\"input\":             \"输入\",\n\t\"operation\":         \"操作\",\n\t\"menu name\":         \"菜单名\",\n\t\"reload succeeded\":  \"加载成功\",\n\t\"search\":            \"搜索\",\n\n\t\"permission denied\": \"没有权限\",\n\t\"error\":             \"错误\",\n\t\"success\":           \"成功\",\n\t\"fail\":              \"失败\",\n\t\"current page\":      \"当前页\",\n\n\t\"goadmin is now running. \\nrunning in \\\"debug\\\" mode. switch to \\\"release\\\" mode in production.\\n\\n\": \"GoAdmin 启动成功。\\n目前处于 \\\"debug\\\" 模式。请在生产环境中切换为 \\\"release\\\" 模式。\\n\\n\",\n\n\t\"wrong goadmin version, theme %s required goadmin version are %s\":    \"错误的 GoAdmin 版本，当前主题 %s 需要 GoAdmin 版本为 %s\",\n\t\"wrong theme version, goadmin %s required version of theme %s is %s\": \"错误的主题版本, GoAdmin %s 需要主题 %s 的版本为 %s\",\n\n\t\"adapter is nil, import the default adapter or use addadapter method add the adapter\": \"适配器为空，请先 import 对应的适配器或使用 AddAdapter 方法引入\",\n\n\t\"are you sure to delete\": \"你确定要删除吗？\",\n\t\"yes\":                    \"确定\",\n\t\"confirm\":                \"确认\",\n\t\"got it\":                 \"知道了\",\n\t\"cancel\":                 \"取消\",\n\t\"refresh succeeded\":      \"刷新成功\",\n\t\"delete succeed\":         \"删除成功\",\n\t\"edit fail\":              \"编辑失败\",\n\t\"create fail\":            \"新增失败\",\n\t\"delete fail\":            \"删除失败\",\n\t\"confirm password\":       \"确认密码\",\n\t\"all method if empty\":    \"为空默认为所有方法\",\n\n\t\"detail\":     \"详情\",\n\t\"query time\": \"查询时间\",\n\n\t\"avatar\":     \"头像\",\n\t\"password\":   \"密码\",\n\t\"username\":   \"用户名\",\n\t\"slug\":       \"标志\",\n\t\"permission\": \"权限\",\n\t\"userid\":     \"用户ID\",\n\t\"content\":    \"内容\",\n\t\"parent\":     \"父级\",\n\t\"icon\":       \"图标\",\n\t\"uri\":        \"路径\",\n\t\"close\":      \"关闭\",\n\n\t\"login\":      \"登录\",\n\t\"login fail\": \"登录失败\",\n\n\t\"admin\":     \"管理\",\n\t\"user\":      \"用户\",\n\t\"users\":     \"用户\",\n\t\"roles\":     \"角色\",\n\t\"menu\":      \"菜单\",\n\t\"dashboard\": \"仪表盘\",\n\n\t\"continue editing\":  \"继续编辑\",\n\t\"continue creating\": \"继续新增\",\n\n\t\"username and password can not be empty\":        \"用户名密码不能为空\",\n\t\"operation not allow\":                           \"不允许的操作\",\n\t\"password does not match\":                       \"密码不一致\",\n\t\"should be unique\":                              \"需要保证唯一\",\n\t\"slug exists\":                                   \"标志已经存在了\",\n\t\"no corresponding options?\":                     \"没找到对应选项？\",\n\t\"create here.\":                                  \"在这里新建一个。\",\n\t\"use for login\":                                 \"用于登录\",\n\t\"use to display\":                                \"用来展示\",\n\t\"a path a line, without global prefix\":          \"一行一个路径，换行输入新路径，路径不包含全局路由前缀\",\n\t\"slug or http_path or name should not be empty\": \"标志或路径或权限名不能为空\",\n\t\"no roles\":                                      \"无角色\",\n\t\"no permission\":                                 \"没有权限\",\n\t\"fixed the sidebar\":                             \"固定侧边栏\",\n\t\"enter fullscreen\":                              \"进入全屏\",\n\t\"exit fullscreen\":                               \"退出全屏\",\n\t\"wrong captcha\":                                 \"错误的验证码\",\n\t\"modify success\":                                \"修改成功\",\n\n\t\"not found\":      \"找不到记录\",\n\t\"internal error\": \"系统内部错误\",\n\t\"unauthorized\":   \"未认证\",\n\n\t\"login overdue, please login again\": \"登录信息过期，请重新登录\",\n\t\"login info\":                        \"登录信息\",\n\n\t\"initialize configuration\":        \"初始化配置\",\n\t\"initialize navigation buttons\":   \"初始化导航栏按钮\",\n\t\"initialize plugins\":              \"初始化插件\",\n\t\"initialize database connections\": \"初始化数据库连接\",\n\t\"initialize success\":              \"初始化成功🍺🍺\",\n\n\t\"plugins\":          \"插件\",\n\t\"plugin store\":     \"插件商店\",\n\t\"get more plugins\": \"获取更多插件\",\n\t\"uninstalled\":      \"未安装\",\n\t\"plugin setting\":   \"插件设置\",\n\n\t\"view\": \"查看\",\n\t\"del\":  \"删除\",\n\n\t\"showing <b>%s</b> to <b>%s</b> of <b>%s</b> entries\": \"显示第 <b>%s</b> 到第 <b>%s</b> 条记录，总共 <b>%s</b> 条记录\",\n\n\t\"second\":  \"秒\",\n\t\"seconds\": \"秒\",\n\t\"minute\":  \"分\",\n\t\"minutes\": \"分\",\n\t\"hour\":    \"小时\",\n\t\"hours\":   \"小时\",\n\t\"day\":     \"天\",\n\t\"days\":    \"天\",\n\t\"week\":    \"周\",\n\t\"weeks\":   \"周\",\n\t\"month\":   \"月\",\n\t\"months\":  \"月\",\n\t\"year\":    \"年\",\n\t\"years\":   \"年\",\n\n\t\"site setting\":           \"网站设置\",\n\t\"config.site setting\":    \"网站设置\",\n\t\"config.domain\":          \"网站域名\",\n\t\"config.language\":        \"网站语言\",\n\t\"config.url prefix\":      \"URL前缀\",\n\t\"config.theme\":           \"主题\",\n\t\"config.title\":           \"标题\",\n\t\"config.index url\":       \"首页URL\",\n\t\"config.login url\":       \"登录URL\",\n\t\"config.env\":             \"开发环境\",\n\t\"config.color scheme\":    \"颜色主题\",\n\t\"config.cdn url\":         \"cdn资源URL\",\n\t\"config.login title\":     \"登录标题\",\n\t\"config.auth user table\": \"登录用户表\",\n\t\"config.extra\":           \"额外配置\",\n\t\"config.store\":           \"文件存储设置\",\n\t\"config.databases\":       \"数据库设置\",\n\t\"config.general\":         \"通用\",\n\t\"config.log\":             \"日志\",\n\t\"config.custom\":          \"定制\",\n\t\"config.debug\":           \"Debug模式\",\n\t\"config.site off\":        \"关闭网站\",\n\t\"config.true\":            \"是\",\n\t\"config.false\":           \"否\",\n\n\t\"config.test\":  \"测试环境\",\n\t\"config.prod\":  \"生产环境\",\n\t\"config.local\": \"本地环境\",\n\n\t\"config.logo\":                        \"Logo\",\n\t\"config.mini logo\":                   \"Mini Logo\",\n\t\"config.session life time\":           \"Session时长\",\n\t\"config.bootstrap file path\":         \"插件文件路径\",\n\t\"config.go mod file path\":            \"go.mod文件路径\",\n\t\"config.custom head html\":            \"自定义Head HTML\",\n\t\"config.custom foot html\":            \"自定义Foot HTML\",\n\t\"config.custom 404 html\":             \"自定义404页面\",\n\t\"config.custom 403 html\":             \"自定义403页面\",\n\t\"config.custom 500 html\":             \"自定义500页面\",\n\t\"config.hide config center entrance\": \"隐藏配置中心入口\",\n\t\"config.hide app info entrance\":      \"隐藏应用信息入口\",\n\t\"config.hide tool entrance\":          \"隐藏工具入口\",\n\t\"config.hide plugin entrance\":        \"隐藏插件列表入口\",\n\t\"config.footer info\":                 \"自定义底部信息\",\n\t\"config.login logo\":                  \"登录Logo\",\n\t\"config.no limit login ip\":           \"取消限制多IP登录\",\n\t\"config.operation log off\":           \"关闭操作日志\",\n\t\"config.allow delete operation log\":  \"允许删除操作日志\",\n\t\"config.animation type\":              \"动画类型\",\n\t\"config.animation duration\":          \"动画间隔（秒）\",\n\t\"config.animation delay\":             \"动画延迟（秒）\",\n\t\"config.file upload engine\":          \"文件上传引擎\",\n\n\t\"config.logger rotate\":             \"日志切割设置\",\n\t\"config.logger rotate max size\":    \"存储最大文件大小（m）\",\n\t\"config.logger rotate max backups\": \"存储最多文件数\",\n\t\"config.logger rotate max age\":     \"最长存储时间（天）\",\n\t\"config.logger rotate compress\":    \"压缩\",\n\n\t\"config.info log path\":         \"信息日志存储路径\",\n\t\"config.error log path\":        \"错误日志存储路径\",\n\t\"config.access log path\":       \"访问日志存储路径\",\n\t\"config.info log off\":          \"关闭信息日志\",\n\t\"config.error log off\":         \"关闭错误日志\",\n\t\"config.access log off\":        \"关闭访问日志\",\n\t\"config.access assets log off\": \"关闭静态资源访问日志\",\n\t\"config.sql log on\":            \"打开SQL日志\",\n\t\"config.log level\":             \"日志级别\",\n\n\t\"config.logger rotate encoder\":                \"日志encoder设置\",\n\t\"config.logger rotate encoder time key\":       \"Time Key\",\n\t\"config.logger rotate encoder level key\":      \"Level Key\",\n\t\"config.logger rotate encoder name key\":       \"Name Key\",\n\t\"config.logger rotate encoder caller key\":     \"Caller Key\",\n\t\"config.logger rotate encoder message key\":    \"Message Key\",\n\t\"config.logger rotate encoder stacktrace key\": \"Stacktrace Key\",\n\t\"config.logger rotate encoder level\":          \"Level字段编码\",\n\t\"config.logger rotate encoder time\":           \"Time字段编码\",\n\t\"config.logger rotate encoder duration\":       \"Duration字段编码\",\n\t\"config.logger rotate encoder caller\":         \"Caller字段编码\",\n\t\"config.logger rotate encoder encoding\":       \"输出格式\",\n\n\t\"config.capital\":        \"大写\",\n\t\"config.capitalcolor\":   \"大写带颜色\",\n\t\"config.lowercase\":      \"小写\",\n\t\"config.lowercasecolor\": \"小写带颜色\",\n\n\t\"config.seconds\":     \"秒\",\n\t\"config.nanosecond\":  \"纳秒\",\n\t\"config.microsecond\": \"微秒\",\n\t\"config.millisecond\": \"毫秒\",\n\n\t\"config.full path\":  \"完整路径\",\n\t\"config.short path\": \"简短路径\",\n\n\t\"config.do not modify when you have not set up all assets\": \"不要修改，当你还没有设置好所有资源文件的时候\",\n\t\"config.it will work when theme is adminlte\":               \"当主题为adminlte时生效\",\n\t\"config.must bigger than 900 seconds\":                      \"必须大于900秒\",\n\n\t\"config.language.\" + CN:                  \"中文\",\n\t\"config.language.\" + EN:                  \"英文\",\n\t\"config.language.\" + JP:                  \"日文\",\n\t\"config.language.\" + strings.ToLower(TC): \"繁体中文\",\n\t\"config.language.\" + PTBR:                \"Brazilian Portuguese\",\n\t\"config.language.\" + RU:                  \"Русский\",\n\n\t\"config.modify site config\":         \"修改网站配置\",\n\t\"config.modify site config success\": \"修改网站配置成功\",\n\t\"config.modify site config fail\":    \"修改网站配置失败\",\n\n\t\"site info\":              \"运行信息\",\n\t\"system.site info\":       \"运行信息\",\n\t\"system.application\":     \"应用信息\",\n\t\"system.application run\": \"应用运行信息\",\n\t\"system.system\":          \"系统信息\",\n\n\t\"system.process_id\":                           \"进程ID\",\n\t\"system.golang_version\":                       \"Golang版本\",\n\t\"system.server_uptime\":                        \"服务运行时间\",\n\t\"system.current_goroutine\":                    \"当前 Goroutines 数量\",\n\t\"system.current_memory_usage\":                 \"当前内存使用量\",\n\t\"system.total_memory_allocated\":               \"所有被分配的内存\",\n\t\"system.memory_obtained\":                      \"内存占用量\",\n\t\"system.pointer_lookup_times\":                 \"指针查找次数\",\n\t\"system.memory_allocate_times\":                \"内存分配次数\",\n\t\"system.memory_free_times\":                    \"内存释放次数\",\n\t\"system.current_heap_usage\":                   \"当前 Heap 内存使用量\",\n\t\"system.heap_memory_obtained\":                 \"Heap 内存占用量\",\n\t\"system.heap_memory_idle\":                     \"Heap 内存空闲量\",\n\t\"system.heap_memory_in_use\":                   \"正在使用的 Heap 内存\",\n\t\"system.heap_memory_released\":                 \"被释放的 Heap 内存\",\n\t\"system.heap_objects\":                         \"Heap 对象数量\",\n\t\"system.bootstrap_stack_usage\":                \"启动 Stack 使用量\",\n\t\"system.stack_memory_obtained\":                \"被分配的 Stack 内存\",\n\t\"system.mspan_structures_usage\":               \"MSpan 结构内存使用量\",\n\t\"system.mspan_structures_obtained\":            \"被分配的 MSpan 结构内存\",\n\t\"system.mcache_structures_usage\":              \"MCache 结构内存使用量\",\n\t\"system.mcache_structures_obtained\":           \"被分配的 MCache 结构内存\",\n\t\"system.profiling_bucket_hash_table_obtained\": \"被分配的剖析哈希表内存\",\n\t\"system.gc_metadata_obtained\":                 \"被分配的 GC 元数据内存\",\n\t\"system.other_system_allocation_obtained\":     \"其它被分配的系统内存\",\n\t\"system.next_gc_recycle\":                      \"下次 GC 内存回收量\",\n\t\"system.last_gc_time\":                         \"距离上次 GC 时间\",\n\t\"system.total_gc_time\":                        \"GC 执行时间总量\",\n\t\"system.total_gc_pause\":                       \"GC 暂停时间总量\",\n\t\"system.last_gc_pause\":                        \"上次 GC 暂停时间\",\n\t\"system.gc_times\":                             \"GC 执行次数\",\n\n\t\"system.cpu_logical_core\": \"cpu逻辑核数\",\n\t\"system.cpu_core\":         \"cpu物理核数\",\n\t\"system.os_platform\":      \"系统平台\",\n\t\"system.os_family\":        \"系统家族\",\n\t\"system.os_version\":       \"系统版本\",\n\t\"system.load1\":            \"1分钟内负载\",\n\t\"system.load5\":            \"5分钟内负载\",\n\t\"system.load15\":           \"15分钟内负载\",\n\t\"system.mem_total\":        \"总内存\",\n\t\"system.mem_available\":    \"可用内存\",\n\t\"system.mem_used\":         \"使用内存\",\n\n\t\"system.app_name\":         \"应用名\",\n\t\"system.go_admin_version\": \"应用版本\",\n\t\"system.theme_name\":       \"主题\",\n\t\"system.theme_version\":    \"主题版本\",\n\n\t\"code generate tool\":        \"代码生成器\",\n\t\"tool.code generate tool\":   \"代码生成器\",\n\t\"tool.table\":                \"表格\",\n\t\"tool.connection\":           \"连接\",\n\t\"tool.output path is empty\": \"输出路径为空\",\n\t\"tool.package\":              \"包名\",\n\t\"tool.output\":               \"输出路径\",\n\t\"tool.field\":                \"字段\",\n\t\"tool.title\":                \"标题\",\n\t\"tool.field name\":           \"字段名\",\n\t\"tool.db type\":              \"数据类型\",\n\t\"tool.form type\":            \"表单类型\",\n\t\"tool.generate table model\": \"生成CRUD模型\",\n\t\"tool.primarykey\":           \"主键\",\n\t\"tool.field filterable\":     \"可筛选\",\n\t\"tool.field sortable\":       \"可排序\",\n\t\"tool.yes\":                  \"是\",\n\t\"tool.no\":                   \"否\",\n\t\"tool.hide\":                 \"隐藏\",\n\t\"tool.show\":                 \"显示\",\n\t\"tool.generate success\":     \"生成成功\",\n\t\"tool.display\":              \"显示\",\n\t\"tool.use absolute path\":    \"使用绝对路径\",\n\t\"tool.basic info\":           \"基本信息\",\n\t\"tool.table info\":           \"表格信息\",\n\t\"tool.form info\":            \"表单信息\",\n\t\"tool.field editable\":       \"允许编辑\",\n\t\"tool.field can add\":        \"允许新增\",\n\t\"tool.info field editable\":  \"可编辑\",\n\t\"tool.field default\":        \"默认值\",\n\t\"tool.filter area\":          \"筛选框\",\n\t\"tool.new button\":           \"新建按钮\",\n\t\"tool.export button\":        \"导出按钮\",\n\t\"tool.edit button\":          \"编辑按钮\",\n\t\"tool.delete button\":        \"删除按钮\",\n\t\"tool.extra import package\": \"导入包\",\n\t\"tool.detail button\":        \"详情按钮\",\n\t\"tool.filter button\":        \"筛选按钮\",\n\t\"tool.row selector\":         \"列选择按钮\",\n\t\"tool.pagination\":           \"分页\",\n\t\"tool.query info\":           \"查询信息\",\n\t\"tool.filter form layout\":   \"筛选表单布局\",\n\t\"tool.generate\":             \"生成\",\n\t\"tool.generated tables\":     \"生成过的表格\",\n\t\"tool.description\":          \"描述\",\n\t\"tool.label\":                \"标签\",\n\t\"tool.image\":                \"图片\",\n\t\"tool.bool\":                 \"布尔\",\n\t\"tool.link\":                 \"链接\",\n\t\"tool.fileSize\":             \"文件大小\",\n\t\"tool.date\":                 \"日期\",\n\t\"tool.icon\":                 \"Icon\",\n\t\"tool.dot\":                  \"标点\",\n\t\"tool.progressBar\":          \"进度条\",\n\t\"tool.loading\":              \"Loading\",\n\t\"tool.downLoadable\":         \"可下载\",\n\t\"tool.copyable\":             \"可复制\",\n\t\"tool.carousel\":             \"图片轮播\",\n\t\"tool.qrcode\":               \"二维码\",\n\t\"tool.field hide\":           \"隐藏\",\n\t\"tool.field display\":        \"显示\",\n\t\"tool.table permission\":     \"生成表格权限\",\n\t\"tool.extra code\":           \"额外代码\",\n\n\t\"tool.detail display\":             \"显示\",\n\t\"tool.detail info\":                \"详情页信息\",\n\t\"tool.follow list page\":           \"跟随列表页\",\n\t\"tool.inherit from list page\":     \"继承列表页\",\n\t\"tool.independent from list page\": \"独立\",\n\n\t\"tool.continue edit checkbox\": \"继续编辑按钮\",\n\t\"tool.continue new checkbox\":  \"继续新增按钮\",\n\t\"tool.reset button\":           \"重设按钮\",\n\t\"tool.back button\":            \"返回按钮\",\n\n\t\"tool.field display normal\":     \"显示\",\n\t\"tool.field diplay hide\":        \"隐藏\",\n\t\"tool.field diplay edit hide\":   \"编辑隐藏\",\n\t\"tool.field diplay create hide\": \"新建隐藏\",\n\n\t\"tool.generate table model success\": \"生成成功\",\n\t\"tool.generate table model fail\":    \"生成失败\",\n\n\t\"generator.query\":                 \"查询\",\n\t\"generator.show edit form page\":   \"编辑页显示\",\n\t\"generator.show create form page\": \"新建记录页显示\",\n\t\"generator.edit\":                  \"编辑\",\n\t\"generator.create\":                \"新建\",\n\t\"generator.delete\":                \"删除\",\n\t\"generator.export\":                \"导出\",\n\n\t\"plugin.plugin\":                         \"插件\",\n\t\"plugin.plugin detail\":                  \"插件详情\",\n\t\"plugin.introduction\":                   \"介绍\",\n\t\"plugin.website\":                        \"网站\",\n\t\"plugin.version\":                        \"版本\",\n\t\"plugin.created at\":                     \"创建日期\",\n\t\"plugin.updated at\":                     \"更新日期\",\n\t\"plugin.provided by %s\":                 \"由 %s 提供\",\n\t\"plugin.upgrade\":                        \"升级\",\n\t\"plugin.install\":                        \"安装\",\n\t\"plugin.info\":                           \"详细信息\",\n\t\"plugin.download\":                       \"下载\",\n\t\"plugin.buy\":                            \"购买\",\n\t\"plugin.downloading\":                    \"下载中\",\n\t\"plugin.login\":                          \"登录\",\n\t\"plugin.login to goadmin member system\": \"登录到GoAdmin会员系统\",\n\t\"plugin.account\":                        \"账户名\",\n\t\"plugin.password\":                       \"密码\",\n\t\"plugin.learn more\":                     \"了解更多\",\n\n\t\"plugin.no account? click %s here %s to register.\":    \"没有账号？点击%s这里%s注册。\",\n\t\"plugin.download fail, wrong name\":                    \"下载失败，错误的参数\",\n\t\"plugin.change to debug mode first\":                   \"先切换到debug模式\",\n\t\"plugin.download fail, plugin not exist\":              \"下载失败，插件不存在\",\n\t\"plugin.download fail\":                                \"下载失败\",\n\t\"plugin.golang develop environment does not exist\":    \"golang开发环境不存在\",\n\t\"plugin.download success, restart to install\":         \"下载成功，重启程序进行安装\",\n\t\"plugin.restart to install\":                           \"重启程序进行安装\",\n\t\"plugin.can not connect to the goadmin remote server\": \"连接到GoAdmin远程服务器失败，请检查您的网络连接。\",\n\n\t\"admin.basic admin\": \"基础Admin\",\n\t\"admin.a built-in plugins of goadmin which help you to build a crud manager platform quickly.\": \"一个内置GoAdmin插件，帮助您快速搭建curd简易管理后台。\",\n\t\"admin.official\": \"GoAdmin官方\",\n}\n"
  },
  {
    "path": "modules/language/en.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport \"strings\"\n\nvar en = LangSet{\n\t\"managers\":         \"Managers\",\n\t\"name\":             \"Name\",\n\t\"nickname\":         \"Nickname\",\n\t\"role\":             \"Role\",\n\t\"createdat\":        \"createdAt\",\n\t\"updatedat\":        \"updatedAt\",\n\t\"path\":             \"path\",\n\t\"new\":              \"New\",\n\t\"filter\":           \"Filter\",\n\t\"action\":           \"Action\",\n\t\"toggle dropdown\":  \"Toggle Dropdown\",\n\t\"delete\":           \"Delete\",\n\t\"refresh\":          \"Refresh\",\n\t\"expand\":           \"Expand\",\n\t\"collapse\":         \"Collapse\",\n\t\"back\":             \"Back\",\n\t\"reset\":            \"Reset\",\n\t\"save\":             \"Save\",\n\t\"edit\":             \"Edit\",\n\t\"operation\":        \"Operation\",\n\t\"method\":           \"Method\",\n\t\"input\":            \"input\",\n\t\"online\":           \"Online\",\n\t\"setting\":          \"Setting\",\n\t\"sign out\":         \"Sign out\",\n\t\"all\":              \"All\",\n\t\"confirm password\": \"Confirm Password\",\n\t\"search\":           \"Search\",\n\t\"remove\":           \"Remove\",\n\n\t\"goadmin is now running. \\nrunning in \\\"debug\\\" mode. switch to \\\"release\\\" mode in production.\\n\\n\": \"GoAdmin is now running. \\nRunning in \\\"debug\\\" mode. Switch to \\\"release\\\" mode in production.\\n\\n\",\n\n\t\"wrong goadmin version, theme %s required goadmin version are %s\":    \"wrong GoAdmin version, theme %s required GoAdmin version are %s\",\n\t\"wrong theme version, goadmin %s required version of theme %s is %s\": \"wrong Theme version, GoAdmin %s required version of theme %s is %s\",\n\n\t\"adapter is nil, import the default adapter or use addadapter method add the adapter\": \"adapter is nil, import the default adapter or use AddAdapter method add the adapter\",\n\n\t\"are you sure to delete\":               \"Are you sure to delete\",\n\t\"yes\":                                  \"yes\",\n\t\"got it\":                               \"got it\",\n\t\"cancel\":                               \"cancel\",\n\t\"refresh succeeded\":                    \"Refresh succeeded\",\n\t\"reload succeeded\":                     \"Reload succeeded\",\n\t\"all method if empty\":                  \"All method if empty\",\n\t\"password does not match\":              \"Password does not match\",\n\t\"should be unique\":                     \"Should be unique\",\n\t\"slug exists\":                          \"Slug exists\",\n\t\"no corresponding options?\":            \"No corresponding options?\",\n\t\"create here.\":                         \"Create here.\",\n\t\"use for login\":                        \"Use for login\",\n\t\"use to display\":                       \"Use to display\",\n\t\"a path a line, without global prefix\": \"A path a line\",\n\t\"slug or http_path or name should not be empty\": \"slug or http_path or name should not be empty\",\n\t\"no roles\":          \"no roles\",\n\t\"fixed the sidebar\": \"Fixed the sidebar\",\n\t\"enter fullscreen\":  \"Enter fullscreen\",\n\t\"exit fullscreen\":   \"Exit fullscreen\",\n\n\t\"permission manage\": \"Permission Manage\",\n\t\"menus manage\":      \"Menus Manage\",\n\t\"roles manage\":      \"Roles manage\",\n\t\"operation log\":     \"Operation log\",\n\n\t\"continue editing\":  \"Continue editing\",\n\t\"continue creating\": \"Continue creating\",\n\n\t\"browse\":     \"Browse\",\n\t\"avatar\":     \"Avatar\",\n\t\"password\":   \"Password\",\n\t\"username\":   \"Username\",\n\t\"slug\":       \"Slug\",\n\t\"permission\": \"Permission\",\n\t\"userid\":     \"UserID\",\n\t\"content\":    \"Content\",\n\t\"parent\":     \"Parent\",\n\t\"icon\":       \"Icon\",\n\t\"uri\":        \"Uri\",\n\n\t\"detail\": \"Detail\",\n\n\t\"admin\":     \"Admin\",\n\t\"users\":     \"Users\",\n\t\"roles\":     \"Roles\",\n\t\"menu\":      \"Menu\",\n\t\"dashboard\": \"Dashboard\",\n\t\"home\":      \"Home\",\n\n\t\"initialize configuration\":        \"Initialize configuration\",\n\t\"initialize navigation buttons\":   \"Initialize navigation buttons\",\n\t\"initialize plugins\":              \"Initialize plugins\",\n\t\"initialize database connections\": \"Initialize database connections\",\n\t\"initialize success\":              \"Initialize success🍺🍺\",\n\n\t\"not found\":      \"Not found\",\n\t\"internal error\": \"Internal error\",\n\t\"unauthorized\":   \"Unauthorized\",\n\t\"plugin setting\": \"Plugin Setting\",\n\n\t\"plugins\":          \"Plugins\",\n\t\"plugin store\":     \"Plugin Store\",\n\t\"get more plugins\": \"Get more plugins\",\n\t\"uninstalled\":      \"Uninstalled\",\n\n\t\"second\":  \"second\",\n\t\"seconds\": \"seconds\",\n\t\"minute\":  \"minute\",\n\t\"minutes\": \"minutes\",\n\t\"hour\":    \"hour\",\n\t\"hours\":   \"hours\",\n\t\"day\":     \"day\",\n\t\"days\":    \"days\",\n\t\"week\":    \"week\",\n\t\"weeks\":   \"weeks\",\n\t\"month\":   \"month\",\n\t\"months\":  \"months\",\n\t\"year\":    \"year\",\n\t\"years\":   \"years\",\n\n\t\"config.domain\":          \"Website Domain\",\n\t\"config.language\":        \"Website Language\",\n\t\"config.url prefix\":      \"URL Prefix\",\n\t\"config.theme\":           \"Theme\",\n\t\"config.title\":           \"Title\",\n\t\"config.index url\":       \"Home URL\",\n\t\"config.login url\":       \"Login URL\",\n\t\"config.env\":             \"Env\",\n\t\"config.color scheme\":    \"Color Scheme\",\n\t\"config.cdn url\":         \"CDN Asset URL\",\n\t\"config.login title\":     \"Login Title\",\n\t\"config.auth user table\": \"Auth User Table\",\n\t\"config.extra\":           \"Extra Configuration\",\n\t\"config.store\":           \"File Store Setting\",\n\t\"config.databases\":       \"Database Setting\",\n\n\t\"config.general\":      \"General\",\n\t\"config.log\":          \"Log\",\n\t\"config.site setting\": \"Site Settings\",\n\t\"config.custom\":       \"Customize\",\n\t\"config.debug\":        \"Debug Mode\",\n\t\"config.site off\":     \"Site Offline\",\n\t\"config.true\":         \"On\",\n\t\"config.false\":        \"Off\",\n\n\t\"config.logo\":                        \"Logo\",\n\t\"config.mini logo\":                   \"Mini Logo\",\n\t\"config.bootstrap file path\":         \"Bootstrap File Path\",\n\t\"config.go mod file path\":            \"go.mod File Path\",\n\t\"config.session life time\":           \"Session Life Time\",\n\t\"config.custom head html\":            \"Head HTML\",\n\t\"config.custom foot html\":            \"Foot HTML\",\n\t\"config.custom 404 html\":             \"404 Page\",\n\t\"config.custom 403 html\":             \"403 Page\",\n\t\"config.custom 500 html\":             \"500 Page\",\n\t\"config.hide config center entrance\": \"Hide Config Button\",\n\t\"config.hide app info entrance\":      \"Hide App Info Button\",\n\t\"config.hide tool entrance\":          \"Hide Tool Button\",\n\t\"config.footer info\":                 \"Footer Info\",\n\t\"config.login logo\":                  \"Login Logo\",\n\t\"config.no limit login ip\":           \"No Limit Login Multi IPs\",\n\t\"config.operation log off\":           \"Operation Log Off\",\n\t\"config.allow delete operation log\":  \"Allow Delete Operation Log\",\n\t\"config.animation type\":              \"Animation Type\",\n\t\"config.animation duration\":          \"Animation Duration(s)\",\n\t\"config.animation delay\":             \"Animation Delay(s)\",\n\t\"config.file upload engine\":          \"File Upload Engine\",\n\n\t\"config.logger rotate\":             \"Log Rotate Settings\",\n\t\"config.logger rotate max size\":    \"Max Size（m）\",\n\t\"config.logger rotate max backups\": \"Max Buckups\",\n\t\"config.logger rotate max age\":     \"Max Age（day）\",\n\t\"config.logger rotate compress\":    \"Compress\",\n\n\t\"config.info log path\":         \"Info Log File Path\",\n\t\"config.error log path\":        \"Error Log File Path\",\n\t\"config.access log path\":       \"Access Log File Path\",\n\t\"config.info log off\":          \"Info Log Off\",\n\t\"config.error log off\":         \"Error Log Off\",\n\t\"config.access log off\":        \"Access Log Off\",\n\t\"config.access assets log off\": \"Access Assets Log Off\",\n\t\"config.sql log on\":            \"Open SQL Log\",\n\t\"config.log level\":             \"Level\",\n\n\t\"config.logger rotate encoder\":                \"Log Encoder Settings\",\n\t\"config.logger rotate encoder time key\":       \"Time Key\",\n\t\"config.logger rotate encoder level key\":      \"Level Key\",\n\t\"config.logger rotate encoder name key\":       \"Name Key\",\n\t\"config.logger rotate encoder caller key\":     \"Caller Key\",\n\t\"config.logger rotate encoder message key\":    \"Message Key\",\n\t\"config.logger rotate encoder stacktrace key\": \"Stacktrace Key\",\n\t\"config.logger rotate encoder level\":          \"Level Encoder\",\n\t\"config.logger rotate encoder time\":           \"Time Encoder\",\n\t\"config.logger rotate encoder duration\":       \"Duration Encoder\",\n\t\"config.logger rotate encoder caller\":         \"Caller Encoder\",\n\t\"config.logger rotate encoder encoding\":       \"Output Format\",\n\n\t\"config.capital\":        \"Capital\",\n\t\"config.capitalcolor\":   \"Capital with color\",\n\t\"config.lowercase\":      \"Lowercase\",\n\t\"config.lowercasecolor\": \"Lowercase with color\",\n\n\t\"config.seconds\":     \"Seconds\",\n\t\"config.nanosecond\":  \"Nanosecond\",\n\t\"config.microsecond\": \"Microsecond\",\n\t\"config.millisecond\": \"Millisecond\",\n\n\t\"config.full path\":  \"Full path\",\n\t\"config.short path\": \"Short path\",\n\n\t\"config.do not modify when you have not set up all assets\": \"Do not modify when you have not set up all assets\",\n\t\"config.it will work when theme is adminlte\":               \"It will work when theme is adminlte\",\n\n\t\"config.language.\" + CN:                  \"Chinese\",\n\t\"config.language.\" + EN:                  \"English\",\n\t\"config.language.\" + JP:                  \"Japanese\",\n\t\"config.language.\" + strings.ToLower(TC): \"Traditional Chinese\",\n\t\"config.language.\" + PTBR:                \"Brazilian Portuguese\",\n\t\"config.language.\" + RU:                  \"Русский\",\n\n\t\"config.modify site config\":         \"Site Configuration Modification\",\n\t\"config.modify site config success\": \"modified success\",\n\t\"config.modify site config fail\":    \"modified failed\",\n\n\t\"system.system info\":     \"System And Application Info\",\n\t\"system.application\":     \"Application Info\",\n\t\"system.application run\": \"Applications Running Info\",\n\t\"system.system\":          \"System Info\",\n\n\t\"system.process_id\":                           \"Process ID\",\n\t\"system.golang_version\":                       \"Golang Version\",\n\t\"system.server_uptime\":                        \"Server Uptime\",\n\t\"system.current_goroutine\":                    \"Current Goroutines\",\n\t\"system.current_memory_usage\":                 \"Current Memory Usage\",\n\t\"system.total_memory_allocated\":               \"Total Memory Allocated\",\n\t\"system.memory_obtained\":                      \"Memory Obtained\",\n\t\"system.pointer_lookup_times\":                 \"Pointer Lookup Times\",\n\t\"system.memory_allocate_times\":                \"Memory Allocate Times\",\n\t\"system.memory_free_times\":                    \"Memory Free Times\",\n\t\"system.current_heap_usage\":                   \"Current Heap Usage\",\n\t\"system.heap_memory_obtained\":                 \"Heap Memory Obtained\",\n\t\"system.heap_memory_idle\":                     \"Heap Memory Idle\",\n\t\"system.heap_memory_in_use\":                   \"Heap Memory In Use\",\n\t\"system.heap_memory_released\":                 \"Heap Memory Released\",\n\t\"system.heap_objects\":                         \"Heap Objects\",\n\t\"system.bootstrap_stack_usage\":                \"Bootstrap Stack Usage\",\n\t\"system.stack_memory_obtained\":                \"Stack Memory Obtained\",\n\t\"system.mspan_structures_usage\":               \"MSpan Structures Usage\",\n\t\"system.mspan_structures_obtained\":            \"MSpan Structures Obtained\",\n\t\"system.mcache_structures_usage\":              \"MCache Structures Usage\",\n\t\"system.mcache_structures_obtained\":           \"MCache Structures Obtained\",\n\t\"system.profiling_bucket_hash_table_obtained\": \"Profiling Bucket Hash Table Obtained\",\n\t\"system.gc_metadata_obtained\":                 \"GC Metadata Obtained\",\n\t\"system.other_system_allocation_obtained\":     \"Other System Allocation Obtained\",\n\t\"system.next_gc_recycle\":                      \"Next GC Recycle\",\n\t\"system.last_gc_time\":                         \"Since Last GC Time\",\n\t\"system.total_gc_time\":                        \"Total GC Pause\",\n\t\"system.total_gc_pause\":                       \"Total GC Pause\",\n\t\"system.last_gc_pause\":                        \"Last GC Pause\",\n\t\"system.gc_times\":                             \"GC Times\",\n\n\t\"system.cpu_logical_core\": \"CPU Logical Core\",\n\t\"system.cpu_core\":         \"CPU Physical Core\",\n\t\"system.os_platform\":      \"OS Platform\",\n\t\"system.os_family\":        \"OS Family\",\n\t\"system.os_version\":       \"OS Version\",\n\t\"system.load1\":            \"Load1\",\n\t\"system.load5\":            \"Load5\",\n\t\"system.load15\":           \"Load15\",\n\t\"system.mem_total\":        \"Total Memory\",\n\t\"system.mem_available\":    \"Available Memory\",\n\t\"system.mem_used\":         \"Used Memory\",\n\n\t\"system.app_name\":         \"App Name\",\n\t\"system.go_admin_version\": \"App Version\",\n\t\"system.theme_name\":       \"Theme\",\n\t\"system.theme_version\":    \"Theme Version\",\n\n\t\"tool.tool\":                   \"Tool\",\n\t\"tool.table\":                  \"Table\",\n\t\"tool.connection\":             \"Connection\",\n\t\"tool.package\":                \"Package\",\n\t\"tool.output\":                 \"Output Path\",\n\t\"tool.output path is empty\":   \"Output path is empty\",\n\t\"tool.field\":                  \"Field\",\n\t\"tool.title\":                  \"Title\",\n\t\"tool.field name\":             \"Name\",\n\t\"tool.db type\":                \"Database Type\",\n\t\"tool.form type\":              \"Form Type\",\n\t\"tool.generate table model\":   \"Generate Table Model\",\n\t\"tool.primarykey\":             \"Primary Key\",\n\t\"tool.field filterable\":       \"Filterable\",\n\t\"tool.field sortable\":         \"Sortable\",\n\t\"tool.yes\":                    \"Yes\",\n\t\"tool.no\":                     \"No\",\n\t\"tool.hide\":                   \"Hide\",\n\t\"tool.show\":                   \"Show\",\n\t\"tool.generate success\":       \"Generate Success\",\n\t\"tool.hide filter area\":       \"Hide Filter Area\",\n\t\"tool.use absolute path\":      \"Use absolute path\",\n\t\"tool.display\":                \"Display\",\n\t\"tool.basic info\":             \"Basic\",\n\t\"tool.table info\":             \"Table\",\n\t\"tool.form info\":              \"Form\",\n\t\"tool.field editable\":         \"Editable\",\n\t\"tool.info field editable\":    \"Editable\",\n\t\"tool.extra import package\":   \"Import Package\",\n\t\"tool.field can add\":          \"Can Add\",\n\t\"tool.field default\":          \"Default\",\n\t\"tool.filter area\":            \"Filter Area\",\n\t\"tool.new button\":             \"New Button\",\n\t\"tool.export button\":          \"Export Button\",\n\t\"tool.edit button\":            \"Edit Button\",\n\t\"tool.delete button\":          \"Delete Button\",\n\t\"tool.detail button\":          \"Detail Button\",\n\t\"tool.filter button\":          \"Filter Button\",\n\t\"tool.row selector\":           \"Row Selector\",\n\t\"tool.pagination\":             \"Pagination\",\n\t\"tool.query info\":             \"Query Info\",\n\t\"tool.filter form layout\":     \"Filter Form Layout\",\n\t\"tool.continue edit checkbox\": \"Continue Edit Checkbox\",\n\t\"tool.continue new checkbox\":  \"Continue New Checkbox\",\n\t\"tool.reset button\":           \"Reset Button\",\n\t\"tool.back button\":            \"Back Button\",\n\t\"tool.generate\":               \"Generate\",\n\t\"tool.generated tables\":       \"Generated Tables\",\n\t\"tool.description\":            \"Description\",\n\t\"tool.label\":                  \"Label\",\n\t\"tool.image\":                  \"Image\",\n\t\"tool.bool\":                   \"Bool\",\n\t\"tool.link\":                   \"Link\",\n\t\"tool.fileSize\":               \"File Size\",\n\t\"tool.date\":                   \"Date\",\n\t\"tool.icon\":                   \"Icon\",\n\t\"tool.dot\":                    \"Dot\",\n\t\"tool.progressBar\":            \"ProgressBar\",\n\t\"tool.loading\":                \"Loading\",\n\t\"tool.downLoadable\":           \"DownLoadable\",\n\t\"tool.copyable\":               \"Copyable\",\n\t\"tool.carousel\":               \"Carousel\",\n\t\"tool.qrcode\":                 \"Qrcode\",\n\t\"tool.field hide\":             \"Hide\",\n\t\"tool.field display\":          \"Display\",\n\t\"tool.table permission\":       \"Generate Permissions\",\n\t\"tool.extra code\":             \"Extra Code\",\n\n\t\"tool.field display normal\":     \"Normal\",\n\t\"tool.field diplay hide\":        \"Hide\",\n\t\"tool.field diplay edit hide\":   \"Edit Hide\",\n\t\"tool.field diplay create hide\": \"Create Hide\",\n\n\t\"tool.generate table model success\": \"generate success\",\n\t\"tool.generate table model fail\":    \"generate fail\",\n\n\t\"tool.detail display\":             \"Display\",\n\t\"tool.detail info\":                \"Detail Info\",\n\t\"tool.follow list page\":           \"Follow List Page\",\n\t\"tool.inherit from list page\":     \"Inherit From List Page\",\n\t\"tool.independent from list page\": \"Independent From List Page\",\n\n\t\"generator.query\":                 \"Query\",\n\t\"generator.show edit form page\":   \"Show Edit Form Page\",\n\t\"generator.show create form page\": \"Show Create Form Page\",\n\t\"generator.edit\":                  \"Edit\",\n\t\"generator.create\":                \"Create\",\n\t\"generator.delete\":                \"Delete\",\n\t\"generator.export\":                \"Export\",\n\n\t\"plugin.plugin\":                         \"Plugin\",\n\t\"plugin.plugin detail\":                  \"Plugin Detail\",\n\t\"plugin.introduction\":                   \"Introduction\",\n\t\"plugin.website\":                        \"Website\",\n\t\"plugin.version\":                        \"Version\",\n\t\"plugin.created at\":                     \"Created At\",\n\t\"plugin.updated at\":                     \"Updated At\",\n\t\"plugin.provided by %s\":                 \"Provided by %s\",\n\t\"plugin.upgrade\":                        \"Upgrade\",\n\t\"plugin.install\":                        \"Install\",\n\t\"plugin.download\":                       \"Download\",\n\t\"plugin.buy\":                            \"Buy\",\n\t\"plugin.downloading\":                    \"Downloading\",\n\t\"plugin.info\":                           \"Detail\",\n\t\"plugin.login\":                          \"Login\",\n\t\"plugin.login to goadmin member system\": \"Login to GoAdmin member system\",\n\t\"plugin.account\":                        \"Account\",\n\t\"plugin.password\":                       \"Password\",\n\t\"plugin.learn more\":                     \"Learn more\",\n\n\t\"plugin.no account? click %s here %s to register.\":    \"No account？Click %shere%s to register。\",\n\t\"plugin.download fail, wrong name\":                    \"Download fail, wrong name\",\n\t\"plugin.change to debug mode first\":                   \"Change to debug mode first\",\n\t\"plugin.download fail, plugin not exist\":              \"Download fail, plugin not exist\",\n\t\"plugin.download fail\":                                \"Download fail\",\n\t\"plugin.golang develop environment does not exist\":    \"Golang develop environment does not exist\",\n\t\"plugin.download success, restart to install\":         \"Download success, restart to install\",\n\t\"plugin.restart to install\":                           \"Restart to install\",\n\t\"plugin.can not connect to the goadmin remote server\": \"Failed to connect the GoAdmin remote server, check your network connection.\",\n\n\t\"admin.basic admin\": \"Basic Admin\",\n\t\"admin.a built-in plugins of goadmin which help you to build a crud manager platform quickly.\": \"A built-in plugins of GoAdmin which help you to build a crud manager platform quickly.\",\n\t\"admin.official\": \"Official\",\n\n\t\"current page\":                           \"Current Page\",\n\t\"login\":                                  \"Login\",\n\t\"username and password can not be empty\": \"Username and password can not be empty\",\n\t\"showing <b>%s</b> to <b>%s</b> of <b>%s</b> entries\": \"showing <b>%s</b> to <b>%s</b> of <b>%s</b> entries\",\n\t\"code generate tool\":                  \"Code Generator\",\n\t\"close\":                               \"close\",\n\t\"fail\":                                \"fail\",\n\t\"wrong captcha\":                       \"incorrect verification code\",\n\t\"config.must bigger than 900 seconds\": \"Must be greater than 900 seconds\",\n\t\"permission denied\":                   \"permission denied\",\n\t\"config.local\":                        \"local env\",\n\t\"view\":                                \"view\",\n\t\"site setting\":                        \"Site Setting\",\n\t\"del\":                                 \"delete\",\n\t\"error\":                               \"error\",\n\t\"operation not allow\":                 \"operation not allowed\",\n\t\"config.prod\":                         \"production env\",\n\t\"edit fail\":                           \"edit failed\",\n\t\"login info\":                          \"Login Info\",\n\t\"config.hide plugin entrance\":         \"Hide plugin page entry\",\n\t\"submit\":                              \"Submit\",\n\t\"managers manage\":                     \"Managers Manage\",\n\t\"menus\":                               \"Menu\",\n\t\"delete succeed\":                      \"delete succeed\",\n\t\"query time\":                          \"query time\",\n\t\"login overdue, please login again\":   \"Login information expired. Please log in again\",\n\t\"create fail\":                         \"create failed\",\n\t\"tool.code generate tool\":             \"Code Generator\",\n\t\"user\":                                \"user\",\n\t\"modify success\":                      \"modify success\",\n\t\"menu name\":                           \"menu name\",\n\t\"login fail\":                          \"login failed\",\n\t\"export\":                              \"export\",\n\t\"no permission\":                       \"no permission\",\n\t\"confirm\":                             \"confirm\",\n\t\"delete fail\":                         \"deletion failed\",\n\t\"success\":                             \"success\",\n\t\"system.site info\":                    \"Site Info\",\n\t\"site info\":                           \"Site Info\",\n\t\"more\":                                \"More\",\n\t\"config.test\":                         \"test env\",\n}\n"
  },
  {
    "path": "modules/language/jp.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport \"strings\"\n\nvar jp = LangSet{\n\t\"managers\":  \"管理者\",\n\t\"name\":      \"ユーザー名\",\n\t\"nickname\":  \"ニックネーム\",\n\t\"role\":      \"ロール\",\n\t\"createdat\": \"作成日時\",\n\t\"updatedat\": \"更新日時\",\n\t\"path\":      \"パス\",\n\t\"submit\":    \"提出\",\n\t\"filter\":    \"フィルター\",\n\n\t\"new\":             \"新規\",\n\t\"export\":          \"出力\",\n\t\"action\":          \"操作\",\n\t\"toggle dropdown\": \"プルダウン\",\n\t\"delete\":          \"削除\",\n\t\"refresh\":         \"更新\",\n\t\"back\":            \"戻る\",\n\t\"reset\":           \"リセット\",\n\t\"save\":            \"保存\",\n\t\"edit\":            \"編集\",\n\t\"expand\":          \"展開\",\n\t\"collapse\":        \"折り畳み\",\n\t\"online\":          \"オンライン\",\n\t\"setting\":         \"設定\",\n\t\"sign out\":        \"ログアウト\",\n\t\"home\":            \"ホーム\",\n\t\"all\":             \"全て\",\n\t\"more\":            \"更に\",\n\t\"remove\":          \"削除する\",\n\n\t\"permission manage\": \"権限管理\",\n\t\"menus manage\":      \"メニュー管理\",\n\t\"roles manage\":      \"ロール管理\",\n\t\"operation log\":     \"操作履歴\",\n\t\"method\":            \"メソッド\",\n\t\"input\":             \"入力\",\n\t\"operation\":         \"操作\",\n\t\"menu name\":         \"表示名\",\n\t\"reload succeeded\":  \"再読み込み完了\",\n\t\"search\":            \"検索\",\n\n\t\"permission denied\": \"権限がありません\",\n\t\"error\":             \"エラー\",\n\t\"current page\":      \"現在のページ\",\n\t\"query time\":        \"クエリ時間\",\n\n\t\"are you sure to delete\": \"本当に削除しますか\",\n\t\"yes\":                    \"はい\",\n\t\"got it\":                 \"はい\",\n\t\"cancel\":                 \"キャンセル\",\n\t\"refresh succeeded\":      \"更新に成功しました\",\n\t\"edit fail\":              \"編集に失敗しました\",\n\t\"create fail\":            \"作成に失敗しました\",\n\t\"confirm password\":       \"パスワード(確認)\",\n\t\"all method if empty\":    \"空の場合は全メソッド\",\n\n\t\"detail\": \"詳細\",\n\n\t\"avatar\":     \"アバター\",\n\t\"password\":   \"パスワード\",\n\t\"username\":   \"ユーザー名\",\n\t\"slug\":       \"スラッグ\",\n\t\"permission\": \"権限\",\n\t\"userid\":     \"ユーザーID\",\n\t\"content\":    \"内容\",\n\t\"parent\":     \"親メニュー\",\n\t\"icon\":       \"アイコン\",\n\t\"uri\":        \"URL\",\n\n\t\"login\":      \"ログイン\",\n\t\"login fail\": \"ログイン失敗\",\n\n\t\"admin\":     \"運営管理\",\n\t\"users\":     \"ユーザー\",\n\t\"roles\":     \"ロール\",\n\t\"menu\":      \"メニュー\",\n\t\"dashboard\": \"ダッシュボード\",\n\n\t\"goadmin is now running. \\nrunning in \\\"debug\\\" mode. switch to \\\"release\\\" mode in production.\\n\\n\": \"GoAdminが現在稼働中です。\\n\\\"デバッグ\\\"モードで実行中です。本番環境では\\\"リリース\\\"モードに切り替えてください。\\n\\n\",\n\n\t\"wrong goadmin version, theme %s required goadmin version are %s\":    \"GoAdminバージョンが間違っています、テーマ%sの必要なGoAdminバージョンは%sです。\",\n\t\"wrong theme version, goadmin %s required version of theme %s is %s\": \"テーマのバージョンが間違っています、GoAdmin%sの必要なテーマ%sのバージョンは%sです。\",\n\n\t\"adapter is nil, import the default adapter or use addadapter method add the adapter\": \"アダプターがnilです。デフォルトのアダプターをインポートするか、AddAdapterメソッドを使用してアダプターを追加してください。\",\n\n\t\"username and password can not be empty\":        \"アカウントまたパスワードが正しく入力されていることを確認してください\",\n\t\"operation not allow\":                           \"この操作を実行するアクセス許可が必要です\",\n\t\"password does not match\":                       \"パスワードが正しくありません\",\n\t\"should be unique\":                              \"重複しないことを確認してください\",\n\t\"slug exists\":                                   \"スラッグが既に存在していないことを確認してください\",\n\t\"no corresponding options?\":                     \"対応できるオプションがありません\",\n\t\"create here.\":                                  \"ここに新規作成\",\n\t\"use for login\":                                 \"ログインに使う\",\n\t\"use to display\":                                \"表示に使う\",\n\t\"a path a line, without global prefix\":          \"パスを１行ずつ入力してください\",\n\t\"slug or http_path or name should not be empty\": \"スラッグ、http_pathまたユーザー名が正しく入力されていることを確認してください\",\n\t\"no roles\":                                      \"ロールなし\",\n\n\t\"initialize configuration\":        \"設定の初期化\",\n\t\"initialize navigation buttons\":   \"ナビゲーションボタンの初期化\",\n\t\"initialize plugins\":              \"プラグインの初期化\",\n\t\"initialize database connections\": \"データベース接続の初期化\",\n\t\"initialize success\":              \"初期化成功🍺🍺 \",\n\n\t\"not found\":      \"見つかりません\",\n\t\"internal error\": \"内部エラー\",\n\t\"unauthorized\":   \"権限がありません\",\n\n\t\"plugins\":          \"プラグイン\",\n\t\"plugin store\":     \"プラグインストア\",\n\t\"get more plugins\": \"もっとプラグインを取得する\",\n\t\"uninstalled\":      \"アンインストールされました\",\n\t\"plugin setting\":   \"プラグイン設定\",\n\n\t\"second\":  \"秒\",\n\t\"seconds\": \"秒\",\n\t\"minute\":  \"分\",\n\t\"minutes\": \"分\",\n\t\"hour\":    \"時間\",\n\t\"hours\":   \"時間\",\n\t\"day\":     \"日\",\n\t\"days\":    \"日\",\n\t\"week\":    \"週間\",\n\t\"weeks\":   \"週間\",\n\t\"month\":   \"月\",\n\t\"months\":  \"月\",\n\t\"year\":    \"年\",\n\t\"years\":   \"年\",\n\n\t\"config.domain\":          \"ウェブサイトのドメイン\",\n\t\"config.language\":        \"ウェブサイトの言語\",\n\t\"config.url prefix\":      \"URLプレフィックス\",\n\t\"config.theme\":           \"テーマ\",\n\t\"config.title\":           \"タイトル\",\n\t\"config.index url\":       \"ホームURL\",\n\t\"config.login url\":       \"ログインURL\",\n\t\"config.env\":             \"環境\",\n\t\"config.color scheme\":    \"カラースキーム\",\n\t\"config.cdn url\":         \"CDNアセットURL\",\n\t\"config.login title\":     \"ログインタイトル\",\n\t\"config.auth user table\": \"認証ユーザーテーブル\",\n\t\"config.extra\":           \"追加の設定\",\n\t\"config.store\":           \"ファイルストアの設定\",\n\t\"config.databases\":       \"データベースの設定\",\n\n\t\"config.general\":      \"一般\",\n\t\"config.log\":          \"ログ\",\n\t\"config.site setting\": \"サイト設定\",\n\t\"config.custom\":       \"カスタマイズ\",\n\t\"config.debug\":        \"デバッグモード\",\n\t\"config.site off\":     \"サイトオフライン\",\n\t\"config.true\":         \"オン\",\n\t\"config.false\":        \"オフ\",\n\n\t\"config.logo\":                        \"ロゴ\",\n\t\"config.mini logo\":                   \"ミニロゴ\",\n\t\"config.bootstrap file path\":         \"Bootstrapファイルのパス\",\n\t\"config.go mod file path\":            \"go.modファイルのパス\",\n\t\"config.session life time\":           \"セッションの有効期間\",\n\t\"config.custom head html\":            \"ヘッドHTML\",\n\t\"config.custom foot html\":            \"フッターHTML\",\n\t\"config.custom 404 html\":             \"404ページ\",\n\t\"config.custom 403 html\":             \"403ページ\",\n\t\"config.custom 500 html\":             \"500ページ\",\n\t\"config.hide config center entrance\": \"設定ボタンを非表示にする\",\n\t\"config.hide app info entrance\":      \"アプリ情報ボタンを非表示にする\",\n\t\"config.hide tool entrance\":          \"ツールボタンを非表示にする\",\n\t\"config.hide plugin entrance\":        \"プラグインリストボタンを非表示にする\",\n\t\"config.footer info\":                 \"フッター情報\",\n\t\"config.login logo\":                  \"ログインロゴ\",\n\t\"config.no limit login ip\":           \"制限なしの複数IPでのログイン\",\n\t\"config.operation log off\":           \"操作ログオフ\",\n\t\"config.allow delete operation log\":  \"操作ログの削除を許可する\",\n\t\"config.animation type\":              \"アニメーションタイプ\",\n\t\"config.animation duration\":          \"アニメーションの期間（秒）\",\n\t\"config.animation delay\":             \"アニメーションの遅延（秒）\",\n\t\"config.file upload engine\":          \"ファイルアップロードエンジン\",\n\n\t\"config.logger rotate\":             \"ログローテーション設定\",\n\t\"config.logger rotate max size\":    \"最大サイズ（MB）\",\n\t\"config.logger rotate max backups\": \"最大バックアップ数\",\n\t\"config.logger rotate max age\":     \"最大保存期間（日）\",\n\t\"config.logger rotate compress\":    \"圧縮\",\n\n\t\"config.info log path\":         \"情報ログファイルのパス\",\n\t\"config.error log path\":        \"エラーログファイルのパス\",\n\t\"config.access log path\":       \"アクセスログファイルのパス\",\n\t\"config.info log off\":          \"情報ログオフ\",\n\t\"config.error log off\":         \"エラーログオフ\",\n\t\"config.access log off\":        \"アクセスログオフ\",\n\t\"config.access assets log off\": \"アクセスアセットログオフ\",\n\t\"config.sql log on\":            \"SQLログを開く\",\n\t\"config.log level\":             \"レベル\",\n\n\t\"config.logger rotate encoder\":                \"ログエンコーダー設定\",\n\t\"config.logger rotate encoder time key\":       \"時間キー\",\n\t\"config.logger rotate encoder level key\":      \"レベルキー\",\n\t\"config.logger rotate encoder name key\":       \"名前キー\",\n\t\"config.logger rotate encoder caller key\":     \"呼び出し元キー\",\n\t\"config.logger rotate encoder message key\":    \"メッセージキー\",\n\t\"config.logger rotate encoder stacktrace key\": \"スタックトレースキー\",\n\t\"config.logger rotate encoder level\":          \"レベルエンコーダー\",\n\t\"config.logger rotate encoder time\":           \"時間エンコーダー\",\n\t\"config.logger rotate encoder duration\":       \"持続時間エンコーダー\",\n\t\"config.logger rotate encoder caller\":         \"呼び出し元エンコーダー\",\n\t\"config.logger rotate encoder encoding\":       \"出力形式\",\n\n\t\"config.capital\":        \"大文字\",\n\t\"config.capitalcolor\":   \"色付き大文字\",\n\t\"config.lowercase\":      \"小文字\",\n\t\"config.lowercasecolor\": \"色付き小文字\",\n\n\t\"config.seconds\":     \"秒\",\n\t\"config.nanosecond\":  \"ナノ秒\",\n\t\"config.microsecond\": \"マイクロ秒\",\n\t\"config.millisecond\": \"ミリ秒\",\n\n\t\"config.full path\":  \"完全なパス\",\n\t\"config.short path\": \"短縮パス\",\n\n\t\"config.do not modify when you have not set up all assets\": \"すべてのアセットが設定されていない場合は変更しないでください\",\n\t\"config.it will work when theme is adminlte\":               \"テーマがadminlteの場合に機能します\",\n\n\t\"config.language.\" + CN:                  \"中国語\",\n\t\"config.language.\" + EN:                  \"英語\",\n\t\"config.language.\" + JP:                  \"日本語\",\n\t\"config.language.\" + PTBR:                \"ブラジルポルトガル語\",\n\t\"config.language.\" + strings.ToLower(TC): \"繁体字中国語\",\n\t\"config.language.\" + RU:                  \"ロシア語\",\n\n\t\"config.modify site config\":         \"サイト設定の変更\",\n\t\"config.modify site config success\": \"変更成功\",\n\t\"config.modify site config fail\":    \"変更失敗\",\n\n\t\"system.system info\":     \"システムおよびアプリケーション情報\",\n\t\"system.application\":     \"アプリケーション情報\",\n\t\"system.application run\": \"実行中アプリケーション情報\",\n\t\"system.system\":          \"システム情報\",\n\n\t\"system.process_id\":                           \"プロセスID\",\n\t\"system.golang_version\":                       \"Golangバージョン\",\n\t\"system.server_uptime\":                        \"サーバーの稼働時間\",\n\t\"system.current_goroutine\":                    \"現在のゴールーチン数\",\n\t\"system.current_memory_usage\":                 \"現在のメモリ使用量\",\n\t\"system.total_memory_allocated\":               \"割り当てられた総メモリ量\",\n\t\"system.memory_obtained\":                      \"取得されたメモリ\",\n\t\"system.pointer_lookup_times\":                 \"ポインター検索回数\",\n\t\"system.memory_allocate_times\":                \"メモリ割り当て回数\",\n\t\"system.memory_free_times\":                    \"メモリ解放回数\",\n\t\"system.current_heap_usage\":                   \"現在のヒープ使用量\",\n\t\"system.heap_memory_obtained\":                 \"取得されたヒープメモリ\",\n\t\"system.heap_memory_idle\":                     \"アイドル状態のヒープメモリ\",\n\t\"system.heap_memory_in_use\":                   \"使用中のヒープメモリ\",\n\t\"system.heap_memory_released\":                 \"解放されたヒープメモリ\",\n\t\"system.heap_objects\":                         \"ヒープオブジェクト数\",\n\t\"system.bootstrap_stack_usage\":                \"ブートストラップスタック使用量\",\n\t\"system.stack_memory_obtained\":                \"取得されたスタックメモリ\",\n\t\"system.mspan_structures_usage\":               \"MSpan構造の使用量\",\n\t\"system.mspan_structures_obtained\":            \"取得されたMSpan構造\",\n\t\"system.mcache_structures_usage\":              \"MCache構造の使用量\",\n\t\"system.mcache_structures_obtained\":           \"取得されたMCache構造\",\n\t\"system.profiling_bucket_hash_table_obtained\": \"プロファイリングバケットハッシュテーブルの取得\",\n\t\"system.gc_metadata_obtained\":                 \"GCメタデータの取得\",\n\t\"system.other_system_allocation_obtained\":     \"その他のシステム割り当ての取得\",\n\t\"system.next_gc_recycle\":                      \"次のGC再利用\",\n\t\"system.last_gc_time\":                         \"最後のGCからの時間経過\",\n\t\"system.total_gc_time\":                        \"総GC時間\",\n\t\"system.total_gc_pause\":                       \"総GC停止時間\",\n\t\"system.last_gc_pause\":                        \"最後のGC停止時間\",\n\t\"system.gc_times\":                             \"GC回数\",\n\n\t\"system.cpu_logical_core\": \"CPU論理コア\",\n\t\"system.cpu_core\":         \"CPU物理コア\",\n\t\"system.os_platform\":      \"OSプラットフォーム\",\n\t\"system.os_family\":        \"OSファミリー\",\n\t\"system.os_version\":       \"OSバージョン\",\n\t\"system.load1\":            \"Load1\",\n\t\"system.load5\":            \"Load5\",\n\t\"system.load15\":           \"Load15\",\n\t\"system.mem_total\":        \"総メモリ量\",\n\t\"system.mem_available\":    \"利用可能なメモリ\",\n\t\"system.mem_used\":         \"使用中のメモリ\",\n\n\t\"system.app_name\":         \"アプリ名\",\n\t\"system.go_admin_version\": \"アプリバージョン\",\n\t\"system.theme_name\":       \"テーマ\",\n\t\"system.theme_version\":    \"テーマバージョン\",\n\n\t\"tool.tool\":                   \"ツール\",\n\t\"tool.table\":                  \"テーブル\",\n\t\"tool.connection\":             \"接続\",\n\t\"tool.package\":                \"パッケージ\",\n\t\"tool.output\":                 \"出力パス\",\n\t\"tool.output path is empty\":   \"出力パスが空です\",\n\t\"tool.field\":                  \"データベースフィールド\",\n\t\"tool.title\":                  \"タイトル\",\n\t\"tool.field name\":             \"名前\",\n\t\"tool.db type\":                \"データベースタイプ\",\n\t\"tool.form type\":              \"フォームタイプ\",\n\t\"tool.generate table model\":   \"テーブルモデルを生成する\",\n\t\"tool.primarykey\":             \"主キー\",\n\t\"tool.field filterable\":       \"フィルター可能\",\n\t\"tool.field sortable\":         \"ソート可能\",\n\t\"tool.yes\":                    \"はい\",\n\t\"tool.no\":                     \"いいえ\",\n\t\"tool.hide\":                   \"非表示\",\n\t\"tool.show\":                   \"表示\",\n\t\"tool.generate success\":       \"生成成功\",\n\t\"tool.hide filter area\":       \"フィルターエリアを非表示にする\",\n\t\"tool.use absolute path\":      \"絶対パスを使用する\",\n\t\"tool.display\":                \"表示\",\n\t\"tool.basic info\":             \"基本\",\n\t\"tool.table info\":             \"テーブル\",\n\t\"tool.form info\":              \"フォーム\",\n\t\"tool.field editable\":         \"編集可能\",\n\t\"tool.info field editable\":    \"編集非表示\",\n\t\"tool.field can add\":          \"追加可能\",\n\t\"tool.field default\":          \"デフォルト\",\n\t\"tool.filter area\":            \"フィルターエリア\",\n\t\"tool.new button\":             \"新規ボタン\",\n\t\"tool.extra import package\":   \"パッケージのインポート\",\n\t\"tool.export button\":          \"エクスポートボタン\",\n\t\"tool.edit button\":            \"編集ボタン\",\n\t\"tool.delete button\":          \"削除ボタン\",\n\t\"tool.detail button\":          \"詳細ボタン\",\n\t\"tool.filter button\":          \"フィルターボタン\",\n\t\"tool.row selector\":           \"行選択器\",\n\t\"tool.pagination\":             \"ページネーション\",\n\t\"tool.query info\":             \"クエリ情報\",\n\t\"tool.filter form layout\":     \"フィルターフォームレイアウト\",\n\t\"tool.continue edit checkbox\": \"編集の続行チェックボックス\",\n\t\"tool.continue new checkbox\":  \"新規作成の続行チェックボックス\",\n\t\"tool.reset button\":           \"リセットボタン\",\n\t\"tool.back button\":            \"戻るボタン\",\n\t\"tool.generate\":               \"生成する\",\n\t\"tool.generated tables\":       \"生成されたテーブル\",\n\t\"tool.description\":            \"説明\",\n\t\"tool.label\":                  \"ラベル\",\n\t\"tool.image\":                  \"画像\",\n\t\"tool.bool\":                   \"ブール\",\n\t\"tool.link\":                   \"リンク\",\n\t\"tool.fileSize\":               \"ファイルサイズ\",\n\t\"tool.date\":                   \"日付\",\n\t\"tool.icon\":                   \"アイコン\",\n\t\"tool.dot\":                    \"ドット\",\n\t\"tool.progressBar\":            \"プログレスバー\",\n\t\"tool.loading\":                \"ロード中\",\n\t\"tool.downLoadable\":           \"ダウンロード可能\",\n\t\"tool.copyable\":               \"コピー可能\",\n\t\"tool.carousel\":               \"カルーセル\",\n\t\"tool.qrcode\":                 \"QRコード\",\n\t\"tool.field hide\":             \"非表示\",\n\t\"tool.field display\":          \"表示\",\n\t\"tool.table permission\":       \"権限を生成する\",\n\t\"tool.extra code\":             \"追加コード\",\n\n\t\"tool.field display normal\":     \"通常\",\n\t\"tool.field diplay hide\":        \"非表示\",\n\t\"tool.field diplay edit hide\":   \"編集非表示\",\n\t\"tool.field diplay create hide\": \"作成非表示\",\n\n\t\"tool.detail display\":             \"表示\",\n\t\"tool.detail info\":                \"詳細情報\",\n\t\"tool.follow list page\":           \"リストページに従う\",\n\t\"tool.inherit from list page\":     \"リストページから継承\",\n\t\"tool.independent from list page\": \"リストページから独立\",\n\n\t\"tool.generate table model success\": \"生成成功\",\n\t\"tool.generate table model fail\":    \"生成失敗\",\n\n\t\"generator.query\":                 \"クエリ\",\n\t\"generator.show edit form page\":   \"編集フォームページを表示\",\n\t\"generator.show create form page\": \"作成フォームページを表示\",\n\t\"generator.edit\":                  \"編集\",\n\t\"generator.create\":                \"作成\",\n\t\"generator.delete\":                \"削除\",\n\t\"generator.export\":                \"エクスポート\",\n\n\t\"plugin.plugin\":                         \"プラグイン\",\n\t\"plugin.plugin detail\":                  \"プラグイン詳細\",\n\t\"plugin.introduction\":                   \"導入\",\n\t\"plugin.website\":                        \"ウェブサイト\",\n\t\"plugin.version\":                        \"バージョン\",\n\t\"plugin.created at\":                     \"作成日時\",\n\t\"plugin.updated at\":                     \"更新日時\",\n\t\"plugin.provided by %s\":                 \"%sに提供されます\",\n\t\"plugin.upgrade\":                        \"アップグレード\",\n\t\"plugin.install\":                        \"インストール\",\n\t\"plugin.info\":                           \"詳細\",\n\t\"plugin.download\":                       \"ダウンロード\",\n\t\"plugin.buy\":                            \"購入\",\n\t\"plugin.downloading\":                    \"ダウンロード中\",\n\t\"plugin.login\":                          \"ログイン\",\n\t\"plugin.login to goadmin member system\": \"GoAdminメンバーシステムにログインする\",\n\t\"plugin.account\":                        \"アカウント\",\n\t\"plugin.password\":                       \"パスワード\",\n\t\"plugin.learn more\":                     \"もっと学ぶ\",\n\n\t\"plugin.no account? click %s here %s to register.\":    \"アカウントがありませんか？登録するには%sここ%sをクリックしてください。\",\n\t\"plugin.download fail, wrong name\":                    \"ダウンロードに失敗しました、間違った名前です\",\n\t\"plugin.change to debug mode first\":                   \"まずデバッグモードに変更してください\",\n\t\"plugin.download fail, plugin not exist\":              \"ダウンロードに失敗しました、プラグインが存在しません\",\n\t\"plugin.download fail\":                                \"ダウンロードに失敗しました\",\n\t\"plugin.golang develop environment does not exist\":    \"Golangの開発環境が存在しません\",\n\t\"plugin.download success, restart to install\":         \"ダウンロードが成功しました、インストールのために再起動します\",\n\t\"plugin.restart to install\":                           \"インストールのために再起動します\",\n\t\"plugin.can not connect to the goadmin remote server\": \"GoAdminリモートサーバーに接続できませんでした、ネットワーク接続を確認してください。\",\n\n\t\"admin.basic admin\": \"基本管理者\",\n\t\"admin.a built-in plugins of goadmin which help you to build a crud manager platform quickly.\": \"GoAdminの組み込みプラグインで、CRUDマネージャープラットフォームを素早く構築できます。\",\n\t\"admin.official\": \"公式\",\n\n\t\"browse\":                              \"開く\",\n\t\"system.site info\":                    \"実行情報\",\n\t\"delete succeed\":                      \"削除成功\",\n\t\"continue creating\":                   \"追加続行\",\n\t\"wrong captcha\":                       \"エラーの認証コード\",\n\t\"code generate tool\":                  \"コードジェネレーター\",\n\t\"fixed the sidebar\":                   \"固定サイドバー\",\n\t\"config.must bigger than 900 seconds\": \"900秒以上である必要があります\",\n\t\"enter fullscreen\":                    \"フルスクリーンに入る\",\n\t\"fail\":                                \"失敗\",\n\t\"modify success\":                      \"修正成功\",\n\t\"menus\":                               \"メニュー\",\n\t\"config.test\":                         \"テスト環境\",\n\t\"del\":                                 \"削除\",\n\t\"close\":                               \"閉じる\",\n\t\"view\":                                \"表示\",\n\t\"tool.code generate tool\":             \"コードジェネレーター\",\n\t\"login info\":                          \"ログイン情報\",\n\t\"login overdue, please login again\":   \"ログイン情報が期限切れです。再ログインしてください。\",\n\t\"site setting\":                        \"ウェブサイト設定\",\n\t\"managers manage\":                     \"管理者管理\",\n\t\"continue editing\":                    \"編集を続ける\",\n\t\"site info\":                           \"実行情報\",\n\t\"success\":                             \"成功\",\n\t\"delete fail\":                         \"削除失敗\",\n\t\"exit fullscreen\":                     \"フルスクリーンを終了する\",\n\t\"confirm\":                             \"確認\",\n\t\"user\":                                \"ユーザー\",\n\t\"showing <b>%s</b> to <b>%s</b> of <b>%s</b> entries\": \"第<b>%s</b>から第<b>%s</b>のレコードを表示、合計<b>%s</b>レコード\",\n\t\"config.local\":  \"ローカル環境\",\n\t\"config.prod\":   \"プロダクション環境\",\n\t\"no permission\": \"権限がありません\",\n}\n"
  },
  {
    "path": "modules/language/language.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport (\n\t\"html/template\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"golang.org/x/text/language\"\n)\n\nvar (\n\tEN   = language.English.String()\n\tCN   = language.Chinese.String()\n\tJP   = language.Japanese.String()\n\tTC   = language.TraditionalChinese.String()\n\tPTBR = language.BrazilianPortuguese.String()\n\tRU   = language.Russian.String()\n)\n\nfunc FixedLanguageKey(key string) string {\n\tif key == \"en\" {\n\t\treturn EN\n\t}\n\tif key == \"cn\" {\n\t\treturn CN\n\t}\n\tif key == \"jp\" {\n\t\treturn JP\n\t}\n\tif key == \"tc\" {\n\t\treturn TC\n\t}\n\tif key == \"pt-br\" {\n\t\treturn PTBR\n\t}\n\tif key == \"ru\" {\n\t\treturn RU\n\t}\n\treturn key\n}\n\nvar Langs = [...]string{EN, CN, JP, TC, RU}\n\n// Get return the value of default scope.\nfunc Get(value string) string {\n\treturn GetWithScope(value)\n}\n\n// GetWithScope return the value of given scopes.\nfunc GetWithScope(value string, scopes ...string) string {\n\tif config.GetLanguage() == \"\" {\n\t\treturn value\n\t}\n\n\treturn GetWithScopeAndLanguageSet(value, config.GetLanguage(), scopes...)\n}\n\n// GetWithLang return the value of given language set.\nfunc GetWithLang(value, lang string) string {\n\tif lang == \"\" {\n\t\tlang = config.GetLanguage()\n\t}\n\treturn GetWithScopeAndLanguageSet(value, lang)\n}\n\n// GetWithScopeAndLanguageSet return the value of given scopes and language set.\nfunc GetWithScopeAndLanguageSet(value, lang string, scopes ...string) string {\n\tif locale, ok := Lang[lang][JoinScopes(scopes)+strings.ToLower(value)]; ok {\n\t\treturn locale\n\t}\n\n\treturn value\n}\n\n// GetFromHtml return the value of given scopes and template.HTML value.\nfunc GetFromHtml(value template.HTML, scopes ...string) template.HTML {\n\tif config.GetLanguage() == \"\" {\n\t\treturn value\n\t}\n\n\tif locale, ok := Lang[config.GetLanguage()][JoinScopes(scopes)+strings.ToLower(string(value))]; ok {\n\t\treturn template.HTML(locale)\n\t}\n\n\treturn value\n}\n\n// WithScopes join scopes prefix and the value.\nfunc WithScopes(value string, scopes ...string) string {\n\treturn JoinScopes(scopes) + strings.ToLower(value)\n}\n\ntype LangSet map[string]string\n\nfunc (l LangSet) Add(key, value string) {\n\tl[key] = value\n}\n\nfunc (l LangSet) Combine(set LangSet) LangSet {\n\tfor k, s := range set {\n\t\tl[k] = s\n\t}\n\treturn l\n}\n\n// LangMap is the map of language packages.\ntype LangMap map[string]LangSet\n\n// Lang is the global LangMap.\nvar Lang = LangMap{\n\tlanguage.Chinese.String():             cn,\n\tlanguage.English.String():             en,\n\tlanguage.Japanese.String():            jp,\n\tlanguage.TraditionalChinese.String():  tc,\n\tlanguage.BrazilianPortuguese.String(): ptbr,\n\tlanguage.Russian.String():             ru,\n\n\t\"cn\":    cn,\n\t\"en\":    en,\n\t\"jp\":    jp,\n\t\"tc\":    tc,\n\t\"pt-br\": ptbr,\n\t\"ru\":    ru,\n}\n\n// Get get the value from LangMap.\nfunc (lang LangMap) Get(value string) string {\n\treturn lang.GetWithScope(value)\n}\n\n// GetWithScope get the value from LangMap with given scopes.\nfunc (lang LangMap) GetWithScope(value string, scopes ...string) string {\n\tif config.GetLanguage() == \"\" {\n\t\treturn value\n\t}\n\n\tif locale, ok := lang[config.GetLanguage()][JoinScopes(scopes)+strings.ToLower(value)]; ok {\n\t\treturn locale\n\t}\n\n\treturn value\n}\n\n// Add add a language package to the Lang.\nfunc Add(key string, lang map[string]string) {\n\tLang[key] = lang\n}\n\n// AppendTo add more language translations to the given language set.\nfunc AppendTo(lang string, set map[string]string) {\n\tfor key, value := range set {\n\t\tLang[lang][key] = value\n\t}\n}\n\nfunc JoinScopes(scopes []string) string {\n\tj := \"\"\n\tfor _, scope := range scopes {\n\t\tif scope != \"\" {\n\t\t\tj += scope + \".\"\n\t\t}\n\t}\n\treturn j\n}\n"
  },
  {
    "path": "modules/language/language_test.go",
    "content": "package language\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestKK(t *testing.T) {\n\tfor key := range cn {\n\t\tif _, ok := ptbr[key]; !ok {\n\t\t\tfmt.Println(key, \"===\", cn[key])\n\t\t}\n\t}\n}\n\nfunc TestAdd(t *testing.T) {\n\tAdd(\"cn\", map[string]string{})\n}\n\nfunc TestGetWithScope(t *testing.T) {\n\tconfig.Initialize(&config.Config{\n\t\tLanguage: CN,\n\t})\n\tcn[\"foo\"] = \"bar\"\n\tassert.Equal(t, GetWithScope(\"foo\"), \"bar\")\n\tcn[\"user.table.foo2\"] = \"bar\"\n\tassert.Equal(t, GetWithScope(\"foo2\"), \"foo2\")\n\tassert.Equal(t, GetWithScope(\"foo2\", \"user\"), \"foo2\")\n\tassert.Equal(t, GetWithScope(\"foo2\", \"user\", \"table\"), \"bar\")\n}\n\nfunc TestGet(t *testing.T) {\n\tconfig.Initialize(&config.Config{\n\t\tLanguage: CN,\n\t})\n\tcn[\"foo\"] = \"bar\"\n\tassert.Equal(t, Get(\"foo\"), \"bar\")\n}\n\nfunc TestWithScopes(t *testing.T) {\n\tassert.Equal(t, WithScopes(\"foo\", \"user\", \"table\"), \"user.table.foo\")\n}\n\nfunc TestGetFromHtml(t *testing.T) {\n\tconfig.Initialize(&config.Config{\n\t\tLanguage: CN,\n\t})\n\tcn[\"user.table.foo\"] = \"bar\"\n\tassert.Equal(t, GetFromHtml(\"foo\", \"user\", \"table\"), template.HTML(\"bar\"))\n}\n"
  },
  {
    "path": "modules/language/pt-BR.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport \"strings\"\n\nvar ptbr = LangSet{\n\t\"managers\":         \"Gerentes\",\n\t\"name\":             \"Nome\",\n\t\"nickname\":         \"Apelido\",\n\t\"role\":             \"Role\",\n\t\"createdat\":        \"criadoEm\",\n\t\"updatedat\":        \"atualizadoEm\",\n\t\"path\":             \"caminho\",\n\t\"new\":              \"Novo\",\n\t\"filter\":           \"Filtro\",\n\t\"action\":           \"Ação\",\n\t\"toggle dropdown\":  \"Toggle Dropdown\",\n\t\"delete\":           \"Excluir\",\n\t\"refresh\":          \"Atualizar\",\n\t\"expand\":           \"Expandir\",\n\t\"collapse\":         \"Recolher\",\n\t\"back\":             \"Voltar\",\n\t\"reset\":            \"Redefinir\",\n\t\"save\":             \"Salvar\",\n\t\"edit\":             \"Editar\",\n\t\"operation\":        \"Operação\",\n\t\"method\":           \"Método\",\n\t\"input\":            \"entrada\",\n\t\"online\":           \"Online\",\n\t\"setting\":          \"Configuração\",\n\t\"sign out\":         \"Sair\",\n\t\"all\":              \"Tudo\",\n\t\"confirm password\": \"Confirmar a Senha\",\n\t\"search\":           \"Procurar\",\n\t\"remove\":           \"Remover\",\n\t\"query time\":       \"tempo de consulta\",\n\n\t\"goadmin is now running. \\nrunning in \\\"debug\\\" mode. switch to \\\"release\\\" mode in production.\\n\\n\": \"GoAdmin agora está em execução. \\nExecutando no modo \\\"debug \\\". Mude para o modo de \\\"release\\\" em produção. \\n\\n\",\n\n\t\"wrong goadmin version, theme %s required goadmin version are %s\":    \"Versão incorreta do GoAdmin, o tema %s requer a versão do GoAdmin %s\",\n\t\"wrong theme version, goadmin %s required version of theme %s is %s\": \"Versão incorreta do tema, o GoAdmin %s requer a versão do tema %s como %s\",\n\n\t\"adapter is nil, import the default adapter or use addadapter method add the adapter\": \"O adaptador está nulo, importe o adaptador padrão ou use o método AddAdapter para adicionar o adaptador\",\n\n\t\"are you sure to delete\":               \"Você tem certeza que quer deletar\",\n\t\"yes\":                                  \"sim\",\n\t\"got it\":                               \"entendi\",\n\t\"cancel\":                               \"cancelar\",\n\t\"refresh succeeded\":                    \"Atualizado com sucesso\",\n\t\"reload succeeded\":                     \"Recarregado com sucesso\",\n\t\"all method if empty\":                  \"Todo método é vazio\",\n\t\"password does not match\":              \"Senha não confere\",\n\t\"should be unique\":                     \"Deve ser único\",\n\t\"slug exists\":                          \"Slug existe\",\n\t\"no corresponding options?\":            \"Sem opções correspondentes ?\",\n\t\"create here.\":                         \"Crie aqui.\",\n\t\"use for login\":                        \"Use para login\",\n\t\"use to display\":                       \"Use para exibir\",\n\t\"a path a line, without global prefix\": \"Um caminho uma linha\",\n\t\"slug or http_path or name should not be empty\": \"slug ou http_path ou nome não deve estar vazio\",\n\t\"no roles\":          \"sem roles\",\n\t\"fixed the sidebar\": \"Barra lateral fixada\",\n\t\"enter fullscreen\":  \"Entrar em tela cheia\",\n\t\"exit fullscreen\":   \"Sair da tela inteira\",\n\n\t\"permission manage\": \"Gerenciamento de permissão\",\n\t\"menus manage\":      \"Gerenciar menu\",\n\t\"roles manage\":      \"Gerenciar roles\",\n\t\"operation log\":     \"Log de operação\",\n\n\t\"continue editing\":  \"Continue editando\",\n\t\"continue creating\": \"Continue criando\",\n\n\t\"browse\":     \"Navegar\",\n\t\"avatar\":     \"Avatar\",\n\t\"password\":   \"Senha\",\n\t\"username\":   \"Nome do usuário\",\n\t\"slug\":       \"Slug\",\n\t\"permission\": \"Permissão\",\n\t\"userid\":     \"UserID\",\n\t\"content\":    \"Conteúdo\",\n\t\"parent\":     \"Pai\",\n\t\"icon\":       \"Ícone\",\n\t\"uri\":        \"Uri\",\n\n\t\"detail\": \"Detalhe\",\n\n\t\"admin\":     \"Administração\",\n\t\"users\":     \"Usuários\",\n\t\"roles\":     \"Funções\",\n\t\"menu\":      \"Menu\",\n\t\"dashboard\": \"Painel de Controle\",\n\t\"home\":      \"Página Inicial\",\n\n\t\"initialize configuration\":        \"Inicializando configuração\",\n\t\"initialize navigation buttons\":   \"Inicializando botões de navegação\",\n\t\"initialize plugins\":              \"Inicializando plugins\",\n\t\"initialize database connections\": \"Inicializando conexões de banco de dados\",\n\t\"initialize success\":              \"Inicialização feita com sucesso🍺🍺\",\n\n\t\"not found\":      \"Não encontrado\",\n\t\"internal error\": \"Erro interno\",\n\t\"unauthorized\":   \"Não autorizado\",\n\t\"plugin setting\": \"Configuração de Plugin\",\n\n\t\"plugins\":          \"Plugins\",\n\t\"plugin store\":     \"Loja de Plugins\",\n\t\"get more plugins\": \"Mais plugins\",\n\t\"uninstalled\":      \"Desinstalado\",\n\n\t\"second\":  \"segundo\",\n\t\"seconds\": \"segundos\",\n\t\"minute\":  \"minuto\",\n\t\"minutes\": \"minutos\",\n\t\"hour\":    \"hora\",\n\t\"hours\":   \"horass\",\n\t\"day\":     \"dia\",\n\t\"days\":    \"dias\",\n\t\"week\":    \"semana\",\n\t\"weeks\":   \"semanas\",\n\t\"month\":   \"mês\",\n\t\"months\":  \"meses\",\n\t\"year\":    \"ano\",\n\t\"years\":   \"anos\",\n\n\t\"config.domain\":          \"Domínio do site\",\n\t\"config.language\":        \"Idioma do site\",\n\t\"config.url prefix\":      \"URL Prefix\",\n\t\"config.theme\":           \"Tema\",\n\t\"config.title\":           \"Título\",\n\t\"config.index url\":       \"Home URL\",\n\t\"config.login url\":       \"Login URL\",\n\t\"config.env\":             \"Env\",\n\t\"config.color scheme\":    \"Color Scheme\",\n\t\"config.cdn url\":         \"CDN Asset URL\",\n\t\"config.login title\":     \"Título de Login\",\n\t\"config.auth user table\": \"Auth User Table\",\n\t\"config.extra\":           \"Extra Configuration\",\n\t\"config.store\":           \"File Store Setting\",\n\t\"config.databases\":       \"Database Setting\",\n\n\t\"config.general\":      \"Geral\",\n\t\"config.log\":          \"Registro\",\n\t\"config.site setting\": \"Configurações do Site\",\n\t\"config.custom\":       \"Personalizar\",\n\t\"config.debug\":        \"Modo de Depuração\",\n\t\"config.site off\":     \"Site Offline\",\n\t\"config.true\":         \"Ligado\",\n\t\"config.false\":        \"Desligado\",\n\n\t\"config.logo\":                        \"Logotipo\",\n\t\"config.mini logo\":                   \"Mini Logotipo\",\n\t\"config.bootstrap file path\":         \"Caminho do Arquivo Bootstrap\",\n\t\"config.go mod file path\":            \"Caminho do Arquivo go.mod\",\n\t\"config.session life time\":           \"Tempo de Vida da Sessão\",\n\t\"config.custom head html\":            \"HTML do Cabeçalho\",\n\t\"config.custom foot html\":            \"HTML do Rodapé\",\n\t\"config.custom 404 html\":             \"Página 404\",\n\t\"config.custom 403 html\":             \"Página 403\",\n\t\"config.custom 500 html\":             \"Página 500\",\n\t\"config.hide config center entrance\": \"Ocultar Botão de Configuração\",\n\t\"config.hide app info entrance\":      \"Ocultar Botão de Informações do Aplicativo\",\n\t\"config.hide tool entrance\":          \"Ocultar Botão de Ferramenta\",\n\t\"config.footer info\":                 \"Informações do Rodapé\",\n\t\"config.login logo\":                  \"Logotipo de Login\",\n\t\"config.no limit login ip\":           \"Login sem Limite de IPs Múltiplos\",\n\t\"config.operation log off\":           \"Desligar Log de Operações\",\n\t\"config.allow delete operation log\":  \"Permitir Excluir Log de Operações\",\n\t\"config.animation type\":              \"Tipo de Animação\",\n\t\"config.animation duration\":          \"Duração da Animação (s)\",\n\t\"config.animation delay\":             \"Atraso da Animação (s)\",\n\t\"config.file upload engine\":          \"Motor de Envio de Arquivos\",\n\n\t\"config.logger rotate\":             \"Configurações de Rotação de Log\",\n\t\"config.logger rotate max size\":    \"Tamanho Máximo (m)\",\n\t\"config.logger rotate max backups\": \"Backup Máximo\",\n\t\"config.logger rotate max age\":     \"Idade Máxima (dias)\",\n\t\"config.logger rotate compress\":    \"Comprimir\",\n\n\t\"config.info log path\":         \"Caminho do Arquivo de Log de Informações\",\n\t\"config.error log path\":        \"Caminho do Arquivo de Log de Erro\",\n\t\"config.access log path\":       \"Caminho do Arquivo de Log de Acesso\",\n\t\"config.info log off\":          \"Desligar Log de Informações\",\n\t\"config.error log off\":         \"Desligar Log de Erro\",\n\t\"config.access log off\":        \"Desligar Log de Acesso\",\n\t\"config.access assets log off\": \"Desligar Log de Ativos de Acesso\",\n\t\"config.sql log on\":            \"Abrir log SQL\",\n\t\"config.log level\":             \"Nível\",\n\n\t\"config.logger rotate encoder\":                \"Configurações do codificador de registro\",\n\t\"config.logger rotate encoder time key\":       \"Chave de tempo\",\n\t\"config.logger rotate encoder level key\":      \"Chave de Nível\",\n\t\"config.logger rotate encoder name key\":       \"Chave do Nome\",\n\t\"config.logger rotate encoder caller key\":     \"Tecla do chamador\",\n\t\"config.logger rotate encoder message key\":    \"Chave de mensagem\",\n\t\"config.logger rotate encoder stacktrace key\": \"Chave Stacktrace\",\n\t\"config.logger rotate encoder level\":          \"Codificador de Nível\",\n\t\"config.logger rotate encoder time\":           \"Codificador de tempo\",\n\t\"config.logger rotate encoder duration\":       \"Codificador de duração\",\n\t\"config.logger rotate encoder caller\":         \"Codificador de Chamadas\",\n\t\"config.logger rotate encoder encoding\":       \"Formato de saída\",\n\n\t\"config.capital\":        \"Maiúsculo\",\n\t\"config.capitalcolor\":   \"Maiúsculo com cor\",\n\t\"config.lowercase\":      \"Minúsculas\",\n\t\"config.lowercasecolor\": \"Minúsculas com cor\",\n\n\t\"config.seconds\":     \"Segundos\",\n\t\"config.nanosecond\":  \"Nanossegundo\",\n\t\"config.microsecond\": \"Microssegundo\",\n\t\"config.millisecond\": \"Milissegundo\",\n\n\t\"config.full path\":  \"Caminho completo\",\n\t\"config.short path\": \"Caminho curto\",\n\n\t\"config.do not modify when you have not set up all assets\": \"Não modifique quando você não configurou todos os assets\",\n\t\"config.it will work when theme is adminlte\":               \"Funcionará quando o tema for adminlte\",\n\n\t\"config.language.\" + CN:                  \"Chinês\",\n\t\"config.language.\" + EN:                  \"Inglês\",\n\t\"config.language.\" + JP:                  \"Japonês\",\n\t\"config.language.\" + strings.ToLower(TC): \"Chinês Tradicional\",\n\t\"config.language.\" + PTBR:                \"Português Brasileiro\",\n\t\"config.language.\" + RU:                  \"Русский\",\n\n\t\"config.modify site config\":         \"Modificação da configuração do site\",\n\t\"config.modify site config success\": \"modificado com successo\",\n\t\"config.modify site config fail\":    \"modificação falhou\",\n\n\t\"system.system info\":     \"Informações do sistema e do aplicativo\",\n\t\"system.application\":     \"Informações do aplicativo\",\n\t\"system.application run\": \"Informações de execução de aplicativos\",\n\t\"system.system\":          \"Informação do sistema\",\n\n\t\"system.process_id\":                           \"ID do Processo\",\n\t\"system.golang_version\":                       \"Versão do Golang\",\n\t\"system.server_uptime\":                        \"Tempo de atividade do servidor\",\n\t\"system.current_goroutine\":                    \"Goroutines Atuais\",\n\t\"system.current_memory_usage\":                 \"Uso de Memória Atual\",\n\t\"system.total_memory_allocated\":               \"Memória Total Alocada\",\n\t\"system.memory_obtained\":                      \"Memória Obtida\",\n\t\"system.pointer_lookup_times\":                 \"Tempos de Pesquisa de Ponteiro\",\n\t\"system.memory_allocate_times\":                \"Tempos de Alocação de Memória\",\n\t\"system.memory_free_times\":                    \"Tempos de Liberação de Memória\",\n\t\"system.current_heap_usage\":                   \"Uso de Heap Atual\",\n\t\"system.heap_memory_obtained\":                 \"Memória de Heap Obtida\",\n\t\"system.heap_memory_idle\":                     \"Memória de Heap Inativa\",\n\t\"system.heap_memory_in_use\":                   \"Memória de Heap em Uso\",\n\t\"system.heap_memory_released\":                 \"Memória de Heap Liberada\",\n\t\"system.heap_objects\":                         \"Objetos de Heap\",\n\t\"system.bootstrap_stack_usage\":                \"Uso de Pilha de Inicialização\",\n\t\"system.stack_memory_obtained\":                \"Memória de Pilha Obtida\",\n\t\"system.mspan_structures_usage\":               \"Uso de Estruturas MSpan\",\n\t\"system.mspan_structures_obtained\":            \"Estruturas MSpan Obtidas\",\n\t\"system.mcache_structures_usage\":              \"Uso de Estruturas MCache\",\n\t\"system.mcache_structures_obtained\":           \"Estruturas MCache Obtidas\",\n\t\"system.profiling_bucket_hash_table_obtained\": \"Tabela de Hash de Baldes de Perfil Objetida\",\n\t\"system.gc_metadata_obtained\":                 \"Metadados de GC Obtidos\",\n\t\"system.other_system_allocation_obtained\":     \"Outras Alocações de Sistema Obtidas\",\n\t\"system.next_gc_recycle\":                      \"Próxima Reciclagem de GC\",\n\t\"system.last_gc_time\":                         \"Desde a Última Hora de GC\",\n\t\"system.total_gc_time\":                        \"Pausa Total de GC\",\n\t\"system.total_gc_pause\":                       \"Pausa Total de GC\",\n\t\"system.last_gc_pause\":                        \"Última Pausa de GC\",\n\t\"system.gc_times\":                             \"Tempos de GC\",\n\n\t\"system.cpu_logical_core\": \"CPU Core Lógico\",\n\t\"system.cpu_core\":         \"CPU Core Físico\",\n\t\"system.os_platform\":      \"OS Plataforma\",\n\t\"system.os_family\":        \"OS Familia\",\n\t\"system.os_version\":       \"OS Versão\",\n\t\"system.load1\":            \"Load1\",\n\t\"system.load5\":            \"Load5\",\n\t\"system.load15\":           \"Load15\",\n\t\"system.mem_total\":        \"Memória Total\",\n\t\"system.mem_available\":    \"Memória disponível\",\n\t\"system.mem_used\":         \"Memória usada\",\n\n\t\"system.app_name\":         \"Nome da aplicação\",\n\t\"system.go_admin_version\": \"Versão da aplicação\",\n\t\"system.theme_name\":       \"Tema\",\n\t\"system.theme_version\":    \"Versão do Tema\",\n\n\t\"tool.tool\":                   \"Ferramenta\",\n\t\"tool.table\":                  \"Tabela\",\n\t\"tool.connection\":             \"Conexão\",\n\t\"tool.package\":                \"Pacote\",\n\t\"tool.output\":                 \"Caminho de saída\",\n\t\"tool.output path is empty\":   \"O caminho de saída está vazio\",\n\t\"tool.field\":                  \"Campo\",\n\t\"tool.title\":                  \"Título\",\n\t\"tool.field name\":             \"Nome\",\n\t\"tool.db type\":                \"Tipo de banco de dados\",\n\t\"tool.form type\":              \"Tipo de Formulário\",\n\t\"tool.generate table model\":   \"Modelo de tabela gerado\",\n\t\"tool.primarykey\":             \"Chave primária\",\n\t\"tool.field filterable\":       \"Filtrável\",\n\t\"tool.field sortable\":         \"Classificável\",\n\t\"tool.yes\":                    \"Sim\",\n\t\"tool.no\":                     \"Não\",\n\t\"tool.hide\":                   \"Esconder\",\n\t\"tool.show\":                   \"Mostrar\",\n\t\"tool.generate success\":       \"Gerado com sucesso\",\n\t\"tool.hide filter area\":       \"Esconder a Área do Filtro\",\n\t\"tool.use absolute path\":      \"Use o caminho absoluto\",\n\t\"tool.display\":                \"Exibição\",\n\t\"tool.basic info\":             \"Básico\",\n\t\"tool.table info\":             \"Tabela\",\n\t\"tool.form info\":              \"Formulário\",\n\t\"tool.field editable\":         \"Editável\",\n\t\"tool.info field editable\":    \"Editável\",\n\t\"tool.extra import package\":   \"Pacote de Importação\",\n\t\"tool.field can add\":          \"Pode adicionar\",\n\t\"tool.field default\":          \"Default\",\n\t\"tool.filter area\":            \"Area de filtro\",\n\t\"tool.new button\":             \"Botão Novo\",\n\t\"tool.export button\":          \"Botão exportar\",\n\t\"tool.edit button\":            \"Botão editar\",\n\t\"tool.delete button\":          \"Botão excluir\",\n\t\"tool.detail button\":          \"Botão Detalhe\",\n\t\"tool.filter button\":          \"Botão Filtro\",\n\t\"tool.row selector\":           \"Seletor de linha\",\n\t\"tool.pagination\":             \"Paginação\",\n\t\"tool.query info\":             \"Informações de consulta\",\n\t\"tool.filter form layout\":     \"Layout do formulário de filtro\",\n\t\"tool.continue edit checkbox\": \"Continue Edição Checkbox\",\n\t\"tool.continue new checkbox\":  \"Continuar Novo Checkbox\",\n\t\"tool.reset button\":           \"Botão Redefinir\",\n\t\"tool.back button\":            \"Botão Voltar\",\n\t\"tool.generate\":               \"Gerado\",\n\t\"tool.generated tables\":       \"Tabelas geradas\",\n\t\"tool.description\":            \"Descrição\",\n\t\"tool.label\":                  \"Etiqueta\",\n\t\"tool.image\":                  \"Imagem\",\n\t\"tool.bool\":                   \"Bool\",\n\t\"tool.link\":                   \"Link\",\n\t\"tool.fileSize\":               \"Tamanho do Arquivo\",\n\t\"tool.date\":                   \"Data\",\n\t\"tool.icon\":                   \"Ícone\",\n\t\"tool.dot\":                    \"Ponto\",\n\t\"tool.progressBar\":            \"Barra de progresso\",\n\t\"tool.loading\":                \"Carregando\",\n\t\"tool.downLoadable\":           \"DownLoadable\",\n\t\"tool.copyable\":               \"Copiável\",\n\t\"tool.carousel\":               \"Carrossel\",\n\t\"tool.qrcode\":                 \"Qrcode\",\n\t\"tool.field hide\":             \"Esconder\",\n\t\"tool.field display\":          \"Exibição\",\n\t\"tool.table permission\":       \"Gerar permissões\",\n\t\"tool.extra code\":             \"Código Extra\",\n\n\t\"tool.field display normal\":     \"Normal\",\n\t\"tool.field diplay hide\":        \"Esconder\",\n\t\"tool.field diplay edit hide\":   \"Editar Esconder\",\n\t\"tool.field diplay create hide\": \"Criar Esconder\",\n\n\t\"tool.generate table model success\": \"sucesso ao gerar\",\n\t\"tool.generate table model fail\":    \"falha ao gerar\",\n\n\t\"tool.detail display\":             \"Exibição\",\n\t\"tool.detail info\":                \"Informação detalhada\",\n\t\"tool.follow list page\":           \"Seguir a página da lista\",\n\t\"tool.inherit from list page\":     \"Herdar da página da lista\",\n\t\"tool.independent from list page\": \"Independente da página da lista\",\n\n\t\"generator.query\":                 \"Query\",\n\t\"generator.show edit form page\":   \"Mostrar formulário de edição\",\n\t\"generator.show create form page\": \"Mostrar formulário de criação\",\n\t\"generator.edit\":                  \"Editar\",\n\t\"generator.create\":                \"Criar\",\n\t\"generator.delete\":                \"Excluir\",\n\t\"generator.export\":                \"Exportar\",\n\n\t\"plugin.plugin\":                         \"Plugin\",\n\t\"plugin.plugin detail\":                  \"Detalhe do plugin\",\n\t\"plugin.introduction\":                   \"Introdução\",\n\t\"plugin.website\":                        \"Website\",\n\t\"plugin.version\":                        \"Versão\",\n\t\"plugin.created at\":                     \"Criado Em\",\n\t\"plugin.updated at\":                     \"Atualizado Em\",\n\t\"plugin.provided by %s\":                 \"Fornecido por %s\",\n\t\"plugin.upgrade\":                        \"Upgrade\",\n\t\"plugin.install\":                        \"Instalar\",\n\t\"plugin.download\":                       \"Download\",\n\t\"plugin.buy\":                            \"Comprar\",\n\t\"plugin.downloading\":                    \"Baixando\",\n\t\"plugin.info\":                           \"Detalhe\",\n\t\"plugin.login\":                          \"Login\",\n\t\"plugin.login to goadmin member system\": \"Faça login no sistema de membros GoAdmin\",\n\t\"plugin.account\":                        \"Conta\",\n\t\"plugin.password\":                       \"Senha\",\n\t\"plugin.learn more\":                     \"Saber mais\",\n\n\t\"plugin.no account? click %s here %s to register.\":    \"Sem conta？ Clique %saqui%s para se registrar.\",\n\t\"plugin.download fail, wrong name\":                    \"Falha no download, nome errado\",\n\t\"plugin.change to debug mode first\":                   \"Mude para o modo debug primeiro\",\n\t\"plugin.download fail, plugin not exist\":              \"O download falhou, o plugin não existe\",\n\t\"plugin.download fail\":                                \"Falha no download\",\n\t\"plugin.golang develop environment does not exist\":    \"O ambiente de desenvolvimento de Golang não existe\",\n\t\"plugin.download success, restart to install\":         \"Download bem-sucedido, reinicie para instalar\",\n\t\"plugin.restart to install\":                           \"Reinicie para instalar\",\n\t\"plugin.can not connect to the goadmin remote server\": \"Falha ao conectar o servidor remoto GoAdmin, verifique sua conexão de rede.\",\n\n\t\"admin.basic admin\": \"Admin básico\",\n\t\"admin.a built-in plugins of goadmin which help you to build a crud manager platform quickly.\": \"Plug-ins integrados ao GoAdmin que ajudam você a construir uma plataforma de gerenciamento crud rapidamente.\",\n\t\"admin.official\": \"Oficial\",\n\n\t\"create fail\":                            \"Falha ao adicionar\",\n\t\"modify success\":                         \"Modificado com sucesso\",\n\t\"system.site info\":                       \"Informações de execução\",\n\t\"username and password can not be empty\": \"Nome de usuário e senha não podem estar vazios\",\n\t\"login\":                                  \"Entrar\",\n\t\"confirm\":                                \"Confirmar\",\n\t\"export\":                                 \"Exportar\",\n\t\"delete fail\":                            \"Falha ao excluir\",\n\t\"user\":                                   \"Usuário\",\n\t\"error\":                                  \"Erro\",\n\t\"current page\":                           \"Página atual\",\n\t\"config.must bigger than 900 seconds\":    \"Deve ser superior a 900 segundos\",\n\t\"no permission\":                          \"Sem permissão\",\n\t\"wrong captcha\":                          \"Código de verificação incorreto\",\n\t\"tool.code generate tool\":                \"Gerador de código\",\n\t\"site info\":                              \"Informações de execução\",\n\t\"login overdue, please login again\":      \"As informações de login expiraram, faça o login novamente\",\n\t\"menu name\":                              \"Nome do menu\",\n\t\"success\":                                \"Sucesso\",\n\t\"delete succeed\":                         \"Excluído com sucesso\",\n\t\"edit fail\":                              \"Falha ao editar\",\n\t\"config.local\":                           \"Ambiente local\",\n\t\"menus\":                                  \"Menu\",\n\t\"del\":                                    \"Excluir\",\n\t\"managers manage\":                        \"Gerenciamento de administradores\",\n\t\"login fail\":                             \"Falha ao fazer login\",\n\t\"operation not allow\":                    \"Operação não permitida\",\n\t\"config.hide plugin entrance\":            \"Ocultar entrada da lista de plugins\",\n\t\"showing <b>%s</b> to <b>%s</b> of <b>%s</b> entries\": \"Mostrando <b>%s</b> a <b>%s</b> registros, totalizando <b>%s</b> registros\",\n\t\"login info\":         \"Informações de login\",\n\t\"view\":               \"Visualizar\",\n\t\"code generate tool\": \"Gerador de código\",\n\t\"config.test\":        \"Ambiente de teste\",\n\t\"submit\":             \"Enviar\",\n\t\"close\":              \"Fechar\",\n\t\"fail\":               \"Falha\",\n\t\"more\":               \"Mais\",\n\t\"config.prod\":        \"Ambiente de produção\",\n\t\"site setting\":       \"Configurações do site\",\n\t\"permission denied\":  \"Sem permissão\",\n}\n"
  },
  {
    "path": "modules/language/ru.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport \"strings\"\n\nvar ru = LangSet{\n\t\"managers\":         \"Менеджеры\",\n\t\"name\":             \"Имя\",\n\t\"nickname\":         \"Никнейм\",\n\t\"role\":             \"Роль\",\n\t\"createdat\":        \"Дата создания\",\n\t\"updatedat\":        \"Дата обновления\",\n\t\"path\":             \"Путь\",\n\t\"new\":              \"Новый\",\n\t\"filter\":           \"Фильтр\",\n\t\"action\":           \"Действие\",\n\t\"toggle dropdown\":  \"Раскрыть меню\",\n\t\"delete\":           \"Удалить\",\n\t\"refresh\":          \"Обновить\",\n\t\"expand\":           \"Развернуть\",\n\t\"collapse\":         \"Свернуть\",\n\t\"back\":             \"Назад\",\n\t\"reset\":            \"Сбросить\",\n\t\"save\":             \"Сохранить\",\n\t\"edit\":             \"Редактировать\",\n\t\"operation\":        \"Операция\",\n\t\"method\":           \"Метод\",\n\t\"input\":            \"Входные данные\",\n\t\"online\":           \"Онлайн\",\n\t\"setting\":          \"Настройки\",\n\t\"sign out\":         \"Выйти\",\n\t\"all\":              \"Все\",\n\t\"confirm password\": \"Подтвердите пароль\",\n\t\"search\":           \"Поиск\",\n\t\"remove\":           \"Удалить\",\n\n\t\"goadmin is now running. \\nrunning in \\\"debug\\\" mode. switch to \\\"release\\\" mode in production.\\n\\n\": \"GoAdmin запущен. \\nРаботает в режиме \\\"отладки\\\". В продакшене переключитесь на режим \\\"релиза\\\".\\n\\n\",\n\n\t\"wrong goadmin version, theme %s required goadmin version are %s\":    \"Неверная версия GoAdmin, для темы %s требуется версия GoAdmin %s\",\n\t\"wrong theme version, goadmin %s required version of theme %s is %s\": \"Неверная версия темы, для GoAdmin %s требуется версия темы %s %s\",\n\n\t\"adapter is nil, import the default adapter or use addadapter method add the adapter\": \"адаптер не установлен, импортируйте стандартный адаптер или используйте метод AddAdapter для добавления адаптера\",\n\n\t\"are you sure to delete\":               \"Вы уверены, что хотите удалить\",\n\t\"yes\":                                  \"да\",\n\t\"got it\":                               \"понятно\",\n\t\"cancel\":                               \"отмена\",\n\t\"refresh succeeded\":                    \"Обновление успешно\",\n\t\"reload succeeded\":                     \"Перезагрузка успешна\",\n\t\"all method if empty\":                  \"Все методы, если пусто\",\n\t\"password does not match\":              \"Пароль не совпадает\",\n\t\"should be unique\":                     \"Должен быть уникальным\",\n\t\"slug exists\":                          \"Slug уже существует\",\n\t\"no corresponding options?\":            \"Нет соответствующих опций?\",\n\t\"create here.\":                         \"Создать здесь.\",\n\t\"use for login\":                        \"Использовать для входа\",\n\t\"use to display\":                       \"Использовать для отображения\",\n\t\"a path a line, without global prefix\": \"Путь одной строкой, без глобального префикса\",\n\t\"slug or http_path or name should not be empty\": \"Slug, http_path или имя не должны быть пустыми\",\n\t\"no roles\":          \"нет ролей\",\n\t\"fixed the sidebar\": \"Фиксированная боковая панель\",\n\t\"enter fullscreen\":  \"Перейти в полноэкранный режим\",\n\t\"exit fullscreen\":   \"Выйти из полноэкранного режима\",\n\n\t\"permission manage\": \"Управление правами\",\n\t\"menus manage\":      \"Управление меню\",\n\t\"roles manage\":      \"Управление ролями\",\n\t\"operation log\":     \"Журнал операций\",\n\n\t\"continue editing\":  \"Продолжить редактирование\",\n\t\"continue creating\": \"Продолжить создание\",\n\n\t\"browse\":     \"Обзор\",\n\t\"avatar\":     \"Аватар\",\n\t\"password\":   \"Пароль\",\n\t\"username\":   \"Имя пользователя\",\n\t\"slug\":       \"Slug\",\n\t\"permission\": \"Разрешение\",\n\t\"userid\":     \"Идентификатор пользователя\",\n\t\"content\":    \"Содержание\",\n\t\"parent\":     \"Родительский элемент\",\n\t\"icon\":       \"Иконка\",\n\t\"uri\":        \"Uri\",\n\n\t\"detail\": \"Подробности\",\n\n\t\"admin\":     \"Администратор\",\n\t\"users\":     \"Пользователи\",\n\t\"roles\":     \"Роли\",\n\t\"menu\":      \"Меню\",\n\t\"dashboard\": \"Панель управления\",\n\t\"home\":      \"Домой\",\n\n\t\"initialize configuration\":        \"Инициализация конфигурации\",\n\t\"initialize navigation buttons\":   \"Инициализация кнопок навигации\",\n\t\"initialize plugins\":              \"Инициализация плагинов\",\n\t\"initialize database connections\": \"Инициализация подключений к базе данных\",\n\t\"initialize success\":              \"Инициализация прошла успешно🍺🍺\",\n\n\t\"not found\":      \"Не найдено\",\n\t\"internal error\": \"Внутренняя ошибка\",\n\t\"unauthorized\":   \"Неавторизованный\",\n\t\"plugin setting\": \"Настройки плагина\",\n\n\t\"plugins\":          \"Плагины\",\n\t\"plugin store\":     \"Магазин плагинов\",\n\t\"get more plugins\": \"Получить больше плагинов\",\n\t\"uninstalled\":      \"Удален\",\n\n\t\"second\":  \"секунда\",\n\t\"seconds\": \"секунды\",\n\t\"minute\":  \"минута\",\n\t\"minutes\": \"минуты\",\n\t\"hour\":    \"час\",\n\t\"hours\":   \"часы\",\n\t\"day\":     \"день\",\n\t\"days\":    \"дни\",\n\t\"week\":    \"неделя\",\n\t\"weeks\":   \"недели\",\n\t\"month\":   \"месяц\",\n\t\"months\":  \"месяцы\",\n\t\"year\":    \"год\",\n\t\"years\":   \"года\",\n\n\t\"config.domain\":          \"Домен\",\n\t\"config.language\":        \"Язык\",\n\t\"config.url prefix\":      \"URL-префикс\",\n\t\"config.theme\":           \"Тема\",\n\t\"config.title\":           \"Заголовок\",\n\t\"config.index url\":       \"URL главной страницы\",\n\t\"config.login url\":       \"URL страницы входа\",\n\t\"config.env\":             \"Среда\",\n\t\"config.color scheme\":    \"Цветовая схема\",\n\t\"config.cdn url\":         \"URL к CDN-хранилищу ресурсов\",\n\t\"config.login title\":     \"Заголовок страницы входа\",\n\t\"config.auth user table\": \"Таблица пользователей\",\n\t\"config.extra\":           \"Дополнительная конфигурация\",\n\t\"config.store\":           \"Настройки файлового хранилища\",\n\t\"config.databases\":       \"Настройки базы данных\",\n\n\t\"config.general\":      \"Общие настройки\",\n\t\"config.log\":          \"Логи\",\n\t\"config.site setting\": \"Настройки сайта\",\n\t\"config.custom\":       \"Персонализация\",\n\t\"config.debug\":        \"Режим отладки\",\n\t\"config.site off\":     \"Сайт оффлайн\",\n\t\"config.true\":         \"Включено\",\n\t\"config.false\":        \"Выключено\",\n\n\t\"config.logo\":                        \"Логотип\",\n\t\"config.mini logo\":                   \"Мини-логотип\",\n\t\"config.bootstrap file path\":         \"Путь к файлу Bootstrap\",\n\t\"config.go mod file path\":            \"Путь к файлу go.mod\",\n\t\"config.session life time\":           \"Время жизни сессии\",\n\t\"config.custom head html\":            \"HTML заголовка\",\n\t\"config.custom foot html\":            \"HTML подвала\",\n\t\"config.custom 404 html\":             \"404 страница\",\n\t\"config.custom 403 html\":             \"403 страница\",\n\t\"config.custom 500 html\":             \"500 страница\",\n\t\"config.hide config center entrance\": \"Скрыть кнопку конфигурации\",\n\t\"config.hide app info entrance\":      \"Скрыть кнопку информации о приложении\",\n\t\"config.hide tool entrance\":          \"Скрыть кнопку инструментов\",\n\t\"config.footer info\":                 \"Информация в подвале\",\n\t\"config.login logo\":                  \"Логотип при входе в систему\",\n\t\"config.no limit login ip\":           \"Разрешить вход с любых IP-адресов\",\n\t\"config.operation log off\":           \"Отключить журнал операций\",\n\t\"config.allow delete operation log\":  \"Разрешить удаление журнала операций\",\n\t\"config.animation type\":              \"Тип анимации\",\n\t\"config.animation duration\":          \"Длительность анимации (сек)\",\n\t\"config.animation delay\":             \"Задержка анимации (сек)\",\n\t\"config.file upload engine\":          \"Движок загрузки файлов\",\n\n\t\"config.logger rotate\":             \"Настройки поворота логов\",\n\t\"config.logger rotate max size\":    \"Макс. размер (мб)\",\n\t\"config.logger rotate max backups\": \"Макс. количество резервных копий\",\n\t\"config.logger rotate max age\":     \"Макс. возраст (дней)\",\n\t\"config.logger rotate compress\":    \"Сжатие\",\n\n\t\"config.info log path\":         \"Путь к файлу журнала информации\",\n\t\"config.error log path\":        \"Путь к файлу журнала ошибок\",\n\t\"config.access log path\":       \"Путь к файлу журнала доступа\",\n\t\"config.info log off\":          \"Выключить журнал информации\",\n\t\"config.error log off\":         \"Выключить журнал ошибок\",\n\t\"config.access log off\":        \"Выключить журнал доступа\",\n\t\"config.access assets log off\": \"Выключить журнал доступа к ресурсам\",\n\t\"config.sql log on\":            \"Включить журнал SQL\",\n\t\"config.log level\":             \"Уровень журнала\",\n\n\t\"config.logger rotate encoder\":                \"Настройки кодирования журнала\",\n\t\"config.logger rotate encoder time key\":       \"Ключ времени\",\n\t\"config.logger rotate encoder level key\":      \"Ключ уровня\",\n\t\"config.logger rotate encoder name key\":       \"Ключ имени\",\n\t\"config.logger rotate encoder caller key\":     \"Ключ вызывающей функции\",\n\t\"config.logger rotate encoder message key\":    \"Ключ сообщения\",\n\t\"config.logger rotate encoder stacktrace key\": \"Ключ стека вызовов\",\n\t\"config.logger rotate encoder level\":          \"Кодировщик уровня\",\n\t\"config.logger rotate encoder time\":           \"Кодировщик времени\",\n\t\"config.logger rotate encoder duration\":       \"Кодировщик продолжительности\",\n\t\"config.logger rotate encoder caller\":         \"Кодировщик вызывающей функции\",\n\t\"config.logger rotate encoder encoding\":       \"Формат вывода\",\n\n\t\"config.capital\":        \"Заглавные буквы\",\n\t\"config.capitalcolor\":   \"Заглавные буквы с цветом\",\n\t\"config.lowercase\":      \"Строчные буквы\",\n\t\"config.lowercasecolor\": \"Строчные буквы с цветом\",\n\n\t\"config.seconds\":     \"Секунды\",\n\t\"config.nanosecond\":  \"Наносекунды\",\n\t\"config.microsecond\": \"Микросекунды\",\n\t\"config.millisecond\": \"Миллисекунды\",\n\n\t\"config.full path\":  \"Полный путь\",\n\t\"config.short path\": \"Короткий путь\",\n\t//\n\n\t\"config.do not modify when you have not set up all assets\": \"Не изменяйте, если все ресурсы не настроены\",\n\t\"config.it will work when theme is adminlte\":               \"Работает только с темой AdminLTE\",\n\n\t\"config.language.\" + CN:                  \"Китайский\",\n\t\"config.language.\" + EN:                  \"Английский\",\n\t\"config.language.\" + JP:                  \"Японский\",\n\t\"config.language.\" + strings.ToLower(TC): \"Традиционный китайский\",\n\t\"config.language.\" + PTBR:                \"Бразильский португальский\",\n\t\"config.language.\" + RU:                  \"Русский\",\n\n\t\"config.modify site config\":         \"Изменение конфигурации сайта\",\n\t\"config.modify site config success\": \"Успешно изменено\",\n\t\"config.modify site config fail\":    \"Не удалось изменить\",\n\n\t\"system.system info\":     \"Информация о системе и приложении\",\n\t\"system.application\":     \"Информация о приложении\",\n\t\"system.application run\": \"Информация о запущенных приложениях\",\n\t\"system.system\":          \"Информация о системе\",\n\n\t\"system.process_id\":                           \"ID процесса\",\n\t\"system.golang_version\":                       \"Версия Golang\",\n\t\"system.server_uptime\":                        \"Время работы сервера\",\n\t\"system.current_goroutine\":                    \"Текущие горутины\",\n\t\"system.current_memory_usage\":                 \"Использование памяти\",\n\t\"system.total_memory_allocated\":               \"Общее количество выделенной памяти\",\n\t\"system.memory_obtained\":                      \"Полученная память\",\n\t\"system.pointer_lookup_times\":                 \"Время поиска указателя\",\n\t\"system.memory_allocate_times\":                \"Время выделения памяти\",\n\t\"system.memory_free_times\":                    \"Время освобождения памяти\",\n\t\"system.current_heap_usage\":                   \"Использование кучи\",\n\t\"system.heap_memory_obtained\":                 \"Полученная куча памяти\",\n\t\"system.heap_memory_idle\":                     \"Неиспользуемая куча памяти\",\n\t\"system.heap_memory_in_use\":                   \"Используемая куча памяти\",\n\t\"system.heap_memory_released\":                 \"Освобожденная куча памяти\",\n\t\"system.heap_objects\":                         \"Объекты кучи\",\n\t\"system.bootstrap_stack_usage\":                \"Использование стека Bootstrap\",\n\t\"system.stack_memory_obtained\":                \"Полученная память стека\",\n\t\"system.mspan_structures_usage\":               \"Использование структур MSpan\",\n\t\"system.mspan_structures_obtained\":            \"Полученные структуры MSpan\",\n\t\"system.mcache_structures_usage\":              \"Использование структур MCache\",\n\t\"system.mcache_structures_obtained\":           \"Полученные структуры MCache\",\n\t\"system.profiling_bucket_hash_table_obtained\": \"Полученная таблица хешей ведра профилирования\",\n\t\"system.gc_metadata_obtained\":                 \"Полученная метадата GC\",\n\t\"system.other_system_allocation_obtained\":     \"Другие системные выделения\",\n\t\"system.next_gc_recycle\":                      \"Следующая переработка GC\",\n\t\"system.last_gc_time\":                         \"Время с момента последней переработки GC\",\n\t\"system.total_gc_time\":                        \"Общая приостановка GC\",\n\t\"system.total_gc_pause\":                       \"Общая приостановка GC\",\n\t\"system.last_gc_pause\":                        \"Последняя приостановка GC\",\n\t\"system.gc_times\":                             \"Число циклов GC\",\n\n\t\"system.cpu_logical_core\": \"Логические ядра CPU\",\n\t\"system.cpu_core\":         \"Физические ядра CPU\",\n\t\"system.os_platform\":      \"Платформа ОС\",\n\t\"system.os_family\":        \"Семейство ОС\",\n\t\"system.os_version\":       \"Версия ОС\",\n\t\"system.load1\":            \"Загрузка 1\",\n\t\"system.load5\":            \"Загрузка 5\",\n\t\"system.load15\":           \"Загрузка 15\",\n\t\"system.mem_total\":        \"Общий объем памяти\",\n\t\"system.mem_available\":    \"Доступный объем памяти\",\n\t\"system.mem_used\":         \"Использованный объем памяти\",\n\n\t\"system.app_name\":         \"Название приложения\",\n\t\"system.go_admin_version\": \"Версия GoAdmin\",\n\t\"system.theme_name\":       \"Тема\",\n\t\"system.theme_version\":    \"Версия темы\",\n\n\t\"tool.tool\":                 \"Инструмент\",\n\t\"tool.table\":                \"Таблица\",\n\t\"tool.connection\":           \"Подключение\",\n\t\"tool.package\":              \"Пакет\",\n\t\"tool.output\":               \"Путь вывода\",\n\t\"tool.output path is empty\": \"Путь вывода пуст\",\n\t\"tool.field\":                \"Поле\",\n\t\"tool.title\":                \"Название\",\n\t\"tool.field name\":           \"Имя поля\",\n\t\"tool.db type\":              \"Тип базы данных\",\n\t\"tool.form type\":            \"Тип формы\",\n\t\"tool.generate table model\": \"Создать модель таблицы\",\n\t\"tool.primarykey\":           \"Первичный ключ\",\n\t\"tool.field filterable\":     \"Фильтруемое\",\n\t\"tool.field sortable\":       \"Сортируемое\",\n\t\"tool.yes\":                  \"Да\",\n\t\"tool.no\":                   \"Нет\",\n\t\"tool.hide\":                 \"Скрыть\",\n\t\"tool.show\":                 \"Показать\",\n\t\"tool.generate success\":     \"Успешно создано\",\n\t\"tool.hide filter area\":     \"Скрыть область фильтров\",\n\t\"tool.use absolute path\":    \"Использовать абсолютный путь\",\n\t\"tool.display\":              \"Отображение\",\n\t\"tool.basic info\":           \"Основная информация\",\n\t\"tool.table info\":           \"Информация о таблице\",\n\t\"tool.form info\":            \"Информация о форме\",\n\t\"tool.field editable\":       \"Редактируемое\",\n\t\"tool.info field editable\":  \"Редактируемое\",\n\t\"tool.extra import package\": \"Дополнительный пакет импорта\",\n\t\"tool.field can add\":        \"Можно добавлять\",\n\t\"tool.field default\":        \"Значение по умолчанию\",\n\t\"tool.filter area\":          \"Область фильтрации\",\n\t\"tool.new button\":           \"Кнопка Новый\",\n\t\"tool.export button\":        \"Кнопка Экспорт\",\n\t\"tool.edit button\":          \"Кнопка Редактировать\",\n\t\"tool.delete button\":        \"Кнопка Удалить\",\n\t\"tool.detail button\":        \"Кнопка Подробно\",\n\t\"tool.filter button\":        \"Кнопка Фильтр\",\n\t\"tool.row selector\":         \"Селектор строки\",\n\t\"tool.pagination\":           \"Пагинация\",\n\t\"tool.query info\":           \"Информация о запросе\",\n\t\"tool.filter form layout\":   \"Макет формы фильтрации\",\n\t//\n\t\"tool.continue edit checkbox\": \"Флажок продолжить редактирование\",\n\t\"tool.continue new checkbox\":  \"Флажок продолжить создание\",\n\t\"tool.reset button\":           \"Кнопка сброса\",\n\t\"tool.back button\":            \"Кнопка назад\",\n\t\"tool.generate\":               \"Сгенерировать\",\n\t\"tool.generated tables\":       \"Сгенерированные таблицы\",\n\t\"tool.description\":            \"Описание\",\n\t\"tool.label\":                  \"Метка\",\n\t\"tool.image\":                  \"Изображение\",\n\t\"tool.bool\":                   \"Логическое значение\",\n\t\"tool.link\":                   \"Ссылка\",\n\t\"tool.fileSize\":               \"Размер файла\",\n\t\"tool.date\":                   \"Дата\",\n\t\"tool.icon\":                   \"Иконка\",\n\t\"tool.dot\":                    \"Точка\",\n\t\"tool.progressBar\":            \"Индикатор выполнения\",\n\t\"tool.loading\":                \"Загрузка\",\n\t\"tool.downLoadable\":           \"Можно скачать\",\n\t\"tool.copyable\":               \"Можно копировать\",\n\t\"tool.carousel\":               \"Карусель\",\n\t\"tool.qrcode\":                 \"QR-код\",\n\t\"tool.field hide\":             \"Скрыть поле\",\n\t\"tool.field display\":          \"Отобразить поле\",\n\t\"tool.table permission\":       \"Сгенерировать права доступа\",\n\t\"tool.extra code\":             \"Дополнительный код\",\n\t//\n\t\"tool.field display normal\":     \"Обычный\",\n\t\"tool.field diplay hide\":        \"Скрыт\",\n\t\"tool.field diplay edit hide\":   \"Скрыть при редактировании\",\n\t\"tool.field diplay create hide\": \"Скрыть при создании\",\n\n\t\"tool.generate table model success\": \"Успешно сгенерирована модель таблицы\",\n\t\"tool.generate table model fail\":    \"Не удалось сгенерировать модель таблицы\",\n\n\t\"tool.detail display\":             \"Отображение деталей\",\n\t\"tool.detail info\":                \"Информация о деталях\",\n\t\"tool.follow list page\":           \"Следовать за страницей списка\",\n\t\"tool.inherit from list page\":     \"Наследовать от страницы списка\",\n\t\"tool.independent from list page\": \"Независимо от страницы списка\",\n\n\t\"generator.query\":                 \"Запрос\",\n\t\"generator.show edit form page\":   \"Показать страницу формы редактирования\",\n\t\"generator.show create form page\": \"Показать страницу формы создания\",\n\t\"generator.edit\":                  \"Редактировать\",\n\t\"generator.create\":                \"Создать\",\n\t\"generator.delete\":                \"Удалить\",\n\t\"generator.export\":                \"Экспортировать\",\n\n\t\"plugin.plugin\":                         \"Плагин\",\n\t\"plugin.plugin detail\":                  \"Детали плагина\",\n\t\"plugin.introduction\":                   \"Введение\",\n\t\"plugin.website\":                        \"Веб-сайт\",\n\t\"plugin.version\":                        \"Версия\",\n\t\"plugin.created at\":                     \"Дата создания\",\n\t\"plugin.updated at\":                     \"Дата обновления\",\n\t\"plugin.provided by %s\":                 \"Предоставлено %s\",\n\t\"plugin.upgrade\":                        \"Обновить\",\n\t\"plugin.install\":                        \"Установить\",\n\t\"plugin.download\":                       \"Скачать\",\n\t\"plugin.buy\":                            \"Купить\",\n\t\"plugin.downloading\":                    \"Загрузка\",\n\t\"plugin.info\":                           \"Информация\",\n\t\"plugin.login\":                          \"Вход\",\n\t\"plugin.login to goadmin member system\": \"Войти в систему участников GoAdmin\",\n\t\"plugin.account\":                        \"Аккаунт\",\n\t\"plugin.password\":                       \"Пароль\",\n\t\"plugin.learn more\":                     \"Узнать больше\",\n\n\t\"plugin.no account? click %s here %s to register.\":    \"Нет аккаунта? Нажмите %sздесь%s, чтобы зарегистрироваться.\",\n\t\"plugin.download fail, wrong name\":                    \"Сбой загрузки, неправильное имя\",\n\t\"plugin.change to debug mode first\":                   \"Сначала переключитесь в режим отладки\",\n\t\"plugin.download fail, plugin not exist\":              \"Сбой загрузки, плагин не существует\",\n\t\"plugin.download fail\":                                \"Сбой загрузки\",\n\t\"plugin.golang develop environment does not exist\":    \"Среда разработки Golang не существует\",\n\t\"plugin.download success, restart to install\":         \"Успешная загрузка, перезапустите для установки\",\n\t\"plugin.restart to install\":                           \"Перезапустите для установки\",\n\t\"plugin.can not connect to the goadmin remote server\": \"Не удалось подключиться к удаленному серверу GoAdmin, проверьте соединение с сетью.\",\n\n\t\"admin.basic admin\": \"Базовый администратор\",\n\t\"admin.a built-in plugins of goadmin which help you to build a crud manager platform quickly.\": \"Встроенные плагины GoAdmin, которые помогают вам быстро создавать платформу для управления crud.\",\n\t\"admin.official\": \"Официальный\",\n}\n"
  },
  {
    "path": "modules/language/tc.go",
    "content": "package language\n\nimport \"strings\"\n\nvar tc = LangSet{\n\t\"managers\":  \"管理員管理\",\n\t\"name\":      \"用戶名\",\n\t\"nickname\":  \"暱稱\",\n\t\"role\":      \"角色\",\n\t\"createdat\": \"創建時間\",\n\t\"updatedat\": \"更新時間\",\n\t\"path\":      \"路徑\",\n\t\"submit\":    \"提交\",\n\t\"filter\":    \"篩選\",\n\n\t\"new\":             \"新建\",\n\t\"action\":          \"操作\",\n\t\"toggle dropdown\": \"下拉\",\n\t\"delete\":          \"刪除\",\n\t\"refresh\":         \"刷新\",\n\t\"back\":            \"返回\",\n\t\"reset\":           \"重置\",\n\t\"save\":            \"保存\",\n\t\"edit\":            \"編輯\",\n\t\"expand\":          \"展開\",\n\t\"collapse\":        \"折疊\",\n\t\"online\":          \"在線\",\n\t\"setting\":         \"設置\",\n\t\"sign out\":        \"登出\",\n\t\"remove\":          \"移除\",\n\n\t\"permission manage\": \"權限管理\",\n\t\"menus manage\":      \"菜單管理\",\n\t\"roles manage\":      \"角色管理\",\n\t\"operation log\":     \"操作日誌\",\n\t\"method\":            \"方法\",\n\t\"input\":             \"輸入\",\n\t\"operation\":         \"操作\",\n\t\"menu name\":         \"菜單名\",\n\t\"query time\":        \"查询时间\",\n\n\t\"are you sure to delete\": \"你確定要刪除嗎\",\n\t\"delete succeed\":         \"刪除成功\",\n\t\"yes\":                    \"確定\",\n\t\"got it\":                 \"知道了\",\n\t\"cancel\":                 \"取消\",\n\t\"refresh succeeded\":      \"刷新成功\",\n\n\t\"avatar\":     \"頭像\",\n\t\"password\":   \"密碼\",\n\t\"slug\":       \"標誌\",\n\t\"permission\": \"權限\",\n\t\"userid\":     \"用戶ID\",\n\t\"content\":    \"內容\",\n\t\"parent\":     \"父級\",\n\t\"icon\":       \"圖標\",\n\t\"uri\":        \"路徑\",\n\n\t\"export\":    \"導出\",\n\t\"home\":      \"首頁\",\n\t\"all\":       \"全部\",\n\t\"more\":      \"更多\",\n\t\"browse\":    \"打開\",\n\t\"admin\":     \"管理\",\n\t\"users\":     \"用戶\",\n\t\"roles\":     \"角色\",\n\t\"menu\":      \"菜單\",\n\t\"dashboard\": \"儀表盤\",\n\n\t\"permission denied\": \"沒有權限\",\n\t\"error\":             \"錯誤\",\n\t\"success\":           \"成功\",\n\t\"fail\":              \"失敗\",\n\t\"current page\":      \"當前頁\",\n\n\t\"confirm\":             \"確認\",\n\t\"edit fail\":           \"編輯失敗\",\n\t\"create fail\":         \"新增失敗\",\n\t\"delete fail\":         \"刪除失敗\",\n\t\"confirm password\":    \"確認密碼\",\n\t\"all method if empty\": \"為空默認為所有方法\",\n\n\t\"detail\":     \"詳情\",\n\t\"username\":   \"用戶名\",\n\t\"close\":      \"關閉\",\n\t\"login\":      \"登錄\",\n\t\"login fail\": \"登錄失敗\",\n\t\"user\":       \"用戶\",\n\n\t\"continue editing\":  \"繼續編輯\",\n\t\"continue creating\": \"繼續新增\",\n\n\t\"goadmin is now running. \\nrunning in \\\"debug\\\" mode. switch to \\\"release\\\" mode in production.\\n\\n\": \"GoAdmin 啟動成功。\\n目前處於 \\\"debug\\\" 模式。請在生產環境中切換為 \\\"release\\\" 模式。\\n\\n\",\n\n\t\"wrong goadmin version, theme %s required goadmin version are %s\":    \"錯誤的 GoAdmin 版本，當前主題 %s 需要 GoAdmin 版本為 %s\",\n\t\"wrong theme version, goadmin %s required version of theme %s is %s\": \"錯誤的主題版本, GoAdmin %s 需要主題 %s 的版本為 %s\",\n\n\t\"adapter is nil, import the default adapter or use addadapter method add the adapter\": \"適配器為空，請先 import 對應的適配器或使用 AddAdapter 方法引入\",\n\n\t\"username and password can not be empty\":        \"用戶名密碼不能為空\",\n\t\"operation not allow\":                           \"不允許的操作\",\n\t\"password does not match\":                       \"密碼不壹致\",\n\t\"should be unique\":                              \"需要保證唯壹\",\n\t\"slug exists\":                                   \"標誌已經存在了\",\n\t\"no corresponding options?\":                     \"沒找到對應選項？\",\n\t\"create here.\":                                  \"在這裏新建壹個。\",\n\t\"use for login\":                                 \"用於登錄\",\n\t\"use to display\":                                \"用來展示\",\n\t\"a path a line, without global prefix\":          \"壹行壹個路徑，換行輸入新路徑，路徑不包含全局路由前綴\",\n\t\"slug or http_path or name should not be empty\": \"標誌或路徑或權限名不能為空\",\n\t\"no roles\":                                      \"無角色\",\n\t\"no permission\":                                 \"沒有權限\",\n\t\"fixed the sidebar\":                             \"固定側邊欄\",\n\t\"enter fullscreen\":                              \"進入全屏\",\n\t\"exit fullscreen\":                               \"退出全屏\",\n\t\"wrong captcha\":                                 \"錯誤的驗證碼\",\n\t\"modify success\":                                \"修改成功\",\n\n\t\"not found\":      \"找不到記錄\",\n\t\"internal error\": \"系統內部錯誤\",\n\t\"unauthorized\":   \"未認證\",\n\n\t\"login overdue, please login again\": \"登錄信息過期，請重新登錄\",\n\t\"login info\":                        \"登錄信息\",\n\n\t\"initialize configuration\":        \"初始化配置\",\n\t\"initialize navigation buttons\":   \"初始化導航欄按鈕\",\n\t\"initialize plugins\":              \"初始化插件\",\n\t\"initialize database connections\": \"初始化數據庫連接\",\n\t\"initialize success\":              \"初始化成功🍺🍺\",\n\n\t\"plugins\":          \"插件\",\n\t\"plugin store\":     \"插件商店\",\n\t\"get more plugins\": \"獲取更多插件\",\n\t\"uninstalled\":      \"未安裝\",\n\t\"plugin setting\":   \"插件設置\",\n\n\t\"second\":  \"秒\",\n\t\"seconds\": \"秒\",\n\t\"minute\":  \"分\",\n\t\"minutes\": \"分\",\n\t\"hour\":    \"小時\",\n\t\"hours\":   \"小時\",\n\t\"day\":     \"天\",\n\t\"days\":    \"天\",\n\t\"week\":    \"周\",\n\t\"weeks\":   \"周\",\n\t\"month\":   \"月\",\n\t\"months\":  \"月\",\n\t\"year\":    \"年\",\n\t\"years\":   \"年\",\n\n\t\"config.domain\":          \"網站域名\",\n\t\"config.language\":        \"網站語言\",\n\t\"config.url prefix\":      \"URL前綴\",\n\t\"config.theme\":           \"主題\",\n\t\"config.title\":           \"標題\",\n\t\"config.index url\":       \"首頁URL\",\n\t\"config.login url\":       \"登錄URL\",\n\t\"config.env\":             \"開發環境\",\n\t\"config.color scheme\":    \"顏色主題\",\n\t\"config.cdn url\":         \"cdn資源URL\",\n\t\"config.login title\":     \"登錄標題\",\n\t\"config.auth user table\": \"登錄用戶表\",\n\t\"config.extra\":           \"額外配置\",\n\t\"config.store\":           \"文件存儲設置\",\n\t\"config.databases\":       \"數據庫設置\",\n\t\"config.general\":         \"通用\",\n\t\"config.log\":             \"日誌\",\n\t\"config.site setting\":    \"網站設置\",\n\t\"config.custom\":          \"定制\",\n\t\"config.debug\":           \"Debug模式\",\n\t\"config.site off\":        \"關閉網站\",\n\t\"config.true\":            \"是\",\n\t\"config.false\":           \"否\",\n\n\t\"config.test\":  \"測試環境\",\n\t\"config.prod\":  \"生產環境\",\n\t\"config.local\": \"本地環境\",\n\n\t\"config.logo\":                        \"Logo\",\n\t\"config.mini logo\":                   \"Mini Logo\",\n\t\"config.bootstrap file path\":         \"引导文件路徑\",\n\t\"config.go mod file path\":            \"go.mod文件路徑\",\n\t\"config.session life time\":           \"Session時長\",\n\t\"config.custom head html\":            \"自定義Head HTML\",\n\t\"config.custom foot html\":            \"自定義Foot HTML\",\n\t\"config.custom 404 html\":             \"自定義404頁面\",\n\t\"config.custom 403 html\":             \"自定義403頁面\",\n\t\"config.custom 500 html\":             \"自定義500頁面\",\n\t\"config.hide config center entrance\": \"隱藏配置中心入口\",\n\t\"config.hide app info entrance\":      \"隱藏應用信息入口\",\n\t\"config.hide tool entrance\":          \"隱藏工具入口\",\n\t\"config.hide plugin entrance\":        \"隱藏插件列表入口\",\n\t\"config.footer info\":                 \"自定義底部信息\",\n\t\"config.login logo\":                  \"登錄Logo\",\n\t\"config.no limit login ip\":           \"取消限制多IP登錄\",\n\t\"config.operation log off\":           \"關閉操作日誌\",\n\t\"config.allow delete operation log\":  \"允許刪除操作日誌\",\n\t\"config.animation type\":              \"動畫類型\",\n\t\"config.animation duration\":          \"動畫間隔（秒）\",\n\t\"config.animation delay\":             \"動畫延遲（秒）\",\n\t\"config.file upload engine\":          \"文件上傳引擎\",\n\n\t\"config.logger rotate\":             \"日誌切割設置\",\n\t\"config.logger rotate max size\":    \"存儲最大文件大小（m）\",\n\t\"config.logger rotate max backups\": \"存儲最多文件數\",\n\t\"config.logger rotate max age\":     \"最長存儲時間（天）\",\n\t\"config.logger rotate compress\":    \"壓縮\",\n\n\t\"config.info log path\":         \"信息日誌存儲路徑\",\n\t\"config.error log path\":        \"錯誤日誌存儲路徑\",\n\t\"config.access log path\":       \"訪問日誌存儲路徑\",\n\t\"config.info log off\":          \"關閉信息日誌\",\n\t\"config.error log off\":         \"關閉錯誤日誌\",\n\t\"config.access log off\":        \"關閉訪問日誌\",\n\t\"config.access assets log off\": \"關閉靜態資源訪問日誌\",\n\t\"config.sql log on\":            \"打開SQL日誌\",\n\t\"config.log level\":             \"日誌級別\",\n\n\t\"config.logger rotate encoder\":                \"日誌encoder設置\",\n\t\"config.logger rotate encoder time key\":       \"Time Key\",\n\t\"config.logger rotate encoder level key\":      \"Level Key\",\n\t\"config.logger rotate encoder name key\":       \"Name Key\",\n\t\"config.logger rotate encoder caller key\":     \"Caller Key\",\n\t\"config.logger rotate encoder message key\":    \"Message Key\",\n\t\"config.logger rotate encoder stacktrace key\": \"Stacktrace Key\",\n\t\"config.logger rotate encoder level\":          \"Level字段編碼\",\n\t\"config.logger rotate encoder time\":           \"Time字段編碼\",\n\t\"config.logger rotate encoder duration\":       \"Duration字段編碼\",\n\t\"config.logger rotate encoder caller\":         \"Caller字段編碼\",\n\t\"config.logger rotate encoder encoding\":       \"輸出格式\",\n\n\t\"config.capital\":        \"大寫\",\n\t\"config.capitalcolor\":   \"大寫帶顏色\",\n\t\"config.lowercase\":      \"小寫\",\n\t\"config.lowercasecolor\": \"小寫帶顏色\",\n\n\t\"config.seconds\":     \"秒\",\n\t\"config.nanosecond\":  \"納秒\",\n\t\"config.microsecond\": \"微秒\",\n\t\"config.millisecond\": \"毫秒\",\n\n\t\"config.full path\":  \"完整路徑\",\n\t\"config.short path\": \"簡短路徑\",\n\n\t\"config.do not modify when you have not set up all assets\": \"不要修改，當妳還沒有設置好所有資源文件的時候\",\n\t\"config.it will work when theme is adminlte\":               \"當主題為adminlte時生效\",\n\t\"config.must bigger than 900 seconds\":                      \"必須大於900秒\",\n\n\t\"config.language.\" + CN:                  \"中文\",\n\t\"config.language.\" + EN:                  \"英文\",\n\t\"config.language.\" + JP:                  \"日文\",\n\t\"config.language.\" + strings.ToLower(TC): \"繁體中文\",\n\t\"config.language.\" + PTBR:                \"Brazilian Portuguese\",\n\t\"config.language.\" + RU:                  \"Русский\",\n\n\t\"config.modify site config\":         \"修改網站配置\",\n\t\"config.modify site config success\": \"修改網站配置成功\",\n\t\"config.modify site config fail\":    \"修改網站配置失敗\",\n\n\t\"system.system info\":     \"應用系統信息\",\n\t\"system.application\":     \"應用信息\",\n\t\"system.application run\": \"應用運行信息\",\n\t\"system.system\":          \"系統信息\",\n\n\t\"system.process_id\":                           \"進程ID\",\n\t\"system.golang_version\":                       \"Golang版本\",\n\t\"system.server_uptime\":                        \"服務運行時間\",\n\t\"system.current_goroutine\":                    \"當前 Goroutines 數量\",\n\t\"system.current_memory_usage\":                 \"當前內存使用量\",\n\t\"system.total_memory_allocated\":               \"所有被分配的內存\",\n\t\"system.memory_obtained\":                      \"內存占用量\",\n\t\"system.pointer_lookup_times\":                 \"指針查找次數\",\n\t\"system.memory_allocate_times\":                \"內存分配次數\",\n\t\"system.memory_free_times\":                    \"內存釋放次數\",\n\t\"system.current_heap_usage\":                   \"當前 Heap 內存使用量\",\n\t\"system.heap_memory_obtained\":                 \"Heap 內存占用量\",\n\t\"system.heap_memory_idle\":                     \"Heap 內存空閑量\",\n\t\"system.heap_memory_in_use\":                   \"正在使用的 Heap 內存\",\n\t\"system.heap_memory_released\":                 \"被釋放的 Heap 內存\",\n\t\"system.heap_objects\":                         \"Heap 對象數量\",\n\t\"system.bootstrap_stack_usage\":                \"啟動 Stack 使用量\",\n\t\"system.stack_memory_obtained\":                \"被分配的 Stack 內存\",\n\t\"system.mspan_structures_usage\":               \"MSpan 結構內存使用量\",\n\t\"system.mspan_structures_obtained\":            \"被分配的 MSpan 結構內存\",\n\t\"system.mcache_structures_usage\":              \"MCache 結構內存使用量\",\n\t\"system.mcache_structures_obtained\":           \"被分配的 MCache 結構內存\",\n\t\"system.profiling_bucket_hash_table_obtained\": \"被分配的剖析哈希表內存\",\n\t\"system.gc_metadata_obtained\":                 \"被分配的 GC 元數據內存\",\n\t\"system.other_system_allocation_obtained\":     \"其它被分配的系統內存\",\n\t\"system.next_gc_recycle\":                      \"下次 GC 內存回收量\",\n\t\"system.last_gc_time\":                         \"距離上次 GC 時間\",\n\t\"system.total_gc_time\":                        \"GC 執行時間總量\",\n\t\"system.total_gc_pause\":                       \"GC 暫停時間總量\",\n\t\"system.last_gc_pause\":                        \"上次 GC 暫停時間\",\n\t\"system.gc_times\":                             \"GC 執行次數\",\n\n\t\"system.cpu_logical_core\": \"cpu邏輯核數\",\n\t\"system.cpu_core\":         \"cpu物理核數\",\n\t\"system.os_platform\":      \"系統平臺\",\n\t\"system.os_family\":        \"系統家族\",\n\t\"system.os_version\":       \"系統版本\",\n\t\"system.load1\":            \"1分鐘內負載\",\n\t\"system.load5\":            \"5分鐘內負載\",\n\t\"system.load15\":           \"15分鐘內負載\",\n\t\"system.mem_total\":        \"總內存\",\n\t\"system.mem_available\":    \"可用內存\",\n\t\"system.mem_used\":         \"使用內存\",\n\n\t\"system.app_name\":         \"應用名\",\n\t\"system.go_admin_version\": \"應用版本\",\n\t\"system.theme_name\":       \"主題\",\n\t\"system.theme_version\":    \"主題版本\",\n\n\t\"tool.tool\":                   \"工具\",\n\t\"tool.table\":                  \"表格\",\n\t\"tool.connection\":             \"連接\",\n\t\"tool.package\":                \"包名\",\n\t\"tool.output\":                 \"輸出路徑\",\n\t\"tool.output path is empty\":   \"輸出路徑為空\",\n\t\"tool.field\":                  \"字段名\",\n\t\"tool.title\":                  \"標題\",\n\t\"tool.field name\":             \"字段名\",\n\t\"tool.db type\":                \"數據類型\",\n\t\"tool.form type\":              \"表單類型\",\n\t\"tool.generate table model\":   \"生成CRUD模型\",\n\t\"tool.primarykey\":             \"主鍵\",\n\t\"tool.field filterable\":       \"可篩選\",\n\t\"tool.field sortable\":         \"可排序\",\n\t\"tool.yes\":                    \"是\",\n\t\"tool.no\":                     \"否\",\n\t\"tool.generate success\":       \"生成成功\",\n\t\"tool.hide filter area\":       \"隱藏篩選框\",\n\t\"tool.use absolute path\":      \"使用絕對路徑\",\n\t\"tool.hide\":                   \"隱藏\",\n\t\"tool.show\":                   \"顯示\",\n\t\"tool.display\":                \"顯示\",\n\t\"tool.basic info\":             \"基本信息\",\n\t\"tool.table info\":             \"表格信息\",\n\t\"tool.form info\":              \"表單信息\",\n\t\"tool.field editable\":         \"允許編輯\",\n\t\"tool.field can add\":          \"允許新增\",\n\t\"tool.info field editable\":    \"可編輯\",\n\t\"tool.extra import package\":   \"導入包\",\n\t\"tool.field default\":          \"默認值\",\n\t\"tool.filter area\":            \"篩選框\",\n\t\"tool.new button\":             \"新建按鈕\",\n\t\"tool.export button\":          \"導出按鈕\",\n\t\"tool.edit button\":            \"編輯按鈕\",\n\t\"tool.delete button\":          \"刪除按鈕\",\n\t\"tool.detail button\":          \"詳情按鈕\",\n\t\"tool.filter button\":          \"篩選按鈕\",\n\t\"tool.row selector\":           \"列選擇按鈕\",\n\t\"tool.pagination\":             \"分頁\",\n\t\"tool.query info\":             \"查詢信息\",\n\t\"tool.filter form layout\":     \"篩選表單布局\",\n\t\"tool.continue edit checkbox\": \"繼續編輯按鈕\",\n\t\"tool.continue new checkbox\":  \"繼續新增按鈕\",\n\t\"tool.reset button\":           \"重設按鈕\",\n\t\"tool.back button\":            \"返回按鈕\",\n\t\"tool.generate\":               \"生成\",\n\t\"tool.generated tables\":       \"生成過的表格\",\n\t\"tool.description\":            \"描述\",\n\t\"tool.label\":                  \"標簽\",\n\t\"tool.image\":                  \"圖片\",\n\t\"tool.bool\":                   \"布爾\",\n\t\"tool.link\":                   \"鏈接\",\n\t\"tool.fileSize\":               \"文件大小\",\n\t\"tool.date\":                   \"日期\",\n\t\"tool.icon\":                   \"Icon\",\n\t\"tool.dot\":                    \"標點\",\n\t\"tool.progressBar\":            \"進度條\",\n\t\"tool.loading\":                \"Loading\",\n\t\"tool.downLoadable\":           \"可下載\",\n\t\"tool.copyable\":               \"可復制\",\n\t\"tool.carousel\":               \"圖片輪播\",\n\t\"tool.qrcode\":                 \"二維碼\",\n\t\"tool.field hide\":             \"隱藏\",\n\t\"tool.field display\":          \"顯示\",\n\t\"tool.table permission\":       \"生成表格權限\",\n\t\"tool.extra code\":             \"額外代碼\",\n\n\t\"tool.field display normal\":     \"顯示\",\n\t\"tool.field diplay hide\":        \"隱藏\",\n\t\"tool.field diplay edit hide\":   \"編輯隱藏\",\n\t\"tool.field diplay create hide\": \"新建隱藏\",\n\n\t\"tool.detail display\":             \"顯示\",\n\t\"tool.detail info\":                \"詳情頁信息\",\n\t\"tool.follow list page\":           \"跟隨列表頁\",\n\t\"tool.inherit from list page\":     \"繼承列表頁\",\n\t\"tool.independent from list page\": \"獨立\",\n\n\t\"tool.generate table model success\": \"生成成功\",\n\t\"tool.generate table model fail\":    \"生成失敗\",\n\n\t\"generator.query\":                 \"查詢\",\n\t\"generator.show edit form page\":   \"編輯頁顯示\",\n\t\"generator.show create form page\": \"新建記錄頁顯示\",\n\t\"generator.edit\":                  \"編輯\",\n\t\"generator.create\":                \"新建\",\n\t\"generator.delete\":                \"刪除\",\n\t\"generator.export\":                \"導出\",\n\n\t\"plugin.plugin\":                         \"插件\",\n\t\"plugin.plugin detail\":                  \"插件詳情\",\n\t\"plugin.introduction\":                   \"介紹\",\n\t\"plugin.website\":                        \"網站\",\n\t\"plugin.version\":                        \"版本\",\n\t\"plugin.created at\":                     \"創建日期\",\n\t\"plugin.updated at\":                     \"更新日期\",\n\t\"plugin.provided by %s\":                 \"由 %s 提供\",\n\t\"plugin.upgrade\":                        \"升級\",\n\t\"plugin.install\":                        \"安裝\",\n\t\"plugin.info\":                           \"詳細信息\",\n\t\"plugin.download\":                       \"下载\",\n\t\"plugin.buy\":                            \"購買\",\n\t\"plugin.downloading\":                    \"下载中\",\n\t\"plugin.login\":                          \"登錄\",\n\t\"plugin.login to goadmin member system\": \"登錄到GoAdmin會員系統\",\n\t\"plugin.account\":                        \"賬戶名\",\n\t\"plugin.password\":                       \"密碼\",\n\t\"plugin.learn more\":                     \"了解更多\",\n\n\t\"plugin.no account? click %s here %s to register.\":    \"沒有賬號？點擊%s這裏%s註冊。\",\n\t\"plugin.download fail, wrong name\":                    \"下載失敗，錯誤的參數\",\n\t\"plugin.change to debug mode first\":                   \"先切換到debug模式\",\n\t\"plugin.download fail, plugin not exist\":              \"下載失敗，插件不存在\",\n\t\"plugin.download fail\":                                \"下載失敗\",\n\t\"plugin.golang develop environment does not exist\":    \"golang開發環境不存在\",\n\t\"plugin.download success, restart to install\":         \"下載成功，重啟程序進行安裝\",\n\t\"plugin.restart to install\":                           \"重啟程序進行安裝\",\n\t\"plugin.can not connect to the goadmin remote server\": \"不能連接到GoAdmin遠程服務器，請檢查您的網絡連接。\",\n\n\t\"admin.basic admin\": \"基礎Admin\",\n\t\"admin.a built-in plugins of goadmin which help you to build a crud manager platform quickly.\": \"壹個內置GoAdmin插件，幫助您快速搭建curd簡易管理後臺。\",\n\t\"admin.official\": \"GoAdmin官方\",\n\n\t\"search\":           \"搜索\",\n\t\"reload succeeded\": \"載入成功\",\n\t\"showing <b>%s</b> to <b>%s</b> of <b>%s</b> entries\": \"顯示第 <b>%s</b> 到第 <b>%s</b> 條記錄，總共 <b>%s</b> 條記錄\",\n\t\"site info\":               \"運行信息\",\n\t\"menus\":                   \"菜單\",\n\t\"tool.code generate tool\": \"代碼生成器\",\n\t\"del\":                     \"刪除\",\n\t\"site setting\":            \"網站設置\",\n\t\"code generate tool\":      \"代碼生成器\",\n\t\"managers manage\":         \"管理員管理\",\n\t\"system.site info\":        \"運行信息\",\n\t\"view\":                    \"查看\",\n}\n"
  },
  {
    "path": "modules/logger/logger.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage logger\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/trace\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\"\n\t\"gopkg.in/natefinch/lumberjack.v2\"\n)\n\nvar (\n\tdefaultEncoderCfg = EncoderCfg{\n\t\tTimeKey:       \"ts\",\n\t\tLevelKey:      \"level\",\n\t\tNameKey:       \"logger\",\n\t\tCallerKey:     \"caller\",\n\t\tMessageKey:    \"msg\",\n\t\tStacktraceKey: \"stacktrace\",\n\t\tLevel:         \"capitalColor\",\n\t\tTime:          \"ISO8601\",\n\t\tDuration:      \"seconds\",\n\t\tCaller:        \"short\",\n\t\tEncoding:      \"console\",\n\t}\n\tdefaultRotateCfg = RotateCfg{\n\t\tMaxSize:    10,\n\t\tMaxBackups: 5,\n\t\tMaxAge:     30,\n\t\tCompress:   false,\n\t}\n\n\tlogger = &Logger{\n\t\trotate:  defaultRotateCfg,\n\t\tencoder: defaultEncoderCfg,\n\t\tLevel:   zapcore.InfoLevel,\n\t}\n\n\tinfoLevelEnabler = zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {\n\t\treturn lvl == zapcore.InfoLevel\n\t})\n\n\terrorLevelEnabler = zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {\n\t\treturn lvl >= zapcore.ErrorLevel\n\t})\n\n\taccessLevelEnabler = zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {\n\t\treturn lvl == zapcore.WarnLevel\n\t})\n)\n\nfunc init() {\n\tlogger.Init()\n}\n\ntype Logger struct {\n\tlogger        *zap.Logger\n\tsugaredLogger *zap.SugaredLogger\n\n\tinfoLogOff   bool\n\terrorLogOff  bool\n\taccessLogOff bool\n\n\taccessAssetsLogOff bool\n\n\tdebug bool\n\n\tsqlLogOpen bool\n\n\tinfoLogPath   string\n\terrorLogPath  string\n\taccessLogPath string\n\n\trotate  RotateCfg\n\tencoder EncoderCfg\n\n\tLevel zapcore.Level\n}\n\ntype EncoderCfg struct {\n\tTimeKey       string\n\tLevelKey      string\n\tNameKey       string\n\tCallerKey     string\n\tMessageKey    string\n\tStacktraceKey string\n\tLevel         string\n\tTime          string\n\tDuration      string\n\tCaller        string\n\tEncoding      string\n}\n\ntype RotateCfg struct {\n\tMaxSize    int\n\tMaxBackups int\n\tMaxAge     int\n\tCompress   bool\n}\n\nfunc (l *Logger) Init() {\n\tzapLogger := zap.New(zapcore.NewTee(\n\t\tzapcore.NewCore(l.getEncoder(l.encoder.LevelKey), l.getLogWriter(l.infoLogPath), infoLevelEnabler),\n\t\tzapcore.NewCore(l.getEncoder(l.encoder.LevelKey), l.getLogWriter(l.errorLogPath), errorLevelEnabler),\n\t\tzapcore.NewCore(l.getEncoder(\"\"), l.getLogWriter(l.accessLogPath), accessLevelEnabler),\n\t), zap.AddCaller(), zap.AddCallerSkip(1), zap.AddStacktrace(errorLevelEnabler))\n\tl.sugaredLogger = zapLogger.Sugar()\n\tl.logger = zapLogger\n}\n\nfunc (l *Logger) getEncoder(levelKey string) zapcore.Encoder {\n\n\tvar (\n\t\ttimeEncoder     = new(zapcore.TimeEncoder)\n\t\tdurationEncoder = new(zapcore.DurationEncoder)\n\t\tcallerEncoder   = new(zapcore.CallerEncoder)\n\t\tnameEncoder     = new(zapcore.NameEncoder)\n\t\tlevelEncoder    = new(zapcore.LevelEncoder)\n\t)\n\n\t_ = timeEncoder.UnmarshalText([]byte(l.encoder.Time))\n\t_ = durationEncoder.UnmarshalText([]byte(l.encoder.Duration))\n\t_ = callerEncoder.UnmarshalText([]byte(l.encoder.Caller))\n\t_ = nameEncoder.UnmarshalText([]byte(\"full\"))\n\t_ = levelEncoder.UnmarshalText([]byte(l.encoder.Level))\n\n\tencoderConfig := zapcore.EncoderConfig{\n\t\tTimeKey:        l.encoder.TimeKey,\n\t\tLevelKey:       levelKey,\n\t\tNameKey:        l.encoder.NameKey,\n\t\tCallerKey:      l.encoder.CallerKey,\n\t\tMessageKey:     l.encoder.MessageKey,\n\t\tStacktraceKey:  l.encoder.StacktraceKey,\n\t\tLineEnding:     zapcore.DefaultLineEnding,\n\t\tEncodeLevel:    *levelEncoder,\n\t\tEncodeTime:     *timeEncoder,\n\t\tEncodeDuration: *durationEncoder,\n\t\tEncodeCaller:   *callerEncoder,\n\t\tEncodeName:     *nameEncoder,\n\t}\n\n\treturn filterZapEncoder(l.encoder.Encoding, encoderConfig)\n}\n\nfunc (l *Logger) getLogWriter(path string) zapcore.WriteSyncer {\n\tif path != \"\" {\n\t\tlumberJackLogger := &lumberjack.Logger{\n\t\t\tFilename:   path,\n\t\t\tMaxSize:    l.rotate.MaxSize,\n\t\t\tMaxBackups: l.rotate.MaxBackups,\n\t\t\tMaxAge:     l.rotate.MaxAge,\n\t\t\tCompress:   l.rotate.Compress,\n\t\t}\n\t\tif l.debug {\n\t\t\treturn zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(lumberJackLogger))\n\t\t}\n\t\treturn zapcore.AddSync(lumberJackLogger)\n\t}\n\treturn zapcore.AddSync(os.Stdout)\n}\n\nfunc (l *Logger) SetRotate(cfg RotateCfg) {\n\tif cfg.MaxSize != 0 && cfg.MaxAge != 0 && cfg.MaxBackups != 0 {\n\t\tl.rotate = cfg\n\t}\n}\n\nfunc (l *Logger) SetEncoder(cfg EncoderCfg) {\n\tcfg.TimeKey = utils.SetDefault(cfg.TimeKey, \"\", defaultEncoderCfg.TimeKey)\n\tcfg.LevelKey = utils.SetDefault(cfg.LevelKey, \"\", defaultEncoderCfg.LevelKey)\n\tcfg.NameKey = utils.SetDefault(cfg.NameKey, \"\", defaultEncoderCfg.NameKey)\n\tcfg.CallerKey = utils.SetDefault(cfg.CallerKey, \"\", defaultEncoderCfg.CallerKey)\n\tcfg.MessageKey = utils.SetDefault(cfg.MessageKey, \"\", defaultEncoderCfg.MessageKey)\n\tcfg.StacktraceKey = utils.SetDefault(cfg.StacktraceKey, \"\", defaultEncoderCfg.StacktraceKey)\n\tcfg.Level = utils.SetDefault(cfg.Level, \"\", defaultEncoderCfg.Level)\n\tcfg.Time = utils.SetDefault(cfg.Time, \"\", defaultEncoderCfg.Time)\n\tcfg.Duration = utils.SetDefault(cfg.Duration, \"\", defaultEncoderCfg.Duration)\n\tcfg.Caller = utils.SetDefault(cfg.Caller, \"\", defaultEncoderCfg.Caller)\n\tcfg.Encoding = utils.SetDefault(cfg.Encoding, \"\", defaultEncoderCfg.Encoding)\n\tl.encoder = cfg\n}\n\ntype Config struct {\n\tInfoLogOff   bool\n\tErrorLogOff  bool\n\tAccessLogOff bool\n\n\tSqlLogOpen bool\n\n\tInfoLogPath   string\n\tErrorLogPath  string\n\tAccessLogPath string\n\n\tAccessAssetsLogOff bool\n\n\tRotate RotateCfg\n\tEncode EncoderCfg\n\n\tLevel int8\n\n\tDebug bool\n}\n\nfunc InitWithConfig(cfg Config) {\n\tlogger.infoLogPath = cfg.InfoLogPath\n\tlogger.infoLogOff = cfg.InfoLogOff\n\tlogger.errorLogPath = cfg.ErrorLogPath\n\tlogger.errorLogOff = cfg.ErrorLogOff\n\tlogger.accessLogPath = cfg.AccessLogPath\n\tlogger.accessLogOff = cfg.AccessLogOff\n\tlogger.sqlLogOpen = cfg.SqlLogOpen\n\tlogger.accessAssetsLogOff = cfg.AccessAssetsLogOff\n\tlogger.debug = cfg.Debug\n\tlogger.SetRotate(cfg.Rotate)\n\tlogger.SetEncoder(cfg.Encode)\n\tlogger.Level = filterZapAtomicLevelByViper(cfg.Level)\n\tlogger.Init()\n}\n\nfunc SetRotate(cfg RotateCfg) {\n\tlogger.rotate = cfg\n\tlogger.Init()\n}\n\n// OpenSQLLog set the sqlLogOpen true.\nfunc OpenSQLLog() {\n\tlogger.sqlLogOpen = true\n}\n\n// Debug print the debug message.\nfunc Debug(info ...interface{}) {\n\tif !logger.infoLogOff {\n\t\tif logger.Level <= zapcore.DebugLevel {\n\t\t\tlogger.sugaredLogger.Info(info...)\n\t\t}\n\t}\n}\n\n// Debugf print the debug message.\nfunc Debugf(template string, args ...interface{}) {\n\tif !logger.infoLogOff && logger.Level <= zapcore.DebugLevel {\n\t\tlogger.sugaredLogger.Infof(template, args...)\n\t}\n}\n\n// Info print the info message.\nfunc Info(info ...interface{}) {\n\tif !logger.infoLogOff && logger.Level <= zapcore.InfoLevel {\n\t\tlogger.sugaredLogger.Info(info...)\n\t}\n}\n\n// InfoCtx print the info message with ctx.\nfunc InfoCtx(ctx *context.Context, format string, args ...interface{}) {\n\tif !logger.infoLogOff && logger.Level <= zapcore.InfoLevel {\n\t\tlogCtx(ctx, logger.logger.Info, format, args...)\n\t}\n}\n\ntype logFunc func(msg string, fields ...zapcore.Field)\n\nfunc logCtx(ctx *context.Context, logFunc logFunc, format string, args ...interface{}) {\n\tlogFunc(fmt.Sprintf(format, args...), zap.String(\"traceID\", trace.GetTraceID(ctx)))\n}\n\n// Info print the info message.\nfunc Infof(template string, args ...interface{}) {\n\tif !logger.infoLogOff && logger.Level <= zapcore.InfoLevel {\n\t\tlogger.sugaredLogger.Infof(template, args...)\n\t}\n}\n\n// Warn print the warning message.\nfunc Warn(info ...interface{}) {\n\tif !logger.infoLogOff && logger.Level <= zapcore.WarnLevel {\n\t\tlogger.sugaredLogger.Warn(info...)\n\t}\n}\n\n// WarnCtx print the warning message with ctx.\nfunc WarnCtx(ctx *context.Context, format string, args ...interface{}) {\n\tif !logger.infoLogOff && logger.Level <= zapcore.WarnLevel {\n\t\tlogCtx(ctx, logger.logger.Warn, format, args...)\n\t}\n}\n\n// Warnf print the warning message.\nfunc Warnf(template string, args ...interface{}) {\n\tif !logger.infoLogOff && logger.Level <= zapcore.WarnLevel {\n\t\tlogger.sugaredLogger.Warnf(template, args...)\n\t}\n}\n\n// Error print the error message.\nfunc Error(err ...interface{}) {\n\tif !logger.errorLogOff && logger.Level <= zapcore.ErrorLevel {\n\t\tlogger.sugaredLogger.Error(err...)\n\t}\n}\n\n// ErrorCtx print the error message with ctx.\nfunc ErrorCtx(ctx *context.Context, format string, args ...interface{}) {\n\tif !logger.errorLogOff && logger.Level <= zapcore.ErrorLevel {\n\t\tlogCtx(ctx, logger.logger.Error, format, args...)\n\t}\n}\n\n// Errorf print the error message.\nfunc Errorf(template string, args ...interface{}) {\n\tif !logger.errorLogOff && logger.Level <= zapcore.ErrorLevel {\n\t\tlogger.sugaredLogger.Errorf(template, args...)\n\t}\n}\n\n// Fatal print the fatal message.\nfunc Fatal(info ...interface{}) {\n\tif !logger.errorLogOff && logger.Level <= zapcore.ErrorLevel {\n\t\tlogger.sugaredLogger.Fatal(info...)\n\t}\n}\n\n// FatalCtx print the fatal message with ctx.\nfunc FatalCtx(ctx *context.Context, format string, args ...interface{}) {\n\tif !logger.errorLogOff && logger.Level <= zapcore.FatalLevel {\n\t\tlogCtx(ctx, logger.logger.Fatal, format, args...)\n\t}\n}\n\n// Fatalf print the fatal message.\nfunc Fatalf(template string, args ...interface{}) {\n\tif !logger.errorLogOff && logger.Level <= zapcore.ErrorLevel {\n\t\tlogger.sugaredLogger.Fatalf(template, args...)\n\t}\n}\n\n// Fatal print the panic message.\nfunc Panic(info ...interface{}) {\n\tlogger.sugaredLogger.Panic(info...)\n}\n\n// PanicCtx print the panic message with ctx.\nfunc PanicCtx(ctx *context.Context, format string, args ...interface{}) {\n\tlogCtx(ctx, logger.logger.Panic, format, args...)\n}\n\n// Panicf print the panic message.\nfunc Panicf(template string, args ...interface{}) {\n\tlogger.sugaredLogger.Panicf(template, args...)\n}\n\n// Access print the access message.\nfunc Access(ctx *context.Context) {\n\tif !logger.accessLogOff && logger.Level <= zapcore.InfoLevel {\n\t\tif logger.accessAssetsLogOff {\n\t\t\tif filepath.Ext(ctx.Path()) == \"\" {\n\t\t\t\tlogger.logger.Info(\"[GoAdmin] access log\",\n\t\t\t\t\tzap.String(\"traceID\", trace.GetTraceID(ctx)),\n\t\t\t\t\tzap.String(\"statuscode\", strconv.Itoa(ctx.Response.StatusCode)),\n\t\t\t\t\tzap.String(\"method\", string(ctx.Method())),\n\t\t\t\t\tzap.String(\"path\", ctx.Path()))\n\t\t\t}\n\t\t} else {\n\t\t\tlogger.logger.Info(\"[GoAdmin] access log\",\n\t\t\t\tzap.String(\"traceID\", trace.GetTraceID(ctx)),\n\t\t\t\tzap.String(\"statuscode\", strconv.Itoa(ctx.Response.StatusCode)),\n\t\t\t\tzap.String(\"method\", string(ctx.Method())),\n\t\t\t\tzap.String(\"path\", ctx.Path()))\n\t\t}\n\t}\n}\n\n// LogSQL print the sql info message.\nfunc LogSQL(statement string, args []interface{}) {\n\tif !logger.infoLogOff && logger.sqlLogOpen && statement != \"\" {\n\t\tif logger.Level <= zapcore.InfoLevel {\n\t\t\tlogger.sugaredLogger.With(\"statement\", statement, \"args\", args).Info(\"[GoAdmin]\")\n\t\t}\n\t}\n}\n\nfunc filterZapEncoder(encoding string, encoderConfig zapcore.EncoderConfig) zapcore.Encoder {\n\tvar encoder zapcore.Encoder\n\tswitch encoding {\n\tdefault:\n\t\tencoder = zapcore.NewConsoleEncoder(encoderConfig)\n\tcase \"json\":\n\t\tencoder = zapcore.NewJSONEncoder(encoderConfig)\n\tcase \"console\":\n\t\tencoder = zapcore.NewConsoleEncoder(encoderConfig)\n\t}\n\treturn encoder\n}\n\nfunc filterZapAtomicLevelByViper(level int8) zapcore.Level {\n\tvar atomViper zapcore.Level\n\tswitch level {\n\tdefault:\n\t\tatomViper = zap.InfoLevel\n\tcase -1:\n\t\tatomViper = zap.DebugLevel\n\tcase 0:\n\t\tatomViper = zap.InfoLevel\n\tcase 1:\n\t\tatomViper = zap.WarnLevel\n\tcase 2:\n\t\tatomViper = zap.ErrorLevel\n\t}\n\treturn atomViper\n}\n"
  },
  {
    "path": "modules/logger/logger_test.go",
    "content": "package logger\n\nimport \"testing\"\n\nfunc TestInfo(t *testing.T) {\n\tInfo(\"test\")\n}\n"
  },
  {
    "path": "modules/menu/menu.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage menu\n\nimport (\n\t\"html/template\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n)\n\n// Item is an menu item.\ntype Item struct {\n\tName         string `json:\"name\"`\n\tID           string `json:\"id\"`\n\tUrl          string `json:\"url\"`\n\tIsLinkUrl    bool   `json:\"isLinkUrl\"`\n\tIcon         string `json:\"icon\"`\n\tHeader       string `json:\"header\"`\n\tActive       string `json:\"active\"`\n\tChildrenList []Item `json:\"childrenList\"`\n}\n\n// Menu contains list of menu items and other info.\ntype Menu struct {\n\tList        []Item              `json:\"list\"`\n\tOptions     []map[string]string `json:\"options\"`\n\tMaxOrder    int64               `json:\"maxOrder\"`\n\tPluginName  string              `json:\"pluginName\"`\n\tForceUpdate bool                `json:\"forceUpdate\"`\n}\n\nfunc (menu *Menu) GetUpdateJS(updateFlag bool) template.JS {\n\tif !updateFlag {\n\t\treturn \"\"\n\t}\n\n\tforceUpdate := \"false\"\n\tif menu.ForceUpdate {\n\t\tforceUpdate = \"true\"\n\t}\n\treturn template.JS(`$(function () {\n\tlet curMenuPlug = $(\".main-sidebar section.sidebar ul.sidebar-menu\").attr(\"data-plug\");\n    if (curMenuPlug !== '` + menu.PluginName + `' || ` + forceUpdate + `) {\n        $(\".main-sidebar section.sidebar\").html($(\"#sidebar-menu-tmpl\").html())\n    }\n});`)\n}\n\n// SetMaxOrder set the max order of menu.\nfunc (menu *Menu) SetMaxOrder(order int64) {\n\tmenu.MaxOrder = order\n}\n\n// AddMaxOrder add the max order of menu.\nfunc (menu *Menu) AddMaxOrder() {\n\tmenu.MaxOrder++\n}\n\n// SetActiveClass set the active class of menu.\nfunc (menu *Menu) SetActiveClass(path string) *Menu {\n\n\treg, _ := regexp.Compile(`\\?(.*)`)\n\tpath = reg.ReplaceAllString(path, \"\")\n\n\tfor i := 0; i < len(menu.List); i++ {\n\t\tmenu.List[i].Active = \"\"\n\t}\n\n\tfor i := 0; i < len(menu.List); i++ {\n\t\tif menu.List[i].Url == path && len(menu.List[i].ChildrenList) == 0 {\n\t\t\tmenu.List[i].Active = \"active\"\n\t\t\treturn menu\n\t\t}\n\n\t\tfor j := 0; j < len(menu.List[i].ChildrenList); j++ {\n\t\t\tif menu.List[i].ChildrenList[j].Url == path {\n\t\t\t\tmenu.List[i].Active = \"active\"\n\t\t\t\tmenu.List[i].ChildrenList[j].Active = \"active\"\n\t\t\t\treturn menu\n\t\t\t}\n\n\t\t\tmenu.List[i].Active = \"\"\n\t\t\tmenu.List[i].ChildrenList[j].Active = \"\"\n\t\t}\n\t}\n\n\treturn menu\n}\n\n// FormatPath get template.HTML for front-end.\nfunc (menu Menu) FormatPath() template.HTML {\n\tres := template.HTML(``)\n\tfor i := 0; i < len(menu.List); i++ {\n\t\tif menu.List[i].Active != \"\" {\n\t\t\tif menu.List[i].Url != \"#\" && menu.List[i].Url != \"\" && len(menu.List[i].ChildrenList) > 0 {\n\t\t\t\tres += template.HTML(`<li><a href=\"` + menu.List[i].Url + `\">` + menu.List[i].Name + `</a></li>`)\n\t\t\t} else {\n\t\t\t\tres += template.HTML(`<li>` + menu.List[i].Name + `</li>`)\n\t\t\t\tif len(menu.List[i].ChildrenList) == 0 {\n\t\t\t\t\treturn res\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor j := 0; j < len(menu.List[i].ChildrenList); j++ {\n\t\t\t\tif menu.List[i].ChildrenList[j].Active != \"\" {\n\t\t\t\t\treturn res + template.HTML(`<li>`+menu.List[i].ChildrenList[j].Name+`</li>`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn res\n}\n\n// GetEditMenuList return menu items list.\nfunc (menu *Menu) GetEditMenuList() []Item {\n\treturn menu.List\n}\n\ntype NewMenuData struct {\n\tParentId   int64  `json:\"parent_id\"`\n\tType       int64  `json:\"type\"`\n\tOrder      int64  `json:\"order\"`\n\tTitle      string `json:\"title\"`\n\tIcon       string `json:\"icon\"`\n\tPluginName string `json:\"plugin_name\"`\n\tUri        string `json:\"uri\"`\n\tHeader     string `json:\"header\"`\n\tUuid       string `json:\"uuid\"`\n}\n\nfunc NewMenu(conn db.Connection, data NewMenuData) (int64, error) {\n\tmaxOrder := data.Order\n\tcheckOrder, _ := db.WithDriver(conn).Table(\"goadmin_menu\").\n\t\tWhere(\"plugin_name\", \"=\", data.PluginName).\n\t\tOrderBy(\"order\", \"desc\").\n\t\tFirst()\n\n\tif checkOrder != nil {\n\t\tmaxOrder = checkOrder[\"order\"].(int64)\n\t}\n\n\tid, err := db.WithDriver(conn).Table(\"goadmin_menu\").\n\t\tInsert(dialect.H{\n\t\t\t\"parent_id\":   data.ParentId,\n\t\t\t\"type\":        data.Type,\n\t\t\t\"order\":       maxOrder,\n\t\t\t\"title\":       data.Title,\n\t\t\t\"uuid\":        data.Uuid,\n\t\t\t\"icon\":        data.Icon,\n\t\t\t\"plugin_name\": data.PluginName,\n\t\t\t\"uri\":         data.Uri,\n\t\t\t\"header\":      data.Header,\n\t\t})\n\tif !db.CheckError(err, db.INSERT) {\n\t\treturn id, nil\n\t}\n\treturn id, err\n}\n\n// GetGlobalMenu return Menu of given user model.\nfunc GetGlobalMenu(user models.UserModel, conn db.Connection, lang string, pluginNames ...string) *Menu {\n\n\tvar (\n\t\tmenus      []map[string]interface{}\n\t\tmenuOption = make([]map[string]string, 0)\n\t\tplugName   = \"\"\n\t)\n\n\tif len(pluginNames) > 0 {\n\t\tplugName = pluginNames[0]\n\t}\n\n\tuser.WithRoles().WithMenus()\n\n\tif user.IsSuperAdmin() {\n\t\tmenus, _ = db.WithDriver(conn).Table(\"goadmin_menu\").\n\t\t\tWhere(\"id\", \">\", 0).\n\t\t\tWhere(\"plugin_name\", \"=\", plugName).\n\t\t\tOrderBy(\"order\", \"asc\").\n\t\t\tAll()\n\t} else {\n\n\t\tvar ids []interface{}\n\t\tfor i := 0; i < len(user.MenuIds); i++ {\n\t\t\tids = append(ids, user.MenuIds[i])\n\t\t}\n\n\t\tmenus, _ = db.WithDriver(conn).Table(\"goadmin_menu\").\n\t\t\tWhereIn(\"id\", ids).\n\t\t\tWhere(\"plugin_name\", \"=\", plugName).\n\t\t\tOrderBy(\"order\", \"asc\").\n\t\t\tAll()\n\t}\n\n\tvar title string\n\tfor i := 0; i < len(menus); i++ {\n\n\t\ttitle = language.GetWithLang(menus[i][\"title\"].(string), lang)\n\t\tmenuOption = append(menuOption, map[string]string{\n\t\t\t\"id\":    strconv.FormatInt(menus[i][\"id\"].(int64), 10),\n\t\t\t\"title\": title,\n\t\t})\n\t}\n\n\tmenuList := constructMenuTree(menus, 0, lang)\n\tmaxOrder := int64(0)\n\tif len(menus) > 0 {\n\t\tmaxOrder = menus[len(menus)-1][\"parent_id\"].(int64)\n\t}\n\n\treturn &Menu{\n\t\tList:       menuList,\n\t\tOptions:    menuOption,\n\t\tMaxOrder:   maxOrder,\n\t\tPluginName: plugName,\n\t}\n}\n\nfunc constructMenuTree(menus []map[string]interface{}, parentID int64, lang string) []Item {\n\n\tbranch := make([]Item, 0)\n\n\tvar title string\n\tfor j := 0; j < len(menus); j++ {\n\t\tif parentID == menus[j][\"parent_id\"].(int64) {\n\t\t\tif menus[j][\"type\"].(int64) == 1 {\n\t\t\t\ttitle = language.Get(menus[j][\"title\"].(string))\n\t\t\t} else {\n\t\t\t\ttitle = menus[j][\"title\"].(string)\n\t\t\t}\n\n\t\t\theader, _ := menus[j][\"header\"].(string)\n\n\t\t\turi := menus[j][\"uri\"].(string)\n\n\t\t\tif lang != \"\" {\n\t\t\t\tif strings.Contains(uri, \"?\") {\n\t\t\t\t\turi += \"&__ga_lang=\" + lang\n\t\t\t\t} else {\n\t\t\t\t\turi += \"?__ga_lang=\" + lang\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchild := Item{\n\t\t\t\tName:         title,\n\t\t\t\tID:           strconv.FormatInt(menus[j][\"id\"].(int64), 10),\n\t\t\t\tUrl:          uri,\n\t\t\t\tIcon:         menus[j][\"icon\"].(string),\n\t\t\t\tHeader:       header,\n\t\t\t\tActive:       \"\",\n\t\t\t\tChildrenList: constructMenuTree(menus, menus[j][\"id\"].(int64), lang),\n\t\t\t}\n\n\t\t\tbranch = append(branch, child)\n\t\t}\n\t}\n\n\treturn branch\n}\n"
  },
  {
    "path": "modules/menu/menu_test.go",
    "content": "package menu\n\nimport (\n\t\"testing\"\n\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc TestMenu_AddMaxOrder(t *testing.T) {\n\tmenus := Menu{\n\t\tMaxOrder: 0,\n\t}\n\tmenus.AddMaxOrder()\n\tassert.Equal(t, menus.MaxOrder, int64(1))\n}\n\nfunc TestMenu_SetMaxOrder(t *testing.T) {\n\tmenus := Menu{\n\t\tMaxOrder: 0,\n\t}\n\tmenus.SetMaxOrder(2)\n\tassert.Equal(t, menus.MaxOrder, int64(2))\n}\n\nfunc TestMenu_SetActiveClass(t *testing.T) {\n\tmenus := Menu{\n\t\tList: []Item{\n\t\t\t{\n\t\t\t\tName: \"item1\",\n\t\t\t\tID:   \"1\",\n\t\t\t\tUrl:  \"/item1\",\n\t\t\t\tIcon: \"icon\",\n\t\t\t}, {\n\t\t\t\tName: \"item2\",\n\t\t\t\tID:   \"2\",\n\t\t\t\tUrl:  \"/item2\",\n\t\t\t\tIcon: \"icon\",\n\t\t\t}, {\n\t\t\t\tName: \"item3\",\n\t\t\t\tID:   \"3\",\n\t\t\t\tUrl:  \"/item3\",\n\t\t\t\tIcon: \"icon\",\n\t\t\t}, {\n\t\t\t\tName: \"item4\",\n\t\t\t\tID:   \"4\",\n\t\t\t\tUrl:  \"/item4\",\n\t\t\t\tIcon: \"icon\",\n\t\t\t\tChildrenList: []Item{\n\t\t\t\t\t{\n\t\t\t\t\t\tName: \"item5\",\n\t\t\t\t\t\tID:   \"5\",\n\t\t\t\t\t\tUrl:  \"/item5\",\n\t\t\t\t\t\tIcon: \"icon\",\n\t\t\t\t\t}, {\n\t\t\t\t\t\tName: \"item6\",\n\t\t\t\t\t\tID:   \"6\",\n\t\t\t\t\t\tUrl:  \"/item6\",\n\t\t\t\t\t\tIcon: \"icon\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tOptions:  []map[string]string{},\n\t\tMaxOrder: 0,\n\t}\n\n\tmenus.SetActiveClass(\"/item3\")\n\n\tassert.Equal(t, menus.List[0].Active, \"\")\n\tassert.Equal(t, menus.List[1].Active, \"\")\n\tassert.Equal(t, menus.List[2].Active, \"active\")\n\tassert.Equal(t, menus.List[3].Active, \"\")\n\n\tmenus.SetActiveClass(\"/item5\")\n\n\tassert.Equal(t, menus.List[0].Active, \"\")\n\tassert.Equal(t, menus.List[1].Active, \"\")\n\tassert.Equal(t, menus.List[2].Active, \"\")\n\tassert.Equal(t, menus.List[3].Active, \"active\")\n\tassert.Equal(t, menus.List[3].ChildrenList[0].Active, \"active\")\n\tassert.Equal(t, menus.List[3].ChildrenList[1].Active, \"\")\n}\n"
  },
  {
    "path": "modules/page/page.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage page\n\nimport (\n\t\"bytes\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// SetPageContent set and return the panel of page content.\nfunc SetPageContent(ctx *context.Context, user models.UserModel, c func(ctx interface{}) (types.Panel, error), conn db.Connection) {\n\n\tpanel, err := c(ctx)\n\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"SetPageContent %+v\", err)\n\t\tpanel = template.WarningPanel(ctx, err.Error())\n\t}\n\n\ttmpl, tmplName := template.Get(ctx, config.GetTheme()).GetTemplate(ctx.IsPjax())\n\n\tctx.AddHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n\n\tbuf := new(bytes.Buffer)\n\n\terr = tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{\n\t\tUser:         user,\n\t\tMenu:         menu.GetGlobalMenu(user, conn, ctx.Lang()).SetActiveClass(config.URLRemovePrefix(ctx.Path())),\n\t\tPanel:        panel.GetContent(config.IsProductionEnvironment()),\n\t\tAssets:       template.GetComponentAssetImportHTML(ctx),\n\t\tTmplHeadHTML: template.Default(ctx).GetHeadHTML(),\n\t\tTmplFootJS:   template.Default(ctx).GetFootJS(),\n\t\tIframe:       ctx.IsIframe(),\n\t}))\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"SetPageContent %+v\", err)\n\t}\n\tctx.WriteString(buf.String())\n}\n"
  },
  {
    "path": "modules/remote_server/remote_server.go",
    "content": "package remote_server\n\nimport (\n\t\"encoding/json\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/system\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n)\n\nconst (\n\t// ServerHost    = \"http://localhost:8055\"\n\t// ServerHostApi = \"http://localhost:8055/api\"\n\n\tServerHost    = \"https://www.go-admin.cn\"\n\tServerHostApi = \"https://www.go-admin.cn/api\"\n)\n\ntype LoginRes struct {\n\tCode int `json:\"code\"`\n\tData struct {\n\t\tToken  string `json:\"token\"`\n\t\tName   string `json:\"name\"`\n\t\tExpire int64  `json:\"expire\"`\n\t} `json:\"data\"`\n\tMsg string `json:\"msg\"`\n}\n\nfunc Login(account, password string) LoginRes {\n\tvar resData LoginRes\n\n\treq, err := http.NewRequest(\"POST\", ServerHostApi+\"/signin\", strings.NewReader(`{\"account\":\"`+account+\n\t\t`\",\"password\":\"`+password+`\"}`))\n\n\tif err != nil {\n\t\tlogger.Error(\"login: \", err)\n\t\tresData.Code = 500\n\t\tresData.Msg = \"request error\"\n\t\treturn resData\n\t}\n\n\treq.Header.Add(\"Content-Type\", \"application/json\")\n\n\tres, err := http.DefaultClient.Do(req)\n\n\tif err != nil {\n\t\tlogger.Error(\"login: \", err)\n\t\tresData.Code = 500\n\t\tresData.Msg = \"request error\"\n\t\treturn resData\n\t}\n\tdefer func() {\n\t\t_ = res.Body.Close()\n\t}()\n\tbody, err := ioutil.ReadAll(res.Body)\n\tif err != nil {\n\t\tlogger.Error(\"login: \", err)\n\t\tresData.Code = 500\n\t\tresData.Msg = \"request error\"\n\t\treturn resData\n\t}\n\n\terr = json.Unmarshal(body, &resData)\n\tif err != nil {\n\t\tlogger.Error(\"login: \", err)\n\t\tresData.Code = 500\n\t\tresData.Msg = \"request error\"\n\t\treturn resData\n\t}\n\tif resData.Code != 0 {\n\t\tlogger.Error(\"login to remote GoAdmin server error: \", resData.Msg)\n\t\treturn resData\n\t}\n\treturn resData\n}\n\ntype GetDownloadURLRes struct {\n\tCode int `json:\"code\"`\n\tData struct {\n\t\tUrl      string `json:\"url\"`\n\t\tExtraUrl string `json:\"extra_url\"`\n\t} `json:\"data\"`\n\tMsg string `json:\"msg\"`\n}\n\nfunc GetDownloadURL(uuid, token string) (string, string, error) {\n\tvar resData GetDownloadURLRes\n\n\treq, err := http.NewRequest(\"GET\", ServerHostApi+\"/plugin/download\", strings.NewReader(`{\"uuid\":\"`+uuid+`\", \"version\":\"`+system.Version()+`\"}`))\n\n\tif err != nil {\n\t\tlogger.Error(\"get plugin download url error: \", err)\n\t\treturn \"\", \"\", err\n\t}\n\n\treq.Header.Add(TokenKey, token)\n\treq.Header.Add(\"Content-Type\", \"application/json\")\n\n\tres, err := http.DefaultClient.Do(req)\n\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\tdefer func() {\n\t\t_ = res.Body.Close()\n\t}()\n\tbody, err := ioutil.ReadAll(res.Body)\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\n\terr = json.Unmarshal(body, &resData)\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\tif resData.Code != 0 {\n\t\treturn \"\", \"\", err\n\t}\n\treturn resData.Data.Url, resData.Data.ExtraUrl, nil\n}\n\nconst TokenKey = \"GOADMIN_OFFICIAL_SESS\"\n\ntype GetOnlineReq struct {\n\tPage       string `json:\"page\"`\n\tFree       string `json:\"free\"`\n\tPageSize   string `json:\"page_size\"`\n\tFilter     string `json:\"filter\"`\n\tOrder      string `json:\"order\"`\n\tLang       string `json:\"lang\"`\n\tCategoryId string `json:\"category_id\"`\n\tVersion    string `json:\"version\"`\n}\n\nfunc (req GetOnlineReq) Format() string {\n\tres := \"\"\n\tif req.Page != \"\" {\n\t\tres += \"page=\" + req.Page + \"&\"\n\t}\n\tif req.PageSize != \"\" {\n\t\tres += \"page_size=\" + req.PageSize + \"&\"\n\t}\n\tif req.Lang != \"\" {\n\t\tres += \"lang=\" + req.Lang + \"&\"\n\t}\n\tif req.Filter != \"\" {\n\t\tres += \"filter=\" + req.Filter + \"&\"\n\t}\n\tif req.Order != \"\" {\n\t\tres += \"order=\" + req.Order + \"&\"\n\t}\n\tif req.CategoryId != \"\" {\n\t\tres += \"category_id=\" + req.CategoryId + \"&\"\n\t}\n\tif req.Free != \"\" {\n\t\tres += \"free=\" + req.Free + \"&\"\n\t}\n\tif req.Version != \"\" {\n\t\tres += \"version=\" + req.Version + \"&\"\n\t}\n\tif res != \"\" {\n\t\treturn res[:len(res)-1]\n\t}\n\treturn res\n}\n\nfunc GetOnline(reqData GetOnlineReq, token string) ([]byte, error) {\n\t// TODO: add cache\n\treq, err := http.NewRequest(\"GET\", ServerHostApi+\"/plugin/list?\"+reqData.Format(), nil)\n\n\tif err != nil {\n\t\tlogger.Error(\"get online plugins: \", err)\n\t\treturn nil, err\n\t}\n\n\tif token != \"\" {\n\t\treq.Header.Add(TokenKey, token)\n\t}\n\n\tres, err := http.DefaultClient.Do(req)\n\n\tif err != nil {\n\t\tlogger.Error(\"get online plugins: \", err)\n\t\treturn nil, err\n\t}\n\tdefer func() {\n\t\t_ = res.Body.Close()\n\t}()\n\tbody, err := ioutil.ReadAll(res.Body)\n\tif err != nil {\n\t\tlogger.Error(\"get online plugins: \", err)\n\t\treturn nil, err\n\t}\n\n\treturn body, nil\n}\n"
  },
  {
    "path": "modules/service/service.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage service\n\nimport (\n\t\"log\"\n)\n\ntype Service interface {\n\tName() string\n}\n\ntype Generator func() (Service, error)\n\nfunc Register(k string, gen Generator) {\n\tif _, ok := services[k]; ok {\n\t\tlog.Panicf(\"service %s has been registered\", k)\n\t}\n\tservices[k] = gen\n}\n\nfunc GetServices() List {\n\tvar (\n\t\tl   = make(List)\n\t\terr error\n\t)\n\tfor k, gen := range services {\n\t\tif l[k], err = gen(); err != nil {\n\t\t\tlog.Panicf(\"service %s initialize fail, error: %v\", k, err)\n\t\t}\n\t}\n\treturn l\n}\n\nvar services = make(Generators)\n\ntype Generators map[string]Generator\n\ntype List map[string]Service\n\nfunc (g List) Get(k string) Service {\n\tif v, ok := g[k]; ok {\n\t\treturn v\n\t}\n\tlog.Panicf(\"service %s not found\", k)\n\treturn nil\n}\n\nfunc (g List) GetOrNot(k string) (Service, bool) {\n\tv, ok := g[k]\n\treturn v, ok\n}\n\nfunc (g List) Add(k string, service Service) {\n\tif _, ok := g[k]; ok {\n\t\tlog.Panicf(\"service %s exist\", k)\n\t}\n\tg[k] = service\n}\n"
  },
  {
    "path": "modules/system/application.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n)\n\nvar (\n\tstartTime = time.Now()\n)\n\ntype AppStatus struct {\n\tUptime       string\n\tNumGoroutine int\n\n\t// General statistics.\n\tMemAllocated string // bytes allocated and still in use\n\tMemTotal     string // bytes allocated (even if freed)\n\tMemSys       string // bytes obtained from system (sum of XxxSys below)\n\tLookups      uint64 // number of pointer lookups\n\tMemMallocs   uint64 // number of mallocs\n\tMemFrees     uint64 // number of frees\n\n\t// Main allocation heap statistics.\n\tHeapAlloc    string // bytes allocated and still in use\n\tHeapSys      string // bytes obtained from system\n\tHeapIdle     string // bytes in idle spans\n\tHeapInuse    string // bytes in non-idle span\n\tHeapReleased string // bytes released to the OS\n\tHeapObjects  uint64 // total number of allocated objects\n\n\t// Low-level fixed-size structure allocator statistics.\n\t//\tInuse is bytes used now.\n\t//\tSys is bytes obtained from system.\n\tStackInuse  string // bootstrap stacks\n\tStackSys    string\n\tMSpanInuse  string // mspan structures\n\tMSpanSys    string\n\tMCacheInuse string // mcache structures\n\tMCacheSys   string\n\tBuckHashSys string // profiling bucket hash table\n\tGCSys       string // GC metadata\n\tOtherSys    string // other system allocations\n\n\t// Garbage collector statistics.\n\tNextGC       string // next run in HeapAlloc time (bytes)\n\tLastGC       string // last run in absolute time (ns)\n\tPauseTotalNs string\n\tPauseNs      string // circular buffer of recent GC pause times, most recent at [(NumGC+255)%256]\n\tNumGC        uint32\n}\n\nfunc GetAppStatus() AppStatus {\n\tvar app AppStatus\n\tapp.Uptime = utils.TimeSincePro(startTime, language.Lang[config.GetLanguage()])\n\n\tm := new(runtime.MemStats)\n\truntime.ReadMemStats(m)\n\tapp.NumGoroutine = runtime.NumGoroutine()\n\n\tapp.MemAllocated = utils.FileSize(m.Alloc)\n\tapp.MemTotal = utils.FileSize(m.TotalAlloc)\n\tapp.MemSys = utils.FileSize(m.Sys)\n\tapp.Lookups = m.Lookups\n\tapp.MemMallocs = m.Mallocs\n\tapp.MemFrees = m.Frees\n\n\tapp.HeapAlloc = utils.FileSize(m.HeapAlloc)\n\tapp.HeapSys = utils.FileSize(m.HeapSys)\n\tapp.HeapIdle = utils.FileSize(m.HeapIdle)\n\tapp.HeapInuse = utils.FileSize(m.HeapInuse)\n\tapp.HeapReleased = utils.FileSize(m.HeapReleased)\n\tapp.HeapObjects = m.HeapObjects\n\n\tapp.StackInuse = utils.FileSize(m.StackInuse)\n\tapp.StackSys = utils.FileSize(m.StackSys)\n\tapp.MSpanInuse = utils.FileSize(m.MSpanInuse)\n\tapp.MSpanSys = utils.FileSize(m.MSpanSys)\n\tapp.MCacheInuse = utils.FileSize(m.MCacheInuse)\n\tapp.MCacheSys = utils.FileSize(m.MCacheSys)\n\tapp.BuckHashSys = utils.FileSize(m.BuckHashSys)\n\tapp.GCSys = utils.FileSize(m.GCSys)\n\tapp.OtherSys = utils.FileSize(m.OtherSys)\n\n\tapp.NextGC = utils.FileSize(m.NextGC)\n\tapp.LastGC = fmt.Sprintf(\"%.1fs\", float64(time.Now().UnixNano()-int64(m.LastGC))/1000/1000/1000)\n\tapp.PauseTotalNs = fmt.Sprintf(\"%.1fs\", float64(m.PauseTotalNs)/1000/1000/1000)\n\tapp.PauseNs = fmt.Sprintf(\"%.3fs\", float64(m.PauseNs[(m.NumGC+255)%256])/1000/1000/1000)\n\tapp.NumGC = m.NumGC\n\n\treturn app\n}\n\ntype SysStatus struct {\n\tCpuLogicalCore int\n\tCpuCore        int\n\tOSPlatform     string\n\tOSFamily       string\n\tOSVersion      string\n\tLoad1          float64\n\tLoad5          float64\n\tLoad15         float64\n\tMemTotal       string\n\tMemAvailable   string\n\tMemUsed        string\n}\n"
  },
  {
    "path": "modules/system/version.go",
    "content": "package system\n\nconst version = \"v1.2.27\"\n\nvar requireThemeVersion = map[string][]string{\n\t\"adminlte\": {\">=v0.0.41\"},\n\t\"sword\":    {\">=v0.0.41\"},\n}\n\n// Version return the version of framework.\nfunc Version() string {\n\treturn version\n}\n\n// RequireThemeVersion return the require official version\nfunc RequireThemeVersion() map[string][]string {\n\treturn requireThemeVersion\n}\n"
  },
  {
    "path": "modules/trace/trace.go",
    "content": "package trace\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n)\n\nvar (\n\tmachineIDOnce sync.Once\n\tmachineID     string\n\tcounter       uint32\n)\n\nfunc getMachineID() string {\n\tmachineIDOnce.Do(func() {\n\t\taddrs, err := net.InterfaceAddrs()\n\t\tif err == nil {\n\t\t\tfor _, addr := range addrs {\n\t\t\t\tif ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {\n\t\t\t\t\tif ipNet.IP.To4() != nil {\n\t\t\t\t\t\tmachineID = ipNet.IP.String()\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif machineID == \"\" {\n\t\t\tmachineID = \"127.0.0.1\"\n\t\t}\n\t})\n\n\treturn machineID\n}\n\nfunc GenerateTraceID() string {\n\tmachineID := getMachineID()\n\ttimestamp := time.Now().UnixNano() / int64(time.Millisecond)\n\tprocessID := os.Getpid()\n\tid := atomic.AddUint32(&counter, 1)\n\tid = id % 1000\n\ttraceID := fmt.Sprintf(\"%08x%05d%013d%04d\", machineIDToHex(machineID), processID, timestamp, id)\n\n\treturn traceID\n}\n\nfunc machineIDToHex(machineID string) uint32 {\n\tip := net.ParseIP(machineID)\n\tipUint32 := uint32(ip[12])<<24 | uint32(ip[13])<<16 | uint32(ip[14])<<8 | uint32(ip[15])\n\treturn ipUint32\n}\n\nfunc GetTraceID(ctx *context.Context) string {\n\ttraceID, ok := ctx.GetUserValue(TraceIDKey).(string)\n\tif !ok {\n\t\treturn \"\"\n\t}\n\treturn traceID\n}\n\nconst (\n\tTraceIDKey = \"traceID\"\n)\n"
  },
  {
    "path": "modules/ui/ui.go",
    "content": "package ui\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n)\n\ntype Service struct {\n\tNavButtons *types.Buttons\n}\n\nconst ServiceKey = \"ui\"\n\nfunc (s *Service) Name() string {\n\treturn \"ui\"\n}\n\nfunc GetService(srv service.List) *Service {\n\tif v, ok := srv.Get(\"ui\").(*Service); ok {\n\t\treturn v\n\t}\n\tpanic(\"wrong service\")\n}\n\nfunc NewService(btns *types.Buttons) *Service {\n\treturn &Service{\n\t\tNavButtons: btns,\n\t}\n}\n\nfunc (s *Service) UpdateButtons() {\n\n}\n\nfunc (s *Service) RemoveOrShowSiteNavButton(remove bool) {\n\tif remove {\n\t\t*s.NavButtons = (*s.NavButtons).RemoveSiteNavButton()\n\t} else {\n\t\t*s.NavButtons = (*s.NavButtons).AddNavButton(icon.Gear, types.NavBtnSiteName,\n\t\t\taction.JumpInNewTab(config.Url(\"/info/site/edit\"),\n\t\t\t\tlanguage.GetWithScope(\"site setting\", \"config\")))\n\t}\n}\n\nfunc (s *Service) RemoveOrShowInfoNavButton(remove bool) {\n\tif remove {\n\t\t*s.NavButtons = (*s.NavButtons).RemoveInfoNavButton()\n\t} else {\n\t\t*s.NavButtons = (*s.NavButtons).AddNavButton(icon.Info, types.NavBtnInfoName,\n\t\t\taction.JumpInNewTab(config.Url(\"/application/info\"),\n\t\t\t\tlanguage.GetWithScope(\"system info\", \"system\")))\n\t}\n\n}\n\nfunc (s *Service) RemoveOrShowToolNavButton(remove bool) {\n\tif remove {\n\t\t*s.NavButtons = (*s.NavButtons).RemoveToolNavButton()\n\t} else {\n\t\t*s.NavButtons = (*s.NavButtons).AddNavButton(icon.Wrench, types.NavBtnToolName,\n\t\t\taction.JumpInNewTab(config.Url(\"/info/generate/new\"),\n\t\t\t\tlanguage.GetWithScope(\"tool\", \"tool\")))\n\t}\n\n}\n\nfunc (s *Service) RemoveOrShowPlugNavButton(remove bool) {\n\tif remove {\n\t\t*s.NavButtons = (*s.NavButtons).RemovePlugNavButton()\n\t} else {\n\t\t*s.NavButtons = (*s.NavButtons).AddNavButton(icon.Plug, types.NavBtnToolName,\n\t\t\taction.JumpInNewTab(config.Url(\"/plugin\"),\n\t\t\t\tlanguage.GetWithScope(\"plugin\", \"plugin\")))\n\t}\n\n}\n"
  },
  {
    "path": "modules/utils/utils.go",
    "content": "package utils\n\nimport (\n\t\"archive/zip\"\n\t\"bytes\"\n\t\"encoding/gob\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"io\"\n\t\"math\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\ttextTmpl \"text/template\"\n\t\"time\"\n\n\t\"github.com/NebulousLabs/fastrand\"\n)\n\nfunc Uuid(length int64) string {\n\tele := []string{\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"v\", \"k\",\n\t\t\"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"A\", \"B\", \"C\", \"Driver\", \"E\", \"F\", \"G\",\n\t\t\"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"}\n\tele, _ = Random(ele)\n\tuuid := \"\"\n\tvar i int64\n\tfor i = 0; i < length; i++ {\n\t\tuuid += ele[fastrand.Intn(59)]\n\t}\n\treturn uuid\n}\n\nfunc Random(strings []string) ([]string, error) {\n\tfor i := len(strings) - 1; i > 0; i-- {\n\t\tnum := fastrand.Intn(i + 1)\n\t\tstrings[i], strings[num] = strings[num], strings[i]\n\t}\n\n\tstr := make([]string, 0)\n\tfor i := 0; i < len(strings); i++ {\n\t\tstr = append(str, strings[i])\n\t}\n\treturn str, nil\n}\n\nfunc CompressedContent(h *template.HTML) {\n\tst := strings.Split(string(*h), \"\\n\")\n\tvar ss []string\n\tfor i := 0; i < len(st); i++ {\n\t\tst[i] = strings.TrimSpace(st[i])\n\t\tif st[i] != \"\" {\n\t\t\tss = append(ss, st[i])\n\t\t}\n\t}\n\t*h = template.HTML(strings.Join(ss, \"\\n\"))\n}\n\nfunc ReplaceNth(s, old, new string, n int) string {\n\ti := 0\n\tfor m := 1; m <= n; m++ {\n\t\tx := strings.Index(s[i:], old)\n\t\tif x < 0 {\n\t\t\tbreak\n\t\t}\n\t\ti += x\n\t\tif m == n {\n\t\t\treturn s[:i] + new + s[i+len(old):]\n\t\t}\n\t\ti += len(old)\n\t}\n\treturn s\n}\n\nfunc InArray(arr []string, str string) bool {\n\tfor _, v := range arr {\n\t\tif v == str {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc WrapURL(u string) string {\n\tuarr := strings.Split(u, \"?\")\n\tif len(uarr) < 2 {\n\t\treturn url.QueryEscape(strings.ReplaceAll(u, \"/\", \"_\"))\n\t}\n\tv, err := url.ParseQuery(uarr[1])\n\tif err != nil {\n\t\treturn url.QueryEscape(strings.ReplaceAll(u, \"/\", \"_\"))\n\t}\n\treturn url.QueryEscape(strings.ReplaceAll(uarr[0], \"/\", \"_\")) + \"?\" +\n\t\tstrings.ReplaceAll(v.Encode(), \"%7B%7B.Id%7D%7D\", \"{{.Id}}\")\n}\n\nfunc JSON(a interface{}) string {\n\tif a == nil {\n\t\treturn \"\"\n\t}\n\tb, _ := json.Marshal(a)\n\treturn string(b)\n}\n\nfunc ParseBool(s string) bool {\n\tb1, _ := strconv.ParseBool(s)\n\treturn b1\n}\n\nfunc ReplaceAll(s string, oldnew ...string) string {\n\trepl := strings.NewReplacer(oldnew...)\n\treturn repl.Replace(s)\n}\n\nfunc PackageName(v interface{}) string {\n\tif v == nil {\n\t\treturn \"\"\n\t}\n\n\tval := reflect.ValueOf(v)\n\tif val.Kind() == reflect.Ptr {\n\t\treturn val.Elem().Type().PkgPath()\n\t}\n\treturn val.Type().PkgPath()\n}\n\nfunc ParseFloat32(f string) float32 {\n\ts, _ := strconv.ParseFloat(f, 32)\n\treturn float32(s)\n}\n\nfunc SetDefault(value, condition, def string) string {\n\tif value == condition {\n\t\treturn def\n\t}\n\treturn value\n}\n\nfunc AorB(condition bool, a, b string) string {\n\tif condition {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc IsJSON(str string) bool {\n\tvar js json.RawMessage\n\treturn json.Unmarshal([]byte(str), &js) == nil\n}\n\nfunc CopyMap(m map[string]string) map[string]string {\n\tvar buf bytes.Buffer\n\tenc := gob.NewEncoder(&buf)\n\tdec := gob.NewDecoder(&buf)\n\terr := enc.Encode(m)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tvar cm map[string]string\n\terr = dec.Decode(&cm)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn cm\n}\n\nfunc ParseTime(stringTime string) time.Time {\n\tloc, _ := time.LoadLocation(\"Local\")\n\ttheTime, _ := time.ParseInLocation(\"2006-01-02 15:04:05\", stringTime, loc)\n\treturn theTime\n}\n\nfunc ParseHTML(name, tmpl string, param interface{}) template.HTML {\n\tt := template.New(name)\n\tt, err := t.Parse(tmpl)\n\tif err != nil {\n\t\tfmt.Println(\"utils parseHTML error\", err)\n\t\treturn \"\"\n\t}\n\tbuf := new(bytes.Buffer)\n\terr = t.Execute(buf, param)\n\tif err != nil {\n\t\tfmt.Println(\"utils parseHTML error\", err)\n\t\treturn \"\"\n\t}\n\treturn template.HTML(buf.String())\n}\n\nfunc ParseText(name, tmpl string, param interface{}) string {\n\tt := textTmpl.New(name)\n\tt, err := t.Parse(tmpl)\n\tif err != nil {\n\t\tfmt.Println(\"utils parseHTML error\", err)\n\t\treturn \"\"\n\t}\n\tbuf := new(bytes.Buffer)\n\terr = t.Execute(buf, param)\n\tif err != nil {\n\t\tfmt.Println(\"utils parseHTML error\", err)\n\t\treturn \"\"\n\t}\n\treturn buf.String()\n}\n\nfunc CompareVersion(src, toCompare string) bool {\n\tif toCompare == \"\" {\n\t\treturn false\n\t}\n\n\texp, _ := regexp.Compile(`-(.*)`)\n\tsrc = exp.ReplaceAllString(src, \"\")\n\ttoCompare = exp.ReplaceAllString(toCompare, \"\")\n\n\tsrcs := strings.Split(src, \"v\")\n\tsrcArr := strings.Split(srcs[1], \".\")\n\top := \">\"\n\tsrcs[0] = strings.TrimSpace(srcs[0])\n\tif InArray([]string{\">=\", \"<=\", \"=\", \">\", \"<\"}, srcs[0]) {\n\t\top = srcs[0]\n\t}\n\n\ttoCompare = strings.ReplaceAll(toCompare, \"v\", \"\")\n\n\tif op == \"=\" {\n\t\treturn srcs[1] == toCompare\n\t}\n\n\tif srcs[1] == toCompare && (op == \"<=\" || op == \">=\") {\n\t\treturn true\n\t}\n\n\ttoCompareArr := strings.Split(strings.ReplaceAll(toCompare, \"v\", \"\"), \".\")\n\tfor i := 0; i < len(srcArr); i++ {\n\t\tv, err := strconv.Atoi(srcArr[i])\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\tvv, err := strconv.Atoi(toCompareArr[i])\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\tswitch op {\n\t\tcase \">\", \">=\":\n\t\t\tif v < vv {\n\t\t\t\treturn true\n\t\t\t} else if v > vv {\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\tcontinue\n\t\t\t}\n\t\tcase \"<\", \"<=\":\n\t\t\tif v > vv {\n\t\t\t\treturn true\n\t\t\t} else if v < vv {\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\nconst (\n\tByte  = 1\n\tKByte = Byte * 1024\n\tMByte = KByte * 1024\n\tGByte = MByte * 1024\n\tTByte = GByte * 1024\n\tPByte = TByte * 1024\n\tEByte = PByte * 1024\n)\n\nfunc logn(n, b float64) float64 {\n\treturn math.Log(n) / math.Log(b)\n}\n\nfunc humanateBytes(s uint64, base float64, sizes []string) string {\n\tif s < 10 {\n\t\treturn fmt.Sprintf(\"%d B\", s)\n\t}\n\te := math.Floor(logn(float64(s), base))\n\tsuffix := sizes[int(e)]\n\tval := float64(s) / math.Pow(base, math.Floor(e))\n\tf := \"%.0f\"\n\tif val < 10 {\n\t\tf = \"%.1f\"\n\t}\n\n\treturn fmt.Sprintf(f+\" %s\", val, suffix)\n}\n\n// FileSize calculates the file size and generate user-friendly string.\nfunc FileSize(s uint64) string {\n\tsizes := []string{\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\"}\n\treturn humanateBytes(s, 1024, sizes)\n}\n\nfunc FileExist(path string) bool {\n\t_, err := os.Stat(path)\n\tif err != nil {\n\t\treturn os.IsExist(err)\n\t}\n\treturn true\n}\n\n// TimeSincePro calculates the time interval and generate full user-friendly string.\nfunc TimeSincePro(then time.Time, m map[string]string) string {\n\tnow := time.Now()\n\tdiff := now.Unix() - then.Unix()\n\n\tif then.After(now) {\n\t\treturn \"future\"\n\t}\n\n\tvar timeStr, diffStr string\n\tfor {\n\t\tif diff == 0 {\n\t\t\tbreak\n\t\t}\n\n\t\tdiff, diffStr = computeTimeDiff(diff, m)\n\t\ttimeStr += \", \" + diffStr\n\t}\n\treturn strings.TrimPrefix(timeStr, \", \")\n}\n\n// Seconds-based time units\nconst (\n\tMinute = 60\n\tHour   = 60 * Minute\n\tDay    = 24 * Hour\n\tWeek   = 7 * Day\n\tMonth  = 30 * Day\n\tYear   = 12 * Month\n)\n\nfunc computeTimeDiff(diff int64, m map[string]string) (int64, string) {\n\tdiffStr := \"\"\n\tswitch {\n\tcase diff <= 0:\n\t\tdiff = 0\n\t\tdiffStr = \"now\"\n\tcase diff < 2:\n\t\tdiff = 0\n\t\tdiffStr = \"1 \" + m[\"second\"]\n\tcase diff < 1*Minute:\n\t\tdiffStr = fmt.Sprintf(\"%d \"+m[\"seconds\"], diff)\n\t\tdiff = 0\n\n\tcase diff < 2*Minute:\n\t\tdiff -= 1 * Minute\n\t\tdiffStr = \"1 \" + m[\"minute\"]\n\tcase diff < 1*Hour:\n\t\tdiffStr = fmt.Sprintf(\"%d \"+m[\"minutes\"], diff/Minute)\n\t\tdiff -= diff / Minute * Minute\n\n\tcase diff < 2*Hour:\n\t\tdiff -= 1 * Hour\n\t\tdiffStr = \"1 \" + m[\"hour\"]\n\tcase diff < 1*Day:\n\t\tdiffStr = fmt.Sprintf(\"%d \"+m[\"hours\"], diff/Hour)\n\t\tdiff -= diff / Hour * Hour\n\n\tcase diff < 2*Day:\n\t\tdiff -= 1 * Day\n\t\tdiffStr = \"1 \" + m[\"day\"]\n\tcase diff < 1*Week:\n\t\tdiffStr = fmt.Sprintf(\"%d \"+m[\"days\"], diff/Day)\n\t\tdiff -= diff / Day * Day\n\n\tcase diff < 2*Week:\n\t\tdiff -= 1 * Week\n\t\tdiffStr = \"1 \" + m[\"week\"]\n\tcase diff < 1*Month:\n\t\tdiffStr = fmt.Sprintf(\"%d \"+m[\"weeks\"], diff/Week)\n\t\tdiff -= diff / Week * Week\n\n\tcase diff < 2*Month:\n\t\tdiff -= 1 * Month\n\t\tdiffStr = \"1 \" + m[\"month\"]\n\tcase diff < 1*Year:\n\t\tdiffStr = fmt.Sprintf(\"%d \"+m[\"months\"], diff/Month)\n\t\tdiff -= diff / Month * Month\n\n\tcase diff < 2*Year:\n\t\tdiff -= 1 * Year\n\t\tdiffStr = \"1 \" + m[\"year\"]\n\tdefault:\n\t\tdiffStr = fmt.Sprintf(\"%d \"+m[\"years\"], diff/Year)\n\t\tdiff = 0\n\t}\n\treturn diff, diffStr\n}\n\nfunc DownloadTo(url, output string) error {\n\n\treq, err := http.NewRequest(\"GET\", url, nil)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tres, err := http.DefaultClient.Do(req)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer func() {\n\t\t_ = res.Body.Close()\n\t}()\n\n\tfile, err := os.Create(output)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = io.Copy(file, res.Body)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc UnzipDir(src, dest string) error {\n\tr, err := zip.OpenReader(src)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() {\n\t\tif err := r.Close(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}()\n\n\terr = os.MkdirAll(dest, 0750)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Closure to address file descriptors issue with all the deferred .Close() methods\n\textractAndWriteFile := func(f *zip.File) error {\n\t\trc, err := f.Open()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdefer func() {\n\t\t\tif err := rc.Close(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}()\n\n\t\tpath := filepath.Join(dest, f.Name)\n\n\t\tif f.FileInfo().IsDir() {\n\t\t\terr = os.MkdirAll(path, f.Mode())\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\terr = os.MkdirAll(filepath.Dir(path), f.Mode())\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tf, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdefer func() {\n\t\t\t\tif err := f.Close(); err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\t_, err = io.Copy(f, rc)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tfor _, f := range r.File {\n\t\terr := extractAndWriteFile(f)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "modules/utils/utils_test.go",
    "content": "package utils\n\nimport (\n\t\"html/template\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestCompressedContent(t *testing.T) {\n\thtmlContent1 := template.HTML(`\n<html>\n\t<body>\n\n\t\t<h1>Test</h1>                         \n\n\n\n\t\t<p>CompressedContent</p>           \n\n\t</body>\n\n</html>\n`)\n\thtmlContent2 := htmlContent1\n\tCompressedContent(&htmlContent2)\n\tt.Log(len(htmlContent1) > len(htmlContent2))\n}\n\nfunc TestCompareVersion(t *testing.T) {\n\tassert.Equal(t, true, CompareVersion(\"v1.2.4\", \"v1.2.5\"))\n\tassert.Equal(t, false, CompareVersion(\"v1.2.4\", \"v1.2.4\"))\n\tassert.Equal(t, false, CompareVersion(\"v1.2.4\", \"v1.2.3\"))\n\tassert.Equal(t, false, CompareVersion(\"v1.2.4\", \"v1.1.3\"))\n\tassert.Equal(t, true, CompareVersion(\"v1.2.4\", \"v1.3.3\"))\n\tassert.Equal(t, false, CompareVersion(\"v1.2.4\", \"v0.3.3\"))\n\n\tassert.Equal(t, true, CompareVersion(\"<v1.2.4\", \"v0.3.3\"))\n\tassert.Equal(t, false, CompareVersion(\"<v1.2.4\", \"v1.2.5\"))\n\tassert.Equal(t, true, CompareVersion(\"<=v1.2.4\", \"v1.2.4\"))\n\tassert.Equal(t, true, CompareVersion(\"<=v1.2.4\", \"v1.2.3\"))\n\tassert.Equal(t, false, CompareVersion(\"<=v1.2.4\", \"v1.2.5\"))\n\tassert.Equal(t, true, CompareVersion(\">v1.2.4\", \"v1.2.5\"))\n\tassert.Equal(t, false, CompareVersion(\">v1.2.4\", \"v1.2.4\"))\n\tassert.Equal(t, true, CompareVersion(\">=v1.2.4\", \"v1.2.4\"))\n\tassert.Equal(t, true, CompareVersion(\">=v1.2.4\", \"v1.2.5\"))\n\tassert.Equal(t, false, CompareVersion(\">=v1.2.4\", \"v1.2.3\"))\n\tassert.Equal(t, false, CompareVersion(\"=v1.2.4\", \"v1.2.3\"))\n\tassert.Equal(t, true, CompareVersion(\"=v1.2.4\", \"v1.2.4\"))\n\tassert.Equal(t, true, CompareVersion(\"= v1.2.4\", \"v1.2.4\"))\n}\n"
  },
  {
    "path": "plugins/admin/admin.go",
    "content": "package admin\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/modules/system\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/controller\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n\t_ \"github.com/GoAdminGroup/go-admin/template/types/display\"\n)\n\n// Admin is a GoAdmin plugin.\ntype Admin struct {\n\t*plugins.Base\n\tconfig    *config.Config\n\ttableList table.GeneratorList\n\tguardian  *guard.Guard\n\thandler   *controller.Handler\n}\n\n// InitPlugin implements Plugin.InitPlugin.\n// TODO: find a better way to manage the dependencies\nfunc (admin *Admin) InitPlugin(services service.List) {\n\n\t// DO NOT DELETE\n\tadmin.InitBase(services, \"\")\n\n\tc := config.GetService(services.Get(\"config\"))\n\tst := table.NewSystemTable(admin.Conn, c)\n\tgenList := table.GeneratorList{\n\t\t\"manager\":        st.GetManagerTable,\n\t\t\"permission\":     st.GetPermissionTable,\n\t\t\"roles\":          st.GetRolesTable,\n\t\t\"op\":             st.GetOpTable,\n\t\t\"menu\":           st.GetMenuTable,\n\t\t\"normal_manager\": st.GetNormalManagerTable,\n\t}\n\tif c.IsAllowConfigModification() {\n\t\tgenList.Add(\"site\", st.GetSiteTable)\n\t}\n\tif c.IsNotProductionEnvironment() {\n\t\tgenList.Add(\"generate\", st.GetGenerateForm)\n\t}\n\tadmin.tableList.Combine(genList)\n\tadmin.guardian = guard.New(admin.Services, admin.Conn, admin.tableList, admin.UI.NavButtons)\n\thandlerCfg := controller.Config{\n\t\tConfig:     c,\n\t\tServices:   services,\n\t\tGenerators: admin.tableList,\n\t\tConnection: admin.Conn,\n\t}\n\tadmin.config = c\n\tadmin.handler.UpdateCfg(handlerCfg)\n\tadmin.initRouter()\n\tadmin.handler.SetRoutes(admin.App.Routers)\n\tadmin.handler.AddNavButton(admin.UI.NavButtons)\n\n\ttable.SetServices(services)\n\n\taction.InitOperationHandlerSetter(admin.GetAddOperationFn())\n}\n\nfunc (admin *Admin) GetIndexURL() string {\n\treturn config.GetIndexURL()\n}\n\nfunc (admin *Admin) GetInfo() plugins.Info {\n\treturn plugins.Info{\n\t\tTitle:       \"Basic Admin\",\n\t\tWebsite:     \"https://www.go-admin.cn\",\n\t\tDescription: \"A built-in plugins of GoAdmin which help you to build a crud manager platform quickly.\",\n\t\tAuthor:      \"official\",\n\t\tVersion:     system.Version(),\n\t\tCreateDate:  utils.ParseTime(\"2018-07-08 00:00:00\"),\n\t\tUpdateDate:  utils.ParseTime(\"2020-06-28 00:00:00\"),\n\t}\n}\n\nfunc (admin *Admin) IsInstalled() bool {\n\treturn true\n}\n\n// NewAdmin return the global Admin plugin.\nfunc NewAdmin(tableCfg ...table.GeneratorList) *Admin {\n\treturn &Admin{\n\t\ttableList: make(table.GeneratorList).CombineAll(tableCfg),\n\t\tBase:      &plugins.Base{PlugName: \"admin\"},\n\t\thandler:   controller.New(),\n\t}\n}\n\nfunc (admin *Admin) GetAddOperationFn() context.NodeProcessor {\n\treturn admin.handler.AddOperation\n}\n\n// SetCaptcha set captcha driver.\nfunc (admin *Admin) SetCaptcha(captcha map[string]string) *Admin {\n\tadmin.handler.SetCaptcha(captcha)\n\treturn admin\n}\n\n// AddGenerator add table model generator.\nfunc (admin *Admin) AddGenerator(key string, g table.Generator) *Admin {\n\tadmin.tableList.Add(key, g)\n\treturn admin\n}\n\n// AddGenerators add table model generators.\nfunc (admin *Admin) AddGenerators(gen ...table.GeneratorList) *Admin {\n\tadmin.tableList.CombineAll(gen)\n\treturn admin\n}\n\n// AddGlobalDisplayProcessFn call types.AddGlobalDisplayProcessFn\nfunc (admin *Admin) AddGlobalDisplayProcessFn(f types.FieldFilterFn) *Admin {\n\ttypes.AddGlobalDisplayProcessFn(f)\n\treturn admin\n}\n\n// AddDisplayFilterLimit call types.AddDisplayFilterLimit\nfunc (admin *Admin) AddDisplayFilterLimit(limit int) *Admin {\n\ttypes.AddLimit(limit)\n\treturn admin\n}\n\n// AddDisplayFilterTrimSpace call types.AddDisplayFilterTrimSpace\nfunc (admin *Admin) AddDisplayFilterTrimSpace() *Admin {\n\ttypes.AddTrimSpace()\n\treturn admin\n}\n\n// AddDisplayFilterSubstr call types.AddDisplayFilterSubstr\nfunc (admin *Admin) AddDisplayFilterSubstr(start int, end int) *Admin {\n\ttypes.AddSubstr(start, end)\n\treturn admin\n}\n\n// AddDisplayFilterToTitle call types.AddDisplayFilterToTitle\nfunc (admin *Admin) AddDisplayFilterToTitle() *Admin {\n\ttypes.AddToTitle()\n\treturn admin\n}\n\n// AddDisplayFilterToUpper call types.AddDisplayFilterToUpper\nfunc (admin *Admin) AddDisplayFilterToUpper() *Admin {\n\ttypes.AddToUpper()\n\treturn admin\n}\n\n// AddDisplayFilterToLower call types.AddDisplayFilterToLower\nfunc (admin *Admin) AddDisplayFilterToLower() *Admin {\n\ttypes.AddToUpper()\n\treturn admin\n}\n\n// AddDisplayFilterXssFilter call types.AddDisplayFilterXssFilter\nfunc (admin *Admin) AddDisplayFilterXssFilter() *Admin {\n\ttypes.AddXssFilter()\n\treturn admin\n}\n\n// AddDisplayFilterXssJsFilter call types.AddDisplayFilterXssJsFilter\nfunc (admin *Admin) AddDisplayFilterXssJsFilter() *Admin {\n\ttypes.AddXssJsFilter()\n\treturn admin\n}\n"
  },
  {
    "path": "plugins/admin/controller/Update.go",
    "content": "package controller\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n)\n\n// Update update the table row of given id.\nfunc (h *Handler) Update(ctx *context.Context) {\n\n\tparam := guard.GetUpdateParam(ctx)\n\n\terr := param.Panel.UpdateData(ctx, param.Value)\n\n\tif err != nil {\n\t\tresponse.Error(ctx, err.Error())\n\t\treturn\n\t}\n\n\tresponse.Ok(ctx)\n}\n"
  },
  {
    "path": "plugins/admin/controller/api_create.go",
    "content": "package controller\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/file\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n)\n\nfunc (h *Handler) ApiCreate(ctx *context.Context) {\n\tparam := guard.GetNewFormParam(ctx)\n\n\tif len(param.MultiForm.File) > 0 {\n\t\terr := file.GetFileEngine(h.config.FileUploadEngine.Name).Upload(param.MultiForm)\n\t\tif err != nil {\n\t\t\tresponse.Error(ctx, err.Error())\n\t\t\treturn\n\t\t}\n\t}\n\n\terr := param.Panel.InsertData(ctx, param.Value())\n\tif err != nil {\n\t\tresponse.Error(ctx, err.Error())\n\t\treturn\n\t}\n\n\tresponse.Ok(ctx)\n}\n\nfunc (h *Handler) ApiCreateForm(ctx *context.Context) {\n\n\tvar (\n\t\tparams           = guard.GetShowNewFormParam(ctx)\n\t\tprefix, paramStr = params.Prefix, params.Param.GetRouteParamStr()\n\t\tpanel            = h.table(prefix, ctx)\n\t\tformInfo         = panel.GetNewFormInfo()\n\t\tinfoUrl          = h.routePathWithPrefix(\"api_info\", prefix) + paramStr\n\t\tnewUrl           = h.routePathWithPrefix(\"api_new\", prefix)\n\t\treferer          = ctx.Referer()\n\t\tf                = panel.GetActualNewForm()\n\t)\n\n\tif referer != \"\" && !isInfoUrl(referer) && !isNewUrl(referer, ctx.Query(constant.PrefixKey)) {\n\t\tinfoUrl = referer\n\t}\n\n\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\"panel\": formInfo,\n\t\t\"urls\": map[string]string{\n\t\t\t\"info\": infoUrl,\n\t\t\t\"new\":  newUrl,\n\t\t},\n\t\t\"pk\":     panel.GetPrimaryKey().Name,\n\t\t\"header\": f.HeaderHtml,\n\t\t\"footer\": f.FooterHtml,\n\t\t\"prefix\": h.config.PrefixFixSlash(),\n\t\t\"token\":  h.authSrv().AddToken(),\n\t\t\"operation_footer\": formFooter(ctx, \"new\", f.IsHideContinueEditCheckBox, f.IsHideContinueNewCheckBox,\n\t\t\tf.IsHideResetButton, f.FormNewBtnWord),\n\t})\n}\n"
  },
  {
    "path": "plugins/admin/controller/api_detail.go",
    "content": "package controller\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\nfunc (h *Handler) ApiDetail(ctx *context.Context) {\n\tprefix := ctx.Query(constant.PrefixKey)\n\tid := ctx.Query(constant.DetailPKKey)\n\tpanel := h.table(prefix, ctx)\n\tuser := auth.Auth(ctx)\n\n\tnewPanel := panel.Copy()\n\n\tformModel := newPanel.GetForm()\n\n\tvar fieldList types.FieldList\n\n\tif len(panel.GetDetail().FieldList) == 0 {\n\t\tfieldList = panel.GetInfo().FieldList\n\t} else {\n\t\tfieldList = panel.GetDetail().FieldList\n\t}\n\n\tformModel.FieldList = make([]types.FormField, len(fieldList))\n\n\tfor i, field := range fieldList {\n\t\tformModel.FieldList[i] = types.FormField{\n\t\t\tField:        field.Field,\n\t\t\tFieldClass:   field.Field,\n\t\t\tTypeName:     field.TypeName,\n\t\t\tHead:         field.Head,\n\t\t\tHide:         field.Hide,\n\t\t\tJoins:        field.Joins,\n\t\t\tFormType:     form.Default,\n\t\t\tFieldDisplay: field.FieldDisplay,\n\t\t}\n\t}\n\n\tparam := parameter.GetParam(ctx.Request.URL,\n\t\tpanel.GetInfo().DefaultPageSize,\n\t\tpanel.GetInfo().SortField,\n\t\tpanel.GetInfo().GetSort())\n\n\tparamStr := param.DeleteDetailPk().GetRouteParamStr()\n\n\teditUrl := modules.AorEmpty(!panel.GetInfo().IsHideEditButton, h.routePathWithPrefix(\"show_edit\", prefix)+paramStr+\n\t\t\"&\"+constant.EditPKKey+\"=\"+ctx.Query(constant.DetailPKKey))\n\tdeleteUrl := modules.AorEmpty(!panel.GetInfo().IsHideDeleteButton, h.routePathWithPrefix(\"delete\", prefix)+paramStr)\n\tinfoUrl := h.routePathWithPrefix(\"info\", prefix) + paramStr\n\n\teditUrl = user.GetCheckPermissionByUrlMethod(editUrl, h.route(\"show_edit\").Method())\n\tdeleteUrl = user.GetCheckPermissionByUrlMethod(deleteUrl, h.route(\"delete\").Method())\n\n\tdeleteJs := \"\"\n\n\tif deleteUrl != \"\" {\n\t\tdeleteJs = fmt.Sprintf(`<script>\nfunction DeletePost(id) {\n\tswal({\n\t\t\ttitle: '%s',\n\t\t\ttype: \"warning\",\n\t\t\tshowCancelButton: true,\n\t\t\tconfirmButtonColor: \"#DD6B55\",\n\t\t\tconfirmButtonText: '%s',\n\t\t\tcloseOnConfirm: false,\n\t\t\tcancelButtonText: '%s',\n\t\t},\n\t\tfunction () {\n\t\t\t$.ajax({\n\t\t\t\tmethod: 'post',\n\t\t\t\turl: '%s',\n\t\t\t\tdata: {\n\t\t\t\t\tid: id\n\t\t\t\t},\n\t\t\t\tsuccess: function (data) {\n\t\t\t\t\tif (typeof (data) === \"string\") {\n\t\t\t\t\t\tdata = JSON.parse(data);\n\t\t\t\t\t}\n\t\t\t\t\tif (data.code === 200) {\n\t\t\t\t\t\tlocation.href = '%s'\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswal(data.msg, '', 'error');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n}\n\n$('.delete-btn').on('click', function (event) {\n\tDeletePost('%s')\n});\n\n</script>`, language.Get(\"are you sure to delete\"), language.Get(\"yes\"), language.Get(\"cancel\"), deleteUrl, infoUrl, id)\n\t}\n\n\tdesc := panel.GetDetail().Description\n\n\tif desc == \"\" {\n\t\tdesc = panel.GetInfo().Description + language.Get(\"Detail\")\n\t}\n\n\tformInfo, err := newPanel.GetDataWithId(param.WithPKs(id))\n\n\tif err != nil {\n\t\tresponse.Error(ctx, err.Error())\n\t\treturn\n\t}\n\n\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\"panel\":    formInfo,\n\t\t\"previous\": infoUrl,\n\t\t\"footer\":   deleteJs,\n\t\t\"prefix\":   h.config.PrefixFixSlash(),\n\t})\n}\n"
  },
  {
    "path": "plugins/admin/controller/api_list.go",
    "content": "package controller\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n)\n\nfunc (h *Handler) ApiList(ctx *context.Context) {\n\tprefix := ctx.Query(constant.PrefixKey)\n\n\tpanel := h.table(prefix, ctx)\n\n\tparams := parameter.GetParam(ctx.Request.URL, panel.GetInfo().DefaultPageSize, panel.GetInfo().SortField,\n\t\tpanel.GetInfo().GetSort())\n\n\tpanel, panelInfo, urls, err := h.showTableData(ctx, prefix, params, panel, \"api_\")\n\tif err != nil {\n\t\tresponse.Error(ctx, err.Error())\n\t\treturn\n\t}\n\n\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\"panel\":  panelInfo,\n\t\t\"footer\": panelInfo.Paginator.GetContent() + panel.GetInfo().FooterHtml,\n\t\t\"header\": aDataTable(ctx).GetDataTableHeader() + panel.GetInfo().HeaderHtml,\n\t\t\"prefix\": h.config.PrefixFixSlash(),\n\t\t\"urls\": map[string]string{\n\t\t\t\"edit\":   urls[0],\n\t\t\t\"new\":    urls[1],\n\t\t\t\"delete\": urls[2],\n\t\t\t\"export\": urls[3],\n\t\t\t\"detail\": urls[4],\n\t\t\t\"info\":   urls[5],\n\t\t\t\"update\": urls[6],\n\t\t},\n\t})\n}\n"
  },
  {
    "path": "plugins/admin/controller/api_update.go",
    "content": "package controller\n\nimport (\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/file\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\nfunc (h *Handler) ApiUpdate(ctx *context.Context) {\n\tparam := guard.GetEditFormParam(ctx)\n\n\tif len(param.MultiForm.File) > 0 {\n\t\terr := file.GetFileEngine(h.config.FileUploadEngine.Name).Upload(param.MultiForm)\n\t\tif err != nil {\n\t\t\tresponse.Error(ctx, err.Error())\n\t\t\treturn\n\t\t}\n\t}\n\n\tfor i := 0; i < len(param.Panel.GetForm().FieldList); i++ {\n\t\tif param.Panel.GetForm().FieldList[i].FormType == form.File &&\n\t\t\tlen(param.MultiForm.File[param.Panel.GetForm().FieldList[i].Field]) == 0 &&\n\t\t\tparam.MultiForm.Value[param.Panel.GetForm().FieldList[i].Field+\"__delete_flag\"][0] != \"1\" {\n\t\t\tdelete(param.MultiForm.Value, param.Panel.GetForm().FieldList[i].Field)\n\t\t}\n\t}\n\n\terr := param.Panel.UpdateData(ctx, param.Value())\n\tif err != nil {\n\t\tresponse.Error(ctx, err.Error())\n\t\treturn\n\t}\n\n\tresponse.Ok(ctx)\n}\n\nfunc (h *Handler) ApiUpdateForm(ctx *context.Context) {\n\tparams := guard.GetShowFormParam(ctx)\n\n\tprefix, param := params.Prefix, params.Param\n\n\tpanel := h.table(prefix, ctx)\n\n\tuser := auth.Auth(ctx)\n\n\tparamStr := param.GetRouteParamStr()\n\n\tnewUrl := modules.AorEmpty(panel.GetCanAdd(), h.routePathWithPrefix(\"api_show_new\", prefix)+paramStr)\n\tfooterKind := \"edit\"\n\tif newUrl == \"\" || !user.CheckPermissionByUrlMethod(newUrl, h.route(\"api_show_new\").Method(), url.Values{}) {\n\t\tfooterKind = \"edit_only\"\n\t}\n\n\tformInfo, err := panel.GetDataWithId(param)\n\n\tif err != nil {\n\t\tresponse.Error(ctx, err.Error())\n\t\treturn\n\t}\n\n\tinfoUrl := h.routePathWithPrefix(\"api_info\", prefix) + param.DeleteField(constant.EditPKKey).GetRouteParamStr()\n\teditUrl := h.routePathWithPrefix(\"api_edit\", prefix)\n\n\tf := panel.GetForm()\n\n\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\"panel\": formInfo,\n\t\t\"urls\": map[string]string{\n\t\t\t\"info\": infoUrl,\n\t\t\t\"edit\": editUrl,\n\t\t},\n\t\t\"pk\":     panel.GetPrimaryKey().Name,\n\t\t\"header\": f.HeaderHtml,\n\t\t\"footer\": f.FooterHtml,\n\t\t\"prefix\": h.config.PrefixFixSlash(),\n\t\t\"token\":  h.authSrv().AddToken(),\n\t\t\"operation_footer\": formFooter(ctx, footerKind, f.IsHideContinueEditCheckBox, f.IsHideContinueNewCheckBox,\n\t\t\tf.IsHideResetButton, f.FormEditBtnWord),\n\t})\n}\n"
  },
  {
    "path": "plugins/admin/controller/auth.go",
    "content": "package controller\n\nimport (\n\t\"bytes\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/system\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/captcha\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// Auth check the input password and username for authentication.\nfunc (h *Handler) Auth(ctx *context.Context) {\n\n\tvar (\n\t\tuser     models.UserModel\n\t\tok       bool\n\t\terrMsg   = \"fail\"\n\t\ts, exist = h.services.GetOrNot(auth.ServiceKey)\n\t)\n\n\tif capDriver, ok := h.captchaConfig[\"driver\"]; ok {\n\t\tcapt, ok := captcha.Get(capDriver)\n\n\t\tif ok {\n\t\t\tif !capt.Validate(ctx.FormValue(\"token\")) {\n\t\t\t\tresponse.BadRequest(ctx, \"wrong captcha\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tif !exist {\n\t\tpassword := ctx.FormValue(\"password\")\n\t\tusername := ctx.FormValue(\"username\")\n\n\t\tif password == \"\" || username == \"\" {\n\t\t\tresponse.BadRequest(ctx, \"wrong password or username\")\n\t\t\treturn\n\t\t}\n\t\tuser, ok = auth.Check(password, username, h.conn)\n\t} else {\n\t\tuser, ok, errMsg = auth.GetService(s).P(ctx)\n\t}\n\n\tif !ok {\n\t\tresponse.BadRequest(ctx, errMsg)\n\t\treturn\n\t}\n\n\terr := auth.SetCookie(ctx, user, h.conn)\n\n\tif err != nil {\n\t\tresponse.Error(ctx, err.Error())\n\t\treturn\n\t}\n\n\tif ref := ctx.Referer(); ref != \"\" {\n\t\tif u, err := url.Parse(ref); err == nil {\n\t\t\tv := u.Query()\n\t\t\tif r := v.Get(\"ref\"); r != \"\" {\n\t\t\t\trr, _ := url.QueryUnescape(r)\n\t\t\t\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\t\t\t\"url\": rr,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\"url\": h.config.GetIndexURL(),\n\t})\n}\n\n// Logout delete the cookie.\nfunc (h *Handler) Logout(ctx *context.Context) {\n\terr := auth.DelCookie(ctx, db.GetConnection(h.services))\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"logout error %+v\", err)\n\t}\n\tctx.AddHeader(\"Location\", h.config.Url(config.GetLoginUrl()))\n\tctx.SetStatusCode(302)\n}\n\n// ShowLogin show the login page.\nfunc (h *Handler) ShowLogin(ctx *context.Context) {\n\n\ttmpl, name := template.GetComp(\"login\").GetTemplate()\n\tbuf := new(bytes.Buffer)\n\tif err := tmpl.ExecuteTemplate(buf, name, struct {\n\t\tUrlPrefix string\n\t\tTitle     string\n\t\tLogo      template2.HTML\n\t\tCdnUrl    string\n\t\tSystem    types.SystemInfo\n\t}{\n\t\tUrlPrefix: h.config.AssertPrefix(),\n\t\tTitle:     h.config.LoginTitle,\n\t\tLogo:      h.config.LoginLogo,\n\t\tSystem: types.SystemInfo{\n\t\t\tVersion: system.Version(),\n\t\t},\n\t\tCdnUrl: h.config.AssetUrl,\n\t}); err == nil {\n\t\tctx.HTML(http.StatusOK, buf.String())\n\t} else {\n\t\tlogger.ErrorCtx(ctx, \"ShowLogin error %+v\", err)\n\t\tctx.HTML(http.StatusOK, \"parse template error (；′⌒`)\")\n\t}\n}\n"
  },
  {
    "path": "plugins/admin/controller/common.go",
    "content": "package controller\n\nimport (\n\t\"bytes\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\tc \"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Handler struct {\n\tconfig        *c.Config\n\tcaptchaConfig map[string]string\n\tservices      service.List\n\tconn          db.Connection\n\troutes        context.RouterMap\n\tgenerators    table.GeneratorList\n\toperations    []context.Node\n\tnavButtons    *types.Buttons\n\toperationLock sync.Mutex\n\tassetsTheme   map[string]string\n}\n\nfunc New(cfg ...Config) *Handler {\n\tif len(cfg) == 0 {\n\t\treturn &Handler{\n\t\t\toperations: make([]context.Node, 0),\n\t\t\tnavButtons: new(types.Buttons),\n\t\t}\n\t}\n\treturn &Handler{\n\t\tconfig:      cfg[0].Config,\n\t\tservices:    cfg[0].Services,\n\t\tconn:        cfg[0].Connection,\n\t\tgenerators:  cfg[0].Generators,\n\t\toperations:  make([]context.Node, 0),\n\t\tnavButtons:  new(types.Buttons),\n\t\tassetsTheme: make(map[string]string),\n\t}\n}\n\ntype Config struct {\n\tConfig     *c.Config\n\tServices   service.List\n\tConnection db.Connection\n\tGenerators table.GeneratorList\n}\n\nfunc (h *Handler) UpdateCfg(cfg Config) {\n\th.config = cfg.Config\n\th.services = cfg.Services\n\th.conn = cfg.Connection\n\th.generators = cfg.Generators\n\th.assetsTheme = make(map[string]string)\n}\n\nfunc (h *Handler) SetCaptcha(captcha map[string]string) {\n\th.captchaConfig = captcha\n}\n\nfunc (h *Handler) AssetsTheme(asset, theme string) {\n\th.assetsTheme[asset] = theme\n}\n\nfunc (h *Handler) SetRoutes(r context.RouterMap) {\n\th.routes = r\n}\n\nfunc (h *Handler) table(prefix string, ctx *context.Context) table.Table {\n\tt := h.generators[prefix](ctx)\n\tauthHandler := auth.Middleware(db.GetConnection(h.services))\n\tfor _, cb := range t.GetInfo().Callbacks {\n\t\tif cb.Value[constant.ContextNodeNeedAuth] == 1 {\n\t\t\th.AddOperation(context.Node{\n\t\t\t\tPath:     cb.Path,\n\t\t\t\tMethod:   cb.Method,\n\t\t\t\tHandlers: append([]context.Handler{authHandler}, cb.Handlers...),\n\t\t\t})\n\t\t} else {\n\t\t\th.AddOperation(context.Node{Path: cb.Path, Method: cb.Method, Handlers: cb.Handlers})\n\t\t}\n\t}\n\tfor _, cb := range t.GetForm().Callbacks {\n\t\tif cb.Value[constant.ContextNodeNeedAuth] == 1 {\n\t\t\th.AddOperation(context.Node{\n\t\t\t\tPath:     cb.Path,\n\t\t\t\tMethod:   cb.Method,\n\t\t\t\tHandlers: append([]context.Handler{authHandler}, cb.Handlers...),\n\t\t\t})\n\t\t} else {\n\t\t\th.AddOperation(context.Node{Path: cb.Path, Method: cb.Method, Handlers: cb.Handlers})\n\t\t}\n\t}\n\treturn t\n}\n\nfunc (h *Handler) route(name string) context.Router {\n\treturn h.routes.Get(name)\n}\n\nfunc (h *Handler) routePath(name string, value ...string) string {\n\treturn h.routes.Get(name).GetURL(value...)\n}\n\nfunc (h *Handler) routePathWithPrefix(name string, prefix string) string {\n\treturn h.routePath(name, \"prefix\", prefix)\n}\n\nfunc (h *Handler) AddOperation(nodes ...context.Node) {\n\th.operationLock.Lock()\n\tdefer h.operationLock.Unlock()\n\t// TODO: 避免重复增加，第一次加入后，后面大部分会存在重复情况，以下循环可以优化\n\taddNodes := make([]context.Node, 0)\n\tfor _, node := range nodes {\n\t\tif h.searchOperation(node.Path, node.Method) {\n\t\t\tcontinue\n\t\t}\n\t\taddNodes = append(addNodes, node)\n\t}\n\th.operations = append(h.operations, addNodes...)\n}\n\nfunc (h *Handler) AddNavButton(btns *types.Buttons) {\n\th.navButtons = btns\n\tfor _, btn := range *btns {\n\t\th.AddOperation(btn.GetAction().GetCallbacks())\n\t}\n}\n\nfunc (h *Handler) searchOperation(path, method string) bool {\n\tfor _, node := range h.operations {\n\t\tif node.Path == path && node.Method == method {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (h *Handler) OperationHandler(path string, ctx *context.Context) bool {\n\tfor _, node := range h.operations {\n\t\tif node.Path == path {\n\t\t\tfor _, handler := range node.Handlers {\n\t\t\t\thandler(ctx)\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (h *Handler) HTML(ctx *context.Context, user models.UserModel, panel types.Panel,\n\toptions ...template.ExecuteOptions) {\n\tbuf := h.Execute(ctx, user, panel, \"\", options...)\n\tctx.HTML(http.StatusOK, buf.String())\n}\n\nfunc (h *Handler) HTMLPlug(ctx *context.Context, user models.UserModel, panel types.Panel, plugName string,\n\toptions ...template.ExecuteOptions) {\n\tvar btns types.Buttons\n\tif plugName == \"\" {\n\t\tbtns = (*h.navButtons).CheckPermission(user)\n\t} else {\n\t\tbtns = (*h.navButtons).Copy().\n\t\t\tRemoveToolNavButton().\n\t\t\tRemoveSiteNavButton().\n\t\t\tRemoveInfoNavButton().\n\t\t\tAdd(types.GetDropDownButton(\"\", icon.Gear, []*types.NavDropDownItemButton{\n\t\t\t\ttypes.GetDropDownItemButton(language.GetFromHtml(\"plugin setting\"),\n\t\t\t\t\taction.Jump(h.config.Url(\"/info/plugin_\"+plugName+\"/edit\"))),\n\t\t\t\ttypes.GetDropDownItemButton(language.GetFromHtml(\"menus manage\"),\n\t\t\t\t\taction.Jump(h.config.Url(\"/menu?__plugin_name=\"+plugName))),\n\t\t\t})).\n\t\t\tCheckPermission(user)\n\t}\n\tbuf := h.ExecuteWithBtns(ctx, user, panel, plugName, btns, options...)\n\tctx.HTML(http.StatusOK, buf.String())\n}\n\nfunc (h *Handler) ExecuteWithBtns(ctx *context.Context, user models.UserModel, panel types.Panel, plugName string, btns types.Buttons,\n\toptions ...template.ExecuteOptions) *bytes.Buffer {\n\n\ttmpl, tmplName := aTemplate(ctx).GetTemplate(isPjax(ctx))\n\toption := template.GetExecuteOptions(options)\n\n\treturn template.Execute(ctx, &template.ExecuteParam{\n\t\tUser:       user,\n\t\tTmplName:   tmplName,\n\t\tTmpl:       tmpl,\n\t\tPanel:      panel,\n\t\tConfig:     h.config,\n\t\tMenu:       menu.GetGlobalMenu(user, h.conn, ctx.Lang(), plugName).SetActiveClass(h.config.URLRemovePrefix(ctx.Path())),\n\t\tAnimation:  option.Animation,\n\t\tButtons:    btns,\n\t\tIframe:     ctx.IsIframe(),\n\t\tIsPjax:     isPjax(ctx),\n\t\tNoCompress: option.NoCompress,\n\t})\n}\n\nfunc (h *Handler) Execute(ctx *context.Context, user models.UserModel, panel types.Panel, plugName string,\n\toptions ...template.ExecuteOptions) *bytes.Buffer {\n\n\ttmpl, tmplName := aTemplate(ctx).GetTemplate(isPjax(ctx))\n\toption := template.GetExecuteOptions(options)\n\n\treturn template.Execute(ctx, &template.ExecuteParam{\n\t\tUser:       user,\n\t\tTmplName:   tmplName,\n\t\tTmpl:       tmpl,\n\t\tPanel:      panel,\n\t\tConfig:     h.config,\n\t\tMenu:       menu.GetGlobalMenu(user, h.conn, ctx.Lang(), plugName).SetActiveClass(h.config.URLRemovePrefix(ctx.Path())),\n\t\tAnimation:  option.Animation,\n\t\tButtons:    (*h.navButtons).CheckPermission(user),\n\t\tIframe:     ctx.IsIframe(),\n\t\tIsPjax:     isPjax(ctx),\n\t\tNoCompress: option.NoCompress,\n\t})\n}\n\nfunc isInfoUrl(s string) bool {\n\treg, _ := regexp.Compile(\"(.*?)info/(.*?)$\")\n\tsub := reg.FindStringSubmatch(s)\n\treturn len(sub) > 2 && !strings.Contains(sub[2], \"/\")\n}\n\nfunc isNewUrl(s string, p string) bool {\n\treg, _ := regexp.Compile(\"(.*?)info/\" + p + \"/new\")\n\treturn reg.MatchString(s)\n}\n\nfunc isEditUrl(s string, p string) bool {\n\treg, _ := regexp.Compile(\"(.*?)info/\" + p + \"/edit\")\n\treturn reg.MatchString(s)\n}\n\nfunc (h *Handler) authSrv() *auth.TokenService {\n\treturn auth.GetTokenService(h.services.Get(auth.TokenServiceKey))\n}\n\nfunc aAlert(ctx *context.Context) types.AlertAttribute {\n\treturn aTemplate(ctx).Alert()\n}\n\nfunc aForm(ctx *context.Context) types.FormAttribute {\n\treturn aTemplate(ctx).Form()\n}\n\nfunc aRow(ctx *context.Context) types.RowAttribute {\n\treturn aTemplate(ctx).Row()\n}\n\nfunc aCol(ctx *context.Context) types.ColAttribute {\n\treturn aTemplate(ctx).Col()\n}\n\nfunc aImage(ctx *context.Context) types.ImgAttribute {\n\treturn aTemplate(ctx).Image()\n}\n\nfunc aButton(ctx *context.Context) types.ButtonAttribute {\n\treturn aTemplate(ctx).Button()\n}\n\nfunc aTree(ctx *context.Context) types.TreeAttribute {\n\treturn aTemplate(ctx).Tree()\n}\n\nfunc aTable(ctx *context.Context) types.TableAttribute {\n\treturn aTemplate(ctx).Table()\n}\n\nfunc aDataTable(ctx *context.Context) types.DataTableAttribute {\n\treturn aTemplate(ctx).DataTable()\n}\n\nfunc aBox(ctx *context.Context) types.BoxAttribute {\n\treturn aTemplate(ctx).Box()\n}\n\nfunc aTab(ctx *context.Context) types.TabsAttribute {\n\treturn aTemplate(ctx).Tabs()\n}\n\nfunc aTemplate(ctx *context.Context) template.Template {\n\treturn template.Get(ctx, c.GetTheme())\n}\n\nfunc aTemplateByTheme(ctx *context.Context, theme string) template.Template {\n\treturn template.Get(ctx, theme)\n}\n\nfunc isPjax(ctx *context.Context) bool {\n\treturn ctx.IsPjax()\n}\n\nfunc formFooter(ctx *context.Context, page string, isHideEdit, isHideNew, isHideReset bool, btnWord template2.HTML) template2.HTML {\n\tcol1 := aCol(ctx).SetSize(types.SizeMD(2)).GetContent()\n\n\tvar (\n\t\tcheckBoxs  template2.HTML\n\t\tcheckBoxJS template2.HTML\n\n\t\teditCheckBox = template.HTML(`\n\t\t\t<label class=\"pull-right\" style=\"margin: 5px 10px 0 0;\">\n                <input type=\"checkbox\" class=\"continue_edit\" style=\"position: absolute; opacity: 0;\"> ` + language.Get(\"continue editing\") + `\n            </label>`)\n\t\tnewCheckBox = template.HTML(`\n\t\t\t<label class=\"pull-right\" style=\"margin: 5px 10px 0 0;\">\n                <input type=\"checkbox\" class=\"continue_new\" style=\"position: absolute; opacity: 0;\"> ` + language.Get(\"continue creating\") + `\n            </label>`)\n\n\t\teditWithNewCheckBoxJs = template.HTML(`$('.continue_edit').iCheck({checkboxClass: 'icheckbox_minimal-blue'}).on('ifChanged', function (event) {\n\t\tif (this.checked) {\n\t\t\t$('.continue_new').iCheck('uncheck');\n\t\t\t$('input[name=\"` + form.PreviousKey + `\"]').val(location.href)\n\t\t} else {\n\t\t\t$('input[name=\"` + form.PreviousKey + `\"]').val(previous_url_goadmin)\n\t\t}\n\t});\t`)\n\n\t\tnewWithEditCheckBoxJs = template.HTML(`$('.continue_new').iCheck({checkboxClass: 'icheckbox_minimal-blue'}).on('ifChanged', function (event) {\n\t\tif (this.checked) {\n\t\t\t$('.continue_edit').iCheck('uncheck');\n\t\t\t$('input[name=\"` + form.PreviousKey + `\"]').val(location.href.replace('/edit', '/new'))\n\t\t} else {\n\t\t\t$('input[name=\"` + form.PreviousKey + `\"]').val(previous_url_goadmin)\n\t\t}\n\t});`)\n\t)\n\n\tif page == \"edit\" {\n\t\tif isHideNew {\n\t\t\tnewCheckBox = \"\"\n\t\t\tnewWithEditCheckBoxJs = \"\"\n\t\t}\n\t\tif isHideEdit {\n\t\t\teditCheckBox = \"\"\n\t\t\teditWithNewCheckBoxJs = \"\"\n\t\t}\n\t\tcheckBoxs = editCheckBox + newCheckBox\n\t\tcheckBoxJS = `<script>\t\n\tlet previous_url_goadmin = $('input[name=\"` + form.PreviousKey + `\"]').attr(\"value\")\n\t` + editWithNewCheckBoxJs + newWithEditCheckBoxJs + `\n</script>\n`\n\t} else if page == \"edit_only\" && !isHideEdit {\n\t\tcheckBoxs = editCheckBox\n\t\tcheckBoxJS = template.HTML(`\t<script>\n\tlet previous_url_goadmin = $('input[name=\"` + form.PreviousKey + `\"]').attr(\"value\")\n\t$('.continue_edit').iCheck({checkboxClass: 'icheckbox_minimal-blue'}).on('ifChanged', function (event) {\n\t\tif (this.checked) {\n\t\t\t$('input[name=\"` + form.PreviousKey + `\"]').val(location.href)\n\t\t} else {\n\t\t\t$('input[name=\"` + form.PreviousKey + `\"]').val(previous_url_goadmin)\n\t\t}\n\t});\n</script>\n`)\n\t} else if page == \"new\" && !isHideNew {\n\t\tcheckBoxs = newCheckBox\n\t\tcheckBoxJS = template.HTML(`\t<script>\n\tlet previous_url_goadmin = $('input[name=\"` + form.PreviousKey + `\"]').attr(\"value\")\n\t$('.continue_new').iCheck({checkboxClass: 'icheckbox_minimal-blue'}).on('ifChanged', function (event) {\n\t\tif (this.checked) {\n\t\t\t$('input[name=\"` + form.PreviousKey + `\"]').val(location.href)\n\t\t} else {\n\t\t\t$('input[name=\"` + form.PreviousKey + `\"]').val(previous_url_goadmin)\n\t\t}\n\t});\n</script>\n`)\n\t}\n\n\tbtn1 := aButton(ctx).\n\t\tSetType(\"submit\").\n\t\tAddClass(\"submit\").\n\t\tSetContent(btnWord).\n\t\tSetThemePrimary().\n\t\tSetOrientationRight().\n\t\tGetContent()\n\tbtn2 := template.HTML(\"\")\n\tif !isHideReset {\n\t\tbtn2 = aButton(ctx).\n\t\t\tSetType(\"reset\").\n\t\t\tAddClass(\"reset\").\n\t\t\tSetContent(language.GetFromHtml(\"Reset\")).\n\t\t\tSetThemeWarning().\n\t\t\tSetOrientationLeft().\n\t\t\tGetContent()\n\t}\n\tcol2 := aCol(ctx).SetSize(types.SizeMD(8)).\n\t\tSetContent(btn1 + checkBoxs + btn2 + checkBoxJS).GetContent()\n\treturn col1 + col2\n}\n\nfunc filterFormFooter(ctx *context.Context, infoUrl string) template2.HTML {\n\tcol1 := aCol(ctx).SetSize(types.SizeMD(2)).GetContent()\n\tbtn1 := aButton(ctx).SetType(\"submit\").\n\t\tAddClass(\"submit\").\n\t\tSetContent(icon.Icon(icon.Search, 2) + language.GetFromHtml(\"search\")).\n\t\tSetThemePrimary().\n\t\tSetSmallSize().\n\t\tSetOrientationLeft().\n\t\tSetLoadingText(icon.Icon(icon.Spinner, 1) + language.GetFromHtml(\"search\")).\n\t\tGetContent()\n\tbtn2 := aButton(ctx).SetType(\"reset\").\n\t\tAddClass(\"reset\").\n\t\tSetContent(icon.Icon(icon.Undo, 2) + language.GetFromHtml(\"reset\")).\n\t\tSetThemeDefault().\n\t\tSetOrientationLeft().\n\t\tSetSmallSize().\n\t\tSetHref(infoUrl).\n\t\tSetMarginLeft(12).\n\t\tGetContent()\n\tcol2 := aCol(ctx).SetSize(types.SizeMD(8)).\n\t\tSetContent(btn1 + btn2).GetContent()\n\treturn col1 + col2\n}\n\nfunc formContent(ctx *context.Context, form types.FormAttribute, isTab, iframe, isHideBack bool, header template2.HTML) template2.HTML {\n\tif isTab {\n\t\treturn form.GetContent()\n\t}\n\tif iframe {\n\t\theader = \"\"\n\t} else if header == template2.HTML(\"\") {\n\t\theader = form.GetDefaultBoxHeader(isHideBack)\n\t}\n\treturn aBox(ctx).\n\t\tSetHeader(header).\n\t\tWithHeadBorder().\n\t\tSetStyle(\" \").\n\t\tSetIframeStyle(iframe).\n\t\tSetBody(form.GetContent()).\n\t\tGetContent()\n}\n\nfunc detailContent(ctx *context.Context, form types.FormAttribute, editUrl, deleteUrl string, iframe bool) template2.HTML {\n\treturn aBox(ctx).\n\t\tSetHeader(form.GetDetailBoxHeader(editUrl, deleteUrl)).\n\t\tWithHeadBorder().\n\t\tSetBody(form.GetContent()).\n\t\tSetIframeStyle(iframe).\n\t\tGetContent()\n}\n\nfunc menuFormContent(ctx *context.Context, form types.FormAttribute) template2.HTML {\n\treturn aBox(ctx).\n\t\tSetHeader(form.GetBoxHeaderNoButton()).\n\t\tSetStyle(\" \").\n\t\tWithHeadBorder().\n\t\tSetBody(form.GetContent()).\n\t\tGetContent()\n}\n"
  },
  {
    "path": "plugins/admin/controller/common_test.go",
    "content": "package controller\n\nimport (\n\t\"testing\"\n\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc TestIsInfoUrl(t *testing.T) {\n\tu := \"https://localhost:8098/admin/info/user?id=sdfs\"\n\tassert.Equal(t, true, isInfoUrl(u))\n}\n\nfunc TestIsNewUrl(t *testing.T) {\n\tu := \"https://localhost:8098/admin/info/user/new?id=sdfs\"\n\tassert.Equal(t, true, isNewUrl(u, \"user\"))\n}\n"
  },
  {
    "path": "plugins/admin/controller/delete.go",
    "content": "package controller\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n)\n\n// Delete delete the row from database.\nfunc (h *Handler) Delete(ctx *context.Context) {\n\n\tparam := guard.GetDeleteParam(ctx)\n\n\t//token := ctx.FormValue(\"_t\")\n\t//\n\t//if !auth.TokenHelper.CheckToken(token) {\n\t//\tctx.SetStatusCode(http.StatusBadRequest)\n\t//\tctx.WriteString(`{\"code\":400, \"msg\":\"delete fail\"}`)\n\t//\treturn\n\t//}\n\n\tif err := h.table(param.Prefix, ctx).DeleteData(param.Id); err != nil {\n\t\tlogger.ErrorCtx(ctx, \"Delete error %+v\", err)\n\t\tresponse.Error(ctx, \"delete fail\")\n\t\treturn\n\t}\n\n\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\"token\": h.authSrv().AddToken(),\n\t})\n}\n"
  },
  {
    "path": "plugins/admin/controller/detail.go",
    "content": "package controller\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\tform2 \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\nfunc (h *Handler) ShowDetail(ctx *context.Context) {\n\n\tvar (\n\t\tprefix    = ctx.Query(constant.PrefixKey)\n\t\tid        = ctx.Query(constant.DetailPKKey)\n\t\tpanel     = h.table(prefix, ctx)\n\t\tuser      = auth.Auth(ctx)\n\t\tnewPanel  = panel.Copy()\n\t\tdetail    = panel.GetDetail()\n\t\tinfo      = panel.GetInfo()\n\t\tformModel = newPanel.GetForm()\n\t\tfieldList = make(types.FieldList, 0)\n\t)\n\n\tif len(detail.FieldList) == 0 {\n\t\tfieldList = info.FieldList\n\t} else {\n\t\tfieldList = detail.FieldList\n\t}\n\n\tformModel.FieldList = make([]types.FormField, len(fieldList))\n\n\tfor i, field := range fieldList {\n\t\tformModel.FieldList[i] = types.FormField{\n\t\t\tField:        field.Field,\n\t\t\tFieldClass:   field.Field,\n\t\t\tTypeName:     field.TypeName,\n\t\t\tHead:         field.Head,\n\t\t\tHide:         field.Hide,\n\t\t\tJoins:        field.Joins,\n\t\t\tFormType:     form.Default,\n\t\t\tFieldDisplay: field.FieldDisplay,\n\t\t}\n\t}\n\n\tif detail.Table != \"\" {\n\t\tformModel.Table = detail.Table\n\t} else {\n\t\tformModel.Table = info.Table\n\t}\n\n\tparam := parameter.GetParam(ctx.Request.URL,\n\t\tinfo.DefaultPageSize,\n\t\tinfo.SortField,\n\t\tinfo.GetSort())\n\n\tparamStr := param.DeleteDetailPk().GetRouteParamStr()\n\n\teditUrl := modules.AorEmpty(!info.IsHideEditButton, h.routePathWithPrefix(\"show_edit\", prefix)+paramStr+\n\t\t\"&\"+constant.EditPKKey+\"=\"+ctx.Query(constant.DetailPKKey))\n\tdeleteUrl := modules.AorEmpty(!info.IsHideDeleteButton, h.routePathWithPrefix(\"delete\", prefix)+paramStr)\n\tinfoUrl := h.routePathWithPrefix(\"info\", prefix) + paramStr\n\n\teditUrl = user.GetCheckPermissionByUrlMethod(editUrl, h.route(\"show_edit\").Method())\n\tdeleteUrl = user.GetCheckPermissionByUrlMethod(deleteUrl, h.route(\"delete\").Method())\n\n\tdeleteJs := \"\"\n\n\tif deleteUrl != \"\" {\n\t\tdeleteJs = fmt.Sprintf(`<script>\nfunction DeletePost(id) {\n\tswal({\n\t\t\ttitle: '%s',\n\t\t\ttype: \"warning\",\n\t\t\tshowCancelButton: true,\n\t\t\tconfirmButtonColor: \"#DD6B55\",\n\t\t\tconfirmButtonText: '%s',\n\t\t\tcloseOnConfirm: false,\n\t\t\tcancelButtonText: '%s',\n\t\t},\n\t\tfunction () {\n\t\t\t$.ajax({\n\t\t\t\tmethod: 'post',\n\t\t\t\turl: '%s',\n\t\t\t\tdata: {\n\t\t\t\t\tid: id\n\t\t\t\t},\n\t\t\t\tsuccess: function (data) {\n\t\t\t\t\tif (typeof (data) === \"string\") {\n\t\t\t\t\t\tdata = JSON.parse(data);\n\t\t\t\t\t}\n\t\t\t\t\tif (data.code === 200) {\n\t\t\t\t\t\tlocation.href = '%s'\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswal(data.msg, '', 'error');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n}\n\n$('.delete-btn').on('click', function (event) {\n\tDeletePost('%s')\n});\n\n</script>`, language.Get(\"are you sure to delete\"), language.Get(\"yes\"),\n\t\t\tlanguage.Get(\"cancel\"), deleteUrl, infoUrl, id)\n\t}\n\n\ttitle := \"\"\n\tdesc := \"\"\n\n\tisNotIframe := ctx.Query(constant.IframeKey) != \"true\"\n\n\tif isNotIframe {\n\t\ttitle = detail.Title\n\n\t\tif title == \"\" {\n\t\t\ttitle = info.Title + language.Get(\"Detail\")\n\t\t}\n\n\t\tdesc = detail.Description\n\n\t\tif desc == \"\" {\n\t\t\tdesc = info.Description + language.Get(\"Detail\")\n\t\t}\n\t}\n\n\tformInfo, err := newPanel.GetDataWithId(param.WithPKs(id))\n\n\tif err != nil {\n\t\th.HTML(ctx, user, template.WarningPanelWithDescAndTitle(ctx, err.Error(), desc, title),\n\t\t\ttemplate.ExecuteOptions{Animation: param.Animation})\n\t\treturn\n\t}\n\n\th.HTML(ctx, user, types.Panel{\n\t\tContent: detailContent(ctx, aForm(ctx).\n\t\t\tSetTitle(template.HTML(title)).\n\t\t\tSetContent(formInfo.FieldList).\n\t\t\tSetHeader(detail.HeaderHtml).\n\t\t\tSetFooter(template.HTML(deleteJs)+detail.FooterHtml).\n\t\t\tSetHiddenFields(map[string]string{\n\t\t\t\tform2.PreviousKey: infoUrl,\n\t\t\t}).\n\t\t\tSetPrefix(h.config.PrefixFixSlash()), editUrl, deleteUrl, !isNotIframe),\n\t\tDescription: template.HTML(desc),\n\t\tTitle:       template.HTML(title),\n\t}, template.ExecuteOptions{Animation: param.Animation})\n}\n"
  },
  {
    "path": "plugins/admin/controller/edit.go",
    "content": "package controller\n\nimport (\n\t\"fmt\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/file\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\tform2 \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\n// ShowForm show form page.\nfunc (h *Handler) ShowForm(ctx *context.Context) {\n\tparam := guard.GetShowFormParam(ctx)\n\th.showForm(ctx, \"\", param.Prefix, param.Param, false)\n}\n\nfunc (h *Handler) showForm(ctx *context.Context, alert template2.HTML, prefix string, param parameter.Parameters, isEdit bool, animation ...bool) {\n\n\tpanel := h.table(prefix, ctx)\n\n\tif panel.GetForm().HasError() {\n\t\tif panel.GetForm().PageErrorHTML != template2.HTML(\"\") {\n\t\t\th.HTML(ctx, auth.Auth(ctx),\n\t\t\t\ttypes.Panel{Content: panel.GetForm().PageErrorHTML}, template.ExecuteOptions{Animation: param.Animation})\n\t\t\treturn\n\t\t}\n\t\th.HTML(ctx, auth.Auth(ctx),\n\t\t\ttemplate.WarningPanel(ctx, panel.GetForm().PageError.Error(),\n\t\t\t\ttemplate.GetPageTypeFromPageError(panel.GetForm().PageError)), template.ExecuteOptions{Animation: param.Animation})\n\t\treturn\n\t}\n\n\tvar (\n\t\tuser       = auth.Auth(ctx)\n\t\tparamStr   = param.GetRouteParamStr()\n\t\tnewUrl     = modules.AorEmpty(panel.GetCanAdd(), h.routePathWithPrefix(\"show_new\", prefix)+paramStr)\n\t\tfooterKind = \"edit\"\n\t)\n\n\tif newUrl == \"\" || !user.CheckPermissionByUrlMethod(newUrl, h.route(\"show_new\").Method(), url.Values{}) {\n\t\tfooterKind = \"edit_only\"\n\t}\n\n\tformInfo, err := panel.GetDataWithId(param)\n\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"receive data error: %+v\", err)\n\t\th.HTML(ctx, user, template.\n\t\t\tWarningPanelWithDescAndTitle(ctx, err.Error(), panel.GetForm().Description, panel.GetForm().Title),\n\t\t\ttemplate.ExecuteOptions{Animation: alert == \"\" || ((len(animation) > 0) && animation[0])})\n\n\t\tif isEdit {\n\t\t\tctx.AddHeader(constant.PjaxUrlHeader, h.routePathWithPrefix(\"show_edit\", prefix)+\n\t\t\t\tparam.DeletePK().GetRouteParamStr())\n\t\t}\n\t\treturn\n\t}\n\n\tshowEditUrl := h.routePathWithPrefix(\"show_edit\", prefix) + param.DeletePK().GetRouteParamStr()\n\tinfoUrl := h.routePathWithPrefix(\"info\", prefix) + param.DeleteField(constant.EditPKKey).GetRouteParamStr()\n\teditUrl := h.routePathWithPrefix(\"edit\", prefix)\n\treferer := ctx.Referer()\n\n\tif referer != \"\" && !isInfoUrl(referer) && !isEditUrl(referer, ctx.Query(constant.PrefixKey)) {\n\t\tinfoUrl = referer\n\t}\n\n\tf := panel.GetForm()\n\n\tisNotIframe := ctx.Query(constant.IframeKey) != \"true\"\n\n\thiddenFields := map[string]string{\n\t\tform2.TokenKey:    h.authSrv().AddToken(),\n\t\tform2.PreviousKey: infoUrl,\n\t}\n\n\tif ctx.Query(constant.IframeKey) != \"\" {\n\t\thiddenFields[constant.IframeKey] = ctx.Query(constant.IframeKey)\n\t}\n\n\tif ctx.Query(constant.IframeIDKey) != \"\" {\n\t\thiddenFields[constant.IframeIDKey] = ctx.Query(constant.IframeIDKey)\n\t}\n\n\tcontent := formContent(ctx, aForm(ctx).\n\t\tSetContent(formInfo.FieldList).\n\t\tSetFieldsHTML(f.HTMLContent).\n\t\tSetTabContents(formInfo.GroupFieldList).\n\t\tSetTabHeaders(formInfo.GroupFieldHeaders).\n\t\tSetPrefix(h.config.PrefixFixSlash()).\n\t\tSetInputWidth(f.InputWidth).\n\t\tSetHeadWidth(f.HeadWidth).\n\t\tSetPrimaryKey(panel.GetPrimaryKey().Name).\n\t\tSetUrl(editUrl).\n\t\tSetTitle(f.FormEditTitle).\n\t\tSetAjax(f.AjaxSuccessJS, f.AjaxErrorJS).\n\t\tSetLayout(f.Layout).\n\t\tSetHiddenFields(hiddenFields).\n\t\tSetOperationFooter(formFooter(ctx, footerKind,\n\t\t\tf.IsHideContinueEditCheckBox,\n\t\t\tf.IsHideContinueNewCheckBox,\n\t\t\tf.IsHideResetButton, f.FormEditBtnWord)).\n\t\tSetHeader(f.HeaderHtml).\n\t\tSetFooter(f.FooterHtml), len(formInfo.GroupFieldHeaders) > 0, !isNotIframe, f.IsHideBackButton, f.Header)\n\n\tif f.Wrapper != nil {\n\t\tcontent = f.Wrapper(content)\n\t}\n\n\th.HTML(ctx, user, types.Panel{\n\t\tContent:     alert + content,\n\t\tDescription: template2.HTML(formInfo.Description),\n\t\tTitle:       modules.AorBHTML(isNotIframe, template2.HTML(formInfo.Title), \"\"),\n\t\tMiniSidebar: f.HideSideBar,\n\t}, template.ExecuteOptions{Animation: alert == \"\" || ((len(animation) > 0) && animation[0]), NoCompress: f.NoCompress})\n\n\tif isEdit {\n\t\tctx.AddHeader(constant.PjaxUrlHeader, showEditUrl)\n\t}\n}\n\nfunc (h *Handler) EditForm(ctx *context.Context) {\n\n\tparam := guard.GetEditFormParam(ctx)\n\n\tif len(param.MultiForm.File) > 0 {\n\t\terr := file.GetFileEngine(h.config.FileUploadEngine.Name).Upload(param.MultiForm)\n\t\tif err != nil {\n\t\t\tlogger.ErrorCtx(ctx, \"get file engine error: %+v\", err)\n\t\t\tif ctx.WantJSON() {\n\t\t\t\tresponse.Error(ctx, err.Error())\n\t\t\t} else {\n\t\t\t\th.showForm(ctx, aAlert(ctx).Warning(err.Error()), param.Prefix, param.Param, true)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\n\tformPanel := param.Panel.GetForm()\n\n\tfor i := 0; i < len(formPanel.FieldList); i++ {\n\t\tif formPanel.FieldList[i].FormType == form.File &&\n\t\t\tlen(param.MultiForm.File[formPanel.FieldList[i].Field]) == 0 &&\n\t\t\tlen(param.MultiForm.Value[formPanel.FieldList[i].Field+\"__delete_flag\"]) > 0 &&\n\t\t\tparam.MultiForm.Value[formPanel.FieldList[i].Field+\"__delete_flag\"][0] != \"1\" {\n\t\t\tparam.MultiForm.Value[formPanel.FieldList[i].Field] = []string{\"\"}\n\t\t}\n\t\tif formPanel.FieldList[i].FormType == form.File &&\n\t\t\tlen(param.MultiForm.Value[formPanel.FieldList[i].Field+\"__change_flag\"]) > 0 &&\n\t\t\tparam.MultiForm.Value[formPanel.FieldList[i].Field+\"__change_flag\"][0] != \"1\" {\n\t\t\tdelete(param.MultiForm.Value, formPanel.FieldList[i].Field)\n\t\t}\n\t}\n\n\terr := param.Panel.UpdateData(ctx, param.Value())\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"update data error: %+v\", err)\n\t\tif ctx.WantJSON() {\n\t\t\tresponse.Error(ctx, err.Error(), map[string]interface{}{\n\t\t\t\t\"token\": h.authSrv().AddToken(),\n\t\t\t})\n\t\t} else {\n\t\t\th.showForm(ctx, aAlert(ctx).Warning(err.Error()), param.Prefix, param.Param, true)\n\t\t}\n\t\treturn\n\t}\n\n\tif formPanel.Responder != nil {\n\t\tformPanel.Responder(ctx)\n\t\treturn\n\t}\n\n\tif ctx.WantJSON() && !param.IsIframe {\n\t\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\t\"url\":   param.PreviousPath,\n\t\t\t\"token\": h.authSrv().AddToken(),\n\t\t})\n\t\treturn\n\t}\n\n\tif !param.FromList {\n\n\t\tif isNewUrl(param.PreviousPath, param.Prefix) {\n\t\t\th.showNewForm(ctx, param.Alert, param.Prefix, param.Param.DeleteEditPk().GetRouteParamStr(), true)\n\t\t\treturn\n\t\t}\n\n\t\tif isEditUrl(param.PreviousPath, param.Prefix) {\n\t\t\th.showForm(ctx, param.Alert, param.Prefix, param.Param, true, false)\n\t\t\treturn\n\t\t}\n\n\t\tctx.HTML(http.StatusOK, fmt.Sprintf(`<script>location.href=\"%s\"</script>`, param.PreviousPath))\n\t\tctx.AddHeader(constant.PjaxUrlHeader, param.PreviousPath)\n\t\treturn\n\t}\n\n\tif param.IsIframe {\n\t\tctx.HTML(http.StatusOK, fmt.Sprintf(`<script>\n\t\tswal('%s', '', 'success');\n\t\tsetTimeout(function(){\n\t\t\t$(\"#%s\", window.parent.document).hide();\n\t\t\t$('.modal-backdrop.fade.in', window.parent.document).hide();\n\t\t}, 1000)\n</script>`, language.Get(\"success\"), param.IframeID))\n\t\treturn\n\t}\n\n\tbuf := h.showTable(ctx, param.Prefix, param.Param.DeletePK().DeleteEditPk(), nil)\n\n\tctx.HTML(http.StatusOK, buf.String())\n\tctx.AddHeader(constant.PjaxUrlHeader, param.PreviousPath)\n}\n"
  },
  {
    "path": "plugins/admin/controller/handler.go",
    "content": "package controller\n\nimport (\n\ttemplate2 \"html/template\"\n\t\"regexp\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"golang.org/x/text/cases\"\n\t\"golang.org/x/text/language\"\n)\n\n// GlobalDeferHandler is a global error handler of admin plugin.\nfunc (h *Handler) GlobalDeferHandler(ctx *context.Context) {\n\n\tlogger.Access(ctx)\n\n\tif !h.config.OperationLogOff {\n\t\th.RecordOperationLog(ctx)\n\t}\n\n\tif err := recover(); err != nil {\n\t\tlogger.ErrorCtx(ctx, \"GlobalDeferHandler error %+v\", err)\n\n\t\tvar (\n\t\t\terrMsg string\n\t\t\tok     bool\n\t\t\te      error\n\t\t)\n\n\t\tif errMsg, ok = err.(string); !ok {\n\t\t\tif e, ok = err.(error); ok {\n\t\t\t\terrMsg = e.Error()\n\t\t\t}\n\t\t}\n\n\t\tif errMsg == \"\" {\n\t\t\terrMsg = \"system error\"\n\t\t}\n\n\t\tif ctx.WantJSON() {\n\t\t\tresponse.Error(ctx, errMsg)\n\t\t\treturn\n\t\t}\n\n\t\tif ok, _ = regexp.MatchString(\"/edit(.*)\", ctx.Path()); ok {\n\t\t\th.setFormWithReturnErrMessage(ctx, errMsg, \"edit\")\n\t\t\treturn\n\t\t}\n\t\tif ok, _ = regexp.MatchString(\"/new(.*)\", ctx.Path()); ok {\n\t\t\th.setFormWithReturnErrMessage(ctx, errMsg, \"new\")\n\t\t\treturn\n\t\t}\n\n\t\th.HTML(ctx, auth.Auth(ctx), template.WarningPanelWithDescAndTitle(ctx, errMsg, errors.Msg, errors.Msg))\n\t}\n}\n\nfunc (h *Handler) setFormWithReturnErrMessage(ctx *context.Context, errMsg string, kind string) {\n\n\tvar (\n\t\tformInfo table.FormInfo\n\t\tprefix   = ctx.Query(constant.PrefixKey)\n\t\tpanel    = h.table(prefix, ctx)\n\t\tbtnWord  template2.HTML\n\t\tf        *types.FormPanel\n\t)\n\n\tif kind == \"edit\" {\n\t\tf = panel.GetForm()\n\t\tid := ctx.Query(\"id\")\n\t\tif id == \"\" {\n\t\t\tid = ctx.Request.MultipartForm.Value[panel.GetPrimaryKey().Name][0]\n\t\t}\n\t\tformInfo, _ = panel.GetDataWithId(parameter.GetParam(ctx.Request.URL,\n\t\t\tpanel.GetInfo().DefaultPageSize,\n\t\t\tpanel.GetInfo().SortField,\n\t\t\tpanel.GetInfo().GetSort()).WithPKs(id))\n\t\tbtnWord = f.FormEditBtnWord\n\t} else {\n\t\tf = panel.GetActualNewForm()\n\t\tformInfo = panel.GetNewFormInfo()\n\t\tformInfo.Title = f.Title\n\t\tformInfo.Description = f.Description\n\t\tbtnWord = f.FormNewBtnWord\n\t}\n\n\tqueryParam := parameter.GetParam(ctx.Request.URL, panel.GetInfo().DefaultPageSize,\n\t\tpanel.GetInfo().SortField, panel.GetInfo().GetSort()).GetRouteParamStr()\n\n\th.HTML(ctx, auth.Auth(ctx), types.Panel{\n\t\tContent: aAlert(ctx).Warning(errMsg) + formContent(ctx, aForm(ctx).\n\t\t\tSetContent(formInfo.FieldList).\n\t\t\tSetTabContents(formInfo.GroupFieldList).\n\t\t\tSetTabHeaders(formInfo.GroupFieldHeaders).\n\t\t\tSetTitle(template2.HTML(cases.Title(language.Und).String(kind))).\n\t\t\tSetPrimaryKey(panel.GetPrimaryKey().Name).\n\t\t\tSetPrefix(h.config.PrefixFixSlash()).\n\t\t\tSetHiddenFields(map[string]string{\n\t\t\t\tform.TokenKey:    h.authSrv().AddToken(),\n\t\t\t\tform.PreviousKey: h.config.Url(\"/info/\" + prefix + queryParam),\n\t\t\t}).\n\t\t\tSetUrl(h.config.Url(\"/\"+kind+\"/\"+prefix)).\n\t\t\tSetOperationFooter(formFooter(ctx, kind, f.IsHideContinueEditCheckBox, f.IsHideContinueNewCheckBox,\n\t\t\t\tf.IsHideResetButton, btnWord)).\n\t\t\tSetHeader(f.HeaderHtml).\n\t\t\tSetFooter(f.FooterHtml), len(formInfo.GroupFieldHeaders) > 0,\n\t\t\tctx.IsIframe(),\n\t\t\tf.IsHideBackButton, f.Header),\n\t\tDescription: template2.HTML(formInfo.Description),\n\t\tTitle:       template2.HTML(formInfo.Title),\n\t})\n\n\tctx.AddHeader(constant.PjaxUrlHeader, h.config.Url(\"/info/\"+prefix+\"/\"+kind+queryParam))\n}\n"
  },
  {
    "path": "plugins/admin/controller/install.go",
    "content": "package controller\n\nimport (\n\t\"bytes\"\n\t\"database/sql\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n)\n\n// ShowInstall show install page.\nfunc (h *Handler) ShowInstall(ctx *context.Context) {\n\n\tbuffer := new(bytes.Buffer)\n\t//template.GetInstallPage(buffer)\n\n\t//rs, _ := mysql.Query(\"show tables;\")\n\t//fmt.Println(rs[0][\"Tables_in_godmin\"])\n\n\t//rs2, _ := mysql.Query(\"show columns from users\")\n\t//fmt.Println(rs2[0][\"Field\"])\n\n\tctx.HTML(http.StatusOK, buffer.String())\n}\n\n// CheckDatabase check the database connection.\nfunc (h *Handler) CheckDatabase(ctx *context.Context) {\n\n\tip := ctx.FormValue(\"h\")\n\tport := ctx.FormValue(\"po\")\n\tusername := ctx.FormValue(\"u\")\n\tpassword := ctx.FormValue(\"pa\")\n\tdatabaseName := ctx.FormValue(\"db\")\n\n\tSqlDB, err := sql.Open(\"mysql\", username+\":\"+password+\"@tcp(\"+ip+\":\"+port+\")/\"+databaseName+\"?charset=utf8mb4\")\n\tif SqlDB != nil {\n\t\tif SqlDB.Ping() != nil {\n\t\t\tresponse.Error(ctx, \"请检查参数是否设置正确\")\n\t\t\treturn\n\t\t}\n\t}\n\n\tdefer func() {\n\t\t_ = SqlDB.Close()\n\t}()\n\n\tif err != nil {\n\t\tresponse.Error(ctx, \"请检查参数是否设置正确\")\n\t\treturn\n\n\t}\n\n\t//db.InitDB(username, password, port, ip, databaseName, 100, 100)\n\n\ttables := make([]map[string]interface{}, 0)\n\n\tlist := \"[\"\n\n\tfor i := 0; i < len(tables); i++ {\n\t\tif i != len(tables)-1 {\n\t\t\tlist += `\"` + tables[i][\"Tables_in_godmin\"].(string) + `\",`\n\t\t} else {\n\t\t\tlist += `\"` + tables[i][\"Tables_in_godmin\"].(string) + `\"`\n\t\t}\n\t}\n\tlist += \"]\"\n\n\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\"list\": list,\n\t})\n}\n"
  },
  {
    "path": "plugins/admin/controller/menu.go",
    "content": "package controller\n\nimport (\n\t\"encoding/json\"\n\ttemplate2 \"html/template\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\tform2 \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// ShowMenu show menu info page.\nfunc (h *Handler) ShowMenu(ctx *context.Context) {\n\th.getMenuInfoPanel(ctx, \"\", \"\")\n}\n\n// ShowNewMenu show new menu page.\nfunc (h *Handler) ShowNewMenu(ctx *context.Context) {\n\th.showNewMenu(ctx, nil)\n}\n\nfunc getPlugNameFromReferer(ctx *context.Context) string {\n\tplugName := \"\"\n\tif ref := ctx.Referer(); ref != \"\" {\n\t\tif u, err := url.Parse(ref); err == nil && u != nil {\n\t\t\tplugName = u.Query().Get(\"__plugin_name\")\n\t\t}\n\t}\n\treturn plugName\n}\n\nfunc getMenuPlugNameParams(plugName string) string {\n\tparams := \"\"\n\tif plugName != \"\" {\n\t\tparams = \"?__plugin_name=\" + plugName\n\t}\n\treturn params\n}\n\nfunc (h *Handler) showNewMenu(ctx *context.Context, err error) {\n\n\tvar (\n\t\talert template2.HTML\n\n\t\tpanel    = h.table(\"menu\", ctx)\n\t\tformInfo = panel.GetNewFormInfo()\n\t\tuser     = auth.Auth(ctx)\n\t\tplugName = getPlugNameFromReferer(ctx)\n\t)\n\n\tif err != nil {\n\t\talert = aAlert(ctx).Warning(err.Error())\n\t}\n\n\th.HTMLPlug(ctx, user, types.Panel{\n\t\tContent: alert + formContent(ctx, aForm(ctx).\n\t\t\tSetContent(formInfo.FieldList).\n\t\t\tSetTabContents(formInfo.GroupFieldList).\n\t\t\tSetTabHeaders(formInfo.GroupFieldHeaders).\n\t\t\tSetPrefix(h.config.PrefixFixSlash()).\n\t\t\tSetPrimaryKey(panel.GetPrimaryKey().Name).\n\t\t\tSetUrl(h.routePath(\"menu_edit\")).\n\t\t\tSetHiddenFields(map[string]string{\n\t\t\t\tform2.TokenKey:    h.authSrv().AddToken(),\n\t\t\t\tform2.PreviousKey: h.routePath(\"menu\") + getMenuPlugNameParams(plugName),\n\t\t\t}).\n\t\t\tSetOperationFooter(formFooter(ctx, \"new\", false, false, false,\n\t\t\t\tpanel.GetForm().FormNewBtnWord)),\n\t\t\tfalse, ctx.IsIframe(), false, \"\"),\n\t\tDescription: template2.HTML(panel.GetForm().Description),\n\t\tTitle:       template2.HTML(panel.GetForm().Title),\n\t}, plugName)\n}\n\n// ShowEditMenu show edit menu page.\nfunc (h *Handler) ShowEditMenu(ctx *context.Context) {\n\n\tplugName := getPlugNameFromReferer(ctx)\n\n\tif ctx.Query(\"id\") == \"\" {\n\t\th.getMenuInfoPanel(ctx, \"\", template.Get(ctx, h.config.Theme).Alert().Warning(errors.WrongID))\n\n\t\tctx.AddHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n\t\tctx.AddHeader(constant.PjaxUrlHeader, h.routePath(\"menu\")+getMenuPlugNameParams(plugName))\n\t\treturn\n\t}\n\n\tmodel := h.table(\"menu\", ctx)\n\tformInfo, err := model.GetDataWithId(parameter.BaseParam().WithPKs(ctx.Query(\"id\")))\n\n\tuser := auth.Auth(ctx)\n\n\tif err != nil {\n\t\th.HTMLPlug(ctx, user, template.WarningPanelWithDescAndTitle(ctx, err.Error(),\n\t\t\tmodel.GetForm().Description, model.GetForm().Title), plugName)\n\t\treturn\n\t}\n\n\th.showEditMenu(ctx, plugName, formInfo, nil)\n}\n\nfunc (h *Handler) showEditMenu(ctx *context.Context, plugName string, formInfo table.FormInfo, err error) {\n\n\tvar alert template2.HTML\n\n\tif err != nil {\n\t\talert = aAlert(ctx).Warning(err.Error())\n\t}\n\n\tparams := getMenuPlugNameParams(plugName)\n\n\tpanel := h.table(\"menu\", ctx)\n\n\th.HTMLPlug(ctx, auth.Auth(ctx), types.Panel{\n\t\tContent: alert + formContent(ctx, aForm(ctx).\n\t\t\tSetContent(formInfo.FieldList).\n\t\t\tSetTabContents(formInfo.GroupFieldList).\n\t\t\tSetTabHeaders(formInfo.GroupFieldHeaders).\n\t\t\tSetPrefix(h.config.PrefixFixSlash()).\n\t\t\tSetPrimaryKey(panel.GetPrimaryKey().Name).\n\t\t\tSetUrl(h.routePath(\"menu_edit\")).\n\t\t\tSetOperationFooter(formFooter(ctx, \"edit\", false, false, false,\n\t\t\t\tpanel.GetForm().FormEditBtnWord)).\n\t\t\tSetHiddenFields(map[string]string{\n\t\t\t\tform2.TokenKey:    h.authSrv().AddToken(),\n\t\t\t\tform2.PreviousKey: h.routePath(\"menu\") + params,\n\t\t\t}), false, ctx.IsIframe(), false, \"\"),\n\t\tDescription: template2.HTML(formInfo.Description),\n\t\tTitle:       template2.HTML(formInfo.Title),\n\t}, plugName)\n}\n\n// DeleteMenu delete the menu of given id.\nfunc (h *Handler) DeleteMenu(ctx *context.Context) {\n\tmodels.MenuWithId(guard.GetMenuDeleteParam(ctx).Id).SetConn(h.conn).Delete()\n\tresponse.OkWithMsg(ctx, language.Get(\"delete succeed\"))\n}\n\n// EditMenu edit the menu of given id.\nfunc (h *Handler) EditMenu(ctx *context.Context) {\n\n\tparam := guard.GetMenuEditParam(ctx)\n\tparams := getMenuPlugNameParams(param.PluginName)\n\n\tif param.HasAlert() {\n\t\th.getMenuInfoPanel(ctx, param.PluginName, param.Alert)\n\t\tctx.AddHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n\t\tctx.AddHeader(constant.PjaxUrlHeader, h.routePath(\"menu\")+params)\n\t\treturn\n\t}\n\n\tmenuModel := models.MenuWithId(param.Id).SetConn(h.conn)\n\n\t// TODO: use transaction\n\tdeleteRolesErr := menuModel.DeleteRoles()\n\tif db.CheckError(deleteRolesErr, db.DELETE) {\n\t\tformInfo, _ := h.table(\"menu\", ctx).GetDataWithId(parameter.BaseParam().WithPKs(param.Id))\n\t\th.showEditMenu(ctx, param.PluginName, formInfo, deleteRolesErr)\n\t\tctx.AddHeader(constant.PjaxUrlHeader, h.routePath(\"menu\")+params)\n\t\treturn\n\t}\n\tfor _, roleId := range param.Roles {\n\t\t_, addRoleErr := menuModel.AddRole(roleId)\n\t\tif db.CheckError(addRoleErr, db.INSERT) {\n\t\t\tformInfo, _ := h.table(\"menu\", ctx).GetDataWithId(parameter.BaseParam().WithPKs(param.Id))\n\t\t\th.showEditMenu(ctx, param.PluginName, formInfo, addRoleErr)\n\t\t\tctx.AddHeader(constant.PjaxUrlHeader, h.routePath(\"menu\")+params)\n\t\t\treturn\n\t\t}\n\t}\n\n\t_, updateErr := menuModel.Update(param.Title, param.Icon, param.Uri, param.Header, param.PluginName, param.ParentId)\n\n\tif db.CheckError(updateErr, db.UPDATE) {\n\t\tformInfo, _ := h.table(\"menu\", ctx).GetDataWithId(parameter.BaseParam().WithPKs(param.Id))\n\t\th.showEditMenu(ctx, param.PluginName, formInfo, updateErr)\n\t\tctx.AddHeader(constant.PjaxUrlHeader, h.routePath(\"menu\")+params)\n\t\treturn\n\t}\n\n\th.getMenuInfoPanel(ctx, param.PluginName, \"\")\n\tctx.AddHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n\tctx.AddHeader(constant.PjaxUrlHeader, h.routePath(\"menu\")+params)\n}\n\n// NewMenu create a new menu item.\nfunc (h *Handler) NewMenu(ctx *context.Context) {\n\n\tparam := guard.GetMenuNewParam(ctx)\n\tparams := getMenuPlugNameParams(param.PluginName)\n\n\tif param.HasAlert() {\n\t\th.getMenuInfoPanel(ctx, param.PluginName, param.Alert)\n\t\tctx.AddHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n\t\tctx.AddHeader(constant.PjaxUrlHeader, h.routePath(\"menu\")+params)\n\t\treturn\n\t}\n\n\tuser := auth.Auth(ctx)\n\n\t// TODO: use transaction\n\tmenuModel, createErr := models.Menu().SetConn(h.conn).\n\t\tNew(param.Title, param.Icon, param.Uri, param.Header, param.PluginName, param.ParentId,\n\t\t\t(menu.GetGlobalMenu(user, h.conn, ctx.Lang(), param.PluginName)).MaxOrder+1)\n\n\tif db.CheckError(createErr, db.INSERT) {\n\t\th.showNewMenu(ctx, createErr)\n\t\treturn\n\t}\n\n\tfor _, roleId := range param.Roles {\n\t\t_, addRoleErr := menuModel.AddRole(roleId)\n\t\tif db.CheckError(addRoleErr, db.INSERT) {\n\t\t\th.showNewMenu(ctx, addRoleErr)\n\t\t\treturn\n\t\t}\n\t}\n\n\tmenu.GetGlobalMenu(user, h.conn, ctx.Lang(), param.PluginName).AddMaxOrder()\n\n\th.getMenuInfoPanel(ctx, param.PluginName, \"\")\n\tctx.AddHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n\tctx.AddHeader(constant.PjaxUrlHeader, h.routePath(\"menu\")+params)\n}\n\n// MenuOrder change the order of menu items.\nfunc (h *Handler) MenuOrder(ctx *context.Context) {\n\n\tvar data []map[string]interface{}\n\t_ = json.Unmarshal([]byte(ctx.FormValue(\"_order\")), &data)\n\n\tmodels.Menu().SetConn(h.conn).ResetOrder([]byte(ctx.FormValue(\"_order\")))\n\n\tresponse.Ok(ctx)\n}\n\nfunc (h *Handler) getMenuInfoPanel(ctx *context.Context, plugName string, alert template2.HTML) {\n\tuser := auth.Auth(ctx)\n\n\tif plugName == \"\" {\n\t\tplugName = ctx.Query(\"__plugin_name\")\n\t}\n\n\ttree := aTree(ctx).\n\t\tSetTree((menu.GetGlobalMenu(user, h.conn, ctx.Lang(), plugName)).List).\n\t\tSetEditUrl(h.routePath(\"menu_edit_show\")).\n\t\tSetUrlPrefix(h.config.Prefix()).\n\t\tSetDeleteUrl(h.routePath(\"menu_delete\")).\n\t\tSetOrderUrl(h.routePath(\"menu_order\")).\n\t\tGetContent()\n\n\tvar (\n\t\theader   = aTree(ctx).GetTreeHeader()\n\t\tbox      = aBox(ctx).SetHeader(header).SetBody(tree).GetContent()\n\t\tcol1     = aCol(ctx).SetSize(types.SizeMD(6)).SetContent(box).GetContent()\n\t\tpanel    = h.table(\"menu\", ctx)\n\t\tformInfo = panel.GetNewFormInfo()\n\t)\n\n\tnewForm := menuFormContent(ctx, aForm(ctx).\n\t\tSetPrefix(h.config.PrefixFixSlash()).\n\t\tSetUrl(h.routePath(\"menu_new\")).\n\t\tSetPrimaryKey(panel.GetPrimaryKey().Name).\n\t\tSetHiddenFields(map[string]string{\n\t\t\tform2.TokenKey:    h.authSrv().AddToken(),\n\t\t\tform2.PreviousKey: h.routePath(\"menu\") + getMenuPlugNameParams(plugName),\n\t\t}).\n\t\tSetOperationFooter(formFooter(ctx, \"menu\", false, false, false,\n\t\t\tpanel.GetForm().FormNewBtnWord)).\n\t\tSetTitle(\"New\").\n\t\tSetContent(formInfo.FieldList).\n\t\tSetTabContents(formInfo.GroupFieldList).\n\t\tSetTabHeaders(formInfo.GroupFieldHeaders))\n\n\tcol2 := aCol(ctx).SetSize(types.SizeMD(6)).SetContent(newForm).GetContent()\n\n\trow := aRow(ctx).SetContent(col1 + col2).GetContent()\n\n\th.HTMLPlug(ctx, user, types.Panel{\n\t\tContent:     alert + row,\n\t\tDescription: \"Menus Manage\",\n\t\tTitle:       \"Menus\",\n\t}, plugName)\n}\n"
  },
  {
    "path": "plugins/admin/controller/new.go",
    "content": "package controller\n\nimport (\n\t\"fmt\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/file\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\tform2 \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// ShowNewForm show a new form page.\nfunc (h *Handler) ShowNewForm(ctx *context.Context) {\n\tparam := guard.GetShowNewFormParam(ctx)\n\th.showNewForm(ctx, \"\", param.Prefix, param.Param.GetRouteParamStr(), false)\n}\n\nfunc (h *Handler) showNewForm(ctx *context.Context, alert template2.HTML, prefix, paramStr string, isNew bool) {\n\n\tvar (\n\t\tuser        = auth.Auth(ctx)\n\t\tpanel       = h.table(prefix, ctx)\n\t\tformInfo    = panel.GetNewFormInfo()\n\t\tinfoUrl     = h.routePathWithPrefix(\"info\", prefix) + paramStr\n\t\tnewUrl      = h.routePathWithPrefix(\"new\", prefix)\n\t\tshowNewUrl  = h.routePathWithPrefix(\"show_new\", prefix) + paramStr\n\t\treferer     = ctx.Referer()\n\t\tf           = panel.GetActualNewForm()\n\t\tisNotIframe = ctx.Query(constant.IframeKey) != \"true\"\n\t)\n\n\tif referer != \"\" && !isInfoUrl(referer) && !isNewUrl(referer, ctx.Query(constant.PrefixKey)) {\n\t\tinfoUrl = referer\n\t}\n\n\thiddenFields := map[string]string{\n\t\tform2.TokenKey:    h.authSrv().AddToken(),\n\t\tform2.PreviousKey: infoUrl,\n\t}\n\n\tif ctx.Query(constant.IframeKey) != \"\" {\n\t\thiddenFields[constant.IframeKey] = ctx.Query(constant.IframeKey)\n\t}\n\n\tif ctx.Query(constant.IframeIDKey) != \"\" {\n\t\thiddenFields[constant.IframeIDKey] = ctx.Query(constant.IframeIDKey)\n\t}\n\n\tcontent := formContent(ctx, aForm(ctx).\n\t\tSetPrefix(h.config.PrefixFixSlash()).\n\t\tSetFieldsHTML(f.HTMLContent).\n\t\tSetContent(formInfo.FieldList).\n\t\tSetTabContents(formInfo.GroupFieldList).\n\t\tSetTabHeaders(formInfo.GroupFieldHeaders).\n\t\tSetUrl(newUrl).\n\t\tSetAjax(f.AjaxSuccessJS, f.AjaxErrorJS).\n\t\tSetInputWidth(f.InputWidth).\n\t\tSetHeadWidth(f.HeadWidth).\n\t\tSetLayout(f.Layout).\n\t\tSetPrimaryKey(panel.GetPrimaryKey().Name).\n\t\tSetHiddenFields(hiddenFields).\n\t\tSetTitle(f.FormNewTitle).\n\t\tSetOperationFooter(formFooter(ctx, \"new\", f.IsHideContinueEditCheckBox, f.IsHideContinueNewCheckBox,\n\t\t\tf.IsHideResetButton, f.FormNewBtnWord)).\n\t\tSetHeader(f.HeaderHtml).\n\t\tSetFooter(f.FooterHtml), len(formInfo.GroupFieldHeaders) > 0, !isNotIframe, f.IsHideBackButton, f.Header)\n\n\tif f.Wrapper != nil {\n\t\tcontent = f.Wrapper(content)\n\t}\n\n\th.HTML(ctx, user, types.Panel{\n\t\tContent:     alert + content,\n\t\tDescription: template2.HTML(f.Description),\n\t\tTitle:       modules.AorBHTML(isNotIframe, template2.HTML(f.Title), \"\"),\n\t\tMiniSidebar: f.HideSideBar,\n\t}, template.ExecuteOptions{Animation: alert == \"\"})\n\n\tif isNew {\n\t\tctx.AddHeader(constant.PjaxUrlHeader, showNewUrl)\n\t}\n}\n\n// NewForm insert a table row into database.\nfunc (h *Handler) NewForm(ctx *context.Context) {\n\n\tparam := guard.GetNewFormParam(ctx)\n\n\t// process uploading files, only support local storage\n\tif len(param.MultiForm.File) > 0 {\n\t\terr := file.GetFileEngine(h.config.FileUploadEngine.Name).Upload(param.MultiForm)\n\t\tif err != nil {\n\t\t\tlogger.ErrorCtx(ctx, \"get file engine error: %+v\", err)\n\t\t\tif ctx.WantJSON() {\n\t\t\t\tresponse.Error(ctx, err.Error())\n\t\t\t} else {\n\t\t\t\th.showNewForm(ctx, aAlert(ctx).Warning(err.Error()), param.Prefix, param.Param.GetRouteParamStr(), true)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\n\terr := param.Panel.InsertData(ctx, param.Value())\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"insert data error: %+v\", err)\n\t\tif ctx.WantJSON() {\n\t\t\tresponse.Error(ctx, err.Error(), map[string]interface{}{\n\t\t\t\t\"token\": h.authSrv().AddToken(),\n\t\t\t})\n\t\t} else {\n\t\t\th.showNewForm(ctx, aAlert(ctx).Warning(err.Error()), param.Prefix, param.Param.GetRouteParamStr(), true)\n\t\t}\n\t\treturn\n\t}\n\n\tf := param.Panel.GetActualNewForm()\n\n\tif f.Responder != nil {\n\t\tf.Responder(ctx)\n\t\treturn\n\t}\n\n\tif ctx.WantJSON() && !param.IsIframe {\n\t\tresponse.OkWithData(ctx, map[string]interface{}{\n\t\t\t\"url\":   param.PreviousPath,\n\t\t\t\"token\": h.authSrv().AddToken(),\n\t\t})\n\t\treturn\n\t}\n\n\tif !param.FromList {\n\n\t\tif isNewUrl(param.PreviousPath, param.Prefix) {\n\t\t\th.showNewForm(ctx, param.Alert, param.Prefix, param.Param.GetRouteParamStr(), true)\n\t\t\treturn\n\t\t}\n\n\t\tctx.HTML(http.StatusOK, fmt.Sprintf(`<script>location.href=\"%s\"</script>`, param.PreviousPath))\n\t\tctx.AddHeader(constant.PjaxUrlHeader, param.PreviousPath)\n\t\treturn\n\t}\n\n\tif param.IsIframe {\n\t\tctx.HTML(http.StatusOK, fmt.Sprintf(`<script>\n\t\tswal('%s', '', 'success');\n\t\tsetTimeout(function(){\n\t\t\t$(\"#%s\", window.parent.document).hide();\n\t\t\t$('.modal-backdrop.fade.in', window.parent.document).hide();\n\t\t}, 1000)\n</script>`, language.Get(\"success\"), param.IframeID))\n\t\treturn\n\t}\n\n\tbuf := h.showTable(ctx, param.Prefix, param.Param, nil)\n\n\tctx.HTML(http.StatusOK, buf.String())\n\tctx.AddHeader(constant.PjaxUrlHeader, h.routePathWithPrefix(\"info\", param.Prefix)+param.Param.GetRouteParamStr())\n}\n"
  },
  {
    "path": "plugins/admin/controller/operation.go",
    "content": "package controller\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n)\n\nfunc (h *Handler) Operation(ctx *context.Context) {\n\tid := ctx.Query(\"__goadmin_op_id\")\n\tif !h.OperationHandler(config.Url(\"/operation/\"+id), ctx) {\n\t\terrMsg := \"not found\"\n\t\tif ctx.Headers(constant.PjaxHeader) == \"\" && ctx.Method() != \"GET\" {\n\t\t\tresponse.BadRequest(ctx, errMsg)\n\t\t} else {\n\t\t\tresponse.Alert(ctx, errMsg, errMsg, errMsg, h.conn, h.navButtons)\n\t\t}\n\t\treturn\n\t}\n}\n\n// RecordOperationLog record all operation logs, store into database.\nfunc (h *Handler) RecordOperationLog(ctx *context.Context) {\n\tif user, ok := ctx.UserValue[\"user\"].(models.UserModel); ok {\n\t\tvar input []byte\n\t\tform := ctx.Request.MultipartForm\n\t\tif form != nil {\n\t\t\tinput, _ = json.Marshal((*form).Value)\n\t\t}\n\n\t\tmodels.OperationLog().SetConn(h.conn).New(user.Id, ctx.Path(), ctx.Method(), ctx.LocalIP(), string(input))\n\t}\n}\n"
  },
  {
    "path": "plugins/admin/controller/plugins.go",
    "content": "package controller\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/system\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/remote_server\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n\t\"github.com/GoAdminGroup/html\"\n\t\"github.com/gin-gonic/gin\"\n)\n\nfunc (h *Handler) Plugins(ctx *context.Context) {\n\tlist := plugins.Get()\n\tsize := types.Size(6, 3, 2)\n\trows := template.HTML(\"\")\n\tif h.config.IsNotProductionEnvironment() {\n\t\tgetMoreCover := config.Url(\"/assets/dist/img/plugin_more.png\")\n\t\tlist = list.Add(plugins.NewBasePluginWithInfoAndIndexURL(plugins.Info{\n\t\t\tTitle:     \"get more plugins\",\n\t\t\tName:      \"\",\n\t\t\tMiniCover: getMoreCover,\n\t\t\tCover:     getMoreCover,\n\t\t}, config.Url(\"/plugins/store\"), true))\n\t}\n\tfor i := 0; i < len(list); i += 6 {\n\t\tbox1 := aBox(ctx).\n\t\t\tSetBody(h.pluginBox(ctx, GetPluginBoxParamFromPlug(list[i]))).\n\t\t\tGetContent()\n\t\tcontent := aCol(ctx).SetSize(size).SetContent(box1).GetContent()\n\t\toffset := len(list) - i\n\t\tif offset > 6 {\n\t\t\toffset = 6\n\t\t}\n\t\tfor j := i + 1; j < offset; j++ {\n\t\t\tbox2 := aBox(ctx).\n\t\t\t\tSetBody(h.pluginBox(ctx, GetPluginBoxParamFromPlug(list[j]))).\n\t\t\t\tGetContent()\n\t\t\tcontent += aCol(ctx).SetSize(size).SetContent(box2).GetContent()\n\t\t}\n\t\trows += aRow(ctx).SetContent(content).GetContent()\n\t}\n\th.HTML(ctx, auth.Auth(ctx), types.Panel{\n\t\tContent:     rows,\n\t\tCSS:         pluginsPageCSS,\n\t\tDescription: language.GetFromHtml(\"plugins\"),\n\t\tTitle:       language.GetFromHtml(\"plugins\"),\n\t})\n}\n\nfunc (h *Handler) PluginStore(ctx *context.Context) {\n\tvar (\n\t\tsize       = types.Size(12, 6, 4)\n\t\tlist, page = plugins.GetAll(\n\t\t\tremote_server.GetOnlineReq{\n\t\t\t\tPage:       ctx.Query(\"page\"),\n\t\t\t\tFree:       ctx.Query(\"free\"),\n\t\t\t\tPageSize:   ctx.Query(\"page_size\"),\n\t\t\t\tFilter:     ctx.Query(\"filter\"),\n\t\t\t\tOrder:      ctx.Query(\"order\"),\n\t\t\t\tLang:       h.config.Language,\n\t\t\t\tVersion:    system.Version(),\n\t\t\t\tCategoryId: ctx.Query(\"category_id\"),\n\t\t\t}, ctx.Cookie(remote_server.TokenKey))\n\t\trows = template.HTML(page.HTML)\n\t)\n\n\tif ctx.Query(\"page\") == \"\" && len(list) == 0 {\n\t\th.HTML(ctx, auth.Auth(ctx), types.Panel{\n\t\t\tContent: pluginStore404(),\n\t\t\tCSS: template.CSS(`.plugin-store-404-content {\n    margin: auto;\n    width: 80%;\n    text-align: center;\n    color: #9e9e9e;\n    font-size: 17px;\n    height: 250px;\n    line-height: 250px;\n}`),\n\t\t\tDescription: language.GetFromHtml(\"plugin store\"),\n\t\t\tTitle:       language.GetFromHtml(\"plugin store\"),\n\t\t})\n\t\treturn\n\t}\n\n\tfor i := 0; i < len(list); i += 3 {\n\t\tbox1 := aBox(ctx).\n\t\t\tSetBody(h.pluginStoreBox(ctx, GetPluginBoxParamFromPlug(list[i]))).\n\t\t\tGetContent()\n\t\tcol1 := aCol(ctx).SetSize(size).SetContent(box1).GetContent()\n\t\tbox2, col2, box3, col3 := template.HTML(\"\"), template.HTML(\"\"), template.HTML(\"\"), template.HTML(\"\")\n\t\tif i+1 < len(list) {\n\t\t\tbox2 = aBox(ctx).\n\t\t\t\tSetBody(h.pluginStoreBox(ctx, GetPluginBoxParamFromPlug(list[i+1]))).\n\t\t\t\tGetContent()\n\t\t\tcol2 = aCol(ctx).SetSize(size).SetContent(box2).GetContent()\n\t\t\tif i+2 < len(list) {\n\t\t\t\tbox3 = aBox(ctx).\n\t\t\t\t\tSetBody(h.pluginStoreBox(ctx, GetPluginBoxParamFromPlug(list[i+2]))).\n\t\t\t\t\tGetContent()\n\t\t\t\tcol3 = aCol(ctx).SetSize(size).SetContent(box3).GetContent()\n\t\t\t}\n\t\t}\n\t\trows += aRow(ctx).SetContent(col1 + col2 + col3).GetContent()\n\t}\n\n\tdetailPopupModal := template2.Default(ctx).Popup().SetID(\"detail-popup-modal\").\n\t\tSetTitle(plugWordHTML(\"plugin detail\")).\n\t\tSetBody(pluginsPageDetailPopupBody()).\n\t\tSetWidth(\"730px\").\n\t\tSetHeight(\"400px\").\n\t\tSetFooter(\"1\").\n\t\tGetContent()\n\n\tbuyPopupModal := template2.Default(ctx).Popup().SetID(\"buy-popup-modal\").\n\t\tSetTitle(plugWordHTML(\"plugin detail\")).\n\t\tSetWidth(\"730px\").\n\t\tSetHeight(\"400px\").\n\t\tSetFooter(\"1\").\n\t\tGetContent()\n\n\tloginPopupModal := template2.Default(ctx).Popup().SetID(\"login-popup-modal\").\n\t\tSetTitle(plugWordHTML(\"login to goadmin member system\")).\n\t\tSetBody(aForm(ctx).SetContent(types.FormFields{\n\t\t\t{Field: \"name\", Head: plugWord(\"account\"), FormType: form.Text, Editable: true},\n\t\t\t{Field: \"password\", Head: plugWord(\"password\"), FormType: form.Password, Editable: true,\n\t\t\t\tHelpMsg: template.HTML(fmt.Sprintf(plugWord(\"no account? click %s here %s to register.\"),\n\t\t\t\t\t\"<a target='_blank' href='http://www.go-admin.cn/register'>\", \"</a>\"))},\n\t\t}).GetContent()).\n\t\tSetWidth(\"540px\").\n\t\tSetHeight(\"250px\").\n\t\tSetFooterHTML(template.HTML(`<button type=\"button\" class=\"btn btn-primary\" onclick=\"login()\">` +\n\t\t\tplugWord(\"login\") + `</button>`)).\n\t\tGetContent()\n\n\th.HTML(ctx, auth.Auth(ctx), types.Panel{\n\t\tContent:     rows + detailPopupModal + buyPopupModal + loginPopupModal,\n\t\tCSS:         pluginsStorePageCSS + template.CSS(page.CSS),\n\t\tJS:          template.JS(page.JS) + GetPluginsPageJS(PluginsPageJSData{Prefix: h.config.Prefix()}),\n\t\tDescription: language.GetFromHtml(\"plugin store\"),\n\t\tTitle:       language.GetFromHtml(\"plugin store\"),\n\t})\n}\n\nfunc (h *Handler) PluginDetail(ctx *context.Context) {\n\n\tname := ctx.Query(\"name\")\n\n\tplug, exist := plugins.FindByNameAll(name)\n\tif !exist {\n\t\tctx.JSON(http.StatusOK, gin.H{\n\t\t\t\"code\": 400,\n\t\t\t\"msg\":  \"bad request\",\n\t\t})\n\t\treturn\n\t}\n\n\tinfo := plug.GetInfo()\n\n\tif info.MiniCover == \"\" {\n\t\tinfo.MiniCover = config.Url(\"/assets/dist/img/plugin_default.png\")\n\t}\n\n\tctx.JSON(http.StatusOK, gin.H{\n\t\t\"code\": 0,\n\t\t\"msg\":  \"ok\",\n\t\t\"data\": gin.H{\n\t\t\t\"mini_cover\":      info.MiniCover,\n\t\t\t\"title\":           language.GetWithScope(info.Title, name),\n\t\t\t\"author\":          fmt.Sprintf(plugWord(\"provided by %s\"), language.GetWithScope(info.Author, name)),\n\t\t\t\"introduction\":    language.GetWithScope(info.Description, name),\n\t\t\t\"website\":         language.GetWithScope(info.Website, name),\n\t\t\t\"version\":         language.GetWithScope(info.Version, name),\n\t\t\t\"created_at\":      language.GetWithScope(info.CreateDate.Format(\"2006-01-02\"), name),\n\t\t\t\"updated_at\":      language.GetWithScope(info.UpdateDate.Format(\"2006-01-02\"), name),\n\t\t\t\"downloaded\":      info.Downloaded,\n\t\t\t\"download_reboot\": plugins.Exist(plug),\n\t\t\t\"skip\":            info.SkipInstallation,\n\t\t\t\"uuid\":            info.Uuid,\n\t\t\t\"upgrade\":         info.CanUpdate,\n\t\t\t\"install\":         plug.IsInstalled(),\n\t\t\t\"free\":            info.IsFree(),\n\t\t},\n\t})\n}\n\ntype PluginBoxParam struct {\n\tInfo           plugins.Info\n\tInstall        bool\n\tUpgrade        bool\n\tSkip           bool\n\tDownloadReboot bool\n\tName           string\n\tIndexURL       string\n}\n\nfunc GetPluginBoxParamFromPlug(plug plugins.Plugin) PluginBoxParam {\n\treturn PluginBoxParam{\n\t\tInfo:           plug.GetInfo(),\n\t\tInstall:        plug.IsInstalled(),\n\t\tUpgrade:        plug.GetInfo().CanUpdate,\n\t\tSkip:           plug.GetInfo().SkipInstallation,\n\t\tDownloadReboot: plugins.Exist(plug),\n\t\tName:           plug.Name(),\n\t\tIndexURL:       plug.GetIndexURL(),\n\t}\n}\n\nfunc (h *Handler) pluginStoreBox(ctx *context.Context, param PluginBoxParam) template.HTML {\n\tcover := template2.HTML(param.Info.MiniCover)\n\tif cover == template2.HTML(\"\") {\n\t\tcover = template2.HTML(config.Url(\"/assets/dist/img/plugin_default.png\"))\n\t}\n\tcol1 := html.DivEl().SetClass(\"plugin-store-item-img\").\n\t\tSetContent(aImage(ctx).\n\t\t\tSetSrc(cover).\n\t\t\tSetHeight(\"110px\").\n\t\t\tSetWidth(\"110px\").\n\t\t\tGetContent()).\n\t\tGet()\n\tfooter := html.ButtonEl().SetClass(pluginBtnClass(\"plugin-info\")...).\n\t\tSetAttr(\"onclick\", `pluginDetail('`+param.Name+`','`+param.Info.Uuid+`')`).\n\t\tSetContent(plugWordHTML(\"info\")).\n\t\tGet()\n\tif param.Install {\n\t\tif param.Upgrade {\n\t\t\tfooter += html.ButtonEl().SetClass(pluginBtnClass(\"installation\")...).\n\t\t\t\tSetAttr(\"onclick\", `pluginDownload('`+param.Name+`', this)`).\n\t\t\t\tSetContent(plugWordHTML(\"upgrade\")).\n\t\t\t\tGet()\n\t\t}\n\t} else {\n\t\tif param.Info.Downloaded {\n\t\t\tif param.DownloadReboot {\n\t\t\t\tif !param.Skip && !param.Install {\n\t\t\t\t\tfooter += html.AEl().SetAttr(\"href\", h.config.Url(`/info/plugin_`+param.Name+`/new`)).\n\t\t\t\t\t\tSetContent(\n\t\t\t\t\t\t\thtml.ButtonEl().SetClass(pluginBtnClass(\"installation\")...).\n\t\t\t\t\t\t\t\tSetAttr(\"onclick\", `pluginInstall('`+param.Name+`')`).\n\t\t\t\t\t\t\t\tSetContent(plugWordHTML(\"install\")).\n\t\t\t\t\t\t\t\tGet(),\n\t\t\t\t\t\t).Get()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfooter += html.ButtonEl().SetClass(pluginBtnClass(\"installation\")...).\n\t\t\t\t\tSetAttr(\"onclick\", `pluginRebootInstall()`).\n\t\t\t\t\tSetContent(plugWordHTML(\"install\")).\n\t\t\t\t\tGet()\n\t\t\t}\n\t\t} else {\n\t\t\tif param.Info.IsFree() || param.Info.HasBought {\n\t\t\t\tfooter += html.ButtonEl().SetClass(pluginBtnClass(\"installation\")...).\n\t\t\t\t\tSetAttr(\"onclick\", `pluginDownload('`+param.Name+`', this)`).\n\t\t\t\t\tSetContent(plugWordHTML(\"download\")).\n\t\t\t\t\tGet()\n\t\t\t} else {\n\t\t\t\tfooter += html.ButtonEl().SetClass(pluginBtnClass(\"installation\")...).\n\t\t\t\t\tSetAttr(\"onclick\", `pluginBuy('`+param.Name+`', '`+param.Info.Uuid+`')`).\n\t\t\t\t\tSetContent(plugWordHTML(\"buy\")).\n\t\t\t\t\tGet()\n\t\t\t}\n\t\t}\n\t}\n\n\tcol2 := html.DivEl().SetClass(\"plugin-item-content\").SetContent(\n\t\thtml.DivEl().SetClass(\"plugin-item-content-title\").\n\t\t\tSetContent(language.GetFromHtml(template.HTML(param.Info.Title), param.Name)).\n\t\t\tGet() +\n\t\t\thtml.DivEl().SetClass(\"plugin-item-content-description\").\n\t\t\t\tSetContent(language.GetFromHtml(template.HTML(param.Info.Description), param.Name)).\n\t\t\t\tGet() +\n\t\t\tfooter,\n\t).Get()\n\n\treturn html.Div(col1+col2, html.M{\"clear\": \"both\"})\n}\n\nfunc (h *Handler) pluginBox(ctx *context.Context, param PluginBoxParam) template.HTML {\n\tcover := template2.HTML(param.Info.MiniCover)\n\tif cover == template2.HTML(\"\") {\n\t\tcover = \"/admin/assets/dist/img/plugin_default.png\"\n\t}\n\n\tjump := param.IndexURL\n\tlabel := template.HTML(\"\")\n\tif !param.Install {\n\t\tjump = h.config.Url(\"/info/plugin_\" + param.Name + \"/new\")\n\t\tlabel = html.SpanEl().SetClass(\"plugin-item-label\").SetContent(language.GetFromHtml(\"uninstalled\")).Get()\n\t}\n\tcol1 := html.AEl().SetContent(html.DivEl().SetClass(\"plugin-item-img\").\n\t\tSetContent(aImage(ctx).\n\t\t\tSetSrc(cover).\n\t\t\tGetContent()+\n\t\t\thtml.PEl().SetContent(language.GetFromHtml(template.HTML(param.Info.Title), param.Name)).\n\t\t\t\tSetClass(\"plugin-item-title\").Get()).\n\t\tGet()+label).SetAttr(\"href\", jump).Get()\n\treturn col1\n}\n\nfunc (h *Handler) PluginDownload(ctx *context.Context) {\n\n\tif !h.config.Debug {\n\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\"code\": 400,\n\t\t\t\"msg\":  plugWord(\"change to debug mode first\"),\n\t\t})\n\t\treturn\n\t}\n\n\tname := ctx.FormValue(\"name\")\n\n\tif name == \"\" {\n\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\"code\": 400,\n\t\t\t\"msg\":  plugWord(\"download fail, wrong name\"),\n\t\t})\n\t\treturn\n\t}\n\n\tplug, exist := plugins.FindByNameAll(name)\n\n\tif !exist {\n\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\"code\": 400,\n\t\t\t\"msg\":  plugWord(\"download fail, plugin not exist\"),\n\t\t})\n\t\treturn\n\t}\n\n\tif !plug.GetInfo().IsFree() && !plug.GetInfo().HasBought {\n\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\"code\": 400,\n\t\t\t\"msg\":  plugWord(\"download fail, plugin has not been bought\"),\n\t\t})\n\t\treturn\n\t}\n\n\tdownloadURL := plug.GetInfo().Url\n\textraDownloadURL := plug.GetInfo().ExtraDownloadUrl\n\n\tif !plug.GetInfo().IsFree() {\n\t\tvar err error\n\t\tdownloadURL, extraDownloadURL, err = remote_server.GetDownloadURL(plug.GetInfo().Uuid, ctx.Cookie(remote_server.TokenKey))\n\t\tif err != nil {\n\t\t\tlogger.ErrorCtx(ctx, \"download plugins error: %+v\", err)\n\t\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\t\"code\": 500,\n\t\t\t\t\"msg\":  plugWord(\"download fail\"),\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t}\n\n\ttempFile := \"./temp-\" + utils.Uuid(10) + \".zip\"\n\n\terr := utils.DownloadTo(downloadURL, tempFile)\n\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"download plugins error %+v\", map[string]interface{}{\n\t\t\t\"error\":       err,\n\t\t\t\"downloadURL\": downloadURL,\n\t\t})\n\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\"code\": 500,\n\t\t\t\"msg\":  plugWord(\"download fail\"),\n\t\t})\n\t\treturn\n\t}\n\n\tgopath := os.Getenv(\"GOPATH\")\n\n\tif gopath == \"\" {\n\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\"code\": 500,\n\t\t\t\"msg\":  plugWord(\"golang develop environment does not exist\"),\n\t\t})\n\t\treturn\n\t}\n\n\tgomodule := os.Getenv(\"GO111MODULE\")\n\tbase := filepath.Dir(plug.GetInfo().ModulePath)\n\tinstallPath := \"\"\n\n\tif gomodule == \"off\" {\n\t\tinstallPath = filepath.ToSlash(gopath + \"/src/\" + base)\n\t} else {\n\t\tinstallPath = filepath.ToSlash(gopath + \"/pkg/mod/\" + base)\n\t}\n\n\terr = utils.UnzipDir(tempFile, installPath)\n\n\tif err != nil {\n\t\tlogger.ErrorCtx(ctx, \"download plugins, unzip error %+v\", map[string]interface{}{\n\t\t\t\"error\":       err,\n\t\t\t\"installPath\": installPath,\n\t\t})\n\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\"code\": 500,\n\t\t\t\"msg\":  plugWord(\"download fail\"),\n\t\t})\n\t\treturn\n\t}\n\n\t_ = os.Remove(tempFile)\n\n\tif len(downloadURL) > 18 && downloadURL[:18] == \"https://github.com\" {\n\t\tname := filepath.Base(plug.GetInfo().ModulePath)\n\t\tversion := strings.ReplaceAll(plug.GetInfo().Version, \"v\", \"\")\n\t\trawPath := installPath + \"/\" + name\n\t\tnowPath := rawPath + \"-\" + version\n\t\tif gomodule == \"off\" {\n\t\t\terr = os.Rename(nowPath, rawPath)\n\t\t} else {\n\t\t\terr = os.Rename(nowPath, rawPath+\"@\"+plug.GetInfo().Version)\n\t\t}\n\t\tif err != nil {\n\t\t\tlogger.ErrorCtx(ctx, \"download plugins, rename error %+v\", map[string]interface{}{\n\t\t\t\t\"error\":   err,\n\t\t\t\t\"nowPath\": nowPath,\n\t\t\t\t\"rawPath\": rawPath,\n\t\t\t})\n\t\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\t\"code\": 500,\n\t\t\t\t\"msg\":  plugWord(\"download fail\"),\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t} else if gomodule != \"off\" {\n\t\trawPath := installPath + \"/\" + name\n\t\terr = os.Rename(rawPath, rawPath+\"@\"+plug.GetInfo().Version)\n\t\tif err != nil {\n\t\t\tlogger.ErrorCtx(ctx, \"download plugins, rename error %+v\", map[string]interface{}{\n\t\t\t\t\"error\":   err,\n\t\t\t\t\"rawPath\": rawPath,\n\t\t\t})\n\t\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\t\"code\": 500,\n\t\t\t\t\"msg\":  plugWord(\"download fail\"),\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t}\n\n\tif h.config.BootstrapFilePath != \"\" && utils.FileExist(h.config.BootstrapFilePath) {\n\t\tcontent, err := os.ReadFile(h.config.BootstrapFilePath)\n\t\tif err != nil {\n\t\t\tlogger.ErrorCtx(ctx, \"read bootstrap file error: %+v\", err)\n\t\t} else {\n\t\t\terr = os.WriteFile(h.config.BootstrapFilePath, []byte(string(content)+`\nimport _ \"`+plug.GetInfo().ModulePath+`\"`), 0644)\n\t\t\tif err != nil {\n\t\t\t\tlogger.ErrorCtx(ctx, \"write bootstrap file error: %+v\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif h.config.GoModFilePath != \"\" && utils.FileExist(h.config.GoModFilePath) &&\n\t\tplug.GetInfo().CanUpdate && plug.GetInfo().OldVersion != \"\" {\n\t\tcontent, _ := os.ReadFile(h.config.BootstrapFilePath)\n\t\tsrc := plug.GetInfo().ModulePath + \" \" + plug.GetInfo().OldVersion\n\t\tdist := plug.GetInfo().ModulePath + \" \" + plug.GetInfo().Version\n\t\tcontent = bytes.ReplaceAll(content, []byte(src), []byte(dist))\n\t\t_ = os.WriteFile(h.config.BootstrapFilePath, content, 0644)\n\t}\n\n\t// TODO: 实现运行环境与编译环境隔离\n\n\tif plug.GetInfo().ExtraDownloadUrl != \"\" {\n\t\terr = utils.DownloadTo(extraDownloadURL, \"./\"+plug.Name()+\"_extra_\"+\n\t\t\tfmt.Sprintf(\"%d\", time.Now().Unix())+\".zip\")\n\t\tif err != nil {\n\t\t\tlogger.ErrorCtx(ctx, \"failed to download \"+plug.Name()+\" extra data: %+v\", err)\n\t\t}\n\t}\n\n\tplug.(*plugins.BasePlugin).Info.Downloaded = true\n\tplug.(*plugins.BasePlugin).Info.CanUpdate = false\n\n\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\"code\": 0,\n\t\t\"msg\":  plugWord(\"download success, restart to install\"),\n\t})\n}\n\nfunc (h *Handler) ServerLogin(ctx *context.Context) {\n\tparam := guard.GetServerLoginParam(ctx)\n\tres := remote_server.Login(param.Account, param.Password)\n\tif res.Code == 0 && res.Data.Token != \"\" {\n\t\tctx.SetCookie(&http.Cookie{\n\t\t\tName:     remote_server.TokenKey,\n\t\t\tValue:    res.Data.Token,\n\t\t\tExpires:  time.Now().Add(time.Second * time.Duration(res.Data.Expire/1000)),\n\t\t\tHttpOnly: true,\n\t\t\tPath:     \"/\",\n\t\t})\n\t}\n\tctx.JSON(http.StatusOK, gin.H{\n\t\t\"code\": res.Code,\n\t\t\"data\": res.Data,\n\t\t\"msg\":  res.Msg,\n\t})\n}\n\nfunc pluginBtnClass(class ...string) []string {\n\treturn append([]string{\"btn\", \"btn-primary\"}, class...)\n}\n\nfunc plugWord(word string) string {\n\treturn language.GetWithScope(word, \"plugin\")\n}\n\nfunc plugWordHTML(word template.HTML) template.HTML {\n\treturn language.GetFromHtml(word, \"plugin\")\n}\n"
  },
  {
    "path": "plugins/admin/controller/plugins_tmpl.go",
    "content": "package controller\n\nimport (\n\t\"bytes\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/remote_server\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n)\n\nfunc GetPluginsPageJS(data PluginsPageJSData) template.JS {\n\tt := template.New(\"plugins_page_js\").Funcs(map[string]interface{}{\n\t\t\"lang\":     language.Get,\n\t\t\"plugWord\": plugWord,\n\t})\n\tt, err := t.Parse(pluginsPageJS)\n\tif err != nil {\n\t\tlogger.Error(err)\n\t\treturn \"\"\n\t}\n\tbuf := new(bytes.Buffer)\n\terr = t.Execute(buf, data)\n\tif err != nil {\n\t\tlogger.Error(err)\n\t\treturn \"\"\n\t}\n\treturn template.JS(buf.String())\n\n}\n\ntype PluginsPageJSData struct {\n\tPrefix string\n}\n\nvar pluginsPageJS = `\n\nfunction pluginInstall(name){\n\tlocation.href=\"{{.Prefix}}/info/plugin_\"+name+\"/new\"\n}\n\nvar downloadLock = false;\nconst apiTokenKey = \"GOADMIN_SERVER_API_TOKEN\";\nconst apiTokenExpireKey = \"GOADMIN_SERVER_API_TOKEN_EXPIRE\";\nconst serverHost = \"` + remote_server.ServerHost + `\"\n\nfunction login() {\n\t$.ajax({\n\t\ttype: 'POST',\n\t\turl:  '{{.Prefix}}/server/login',\n\t\tdataType: \"json\",\n\t\tcontentType: \"application/json\",\n\t\tdata: JSON.stringify({\n\t\t\t\"account\": $(\"#login-popup-modal form input.name\").val(),\n\t\t\t\"password\": $(\"#login-popup-modal form input.password\").val()\n\t\t}),\n\t\tsuccess: function (data) {\n\t\t\tif (data.code == 0) {\n\t\t\t\tlocalStorage.setItem(apiTokenKey, data.data.token);\n\t\t\t\tlocalStorage.setItem(apiTokenExpireKey, (new Date()).getTime() + data.data.expire);\n\t\t\t\t$('#login-popup-modal').modal('hide');\n\t\t\t\tif (typeof loginSuccessCallback != \"undefined\") {\n\t\t\t\t\tloginSuccessCallback(data);\n\t\t\t\t}\n\t\t\t\t$.pjax.reload('#pjax-container');\n\t\t\t} else {\n\t\t\t\tswal({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\ttitle: data.msg,\n\t\t\t\t\tshowCancelButton: false,\n\t\t\t\t\thtml: true,\n\t\t\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\t\t\tconfirmButtonText: '{{lang \"got it\"}}',\n        \t\t})\n\t\t\t}\n\t\t},\n\t\terror: function (data) {\n\t\t\tswal({\n\t\t\t\ttype: \"error\",\n\t\t\t\ttitle: data.responseJSON.msg ? data.responseJSON.msg : \"error\",\n\t\t\t\tshowCancelButton: false,\n\t\t\t\thtml: true,\n\t\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\t\tconfirmButtonText: '{{lang \"got it\"}}',\n\t\t\t})\t\n\t\t}\n\t});\t\n}\n\nfunction pluginBuy(name, uuid) {\n\twindow.open(serverHost + \"/plugins/detail/\" + uuid); \n}\n\nfunction pluginDetail(name, uuid) {\n\t$.ajax({\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\turl: '{{.Prefix}}/plugin/detail?name=' + name,\n\t\tasync: 'true',\n\t\tsuccess: function (data) {\n\t\t\tif (data.code == 0) {\n\t\t\t\tlet head_ele = \"#detail-popup-modal .plugin-detail .plugin-detail-head \"\n\t\t\t\t$(head_ele + \".plugin-detail-head-logo img\").attr('src', data.data.mini_cover);\n\t\t\t\t$(head_ele + \".plugin-detail-head-title .plugin-detail-title\").html(data.data.title);\n\t\t\t\t$(head_ele + \".plugin-detail-head-title .plugin-detail-provider\").html(data.data.author);\n\t\t\t\tlet item_ele = \"#detail-popup-modal .plugin-detail .plugin-detail-info .plugin-detail-info-item\";\n\t\t\t\t$(item_ele).eq(0).find(\".plugin-detail-info-item-content\").html(data.data.introduction);\n\t\t\t\t$(item_ele).eq(1).find(\".plugin-detail-info-item-content\").html(data.data.website);\n\t\t\t\t$(item_ele).eq(2).find(\".plugin-detail-info-item-content\").html(data.data.version);\n\t\t\t\t$(item_ele).eq(3).find(\".plugin-detail-info-item-content\").html(data.data.created_at);\n\t\t\t\t$(item_ele).eq(4).find(\".plugin-detail-info-item-content\").html(data.data.updated_at);\n\t\t\t\t$(item_ele).eq(5).find(\"a\").attr(\"href\", \"https://www.go-admin.cn/plugins/detail/\" + data.data.uuid);\n\n\t\t\t\tlet footer_ele = \"#detail-popup-modal .modal-footer .btn.btn-primary\";\n\n\t\t\t\tif (data.data.install) {\n\t\t\t\t\tif (data.data.upgrade) {\n\t\t\t\t\t\t$(footer_ele).html('{{plugWord \"upgrade\"}}').attr(\"onclick\", \"pluginDownload('\"+ name +\"', this)\");\n\t\t\t\t\t\t$(footer_ele).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(footer_ele).hide();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (data.data.downloaded) {\n\t\t\t\t\t\tif (data.data.download_reboot) {\n\t\t\t\t\t\t\tif (data.data.skip) {\n\t\t\t\t\t\t\t\t$(footer_ele).html('{{plugWord \"install\"}}')\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$(footer_ele).html('{{plugWord \"install\"}}').attr(\"onclick\", \"pluginInstall('\"+ name +\"')\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(footer_ele).html('{{plugWord \"install\"}}').attr(\"onclick\", 'pluginRebootInstall()')\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (data.data.free) {\n\t\t\t\t\t\t\t$(footer_ele).html('{{plugWord \"download\"}}').attr(\"onclick\", \"pluginInstall('\"+ name +\"', this)\")\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(footer_ele).html('{{plugWord \"buy\"}}').attr(\"onclick\", \"pluginBuy('\"+ name +\"', '\"+ uuid +\"')\")\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$(footer_ele).show();\n\t\t\t\t}\n\n\t\t\t\t$(\"#detail-popup-modal\").modal('show');\n\t\t\t} else {\n\t\t\t\tswal({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\ttitle: data.msg,\n\t\t\t\t\tshowCancelButton: false,\n\t\t\t\t\thtml: true,\n\t\t\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\t\t\tconfirmButtonText: '{{lang \"got it\"}}',\n        \t\t})\n\t\t\t}\n\t\t},\n\t\terror: function (data) {\n\t\t\tswal({\n\t\t\t\ttype: \"error\",\n\t\t\t\ttitle: data.responseJSON.msg ? data.responseJSON.msg : \"error\",\n\t\t\t\tshowCancelButton: false,\n\t\t\t\thtml: true,\n\t\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\t\tconfirmButtonText: '{{lang \"got it\"}}',\n\t\t\t})\t\n\t\t}\n\t});\n}\n\nfunction pluginDownload(name, ele) {\n\tif (downloadLock) {\n\t\treturn\n\t}\n\tNProgress.start();\n\tdownloadLock = true;\n\t$(ele).html('<i class=\"fa fa-refresh fa-spin text-primary\" style=\"color: white;\"></i> {{plugWord \"downloading\"}}')\n\t$.ajax({\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\turl: '{{.Prefix}}/plugin/download',\n\t\tasync: 'true',\n\t\tdata: {\n\t\t\t'name': name\n\t\t},\n\t\tsuccess: function (data) {\n\t\t\tNProgress.done();\n\t\t\tdownloadLock = false;\n\t\t\tif (data.code == 0) {\n\t\t\t\t$(ele).attr('onclick', 'pluginRebootInstall()')\n\t\t\t\t$(ele).html('{{plugWord \"install\"}}')\n\t\t\t\tswal({\n\t\t\t\t\ttype: \"success\",\n\t\t\t\t\ttitle: data.msg,\n\t\t\t\t\tshowCancelButton: false,\n\t\t\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\t\t\tconfirmButtonText: '{{lang \"got it\"}}',\n        \t\t})\n\t\t\t} else {\n\t\t\t\t$(ele).html('{{plugWord \"download\"}}')\n\t\t\t\tswal({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\ttitle: data.msg,\n\t\t\t\t\tshowCancelButton: false,\n\t\t\t\t\ttext: \"<a target='_blank' href='//baidu.com'>点这里手动下载</a>\",\n\t\t\t\t\thtml: true,\n\t\t\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\t\t\tconfirmButtonText: '{{lang \"got it\"}}',\n        \t\t})\n\t\t\t}\n\t\t},\n\t\terror: function (data) {\n\t\t\tdownloadLock = false;\n\t\t\t$(ele).html('{{plugWord \"download\"}}')\n\t\t\talert('download fail');\t\n\t\t}\n\t});\n}\n\nfunction pluginRebootInstall() {\n\tswal({\n\t\ttype: \"success\",\n\t\ttitle: \"{{plugWord \"restart to install\"}}\",\n\t\tshowCancelButton: false,\n\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\tconfirmButtonText: '{{lang \"got it\"}}',\n\t})\n}\n`\n\nvar pluginsPageCSS = template.CSS(`\n\t.plugin-item-img {\n\t\ttext-align: center;\n\t}\n\t.plugin-item-img img {\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tborder: 1px solid #f5f4f4;\n\t}\n\t.plugin-item-title {\n\t\tmargin-top: 10px;\n\t\tcolor: #717171;\n\t\toverflow: hidden;\n        text-overflow: ellipsis;\n        word-break: break-all;\n        display: -webkit-box;\n        -webkit-line-clamp: 1;\n        -webkit-box-orient: vertical;\n\t}\n\t@media screen and (min-width: 1200px) {\n\t\t.pjax-container-content .row .col-lg-2 {\n\t\t\twidth: 14%;\n\t\t\tmax-width: 200px;\n\t\t}\n\t}\n\t.plugin-item-label {\n\t\tcolor: white;\n\t\tbackground-color: red;\n\t\tpadding: 4px;\n\t\tborder-radius: 3px;\n\t\tfont-size: 12px;\n\t\tposition: absolute;\n\t\ttop: 5px;\n\t\tright: 5px;\n\t}\n`)\n\nvar pluginsStorePageCSS = template.CSS(`\n\t.plugin-item-content {\n\t\tmargin-left: 15px;\n\t}\n\t.plugin-store-item-img img, .plugin-detail-head-logo img {\n\t\tborder: 1px solid #f5f4f4;\n\t}\n\t.plugin-item-content-title {\n\t\tfont-size: 15px;\n\t\tmargin-bottom: 6px;\n\t\tfont-weight: bold;\n\t\tpadding-top: 2px;\n\t}\n\t.plugin-item-content {\n\t\tposition: absolute;\n\t\tmargin-left: 121px;\n\t\tpadding-right: 10px;\n\t\ttop: 7px;\n    \twidth: 100%;\n    \tpadding-right: 139px;\n\t}\n\t.plugin-item-content-description {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\tword-break: break-all;\n\t\tdisplay: -webkit-box;\n\t\tfont-size: 15px;\n\t\t-webkit-line-clamp: 2;\n\t\t-webkit-box-orient: vertical;\n\t\theight: 42px;\n\t}\n\t.installation {\n\t\tfloat: right;\n\t\tmargin-top: 10px;\n\t}\n\t.plugin-info {\n\t\tfloat: right;\n\t\tmargin-top: 10px;\n\t\tmargin-left: 10px;\n\t}\n\t.plugin-detail {\n\t\tpadding: 10px;\n\t}\n\t.plugin-detail-head {\n\t\tclear: both;\n\t\theight: 112px;\n    \tmargin-bottom: 33px;\n\t}\n\t.plugin-detail-title {\n\t\tfont-size: 30px;\n\t}\n\t.plugin-detail-provider {\n    \tfont-size: 15px;\n    \tmargin-top: 4px;\n\t}\n\t.plugin-detail-head-logo {\n\t\twidth: 120px;\n\t\tfloat: left;\n\t}\n\t.plugin-detail-head-title {\n\t\tfloat: left;\n\t\tmargin-left: 10px;\n\t}\n\t.plugin-detail-info-item {\n\t\tclear: both;\n\t\theight: 15px;\n\t\tmargin-bottom: 17px;\n\t}\n\t.plugin-detail-info-item-head {\n\t\twidth: 120px;\n\t\tfloat: left;\n\t\tfont-weight: bold;\n\t}\n\t.plugin-detail-info-item-content {\n\t\tfloat: left;\n\t\tmargin-left: 10px;\n\t}\n`)\n\nvar pluginStore404 = func() template.HTML {\n\treturn template.HTML(`\n<div class=\"plugin-store-404-content\"><p>` + plugWord(\"can not connect to the goadmin remote server\") + `</p></div>\n`)\n}\n\nvar pluginsPageDetailPopupBody = func() template.HTML {\n\treturn template.HTML(`\n<div class=\"plugin-detail\">\n\t<div class=\"plugin-detail-head\">\n\t\t<div class=\"plugin-detail-head-logo\">\n\t\t\t<img src=\"\" width=\"110px\" height=\"110px\">\n\t\t</div>\n\t\t<div class=\"plugin-detail-head-title\">\n\t\t\t<div class=\"plugin-detail-title\"></div>\n\t\t\t<div class=\"plugin-detail-provider\"></div>\n\t\t</div>\n\t</div>\n<div class=\"plugin-detail-info\">\n\t<div class=\"plugin-detail-info-item\">\n\t\t<div class=\"plugin-detail-info-item-head\">` + plugWord(\"introduction\") + `</div>\n\t\t<div class=\"plugin-detail-info-item-content\"></div>\n\t</div>\n\t<div class=\"plugin-detail-info-item\">\n\t\t<div class=\"plugin-detail-info-item-head\">` + plugWord(\"website\") + `</div>\n\t\t<div class=\"plugin-detail-info-item-content\"></div>\n\t</div>\n\t<div class=\"plugin-detail-info-item\">\n\t\t<div class=\"plugin-detail-info-item-head\">` + plugWord(\"version\") + `</div>\n\t\t<div class=\"plugin-detail-info-item-content\"></div>\n\t</div>\n\t<div class=\"plugin-detail-info-item\">\n\t\t<div class=\"plugin-detail-info-item-head\">` + plugWord(\"created at\") + `</div>\n\t\t<div class=\"plugin-detail-info-item-content\"></div>\n\t</div>\n\t<div class=\"plugin-detail-info-item\">\n\t\t<div class=\"plugin-detail-info-item-head\">` + plugWord(\"updated at\") + `</div>\n\t\t<div class=\"plugin-detail-info-item-content\"></div>\n\t</div>\n\t<div class=\"plugin-detail-info-item\">\n\t\t<a target=\"_blank\" href=\"\"><div class=\"plugin-detail-info-item-head\">` + plugWord(\"learn more\") + `</div></a>\n\t</div>\n</div>\n</div>`)\n}\n"
  },
  {
    "path": "plugins/admin/controller/show.go",
    "content": "package controller\n\nimport (\n\t\"bytes\"\n\t\"crypto/md5\"\n\t\"fmt\"\n\ttemplate2 \"html/template\"\n\t\"mime\"\n\t\"net/http\"\n\t\"path\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/360EntSecGroup-Skylar/excelize\"\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/guard\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n\tform2 \"github.com/GoAdminGroup/go-admin/template/types/form\"\n\t\"github.com/GoAdminGroup/html\"\n)\n\n// ShowInfo show info page.\nfunc (h *Handler) ShowInfo(ctx *context.Context) {\n\n\tprefix := ctx.Query(constant.PrefixKey)\n\n\tpanel := h.table(prefix, ctx)\n\n\tif panel.GetOnlyUpdateForm() {\n\t\tctx.Redirect(h.routePathWithPrefix(\"show_edit\", prefix))\n\t\treturn\n\t}\n\n\tif panel.GetOnlyNewForm() {\n\t\tctx.Redirect(h.routePathWithPrefix(\"show_new\", prefix))\n\t\treturn\n\t}\n\n\tif panel.GetOnlyDetail() {\n\t\tctx.Redirect(h.routePathWithPrefix(\"detail\", prefix))\n\t\treturn\n\t}\n\n\tparams := parameter.GetParam(ctx.Request.URL, panel.GetInfo().DefaultPageSize, panel.GetInfo().SortField,\n\t\tpanel.GetInfo().GetSort())\n\n\tbuf := h.showTable(ctx, prefix, params, panel)\n\tctx.HTML(http.StatusOK, buf.String())\n}\n\nfunc (h *Handler) showTableData(ctx *context.Context, prefix string, params parameter.Parameters,\n\tpanel table.Table, urlNamePrefix string) (table.Table, table.PanelInfo, []string, error) {\n\tif panel == nil {\n\t\tpanel = h.table(prefix, ctx)\n\t}\n\n\tpanelInfo, err := panel.GetData(ctx, params.WithIsAll(false))\n\n\tif err != nil {\n\t\treturn panel, panelInfo, nil, err\n\t}\n\n\tvar (\n\t\tparamStr = params.DeleteIsAll().GetRouteParamStr()\n\n\t\teditUrl   = modules.AorEmpty(!panel.GetInfo().IsHideEditButton, h.routePathWithPrefix(urlNamePrefix+\"show_edit\", prefix)+paramStr)\n\t\tnewUrl    = modules.AorEmpty(!panel.GetInfo().IsHideNewButton, h.routePathWithPrefix(urlNamePrefix+\"show_new\", prefix)+paramStr)\n\t\tdeleteUrl = modules.AorEmpty(!panel.GetInfo().IsHideDeleteButton, h.routePathWithPrefix(urlNamePrefix+\"delete\", prefix)+paramStr)\n\t\texportUrl = modules.AorEmpty(!panel.GetInfo().IsHideExportButton, h.routePathWithPrefix(urlNamePrefix+\"export\", prefix)+paramStr)\n\t\tdetailUrl = modules.AorEmpty(!panel.GetInfo().IsHideDetailButton, h.routePathWithPrefix(urlNamePrefix+\"detail\", prefix)+paramStr)\n\n\t\tinfoUrl   = h.routePathWithPrefix(urlNamePrefix+\"info\", prefix)\n\t\tupdateUrl = h.routePathWithPrefix(urlNamePrefix+\"update\", prefix) + paramStr\n\n\t\tuser = auth.Auth(ctx)\n\t)\n\n\teditUrl = user.GetCheckPermissionByUrlMethod(editUrl, h.route(urlNamePrefix+\"show_edit\").Method())\n\tnewUrl = user.GetCheckPermissionByUrlMethod(newUrl, h.route(urlNamePrefix+\"show_new\").Method())\n\tdeleteUrl = user.GetCheckPermissionByUrlMethod(deleteUrl, h.route(urlNamePrefix+\"delete\").Method())\n\texportUrl = user.GetCheckPermissionByUrlMethod(exportUrl, h.route(urlNamePrefix+\"export\").Method())\n\tdetailUrl = user.GetCheckPermissionByUrlMethod(detailUrl, h.route(urlNamePrefix+\"detail\").Method())\n\n\treturn panel, panelInfo, []string{editUrl, newUrl, deleteUrl, exportUrl, detailUrl, infoUrl, updateUrl}, nil\n}\n\nfunc (h *Handler) showTable(ctx *context.Context, prefix string, params parameter.Parameters, panel table.Table) *bytes.Buffer {\n\n\tpanel, panelInfo, urls, err := h.showTableData(ctx, prefix, params, panel, \"\")\n\tif err != nil {\n\t\treturn h.Execute(ctx, auth.Auth(ctx),\n\t\t\ttemplate.WarningPanelWithDescAndTitle(ctx, err.Error(), errors.Msg, errors.Msg), \"\",\n\t\t\ttemplate.ExecuteOptions{Animation: params.Animation})\n\t}\n\n\tif panel.GetInfo().HasError() {\n\t\tif panel.GetInfo().PageErrorHTML != template2.HTML(\"\") {\n\t\t\treturn h.Execute(ctx, auth.Auth(ctx),\n\t\t\t\ttypes.Panel{Content: panel.GetInfo().PageErrorHTML}, \"\",\n\t\t\t\ttemplate.ExecuteOptions{Animation: params.Animation})\n\t\t}\n\t\treturn h.Execute(ctx, auth.Auth(ctx),\n\t\t\ttemplate.WarningPanel(ctx, panel.GetInfo().PageError.Error(),\n\t\t\t\ttemplate.GetPageTypeFromPageError(panel.GetInfo().PageError)), \"\",\n\t\t\ttemplate.ExecuteOptions{Animation: params.Animation})\n\t}\n\n\teditUrl, newUrl, deleteUrl, exportUrl, detailUrl, infoUrl,\n\t\tupdateUrl := urls[0], urls[1], urls[2], urls[3], urls[4], urls[5], urls[6]\n\n\tvar (\n\t\tactionJs  template2.JS\n\t\tbody      template2.HTML\n\t\tdataTable types.DataTableAttribute\n\n\t\tuser          = auth.Auth(ctx)\n\t\tinfo          = panel.GetInfo()\n\t\tactionBtns    = info.Action\n\t\tallActionBtns = info.ActionButtons.CheckPermissionWhenURLAndMethodNotEmpty(user)\n\t)\n\n\thasExtAction := actionBtns == template.HTML(\"\") && len(allActionBtns) > 0\n\thasAction := hasExtAction || (editUrl != \"\" || newUrl != \"\" || deleteUrl != \"\")\n\n\tif hasExtAction {\n\t\tif info.ActionButtonFold {\n\t\t\text := template2.HTML(\"\")\n\t\t\tif deleteUrl != \"\" {\n\t\t\t\text = html.LiEl().SetClass(\"divider\").Get()\n\t\t\t\tallActionBtns = append([]types.Button{types.GetActionButton(language.GetFromHtml(\"delete\"),\n\t\t\t\t\ttypes.NewDefaultAction(`data-id='{{.Id}}' data-param='{{(index .Value \"__goadmin_delete_params\").Content}}' style=\"cursor: pointer;\"`,\n\t\t\t\t\t\text, \"\", \"\"), \"grid-row-delete\")}, allActionBtns...)\n\t\t\t}\n\t\t\text = template2.HTML(\"\")\n\t\t\tif detailUrl != \"\" {\n\t\t\t\tif editUrl == \"\" && deleteUrl == \"\" {\n\t\t\t\t\text = html.LiEl().SetClass(\"divider\").Get()\n\t\t\t\t}\n\t\t\t\tallActionBtns = append([]types.Button{types.GetActionButton(language.GetFromHtml(\"detail\"),\n\t\t\t\t\taction.Jump(detailUrl+\"&\"+constant.DetailPKKey+`={{.Id}}{{(index .Value \"__goadmin_detail_params\").Content}}`, ext))}, allActionBtns...)\n\t\t\t}\n\t\t\tif editUrl != \"\" {\n\t\t\t\tif detailUrl == \"\" && deleteUrl == \"\" {\n\t\t\t\t\text = html.LiEl().SetClass(\"divider\").Get()\n\t\t\t\t}\n\t\t\t\tallActionBtns = append([]types.Button{types.GetActionButton(language.GetFromHtml(\"edit\"),\n\t\t\t\t\taction.Jump(editUrl+\"&\"+constant.EditPKKey+`={{.Id}}{{(index .Value \"__goadmin_edit_params\").Content}}`, ext))}, allActionBtns...)\n\t\t\t}\n\n\t\t\tvar content template2.HTML\n\t\t\tcontent, actionJs = allActionBtns.Content(ctx)\n\n\t\t\tactionBtns = html.Div(html.Div(\n\t\t\t\thtml.A(icon.Icon(icon.EllipsisV),\n\t\t\t\t\thtml.M{\"color\": \"#676565\"},\n\t\t\t\t\thtml.M{\"href\": \"#\"},\n\t\t\t\t), html.M{\"cursor\": \"pointer\", \"width\": \"100%\"}, html.M{\"class\": \"dropdown-toggle\", \"data-toggle\": \"dropdown\"})+\n\t\t\t\thtml.Ul(content,\n\t\t\t\t\thtml.M{\"min-width\": \"20px !important\", \"left\": \"-112px\", \"overflow\": \"hidden\"},\n\t\t\t\t\thtml.M{\"class\": \"dropdown-menu\", \"role\": \"menu\", \"aria-labelledby\": \"dLabel\"}),\n\t\t\t\thtml.M{\"text-align\": \"center\"}, html.M{\"class\": \"dropdown\"})\n\t\t} else {\n\t\t\tactionBtns, actionJs = allActionBtns.Content(ctx)\n\t\t}\n\t} else {\n\t\tinfo.ActionButtonFold = false\n\t}\n\n\tbtns, btnsJs := info.Buttons.CheckPermissionWhenURLAndMethodNotEmpty(user).Content(ctx)\n\n\tif info.TabGroups.Valid() {\n\n\t\tdataTable = aDataTable(ctx).\n\t\t\tSetThead(panelInfo.Thead).\n\t\t\tSetDeleteUrl(deleteUrl).\n\t\t\tSetNewUrl(newUrl).\n\t\t\tSetExportUrl(exportUrl)\n\n\t\tvar (\n\t\t\ttabsHtml    = make([]map[string]template2.HTML, len(info.TabHeaders))\n\t\t\tinfoListArr = panelInfo.InfoList.GroupBy(info.TabGroups)\n\t\t\ttheadArr    = panelInfo.Thead.GroupBy(info.TabGroups)\n\t\t)\n\t\tfor key, header := range info.TabHeaders {\n\t\t\ttabsHtml[key] = map[string]template2.HTML{\n\t\t\t\t\"title\": template2.HTML(header),\n\t\t\t\t\"content\": aDataTable(ctx).\n\t\t\t\t\tSetInfoList(infoListArr[key]).\n\t\t\t\t\tSetInfoUrl(infoUrl).\n\t\t\t\t\tSetButtons(btns).\n\t\t\t\t\tSetSticky(hasAction).\n\t\t\t\t\tSetActionJs(btnsJs + actionJs).\n\t\t\t\t\tSetHasFilter(len(panelInfo.FilterFormData) > 0).\n\t\t\t\t\tSetAction(actionBtns).\n\t\t\t\t\tSetActionFold(info.ActionButtonFold).\n\t\t\t\t\tSetIsTab(key != 0).\n\t\t\t\t\tSetPrimaryKey(panel.GetPrimaryKey().Name).\n\t\t\t\t\tSetThead(theadArr[key]).\n\t\t\t\t\tSetHideRowSelector(info.IsHideRowSelector).\n\t\t\t\t\tSetLayout(info.TableLayout).\n\t\t\t\t\tSetExportUrl(exportUrl).\n\t\t\t\t\tSetNewUrl(newUrl).\n\t\t\t\t\tSetSortUrl(params.GetFixedParamStrWithoutSort()).\n\t\t\t\t\tSetEditUrl(editUrl).\n\t\t\t\t\tSetUpdateUrl(updateUrl).\n\t\t\t\t\tSetDetailUrl(detailUrl).\n\t\t\t\t\tSetDeleteUrl(deleteUrl).\n\t\t\t\t\tGetContent(),\n\t\t\t}\n\t\t}\n\t\tbody = aTab(ctx).SetData(tabsHtml).GetContent()\n\t} else {\n\t\tdataTable = aDataTable(ctx).\n\t\t\tSetInfoList(panelInfo.InfoList).\n\t\t\tSetInfoUrl(infoUrl).\n\t\t\tSetButtons(btns).\n\t\t\tSetSticky(hasAction).\n\t\t\tSetLayout(info.TableLayout).\n\t\t\tSetActionJs(btnsJs + actionJs).\n\t\t\tSetAction(actionBtns).\n\t\t\tSetHasFilter(len(panelInfo.FilterFormData) > 0).\n\t\t\tSetPrimaryKey(panel.GetPrimaryKey().Name).\n\t\t\tSetThead(panelInfo.Thead).\n\t\t\tSetExportUrl(exportUrl).\n\t\t\tSetActionFold(info.ActionButtonFold).\n\t\t\tSetHideRowSelector(info.IsHideRowSelector).\n\t\t\tSetHideFilterArea(info.IsHideFilterArea).\n\t\t\tSetNewUrl(newUrl).\n\t\t\tSetEditUrl(editUrl).\n\t\t\tSetSortUrl(params.GetFixedParamStrWithoutSort()).\n\t\t\tSetUpdateUrl(updateUrl).\n\t\t\tSetDetailUrl(detailUrl).\n\t\t\tSetDeleteUrl(deleteUrl)\n\t\tbody = dataTable.GetContent()\n\t}\n\n\tisNotIframe := ctx.Query(constant.IframeKey) != \"true\"\n\tpaginator := panelInfo.Paginator\n\n\tif !isNotIframe {\n\t\tpaginator = paginator.SetEntriesInfo(\"\")\n\t}\n\n\tboxModel := aBox(ctx).\n\t\tSetBody(body).\n\t\tSetStyle(template2.HTMLAttr(`overflow-x: auto;overflow-y: hidden;`)).\n\t\tSetNoPadding().\n\t\tSetHeader(dataTable.GetDataTableHeader() + info.HeaderHtml).\n\t\tWithHeadBorder().\n\t\tSetIframeStyle(!isNotIframe).\n\t\tSetFooter(paginator.GetContent() + info.FooterHtml + `\n\t\t<script>\n\t\t$(document).ready(function() {\n\t\t\tvar tableWrapper = $(\".table\");\n\t\t\tvar lastTh = tableWrapper.find('tbody th:last-child');\n\t\t\tvar lastTd = tableWrapper.find('tbody td:last-child');\n\n\t\t\tvar minWidth = parseInt(tableWrapper.css('min-width'));\n\n\t\t\tvar resize = function() {\n\t\t\t\tif (tableWrapper.width() <= minWidth) {\n\t\t\t\t\tlastTh.addClass('last_th_td_ele');\n\t\t\t\t\tlastTd.addClass('last_th_td_ele');\n\t\t\t\t} else {\n\t\t\t\t\tlastTh.removeClass('last_th_td_ele');\n\t\t\t\t\tlastTd.removeClass('last_th_td_ele');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresize();\n\n\t\t\t$(window).resize(function() {\n\t\t\t\tresize();\n\t\t\t});\n\t\t});\n</script>\n\t\t`)\n\n\tcontent := template2.HTML(\"\")\n\n\tif len(panelInfo.FilterFormData) > 0 && info.FilterFormLayout == form2.LayoutFilter {\n\t\tfilterBoxModel := aBox(ctx).SetClass(\"filter-area\").\n\t\t\tSetAttr(`style=\"padding-top: 20px;margin-top: -10px;margin-bottom: 12px;padding-left: 20px;display: block;padding-bottom: 5px;\"`).\n\t\t\tSetStyle(`padding: 0px;`).\n\t\t\tSetBody(aForm(ctx).\n\t\t\t\tSetContent(panelInfo.FilterFormData).\n\t\t\t\tSetHorizontal(true).\n\t\t\t\tSetPrefix(h.config.PrefixFixSlash()).\n\t\t\t\tSetInputWidth(info.FilterFormInputWidth).\n\t\t\t\tSetHeadWidth(info.FilterFormHeadWidth).\n\t\t\t\tSetMethod(\"get\").\n\t\t\t\tSetLayout(info.FilterFormLayout).\n\t\t\t\tSetUrl(infoUrl). //  + params.GetFixedParamStrWithoutColumnsAndPage()\n\t\t\t\tSetHiddenFields(map[string]string{\n\t\t\t\t\tform.NoAnimationKey: \"true\",\n\t\t\t\t}).\n\t\t\t\tGetContent())\n\t\tcontent = filterBoxModel.GetContent() + boxModel.GetContent()\n\t} else {\n\t\tif len(panelInfo.FilterFormData) > 0 {\n\t\t\tboxModel = boxModel.SetSecondHeaderClass(\"filter-area\").\n\t\t\t\tSetSecondHeader(aForm(ctx).\n\t\t\t\t\tSetContent(panelInfo.FilterFormData).\n\t\t\t\t\tSetPrefix(h.config.PrefixFixSlash()).\n\t\t\t\t\tSetInputWidth(info.FilterFormInputWidth).\n\t\t\t\t\tSetHeadWidth(info.FilterFormHeadWidth).\n\t\t\t\t\tSetMethod(\"get\").\n\t\t\t\t\tSetLayout(info.FilterFormLayout).\n\t\t\t\t\tSetUrl(infoUrl). //  + params.GetFixedParamStrWithoutColumnsAndPage()\n\t\t\t\t\tSetHiddenFields(map[string]string{\n\t\t\t\t\t\tform.NoAnimationKey: \"true\",\n\t\t\t\t\t}).\n\t\t\t\t\tSetOperationFooter(filterFormFooter(ctx, infoUrl)).\n\t\t\t\t\tGetContent())\n\t\t}\n\t\tcontent = boxModel.GetContent()\n\t}\n\n\tif info.Wrapper != nil {\n\t\tcontent = info.Wrapper(content)\n\t}\n\n\tinterval := make([]int, 0)\n\tautoRefresh := info.AutoRefresh != uint(0)\n\tif autoRefresh {\n\t\tinterval = append(interval, int(info.AutoRefresh))\n\t}\n\n\treturn h.Execute(ctx, user, types.Panel{\n\t\tContent:         content,\n\t\tDescription:     template2.HTML(panelInfo.Description),\n\t\tTitle:           modules.AorBHTML(isNotIframe, template2.HTML(panelInfo.Title), \"\"),\n\t\tMiniSidebar:     info.HideSideBar,\n\t\tAutoRefresh:     autoRefresh,\n\t\tRefreshInterval: interval,\n\t}, \"\", template.ExecuteOptions{Animation: params.Animation, NoCompress: info.NoCompress})\n}\n\n// Assets return front-end assets according the request path.\nfunc (h *Handler) Assets(ctx *context.Context) {\n\tfilepath := h.config.URLRemovePrefix(ctx.Path())\n\n\ttheme := h.assetsTheme[filepath]\n\tif theme == \"\" {\n\t\ttheme = h.config.Theme\n\t}\n\n\tdata, err := aTemplateByTheme(ctx, theme).GetAsset(filepath)\n\n\tif err != nil {\n\t\tdata, err = template.GetAsset(filepath)\n\t\tif err != nil {\n\t\t\tlogger.ErrorCtx(ctx, \"asset err %+v\", err)\n\t\t\tctx.Write(http.StatusNotFound, map[string]string{}, \"\")\n\t\t\treturn\n\t\t}\n\t}\n\n\tvar contentType = mime.TypeByExtension(path.Ext(filepath))\n\n\tif contentType == \"\" {\n\t\tcontentType = \"application/octet-stream\"\n\t}\n\n\tetag := fmt.Sprintf(\"%x\", md5.Sum(data))\n\n\tif match := ctx.Headers(\"If-None-Match\"); match != \"\" {\n\t\tif strings.Contains(match, etag) {\n\t\t\tctx.SetStatusCode(http.StatusNotModified)\n\t\t\treturn\n\t\t}\n\t}\n\n\tctx.DataWithHeaders(http.StatusOK, map[string]string{\n\t\t\"Content-Type\":   contentType,\n\t\t\"Cache-Control\":  \"max-age=2592000\",\n\t\t\"Content-Length\": strconv.Itoa(len(data)),\n\t\t\"ETag\":           etag,\n\t}, data)\n}\n\n// Export export table rows as excel object.\nfunc (h *Handler) Export(ctx *context.Context) {\n\tparam := guard.GetExportParam(ctx)\n\n\ttableName := \"Sheet1\"\n\tprefix := ctx.Query(constant.PrefixKey)\n\tpanel := h.table(prefix, ctx)\n\n\tf := excelize.NewFile()\n\tindex := f.NewSheet(tableName)\n\tf.SetActiveSheet(index)\n\n\tvar (\n\t\tinfoData  table.PanelInfo\n\t\tfileName  string\n\t\terr       error\n\t\ttableInfo = panel.GetInfo()\n\t\tparams    parameter.Parameters\n\t)\n\n\tif fn := panel.GetInfo().ExportProcessFn; fn != nil {\n\t\tparams = parameter.GetParam(ctx.Request.URL, tableInfo.DefaultPageSize, tableInfo.SortField,\n\t\t\ttableInfo.GetSort())\n\t\tp, err := fn(params.WithIsAll(param.IsAll))\n\t\tif err != nil {\n\t\t\tresponse.Error(ctx, \"export error\")\n\t\t\treturn\n\t\t}\n\t\tinfoData.Thead = p.Thead\n\t\tinfoData.InfoList = p.InfoList\n\t} else {\n\t\tif len(param.Id) == 0 {\n\t\t\tparams = parameter.GetParam(ctx.Request.URL, tableInfo.DefaultPageSize, tableInfo.SortField,\n\t\t\t\ttableInfo.GetSort())\n\t\t\tinfoData, err = panel.GetData(ctx, params.WithIsAll(param.IsAll))\n\t\t\tfileName = fmt.Sprintf(\"%s-%d-page-%s-pageSize-%s.xlsx\", tableInfo.Title, time.Now().Unix(),\n\t\t\t\tparams.Page, params.PageSize)\n\t\t} else {\n\t\t\tinfoData, err = panel.GetDataWithIds(ctx, parameter.GetParam(ctx.Request.URL,\n\t\t\t\ttableInfo.DefaultPageSize, tableInfo.SortField, tableInfo.GetSort()).WithPKs(param.Id...))\n\t\t\tfileName = fmt.Sprintf(\"%s-%d-id-%s.xlsx\", tableInfo.Title, time.Now().Unix(), strings.Join(param.Id, \"_\"))\n\t\t}\n\t\tif err != nil {\n\t\t\tresponse.Error(ctx, \"export error\")\n\t\t\treturn\n\t\t}\n\t}\n\n\t// TODO: support any numbers of fields.\n\torders := []string{\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\",\n\t\t\"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"}\n\n\tif len(infoData.Thead) > 26 {\n\t\tj := -1\n\t\tfor i := 0; i < len(infoData.Thead)-26; i++ {\n\t\t\tif i%26 == 0 {\n\t\t\t\tj++\n\t\t\t}\n\t\t\tletter := orders[j] + orders[i%26]\n\t\t\torders = append(orders, letter)\n\t\t}\n\t}\n\n\tcolumnIndex := 0\n\tfor _, head := range infoData.Thead {\n\t\tif !head.Hide {\n\t\t\tf.SetCellValue(tableName, orders[columnIndex]+\"1\", head.Head)\n\t\t\tcolumnIndex++\n\t\t}\n\t}\n\n\tcount := 2\n\tfor _, info := range infoData.InfoList {\n\t\tcolumnIndex = 0\n\t\tfor _, head := range infoData.Thead {\n\t\t\tif !head.Hide {\n\t\t\t\tif tableInfo.IsExportValue() {\n\t\t\t\t\tf.SetCellValue(tableName, orders[columnIndex]+strconv.Itoa(count), info[head.Field].Value)\n\t\t\t\t} else {\n\t\t\t\t\tf.SetCellValue(tableName, orders[columnIndex]+strconv.Itoa(count), info[head.Field].Content)\n\t\t\t\t}\n\t\t\t\tcolumnIndex++\n\t\t\t}\n\t\t}\n\t\tcount++\n\t}\n\n\tbuf, err := f.WriteToBuffer()\n\n\tif err != nil || buf == nil {\n\t\tresponse.Error(ctx, \"export error\")\n\t\treturn\n\t}\n\n\tctx.AddHeader(\"content-disposition\", `attachment; filename=`+fileName)\n\tctx.Data(200, \"application/vnd.ms-excel\", buf.Bytes())\n}\n"
  },
  {
    "path": "plugins/admin/controller/system.go",
    "content": "package controller\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"os\"\n\t\"runtime\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/system\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\nfunc (h *Handler) SystemInfo(ctx *context.Context) {\n\n\tsize := types.Size(6, 6, 6)\n\n\tbox1 := aBox(ctx).\n\t\tWithHeadBorder().\n\t\tSetHeader(\"<b>\" + lg(\"application\") + \"</b>\").\n\t\tSetBody(stripedTable(ctx, []map[string]types.InfoItem{\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"app_name\")},\n\t\t\t\t\"value\": types.InfoItem{Content: \"GoAdmin\"},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"go_admin_version\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(system.Version())},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"theme_name\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(aTemplate(ctx).Name())},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"theme_version\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(aTemplate(ctx).GetVersion())},\n\t\t\t},\n\t\t})).\n\t\tGetContent()\n\n\tapp := system.GetAppStatus()\n\n\tbox2 := aBox(ctx).\n\t\tWithHeadBorder().\n\t\tSetHeader(\"<b>\" + lg(\"application run\") + \"</b>\").\n\t\tSetBody(stripedTable(ctx, []map[string]types.InfoItem{\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"current_heap_usage\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.HeapAlloc)},\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"heap_memory_obtained\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.HeapSys)},\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"heap_memory_idle\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.HeapIdle)},\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"heap_memory_in_use\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.HeapInuse)},\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"heap_memory_released\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.HeapReleased)},\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"heap_objects\")},\n\t\t\t\t\"value\": types.InfoItem{Content: itos(app.HeapObjects)},\n\t\t\t},\n\t\t}) + `<div><hr></div>` + stripedTable(ctx, []map[string]types.InfoItem{\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"next_gc_recycle\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.NextGC)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"last_gc_time\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.LastGC)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"total_gc_pause\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.PauseTotalNs)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"last_gc_pause\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.PauseNs)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"gc_times\")},\n\t\t\t\t\"value\": types.InfoItem{Content: itos(app.NumGC)},\n\t\t\t},\n\t\t})).\n\t\tGetContent()\n\n\tcol1 := aCol(ctx).SetSize(size).SetContent(box1 + box2).GetContent()\n\n\tbox4 := aBox(ctx).\n\t\tWithHeadBorder().\n\t\tSetHeader(\"<b>\" + lg(\"application run\") + \"</b>\").\n\t\tSetBody(stripedTable(ctx, []map[string]types.InfoItem{\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"golang_version\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(runtime.Version())},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"process_id\")},\n\t\t\t\t\"value\": types.InfoItem{Content: itos(os.Getpid())},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"server_uptime\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.Uptime)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"current_goroutine\")},\n\t\t\t\t\"value\": types.InfoItem{Content: itos(app.NumGoroutine)},\n\t\t\t},\n\t\t}) + `<div><hr></div>` + stripedTable(ctx, []map[string]types.InfoItem{\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"current_memory_usage\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.MemAllocated)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"total_memory_allocated\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.MemTotal)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"memory_obtained\")},\n\t\t\t\t\"value\": types.InfoItem{Content: itos(app.MemSys)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"pointer_lookup_times\")},\n\t\t\t\t\"value\": types.InfoItem{Content: itos(app.Lookups)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"memory_allocate_times\")},\n\t\t\t\t\"value\": types.InfoItem{Content: itos(app.MemMallocs)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"memory_free_times\")},\n\t\t\t\t\"value\": types.InfoItem{Content: itos(app.MemFrees)},\n\t\t\t},\n\t\t}) + `<div><hr></div>` + stripedTable(ctx, []map[string]types.InfoItem{\n\t\t\t{\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"bootstrap_stack_usage\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.StackInuse)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"stack_memory_obtained\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.StackSys)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"mspan_structures_usage\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.MSpanInuse)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"mspan_structures_obtained\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.HeapSys)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"mcache_structures_usage\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.MCacheInuse)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"mcache_structures_obtained\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.MCacheSys)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"profiling_bucket_hash_table_obtained\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.BuckHashSys)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"gc_metadata_obtained\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.GCSys)},\n\t\t\t}, {\n\t\t\t\t\"key\":   types.InfoItem{Content: lg(\"other_system_allocation_obtained\")},\n\t\t\t\t\"value\": types.InfoItem{Content: template.HTML(app.OtherSys)},\n\t\t\t},\n\t\t})).\n\t\tGetContent()\n\n\tcol2 := aCol(ctx).SetSize(size).SetContent(box4).GetContent()\n\n\trow := aRow(ctx).SetContent(col1 + col2).GetContent()\n\n\th.HTML(ctx, auth.Auth(ctx), types.Panel{\n\t\tContent:     row,\n\t\tDescription: language.GetFromHtml(\"site info\", \"system\"),\n\t\tTitle:       language.GetFromHtml(\"site info\", \"system\"),\n\t})\n}\n\nfunc stripedTable(ctx *context.Context, list []map[string]types.InfoItem) template.HTML {\n\treturn aTable(ctx).\n\t\tSetStyle(\"striped\").\n\t\tSetHideThead().\n\t\tSetMinWidth(\"0.01%\").\n\t\tSetThead(types.Thead{\n\t\t\ttypes.TheadItem{Head: \"key\", Width: \"50%\"},\n\t\t\ttypes.TheadItem{Head: \"value\"},\n\t\t}).\n\t\tSetInfoList(list).GetContent()\n}\n\nfunc lg(v template.HTML) template.HTML {\n\treturn language.GetFromHtml(v, \"system\")\n}\n\nfunc itos(i interface{}) template.HTML {\n\treturn template.HTML(fmt.Sprintf(\"%v\", i))\n}\n"
  },
  {
    "path": "plugins/admin/data/mysql/admin.sql",
    "content": "# ************************************************************\n# Sequel Pro SQL dump\n# Version 4468\n#\n# http://www.sequelpro.com/\n# https://github.com/sequelpro/sequelpro\n#\n# Host: 127.0.0.1 (MySQL 5.7.19)\n# Database: godmin\n# Generation Time: 2019-09-12 04:16:47 +0000\n# ************************************************************\n\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n/*!40101 SET NAMES utf8 */;\n/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n\n\n# Dump of table goadmin_menu\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_menu`;\n\nCREATE TABLE `goadmin_menu` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `parent_id` int(11) unsigned NOT NULL DEFAULT '0',\n  `type` tinyint(4) unsigned NOT NULL DEFAULT '0',\n  `order` int(11) unsigned NOT NULL DEFAULT '0',\n  `title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `icon` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `uri` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `header` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_menu` WRITE;\n/*!40000 ALTER TABLE `goadmin_menu` DISABLE KEYS */;\n\nINSERT INTO `goadmin_menu` (`id`, `parent_id`, `type`, `order`, `title`, `icon`, `uri`, `header`, `created_at`, `updated_at`)\nVALUES\n\t(1,0,1,2,'Admin','fa-tasks','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,1,1,2,'Users','fa-users','/info/manager',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(3,1,1,3,'Roles','fa-user','/info/roles',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(4,1,1,4,'Permission','fa-ban','/info/permission',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(5,1,1,5,'Menu','fa-bars','/menu',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(6,1,1,6,'Operation log','fa-history','/info/op',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(7,0,1,1,'Dashboard','fa-bar-chart','/',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_menu` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_operation_log\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_operation_log`;\n\nCREATE TABLE `goadmin_operation_log` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `user_id` int(11) unsigned NOT NULL,\n  `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `method` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `ip` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `input` text COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  KEY `admin_operation_log_user_id_index` (`user_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n\n\n# Dump of table goadmin_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_permissions`;\n\nCREATE TABLE `goadmin_permissions` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `http_method` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `http_path` text COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_permissions_name_unique` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_permissions` (`id`, `name`, `slug`, `http_method`, `http_path`, `created_at`, `updated_at`)\nVALUES\n\t(1,'All permission','*','','*','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'Dashboard','dashboard','GET,PUT,POST,DELETE','/','2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_role_menu\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_menu`;\n\nCREATE TABLE `goadmin_role_menu` (\n  `role_id` int(11) unsigned NOT NULL,\n  `menu_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  KEY `admin_role_menu_role_id_menu_id_index` (`role_id`,`menu_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_menu` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_menu` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_menu` (`role_id`, `menu_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,8,'2019-09-11 10:20:55','2019-09-11 10:20:55'),\n\t(2,8,'2019-09-11 10:20:55','2019-09-11 10:20:55');\n\n/*!40000 ALTER TABLE `goadmin_role_menu` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_role_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_permissions`;\n\nCREATE TABLE `goadmin_role_permissions` (\n  `role_id` int(11) unsigned NOT NULL,\n  `permission_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_role_permissions` (`role_id`,`permission_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_permissions` (`role_id`, `permission_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,2,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_role_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_role_users\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_users`;\n\nCREATE TABLE `goadmin_role_users` (\n  `role_id` int(11) unsigned NOT NULL,\n  `user_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_user_roles` (`role_id`,`user_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_users` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_users` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_users` (`role_id`, `user_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_role_users` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_roles\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_roles`;\n\nCREATE TABLE `goadmin_roles` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_roles_name_unique` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_roles` WRITE;\n/*!40000 ALTER TABLE `goadmin_roles` DISABLE KEYS */;\n\nINSERT INTO `goadmin_roles` (`id`, `name`, `slug`, `created_at`, `updated_at`)\nVALUES\n\t(1,'Administrator','administrator','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'Operator','operator','2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_roles` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_session\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_session`;\n\nCREATE TABLE `goadmin_session` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `sid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `values` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n\n\n# Dump of table goadmin_user_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_user_permissions`;\n\nCREATE TABLE `goadmin_user_permissions` (\n  `user_id` int(11) unsigned NOT NULL,\n  `permission_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_user_permissions` (`user_id`,`permission_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_user_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_user_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_user_permissions` (`user_id`, `permission_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_user_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_users\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_users`;\n\nCREATE TABLE `goadmin_users` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `username` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `password` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_users_username_unique` (`username`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_users` WRITE;\n/*!40000 ALTER TABLE `goadmin_users` DISABLE KEYS */;\n\nINSERT INTO `goadmin_users` (`id`, `username`, `password`, `name`, `avatar`, `remember_token`, `created_at`, `updated_at`)\nVALUES\n\t(1,'admin','$2a$10$U3F/NSaf2kaVbyXTBp7ppOn0jZFyRqXRnYXB.AMioCjXl3Ciaj4oy','admin','','tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'operator','$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.','Operator','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_users` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n\n/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n"
  },
  {
    "path": "plugins/admin/models/base.go",
    "content": "package models\n\nimport (\n\t\"database/sql\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n)\n\n// Base is base model structure.\ntype Base struct {\n\tTableName string\n\n\tConn db.Connection\n\tTx   *sql.Tx\n}\n\nfunc (b Base) SetConn(con db.Connection) Base {\n\tb.Conn = con\n\treturn b\n}\n\nfunc (b Base) Table(table string) *db.SQL {\n\treturn db.Table(table).WithDriver(b.Conn)\n}\n"
  },
  {
    "path": "plugins/admin/models/menu.go",
    "content": "package models\n\nimport (\n\t\"encoding/json\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n)\n\n// MenuModel is menu model structure.\ntype MenuModel struct {\n\tBase\n\n\tId        int64\n\tTitle     string\n\tParentId  int64\n\tIcon      string\n\tUri       string\n\tHeader    string\n\tCreatedAt string\n\tUpdatedAt string\n}\n\n// Menu return a default menu model.\nfunc Menu() MenuModel {\n\treturn MenuModel{Base: Base{TableName: \"goadmin_menu\"}}\n}\n\n// MenuWithId return a default menu model of given id.\nfunc MenuWithId(id string) MenuModel {\n\tidInt, _ := strconv.Atoi(id)\n\treturn MenuModel{Base: Base{TableName: \"goadmin_menu\"}, Id: int64(idInt)}\n}\n\nfunc (t MenuModel) SetConn(con db.Connection) MenuModel {\n\tt.Conn = con\n\treturn t\n}\n\n// Find return a default menu model of given id.\nfunc (t MenuModel) Find(id interface{}) MenuModel {\n\titem, _ := t.Table(t.TableName).Find(id)\n\treturn t.MapToModel(item)\n}\n\n// New create a new menu model.\nfunc (t MenuModel) New(title, icon, uri, header, pluginName string, parentId, order int64) (MenuModel, error) {\n\n\tid, err := t.Table(t.TableName).Insert(dialect.H{\n\t\t\"title\":       title,\n\t\t\"parent_id\":   parentId,\n\t\t\"icon\":        icon,\n\t\t\"uri\":         uri,\n\t\t\"order\":       order,\n\t\t\"header\":      header,\n\t\t\"plugin_name\": pluginName,\n\t})\n\n\tt.Id = id\n\tt.Title = title\n\tt.ParentId = parentId\n\tt.Icon = icon\n\tt.Uri = uri\n\tt.Header = header\n\n\treturn t, err\n}\n\n// Delete delete the menu model.\nfunc (t MenuModel) Delete() {\n\t_ = t.Table(t.TableName).Where(\"id\", \"=\", t.Id).Delete()\n\t_ = t.Table(\"goadmin_role_menu\").Where(\"menu_id\", \"=\", t.Id).Delete()\n\titems, _ := t.Table(t.TableName).Where(\"parent_id\", \"=\", t.Id).All()\n\n\tif len(items) > 0 {\n\t\tids := make([]interface{}, len(items))\n\t\tfor i := 0; i < len(ids); i++ {\n\t\t\tids[i] = items[i][\"id\"]\n\t\t}\n\t\t_ = t.Table(\"goadmin_role_menu\").WhereIn(\"menu_id\", ids).Delete()\n\t}\n\n\t_ = t.Table(t.TableName).Where(\"parent_id\", \"=\", t.Id).Delete()\n}\n\n// Update update the menu model.\nfunc (t MenuModel) Update(title, icon, uri, header, pluginName string, parentId int64) (int64, error) {\n\treturn t.Table(t.TableName).\n\t\tWhere(\"id\", \"=\", t.Id).\n\t\tUpdate(dialect.H{\n\t\t\t\"title\":       title,\n\t\t\t\"parent_id\":   parentId,\n\t\t\t\"icon\":        icon,\n\t\t\t\"plugin_name\": pluginName,\n\t\t\t\"uri\":         uri,\n\t\t\t\"header\":      header,\n\t\t\t\"updated_at\":  time.Now().Format(\"2006-01-02 15:04:05\"),\n\t\t})\n}\n\ntype OrderItems []OrderItem\n\ntype OrderItem struct {\n\tID       uint       `json:\"id\"`\n\tChildren OrderItems `json:\"children\"`\n}\n\n// ResetOrder update the order of menu models.\nfunc (t MenuModel) ResetOrder(data []byte) {\n\n\tvar items OrderItems\n\t_ = json.Unmarshal(data, &items)\n\n\tcount := 1\n\tfor _, v := range items {\n\t\tif len(v.Children) > 0 {\n\t\t\t_, _ = t.Table(t.TableName).\n\t\t\t\tWhere(\"id\", \"=\", v.ID).\n\t\t\t\tUpdate(dialect.H{\n\t\t\t\t\t\"order\":     count,\n\t\t\t\t\t\"parent_id\": 0,\n\t\t\t\t})\n\n\t\t\tfor _, v2 := range v.Children {\n\t\t\t\tif len(v2.Children) > 0 {\n\n\t\t\t\t\t_, _ = t.Table(t.TableName).\n\t\t\t\t\t\tWhere(\"id\", \"=\", v2.ID).\n\t\t\t\t\t\tUpdate(dialect.H{\n\t\t\t\t\t\t\t\"order\":     count,\n\t\t\t\t\t\t\t\"parent_id\": v.ID,\n\t\t\t\t\t\t})\n\n\t\t\t\t\tfor _, v3 := range v2.Children {\n\t\t\t\t\t\t_, _ = t.Table(t.TableName).\n\t\t\t\t\t\t\tWhere(\"id\", \"=\", v3.ID).\n\t\t\t\t\t\t\tUpdate(dialect.H{\n\t\t\t\t\t\t\t\t\"order\":     count,\n\t\t\t\t\t\t\t\t\"parent_id\": v2.ID,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tcount++\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t_, _ = t.Table(t.TableName).\n\t\t\t\t\t\tWhere(\"id\", \"=\", v2.ID).\n\t\t\t\t\t\tUpdate(dialect.H{\n\t\t\t\t\t\t\t\"order\":     count,\n\t\t\t\t\t\t\t\"parent_id\": v.ID,\n\t\t\t\t\t\t})\n\t\t\t\t\tcount++\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t_, _ = t.Table(t.TableName).\n\t\t\t\tWhere(\"id\", \"=\", v.ID).\n\t\t\t\tUpdate(dialect.H{\n\t\t\t\t\t\"order\":     count,\n\t\t\t\t\t\"parent_id\": 0,\n\t\t\t\t})\n\t\t\tcount++\n\t\t}\n\t}\n}\n\n// CheckRole check the role if has permission to get the menu.\nfunc (t MenuModel) CheckRole(roleId string) bool {\n\tcheckRole, _ := t.Table(\"goadmin_role_menu\").\n\t\tWhere(\"role_id\", \"=\", roleId).\n\t\tWhere(\"menu_id\", \"=\", t.Id).\n\t\tFirst()\n\treturn checkRole != nil\n}\n\n// AddRole add a role to the menu.\nfunc (t MenuModel) AddRole(roleId string) (int64, error) {\n\tif roleId != \"\" {\n\t\tif !t.CheckRole(roleId) {\n\t\t\treturn t.Table(\"goadmin_role_menu\").\n\t\t\t\tInsert(dialect.H{\n\t\t\t\t\t\"role_id\": roleId,\n\t\t\t\t\t\"menu_id\": t.Id,\n\t\t\t\t})\n\t\t}\n\t}\n\treturn 0, nil\n}\n\n// DeleteRoles delete roles with menu.\nfunc (t MenuModel) DeleteRoles() error {\n\treturn t.Table(\"goadmin_role_menu\").\n\t\tWhere(\"menu_id\", \"=\", t.Id).\n\t\tDelete()\n}\n\n// MapToModel get the menu model from given map.\nfunc (t MenuModel) MapToModel(m map[string]interface{}) MenuModel {\n\tt.Id = m[\"id\"].(int64)\n\tt.Title, _ = m[\"title\"].(string)\n\tt.ParentId = m[\"parent_id\"].(int64)\n\tt.Icon, _ = m[\"icon\"].(string)\n\tt.Uri, _ = m[\"uri\"].(string)\n\tt.Header, _ = m[\"header\"].(string)\n\tt.CreatedAt, _ = m[\"created_at\"].(string)\n\tt.UpdatedAt, _ = m[\"updated_at\"].(string)\n\treturn t\n}\n"
  },
  {
    "path": "plugins/admin/models/operation_log.go",
    "content": "package models\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n)\n\n// OperationLogModel is operation log model structure.\ntype OperationLogModel struct {\n\tBase\n\n\tId        int64\n\tUserId    int64\n\tPath      string\n\tMethod    string\n\tIp        string\n\tInput     string\n\tCreatedAt string\n\tUpdatedAt string\n}\n\n// OperationLog return a default operation log model.\nfunc OperationLog() OperationLogModel {\n\treturn OperationLogModel{Base: Base{TableName: \"goadmin_operation_log\"}}\n}\n\n// Find return a default operation log model of given id.\nfunc (t OperationLogModel) Find(id interface{}) OperationLogModel {\n\titem, _ := t.Table(t.TableName).Find(id)\n\treturn t.MapToModel(item)\n}\n\nfunc (t OperationLogModel) SetConn(con db.Connection) OperationLogModel {\n\tt.Conn = con\n\treturn t\n}\n\n// New create a new operation log model.\nfunc (t OperationLogModel) New(userId int64, path, method, ip, input string) OperationLogModel {\n\n\tid, _ := t.Table(t.TableName).Insert(dialect.H{\n\t\t\"user_id\": userId,\n\t\t\"path\":    path,\n\t\t\"method\":  method,\n\t\t\"ip\":      ip,\n\t\t\"input\":   input,\n\t})\n\n\tt.Id = id\n\tt.UserId = userId\n\tt.Path = path\n\tt.Method = method\n\tt.Ip = ip\n\tt.Input = input\n\n\treturn t\n}\n\n// MapToModel get the operation log model from given map.\nfunc (t OperationLogModel) MapToModel(m map[string]interface{}) OperationLogModel {\n\tt.Id = m[\"id\"].(int64)\n\tt.UserId = m[\"user_id\"].(int64)\n\tt.Path, _ = m[\"path\"].(string)\n\tt.Method, _ = m[\"method\"].(string)\n\tt.Ip, _ = m[\"ip\"].(string)\n\tt.Input, _ = m[\"input\"].(string)\n\tt.CreatedAt, _ = m[\"created_at\"].(string)\n\tt.UpdatedAt, _ = m[\"updated_at\"].(string)\n\treturn t\n}\n"
  },
  {
    "path": "plugins/admin/models/permission.go",
    "content": "package models\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n)\n\n// PermissionModel is permission model structure.\ntype PermissionModel struct {\n\tBase\n\n\tId         int64\n\tName       string\n\tSlug       string\n\tHttpMethod []string\n\tHttpPath   []string\n\tCreatedAt  string\n\tUpdatedAt  string\n}\n\n// Permission return a default permission model.\nfunc Permission() PermissionModel {\n\treturn PermissionModel{Base: Base{TableName: \"goadmin_permissions\"}}\n}\n\n// PermissionWithId return a default permission model of given id.\nfunc PermissionWithId(id string) PermissionModel {\n\tidInt, _ := strconv.Atoi(id)\n\treturn PermissionModel{Base: Base{TableName: \"goadmin_permissions\"}, Id: int64(idInt)}\n}\n\nfunc (t PermissionModel) SetConn(con db.Connection) PermissionModel {\n\tt.Conn = con\n\treturn t\n}\n\n// IsEmpty check the user model is empty or not.\nfunc (t PermissionModel) IsEmpty() bool {\n\treturn t.Id == int64(0)\n}\n\n// IsSlugExist check the row exist with given slug and id.\nfunc (t PermissionModel) IsSlugExist(slug string, id string) bool {\n\tif id == \"\" {\n\t\tcheck, _ := t.Table(t.TableName).Where(\"slug\", \"=\", slug).First()\n\t\treturn check != nil\n\t}\n\tcheck, _ := t.Table(t.TableName).\n\t\tWhere(\"slug\", \"=\", slug).\n\t\tWhere(\"id\", \"!=\", id).\n\t\tFirst()\n\treturn check != nil\n}\n\n// Find return the permission model of given id.\nfunc (t PermissionModel) Find(id interface{}) PermissionModel {\n\titem, _ := t.Table(t.TableName).Find(id)\n\treturn t.MapToModel(item)\n}\n\n// FindBySlug return the permission model of given slug.\nfunc (t PermissionModel) FindBySlug(slug string) PermissionModel {\n\titem, _ := t.Table(t.TableName).Where(\"slug\", \"=\", slug).First()\n\treturn t.MapToModel(item)\n}\n\n// FindBySlug return the permission model of given slug.\nfunc (t PermissionModel) FindByName(name string) PermissionModel {\n\titem, _ := t.Table(t.TableName).Where(\"name\", \"=\", name).First()\n\treturn t.MapToModel(item)\n}\n\n// MapToModel get the permission model from given map.\nfunc (t PermissionModel) MapToModel(m map[string]interface{}) PermissionModel {\n\tt.Id = m[\"id\"].(int64)\n\tt.Name, _ = m[\"name\"].(string)\n\tt.Slug, _ = m[\"slug\"].(string)\n\n\tmethods, _ := m[\"http_method\"].(string)\n\tif methods != \"\" {\n\t\tt.HttpMethod = strings.Split(methods, \",\")\n\t} else {\n\t\tt.HttpMethod = []string{\"\"}\n\t}\n\n\tpath, _ := m[\"http_path\"].(string)\n\tt.HttpPath = strings.Split(path, \"\\n\")\n\tt.CreatedAt, _ = m[\"created_at\"].(string)\n\tt.UpdatedAt, _ = m[\"updated_at\"].(string)\n\treturn t\n}\n"
  },
  {
    "path": "plugins/admin/models/role.go",
    "content": "package models\n\nimport (\n\t\"database/sql\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n)\n\n// RoleModel is role model structure.\ntype RoleModel struct {\n\tBase\n\n\tId        int64\n\tName      string\n\tSlug      string\n\tCreatedAt string\n\tUpdatedAt string\n}\n\n// Role return a default role model.\nfunc Role() RoleModel {\n\treturn RoleModel{Base: Base{TableName: \"goadmin_roles\"}}\n}\n\n// RoleWithId return a default role model of given id.\nfunc RoleWithId(id string) RoleModel {\n\tidInt, _ := strconv.Atoi(id)\n\treturn RoleModel{Base: Base{TableName: \"goadmin_roles\"}, Id: int64(idInt)}\n}\n\nfunc (t RoleModel) SetConn(con db.Connection) RoleModel {\n\tt.Conn = con\n\treturn t\n}\n\nfunc (t RoleModel) WithTx(tx *sql.Tx) RoleModel {\n\tt.Tx = tx\n\treturn t\n}\n\n// Find return a default role model of given id.\nfunc (t RoleModel) Find(id interface{}) RoleModel {\n\titem, _ := t.Table(t.TableName).Find(id)\n\treturn t.MapToModel(item)\n}\n\n// IsSlugExist check the row exist with given slug and id.\nfunc (t RoleModel) IsSlugExist(slug string, id string) bool {\n\tif id == \"\" {\n\t\tcheck, _ := t.Table(t.TableName).Where(\"slug\", \"=\", slug).First()\n\t\treturn check != nil\n\t}\n\tcheck, _ := t.Table(t.TableName).\n\t\tWhere(\"slug\", \"=\", slug).\n\t\tWhere(\"id\", \"!=\", id).\n\t\tFirst()\n\treturn check != nil\n}\n\n// New create a role model.\nfunc (t RoleModel) New(name, slug string) (RoleModel, error) {\n\n\tid, err := t.WithTx(t.Tx).Table(t.TableName).Insert(dialect.H{\n\t\t\"name\": name,\n\t\t\"slug\": slug,\n\t})\n\n\tt.Id = id\n\tt.Name = name\n\tt.Slug = slug\n\n\treturn t, err\n}\n\n// Update update the role model.\nfunc (t RoleModel) Update(name, slug string) (int64, error) {\n\n\treturn t.WithTx(t.Tx).Table(t.TableName).\n\t\tWhere(\"id\", \"=\", t.Id).\n\t\tUpdate(dialect.H{\n\t\t\t\"name\":       name,\n\t\t\t\"slug\":       slug,\n\t\t\t\"updated_at\": time.Now().Format(\"2006-01-02 15:04:05\"),\n\t\t})\n}\n\n// CheckPermission check the permission of role.\nfunc (t RoleModel) CheckPermission(permissionId string) bool {\n\tcheckPermission, _ := t.Table(\"goadmin_role_permissions\").\n\t\tWhere(\"permission_id\", \"=\", permissionId).\n\t\tWhere(\"role_id\", \"=\", t.Id).\n\t\tFirst()\n\treturn checkPermission != nil\n}\n\n// DeletePermissions delete all the permissions of role.\nfunc (t RoleModel) DeletePermissions() error {\n\treturn t.WithTx(t.Tx).Table(\"goadmin_role_permissions\").\n\t\tWhere(\"role_id\", \"=\", t.Id).\n\t\tDelete()\n}\n\n// AddPermission add the permissions to the role.\nfunc (t RoleModel) AddPermission(permissionId string) (int64, error) {\n\tif permissionId != \"\" {\n\t\tif !t.CheckPermission(permissionId) {\n\t\t\treturn t.WithTx(t.Tx).Table(\"goadmin_role_permissions\").\n\t\t\t\tInsert(dialect.H{\n\t\t\t\t\t\"permission_id\": permissionId,\n\t\t\t\t\t\"role_id\":       t.Id,\n\t\t\t\t})\n\t\t}\n\t}\n\treturn 0, nil\n}\n\n// MapToModel get the role model from given map.\nfunc (t RoleModel) MapToModel(m map[string]interface{}) RoleModel {\n\tt.Id = m[\"id\"].(int64)\n\tt.Name, _ = m[\"name\"].(string)\n\tt.Slug, _ = m[\"slug\"].(string)\n\tt.CreatedAt, _ = m[\"created_at\"].(string)\n\tt.UpdatedAt, _ = m[\"updated_at\"].(string)\n\treturn t\n}\n"
  },
  {
    "path": "plugins/admin/models/site.go",
    "content": "package models\n\nimport (\n\t\"database/sql\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/collection\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n)\n\n// SiteModel is role model structure.\ntype SiteModel struct {\n\tBase\n\n\tId    int64\n\tKey   string\n\tValue string\n\tDesc  string\n\tState int64\n\n\tCreatedAt string\n\tUpdatedAt string\n}\n\nconst (\n\tSiteItemOpenState = 1\n\tSiteItemOffState  = 0\n)\n\n// Site return a default role model.\nfunc Site() SiteModel {\n\treturn SiteModel{Base: Base{TableName: \"goadmin_site\"}}\n}\n\nfunc (t SiteModel) SetConn(con db.Connection) SiteModel {\n\tt.Conn = con\n\treturn t\n}\n\nfunc (t SiteModel) WithTx(tx *sql.Tx) SiteModel {\n\tt.Tx = tx\n\treturn t\n}\n\nfunc (t SiteModel) Init(cfg map[string]string) SiteModel {\n\titems, err := t.Table(t.TableName).All()\n\tif db.CheckError(err, db.QUERY) {\n\t\tpanic(err)\n\t}\n\titemsCol := collection.Collection(items)\n\tfor key, value := range cfg {\n\t\trow := itemsCol.Where(\"key\", \"=\", key)\n\t\tif row.Length() == 0 {\n\t\t\t_, err := t.Table(t.TableName).Insert(dialect.H{\n\t\t\t\t\"key\":   key,\n\t\t\t\t\"value\": value,\n\t\t\t\t\"state\": SiteItemOpenState,\n\t\t\t})\n\t\t\tif db.CheckError(err, db.INSERT) {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t\t//else {\n\t\t//\tif value != \"\" {\n\t\t//\t\t_, err := t.Table(t.TableName).\n\t\t//\t\t\tWhere(\"key\", \"=\", key).Update(dialect.H{\n\t\t//\t\t\t\"value\": value,\n\t\t//\t\t})\n\t\t//\t\tif db.CheckError(err, db.UPDATE) {\n\t\t//\t\t\tpanic(err)\n\t\t//\t\t}\n\t\t//\t}\n\t\t//}\n\t}\n\treturn t\n}\n\nfunc (t SiteModel) AllToMap() map[string]string {\n\n\tvar m = make(map[string]string)\n\n\titems, err := t.Table(t.TableName).Where(\"state\", \"=\", SiteItemOpenState).All()\n\tif db.CheckError(err, db.QUERY) {\n\t\treturn m\n\t}\n\n\tfor _, item := range items {\n\t\tm[item[\"key\"].(string)] = item[\"value\"].(string)\n\t}\n\n\treturn m\n}\n\nfunc (t SiteModel) AllToMapInterface() map[string]interface{} {\n\n\tvar m = make(map[string]interface{})\n\n\titems, err := t.Table(t.TableName).Where(\"state\", \"=\", SiteItemOpenState).All()\n\tif db.CheckError(err, db.QUERY) {\n\t\treturn m\n\t}\n\n\tfor _, item := range items {\n\t\tm[item[\"key\"].(string)] = item[\"value\"]\n\t}\n\n\tm[\"id\"] = \"1\"\n\n\treturn m\n}\n\nvar allowEmptyKeys = []string{\n\t\"animation_type\", \"custom_head_html\", \"custom_foot_html\", \"custom_404_html\",\n\t\"custom_403_html\", \"custom_500_html\", \"footer_info\", \"bootstrap_file_path\",\n\t\"info_log_path\", \"error_log_path\", \"access_log_path\", \"asset_url\", \"extra\", \"domain\",\n}\n\nfunc (t SiteModel) Update(v form.Values) error {\n\tfor key, vv := range v {\n\t\tif len(vv) > 0 && (vv[0] != \"\" || utils.InArray(allowEmptyKeys, key)) {\n\t\t\t_, err := t.Table(t.TableName).Where(\"key\", \"=\", key).Update(dialect.H{\n\t\t\t\t\"value\": vv[0],\n\t\t\t})\n\t\t\tif db.CheckError(err, db.UPDATE) {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "plugins/admin/models/user.go",
    "content": "package models\n\nimport (\n\t\"database/sql\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n)\n\n// UserModel is user model structure.\ntype UserModel struct {\n\tBase `json:\"-\"`\n\n\tId            int64             `json:\"id\"`\n\tName          string            `json:\"name\"`\n\tUserName      string            `json:\"user_name\"`\n\tPassword      string            `json:\"password\"`\n\tAvatar        string            `json:\"avatar\"`\n\tRememberToken string            `json:\"remember_token\"`\n\tPermissions   []PermissionModel `json:\"permissions\"`\n\tMenuIds       []int64           `json:\"menu_ids\"`\n\tRoles         []RoleModel       `json:\"role\"`\n\tLevel         string            `json:\"level\"`\n\tLevelName     string            `json:\"level_name\"`\n\n\tCreatedAt string `json:\"created_at\"`\n\tUpdatedAt string `json:\"updated_at\"`\n\n\tcacheReplacer *strings.Replacer\n}\n\n// User return a default user model.\nfunc User() UserModel {\n\treturn UserModel{Base: Base{TableName: config.GetAuthUserTable()}}\n}\n\n// UserWithId return a default user model of given id.\nfunc UserWithId(id string) UserModel {\n\tidInt, _ := strconv.Atoi(id)\n\treturn UserModel{Base: Base{TableName: config.GetAuthUserTable()}, Id: int64(idInt)}\n}\n\nfunc (t UserModel) SetConn(con db.Connection) UserModel {\n\tt.Conn = con\n\treturn t\n}\n\nfunc (t UserModel) WithTx(tx *sql.Tx) UserModel {\n\tt.Tx = tx\n\treturn t\n}\n\n// Find return a default user model of given id.\nfunc (t UserModel) Find(id interface{}) UserModel {\n\titem, _ := t.Table(t.TableName).Find(id)\n\treturn t.MapToModel(item)\n}\n\n// FindByUserName return a default user model of given name.\nfunc (t UserModel) FindByUserName(username interface{}) UserModel {\n\titem, _ := t.Table(t.TableName).Where(\"username\", \"=\", username).First()\n\treturn t.MapToModel(item)\n}\n\n// IsEmpty check the user model is empty or not.\nfunc (t UserModel) IsEmpty() bool {\n\treturn t.Id == int64(0)\n}\n\n// HasMenu check the user has visitable menu or not.\nfunc (t UserModel) HasMenu() bool {\n\treturn len(t.MenuIds) != 0 || t.IsSuperAdmin()\n}\n\n// IsSuperAdmin check the user model is super admin or not.\nfunc (t UserModel) IsSuperAdmin() bool {\n\tfor _, per := range t.Permissions {\n\t\tif len(per.HttpPath) > 0 && per.HttpPath[0] == \"*\" && per.HttpMethod[0] == \"\" {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (t UserModel) GetCheckPermissionByUrlMethod(path, method string) string {\n\tif !t.CheckPermissionByUrlMethod(path, method, url.Values{}) {\n\t\treturn \"\"\n\t}\n\treturn path\n}\n\nfunc (t UserModel) IsVisitor() bool {\n\treturn !t.CheckPermissionByUrlMethod(config.Url(\"/info/normal_manager\"), \"GET\", url.Values{})\n}\n\nfunc (t UserModel) HideUserCenterEntrance() bool {\n\treturn t.IsVisitor() && config.GetHideVisitorUserCenterEntrance()\n}\n\nfunc (t UserModel) Template(str string) string {\n\tif t.cacheReplacer == nil {\n\t\tt.cacheReplacer = strings.NewReplacer(\"{{.AuthId}}\", strconv.Itoa(int(t.Id)),\n\t\t\t\"{{.AuthName}}\", t.Name, \"{{.AuthUserName}}\", t.UserName)\n\t}\n\treturn t.cacheReplacer.Replace(str)\n}\n\nfunc (t UserModel) CheckPermissionByUrlMethod(path, method string, formParams url.Values) bool {\n\n\t// path, _ = url.PathUnescape(path)\n\n\tif t.IsSuperAdmin() {\n\t\treturn true\n\t}\n\n\tif path == \"\" {\n\t\treturn false\n\t}\n\n\tlogoutCheck, _ := regexp.Compile(config.Url(\"/logout\") + \"(.*?)\")\n\n\tif logoutCheck.MatchString(path) {\n\t\treturn true\n\t}\n\n\tif path != \"/\" && path[len(path)-1] == '/' {\n\t\tpath = path[:len(path)-1]\n\t}\n\n\tpath = utils.ReplaceAll(path, constant.EditPKKey, \"id\", constant.DetailPKKey, \"id\")\n\n\tpath, params := getParam(path)\n\tfor key, value := range formParams {\n\t\tif len(value) > 0 {\n\t\t\tparams.Add(key, value[0])\n\t\t}\n\t}\n\n\tfor _, v := range t.Permissions {\n\n\t\tif v.HttpMethod[0] == \"\" || inMethodArr(v.HttpMethod, method) {\n\n\t\t\tif v.HttpPath[0] == \"*\" {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tfor i := 0; i < len(v.HttpPath); i++ {\n\n\t\t\t\tmatchPath := config.Url(t.Template(strings.TrimSpace(v.HttpPath[i])))\n\t\t\t\tmatchPath, matchParam := getParam(matchPath)\n\n\t\t\t\tif matchPath == path {\n\t\t\t\t\tif t.checkParam(params, matchParam) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treg, err := regexp.Compile(matchPath)\n\n\t\t\t\tif err != nil {\n\t\t\t\t\tlogger.Error(\"CheckPermissions error: \", err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif reg.FindString(path) == path {\n\t\t\t\t\tif t.checkParam(params, matchParam) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc getParam(u string) (string, url.Values) {\n\tm := make(url.Values)\n\turr := strings.Split(u, \"?\")\n\tif len(urr) > 1 {\n\t\tm, _ = url.ParseQuery(urr[1])\n\t}\n\treturn urr[0], m\n}\n\nfunc (t UserModel) checkParam(src, comp url.Values) bool {\n\tif len(comp) == 0 {\n\t\treturn true\n\t}\n\tif len(src) == 0 {\n\t\treturn false\n\t}\n\tfor key, value := range comp {\n\t\tv, find := src[key]\n\t\tif !find {\n\t\t\treturn false\n\t\t}\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tif len(v) == 0 {\n\t\t\treturn false\n\t\t}\n\t\tfor i := 0; i < len(v); i++ {\n\t\t\tif v[i] == t.Template(value[i]) {\n\t\t\t\tcontinue\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\treturn true\n}\n\nfunc inMethodArr(arr []string, str string) bool {\n\tfor i := 0; i < len(arr); i++ {\n\t\tif strings.EqualFold(arr[i], str) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// UpdateAvatar update the avatar of user.\nfunc (t UserModel) ReleaseConn() UserModel {\n\tt.Conn = nil\n\treturn t\n}\n\n// UpdateAvatar update the avatar of user.\nfunc (t UserModel) UpdateAvatar(avatar string) {\n\tt.Avatar = avatar\n}\n\n// WithRoles query the role info of the user.\nfunc (t UserModel) WithRoles() UserModel {\n\troleModel, _ := t.Table(\"goadmin_role_users\").\n\t\tLeftJoin(\"goadmin_roles\", \"goadmin_roles.id\", \"=\", \"goadmin_role_users.role_id\").\n\t\tWhere(\"user_id\", \"=\", t.Id).\n\t\tSelect(\"goadmin_roles.id\", \"goadmin_roles.name\", \"goadmin_roles.slug\",\n\t\t\t\"goadmin_roles.created_at\", \"goadmin_roles.updated_at\").\n\t\tAll()\n\n\tfor _, role := range roleModel {\n\t\tt.Roles = append(t.Roles, Role().MapToModel(role))\n\t}\n\n\tif len(t.Roles) > 0 {\n\t\tt.Level = t.Roles[0].Slug\n\t\tt.LevelName = t.Roles[0].Name\n\t}\n\n\treturn t\n}\n\nfunc (t UserModel) GetAllRoleId() []interface{} {\n\n\tvar ids = make([]interface{}, len(t.Roles))\n\n\tfor key, role := range t.Roles {\n\t\tids[key] = role.Id\n\t}\n\n\treturn ids\n}\n\n// WithPermissions query the permission info of the user.\nfunc (t UserModel) WithPermissions() UserModel {\n\n\tvar permissions = make([]map[string]interface{}, 0)\n\n\troleIds := t.GetAllRoleId()\n\n\tif len(roleIds) > 0 {\n\t\tpermissions, _ = t.Table(\"goadmin_role_permissions\").\n\t\t\tLeftJoin(\"goadmin_permissions\", \"goadmin_permissions.id\", \"=\", \"goadmin_role_permissions.permission_id\").\n\t\t\tWhereIn(\"role_id\", roleIds).\n\t\t\tSelect(\"goadmin_permissions.http_method\", \"goadmin_permissions.http_path\",\n\t\t\t\t\"goadmin_permissions.id\", \"goadmin_permissions.name\", \"goadmin_permissions.slug\",\n\t\t\t\t\"goadmin_permissions.created_at\", \"goadmin_permissions.updated_at\").\n\t\t\tAll()\n\t}\n\n\tuserPermissions, _ := t.Table(\"goadmin_user_permissions\").\n\t\tLeftJoin(\"goadmin_permissions\", \"goadmin_permissions.id\", \"=\", \"goadmin_user_permissions.permission_id\").\n\t\tWhere(\"user_id\", \"=\", t.Id).\n\t\tSelect(\"goadmin_permissions.http_method\", \"goadmin_permissions.http_path\",\n\t\t\t\"goadmin_permissions.id\", \"goadmin_permissions.name\", \"goadmin_permissions.slug\",\n\t\t\t\"goadmin_permissions.created_at\", \"goadmin_permissions.updated_at\").\n\t\tAll()\n\n\tpermissions = append(permissions, userPermissions...)\n\n\tfor i := 0; i < len(permissions); i++ {\n\t\texist := false\n\t\tfor j := 0; j < len(t.Permissions); j++ {\n\t\t\tif t.Permissions[j].Id == permissions[i][\"id\"] {\n\t\t\t\texist = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif exist {\n\t\t\tcontinue\n\t\t}\n\t\tt.Permissions = append(t.Permissions, Permission().MapToModel(permissions[i]))\n\t}\n\n\treturn t\n}\n\n// WithMenus query the menu info of the user.\nfunc (t UserModel) WithMenus() UserModel {\n\n\tvar menuIdsModel []map[string]interface{}\n\n\tif t.IsSuperAdmin() {\n\t\tmenuIdsModel, _ = t.Table(\"goadmin_role_menu\").\n\t\t\tLeftJoin(\"goadmin_menu\", \"goadmin_menu.id\", \"=\", \"goadmin_role_menu.menu_id\").\n\t\t\tSelect(\"menu_id\", \"parent_id\").\n\t\t\tAll()\n\t} else {\n\t\trolesId := t.GetAllRoleId()\n\t\tif len(rolesId) > 0 {\n\t\t\tmenuIdsModel, _ = t.Table(\"goadmin_role_menu\").\n\t\t\t\tLeftJoin(\"goadmin_menu\", \"goadmin_menu.id\", \"=\", \"goadmin_role_menu.menu_id\").\n\t\t\t\tWhereIn(\"goadmin_role_menu.role_id\", rolesId).\n\t\t\t\tSelect(\"menu_id\", \"parent_id\").\n\t\t\t\tAll()\n\t\t}\n\t}\n\n\tvar menuIds []int64\n\n\tfor _, mid := range menuIdsModel {\n\t\tif parentId, ok := mid[\"parent_id\"].(int64); ok && parentId != 0 {\n\t\t\tfor _, mid2 := range menuIdsModel {\n\t\t\t\tif mid2[\"menu_id\"].(int64) == mid[\"parent_id\"].(int64) {\n\t\t\t\t\tmenuIds = append(menuIds, mid[\"menu_id\"].(int64))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tmenuIds = append(menuIds, mid[\"menu_id\"].(int64))\n\t\t}\n\t}\n\n\tt.MenuIds = menuIds\n\treturn t\n}\n\n// New create a user model.\nfunc (t UserModel) New(username, password, name, avatar string) (UserModel, error) {\n\n\tid, err := t.WithTx(t.Tx).Table(t.TableName).Insert(dialect.H{\n\t\t\"username\": username,\n\t\t\"password\": password,\n\t\t\"name\":     name,\n\t\t\"avatar\":   avatar,\n\t})\n\n\tt.Id = id\n\tt.UserName = username\n\tt.Password = password\n\tt.Avatar = avatar\n\tt.Name = name\n\n\treturn t, err\n}\n\n// Update update the user model.\nfunc (t UserModel) Update(username, password, name, avatar string, isUpdateAvatar bool) (int64, error) {\n\n\tfieldValues := dialect.H{\n\t\t\"username\":   username,\n\t\t\"name\":       name,\n\t\t\"updated_at\": time.Now().Format(\"2006-01-02 15:04:05\"),\n\t}\n\n\tif avatar == \"\" || isUpdateAvatar {\n\t\tfieldValues[\"avatar\"] = avatar\n\t}\n\n\tif password != \"\" {\n\t\tfieldValues[\"password\"] = password\n\t}\n\n\treturn t.WithTx(t.Tx).Table(t.TableName).\n\t\tWhere(\"id\", \"=\", t.Id).\n\t\tUpdate(fieldValues)\n}\n\n// UpdatePwd update the password of the user model.\nfunc (t UserModel) UpdatePwd(password string) UserModel {\n\n\t_, _ = t.Table(t.TableName).\n\t\tWhere(\"id\", \"=\", t.Id).\n\t\tUpdate(dialect.H{\n\t\t\t\"password\": password,\n\t\t})\n\n\tt.Password = password\n\treturn t\n}\n\n// CheckRole check the role of the user model.\nfunc (t UserModel) CheckRoleId(roleId string) bool {\n\tcheckRole, _ := t.Table(\"goadmin_role_users\").\n\t\tWhere(\"role_id\", \"=\", roleId).\n\t\tWhere(\"user_id\", \"=\", t.Id).\n\t\tFirst()\n\treturn checkRole != nil\n}\n\n// DeleteRoles delete all the roles of the user model.\nfunc (t UserModel) DeleteRoles() error {\n\treturn t.Table(\"goadmin_role_users\").\n\t\tWhere(\"user_id\", \"=\", t.Id).\n\t\tDelete()\n}\n\n// AddRole add a role of the user model.\nfunc (t UserModel) AddRole(roleId string) (int64, error) {\n\tif roleId != \"\" {\n\t\tif !t.CheckRoleId(roleId) {\n\t\t\treturn t.WithTx(t.Tx).Table(\"goadmin_role_users\").\n\t\t\t\tInsert(dialect.H{\n\t\t\t\t\t\"role_id\": roleId,\n\t\t\t\t\t\"user_id\": t.Id,\n\t\t\t\t})\n\t\t}\n\t}\n\treturn 0, nil\n}\n\n// CheckRole check the role of the user.\nfunc (t UserModel) CheckRole(slug string) bool {\n\tfor _, role := range t.Roles {\n\t\tif role.Slug == slug {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// CheckPermission check the permission of the user.\nfunc (t UserModel) CheckPermissionById(permissionId string) bool {\n\tcheckPermission, _ := t.Table(\"goadmin_user_permissions\").\n\t\tWhere(\"permission_id\", \"=\", permissionId).\n\t\tWhere(\"user_id\", \"=\", t.Id).\n\t\tFirst()\n\treturn checkPermission != nil\n}\n\n// CheckPermission check the permission of the user.\nfunc (t UserModel) CheckPermission(permission string) bool {\n\tfor _, per := range t.Permissions {\n\t\tif per.Slug == permission {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// DeletePermissions delete all the permissions of the user model.\nfunc (t UserModel) DeletePermissions() error {\n\treturn t.WithTx(t.Tx).Table(\"goadmin_user_permissions\").\n\t\tWhere(\"user_id\", \"=\", t.Id).\n\t\tDelete()\n}\n\n// AddPermission add a permission of the user model.\nfunc (t UserModel) AddPermission(permissionId string) (int64, error) {\n\tif permissionId != \"\" {\n\t\tif !t.CheckPermissionById(permissionId) {\n\t\t\treturn t.WithTx(t.Tx).Table(\"goadmin_user_permissions\").\n\t\t\t\tInsert(dialect.H{\n\t\t\t\t\t\"permission_id\": permissionId,\n\t\t\t\t\t\"user_id\":       t.Id,\n\t\t\t\t})\n\t\t}\n\t}\n\treturn 0, nil\n}\n\n// MapToModel get the user model from given map.\nfunc (t UserModel) MapToModel(m map[string]interface{}) UserModel {\n\tt.Id, _ = m[\"id\"].(int64)\n\tt.Name, _ = m[\"name\"].(string)\n\tt.UserName, _ = m[\"username\"].(string)\n\tt.Password, _ = m[\"password\"].(string)\n\tt.Avatar, _ = m[\"avatar\"].(string)\n\tt.RememberToken, _ = m[\"remember_token\"].(string)\n\tt.CreatedAt, _ = m[\"created_at\"].(string)\n\tt.UpdatedAt, _ = m[\"updated_at\"].(string)\n\treturn t\n}\n"
  },
  {
    "path": "plugins/admin/modules/captcha/captcha.go",
    "content": "package captcha\n\ntype Captcha interface {\n\tValidate(token string) bool\n}\n\nvar List = make(map[string]Captcha)\n\nfunc Add(key string, captcha Captcha) {\n\tif _, exist := List[key]; exist {\n\t\tpanic(\"captcha exist\")\n\t}\n\tList[key] = captcha\n}\n\nfunc Get(key string) (Captcha, bool) {\n\tcaptcha, ok := List[key]\n\treturn captcha, ok\n}\n"
  },
  {
    "path": "plugins/admin/modules/constant/constant.go",
    "content": "package constant\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n)\n\nconst (\n\t// PjaxHeader is default pjax http header key.\n\tPjaxHeader = constant.PjaxHeader\n\n\t// PjaxUrlHeader is default pjax url http header key.\n\tPjaxUrlHeader = constant.PjaxUrlHeader\n\n\tEditPKKey   = \"__goadmin_edit_pk\"\n\tDetailPKKey = \"__goadmin_detail_pk\"\n\tPrefixKey   = \"__prefix\"\n\n\tIframeKey   = \"__goadmin_iframe\"\n\tIframeIDKey = \"__goadmin_iframe_id\"\n\n\tContextNodeNeedAuth = constant.ContextNodeNeedAuth\n)\n"
  },
  {
    "path": "plugins/admin/modules/form/form.go",
    "content": "package form\n\nimport (\n\t\"errors\"\n)\n\nconst (\n\tPostTypeKey           = \"__go_admin_post_type\"\n\tPostResultKey         = \"__go_admin_post_result\"\n\tPostIsSingleUpdateKey = \"__go_admin_is_single_update\"\n\n\tPreviousKey = \"__go_admin_previous_\"\n\tTokenKey    = \"__go_admin_t_\"\n\tMethodKey   = \"__go_admin_method_\"\n\n\tNoAnimationKey = \"__go_admin_no_animation_\"\n)\n\n// Values maps a string key to a list of values.\n// It is typically used for query parameters and form values.\n// Unlike in the http.Header map, the keys in a Values map\n// are case-sensitive.\ntype Values map[string][]string\n\n// Get gets the first value associated with the given key.\n// If there are no values associated with the key, Get returns\n// the empty string. To access multiple values, use the map\n// directly.\nfunc (f Values) Get(key string) string {\n\tif len(f[key]) > 0 {\n\t\treturn f[key][0]\n\t}\n\treturn \"\"\n}\n\n// Add adds the value to key. It appends to any existing\n// values associated with key.\nfunc (f Values) Add(key string, value string) {\n\tf[key] = []string{value}\n}\n\n// IsEmpty check the key is empty or not.\nfunc (f Values) IsEmpty(key ...string) bool {\n\tfor _, k := range key {\n\t\tif f.Get(k) == \"\" {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Has check the key exists or not.\nfunc (f Values) Has(key ...string) bool {\n\tfor _, k := range key {\n\t\tif f.Get(k) != \"\" {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Delete deletes the values associated with key.\nfunc (f Values) Delete(key string) {\n\tdelete(f, key)\n}\n\n// ToMap turn the values to a map[string]string type.\nfunc (f Values) ToMap() map[string]string {\n\tvar m = make(map[string]string)\n\tfor key, v := range f {\n\t\tif len(v) > 0 {\n\t\t\tm[key] = v[0]\n\t\t}\n\t}\n\treturn m\n}\n\n// IsUpdatePost check the param if is from an update post request type or not.\nfunc (f Values) IsUpdatePost() bool {\n\treturn f.Get(PostTypeKey) == \"0\"\n}\n\n// IsInsertPost check the param if is from an insert post request type or not.\nfunc (f Values) IsInsertPost() bool {\n\treturn f.Get(PostTypeKey) == \"1\"\n}\n\n// PostError get the post result.\nfunc (f Values) PostError() error {\n\tmsg := f.Get(PostResultKey)\n\tif msg == \"\" {\n\t\treturn nil\n\t}\n\treturn errors.New(msg)\n}\n\n// IsSingleUpdatePost check the param if from an single update post request type or not.\nfunc (f Values) IsSingleUpdatePost() bool {\n\treturn f.Get(PostIsSingleUpdateKey) == \"1\"\n}\n\n// RemoveRemark removes the PostType and IsSingleUpdate flag parameters.\nfunc (f Values) RemoveRemark() Values {\n\tf.Delete(PostTypeKey)\n\tf.Delete(PostIsSingleUpdateKey)\n\treturn f\n}\n\n// RemoveSysRemark removes all framework post flag parameters.\nfunc (f Values) RemoveSysRemark() Values {\n\tf.Delete(PostTypeKey)\n\tf.Delete(PostIsSingleUpdateKey)\n\tf.Delete(PostResultKey)\n\tf.Delete(PreviousKey)\n\tf.Delete(TokenKey)\n\tf.Delete(MethodKey)\n\tf.Delete(NoAnimationKey)\n\treturn f\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/delete.go",
    "content": "package guard\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n)\n\ntype DeleteParam struct {\n\tPanel  table.Table\n\tId     string\n\tPrefix string\n}\n\nfunc (g *Guard) Delete(ctx *context.Context) {\n\tpanel, prefix := g.table(ctx)\n\tif !panel.GetDeletable() {\n\t\talert(ctx, panel, errors.OperationNotAllow, g.conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tid := ctx.FormValue(\"id\")\n\tif id == \"\" {\n\t\talert(ctx, panel, errors.WrongID, g.conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tctx.SetUserValue(deleteParamKey, &DeleteParam{\n\t\tPanel:  panel,\n\t\tId:     id,\n\t\tPrefix: prefix,\n\t})\n\tctx.Next()\n}\n\nfunc GetDeleteParam(ctx *context.Context) *DeleteParam {\n\treturn ctx.UserValue[deleteParamKey].(*DeleteParam)\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/edit.go",
    "content": "package guard\n\nimport (\n\ttmpl \"html/template\"\n\t\"mime/multipart\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n)\n\ntype ShowFormParam struct {\n\tPanel  table.Table\n\tId     string\n\tPrefix string\n\tParam  parameter.Parameters\n}\n\nfunc (g *Guard) ShowForm(ctx *context.Context) {\n\n\tpanel, prefix := g.table(ctx)\n\n\tif !panel.GetEditable() {\n\t\talert(ctx, panel, errors.OperationNotAllow, g.conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tif panel.GetOnlyInfo() {\n\t\tctx.Redirect(config.Url(\"/info/\" + prefix))\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tif panel.GetOnlyDetail() {\n\t\tctx.Redirect(config.Url(\"/info/\" + prefix + \"/detail\"))\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tif panel.GetOnlyNewForm() {\n\t\tctx.Redirect(config.Url(\"/info/\" + prefix + \"/new\"))\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tid := ctx.Query(constant.EditPKKey)\n\n\tif id == \"\" {\n\t\tid = \"1\"\n\t}\n\n\tctx.SetUserValue(showFormParamKey, &ShowFormParam{\n\t\tPanel:  panel,\n\t\tId:     id,\n\t\tPrefix: prefix,\n\t\tParam: parameter.GetParam(ctx.Request.URL, panel.GetInfo().DefaultPageSize, panel.GetInfo().SortField,\n\t\t\tpanel.GetInfo().GetSort()).WithPKs(id),\n\t})\n\tctx.Next()\n}\n\nfunc GetShowFormParam(ctx *context.Context) *ShowFormParam {\n\treturn ctx.UserValue[showFormParamKey].(*ShowFormParam)\n}\n\ntype EditFormParam struct {\n\tPanel        table.Table\n\tId           string\n\tPrefix       string\n\tParam        parameter.Parameters\n\tPath         string\n\tMultiForm    *multipart.Form\n\tPreviousPath string\n\tAlert        tmpl.HTML\n\tFromList     bool\n\tIsIframe     bool\n\tIframeID     string\n}\n\nfunc (e EditFormParam) Value() form.Values {\n\treturn e.MultiForm.Value\n}\n\nfunc (g *Guard) EditForm(ctx *context.Context) {\n\n\tpanel, prefix := g.table(ctx)\n\n\tif !panel.GetEditable() {\n\t\talert(ctx, panel, errors.OperationNotAllow, g.conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\ttoken := ctx.FormValue(form.TokenKey)\n\n\tif !auth.GetTokenService(g.services.Get(auth.TokenServiceKey)).CheckToken(token) {\n\t\talert(ctx, panel, errors.EditFailWrongToken, g.conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tvar (\n\t\tprevious = ctx.FormValue(form.PreviousKey)\n\t\tfromList = isInfoUrl(previous)\n\t\tparam    = parameter.GetParamFromURL(previous, panel.GetInfo().DefaultPageSize,\n\t\t\tpanel.GetInfo().GetSort(), panel.GetPrimaryKey().Name)\n\t)\n\n\tif fromList {\n\t\tprevious = config.Url(\"/info/\" + prefix + param.GetRouteParamStr())\n\t}\n\n\tvar (\n\t\tmultiForm = ctx.Request.MultipartForm\n\t\tid        = multiForm.Value[panel.GetPrimaryKey().Name][0]\n\t\tvalues    = ctx.Request.MultipartForm.Value\n\t)\n\n\tctx.SetUserValue(editFormParamKey, &EditFormParam{\n\t\tPanel:        panel,\n\t\tId:           id,\n\t\tPrefix:       prefix,\n\t\tParam:        param.WithPKs(id),\n\t\tPath:         strings.Split(previous, \"?\")[0],\n\t\tMultiForm:    multiForm,\n\t\tIsIframe:     form.Values(values).Get(constant.IframeKey) == \"true\",\n\t\tIframeID:     form.Values(values).Get(constant.IframeIDKey),\n\t\tPreviousPath: previous,\n\t\tFromList:     fromList,\n\t})\n\tctx.Next()\n}\n\nfunc isInfoUrl(s string) bool {\n\treg, _ := regexp.Compile(\"(.*?)info/(.*?)$\")\n\tsub := reg.FindStringSubmatch(s)\n\treturn len(sub) > 2 && !strings.Contains(sub[2], \"/\")\n}\n\nfunc GetEditFormParam(ctx *context.Context) *EditFormParam {\n\treturn ctx.UserValue[editFormParamKey].(*EditFormParam)\n}\n\nfunc alert(ctx *context.Context, panel table.Table, msg string, conn db.Connection, btns *types.Buttons) {\n\tif ctx.WantJSON() {\n\t\tresponse.BadRequest(ctx, msg)\n\t} else {\n\t\tresponse.Alert(ctx, panel.GetInfo().Description, panel.GetInfo().Title, msg, conn, btns)\n\t}\n}\n\nfunc alertWithTitleAndDesc(ctx *context.Context, title, desc, msg string, conn db.Connection, btns *types.Buttons) {\n\tresponse.Alert(ctx, desc, title, msg, conn, btns)\n}\n\nfunc getAlert(ctx *context.Context, msg string) tmpl.HTML {\n\treturn template.Get(ctx, config.GetTheme()).Alert().Warning(msg)\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/export.go",
    "content": "package guard\n\nimport (\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n)\n\ntype ExportParam struct {\n\tPanel  table.Table\n\tId     []string\n\tPrefix string\n\tIsAll  bool\n}\n\nfunc (g *Guard) Export(ctx *context.Context) {\n\tpanel, prefix := g.table(ctx)\n\tif !panel.GetExportable() {\n\t\talert(ctx, panel, errors.OperationNotAllow, g.conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tidStr := make([]string, 0)\n\tids := ctx.FormValue(\"id\")\n\tif ids != \"\" {\n\t\tidStr = strings.Split(ctx.FormValue(\"id\"), \",\")\n\t}\n\n\tctx.SetUserValue(exportParamKey, &ExportParam{\n\t\tPanel:  panel,\n\t\tId:     idStr,\n\t\tPrefix: prefix,\n\t\tIsAll:  ctx.FormValue(\"is_all\") == \"true\",\n\t})\n\tctx.Next()\n}\n\nfunc GetExportParam(ctx *context.Context) *ExportParam {\n\treturn ctx.UserValue[exportParamKey].(*ExportParam)\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/guard.go",
    "content": "package guard\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Guard struct {\n\tservices  service.List\n\tconn      db.Connection\n\ttableList table.GeneratorList\n\tnavBtns   *types.Buttons\n}\n\nfunc New(s service.List, c db.Connection, t table.GeneratorList, b *types.Buttons) *Guard {\n\treturn &Guard{\n\t\tservices:  s,\n\t\tconn:      c,\n\t\ttableList: t,\n\t\tnavBtns:   b,\n\t}\n}\n\nfunc (g *Guard) table(ctx *context.Context) (table.Table, string) {\n\tprefix := ctx.Query(constant.PrefixKey)\n\treturn g.tableList[prefix](ctx), prefix\n}\n\nfunc (g *Guard) CheckPrefix(ctx *context.Context) {\n\n\tprefix := ctx.Query(constant.PrefixKey)\n\n\tif _, ok := g.tableList[prefix]; !ok {\n\t\tif ctx.Headers(constant.PjaxHeader) == \"\" && ctx.Method() != \"GET\" {\n\t\t\tresponse.BadRequest(ctx, errors.Msg)\n\t\t} else {\n\t\t\tresponse.Alert(ctx, errors.Msg, errors.Msg, \"table model not found\", g.conn, g.navBtns,\n\t\t\t\ttemplate.Missing404Page)\n\t\t}\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tctx.Next()\n}\n\nconst (\n\teditFormParamKey    = \"edit_form_param\"\n\tdeleteParamKey      = \"delete_param\"\n\texportParamKey      = \"export_param\"\n\tserverLoginParamKey = \"server_login_param\"\n\tdeleteMenuParamKey  = \"delete_menu_param\"\n\teditMenuParamKey    = \"edit_menu_param\"\n\tnewMenuParamKey     = \"new_menu_param\"\n\tnewFormParamKey     = \"new_form_param\"\n\tupdateParamKey      = \"update_param\"\n\tshowFormParamKey    = \"show_form_param\"\n\tshowNewFormParam    = \"show_new_form_param\"\n)\n"
  },
  {
    "path": "plugins/admin/modules/guard/menu_delete.go",
    "content": "package guard\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n)\n\ntype MenuDeleteParam struct {\n\tId string\n}\n\nfunc (g *Guard) MenuDelete(ctx *context.Context) {\n\n\tid := ctx.Query(\"id\")\n\n\tif id == \"\" {\n\t\talertWithTitleAndDesc(ctx, \"Menu\", \"menu\", errors.WrongID, g.conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\t// TODO: check the user permission\n\n\tctx.SetUserValue(deleteMenuParamKey, &MenuDeleteParam{\n\t\tId: id,\n\t})\n\tctx.Next()\n}\n\nfunc GetMenuDeleteParam(ctx *context.Context) *MenuDeleteParam {\n\treturn ctx.UserValue[deleteMenuParamKey].(*MenuDeleteParam)\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/menu_edit.go",
    "content": "package guard\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n)\n\ntype MenuEditParam struct {\n\tId         string\n\tTitle      string\n\tHeader     string\n\tPluginName string\n\tParentId   int64\n\tIcon       string\n\tUri        string\n\tRoles      []string\n\tAlert      template.HTML\n}\n\nfunc (e MenuEditParam) HasAlert() bool {\n\treturn e.Alert != template.HTML(\"\")\n}\n\nfunc (g *Guard) MenuEdit(ctx *context.Context) {\n\n\tparentId := ctx.FormValue(\"parent_id\")\n\tif parentId == \"\" {\n\t\tparentId = \"0\"\n\t}\n\n\tvar (\n\t\tparentIdInt, _ = strconv.Atoi(parentId)\n\t\ttoken          = ctx.FormValue(form.TokenKey)\n\t\talert          template.HTML\n\t)\n\n\tif !auth.GetTokenService(g.services.Get(auth.TokenServiceKey)).CheckToken(token) {\n\t\talert = getAlert(ctx, errors.EditFailWrongToken)\n\t}\n\n\tif alert == \"\" {\n\t\talert = checkEmpty(ctx, \"id\", \"title\", \"icon\")\n\t}\n\n\tctx.SetUserValue(editMenuParamKey, &MenuEditParam{\n\t\tId:         ctx.FormValue(\"id\"),\n\t\tTitle:      ctx.FormValue(\"title\"),\n\t\tHeader:     ctx.FormValue(\"header\"),\n\t\tPluginName: ctx.FormValue(\"plugin_name\"),\n\t\tParentId:   int64(parentIdInt),\n\t\tIcon:       ctx.FormValue(\"icon\"),\n\t\tUri:        ctx.FormValue(\"uri\"),\n\t\tRoles:      ctx.Request.Form[\"roles[]\"],\n\t\tAlert:      alert,\n\t})\n\tctx.Next()\n}\n\nfunc GetMenuEditParam(ctx *context.Context) *MenuEditParam {\n\treturn ctx.UserValue[editMenuParamKey].(*MenuEditParam)\n}\n\nfunc checkEmpty(ctx *context.Context, key ...string) template.HTML {\n\tfor _, k := range key {\n\t\tif ctx.FormValue(k) == \"\" {\n\t\t\treturn getAlert(ctx, \"wrong \"+k)\n\t\t}\n\t}\n\treturn template.HTML(\"\")\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/menu_new.go",
    "content": "package guard\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n)\n\ntype MenuNewParam struct {\n\tTitle      string\n\tHeader     string\n\tParentId   int64\n\tIcon       string\n\tPluginName string\n\tUri        string\n\tRoles      []string\n\tAlert      template.HTML\n}\n\nfunc (e MenuNewParam) HasAlert() bool {\n\treturn e.Alert != template.HTML(\"\")\n}\n\nfunc (g *Guard) MenuNew(ctx *context.Context) {\n\n\tparentId := ctx.FormValue(\"parent_id\")\n\tif parentId == \"\" {\n\t\tparentId = \"0\"\n\t}\n\n\tvar (\n\t\talert template.HTML\n\t\ttoken = ctx.FormValue(form.TokenKey)\n\t)\n\n\tif !auth.GetTokenService(g.services.Get(auth.TokenServiceKey)).CheckToken(token) {\n\t\talert = getAlert(ctx, errors.EditFailWrongToken)\n\t}\n\n\tif alert == \"\" {\n\t\talert = checkEmpty(ctx, \"title\", \"icon\")\n\t}\n\n\tparentIdInt, _ := strconv.Atoi(parentId)\n\n\tctx.SetUserValue(newMenuParamKey, &MenuNewParam{\n\t\tTitle:      ctx.FormValue(\"title\"),\n\t\tHeader:     ctx.FormValue(\"header\"),\n\t\tPluginName: ctx.FormValue(\"plugin_name\"),\n\t\tParentId:   int64(parentIdInt),\n\t\tIcon:       ctx.FormValue(\"icon\"),\n\t\tUri:        ctx.FormValue(\"uri\"),\n\t\tRoles:      ctx.Request.Form[\"roles[]\"],\n\t\tAlert:      alert,\n\t})\n\tctx.Next()\n}\n\nfunc GetMenuNewParam(ctx *context.Context) *MenuNewParam {\n\treturn ctx.UserValue[newMenuParamKey].(*MenuNewParam)\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/new.go",
    "content": "package guard\n\nimport (\n\t\"html/template\"\n\t\"mime/multipart\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n)\n\ntype ShowNewFormParam struct {\n\tPanel  table.Table\n\tPrefix string\n\tParam  parameter.Parameters\n}\n\nfunc (g *Guard) ShowNewForm(ctx *context.Context) {\n\n\tpanel, prefix := g.table(ctx)\n\n\tif !panel.GetCanAdd() {\n\t\talert(ctx, panel, errors.OperationNotAllow, g.conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tif panel.GetOnlyInfo() {\n\t\tctx.Redirect(config.Url(\"/info/\" + prefix))\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tif panel.GetOnlyDetail() {\n\t\tctx.Redirect(config.Url(\"/info/\" + prefix + \"/detail\"))\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tif panel.GetOnlyUpdateForm() {\n\t\tctx.Redirect(config.Url(\"/info/\" + prefix + \"/edit\"))\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tctx.SetUserValue(showNewFormParam, &ShowNewFormParam{\n\t\tPanel:  panel,\n\t\tPrefix: prefix,\n\t\tParam: parameter.GetParam(ctx.Request.URL, panel.GetInfo().DefaultPageSize, panel.GetInfo().SortField,\n\t\t\tpanel.GetInfo().GetSort()),\n\t})\n\tctx.Next()\n}\n\nfunc GetShowNewFormParam(ctx *context.Context) *ShowNewFormParam {\n\treturn ctx.UserValue[showNewFormParam].(*ShowNewFormParam)\n}\n\ntype NewFormParam struct {\n\tPanel        table.Table\n\tId           string\n\tPrefix       string\n\tParam        parameter.Parameters\n\tPath         string\n\tMultiForm    *multipart.Form\n\tPreviousPath string\n\tFromList     bool\n\tIsIframe     bool\n\tIframeID     string\n\tAlert        template.HTML\n}\n\nfunc (e NewFormParam) Value() form.Values {\n\treturn e.MultiForm.Value\n}\n\nfunc (g *Guard) NewForm(ctx *context.Context) {\n\n\tvar (\n\t\tprevious      = ctx.FormValue(form.PreviousKey)\n\t\tpanel, prefix = g.table(ctx)\n\t\tconn          = db.GetConnection(g.services)\n\t\ttoken         = ctx.FormValue(form.TokenKey)\n\t)\n\n\tif !auth.GetTokenService(g.services.Get(auth.TokenServiceKey)).CheckToken(token) {\n\t\talert(ctx, panel, errors.CreateFailWrongToken, conn, g.navBtns)\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tfromList := isInfoUrl(previous)\n\tparam := parameter.GetParamFromURL(previous, panel.GetInfo().DefaultPageSize,\n\t\tpanel.GetInfo().GetSort(), panel.GetPrimaryKey().Name)\n\n\tif fromList {\n\t\tprevious = config.Url(\"/info/\" + prefix + param.GetRouteParamStr())\n\t}\n\n\tvalues := ctx.Request.MultipartForm.Value\n\n\tctx.SetUserValue(newFormParamKey, &NewFormParam{\n\t\tPanel:        panel,\n\t\tId:           \"\",\n\t\tPrefix:       prefix,\n\t\tParam:        param,\n\t\tIsIframe:     form.Values(values).Get(constant.IframeKey) == \"true\",\n\t\tIframeID:     form.Values(values).Get(constant.IframeIDKey),\n\t\tPath:         strings.Split(previous, \"?\")[0],\n\t\tMultiForm:    ctx.Request.MultipartForm,\n\t\tPreviousPath: previous,\n\t\tFromList:     fromList,\n\t})\n\tctx.Next()\n}\n\nfunc GetNewFormParam(ctx *context.Context) *NewFormParam {\n\treturn ctx.UserValue[newFormParamKey].(*NewFormParam)\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/server_login.go",
    "content": "package guard\n\nimport (\n\t\"encoding/json\"\n\t\"io/ioutil\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n)\n\ntype ServerLoginParam struct {\n\tAccount  string\n\tPassword string\n}\n\nfunc (g *Guard) ServerLogin(ctx *context.Context) {\n\n\tvar p ServerLoginParam\n\n\tbody, err := ioutil.ReadAll(ctx.Request.Body)\n\n\tif err != nil {\n\t\tlogger.Error(\"get server login parameter error: \", err)\n\t}\n\n\terr = json.Unmarshal(body, &p)\n\n\tif err != nil {\n\t\tlogger.Error(\"unmarshal server login parameter error: \", err)\n\t}\n\n\tctx.SetUserValue(serverLoginParamKey, &p)\n\tctx.Next()\n}\n\nfunc GetServerLoginParam(ctx *context.Context) *ServerLoginParam {\n\treturn ctx.UserValue[serverLoginParamKey].(*ServerLoginParam)\n}\n"
  },
  {
    "path": "plugins/admin/modules/guard/update.go",
    "content": "package guard\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n)\n\ntype UpdateParam struct {\n\tPanel  table.Table\n\tPrefix string\n\tValue  form.Values\n}\n\nfunc (g *Guard) Update(ctx *context.Context) {\n\tpanel, prefix := g.table(ctx)\n\n\tpname := panel.GetPrimaryKey().Name\n\n\tid := ctx.FormValue(\"pk\")\n\n\tif id == \"\" {\n\t\tctx.JSON(http.StatusBadRequest, map[string]interface{}{\n\t\t\t\"msg\": \"wrong \" + pname,\n\t\t})\n\t\tctx.Abort()\n\t\treturn\n\t}\n\n\tvar f = make(form.Values)\n\tf.Add(form.PostIsSingleUpdateKey, \"1\")\n\tf.Add(pname, id)\n\tf.Add(ctx.FormValue(\"name\"), ctx.FormValue(\"value\"))\n\n\tctx.SetUserValue(updateParamKey, &UpdateParam{\n\t\tPanel:  panel,\n\t\tPrefix: prefix,\n\t\tValue:  f,\n\t})\n\tctx.Next()\n}\n\nfunc GetUpdateParam(ctx *context.Context) *UpdateParam {\n\treturn ctx.UserValue[updateParamKey].(*UpdateParam)\n}\n"
  },
  {
    "path": "plugins/admin/modules/helper.go",
    "content": "package modules\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/google/uuid\"\n)\n\nfunc InArray(arr []string, str string) bool {\n\tfor _, v := range arr {\n\t\tif v == str {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc Delimiter(del, del2, s string) string {\n\treturn del + s + del2\n}\n\nfunc FilterField(filed, delimiter, delimiter2 string) string {\n\treturn delimiter + filed + delimiter2\n}\n\nfunc InArrayWithoutEmpty(arr []string, str string) bool {\n\tif len(arr) == 0 {\n\t\treturn true\n\t}\n\tfor _, v := range arr {\n\t\tif v == str {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc RemoveBlankFromArray(s []string) []string {\n\tvar r []string\n\tfor _, str := range s {\n\t\tif str != \"\" {\n\t\t\tr = append(r, str)\n\t\t}\n\t}\n\treturn r\n}\n\nfunc Uuid() string {\n\treturn uuid.New().String()\n}\n\nfunc SetDefault(source, def string) string {\n\tif source == \"\" {\n\t\treturn def\n\t}\n\treturn source\n}\n\nfunc GetPage(page string) (pageInt int) {\n\tif page == \"\" {\n\t\tpageInt = 1\n\t} else {\n\t\tpageInt, _ = strconv.Atoi(page)\n\t}\n\treturn\n}\n\nfunc AorB(condition bool, a, b string) string {\n\tif condition {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc AorEmpty(condition bool, a string) string {\n\tif condition {\n\t\treturn a\n\t}\n\treturn \"\"\n}\n\nfunc AorBHTML(condition bool, a, b template.HTML) template.HTML {\n\tif condition {\n\t\treturn a\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "plugins/admin/modules/helper_test.go",
    "content": "package modules\n\nimport (\n\t\"regexp\"\n\t\"testing\"\n\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc TestInArray(t *testing.T) {\n\tassert.Equal(t, isFormURL(\"/admin/info/profile/new\"), true)\n}\n\nfunc isFormURL(s string) bool {\n\treg, _ := regexp.Compile(\"(.*?)info/(.*)/(new|edit)(.*?)\")\n\treturn reg.MatchString(s)\n}\n"
  },
  {
    "path": "plugins/admin/modules/paginator/paginator.go",
    "content": "package paginator\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"math\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/components\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Config struct {\n\tSize         int\n\tParam        parameter.Parameters\n\tPageSizeList []string\n}\n\nfunc Get(ctx *context.Context, cfg Config) types.PaginatorAttribute {\n\n\tpaginator := template2.Default(ctx).Paginator().(*components.PaginatorAttribute)\n\n\ttotalPage := int(math.Ceil(float64(cfg.Size) / float64(cfg.Param.PageSizeInt)))\n\n\tif cfg.Param.PageInt == 1 {\n\t\tpaginator.PreviousClass = \"disabled\"\n\t\tpaginator.PreviousUrl = cfg.Param.URLPath\n\t} else {\n\t\tpaginator.PreviousClass = \"\"\n\t\tpaginator.PreviousUrl = cfg.Param.URLPath + cfg.Param.GetLastPageRouteParamStr(true)\n\t}\n\n\tif cfg.Param.PageInt == totalPage {\n\t\tpaginator.NextClass = \"disabled\"\n\t\tpaginator.NextUrl = cfg.Param.URLPath\n\t} else {\n\t\tpaginator.NextClass = \"\"\n\t\tpaginator.NextUrl = cfg.Param.URLPath + cfg.Param.GetNextPageRouteParamStr(true)\n\t}\n\tpaginator.Url = cfg.Param.URLPath + cfg.Param.GetRouteParamStrWithoutPageSize(\"1\") + \"&\" + form.NoAnimationKey + \"=true\"\n\tpaginator.CurPageEndIndex = strconv.Itoa((cfg.Param.PageInt) * cfg.Param.PageSizeInt)\n\tpaginator.CurPageStartIndex = strconv.Itoa((cfg.Param.PageInt-1)*cfg.Param.PageSizeInt + 1)\n\tpaginator.Total = strconv.Itoa(cfg.Size)\n\n\tif len(cfg.PageSizeList) == 0 {\n\t\tcfg.PageSizeList = []string{\"10\", \"20\", \"50\", \"100\"}\n\t}\n\n\tpaginator.Option = make(map[string]template.HTML, len(cfg.PageSizeList))\n\tfor i := 0; i < len(cfg.PageSizeList); i++ {\n\t\tpaginator.Option[cfg.PageSizeList[i]] = template.HTML(\"\")\n\t}\n\n\tpaginator.Option[cfg.Param.PageSize] = template.HTML(\"selected\")\n\n\tpaginator.Pages = []map[string]string{}\n\n\tvar pagesArr []map[string]string\n\n\tif totalPage < 10 {\n\t\tfor i := 1; i < totalPage+1; i++ {\n\t\t\tif i == cfg.Param.PageInt {\n\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, cfg.Param.PageInt, \"active\")\n\t\t\t} else {\n\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, i, \"\")\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif cfg.Param.PageInt < 6 {\n\t\t\tfor i := 1; i < totalPage+1; i++ {\n\n\t\t\t\tif i == cfg.Param.PageInt {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, cfg.Param.PageInt, \"active\")\n\t\t\t\t} else {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, i, \"\")\n\t\t\t\t}\n\n\t\t\t\tif i == 6 {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, i, \"split\")\n\t\t\t\t\ti = totalPage - 2\n\t\t\t\t}\n\t\t\t}\n\t\t} else if cfg.Param.PageInt < totalPage-4 {\n\t\t\tfor i := 1; i < totalPage+1; i++ {\n\n\t\t\t\tif i == cfg.Param.PageInt {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, cfg.Param.PageInt, \"active\")\n\t\t\t\t} else {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, i, \"\")\n\t\t\t\t}\n\n\t\t\t\tif i == 2 {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, i, \"split\")\n\t\t\t\t\ti = cfg.Param.PageInt - 3\n\t\t\t\t}\n\n\t\t\t\tif i == cfg.Param.PageInt+2 {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, i, \"split\")\n\t\t\t\t\ti = totalPage - 1\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor i := 1; i < totalPage+1; i++ {\n\n\t\t\t\tif i == cfg.Param.PageInt {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, cfg.Param.PageInt, \"active\")\n\t\t\t\t} else {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, i, \"\")\n\t\t\t\t}\n\n\t\t\t\tif i == 2 {\n\t\t\t\t\tpagesArr = addPageLink(pagesArr, cfg.Param, i, \"split\")\n\t\t\t\t\ti = totalPage - 6\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpaginator.Pages = pagesArr\n\n\tendNum := paginator.CurPageEndIndex\n\tif cfg.Size < cfg.Param.PageSizeInt {\n\t\tendNum = paginator.Total\n\t}\n\n\tif cfg.Param.PageInt >= (cfg.Size+cfg.Param.PageSizeInt-1)/cfg.Param.PageSizeInt {\n\t\tendNum = paginator.Total\n\t}\n\n\tpaginator.SetEntriesInfo(template.HTML(fmt.Sprintf(language.Get(\"showing <b>%s</b> to <b>%s</b> of <b>%s</b> entries\"),\n\t\tpaginator.CurPageStartIndex, endNum, paginator.Total)))\n\n\treturn paginator.SetPageSizeList(cfg.PageSizeList)\n}\n\nfunc addPageLink(arr []map[string]string, params parameter.Parameters, page int, active string) []map[string]string {\n\n\tpageStr := strconv.Itoa(page)\n\tisSplit := \"0\"\n\n\tif active == \"split\" {\n\t\tisSplit = \"1\"\n\t\tactive = \"\"\n\t\tpageStr = \"\"\n\t}\n\n\treturn append(arr, map[string]string{\n\t\t\"page\":    pageStr,\n\t\t\"active\":  active,\n\t\t\"isSplit\": isSplit,\n\t\t\"url\":     params.URLNoAnimation(pageStr),\n\t})\n}\n"
  },
  {
    "path": "plugins/admin/modules/paginator/paginator_test.go",
    "content": "package paginator\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t_ \"github.com/GoAdminGroup/themes/sword\"\n)\n\nfunc TestGet(t *testing.T) {\n\tconfig.Initialize(&config.Config{Theme: \"sword\"})\n\tparam := parameter.BaseParam()\n\tparam.Page = \"7\"\n\tGet(nil, Config{\n\t\tSize:         105,\n\t\tParam:        param,\n\t\tPageSizeList: []string{\"10\", \"20\", \"50\", \"100\"},\n\t})\n}\n"
  },
  {
    "path": "plugins/admin/modules/parameter/parameter.go",
    "content": "package parameter\n\nimport (\n\t\"net/url\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n)\n\ntype Parameters struct {\n\tPage         string\n\tPageInt      int\n\tPageSize     string\n\tPageSizeInt  int\n\tSortField    string\n\tColumns      []string\n\tSortType     string\n\tAnimation    bool\n\tURLPath      string\n\tFields       map[string][]string\n\tOrConditions map[string]string\n\n\tcacheFixedStr url.Values\n}\n\nconst (\n\tPage     = \"__page\"\n\tPageSize = \"__pageSize\"\n\tSort     = \"__sort\"\n\tSortType = \"__sort_type\"\n\tColumns  = \"__columns\"\n\tPrefix   = \"__prefix\"\n\tPjax     = \"_pjax\"\n\n\tsortTypeDesc = \"desc\"\n\tsortTypeAsc  = \"asc\"\n\n\tIsAll      = \"__is_all\"\n\tPrimaryKey = \"__pk\"\n\n\tTrue  = \"true\"\n\tFalse = \"false\"\n\n\tFilterRangeParamStartSuffix = \"_start__goadmin\"\n\tFilterRangeParamEndSuffix   = \"_end__goadmin\"\n\tFilterParamJoinInfix        = \"_goadmin_join_\"\n\tFilterParamOperatorSuffix   = \"__goadmin_operator__\"\n\tFilterParamCountInfix       = \"__goadmin_index__\"\n\n\tSeparator = \"__goadmin_separator__\"\n)\n\nvar operators = map[string]string{\n\t\"like\": \"like\",\n\t\"gr\":   \">\",\n\t\"gq\":   \">=\",\n\t\"eq\":   \"=\",\n\t\"ne\":   \"!=\",\n\t\"le\":   \"<\",\n\t\"lq\":   \"<=\",\n\t\"free\": \"free\",\n}\n\nvar keys = []string{Page, PageSize, Sort, Columns, Prefix, Pjax, form.NoAnimationKey}\n\nfunc BaseParam() Parameters {\n\treturn Parameters{Page: \"1\", PageSize: \"10\", PageInt: 1, PageSizeInt: 10, Fields: make(map[string][]string)}\n}\n\nfunc GetParam(u *url.URL, defaultPageSize int, p ...string) Parameters {\n\tvalues := u.Query()\n\n\tprimaryKey := \"id\"\n\tdefaultSortType := \"desc\"\n\n\tif len(p) > 0 {\n\t\tprimaryKey = p[0]\n\t\tdefaultSortType = p[1]\n\t}\n\n\tpage := getDefault(values, Page, \"1\")\n\tpageSize := getDefault(values, PageSize, strconv.Itoa(defaultPageSize))\n\tsortField := getDefault(values, Sort, primaryKey)\n\tsortType := getDefault(values, SortType, defaultSortType)\n\tcolumns := getDefault(values, Columns, \"\")\n\n\tanimation := true\n\tif values.Get(form.NoAnimationKey) == \"true\" {\n\t\tanimation = false\n\t}\n\n\tfields := make(map[string][]string)\n\n\tfor key, value := range values {\n\t\tif !modules.InArray(keys, key) && len(value) > 0 && value[0] != \"\" {\n\t\t\tif key == SortType {\n\t\t\t\tif value[0] != sortTypeDesc && value[0] != sortTypeAsc {\n\t\t\t\t\tfields[key] = []string{sortTypeDesc}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif strings.Contains(key, FilterParamOperatorSuffix) &&\n\t\t\t\t\tvalues.Get(strings.ReplaceAll(key, FilterParamOperatorSuffix, \"\")) == \"\" {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfields[strings.ReplaceAll(key, \"[]\", \"\")] = value\n\t\t\t}\n\t\t}\n\t}\n\n\tcolumnsArr := make([]string, 0)\n\tif columns != \"\" {\n\t\tcolumns, _ = url.QueryUnescape(columns)\n\t\tcolumnsArr = strings.Split(columns, \",\")\n\t}\n\n\tpageInt, _ := strconv.Atoi(page)\n\tpageSizeInt, _ := strconv.Atoi(pageSize)\n\n\treturn Parameters{\n\t\tPage:         page,\n\t\tPageSize:     pageSize,\n\t\tPageSizeInt:  pageSizeInt,\n\t\tPageInt:      pageInt,\n\t\tURLPath:      u.Path,\n\t\tSortField:    sortField,\n\t\tSortType:     sortType,\n\t\tFields:       fields,\n\t\tOrConditions: map[string]string{},\n\t\tAnimation:    animation,\n\t\tColumns:      columnsArr,\n\t}\n}\n\nfunc GetParamFromURL(urlStr string, defaultPageSize int, defaultSortType, primaryKey string) Parameters {\n\n\tu, err := url.Parse(urlStr)\n\n\tif err != nil {\n\t\treturn BaseParam()\n\t}\n\n\treturn GetParam(u, defaultPageSize, primaryKey, defaultSortType)\n}\n\nfunc (param Parameters) WithPKs(id ...string) Parameters {\n\tparam.Fields[PrimaryKey] = []string{strings.Join(id, \",\")}\n\treturn param\n}\n\nfunc (param Parameters) PKs() []string {\n\tpk := param.GetFieldValue(PrimaryKey)\n\tif pk == \"\" {\n\t\treturn []string{}\n\t}\n\treturn strings.Split(param.GetFieldValue(PrimaryKey), \",\")\n}\n\nfunc (param Parameters) DeletePK() Parameters {\n\tdelete(param.Fields, PrimaryKey)\n\treturn param\n}\n\nfunc (param Parameters) PK() string {\n\tpks := param.PKs()\n\tif len(pks) > 0 {\n\t\treturn pks[0]\n\t}\n\treturn \"\"\n}\n\nfunc (param Parameters) IsAll() bool {\n\treturn param.GetFieldValue(IsAll) == True\n}\n\nfunc (param *Parameters) WithURLPath(path string) Parameters {\n\tparam.URLPath = path\n\treturn *param\n}\n\nfunc (param *Parameters) isAllTrue() {\n\tparam.Fields[IsAll] = []string{True}\n}\n\nfunc (param *Parameters) isAllFalse() {\n\tparam.Fields[IsAll] = []string{False}\n}\n\nfunc (param Parameters) WithIsAll(isAll bool) Parameters {\n\tif isAll {\n\t\tparam.isAllTrue()\n\t} else {\n\t\tparam.isAllFalse()\n\t}\n\treturn param\n}\n\nfunc (param Parameters) DeleteIsAll() Parameters {\n\tdelete(param.Fields, IsAll)\n\treturn param\n}\n\nfunc (param Parameters) GetFilterFieldValueStart(field string) string {\n\treturn param.GetFieldValue(field + FilterRangeParamStartSuffix)\n}\n\nfunc (param Parameters) GetFilterFieldValueEnd(field string) string {\n\treturn param.GetFieldValue(field + FilterRangeParamEndSuffix)\n}\n\nfunc (param Parameters) GetFieldValue(field string) string {\n\tvalue, ok := param.Fields[field]\n\tif ok && len(value) > 0 {\n\t\treturn value[0]\n\t}\n\treturn \"\"\n}\n\nfunc (param Parameters) AddField(field, value string) Parameters {\n\tparam.Fields[field] = []string{value}\n\treturn param\n}\n\nfunc (param Parameters) DeleteField(fields ...string) Parameters {\n\tfor _, field := range fields {\n\t\tdelete(param.Fields, field)\n\t}\n\treturn param\n}\n\nfunc (param Parameters) DeleteEditPk() Parameters {\n\tdelete(param.Fields, constant.EditPKKey)\n\treturn param\n}\n\nfunc (param Parameters) DeleteDetailPk() Parameters {\n\tdelete(param.Fields, constant.DetailPKKey)\n\treturn param\n}\n\nfunc (param Parameters) GetFieldValues(field string) []string {\n\treturn param.Fields[field]\n}\n\nfunc (param Parameters) GetFieldValuesStr(field string) string {\n\treturn strings.Join(param.Fields[field], Separator)\n}\n\nfunc (param Parameters) GetFieldOperator(field, suffix string) string {\n\top := param.GetFieldValue(field + FilterParamOperatorSuffix + suffix)\n\tif op == \"\" {\n\t\treturn \"eq\"\n\t}\n\treturn op\n}\n\nfunc (param Parameters) Join() string {\n\tp := param.GetFixedParamStr()\n\tp.Add(Page, param.Page)\n\treturn p.Encode()\n}\n\nfunc (param *Parameters) SetPage(page string) Parameters {\n\tparam.Page = page\n\tparam.PageInt, _ = strconv.Atoi(page)\n\treturn *param\n}\n\nfunc (param *Parameters) SetPageSize(pageSize string) Parameters {\n\tparam.PageSize = pageSize\n\tparam.PageSizeInt, _ = strconv.Atoi(pageSize)\n\treturn *param\n}\n\nfunc (param Parameters) GetRouteParamStr() string {\n\tp := param.GetFixedParamStr()\n\tp.Add(Page, param.Page)\n\treturn \"?\" + p.Encode()\n}\n\nfunc (param Parameters) URL(page string) string {\n\treturn param.URLPath + param.SetPage(page).GetRouteParamStr()\n}\n\nfunc (param Parameters) URLNoAnimation(page string) string {\n\treturn param.URLPath + param.SetPage(page).GetRouteParamStr() + \"&\" + form.NoAnimationKey + \"=true\"\n}\n\nfunc (param Parameters) GetRouteParamStrWithoutPageSize(page string) string {\n\tp := make(url.Values)\n\tp.Add(Sort, param.SortField)\n\tp.Add(Page, page)\n\tp.Add(SortType, param.SortType)\n\tif len(param.Columns) > 0 {\n\t\tp.Add(Columns, strings.Join(param.Columns, \",\"))\n\t}\n\tfor key, value := range param.Fields {\n\t\tp[key] = value\n\t}\n\treturn \"?\" + p.Encode()\n}\n\nfunc (param Parameters) GetFixedParamStrFromCache() url.Values {\n\tif param.cacheFixedStr != nil {\n\t\treturn param.cacheFixedStr\n\t}\n\n\tp := param.GetFixedParamStr()\n\tparam.cacheFixedStr = p\n\treturn p\n}\n\nfunc (param Parameters) GetLastPageRouteParamStr(cache ...bool) string {\n\tvar p url.Values\n\tif len(cache) > 0 && cache[0] {\n\t\tp = param.GetFixedParamStrFromCache()\n\t} else {\n\t\tp = param.GetFixedParamStr()\n\t}\n\tp.Add(Page, strconv.Itoa(param.PageInt-1))\n\treturn \"?\" + p.Encode()\n}\n\nfunc (param Parameters) GetNextPageRouteParamStr(cache ...bool) string {\n\tvar p url.Values\n\tif len(cache) > 0 && cache[0] {\n\t\tp = param.GetFixedParamStrFromCache()\n\t} else {\n\t\tp = param.GetFixedParamStr()\n\t}\n\tp.Add(Page, strconv.Itoa(param.PageInt+1))\n\treturn \"?\" + p.Encode()\n}\n\nfunc (param Parameters) GetFixedParamStr() url.Values {\n\tp := make(url.Values)\n\tp.Add(Sort, param.SortField)\n\tp.Add(PageSize, param.PageSize)\n\tp.Add(SortType, param.SortType)\n\tif len(param.Columns) > 0 {\n\t\tp.Add(Columns, strings.Join(param.Columns, \",\"))\n\t}\n\tfor key, value := range param.Fields {\n\t\tp[key] = value\n\t}\n\treturn p\n}\n\nfunc (param Parameters) GetFixedParamStrWithoutColumnsAndPage() string {\n\tp := make(url.Values)\n\tp.Add(Sort, param.SortField)\n\tp.Add(PageSize, param.PageSize)\n\tif len(param.Columns) > 0 {\n\t\tp.Add(Columns, strings.Join(param.Columns, \",\"))\n\t}\n\tp.Add(SortType, param.SortType)\n\treturn \"?\" + p.Encode()\n}\n\nfunc (param Parameters) GetFixedParamStrWithoutSort() string {\n\tp := make(url.Values)\n\tp.Add(PageSize, param.PageSize)\n\tfor key, value := range param.Fields {\n\t\tp[key] = value\n\t}\n\tp.Add(form.NoAnimationKey, \"true\")\n\tif len(param.Columns) > 0 {\n\t\tp.Add(Columns, strings.Join(param.Columns, \",\"))\n\t}\n\treturn \"&\" + p.Encode()\n}\n\nfunc (param Parameters) Statement(wheres, table, delimiter, delimiter2 string, whereArgs []interface{}, columns, existKeys []string,\n\tfilterProcess func(string, string, string) string) (string, []interface{}, []string) {\n\tvar multiKey = make(map[string]uint8)\n\tfor key, value := range param.Fields {\n\n\t\tkeyIndexSuffix := \"\"\n\n\t\tkeyArr := strings.Split(key, FilterParamCountInfix)\n\n\t\tif len(keyArr) > 1 {\n\t\t\tkey = keyArr[0]\n\t\t\tkeyIndexSuffix = FilterParamCountInfix + keyArr[1]\n\t\t}\n\n\t\tif keyIndexSuffix != \"\" {\n\t\t\tmultiKey[key] = 0\n\t\t} else if _, exist := multiKey[key]; !exist && modules.InArray(existKeys, key) {\n\t\t\tcontinue\n\t\t}\n\n\t\tvar op string\n\t\tif strings.Contains(key, FilterRangeParamEndSuffix) {\n\t\t\tkey = strings.ReplaceAll(key, FilterRangeParamEndSuffix, \"\")\n\t\t\top = \"<=\"\n\t\t} else if strings.Contains(key, FilterRangeParamStartSuffix) {\n\t\t\tkey = strings.ReplaceAll(key, FilterRangeParamStartSuffix, \"\")\n\t\t\top = \">=\"\n\t\t} else if len(value) > 1 {\n\t\t\top = \"in\"\n\t\t} else if !strings.Contains(key, FilterParamOperatorSuffix) {\n\t\t\top = operators[param.GetFieldOperator(key, keyIndexSuffix)]\n\t\t} else {\n\t\t\tcontinue\n\t\t}\n\n\t\tif strings.Contains(key, FilterParamJoinInfix) {\n\t\t\tkeys := strings.Split(key, FilterParamJoinInfix)\n\t\t\tval := filterProcess(key, value[0], keyIndexSuffix)\n\t\t\tif op == \"in\" {\n\t\t\t\tqmark := \"\"\n\t\t\t\tfor range value {\n\t\t\t\t\tqmark += \"?,\"\n\t\t\t\t}\n\t\t\t\twheres += keys[0] + \".\" + modules.FilterField(keys[1], delimiter, delimiter2) + \" \" + op + \" (\" + qmark[:len(qmark)-1] + \") and \"\n\t\t\t} else {\n\t\t\t\twheres += keys[0] + \".\" + modules.FilterField(keys[1], delimiter, delimiter2) + \" \" + op + \" ? and \"\n\t\t\t}\n\t\t\tif op == \"like\" && !strings.Contains(val, \"%\") {\n\t\t\t\twhereArgs = append(whereArgs, \"%\"+val+\"%\")\n\t\t\t} else {\n\t\t\t\tfor _, v := range value {\n\t\t\t\t\twhereArgs = append(whereArgs, filterProcess(key, v, keyIndexSuffix))\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif modules.InArray(columns, key) {\n\t\t\t\tif op == \"in\" {\n\t\t\t\t\tqmark := \"\"\n\t\t\t\t\tfor range value {\n\t\t\t\t\t\tqmark += \"?,\"\n\t\t\t\t\t}\n\t\t\t\t\twheres += modules.Delimiter(delimiter, delimiter2, table) + \".\" + modules.FilterField(key, delimiter, delimiter2) + \" \" + op + \" (\" + qmark[:len(qmark)-1] + \") and \"\n\t\t\t\t} else {\n\t\t\t\t\twheres += modules.Delimiter(delimiter, delimiter2, table) + \".\" + modules.FilterField(key, delimiter, delimiter2) + \" \" + op + \" ? and \"\n\t\t\t\t}\n\t\t\t\tif op == \"like\" && !strings.Contains(value[0], \"%\") {\n\t\t\t\t\twhereArgs = append(whereArgs, \"%\"+filterProcess(key, value[0], keyIndexSuffix)+\"%\")\n\t\t\t\t} else {\n\t\t\t\t\tfor _, v := range value {\n\t\t\t\t\t\twhereArgs = append(whereArgs, filterProcess(key, v, keyIndexSuffix))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\texistKeys = append(existKeys, key)\n\t}\n\n\tif len(wheres) > 3 {\n\t\twheres = wheres[:len(wheres)-4]\n\t}\n\n\tfor key, value := range param.OrConditions {\n\t\tcolumns = strings.Split(key, \",\")\n\t\top := \"=\"\n\t\tif strings.Contains(value, \"%\") {\n\t\t\top = \"like\"\n\t\t}\n\t\tif len(wheres) > 0 {\n\t\t\twheres += \" and \"\n\t\t}\n\t\twheres += \"(\"\n\t\tfor _, column := range columns {\n\t\t\tkeys := strings.Split(column, FilterParamJoinInfix)\n\t\t\tif len(keys) > 1 {\n\t\t\t\twheres += keys[0] + \".\" + modules.FilterField(keys[1], delimiter, delimiter2) + \" \" + op + \" ? or \"\n\t\t\t} else {\n\t\t\t\twheres += modules.FilterField(column, delimiter, delimiter2) + \" \" + op + \" ? or \"\n\t\t\t}\n\t\t\twhereArgs = append(whereArgs, value)\n\t\t}\n\t\twheres = strings.TrimSuffix(wheres, \"or \") + \")\"\n\t}\n\n\treturn wheres, whereArgs, existKeys\n}\n\nfunc getDefault(values url.Values, key, def string) string {\n\tvalue := values.Get(key)\n\tif value == \"\" {\n\t\treturn def\n\t}\n\treturn value\n}\n"
  },
  {
    "path": "plugins/admin/modules/parameter/parameter_test.go",
    "content": "package parameter\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestGetParamFromUrl(t *testing.T) {\n\tfmt.Println(GetParamFromURL(\"/admin/info/user?__page=1&__pageSize=10&__sort=id&__sort_type=desc\",\n\t\t1, \"asc\", \"id\"))\n}\n\nfunc TestParameters_PKs(t *testing.T) {\n\tpks := BaseParam().PKs()\n\tfmt.Println(\"pks\", pks, \"len\", len(pks))\n}\n"
  },
  {
    "path": "plugins/admin/modules/response/response.go",
    "content": "package response\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\nfunc Ok(ctx *context.Context) {\n\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\"code\": http.StatusOK,\n\t\t\"msg\":  \"ok\",\n\t})\n}\n\nfunc OkWithMsg(ctx *context.Context, msg string) {\n\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\"code\": http.StatusOK,\n\t\t\"msg\":  msg,\n\t})\n}\n\nfunc OkWithData(ctx *context.Context, data map[string]interface{}) {\n\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\"code\": http.StatusOK,\n\t\t\"msg\":  \"ok\",\n\t\t\"data\": data,\n\t})\n}\n\nfunc BadRequest(ctx *context.Context, msg string) {\n\tctx.JSON(http.StatusBadRequest, map[string]interface{}{\n\t\t\"code\": http.StatusBadRequest,\n\t\t\"msg\":  language.Get(msg),\n\t})\n}\n\nfunc Alert(ctx *context.Context, desc, title, msg string, conn db.Connection, btns *types.Buttons,\n\tpageType ...template.PageType) {\n\tuser := auth.Auth(ctx)\n\n\tpt := template.Error500Page\n\tif len(pageType) > 0 {\n\t\tpt = pageType[0]\n\t}\n\n\tpageTitle, description, content := template.GetPageContentFromPageType(ctx, title, desc, msg, pt)\n\n\ttmpl, tmplName := template.Default(ctx).GetTemplate(ctx.IsPjax())\n\tbuf := template.Execute(ctx, &template.ExecuteParam{\n\t\tUser:     user,\n\t\tTmplName: tmplName,\n\t\tTmpl:     tmpl,\n\t\tPanel: types.Panel{\n\t\t\tContent:     content,\n\t\t\tDescription: description,\n\t\t\tTitle:       pageTitle,\n\t\t},\n\t\tConfig:    config.Get(),\n\t\tMenu:      menu.GetGlobalMenu(user, conn, ctx.Lang()).SetActiveClass(config.URLRemovePrefix(ctx.Path())),\n\t\tAnimation: true,\n\t\tButtons:   *btns,\n\t\tIsPjax:    ctx.IsPjax(),\n\t\tIframe:    ctx.IsIframe(),\n\t})\n\tctx.HTML(http.StatusOK, buf.String())\n}\n\nfunc Error(ctx *context.Context, msg string, datas ...map[string]interface{}) {\n\tres := map[string]interface{}{\n\t\t\"code\": http.StatusInternalServerError,\n\t\t\"msg\":  language.Get(msg),\n\t}\n\tif len(datas) > 0 {\n\t\tres[\"data\"] = datas[0]\n\t}\n\tctx.JSON(http.StatusInternalServerError, res)\n}\n\nfunc Denied(ctx *context.Context, msg string) {\n\tctx.JSON(http.StatusInternalServerError, map[string]interface{}{\n\t\t\"code\": http.StatusForbidden,\n\t\t\"msg\":  language.Get(msg),\n\t})\n}\n\nvar OffLineHandler = func(ctx *context.Context) {\n\tif config.GetSiteOff() {\n\t\tif ctx.WantHTML() {\n\t\t\tctx.HTML(http.StatusOK, `<html><body><h1>The website is offline</h1></body></html>`)\n\t\t} else {\n\t\t\tctx.JSON(http.StatusForbidden, map[string]interface{}{\n\t\t\t\t\"code\": http.StatusForbidden,\n\t\t\t\t\"msg\":  language.Get(errors.SiteOff),\n\t\t\t})\n\t\t}\n\t\tctx.Abort()\n\t}\n}\n"
  },
  {
    "path": "plugins/admin/modules/table/config.go",
    "content": "package table\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n)\n\ntype Config struct {\n\tDriver         string\n\tDriverMode     string\n\tConnection     string\n\tCanAdd         bool\n\tEditable       bool\n\tDeletable      bool\n\tExportable     bool\n\tPrimaryKey     PrimaryKey\n\tSourceURL      string\n\tGetDataFun     GetDataFun\n\tOnlyInfo       bool\n\tOnlyNewForm    bool\n\tOnlyUpdateForm bool\n\tOnlyDetail     bool\n}\n\nfunc DefaultConfig() Config {\n\treturn Config{\n\t\tDriver:     db.DriverMysql,\n\t\tCanAdd:     true,\n\t\tEditable:   true,\n\t\tDeletable:  true,\n\t\tExportable: true,\n\t\tConnection: DefaultConnectionName,\n\t\tPrimaryKey: PrimaryKey{\n\t\t\tType: db.Int,\n\t\t\tName: DefaultPrimaryKeyName,\n\t\t},\n\t}\n}\n\nfunc (config Config) SetPrimaryKey(name string, typ db.DatabaseType) Config {\n\tconfig.PrimaryKey.Name = name\n\tconfig.PrimaryKey.Type = typ\n\treturn config\n}\n\nfunc (config Config) SetDriverMode(mode string) Config {\n\tconfig.DriverMode = mode\n\treturn config\n}\n\nfunc (config Config) SetPrimaryKeyType(typ string) Config {\n\tconfig.PrimaryKey.Type = db.GetDTAndCheck(typ)\n\treturn config\n}\n\nfunc (config Config) SetCanAdd(canAdd bool) Config {\n\tconfig.CanAdd = canAdd\n\treturn config\n}\n\nfunc (config Config) SetSourceURL(url string) Config {\n\tconfig.SourceURL = url\n\treturn config\n}\n\nfunc (config Config) SetGetDataFun(fun GetDataFun) Config {\n\tconfig.GetDataFun = fun\n\treturn config\n}\n\nfunc (config Config) SetEditable(editable bool) Config {\n\tconfig.Editable = editable\n\treturn config\n}\n\nfunc (config Config) SetDeletable(deletable bool) Config {\n\tconfig.Deletable = deletable\n\treturn config\n}\n\nfunc (config Config) SetOnlyInfo() Config {\n\tconfig.OnlyInfo = true\n\treturn config\n}\n\nfunc (config Config) SetOnlyUpdateForm() Config {\n\tconfig.OnlyUpdateForm = true\n\treturn config\n}\n\nfunc (config Config) SetOnlyNewForm() Config {\n\tconfig.OnlyNewForm = true\n\treturn config\n}\n\nfunc (config Config) SetOnlyDetail() Config {\n\tconfig.OnlyDetail = true\n\treturn config\n}\n\nfunc (config Config) SetExportable(exportable bool) Config {\n\tconfig.Exportable = exportable\n\treturn config\n}\n\nfunc (config Config) SetConnection(connection string) Config {\n\tconfig.Connection = connection\n\treturn config\n}\n\nfunc DefaultConfigWithDriver(driver string) Config {\n\treturn Config{\n\t\tDriver:     driver,\n\t\tConnection: DefaultConnectionName,\n\t\tCanAdd:     true,\n\t\tEditable:   true,\n\t\tDeletable:  true,\n\t\tExportable: true,\n\t\tPrimaryKey: PrimaryKey{\n\t\t\tType: db.Int,\n\t\t\tName: DefaultPrimaryKeyName,\n\t\t},\n\t}\n}\n\nfunc DefaultConfigWithDriverAndConnection(driver, conn string) Config {\n\treturn Config{\n\t\tDriver:     driver,\n\t\tConnection: conn,\n\t\tCanAdd:     true,\n\t\tEditable:   true,\n\t\tDeletable:  true,\n\t\tExportable: true,\n\t\tPrimaryKey: PrimaryKey{\n\t\t\tType: db.Int,\n\t\t\tName: DefaultPrimaryKeyName,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "plugins/admin/modules/table/default.go",
    "content": "package table\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\terrs \"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/paginator\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// DefaultTable is an implementation of table.Table\ntype DefaultTable struct {\n\t*BaseTable\n\tconnectionDriver     string\n\tconnectionDriverMode string\n\tconnection           string\n\tsourceURL            string\n\tgetDataFun           GetDataFun\n\n\tdbObj db.Connection\n}\n\ntype GetDataFun func(params parameter.Parameters) ([]map[string]interface{}, int)\n\nfunc NewDefaultTable(ctx *context.Context, cfgs ...Config) Table {\n\n\tvar cfg Config\n\n\tif len(cfgs) > 0 && cfgs[0].PrimaryKey.Name != \"\" {\n\t\tcfg = cfgs[0]\n\t} else {\n\t\tcfg = DefaultConfig()\n\t}\n\n\treturn &DefaultTable{\n\t\tBaseTable: &BaseTable{\n\t\t\tInfo:           types.NewInfoPanel(ctx, cfg.PrimaryKey.Name),\n\t\t\tForm:           types.NewFormPanel(),\n\t\t\tNewForm:        types.NewFormPanel(),\n\t\t\tDetail:         types.NewInfoPanel(ctx, cfg.PrimaryKey.Name),\n\t\t\tCanAdd:         cfg.CanAdd,\n\t\t\tEditable:       cfg.Editable,\n\t\t\tDeletable:      cfg.Deletable,\n\t\t\tExportable:     cfg.Exportable,\n\t\t\tPrimaryKey:     cfg.PrimaryKey,\n\t\t\tOnlyNewForm:    cfg.OnlyNewForm,\n\t\t\tOnlyUpdateForm: cfg.OnlyUpdateForm,\n\t\t\tOnlyDetail:     cfg.OnlyDetail,\n\t\t\tOnlyInfo:       cfg.OnlyInfo,\n\t\t},\n\t\tconnectionDriver:     cfg.Driver,\n\t\tconnectionDriverMode: cfg.DriverMode,\n\t\tconnection:           cfg.Connection,\n\t\tsourceURL:            cfg.SourceURL,\n\t\tgetDataFun:           cfg.GetDataFun,\n\t}\n}\n\n// Copy copy a new table.Table from origin DefaultTable\nfunc (tb *DefaultTable) Copy() Table {\n\treturn &DefaultTable{\n\t\tBaseTable: &BaseTable{\n\t\t\tForm: types.NewFormPanel().SetTable(tb.Form.Table).\n\t\t\t\tSetDescription(tb.Form.Description).\n\t\t\t\tSetTitle(tb.Form.Title),\n\t\t\tNewForm: types.NewFormPanel().SetTable(tb.Form.Table).\n\t\t\t\tSetDescription(tb.Form.Description).\n\t\t\t\tSetTitle(tb.Form.Title),\n\t\t\tInfo: types.NewInfoPanel(tb.Info.Ctx, tb.PrimaryKey.Name).SetTable(tb.Info.Table).\n\t\t\t\tSetDescription(tb.Info.Description).\n\t\t\t\tSetTitle(tb.Info.Title).\n\t\t\t\tSetGetDataFn(tb.Info.GetDataFn),\n\t\t\tDetail: types.NewInfoPanel(tb.Info.Ctx, tb.PrimaryKey.Name).SetTable(tb.Detail.Table).\n\t\t\t\tSetDescription(tb.Detail.Description).\n\t\t\t\tSetTitle(tb.Detail.Title).\n\t\t\t\tSetGetDataFn(tb.Detail.GetDataFn),\n\t\t\tCanAdd:     tb.CanAdd,\n\t\t\tEditable:   tb.Editable,\n\t\t\tDeletable:  tb.Deletable,\n\t\t\tExportable: tb.Exportable,\n\t\t\tPrimaryKey: tb.PrimaryKey,\n\t\t},\n\t\tconnectionDriver:     tb.connectionDriver,\n\t\tconnectionDriverMode: tb.connectionDriverMode,\n\t\tconnection:           tb.connection,\n\t\tsourceURL:            tb.sourceURL,\n\t\tgetDataFun:           tb.getDataFun,\n\t}\n}\n\n// GetData query the data set.\nfunc (tb *DefaultTable) GetData(ctx *context.Context, params parameter.Parameters) (PanelInfo, error) {\n\n\tvar (\n\t\tdata      []map[string]interface{}\n\t\tsize      int\n\t\tbeginTime = time.Now()\n\t)\n\n\tif tb.Info.UpdateParametersFns != nil {\n\t\tfor _, fn := range tb.Info.UpdateParametersFns {\n\t\t\tfn(&params)\n\t\t}\n\t}\n\n\tif tb.Info.QueryFilterFn != nil {\n\t\tvar ids []string\n\t\tvar stopQuery bool\n\n\t\tif tb.getDataFun == nil && tb.Info.GetDataFn == nil {\n\t\t\tids, stopQuery = tb.Info.QueryFilterFn(params, tb.db())\n\t\t} else {\n\t\t\tids, stopQuery = tb.Info.QueryFilterFn(params, nil)\n\t\t}\n\n\t\tif stopQuery {\n\t\t\treturn tb.GetDataWithIds(ctx, params.WithPKs(ids...))\n\t\t}\n\t}\n\n\tif tb.getDataFun != nil {\n\t\tdata, size = tb.getDataFun(params)\n\t} else if tb.sourceURL != \"\" {\n\t\tdata, size = tb.getDataFromURL(params)\n\t} else if tb.Info.GetDataFn != nil {\n\t\tdata, size = tb.Info.GetDataFn(params)\n\t} else if params.IsAll() {\n\t\treturn tb.getAllDataFromDatabase(params)\n\t} else {\n\t\treturn tb.getDataFromDatabase(ctx, params)\n\t}\n\n\tinfoList := make(types.InfoList, 0)\n\n\tfor i := 0; i < len(data); i++ {\n\t\tinfoList = append(infoList, tb.getTempModelData(data[i], params, []string{}))\n\t}\n\n\tthead, _, _, _, _, filterForm := tb.getTheadAndFilterForm(params, []string{})\n\n\tendTime := time.Now()\n\n\textraInfo := \"\"\n\n\tif !tb.Info.IsHideQueryInfo {\n\t\textraInfo = fmt.Sprintf(\"<b>\" + language.Get(\"query time\") + \": </b>\" +\n\t\t\tfmt.Sprintf(\"%.3fms\", endTime.Sub(beginTime).Seconds()*1000))\n\t}\n\n\treturn PanelInfo{\n\t\tThead:    thead,\n\t\tInfoList: infoList,\n\t\tPaginator: paginator.Get(ctx, paginator.Config{\n\t\t\tSize:         size,\n\t\t\tParam:        params,\n\t\t\tPageSizeList: tb.Info.GetPageSizeList(),\n\t\t}).SetExtraInfo(template.HTML(extraInfo)),\n\t\tTitle:          tb.Info.Title,\n\t\tFilterFormData: filterForm,\n\t\tDescription:    tb.Info.Description,\n\t}, nil\n}\n\ntype GetDataFromURLRes struct {\n\tData []map[string]interface{}\n\tSize int\n}\n\nfunc (tb *DefaultTable) getDataFromURL(params parameter.Parameters) ([]map[string]interface{}, int) {\n\n\tu := \"\"\n\tif strings.Contains(tb.sourceURL, \"?\") {\n\t\tu = tb.sourceURL + \"&\" + params.Join()\n\t} else {\n\t\tu = tb.sourceURL + \"?\" + params.Join()\n\t}\n\tres, err := http.Get(u + \"&pk=\" + strings.Join(params.PKs(), \",\"))\n\n\tif err != nil {\n\t\treturn []map[string]interface{}{}, 0\n\t}\n\n\tdefer func() {\n\t\t_ = res.Body.Close()\n\t}()\n\n\tbody, err := ioutil.ReadAll(res.Body)\n\n\tif err != nil {\n\t\treturn []map[string]interface{}{}, 0\n\t}\n\n\tvar data GetDataFromURLRes\n\n\terr = json.Unmarshal(body, &data)\n\n\tif err != nil {\n\t\treturn []map[string]interface{}{}, 0\n\t}\n\n\treturn data.Data, data.Size\n}\n\n// GetDataWithIds query the data set.\nfunc (tb *DefaultTable) GetDataWithIds(ctx *context.Context, params parameter.Parameters) (PanelInfo, error) {\n\n\tvar (\n\t\tdata      []map[string]interface{}\n\t\tsize      int\n\t\tbeginTime = time.Now()\n\t)\n\n\tif tb.getDataFun != nil {\n\t\tdata, size = tb.getDataFun(params)\n\t} else if tb.sourceURL != \"\" {\n\t\tdata, size = tb.getDataFromURL(params)\n\t} else if tb.Info.GetDataFn != nil {\n\t\tdata, size = tb.Info.GetDataFn(params)\n\t} else {\n\t\treturn tb.getDataFromDatabase(ctx, params)\n\t}\n\n\tinfoList := make([]map[string]types.InfoItem, 0)\n\n\tfor i := 0; i < len(data); i++ {\n\t\tinfoList = append(infoList, tb.getTempModelData(data[i], params, []string{}))\n\t}\n\n\tthead, _, _, _, _, filterForm := tb.getTheadAndFilterForm(params, []string{})\n\n\tendTime := time.Now()\n\n\treturn PanelInfo{\n\t\tThead:    thead,\n\t\tInfoList: infoList,\n\t\tPaginator: paginator.Get(ctx, paginator.Config{\n\t\t\tSize:         size,\n\t\t\tParam:        params,\n\t\t\tPageSizeList: tb.Info.GetPageSizeList(),\n\t\t}).\n\t\t\tSetExtraInfo(template.HTML(fmt.Sprintf(\"<b>\" + language.Get(\"query time\") + \": </b>\" +\n\t\t\t\tfmt.Sprintf(\"%.3fms\", endTime.Sub(beginTime).Seconds()*1000)))),\n\t\tTitle:          tb.Info.Title,\n\t\tFilterFormData: filterForm,\n\t\tDescription:    tb.Info.Description,\n\t}, nil\n}\n\nfunc (tb *DefaultTable) getTempModelData(res map[string]interface{}, params parameter.Parameters, columns Columns) map[string]types.InfoItem {\n\n\tvar tempModelData = map[string]types.InfoItem{\n\t\t\"__goadmin_edit_params\":   {},\n\t\t\"__goadmin_delete_params\": {},\n\t\t\"__goadmin_detail_params\": {},\n\t}\n\theadField := \"\"\n\teditParams := \"\"\n\tdeleteParams := \"\"\n\tdetailParams := \"\"\n\n\tprimaryKeyValue := db.GetValueFromDatabaseType(tb.PrimaryKey.Type, res[tb.PrimaryKey.Name], len(columns) == 0)\n\n\tfor _, field := range tb.Info.FieldList {\n\n\t\theadField = field.Field\n\n\t\tif field.Joins.Valid() {\n\t\t\theadField = field.Joins.Last().GetTableName() + parameter.FilterParamJoinInfix + field.Field\n\t\t}\n\n\t\tif field.Hide {\n\t\t\tcontinue\n\t\t}\n\t\tif !modules.InArrayWithoutEmpty(params.Columns, headField) {\n\t\t\tcontinue\n\t\t}\n\n\t\ttypeName := field.TypeName\n\n\t\tif field.Joins.Valid() {\n\t\t\ttypeName = db.Varchar\n\t\t}\n\n\t\tcombineValue := db.GetValueFromDatabaseType(typeName, res[headField], len(columns) == 0).String()\n\n\t\t// TODO: ToDisplay some same logic execute repeatedly, it can be improved.\n\t\tvar value interface{}\n\t\tif len(columns) == 0 || modules.InArray(columns, headField) || field.Joins.Valid() {\n\t\t\tvalue = field.ToDisplay(types.FieldModel{\n\t\t\t\tID:    primaryKeyValue.String(),\n\t\t\t\tValue: combineValue,\n\t\t\t\tRow:   res,\n\t\t\t})\n\t\t} else {\n\t\t\tvalue = field.ToDisplay(types.FieldModel{\n\t\t\t\tID:    primaryKeyValue.String(),\n\t\t\t\tValue: \"\",\n\t\t\t\tRow:   res,\n\t\t\t})\n\t\t}\n\t\tvar valueStr string\n\t\tvar ok bool\n\t\tif valueStr, ok = value.(string); ok {\n\t\t\ttempModelData[headField] = types.InfoItem{\n\t\t\t\tContent: template.HTML(valueStr),\n\t\t\t\tValue:   combineValue,\n\t\t\t}\n\t\t} else {\n\t\t\tvalueStr = string(value.(template.HTML))\n\t\t\ttempModelData[headField] = types.InfoItem{\n\t\t\t\tContent: value.(template.HTML),\n\t\t\t\tValue:   combineValue,\n\t\t\t}\n\t\t}\n\n\t\tif field.IsEditParam {\n\t\t\teditParams += \"__goadmin_edit_\" + field.Field + \"=\" + valueStr + \"&\"\n\t\t}\n\t\tif field.IsDeleteParam {\n\t\t\tdeleteParams += \"__goadmin_delete_\" + field.Field + \"=\" + valueStr + \"&\"\n\t\t}\n\t\tif field.IsDetailParam {\n\t\t\tdetailParams += \"__goadmin_detail_\" + field.Field + \"=\" + valueStr + \"&\"\n\t\t}\n\t}\n\n\tif editParams != \"\" {\n\t\ttempModelData[\"__goadmin_edit_params\"] = types.InfoItem{Content: template.HTML(\"&\" + editParams[:len(editParams)-1])}\n\t}\n\tif deleteParams != \"\" {\n\t\ttempModelData[\"__goadmin_delete_params\"] = types.InfoItem{Content: template.HTML(\"&\" + deleteParams[:len(deleteParams)-1])}\n\t}\n\tif detailParams != \"\" {\n\t\ttempModelData[\"__goadmin_detail_params\"] = types.InfoItem{Content: template.HTML(\"&\" + detailParams[:len(detailParams)-1])}\n\t}\n\n\tprimaryKeyField := tb.Info.FieldList.GetFieldByFieldName(tb.PrimaryKey.Name)\n\tvalue := primaryKeyField.ToDisplay(types.FieldModel{\n\t\tID:    primaryKeyValue.String(),\n\t\tValue: primaryKeyValue.String(),\n\t\tRow:   res,\n\t})\n\tif valueStr, ok := value.(string); ok {\n\t\ttempModelData[tb.PrimaryKey.Name] = types.InfoItem{\n\t\t\tContent: template.HTML(valueStr),\n\t\t\tValue:   primaryKeyValue.String(),\n\t\t}\n\t} else {\n\t\ttempModelData[tb.PrimaryKey.Name] = types.InfoItem{\n\t\t\tContent: value.(template.HTML),\n\t\t\tValue:   primaryKeyValue.String(),\n\t\t}\n\t}\n\n\treturn tempModelData\n}\n\nfunc (tb *DefaultTable) getAllDataFromDatabase(params parameter.Parameters) (PanelInfo, error) {\n\tvar (\n\t\tconnection     = tb.db()\n\t\tqueryStatement = \"select %s from %s %s %s %s order by \" + modules.Delimiter(connection.GetDelimiter(), connection.GetDelimiter2(), \"%s\") + \" %s\"\n\t)\n\n\tcolumns, _ := tb.getColumns(tb.Info.Table)\n\n\tthead, fields, joins := tb.Info.FieldList.GetThead(types.TableInfo{\n\t\tTable:      tb.Info.Table,\n\t\tDelimiter:  connection.GetDelimiter(),\n\t\tDelimiter2: connection.GetDelimiter2(),\n\t\tDriver:     tb.connectionDriver,\n\t\tPrimaryKey: tb.PrimaryKey.Name,\n\t}, params, columns)\n\n\tfields += tb.Info.Table + \".\" + modules.FilterField(tb.PrimaryKey.Name, connection.GetDelimiter(), connection.GetDelimiter2())\n\n\tgroupBy := \"\"\n\tif joins != \"\" {\n\t\tgroupBy = \" GROUP BY \" + tb.Info.Table + \".\" + modules.Delimiter(connection.GetDelimiter(), connection.GetDelimiter2(), tb.PrimaryKey.Name)\n\t}\n\n\tvar (\n\t\twheres    = \"\"\n\t\twhereArgs = make([]interface{}, 0)\n\t\texistKeys = make([]string, 0)\n\t)\n\n\twheres, whereArgs, existKeys = params.Statement(wheres, tb.Info.Table, connection.GetDelimiter(), connection.GetDelimiter2(), whereArgs, columns, existKeys,\n\t\ttb.Info.FieldList.GetFieldFilterProcessValue)\n\twheres, whereArgs = tb.Info.Wheres.Statement(wheres, connection.GetDelimiter(), connection.GetDelimiter2(), whereArgs, existKeys, columns)\n\twheres, whereArgs = tb.Info.WhereRaws.Statement(wheres, whereArgs)\n\n\tif wheres != \"\" {\n\t\twheres = \" where \" + wheres\n\t}\n\n\tif !modules.InArray(columns, params.SortField) {\n\t\tparams.SortField = tb.PrimaryKey.Name\n\t}\n\n\tqueryCmd := fmt.Sprintf(queryStatement, fields, tb.Info.Table, joins, wheres, groupBy, params.SortField, params.SortType)\n\n\tlogger.LogSQL(queryCmd, []interface{}{})\n\n\tres, err := connection.QueryWithConnection(tb.connection, queryCmd, whereArgs...)\n\n\tif err != nil {\n\t\treturn PanelInfo{}, err\n\t}\n\n\tinfoList := make([]map[string]types.InfoItem, 0)\n\n\tfor i := 0; i < len(res); i++ {\n\t\tinfoList = append(infoList, tb.getTempModelData(res[i], params, columns))\n\t}\n\n\treturn PanelInfo{\n\t\tInfoList:    infoList,\n\t\tThead:       thead,\n\t\tTitle:       tb.Info.Title,\n\t\tDescription: tb.Info.Description,\n\t}, nil\n}\n\n// TODO: refactor\nfunc (tb *DefaultTable) getDataFromDatabase(ctx *context.Context, params parameter.Parameters) (PanelInfo, error) {\n\n\tvar (\n\t\tconnection     = tb.db()\n\t\tdelimiter      = connection.GetDelimiter()\n\t\tdelimiter2     = connection.GetDelimiter2()\n\t\tplaceholder    = modules.Delimiter(delimiter, delimiter2, \"%s\")\n\t\tqueryStatement string\n\t\tcountStatement string\n\t\tids            = params.PKs()\n\t\ttable          = modules.Delimiter(delimiter, delimiter2, tb.Info.Table)\n\t\tpk             = table + \".\" + modules.Delimiter(delimiter, delimiter2, tb.PrimaryKey.Name)\n\t)\n\n\tbeginTime := time.Now()\n\n\tif len(ids) > 0 {\n\t\tcountExtra := \"\"\n\t\tif connection.Name() == db.DriverMssql {\n\t\t\tcountExtra = \"as [size]\"\n\t\t}\n\t\t// %s means: fields, table, join table, pk values, group by, order by field,  order by type\n\t\tqueryStatement = \"select %s from \" + placeholder + \" %s where \" + pk + \" in (%s) %s ORDER BY %s.\" + placeholder + \" %s\"\n\t\t// %s means: table, join table, pk values\n\t\tcountStatement = \"select count(*) \" + countExtra + \" from \" + placeholder + \" %s where \" + pk + \" in (%s)\"\n\t} else {\n\t\tif connection.Name() == db.DriverMssql {\n\t\t\t// %s means: order by field, order by type, fields, table, join table, wheres, group by\n\t\t\tqueryStatement = \"SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY %s.\" + placeholder + \" %s) as ROWNUMBER_, %s from \" +\n\t\t\t\tplaceholder + \"%s %s %s ) as TMP_ WHERE TMP_.ROWNUMBER_ > ? AND TMP_.ROWNUMBER_ <= ?\"\n\t\t\t// %s means: table, join table, wheres\n\t\t\tcountStatement = \"select count(*) as [size] from (select 1 as [size] from \" + placeholder + \" %s %s %s) src\"\n\t\t} else {\n\t\t\t// %s means: fields, table, join table, wheres, group by, order by field, order by type\n\t\t\tqueryStatement = \"select %s from \" + placeholder + \"%s %s %s order by \" + placeholder + \".\" + placeholder + \" %s LIMIT ? OFFSET ?\"\n\t\t\t// %s means: table, join table, wheres\n\t\t\tcountStatement = \"select count(*) from (select \" + pk + \" from \" + placeholder + \" %s %s %s) src\"\n\t\t}\n\t}\n\n\tcolumns, _ := tb.getColumns(tb.Info.Table)\n\n\tthead, fields, joinFields, joins, joinTables, filterForm := tb.getTheadAndFilterForm(params, columns)\n\n\tfields += pk\n\n\tallFields := fields\n\tgroupFields := fields\n\n\tif joinFields != \"\" {\n\t\tallFields += \",\" + joinFields[:len(joinFields)-1]\n\t\tif connection.Name() == db.DriverMssql {\n\t\t\tfor _, field := range tb.Info.FieldList {\n\t\t\t\tif field.TypeName == db.Text || field.TypeName == db.Longtext {\n\t\t\t\t\tf := modules.Delimiter(connection.GetDelimiter(), connection.GetDelimiter2(), field.Field)\n\t\t\t\t\theadField := table + \".\" + f\n\t\t\t\t\tallFields = strings.ReplaceAll(allFields, headField, \"CAST(\"+headField+\" AS NVARCHAR(MAX)) as \"+f)\n\t\t\t\t\tgroupFields = strings.ReplaceAll(groupFields, headField, \"CAST(\"+headField+\" AS NVARCHAR(MAX))\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif !modules.InArray(columns, params.SortField) {\n\t\tparams.SortField = tb.PrimaryKey.Name\n\t}\n\n\tvar (\n\t\twheres    = \"\"\n\t\twhereArgs = make([]interface{}, 0)\n\t\targs      = make([]interface{}, 0)\n\t\texistKeys = make([]string, 0)\n\t)\n\n\tif len(ids) > 0 {\n\t\tfor _, value := range ids {\n\t\t\tif value != \"\" {\n\t\t\t\twheres += \"?,\"\n\t\t\t\targs = append(args, value)\n\t\t\t}\n\t\t}\n\t\twheres = wheres[:len(wheres)-1]\n\t} else {\n\n\t\t// parameter\n\t\twheres, whereArgs, existKeys = params.Statement(wheres, tb.Info.Table, connection.GetDelimiter(), connection.GetDelimiter2(), whereArgs, columns, existKeys,\n\t\t\ttb.Info.FieldList.GetFieldFilterProcessValue)\n\t\t// pre query\n\t\twheres, whereArgs = tb.Info.Wheres.Statement(wheres, connection.GetDelimiter(), connection.GetDelimiter2(), whereArgs, existKeys, columns)\n\t\twheres, whereArgs = tb.Info.WhereRaws.Statement(wheres, whereArgs)\n\n\t\tif wheres != \"\" {\n\t\t\twheres = \" where \" + wheres\n\t\t}\n\n\t\tif connection.Name() == db.DriverMssql {\n\t\t\targs = append(whereArgs, (params.PageInt-1)*params.PageSizeInt, params.PageInt*params.PageSizeInt)\n\t\t} else {\n\t\t\targs = append(whereArgs, params.PageSizeInt, (params.PageInt-1)*params.PageSizeInt)\n\t\t}\n\t}\n\n\tgroupBy := \"\"\n\tif len(joinTables) > 0 {\n\t\tif connection.Name() == db.DriverMssql || connection.Name() == db.DriverPostgresql {\n\t\t\tgroupBy = \" GROUP BY \" + groupFields\n\t\t} else {\n\t\t\tgroupBy = \" GROUP BY \" + pk\n\t\t}\n\t}\n\n\tqueryCmd := \"\"\n\tif connection.Name() == db.DriverMssql && len(ids) == 0 {\n\t\tqueryCmd = fmt.Sprintf(queryStatement, tb.Info.Table, params.SortField, params.SortType,\n\t\t\tallFields, tb.Info.Table, joins, wheres, groupBy)\n\t} else {\n\t\tqueryCmd = fmt.Sprintf(queryStatement, allFields, tb.Info.Table, joins, wheres, groupBy,\n\t\t\ttb.Info.Table, params.SortField, params.SortType)\n\t}\n\n\tlogger.LogSQL(queryCmd, args)\n\n\tres, err := connection.QueryWithConnection(tb.connection, queryCmd, args...)\n\n\tif err != nil {\n\t\treturn PanelInfo{}, err\n\t}\n\n\tinfoList := make([]map[string]types.InfoItem, 0)\n\n\tfor i := 0; i < len(res); i++ {\n\t\tinfoList = append(infoList, tb.getTempModelData(res[i], params, columns))\n\t}\n\n\t// TODO: use the dialect\n\tvar size int\n\n\tif len(ids) == 0 {\n\t\tcountCmd := fmt.Sprintf(countStatement, tb.Info.Table, joins, wheres, groupBy)\n\n\t\ttotal, err := connection.QueryWithConnection(tb.connection, countCmd, whereArgs...)\n\n\t\tif err != nil {\n\t\t\treturn PanelInfo{}, err\n\t\t}\n\n\t\tlogger.LogSQL(countCmd, nil)\n\n\t\tif tb.connectionDriver == \"postgresql\" {\n\t\t\tif tb.connectionDriverMode == \"h2\" {\n\t\t\t\tsize = int(total[0][\"count(*)\"].(int64))\n\t\t\t} else if config.GetDatabases().GetDefault().DriverMode == \"h2\" {\n\t\t\t\tsize = int(total[0][\"count(*)\"].(int64))\n\t\t\t} else {\n\t\t\t\tsize = int(total[0][\"count\"].(int64))\n\t\t\t}\n\t\t} else if tb.connectionDriver == db.DriverMssql {\n\t\t\tsize = int(total[0][\"size\"].(int64))\n\t\t} else {\n\t\t\tsize = int(total[0][\"count(*)\"].(int64))\n\t\t}\n\t}\n\n\tendTime := time.Now()\n\n\treturn PanelInfo{\n\t\tThead:    thead,\n\t\tInfoList: infoList,\n\t\tPaginator: tb.GetPaginator(ctx, size, params,\n\t\t\ttemplate.HTML(fmt.Sprintf(\"<b>\"+language.Get(\"query time\")+\": </b>\"+\n\t\t\t\tfmt.Sprintf(\"%.3fms\", endTime.Sub(beginTime).Seconds()*1000)))),\n\t\tTitle:          tb.Info.Title,\n\t\tFilterFormData: filterForm,\n\t\tDescription:    tb.Info.Description,\n\t}, nil\n}\n\nfunc getDataRes(list []map[string]interface{}, _ int) map[string]interface{} {\n\tif len(list) > 0 {\n\t\treturn list[0]\n\t}\n\treturn nil\n}\n\n// GetDataWithId query the single row of data.\nfunc (tb *DefaultTable) GetDataWithId(param parameter.Parameters) (FormInfo, error) {\n\n\tvar (\n\t\tres     map[string]interface{}\n\t\tcolumns Columns\n\t\tid      = param.PK()\n\t)\n\n\tif tb.getDataFun != nil {\n\t\tres = getDataRes(tb.getDataFun(param))\n\t} else if tb.sourceURL != \"\" {\n\t\tres = getDataRes(tb.getDataFromURL(param))\n\t} else if tb.Detail.GetDataFn != nil {\n\t\tres = getDataRes(tb.Detail.GetDataFn(param))\n\t} else if tb.Info.GetDataFn != nil {\n\t\tres = getDataRes(tb.Info.GetDataFn(param))\n\t} else {\n\n\t\tcolumns, _ = tb.getColumns(tb.Form.Table)\n\n\t\tvar (\n\t\t\tfields, joinFields, joins, groupBy = \"\", \"\", \"\", \"\"\n\n\t\t\terr            error\n\t\t\tjoinTables     = make([]string, 0)\n\t\t\targs           = []interface{}{id}\n\t\t\tconnection     = tb.db()\n\t\t\tdelimiter      = connection.GetDelimiter()\n\t\t\tdelimiter2     = connection.GetDelimiter2()\n\t\t\ttableName      = modules.Delimiter(delimiter, delimiter2, tb.GetForm().Table)\n\t\t\tpk             = tableName + \".\" + modules.Delimiter(delimiter, delimiter2, tb.PrimaryKey.Name)\n\t\t\tqueryStatement = \"select %s from %s %s where \" + pk + \" = ? %s \"\n\t\t)\n\n\t\tfor i := 0; i < len(tb.Form.FieldList); i++ {\n\n\t\t\tif tb.Form.FieldList[i].Field != pk && modules.InArray(columns, tb.Form.FieldList[i].Field) &&\n\t\t\t\t!tb.Form.FieldList[i].Joins.Valid() {\n\t\t\t\tfields += tableName + \".\" + modules.FilterField(tb.Form.FieldList[i].Field, delimiter, delimiter2) + \",\"\n\t\t\t}\n\n\t\t\tif tb.Form.FieldList[i].Joins.Valid() {\n\t\t\t\theadField := tb.Form.FieldList[i].Joins.Last().GetTableName() + parameter.FilterParamJoinInfix + tb.Form.FieldList[i].Field\n\t\t\t\tjoinFields += db.GetAggregationExpression(connection.Name(), tb.Form.FieldList[i].Joins.Last().GetTableName(delimiter, delimiter2)+\".\"+\n\t\t\t\t\tmodules.FilterField(tb.Form.FieldList[i].Field, delimiter, delimiter2), headField, types.JoinFieldValueDelimiter) + \",\"\n\t\t\t\tfor _, join := range tb.Form.FieldList[i].Joins {\n\t\t\t\t\tif !modules.InArray(joinTables, join.GetTableName(delimiter, delimiter2)) {\n\t\t\t\t\t\tjoinTables = append(joinTables, join.GetTableName(delimiter, delimiter2))\n\t\t\t\t\t\tif join.BaseTable == \"\" {\n\t\t\t\t\t\t\tjoin.BaseTable = tableName\n\t\t\t\t\t\t}\n\t\t\t\t\t\tjoins += \" left join \" + modules.FilterField(join.Table, delimiter, delimiter2) + \" \" + join.TableAlias + \" on \" +\n\t\t\t\t\t\t\tjoin.GetTableName(delimiter, delimiter2) + \".\" + modules.FilterField(join.JoinField, delimiter, delimiter2) + \" = \" +\n\t\t\t\t\t\t\tjoin.BaseTable + \".\" + modules.FilterField(join.Field, delimiter, delimiter2)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfields += pk\n\t\tgroupFields := fields\n\n\t\tif joinFields != \"\" {\n\t\t\tfields += \",\" + joinFields[:len(joinFields)-1]\n\t\t\tif connection.Name() == db.DriverMssql {\n\t\t\t\tfor i := 0; i < len(tb.Form.FieldList); i++ {\n\t\t\t\t\tif tb.Form.FieldList[i].TypeName == db.Text || tb.Form.FieldList[i].TypeName == db.Longtext {\n\t\t\t\t\t\tf := modules.Delimiter(connection.GetDelimiter(), connection.GetDelimiter2(), tb.Form.FieldList[i].Field)\n\t\t\t\t\t\theadField := tb.Info.Table + \".\" + f\n\t\t\t\t\t\tfields = strings.ReplaceAll(fields, headField, \"CAST(\"+headField+\" AS NVARCHAR(MAX)) as \"+f)\n\t\t\t\t\t\tgroupFields = strings.ReplaceAll(groupFields, headField, \"CAST(\"+headField+\" AS NVARCHAR(MAX))\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif len(joinTables) > 0 {\n\t\t\tif connection.Name() == db.DriverMssql || connection.Name() == db.DriverPostgresql {\n\t\t\t\tgroupBy = \" GROUP BY \" + groupFields\n\t\t\t} else {\n\t\t\t\tgroupBy = \" GROUP BY \" + pk\n\t\t\t}\n\t\t}\n\n\t\tqueryCmd := fmt.Sprintf(queryStatement, fields, tableName, joins, groupBy)\n\n\t\tlogger.LogSQL(queryCmd, args)\n\n\t\tresult, err := connection.QueryWithConnection(tb.connection, queryCmd, args...)\n\n\t\tif err != nil {\n\t\t\treturn FormInfo{Title: tb.Form.Title, Description: tb.Form.Description}, err\n\t\t}\n\n\t\tif len(result) == 0 {\n\t\t\treturn FormInfo{Title: tb.Form.Title, Description: tb.Form.Description}, errors.New(errs.WrongID)\n\t\t}\n\n\t\tres = result[0]\n\t}\n\n\tvar (\n\t\tgroupFormList = make([]types.FormFields, 0)\n\t\tgroupHeaders  = make([]string, 0)\n\t)\n\n\tif len(tb.Form.TabGroups) > 0 {\n\t\tgroupFormList, groupHeaders = tb.Form.GroupFieldWithValue(tb.PrimaryKey.Name, id, columns, res, tb.sqlObjOrNil)\n\t\treturn FormInfo{\n\t\t\tFieldList:         tb.Form.FieldList,\n\t\t\tGroupFieldList:    groupFormList,\n\t\t\tGroupFieldHeaders: groupHeaders,\n\t\t\tTitle:             tb.Form.Title,\n\t\t\tDescription:       tb.Form.Description,\n\t\t}, nil\n\t}\n\n\tvar fieldList = tb.Form.FieldsWithValue(tb.PrimaryKey.Name, id, columns, res, tb.sqlObjOrNil)\n\n\treturn FormInfo{\n\t\tFieldList:         fieldList,\n\t\tGroupFieldList:    groupFormList,\n\t\tGroupFieldHeaders: groupHeaders,\n\t\tTitle:             tb.Form.Title,\n\t\tDescription:       tb.Form.Description,\n\t}, nil\n}\n\n// UpdateData update data.\nfunc (tb *DefaultTable) UpdateData(ctx *context.Context, dataList form.Values) error {\n\n\tdataList.Add(form.PostTypeKey, \"0\")\n\n\tvar (\n\t\terrMsg = \"\"\n\t\terr    error\n\t)\n\n\tif tb.Form.PostHook != nil {\n\t\tdefer func() {\n\t\t\tdataList.Add(form.PostTypeKey, \"0\")\n\t\t\tdataList.Add(form.PostResultKey, errMsg)\n\t\t\tgo func() {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif err := recover(); err != nil {\n\t\t\t\t\t\tlogger.ErrorCtx(ctx, \"UpdateData error %+v\", err)\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\terr := tb.Form.PostHook(dataList)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlogger.ErrorCtx(ctx, \"UpdateData PostHook error %+v\", err)\n\t\t\t\t}\n\t\t\t}()\n\t\t}()\n\t}\n\n\tif tb.Form.Validator != nil {\n\t\tif err := tb.Form.Validator(dataList); err != nil {\n\t\t\terrMsg = \"post error: \" + err.Error()\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif tb.Form.PreProcessFn != nil {\n\t\tdataList = tb.Form.PreProcessFn(dataList)\n\t}\n\n\tif tb.Form.UpdateFn != nil {\n\t\tdataList.Delete(form.PostTypeKey)\n\t\terr = tb.Form.UpdateFn(tb.PreProcessValue(dataList, types.PostTypeUpdate))\n\t\tif err != nil {\n\t\t\terrMsg = \"post error: \" + err.Error()\n\t\t}\n\t\treturn err\n\t}\n\n\tif len(dataList) == 0 {\n\t\treturn nil\n\t}\n\n\t_, err = tb.sql().Table(tb.Form.Table).\n\t\tWhere(tb.PrimaryKey.Name, \"=\", dataList.Get(tb.PrimaryKey.Name)).\n\t\tUpdate(tb.getInjectValueFromFormValue(dataList, types.PostTypeUpdate))\n\n\t// NOTE: some errors should be ignored.\n\tif db.CheckError(err, db.UPDATE) {\n\t\tif err != nil {\n\t\t\terrMsg = \"post error: \" + err.Error()\n\t\t}\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// InsertData insert data.\nfunc (tb *DefaultTable) InsertData(ctx *context.Context, dataList form.Values) error {\n\n\tdataList.Add(form.PostTypeKey, \"1\")\n\n\tvar (\n\t\tid     = int64(0)\n\t\terr    error\n\t\terrMsg = \"\"\n\t\tf      = tb.GetActualNewForm()\n\t)\n\n\tif f.PostHook != nil {\n\t\tdefer func() {\n\t\t\tdataList.Add(form.PostTypeKey, \"1\")\n\t\t\tdataList.Add(tb.GetPrimaryKey().Name, strconv.Itoa(int(id)))\n\t\t\tdataList.Add(form.PostResultKey, errMsg)\n\n\t\t\tgo func() {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif err := recover(); err != nil {\n\t\t\t\t\t\tlogger.ErrorCtx(ctx, \"InsertData error %+v\", err)\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\terr := f.PostHook(dataList)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlogger.ErrorCtx(ctx, \"InsertData PostHook error %+v\", err)\n\t\t\t\t}\n\t\t\t}()\n\t\t}()\n\t}\n\n\tif f.Validator != nil {\n\t\tif err := f.Validator(dataList); err != nil {\n\t\t\terrMsg = \"post error: \" + err.Error()\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif f.PreProcessFn != nil {\n\t\tdataList = f.PreProcessFn(dataList)\n\t}\n\n\tif f.InsertFn != nil {\n\t\tdataList.Delete(form.PostTypeKey)\n\t\terr = f.InsertFn(tb.PreProcessValue(dataList, types.PostTypeCreate))\n\t\tif err != nil {\n\t\t\terrMsg = \"post error: \" + err.Error()\n\t\t}\n\t\treturn err\n\t}\n\n\tif len(dataList) == 0 {\n\t\treturn nil\n\t}\n\n\tid, err = tb.sql().Table(f.Table).Insert(tb.getInjectValueFromFormValue(dataList, types.PostTypeCreate))\n\n\t// NOTE: some errors should be ignored.\n\tif db.CheckError(err, db.INSERT) {\n\t\terrMsg = \"post error: \" + err.Error()\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (tb *DefaultTable) getInjectValueFromFormValue(dataList form.Values, typ types.PostType) dialect.H {\n\n\tvar (\n\t\tvalue         = make(dialect.H)\n\t\texceptString  = make([]string, 0)\n\t\tcolumns, auto = tb.getColumns(tb.Form.Table)\n\n\t\tfun types.PostFieldFilterFn\n\t)\n\n\t// If a key is a auto increment primary key, it can`t be insert or update.\n\tif auto {\n\t\texceptString = []string{tb.PrimaryKey.Name, form.PreviousKey, form.MethodKey, form.TokenKey,\n\t\t\tconstant.IframeKey, constant.IframeIDKey}\n\t} else {\n\t\texceptString = []string{form.PreviousKey, form.MethodKey, form.TokenKey,\n\t\t\tconstant.IframeKey, constant.IframeIDKey}\n\t}\n\n\tif !dataList.IsSingleUpdatePost() {\n\t\tfor i := 0; i < len(tb.Form.FieldList); i++ {\n\t\t\tif tb.Form.FieldList[i].FormType.IsMultiSelect() {\n\t\t\t\tif _, ok := dataList[tb.Form.FieldList[i].Field+\"[]\"]; !ok {\n\t\t\t\t\tdataList[tb.Form.FieldList[i].Field+\"[]\"] = []string{\"\"}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdataList = dataList.RemoveRemark()\n\n\tfor k, v := range dataList {\n\t\tk = strings.ReplaceAll(k, \"[]\", \"\")\n\t\tif !modules.InArray(exceptString, k) {\n\t\t\tif modules.InArray(columns, k) {\n\t\t\t\tfield := tb.Form.FieldList.FindByFieldName(k)\n\t\t\t\tdelimiter := \",\"\n\t\t\t\tif field != nil {\n\t\t\t\t\tfun = field.PostFilterFn\n\t\t\t\t\tdelimiter = modules.SetDefault(field.DefaultOptionDelimiter, \",\")\n\t\t\t\t}\n\t\t\t\tvv := modules.RemoveBlankFromArray(v)\n\t\t\t\tif fun != nil {\n\t\t\t\t\tvalue[k] = fun(types.PostFieldModel{\n\t\t\t\t\t\tID:       dataList.Get(tb.PrimaryKey.Name),\n\t\t\t\t\t\tValue:    vv,\n\t\t\t\t\t\tRow:      dataList.ToMap(),\n\t\t\t\t\t\tPostType: typ,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tif len(vv) > 1 {\n\t\t\t\t\t\tvalue[k] = strings.Join(vv, delimiter)\n\t\t\t\t\t} else if len(vv) > 0 {\n\t\t\t\t\t\tvalue[k] = vv[0]\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue[k] = \"\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfield := tb.Form.FieldList.FindByFieldName(k)\n\t\t\t\tif field != nil && field.PostFilterFn != nil {\n\t\t\t\t\tfield.PostFilterFn(types.PostFieldModel{\n\t\t\t\t\t\tID:       dataList.Get(tb.PrimaryKey.Name),\n\t\t\t\t\t\tValue:    modules.RemoveBlankFromArray(v),\n\t\t\t\t\t\tRow:      dataList.ToMap(),\n\t\t\t\t\t\tPostType: typ,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn value\n}\n\nfunc (tb *DefaultTable) PreProcessValue(dataList form.Values, typ types.PostType) form.Values {\n\n\texceptString := []string{form.PreviousKey, form.MethodKey, form.TokenKey,\n\t\tconstant.IframeKey, constant.IframeIDKey}\n\tdataList = dataList.RemoveRemark()\n\tvar fun types.PostFieldFilterFn\n\n\tfor k, v := range dataList {\n\t\tk = strings.ReplaceAll(k, \"[]\", \"\")\n\t\tif !modules.InArray(exceptString, k) {\n\t\t\tfield := tb.Form.FieldList.FindByFieldName(k)\n\t\t\tif field != nil {\n\t\t\t\tfun = field.PostFilterFn\n\t\t\t}\n\t\t\tvv := modules.RemoveBlankFromArray(v)\n\t\t\tif fun != nil {\n\t\t\t\tdataList.Add(k, fmt.Sprintf(\"%s\", fun(types.PostFieldModel{\n\t\t\t\t\tID:       dataList.Get(tb.PrimaryKey.Name),\n\t\t\t\t\tValue:    vv,\n\t\t\t\t\tRow:      dataList.ToMap(),\n\t\t\t\t\tPostType: typ,\n\t\t\t\t})))\n\t\t\t}\n\t\t}\n\t}\n\treturn dataList\n}\n\n// DeleteData delete data.\nfunc (tb *DefaultTable) DeleteData(id string) error {\n\n\tvar (\n\t\tidArr = strings.Split(id, \",\")\n\t\terr   error\n\t)\n\n\tif tb.Info.DeleteHook != nil {\n\t\tdefer func() {\n\t\t\tgo func() {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif recoverErr := recover(); recoverErr != nil {\n\t\t\t\t\t\tlogger.Error(recoverErr)\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\tif hookErr := tb.Info.DeleteHook(idArr); hookErr != nil {\n\t\t\t\t\tlogger.Error(hookErr)\n\t\t\t\t}\n\t\t\t}()\n\t\t}()\n\t}\n\n\tif tb.Info.DeleteHookWithRes != nil {\n\t\tdefer func() {\n\t\t\tgo func() {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif recoverErr := recover(); recoverErr != nil {\n\t\t\t\t\t\tlogger.Error(recoverErr)\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\tif hookErr := tb.Info.DeleteHookWithRes(idArr, err); hookErr != nil {\n\t\t\t\t\tlogger.Error(hookErr)\n\t\t\t\t}\n\t\t\t}()\n\t\t}()\n\t}\n\n\tif tb.Info.PreDeleteFn != nil {\n\t\tif err = tb.Info.PreDeleteFn(idArr); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif tb.Info.DeleteFn != nil {\n\t\terr = tb.Info.DeleteFn(idArr)\n\t\treturn err\n\t}\n\n\tif len(idArr) == 0 || tb.Info.Table == \"\" {\n\t\terr = errors.New(\"delete error: wrong parameter\")\n\t\treturn err\n\t}\n\n\terr = tb.delete(tb.Info.Table, tb.PrimaryKey.Name, idArr)\n\treturn err\n}\n\nfunc (tb *DefaultTable) GetNewFormInfo() FormInfo {\n\n\tf := tb.GetActualNewForm()\n\n\tif len(f.TabGroups) == 0 {\n\t\treturn FormInfo{FieldList: f.FieldsWithDefaultValue(tb.sqlObjOrNil)}\n\t}\n\n\tnewForm, headers := f.GroupField(tb.sqlObjOrNil)\n\n\treturn FormInfo{GroupFieldList: newForm, GroupFieldHeaders: headers}\n}\n\n// ***************************************\n// helper function for database operation\n// ***************************************\n\nfunc (tb *DefaultTable) delete(table, key string, values []string) error {\n\n\tvar vals = make([]interface{}, len(values))\n\tfor i, v := range values {\n\t\tvals[i] = v\n\t}\n\n\treturn tb.sql().Table(table).\n\t\tWhereIn(key, vals).\n\t\tDelete()\n}\n\nfunc (tb *DefaultTable) getTheadAndFilterForm(params parameter.Parameters, columns Columns) (types.Thead,\n\tstring, string, string, []string, []types.FormField) {\n\n\treturn tb.Info.FieldList.GetTheadAndFilterForm(types.TableInfo{\n\t\tTable:      tb.Info.Table,\n\t\tDelimiter:  tb.delimiter(),\n\t\tDelimiter2: tb.delimiter2(),\n\t\tDriver:     tb.connectionDriver,\n\t\tPrimaryKey: tb.PrimaryKey.Name,\n\t}, params, columns, tb.sqlObjOrNil)\n}\n\n// db is a helper function return raw db connection.\nfunc (tb *DefaultTable) db() db.Connection {\n\tif tb.dbObj == nil {\n\t\ttb.dbObj = db.GetConnectionFromService(services.Get(tb.connectionDriver))\n\t}\n\treturn tb.dbObj\n}\n\nfunc (tb *DefaultTable) delimiter() string {\n\tif tb.getDataFromDB() {\n\t\treturn tb.db().GetDelimiter()\n\t}\n\treturn \"\"\n}\n\nfunc (tb *DefaultTable) delimiter2() string {\n\tif tb.getDataFromDB() {\n\t\treturn tb.db().GetDelimiter2()\n\t}\n\treturn \"\"\n}\n\nfunc (tb *DefaultTable) getDataFromDB() bool {\n\treturn tb.sourceURL == \"\" && tb.getDataFun == nil && tb.Info.GetDataFn == nil && tb.Detail.GetDataFn == nil\n}\n\n// sql is a helper function return db sql.\nfunc (tb *DefaultTable) sql() *db.SQL {\n\treturn db.WithDriverAndConnection(tb.connection, tb.db())\n}\n\n// sqlObjOrNil is a helper function return db sql obj or nil.\nfunc (tb *DefaultTable) sqlObjOrNil() *db.SQL {\n\tif tb.connectionDriver != \"\" && tb.getDataFromDB() {\n\t\treturn db.WithDriverAndConnection(tb.connection, tb.db())\n\t}\n\treturn nil\n}\n\ntype Columns []string\n\nfunc (tb *DefaultTable) getColumns(table string) (Columns, bool) {\n\n\tcolumnsModel, _ := tb.sql().Table(table).ShowColumns()\n\n\tcolumns := make(Columns, len(columnsModel))\n\tswitch tb.connectionDriver {\n\tcase db.DriverPostgresql:\n\t\tauto := false\n\t\tfor key, model := range columnsModel {\n\t\t\tcolumns[key] = model[\"column_name\"].(string)\n\t\t\tif columns[key] == tb.PrimaryKey.Name {\n\t\t\t\tif v, ok := model[\"column_default\"].(string); ok {\n\t\t\t\t\tif strings.Contains(v, \"nextval\") {\n\t\t\t\t\t\tauto = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn columns, auto\n\tcase db.DriverMysql:\n\t\tauto := false\n\t\tfor key, model := range columnsModel {\n\t\t\tcolumns[key] = model[\"Field\"].(string)\n\t\t\tif columns[key] == tb.PrimaryKey.Name {\n\t\t\t\tif v, ok := model[\"Extra\"].(string); ok {\n\t\t\t\t\tif v == \"auto_increment\" {\n\t\t\t\t\t\tauto = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn columns, auto\n\tcase db.DriverSqlite:\n\t\tfor key, model := range columnsModel {\n\t\t\tcolumns[key] = string(model[\"name\"].(string))\n\t\t}\n\n\t\tnum, _ := tb.sql().Table(\"sqlite_sequence\").\n\t\t\tWhere(\"name\", \"=\", tb.GetForm().Table).Count()\n\n\t\treturn columns, num > 0\n\tcase db.DriverMssql:\n\t\tfor key, model := range columnsModel {\n\t\t\tcolumns[key] = string(model[\"column_name\"].(string))\n\t\t}\n\t\treturn columns, true\n\tdefault:\n\t\tpanic(\"wrong driver\")\n\t}\n}\n"
  },
  {
    "path": "plugins/admin/modules/table/default_test.go",
    "content": "package table\n"
  },
  {
    "path": "plugins/admin/modules/table/generators.go",
    "content": "package table\n\nimport (\n\t\"database/sql\"\n\t\"errors\"\n\t\"fmt\"\n\ttmpl \"html/template\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/collection\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\terrs \"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/ui\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\tform2 \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/tools\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n\tselection \"github.com/GoAdminGroup/go-admin/template/types/form/select\"\n\t\"github.com/GoAdminGroup/html\"\n\t\"golang.org/x/crypto/bcrypt\"\n\t\"golang.org/x/text/cases\"\n\ttextLang \"golang.org/x/text/language\"\n)\n\ntype SystemTable struct {\n\tconn db.Connection\n\tc    *config.Config\n}\n\nfunc NewSystemTable(conn db.Connection, c *config.Config) *SystemTable {\n\treturn &SystemTable{conn: conn, c: c}\n}\n\n\nvar filterType = types.FilterType{NoIcon: true, HeadWidth: 4, InputWidth: 8}\n\nfunc (s *SystemTable) GetManagerTable(ctx *context.Context) (managerTable Table) {\n\tmanagerTable = NewDefaultTable(ctx, DefaultConfigWithDriver(config.GetDatabases().GetDefault().Driver))\n\n\tinfo := managerTable.GetInfo().AddXssJsFilter().SetFilterFormLayout(form.LayoutFilter)\n\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tfilterType := types.FilterType{NoIcon: true, HeadWidth: 4, InputWidth: 8}\n\tinfo.AddField(lg(\"Name\"), \"username\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"Nickname\"), \"name\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"role\"), \"name\", db.Varchar).\n\t\tFieldJoin(types.Join{\n\t\t\tTable:     \"goadmin_role_users\",\n\t\t\tJoinField: \"user_id\",\n\t\t\tField:     \"id\",\n\t\t}).\n\t\tFieldJoin(types.Join{\n\t\t\tTable:     \"goadmin_roles\",\n\t\t\tJoinField: \"id\",\n\t\t\tField:     \"role_id\",\n\t\t\tBaseTable: \"goadmin_role_users\",\n\t\t}).\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tlabels := template.HTML(\"\")\n\t\t\tlabelTpl := label(ctx).SetType(\"success\")\n\n\t\t\tlabelValues := strings.Split(model.Value, types.JoinFieldValueDelimiter)\n\t\t\tfor key, label := range labelValues {\n\t\t\t\tif key == len(labelValues)-1 {\n\t\t\t\t\tlabels += labelTpl.SetContent(template.HTML(label)).GetContent()\n\t\t\t\t} else {\n\t\t\t\t\tlabels += labelTpl.SetContent(template.HTML(label)).GetContent() + \"<br><br>\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif labels == template.HTML(\"\") {\n\t\t\t\treturn lg(\"no roles\")\n\t\t\t}\n\n\t\t\treturn labels\n\t\t}).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp)\n\tinfo.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp)\n\n\tinfo.SetTable(\"goadmin_users\").\n\t\tSetTitle(lg(\"Managers\")).\n\t\tSetDescription(lg(\"Managers manage\")).\n\t\tSetDeleteFn(func(idArr []string) error {\n\n\t\t\tvar ids = interfaces(idArr)\n\n\t\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\n\t\t\t\tdeleteUserRoleErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_role_users\").\n\t\t\t\t\tWhereIn(\"user_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteUserRoleErr, db.DELETE) {\n\t\t\t\t\treturn deleteUserRoleErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteUserPermissionErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_user_permissions\").\n\t\t\t\t\tWhereIn(\"user_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteUserPermissionErr, db.DELETE) {\n\t\t\t\t\treturn deleteUserPermissionErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteUserErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_users\").\n\t\t\t\t\tWhereIn(\"id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteUserErr, db.DELETE) {\n\t\t\t\t\treturn deleteUserErr, nil\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t})\n\n\t\t\treturn txErr\n\t\t})\n\n\tformList := managerTable.GetForm().AddXssJsFilter()\n\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(lg(\"Name\"), \"username\", db.Varchar, form.Text).\n\t\tFieldHelpMsg(template.HTML(lg(\"use for login\"))).FieldMust()\n\tformList.AddField(lg(\"Nickname\"), \"name\", db.Varchar, form.Text).\n\t\tFieldHelpMsg(template.HTML(lg(\"use to display\"))).FieldMust()\n\tformList.AddField(lg(\"Avatar\"), \"avatar\", db.Varchar, form.File)\n\tformList.AddField(lg(\"role\"), \"role_id\", db.Varchar, form.Select).\n\t\tFieldOptionsFromTable(\"goadmin_roles\", \"slug\", \"id\").\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tvar roles []string\n\n\t\t\tif model.ID == \"\" {\n\t\t\t\treturn roles\n\t\t\t}\n\t\t\troleModel, _ := s.table(\"goadmin_role_users\").Select(\"role_id\").\n\t\t\t\tWhere(\"user_id\", \"=\", model.ID).All()\n\t\t\tfor _, v := range roleModel {\n\t\t\t\troles = append(roles, strconv.FormatInt(v[\"role_id\"].(int64), 10))\n\t\t\t}\n\t\t\treturn roles\n\t\t}).FieldHelpMsg(template.HTML(lg(\"no corresponding options?\")) +\n\t\tlink(\"/admin/info/roles/new\", \"Create here.\"))\n\n\tformList.AddField(lg(\"permission\"), \"permission_id\", db.Varchar, form.Select).\n\t\tFieldOptionsFromTable(\"goadmin_permissions\", \"slug\", \"id\").\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tvar permissions []string\n\n\t\t\tif model.ID == \"\" {\n\t\t\t\treturn permissions\n\t\t\t}\n\t\t\tpermissionModel, _ := s.table(\"goadmin_user_permissions\").\n\t\t\t\tSelect(\"permission_id\").Where(\"user_id\", \"=\", model.ID).All()\n\t\t\tfor _, v := range permissionModel {\n\t\t\t\tpermissions = append(permissions, strconv.FormatInt(v[\"permission_id\"].(int64), 10))\n\t\t\t}\n\t\t\treturn permissions\n\t\t}).FieldHelpMsg(template.HTML(lg(\"no corresponding options?\")) +\n\t\tlink(\"/admin/info/permission/new\", \"Create here.\"))\n\n\tformList.AddField(lg(\"password\"), \"password\", db.Varchar, form.Password).\n\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn \"\"\n\t\t})\n\tformList.AddField(lg(\"confirm password\"), \"password_again\", db.Varchar, form.Password).\n\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn \"\"\n\t\t})\n\n\tformList.SetTable(\"goadmin_users\").SetTitle(lg(\"Managers\")).SetDescription(lg(\"Managers manage\"))\n\tformList.SetUpdateFn(func(values form2.Values) error {\n\n\t\tif values.IsEmpty(\"name\", \"username\") {\n\t\t\treturn errors.New(\"username and password can not be empty\")\n\t\t}\n\n\t\tuser := models.UserWithId(values.Get(\"id\")).SetConn(s.conn)\n\n\t\tpassword := values.Get(\"password\")\n\n\t\tif password != \"\" {\n\n\t\t\tif password != values.Get(\"password_again\") {\n\t\t\t\treturn errors.New(\"password does not match\")\n\t\t\t}\n\n\t\t\tpassword = encodePassword([]byte(values.Get(\"password\")))\n\t\t}\n\n\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\n\t\t\tavatar := values.Get(\"avatar\")\n\n\t\t\tif values.Get(\"avatar__delete_flag\") == \"1\" {\n\t\t\t\tavatar = \"\"\n\t\t\t}\n\n\t\t\t_, updateUserErr := user.WithTx(tx).Update(values.Get(\"username\"),\n\t\t\t\tpassword, values.Get(\"name\"), avatar, values.Get(\"avatar__change_flag\") == \"1\")\n\n\t\t\tif db.CheckError(updateUserErr, db.UPDATE) {\n\t\t\t\treturn updateUserErr, nil\n\t\t\t}\n\n\t\t\tdelRoleErr := user.WithTx(tx).DeleteRoles()\n\n\t\t\tif db.CheckError(delRoleErr, db.DELETE) {\n\t\t\t\treturn delRoleErr, nil\n\t\t\t}\n\n\t\t\tfor i := 0; i < len(values[\"role_id[]\"]); i++ {\n\t\t\t\t_, addRoleErr := user.WithTx(tx).AddRole(values[\"role_id[]\"][i])\n\t\t\t\tif db.CheckError(addRoleErr, db.INSERT) {\n\t\t\t\t\treturn addRoleErr, nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelPermissionErr := user.WithTx(tx).DeletePermissions()\n\n\t\t\tif db.CheckError(delPermissionErr, db.DELETE) {\n\t\t\t\treturn delPermissionErr, nil\n\t\t\t}\n\n\t\t\tfor i := 0; i < len(values[\"permission_id[]\"]); i++ {\n\t\t\t\t_, addPermissionErr := user.WithTx(tx).AddPermission(values[\"permission_id[]\"][i])\n\t\t\t\tif db.CheckError(addPermissionErr, db.INSERT) {\n\t\t\t\t\treturn addPermissionErr, nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nil, nil\n\t\t})\n\n\t\treturn txErr\n\t})\n\tformList.SetInsertFn(func(values form2.Values) error {\n\t\tif values.IsEmpty(\"name\", \"username\", \"password\") {\n\t\t\treturn errors.New(\"username and password can not be empty\")\n\t\t}\n\n\t\tpassword := values.Get(\"password\")\n\n\t\tif password != values.Get(\"password_again\") {\n\t\t\treturn errors.New(\"password does not match\")\n\t\t}\n\n\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\n\t\t\tuser, createUserErr := models.User().WithTx(tx).SetConn(s.conn).New(values.Get(\"username\"),\n\t\t\t\tencodePassword([]byte(values.Get(\"password\"))),\n\t\t\t\tvalues.Get(\"name\"),\n\t\t\t\tvalues.Get(\"avatar\"))\n\n\t\t\tif db.CheckError(createUserErr, db.INSERT) {\n\t\t\t\treturn createUserErr, nil\n\t\t\t}\n\n\t\t\tfor i := 0; i < len(values[\"role_id[]\"]); i++ {\n\t\t\t\t_, addRoleErr := user.WithTx(tx).AddRole(values[\"role_id[]\"][i])\n\t\t\t\tif db.CheckError(addRoleErr, db.INSERT) {\n\t\t\t\t\treturn addRoleErr, nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor i := 0; i < len(values[\"permission_id[]\"]); i++ {\n\t\t\t\t_, addPermissionErr := user.WithTx(tx).AddPermission(values[\"permission_id[]\"][i])\n\t\t\t\tif db.CheckError(addPermissionErr, db.INSERT) {\n\t\t\t\t\treturn addPermissionErr, nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nil, nil\n\t\t})\n\t\treturn txErr\n\t})\n\n\tdetail := managerTable.GetDetail()\n\tdetail.AddField(\"ID\", \"id\", db.Int)\n\tdetail.AddField(lg(\"Name\"), \"username\", db.Varchar)\n\tdetail.AddField(lg(\"Avatar\"), \"avatar\", db.Varchar).\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tif model.Value == \"\" || config.GetStore().Prefix == \"\" {\n\t\t\t\tmodel.Value = config.Url(\"/assets/dist/img/avatar04.png\")\n\t\t\t} else {\n\t\t\t\tmodel.Value = config.GetStore().URL(model.Value)\n\t\t\t}\n\t\t\treturn template.Default(ctx).Image().\n\t\t\t\tSetSrc(template.HTML(model.Value)).\n\t\t\t\tSetHeight(\"120\").SetWidth(\"120\").WithModal().GetContent()\n\t\t})\n\tdetail.AddField(lg(\"Nickname\"), \"name\", db.Varchar)\n\tdetail.AddField(lg(\"role\"), \"roles\", db.Varchar).\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tlabelModels, _ := s.table(\"goadmin_role_users\").\n\t\t\t\tSelect(\"goadmin_roles.name\").\n\t\t\t\tLeftJoin(\"goadmin_roles\", \"goadmin_roles.id\", \"=\", \"goadmin_role_users.role_id\").\n\t\t\t\tWhere(\"user_id\", \"=\", model.ID).\n\t\t\t\tAll()\n\n\t\t\tlabels := template.HTML(\"\")\n\t\t\tlabelTpl := label(ctx).SetType(\"success\")\n\n\t\t\tfor key, label := range labelModels {\n\t\t\t\tif key == len(labelModels)-1 {\n\t\t\t\t\tlabels += labelTpl.SetContent(template.HTML(label[\"name\"].(string))).GetContent()\n\t\t\t\t} else {\n\t\t\t\t\tlabels += labelTpl.SetContent(template.HTML(label[\"name\"].(string))).GetContent() + \"<br><br>\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif labels == template.HTML(\"\") {\n\t\t\t\treturn lg(\"no roles\")\n\t\t\t}\n\n\t\t\treturn labels\n\t\t})\n\tdetail.AddField(lg(\"permission\"), \"roles\", db.Varchar).\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tpermissionModel, _ := s.table(\"goadmin_user_permissions\").\n\t\t\t\tSelect(\"goadmin_permissions.name\").\n\t\t\t\tLeftJoin(\"goadmin_permissions\", \"goadmin_permissions.id\", \"=\", \"goadmin_user_permissions.permission_id\").\n\t\t\t\tWhere(\"user_id\", \"=\", model.ID).\n\t\t\t\tAll()\n\n\t\t\tpermissions := template.HTML(\"\")\n\t\t\tpermissionTpl := label(ctx).SetType(\"success\")\n\n\t\t\tfor key, label := range permissionModel {\n\t\t\t\tif key == len(permissionModel)-1 {\n\t\t\t\t\tpermissions += permissionTpl.SetContent(template.HTML(label[\"name\"].(string))).GetContent()\n\t\t\t\t} else {\n\t\t\t\t\tpermissions += permissionTpl.SetContent(template.HTML(label[\"name\"].(string))).GetContent() + \"<br><br>\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn permissions\n\t\t})\n\tdetail.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp)\n\tdetail.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp)\n\n\treturn\n}\n\nfunc (s *SystemTable) GetNormalManagerTable(ctx *context.Context) (managerTable Table) {\n\tmanagerTable = NewDefaultTable(ctx, DefaultConfigWithDriver(config.GetDatabases().GetDefault().Driver))\n\n\tinfo := managerTable.GetInfo().AddXssJsFilter().SetFilterFormLayout(form.LayoutFilter)\n\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(lg(\"Name\"), \"username\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"Nickname\"), \"name\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"role\"), \"name\", db.Varchar).\n\t\tFieldJoin(types.Join{\n\t\t\tTable:     \"goadmin_role_users\",\n\t\t\tJoinField: \"user_id\",\n\t\t\tField:     \"id\",\n\t\t}).\n\t\tFieldJoin(types.Join{\n\t\t\tTable:     \"goadmin_roles\",\n\t\t\tJoinField: \"id\",\n\t\t\tField:     \"role_id\",\n\t\t\tBaseTable: \"goadmin_role_users\",\n\t\t}).\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tlabels := template.HTML(\"\")\n\t\t\tlabelTpl := label(ctx).SetType(\"success\")\n\n\t\t\tlabelValues := strings.Split(model.Value, types.JoinFieldValueDelimiter)\n\t\t\tfor key, label := range labelValues {\n\t\t\t\tif key == len(labelValues)-1 {\n\t\t\t\t\tlabels += labelTpl.SetContent(template.HTML(label)).GetContent()\n\t\t\t\t} else {\n\t\t\t\t\tlabels += labelTpl.SetContent(template.HTML(label)).GetContent() + \"<br><br>\"\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif labels == template.HTML(\"\") {\n\t\t\t\treturn lg(\"no roles\")\n\t\t\t}\n\n\t\t\treturn labels\n\t\t})\n\tinfo.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp)\n\tinfo.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp)\n\n\tinfo.SetTable(\"goadmin_users\").\n\t\tSetTitle(lg(\"Managers\")).\n\t\tSetDescription(lg(\"Managers manage\")).\n\t\tSetDeleteFn(func(idArr []string) error {\n\n\t\t\tvar ids = interfaces(idArr)\n\n\t\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\n\t\t\t\tdeleteUserRoleErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_role_users\").\n\t\t\t\t\tWhereIn(\"user_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteUserRoleErr, db.DELETE) {\n\t\t\t\t\treturn deleteUserRoleErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteUserPermissionErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_user_permissions\").\n\t\t\t\t\tWhereIn(\"user_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteUserPermissionErr, db.DELETE) {\n\t\t\t\t\treturn deleteUserPermissionErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteUserErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_users\").\n\t\t\t\t\tWhereIn(\"id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteUserErr, db.DELETE) {\n\t\t\t\t\treturn deleteUserErr, nil\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t})\n\n\t\t\treturn txErr\n\t\t})\n\n\tformList := managerTable.GetForm().AddXssJsFilter()\n\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(lg(\"Name\"), \"username\", db.Varchar, form.Text).FieldHelpMsg(template.HTML(lg(\"use for login\"))).FieldMust()\n\tformList.AddField(lg(\"Nickname\"), \"name\", db.Varchar, form.Text).FieldHelpMsg(template.HTML(lg(\"use to display\"))).FieldMust()\n\tformList.AddField(lg(\"Avatar\"), \"avatar\", db.Varchar, form.File)\n\tformList.AddField(lg(\"password\"), \"password\", db.Varchar, form.Password).\n\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn \"\"\n\t\t})\n\tformList.AddField(lg(\"confirm password\"), \"password_again\", db.Varchar, form.Password).\n\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn \"\"\n\t\t})\n\n\tformList.SetTable(\"goadmin_users\").SetTitle(lg(\"Managers\")).SetDescription(lg(\"Managers\"))\n\tformList.SetUpdateFn(func(values form2.Values) error {\n\n\t\tif values.IsEmpty(\"name\", \"username\") {\n\t\t\treturn errors.New(\"username and password can not be empty\")\n\t\t}\n\n\t\tuser := models.UserWithId(values.Get(\"id\")).SetConn(s.conn)\n\n\t\tif values.Has(\"permission\", \"role\") {\n\t\t\treturn errors.New(errs.NoPermission)\n\t\t}\n\n\t\tpassword := values.Get(\"password\")\n\n\t\tif password != \"\" {\n\n\t\t\tif password != values.Get(\"password_again\") {\n\t\t\t\treturn errors.New(\"password does not match\")\n\t\t\t}\n\n\t\t\tpassword = encodePassword([]byte(values.Get(\"password\")))\n\t\t}\n\n\t\tavatar := values.Get(\"avatar\")\n\n\t\tif values.Get(\"avatar__delete_flag\") == \"1\" {\n\t\t\tavatar = \"\"\n\t\t}\n\n\t\t_, updateUserErr := user.Update(values.Get(\"username\"),\n\t\t\tpassword, values.Get(\"name\"), avatar, values.Get(\"avatar__change_flag\") == \"1\")\n\n\t\tif db.CheckError(updateUserErr, db.UPDATE) {\n\t\t\treturn updateUserErr\n\t\t}\n\n\t\treturn nil\n\t})\n\tformList.SetInsertFn(func(values form2.Values) error {\n\t\tif values.IsEmpty(\"name\", \"username\", \"password\") {\n\t\t\treturn errors.New(\"username and password can not be empty\")\n\t\t}\n\n\t\tpassword := values.Get(\"password\")\n\n\t\tif password != values.Get(\"password_again\") {\n\t\t\treturn errors.New(\"password does not match\")\n\t\t}\n\n\t\tif values.Has(\"permission\", \"role\") {\n\t\t\treturn errors.New(errs.NoPermission)\n\t\t}\n\n\t\t_, createUserErr := models.User().SetConn(s.conn).New(values.Get(\"username\"),\n\t\t\tencodePassword([]byte(values.Get(\"password\"))),\n\t\t\tvalues.Get(\"name\"),\n\t\t\tvalues.Get(\"avatar\"))\n\n\t\tif db.CheckError(createUserErr, db.INSERT) {\n\t\t\treturn createUserErr\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn\n}\n\nfunc (s *SystemTable) GetPermissionTable(ctx *context.Context) (permissionTable Table) {\n\tpermissionTable = NewDefaultTable(ctx, DefaultConfigWithDriver(config.GetDatabases().GetDefault().Driver))\n\n\tinfo := permissionTable.GetInfo().AddXssJsFilter().SetFilterFormLayout(form.LayoutFilter)\n\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(lg(\"permission\"), \"name\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"slug\"), \"slug\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"method\"), \"http_method\", db.Varchar).FieldDisplay(func(value types.FieldModel) interface{} {\n\t\tif value.Value == \"\" {\n\t\t\treturn \"All methods\"\n\t\t}\n\t\treturn value.Value\n\t})\n\tinfo.AddField(lg(\"path\"), \"http_path\", db.Varchar).\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tpathArr := strings.Split(model.Value, \"\\n\")\n\t\t\tres := \"\"\n\t\t\tfor i := 0; i < len(pathArr); i++ {\n\t\t\t\tif i == len(pathArr)-1 {\n\t\t\t\t\tres += string(label(ctx).SetContent(template.HTML(pathArr[i])).GetContent())\n\t\t\t\t} else {\n\t\t\t\t\tres += string(label(ctx).SetContent(template.HTML(pathArr[i])).GetContent()) + \"<br><br>\"\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn res\n\t\t})\n\tinfo.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp)\n\tinfo.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp)\n\n\tinfo.SetTable(\"goadmin_permissions\").\n\t\tSetTitle(lg(\"Permission\")).\n\t\tSetDescription(lg(\"Permission Manage\")).\n\t\tSetDeleteFn(func(idArr []string) error {\n\n\t\t\tvar ids = interfaces(idArr)\n\n\t\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\n\t\t\t\tdeleteRolePermissionErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_role_permissions\").\n\t\t\t\t\tWhereIn(\"permission_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteRolePermissionErr, db.DELETE) {\n\t\t\t\t\treturn deleteRolePermissionErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteUserPermissionErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_user_permissions\").\n\t\t\t\t\tWhereIn(\"permission_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteUserPermissionErr, db.DELETE) {\n\t\t\t\t\treturn deleteUserPermissionErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeletePermissionsErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_permissions\").\n\t\t\t\t\tWhereIn(\"id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif deletePermissionsErr != nil {\n\t\t\t\t\treturn deletePermissionsErr, nil\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t})\n\n\t\t\treturn txErr\n\t\t})\n\n\tformList := permissionTable.GetForm().AddXssJsFilter()\n\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(lg(\"permission\"), \"name\", db.Varchar, form.Text).FieldMust()\n\tformList.AddField(lg(\"slug\"), \"slug\", db.Varchar, form.Text).FieldHelpMsg(template.HTML(lg(\"should be unique\"))).FieldMust()\n\tformList.AddField(lg(\"method\"), \"http_method\", db.Varchar, form.Select).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Value: \"GET\", Text: \"GET\"},\n\t\t\t{Value: \"PUT\", Text: \"PUT\"},\n\t\t\t{Value: \"POST\", Text: \"POST\"},\n\t\t\t{Value: \"DELETE\", Text: \"DELETE\"},\n\t\t\t{Value: \"PATCH\", Text: \"PATCH\"},\n\t\t\t{Value: \"OPTIONS\", Text: \"OPTIONS\"},\n\t\t\t{Value: \"HEAD\", Text: \"HEAD\"},\n\t\t}).\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\treturn strings.Split(model.Value, \",\")\n\t\t}).\n\t\tFieldPostFilterFn(func(model types.PostFieldModel) interface{} {\n\t\t\treturn strings.Join(model.Value, \",\")\n\t\t}).\n\t\tFieldHelpMsg(template.HTML(lg(\"all method if empty\")))\n\n\tformList.AddField(lg(\"path\"), \"http_path\", db.Varchar, form.TextArea).\n\t\tFieldPostFilterFn(func(model types.PostFieldModel) interface{} {\n\t\t\treturn strings.TrimSpace(model.Value.Value())\n\t\t}).\n\t\tFieldHelpMsg(template.HTML(lg(\"a path a line, without global prefix\")))\n\tformList.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\tformList.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\n\tformList.SetTable(\"goadmin_permissions\").\n\t\tSetTitle(lg(\"Permission Manage\")).\n\t\tSetDescription(lg(\"Permission Manage\")).\n\t\tSetPostValidator(func(values form2.Values) error {\n\n\t\t\tif values.IsEmpty(\"slug\", \"http_path\", \"name\") {\n\t\t\t\treturn errors.New(\"slug or http_path or name should not be empty\")\n\t\t\t}\n\n\t\t\tif models.Permission().SetConn(s.conn).IsSlugExist(values.Get(\"slug\"), values.Get(\"id\")) {\n\t\t\t\treturn errors.New(\"slug exists\")\n\t\t\t}\n\t\t\treturn nil\n\t\t}).SetPostHook(func(values form2.Values) error {\n\n\t\tif values.IsInsertPost() {\n\t\t\treturn nil\n\t\t}\n\n\t\t_, err := s.connection().Table(\"goadmin_permissions\").\n\t\t\tWhere(\"id\", \"=\", values.Get(\"id\")).\n\t\t\tUpdate(dialect.H{\n\t\t\t\t\"updated_at\": time.Now().Format(\"2006-01-02 15:04:05\"),\n\t\t\t})\n\n\t\tif db.CheckError(err, db.UPDATE) {\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn\n}\n\nfunc (s *SystemTable) GetRolesTable(ctx *context.Context) (roleTable Table) {\n\troleTable = NewDefaultTable(ctx, DefaultConfigWithDriver(config.GetDatabases().GetDefault().Driver))\n\n\tinfo := roleTable.GetInfo().AddXssJsFilter().SetFilterFormLayout(form.LayoutFilter)\n\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(lg(\"role\"), \"name\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"slug\"), \"slug\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp)\n\tinfo.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp)\n\n\tinfo.SetTable(\"goadmin_roles\").\n\t\tSetTitle(lg(\"Roles\")).\n\t\tSetDescription(lg(\"Roles Manage\")).\n\t\tSetDeleteFn(func(idArr []string) error {\n\n\t\t\tvar ids = interfaces(idArr)\n\n\t\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\n\t\t\t\tdeleteRoleUserErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_role_users\").\n\t\t\t\t\tWhereIn(\"role_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteRoleUserErr, db.DELETE) {\n\t\t\t\t\treturn deleteRoleUserErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteRoleMenuErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_role_menu\").\n\t\t\t\t\tWhereIn(\"role_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteRoleMenuErr, db.DELETE) {\n\t\t\t\t\treturn deleteRoleMenuErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteRolePermissionErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_role_permissions\").\n\t\t\t\t\tWhereIn(\"role_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteRolePermissionErr, db.DELETE) {\n\t\t\t\t\treturn deleteRolePermissionErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteRolesErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_roles\").\n\t\t\t\t\tWhereIn(\"id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteRolesErr, db.DELETE) {\n\t\t\t\t\treturn deleteRolesErr, nil\n\t\t\t\t}\n\n\t\t\t\treturn nil, nil\n\t\t\t})\n\n\t\t\treturn txErr\n\t\t})\n\n\tformList := roleTable.GetForm().AddXssJsFilter()\n\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(lg(\"role\"), \"name\", db.Varchar, form.Text).FieldMust()\n\tformList.AddField(lg(\"slug\"), \"slug\", db.Varchar, form.Text).FieldHelpMsg(template.HTML(lg(\"should be unique\"))).FieldMust()\n\tformList.AddField(lg(\"permission\"), \"permission_id\", db.Varchar, form.SelectBox).\n\t\tFieldOptionsFromTable(\"goadmin_permissions\", \"name\", \"id\").\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tvar permissions = make([]string, 0)\n\n\t\t\tif model.ID == \"\" {\n\t\t\t\treturn permissions\n\t\t\t}\n\t\t\tperModel, _ := s.table(\"goadmin_role_permissions\").\n\t\t\t\tSelect(\"permission_id\").\n\t\t\t\tWhere(\"role_id\", \"=\", model.ID).\n\t\t\t\tAll()\n\t\t\tfor _, v := range perModel {\n\t\t\t\tpermissions = append(permissions, strconv.FormatInt(v[\"permission_id\"].(int64), 10))\n\t\t\t}\n\t\t\treturn permissions\n\t\t}).FieldHelpMsg(template.HTML(lg(\"no corresponding options?\")) +\n\t\tlink(\"/admin/info/permission/new\", \"Create here.\"))\n\n\tformList.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\tformList.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\n\tformList.SetTable(\"goadmin_roles\").\n\t\tSetTitle(lg(\"Roles\")).\n\t\tSetDescription(lg(\"Roles Manage\"))\n\n\tformList.SetUpdateFn(func(values form2.Values) error {\n\n\t\tif models.Role().SetConn(s.conn).IsSlugExist(values.Get(\"slug\"), values.Get(\"id\")) {\n\t\t\treturn errors.New(\"slug exists\")\n\t\t}\n\n\t\trole := models.RoleWithId(values.Get(\"id\")).SetConn(s.conn)\n\n\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\n\t\t\t_, updateRoleErr := role.WithTx(tx).Update(values.Get(\"name\"), values.Get(\"slug\"))\n\n\t\t\tif db.CheckError(updateRoleErr, db.UPDATE) {\n\t\t\t\treturn updateRoleErr, nil\n\t\t\t}\n\n\t\t\tdelPermissionErr := role.WithTx(tx).DeletePermissions()\n\n\t\t\tif db.CheckError(delPermissionErr, db.DELETE) {\n\t\t\t\treturn delPermissionErr, nil\n\t\t\t}\n\n\t\t\tfor i := 0; i < len(values[\"permission_id[]\"]); i++ {\n\t\t\t\t_, addPermissionErr := role.WithTx(tx).AddPermission(values[\"permission_id[]\"][i])\n\t\t\t\tif db.CheckError(addPermissionErr, db.INSERT) {\n\t\t\t\t\treturn addPermissionErr, nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nil, nil\n\t\t})\n\n\t\treturn txErr\n\t})\n\n\tformList.SetInsertFn(func(values form2.Values) error {\n\n\t\tif models.Role().SetConn(s.conn).IsSlugExist(values.Get(\"slug\"), \"\") {\n\t\t\treturn errors.New(\"slug exists\")\n\t\t}\n\n\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\t\t\trole, createRoleErr := models.Role().WithTx(tx).SetConn(s.conn).New(values.Get(\"name\"), values.Get(\"slug\"))\n\n\t\t\tif db.CheckError(createRoleErr, db.INSERT) {\n\t\t\t\treturn createRoleErr, nil\n\t\t\t}\n\n\t\t\tfor i := 0; i < len(values[\"permission_id[]\"]); i++ {\n\t\t\t\t_, addPermissionErr := role.WithTx(tx).AddPermission(values[\"permission_id[]\"][i])\n\t\t\t\tif db.CheckError(addPermissionErr, db.INSERT) {\n\t\t\t\t\treturn addPermissionErr, nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nil, nil\n\t\t})\n\n\t\treturn txErr\n\t})\n\n\treturn\n}\n\nfunc (s *SystemTable) GetOpTable(ctx *context.Context) (opTable Table) {\n\topTable = NewDefaultTable(ctx, Config{\n\t\tDriver:     config.GetDatabases().GetDefault().Driver,\n\t\tCanAdd:     false,\n\t\tEditable:   false,\n\t\tDeletable:  config.GetAllowDelOperationLog(),\n\t\tExportable: true,\n\t\tConnection: \"default\",\n\t\tPrimaryKey: PrimaryKey{\n\t\t\tType: db.Int,\n\t\t\tName: DefaultPrimaryKeyName,\n\t\t},\n\t})\n\n\tinfo := opTable.GetInfo().AddXssJsFilter().\n\t\tHideDetailButton().HideEditButton().HideNewButton().SetFilterFormLayout(form.LayoutFilter)\n\n\tif !config.GetAllowDelOperationLog() {\n\t\tinfo = info.HideDeleteButton()\n\t}\n\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(\"userID\", \"user_id\", db.Int).FieldHide()\n\tinfo.AddField(lg(\"user\"), \"name\", db.Varchar).FieldJoin(types.Join{\n\t\tTable:     config.GetAuthUserTable(),\n\t\tJoinField: \"id\",\n\t\tField:     \"user_id\",\n\t}).FieldDisplay(func(value types.FieldModel) interface{} {\n\t\treturn template.Default(ctx).\n\t\t\tLink().\n\t\t\tSetURL(config.Url(\"/info/manager/detail?__goadmin_detail_pk=\") + strconv.Itoa(int(value.Row[\"user_id\"].(int64)))).\n\t\t\tSetContent(template.HTML(value.Value)).\n\t\t\tOpenInNewTab().\n\t\t\tSetTabTitle(\"Manager Detail\").\n\t\t\tGetContent()\n\t})\n\tinfo.AddField(lg(\"path\"), \"path\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"method\"), \"method\", db.Varchar)\n\tinfo.AddField(lg(\"ip\"), \"ip\", db.Varchar).FieldFilterable(filterType)\n\tinfo.AddField(lg(\"content\"), \"input\", db.Text).FieldWidth(230)\n\tinfo.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp)\n\n\tusers, _ := s.table(config.GetAuthUserTable()).Select(\"id\", \"name\").All()\n\toptions := make(types.FieldOptions, len(users))\n\tfor k, user := range users {\n\t\toptions[k].Value = fmt.Sprintf(\"%v\", user[\"id\"])\n\t\toptions[k].Text = fmt.Sprintf(\"%v\", user[\"name\"])\n\t}\n\tinfo.AddSelectBox(ctx, language.Get(\"user\"), options, action.FieldFilter(\"user_id\"))\n\tinfo.AddSelectBox(ctx, language.Get(\"method\"), types.FieldOptions{\n\t\t{Value: \"GET\", Text: \"GET\"},\n\t\t{Value: \"POST\", Text: \"POST\"},\n\t\t{Value: \"OPTIONS\", Text: \"OPTIONS\"},\n\t\t{Value: \"PUT\", Text: \"PUT\"},\n\t\t{Value: \"HEAD\", Text: \"HEAD\"},\n\t\t{Value: \"DELETE\", Text: \"DELETE\"},\n\t}, action.FieldFilter(\"method\"))\n\n\tinfo.SetTable(\"goadmin_operation_log\").\n\t\tSetTitle(lg(\"operation log\")).\n\t\tSetDescription(lg(\"operation log\"))\n\n\tformList := opTable.GetForm().AddXssJsFilter()\n\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(lg(\"userID\"), \"user_id\", db.Int, form.Text)\n\tformList.AddField(lg(\"path\"), \"path\", db.Varchar, form.Text)\n\tformList.AddField(lg(\"method\"), \"method\", db.Varchar, form.Text)\n\tformList.AddField(lg(\"ip\"), \"ip\", db.Varchar, form.Text)\n\tformList.AddField(lg(\"content\"), \"input\", db.Varchar, form.Text)\n\tformList.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\tformList.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\n\tformList.SetTable(\"goadmin_operation_log\").\n\t\tSetTitle(lg(\"operation log\")).\n\t\tSetDescription(lg(\"operation log\"))\n\n\treturn\n}\n\nfunc (s *SystemTable) GetMenuTable(ctx *context.Context) (menuTable Table) {\n\tmenuTable = NewDefaultTable(ctx, DefaultConfigWithDriver(config.GetDatabases().GetDefault().Driver))\n\n\tname := ctx.Query(\"__plugin_name\")\n\n\tinfo := menuTable.GetInfo().AddXssJsFilter().HideFilterArea().Where(\"plugin_name\", \"=\", name)\n\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(lg(\"parent\"), \"parent_id\", db.Int)\n\tinfo.AddField(lg(\"menu name\"), \"title\", db.Varchar)\n\tinfo.AddField(lg(\"icon\"), \"icon\", db.Varchar)\n\tinfo.AddField(lg(\"uri\"), \"uri\", db.Varchar)\n\tinfo.AddField(lg(\"role\"), \"roles\", db.Varchar)\n\tinfo.AddField(lg(\"header\"), \"header\", db.Varchar)\n\tinfo.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp)\n\tinfo.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp)\n\n\tinfo.SetTable(\"goadmin_menu\").\n\t\tSetTitle(lg(\"Menus Manage\")).\n\t\tSetDescription(lg(\"Menus Manage\")).\n\t\tSetDeleteFn(func(idArr []string) error {\n\n\t\t\tvar ids = interfaces(idArr)\n\n\t\t\t_, txErr := s.connection().WithTransaction(func(tx *sql.Tx) (e error, i map[string]interface{}) {\n\n\t\t\t\tdeleteRoleMenuErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_role_menu\").\n\t\t\t\t\tWhereIn(\"menu_id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteRoleMenuErr, db.DELETE) {\n\t\t\t\t\treturn deleteRoleMenuErr, nil\n\t\t\t\t}\n\n\t\t\t\tdeleteMenusErr := s.connection().WithTx(tx).\n\t\t\t\t\tTable(\"goadmin_menu\").\n\t\t\t\t\tWhereIn(\"id\", ids).\n\t\t\t\t\tDelete()\n\n\t\t\t\tif db.CheckError(deleteMenusErr, db.DELETE) {\n\t\t\t\t\treturn deleteMenusErr, nil\n\t\t\t\t}\n\n\t\t\t\treturn nil, map[string]interface{}{}\n\t\t\t})\n\n\t\t\treturn txErr\n\t\t})\n\n\tvar parentIDOptions = types.FieldOptions{\n\t\t{\n\t\t\tText:  \"ROOT\",\n\t\t\tValue: \"0\",\n\t\t},\n\t}\n\n\tallMenus, _ := s.connection().Table(\"goadmin_menu\").\n\t\tWhere(\"parent_id\", \"=\", 0).\n\t\tWhere(\"plugin_name\", \"=\", name).\n\t\tSelect(\"id\", \"title\").\n\t\tOrderBy(\"order\", \"asc\").\n\t\tAll()\n\tallMenuIDs := make([]interface{}, len(allMenus))\n\n\tif len(allMenuIDs) > 0 {\n\t\tfor i := 0; i < len(allMenus); i++ {\n\t\t\tallMenuIDs[i] = allMenus[i][\"id\"]\n\t\t}\n\n\t\tsecondLevelMenus, _ := s.connection().Table(\"goadmin_menu\").\n\t\t\tWhereIn(\"parent_id\", allMenuIDs).\n\t\t\tWhere(\"plugin_name\", \"=\", name).\n\t\t\tSelect(\"id\", \"title\", \"parent_id\").\n\t\t\tAll()\n\n\t\tsecondLevelMenusCol := collection.Collection(secondLevelMenus)\n\n\t\tfor i := 0; i < len(allMenus); i++ {\n\t\t\tparentIDOptions = append(parentIDOptions, types.FieldOption{\n\t\t\t\tTextHTML: \"&nbsp;&nbsp;┝  \" + language.GetFromHtml(template.HTML(allMenus[i][\"title\"].(string))),\n\t\t\t\tValue:    strconv.Itoa(int(allMenus[i][\"id\"].(int64))),\n\t\t\t})\n\t\t\tcol := secondLevelMenusCol.Where(\"parent_id\", \"=\", allMenus[i][\"id\"].(int64))\n\t\t\tfor i := 0; i < len(col); i++ {\n\t\t\t\tparentIDOptions = append(parentIDOptions, types.FieldOption{\n\t\t\t\t\tTextHTML: \"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;┝  \" +\n\t\t\t\t\t\tlanguage.GetFromHtml(template.HTML(col[i][\"title\"].(string))),\n\t\t\t\t\tValue: strconv.Itoa(int(col[i][\"id\"].(int64))),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tformList := menuTable.GetForm().AddXssJsFilter()\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(lg(\"parent\"), \"parent_id\", db.Int, form.SelectSingle).\n\t\tFieldOptions(parentIDOptions).\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tvar menuItem []string\n\n\t\t\tif model.ID == \"\" {\n\t\t\t\treturn menuItem\n\t\t\t}\n\n\t\t\tmenuModel, _ := s.table(\"goadmin_menu\").Select(\"parent_id\").Find(model.ID)\n\t\t\tmenuItem = append(menuItem, strconv.FormatInt(menuModel[\"parent_id\"].(int64), 10))\n\t\t\treturn menuItem\n\t\t})\n\tformList.AddField(lg(\"menu name\"), \"title\", db.Varchar, form.Text).FieldMust()\n\tformList.AddField(lg(\"header\"), \"header\", db.Varchar, form.Text)\n\tformList.AddField(lg(\"icon\"), \"icon\", db.Varchar, form.IconPicker)\n\tformList.AddField(lg(\"uri\"), \"uri\", db.Varchar, form.Text)\n\tformList.AddField(\"PluginName\", \"plugin_name\", db.Varchar, form.Text).FieldDefault(name).FieldHide()\n\tformList.AddField(lg(\"role\"), \"roles\", db.Int, form.Select).\n\t\tFieldOptionsFromTable(\"goadmin_roles\", \"slug\", \"id\").\n\t\tFieldDisplay(func(model types.FieldModel) interface{} {\n\t\t\tvar roles []string\n\n\t\t\tif model.ID == \"\" {\n\t\t\t\treturn roles\n\t\t\t}\n\n\t\t\troleModel, _ := s.table(\"goadmin_role_menu\").\n\t\t\t\tSelect(\"role_id\").\n\t\t\t\tWhere(\"menu_id\", \"=\", model.ID).\n\t\t\t\tAll()\n\n\t\t\tfor _, v := range roleModel {\n\t\t\t\troles = append(roles, strconv.FormatInt(v[\"role_id\"].(int64), 10))\n\t\t\t}\n\t\t\treturn roles\n\t\t})\n\n\tformList.AddField(lg(\"updatedAt\"), \"updated_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\tformList.AddField(lg(\"createdAt\"), \"created_at\", db.Timestamp, form.Default).FieldDisableWhenCreate()\n\n\tformList.SetTable(\"goadmin_menu\").\n\t\tSetTitle(lg(\"Menus Manage\")).\n\t\tSetDescription(lg(\"Menus Manage\"))\n\n\treturn\n}\n\nfunc (s *SystemTable) GetSiteTable(ctx *context.Context) (siteTable Table) {\n\tsiteTable = NewDefaultTable(ctx, DefaultConfigWithDriver(config.GetDatabases().GetDefault().Driver).\n\t\tSetOnlyUpdateForm().\n\t\tSetGetDataFun(func(params parameter.Parameters) (i []map[string]interface{}, i2 int) {\n\t\t\treturn []map[string]interface{}{models.Site().SetConn(s.conn).AllToMapInterface()}, 1\n\t\t}))\n\n\ttrueStr := lgWithConfigScore(\"true\")\n\tfalseStr := lgWithConfigScore(\"false\")\n\n\tformList := siteTable.GetForm().AddXssJsFilter()\n\tformList.AddField(\"ID\", \"id\", db.Varchar, form.Default).FieldDefault(\"1\").FieldHide()\n\tformList.AddField(lgWithConfigScore(\"site off\"), \"site_off\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"debug\"), \"debug\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"env\"), \"env\", db.Varchar, form.Default).\n\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn s.c.Env\n\t\t})\n\n\tlangOps := make(types.FieldOptions, len(language.Langs))\n\tfor k, t := range language.Langs {\n\t\tlangOps[k] = types.FieldOption{Text: lgWithConfigScore(t, \"language\"), Value: t}\n\t}\n\tformList.AddField(lgWithConfigScore(\"language\"), \"language\", db.Varchar, form.SelectSingle).\n\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn language.FixedLanguageKey(value.Value)\n\t\t}).\n\t\tFieldOptions(langOps)\n\tthemes := template.Themes()\n\tthemesOps := make(types.FieldOptions, len(themes))\n\tfor k, t := range themes {\n\t\tthemesOps[k] = types.FieldOption{Text: t, Value: t}\n\t}\n\n\tformList.AddField(lgWithConfigScore(\"theme\"), \"theme\", db.Varchar, form.SelectSingle).\n\t\tFieldOptions(themesOps).\n\t\tFieldOnChooseShow(\"adminlte\",\n\t\t\t\"color_scheme\")\n\tformList.AddField(lgWithConfigScore(\"title\"), \"title\", db.Varchar, form.Text).FieldMust()\n\tformList.AddField(lgWithConfigScore(\"color scheme\"), \"color_scheme\", db.Varchar, form.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"skin-black\", Value: \"skin-black\"},\n\t\t\t{Text: \"skin-black-light\", Value: \"skin-black-light\"},\n\t\t\t{Text: \"skin-blue\", Value: \"skin-blue\"},\n\t\t\t{Text: \"skin-blue-light\", Value: \"skin-blue-light\"},\n\t\t\t{Text: \"skin-green\", Value: \"skin-green\"},\n\t\t\t{Text: \"skin-green-light\", Value: \"skin-green-light\"},\n\t\t\t{Text: \"skin-purple\", Value: \"skin-purple\"},\n\t\t\t{Text: \"skin-purple-light\", Value: \"skin-purple-light\"},\n\t\t\t{Text: \"skin-red\", Value: \"skin-red\"},\n\t\t\t{Text: \"skin-red-light\", Value: \"skin-red-light\"},\n\t\t\t{Text: \"skin-yellow\", Value: \"skin-yellow\"},\n\t\t\t{Text: \"skin-yellow-light\", Value: \"skin-yellow-light\"},\n\t\t}).FieldHelpMsg(template.HTML(lgWithConfigScore(\"It will work when theme is adminlte\")))\n\tformList.AddField(lgWithConfigScore(\"login title\"), \"login_title\", db.Varchar, form.Text).FieldMust()\n\tformList.AddField(lgWithConfigScore(\"extra\"), \"extra\", db.Varchar, form.TextArea)\n\tformList.AddField(lgWithConfigScore(\"logo\"), \"logo\", db.Varchar, form.Code).FieldMust()\n\tformList.AddField(lgWithConfigScore(\"mini logo\"), \"mini_logo\", db.Varchar, form.Code).FieldMust()\n\tif s.c.IsNotProductionEnvironment() {\n\t\tformList.AddField(lgWithConfigScore(\"bootstrap file path\"), \"bootstrap_file_path\", db.Varchar, form.Text)\n\t\tformList.AddField(lgWithConfigScore(\"go mod file path\"), \"go_mod_file_path\", db.Varchar, form.Text)\n\t}\n\tformList.AddField(lgWithConfigScore(\"session life time\"), \"session_life_time\", db.Varchar, form.Number).\n\t\tFieldMust().\n\t\tFieldHelpMsg(template.HTML(lgWithConfigScore(\"must bigger than 900 seconds\")))\n\tformList.AddField(lgWithConfigScore(\"custom head html\"), \"custom_head_html\", db.Varchar, form.Code)\n\tformList.AddField(lgWithConfigScore(\"custom foot Html\"), \"custom_foot_html\", db.Varchar, form.Code)\n\tformList.AddField(lgWithConfigScore(\"custom 404 html\"), \"custom_404_html\", db.Varchar, form.Code)\n\tformList.AddField(lgWithConfigScore(\"custom 403 html\"), \"custom_403_html\", db.Varchar, form.Code)\n\tformList.AddField(lgWithConfigScore(\"custom 500 Html\"), \"custom_500_html\", db.Varchar, form.Code)\n\tformList.AddField(lgWithConfigScore(\"footer info\"), \"footer_info\", db.Varchar, form.Code)\n\tformList.AddField(lgWithConfigScore(\"login logo\"), \"login_logo\", db.Varchar, form.Code)\n\tformList.AddField(lgWithConfigScore(\"no limit login ip\"), \"no_limit_login_ip\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"operation log off\"), \"operation_log_off\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"allow delete operation log\"), \"allow_del_operation_log\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"hide config center entrance\"), \"hide_config_center_entrance\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"hide app info entrance\"), \"hide_app_info_entrance\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"hide tool entrance\"), \"hide_tool_entrance\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"hide plugin entrance\"), \"hide_plugin_entrance\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"animation type\"), \"animation_type\", db.Varchar, form.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"\", Value: \"\"},\n\t\t\t{Text: \"bounce\", Value: \"bounce\"}, {Text: \"flash\", Value: \"flash\"}, {Text: \"pulse\", Value: \"pulse\"},\n\t\t\t{Text: \"rubberBand\", Value: \"rubberBand\"}, {Text: \"shake\", Value: \"shake\"}, {Text: \"swing\", Value: \"swing\"},\n\t\t\t{Text: \"tada\", Value: \"tada\"}, {Text: \"wobble\", Value: \"wobble\"}, {Text: \"jello\", Value: \"jello\"},\n\t\t\t{Text: \"heartBeat\", Value: \"heartBeat\"}, {Text: \"bounceIn\", Value: \"bounceIn\"}, {Text: \"bounceInDown\", Value: \"bounceInDown\"},\n\t\t\t{Text: \"bounceInLeft\", Value: \"bounceInLeft\"}, {Text: \"bounceInRight\", Value: \"bounceInRight\"}, {Text: \"bounceInUp\", Value: \"bounceInUp\"},\n\t\t\t{Text: \"fadeIn\", Value: \"fadeIn\"}, {Text: \"fadeInDown\", Value: \"fadeInDown\"}, {Text: \"fadeInDownBig\", Value: \"fadeInDownBig\"},\n\t\t\t{Text: \"fadeInLeft\", Value: \"fadeInLeft\"}, {Text: \"fadeInLeftBig\", Value: \"fadeInLeftBig\"}, {Text: \"fadeInRight\", Value: \"fadeInRight\"},\n\t\t\t{Text: \"fadeInRightBig\", Value: \"fadeInRightBig\"}, {Text: \"fadeInUp\", Value: \"fadeInUp\"}, {Text: \"fadeInUpBig\", Value: \"fadeInUpBig\"},\n\t\t\t{Text: \"flip\", Value: \"flip\"}, {Text: \"flipInX\", Value: \"flipInX\"}, {Text: \"flipInY\", Value: \"flipInY\"},\n\t\t\t{Text: \"lightSpeedIn\", Value: \"lightSpeedIn\"}, {Text: \"rotateIn\", Value: \"rotateIn\"}, {Text: \"rotateInDownLeft\", Value: \"rotateInDownLeft\"},\n\t\t\t{Text: \"rotateInDownRight\", Value: \"rotateInDownRight\"}, {Text: \"rotateInUpLeft\", Value: \"rotateInUpLeft\"}, {Text: \"rotateInUpRight\", Value: \"rotateInUpRight\"},\n\t\t\t{Text: \"slideInUp\", Value: \"slideInUp\"}, {Text: \"slideInDown\", Value: \"slideInDown\"}, {Text: \"slideInLeft\", Value: \"slideInLeft\"}, {Text: \"slideInRight\", Value: \"slideInRight\"},\n\t\t\t{Text: \"slideOutRight\", Value: \"slideOutRight\"}, {Text: \"zoomIn\", Value: \"zoomIn\"}, {Text: \"zoomInDown\", Value: \"zoomInDown\"},\n\t\t\t{Text: \"zoomInLeft\", Value: \"zoomInLeft\"}, {Text: \"zoomInRight\", Value: \"zoomInRight\"}, {Text: \"zoomInUp\", Value: \"zoomInUp\"},\n\t\t\t{Text: \"hinge\", Value: \"hinge\"}, {Text: \"jackInTheBox\", Value: \"jackInTheBox\"}, {Text: \"rollIn\", Value: \"rollIn\"},\n\t\t}).FieldOnChooseHide(\"\", \"animation_duration\", \"animation_delay\").\n\t\tFieldOptionExt(map[string]interface{}{\"allowClear\": true}).\n\t\tFieldHelpMsg(`see more: <a href=\"https://daneden.github.io/animate.css/\">https://daneden.github.io/animate.css/</a>`)\n\n\tformList.AddField(lgWithConfigScore(\"animation duration\"), \"animation_duration\", db.Varchar, form.Number)\n\tformList.AddField(lgWithConfigScore(\"animation delay\"), \"animation_delay\", db.Varchar, form.Number)\n\n\tformList.AddField(lgWithConfigScore(\"file upload engine\"), \"file_upload_engine\", db.Varchar, form.Text)\n\n\tformList.AddField(lgWithConfigScore(\"cdn url\"), \"asset_url\", db.Varchar, form.Text).\n\t\tFieldHelpMsg(template.HTML(lgWithConfigScore(\"Do not modify when you have not set up all assets\")))\n\n\tformList.AddField(lgWithConfigScore(\"info log path\"), \"info_log_path\", db.Varchar, form.Text)\n\tformList.AddField(lgWithConfigScore(\"error log path\"), \"error_log_path\", db.Varchar, form.Text)\n\tformList.AddField(lgWithConfigScore(\"access log path\"), \"access_log_path\", db.Varchar, form.Text)\n\tformList.AddField(lgWithConfigScore(\"info log off\"), \"info_log_off\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"error log off\"), \"error_log_off\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"access log off\"), \"access_log_off\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"access assets log off\"), \"access_assets_log_off\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"sql log on\"), \"sql_log\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t})\n\tformList.AddField(lgWithConfigScore(\"log level\"), \"logger_level\", db.Varchar, form.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"Debug\", Value: \"-1\"},\n\t\t\t{Text: \"Info\", Value: \"0\"},\n\t\t\t{Text: \"Warn\", Value: \"1\"},\n\t\t\t{Text: \"Error\", Value: \"2\"},\n\t\t}).FieldDisplay(defaultFilterFn(\"0\"))\n\n\tformList.AddField(lgWithConfigScore(\"logger rotate max size\"), \"logger_rotate_max_size\", db.Varchar, form.Number).\n\t\tFieldDivider(lgWithConfigScore(\"logger rotate\")).FieldDisplay(defaultFilterFn(\"10\", \"0\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate max backups\"), \"logger_rotate_max_backups\", db.Varchar, form.Number).\n\t\tFieldDisplay(defaultFilterFn(\"5\", \"0\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate max age\"), \"logger_rotate_max_age\", db.Varchar, form.Number).\n\t\tFieldDisplay(defaultFilterFn(\"30\", \"0\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate compress\"), \"logger_rotate_compress\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: trueStr, Value: \"true\"},\n\t\t\t{Text: falseStr, Value: \"false\"},\n\t\t}).FieldDisplay(defaultFilterFn(\"false\"))\n\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder encoding\"), \"logger_encoder_encoding\", db.Varchar,\n\t\tform.SelectSingle).\n\t\tFieldDivider(lgWithConfigScore(\"logger rotate encoder\")).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"JSON\", Value: \"json\"},\n\t\t\t{Text: \"Console\", Value: \"console\"},\n\t\t}).FieldDisplay(defaultFilterFn(\"console\")).\n\t\tFieldOnChooseHide(\"Console\",\n\t\t\t\"logger_encoder_time_key\", \"logger_encoder_level_key\", \"logger_encoder_caller_key\",\n\t\t\t\"logger_encoder_message_key\", \"logger_encoder_stacktrace_key\", \"logger_encoder_name_key\")\n\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder time key\"), \"logger_encoder_time_key\", db.Varchar, form.Text).\n\t\tFieldDisplay(defaultFilterFn(\"ts\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder level key\"), \"logger_encoder_level_key\", db.Varchar, form.Text).\n\t\tFieldDisplay(defaultFilterFn(\"level\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder name key\"), \"logger_encoder_name_key\", db.Varchar, form.Text).\n\t\tFieldDisplay(defaultFilterFn(\"logger\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder caller key\"), \"logger_encoder_caller_key\", db.Varchar, form.Text).\n\t\tFieldDisplay(defaultFilterFn(\"caller\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder message key\"), \"logger_encoder_message_key\", db.Varchar, form.Text).\n\t\tFieldDisplay(defaultFilterFn(\"msg\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder stacktrace key\"), \"logger_encoder_stacktrace_key\", db.Varchar, form.Text).\n\t\tFieldDisplay(defaultFilterFn(\"stacktrace\"))\n\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder level\"), \"logger_encoder_level\", db.Varchar,\n\t\tform.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: lgWithConfigScore(\"capital\"), Value: \"capital\"},\n\t\t\t{Text: lgWithConfigScore(\"capitalcolor\"), Value: \"capitalColor\"},\n\t\t\t{Text: lgWithConfigScore(\"lowercase\"), Value: \"lowercase\"},\n\t\t\t{Text: lgWithConfigScore(\"lowercasecolor\"), Value: \"color\"},\n\t\t}).FieldDisplay(defaultFilterFn(\"capitalColor\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder time\"), \"logger_encoder_time\", db.Varchar,\n\t\tform.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"ISO8601(2006-01-02T15:04:05.000Z0700)\", Value: \"iso8601\"},\n\t\t\t{Text: lgWithConfigScore(\"millisecond\"), Value: \"millis\"},\n\t\t\t{Text: lgWithConfigScore(\"nanosecond\"), Value: \"nanos\"},\n\t\t\t{Text: \"RFC3339(2006-01-02T15:04:05Z07:00)\", Value: \"rfc3339\"},\n\t\t\t{Text: \"RFC3339 Nano(2006-01-02T15:04:05.999999999Z07:00)\", Value: \"rfc3339nano\"},\n\t\t}).FieldDisplay(defaultFilterFn(\"iso8601\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder duration\"), \"logger_encoder_duration\", db.Varchar,\n\t\tform.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: lgWithConfigScore(\"seconds\"), Value: \"string\"},\n\t\t\t{Text: lgWithConfigScore(\"nanosecond\"), Value: \"nanos\"},\n\t\t\t{Text: lgWithConfigScore(\"microsecond\"), Value: \"ms\"},\n\t\t}).FieldDisplay(defaultFilterFn(\"string\"))\n\tformList.AddField(lgWithConfigScore(\"logger rotate encoder caller\"), \"logger_encoder_caller\", db.Varchar,\n\t\tform.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: lgWithConfigScore(\"full path\"), Value: \"full\"},\n\t\t\t{Text: lgWithConfigScore(\"short path\"), Value: \"short\"},\n\t\t}).FieldDisplay(defaultFilterFn(\"full\"))\n\n\tformList.HideBackButton().HideContinueEditCheckBox().HideContinueNewCheckBox()\n\tformList.SetTabGroups(types.NewTabGroups(\"id\", \"debug\", \"env\", \"language\", \"theme\", \"color_scheme\",\n\t\t\"asset_url\", \"title\", \"login_title\", \"session_life_time\", \"bootstrap_file_path\", \"go_mod_file_path\", \"no_limit_login_ip\",\n\t\t\"operation_log_off\", \"allow_del_operation_log\", \"hide_config_center_entrance\", \"hide_app_info_entrance\", \"hide_tool_entrance\",\n\t\t\"hide_plugin_entrance\", \"animation_type\",\n\t\t\"animation_duration\", \"animation_delay\", \"file_upload_engine\", \"extra\").\n\t\tAddGroup(\"access_log_off\", \"access_assets_log_off\", \"info_log_off\", \"error_log_off\", \"sql_log\", \"logger_level\",\n\t\t\t\"info_log_path\", \"error_log_path\",\n\t\t\t\"access_log_path\", \"logger_rotate_max_size\", \"logger_rotate_max_backups\",\n\t\t\t\"logger_rotate_max_age\", \"logger_rotate_compress\",\n\t\t\t\"logger_encoder_encoding\", \"logger_encoder_time_key\", \"logger_encoder_level_key\", \"logger_encoder_name_key\",\n\t\t\t\"logger_encoder_caller_key\", \"logger_encoder_message_key\", \"logger_encoder_stacktrace_key\", \"logger_encoder_level\",\n\t\t\t\"logger_encoder_time\", \"logger_encoder_duration\", \"logger_encoder_caller\").\n\t\tAddGroup(\"logo\", \"mini_logo\", \"custom_head_html\", \"custom_foot_html\", \"footer_info\", \"login_logo\",\n\t\t\t\"custom_404_html\", \"custom_403_html\", \"custom_500_html\")).\n\t\tSetTabHeaders(lgWithConfigScore(\"general\"), lgWithConfigScore(\"log\"), lgWithConfigScore(\"custom\"))\n\n\tformList.SetTable(\"goadmin_site\").\n\t\tSetTitle(lgWithConfigScore(\"site setting\")).\n\t\tSetDescription(lgWithConfigScore(\"site setting\"))\n\n\tformList.SetUpdateFn(func(values form2.Values) error {\n\n\t\tses := values.Get(\"session_life_time\")\n\t\tsesInt, _ := strconv.Atoi(ses)\n\t\tif sesInt < 900 {\n\t\t\treturn errors.New(\"wrong session life time, must bigger than 900 seconds\")\n\t\t}\n\t\tif err := checkJSON(values, \"file_upload_engine\"); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvalues[\"logo\"][0] = escape(values.Get(\"logo\"))\n\t\tvalues[\"mini_logo\"][0] = escape(values.Get(\"mini_logo\"))\n\t\tvalues[\"custom_head_html\"][0] = escape(values.Get(\"custom_head_html\"))\n\t\tvalues[\"custom_foot_html\"][0] = escape(values.Get(\"custom_foot_html\"))\n\t\tvalues[\"custom_404_html\"][0] = escape(values.Get(\"custom_404_html\"))\n\t\tvalues[\"custom_403_html\"][0] = escape(values.Get(\"custom_403_html\"))\n\t\tvalues[\"custom_500_html\"][0] = escape(values.Get(\"custom_500_html\"))\n\t\tvalues[\"footer_info\"][0] = escape(values.Get(\"footer_info\"))\n\t\tvalues[\"login_logo\"][0] = escape(values.Get(\"login_logo\"))\n\n\t\tvar err error\n\t\tif s.c.UpdateProcessFn != nil {\n\t\t\tvalues, err = s.c.UpdateProcessFn(values)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tui.GetService(services).RemoveOrShowSiteNavButton(values[\"hide_config_center_entrance\"][0] == \"true\")\n\t\tui.GetService(services).RemoveOrShowInfoNavButton(values[\"hide_app_info_entrance\"][0] == \"true\")\n\t\tui.GetService(services).RemoveOrShowToolNavButton(values[\"hide_tool_entrance\"][0] == \"true\")\n\t\tui.GetService(services).RemoveOrShowPlugNavButton(values[\"hide_plugin_entrance\"][0] == \"true\")\n\n\t\t// TODO: add transaction\n\t\terr = models.Site().SetConn(s.conn).Update(values.RemoveSysRemark())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn s.c.Update(values.ToMap())\n\t})\n\n\tformList.EnableAjax(lgWithConfigScore(\"modify site config\"),\n\t\tlgWithConfigScore(\"modify site config\"),\n\t\t\"\",\n\t\tlgWithConfigScore(\"modify site config success\"),\n\t\tlgWithConfigScore(\"modify site config fail\"))\n\n\treturn\n}\n\nfunc (s *SystemTable) GetGenerateForm(ctx *context.Context) (generateTool Table) {\n\tgenerateTool = NewDefaultTable(ctx, DefaultConfigWithDriver(config.GetDatabases().GetDefault().Driver).\n\t\tSetOnlyNewForm())\n\n\tformList := generateTool.GetForm().AddXssJsFilter().\n\t\tSetHeadWidth(1).\n\t\tSetInputWidth(4).\n\t\tHideBackButton().\n\t\tHideContinueNewCheckBox()\n\n\tformList.AddField(\"ID\", \"id\", db.Varchar, form.Default).FieldDefault(\"1\").FieldHide()\n\n\tconnNames := config.GetDatabases().Connections()\n\tops := make(types.FieldOptions, len(connNames))\n\tfor i, name := range connNames {\n\t\tops[i] = types.FieldOption{Text: name, Value: name}\n\t}\n\n\t// General options\n\t// ================================\n\n\tformList.AddField(lgWithScore(\"connection\", \"tool\"), \"conn\", db.Varchar, form.SelectSingle).\n\t\tFieldOptions(ops).\n\t\tFieldOnChooseAjax(\"table\", \"/tool/choose/conn\",\n\t\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\t\tconnName := ctx.FormValue(\"value\")\n\t\t\t\tif connName == \"\" {\n\t\t\t\t\treturn false, \"wrong parameter\", nil\n\t\t\t\t}\n\t\t\t\tcfg := s.c.Databases[connName]\n\t\t\t\tconn := db.GetConnectionFromService(services.Get(cfg.Driver))\n\t\t\t\ttables, err := db.WithDriverAndConnection(connName, conn).Table(cfg.Name).ShowTables()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn false, err.Error(), nil\n\t\t\t\t}\n\t\t\t\tops := make(selection.Options, len(tables))\n\t\t\t\tfor i, table := range tables {\n\t\t\t\t\tops[i] = selection.Option{Text: table, ID: table}\n\t\t\t\t}\n\t\t\t\treturn true, \"ok\", ops\n\t\t\t})\n\tformList.AddField(lgWithScore(\"table\", \"tool\"), \"table\", db.Varchar, form.SelectSingle).\n\t\tFieldOnChooseAjax(\"xxxx\", \"/tool/choose/table\",\n\t\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\n\t\t\t\tvar (\n\t\t\t\t\ttableName       = ctx.FormValue(\"value\")\n\t\t\t\t\tconnName        = ctx.FormValue(\"conn\")\n\t\t\t\t\tdriver          = s.c.Databases[connName].Driver\n\t\t\t\t\tconn            = db.GetConnectionFromService(services.Get(driver))\n\t\t\t\t\tcolumnsModel, _ = db.WithDriverAndConnection(connName, conn).Table(tableName).ShowColumns()\n\n\t\t\t\t\tfieldField = \"Field\"\n\t\t\t\t\ttypeField  = \"Type\"\n\t\t\t\t)\n\n\t\t\t\tif driver == \"postgresql\" {\n\t\t\t\t\tfieldField = \"column_name\"\n\t\t\t\t\ttypeField = \"udt_name\"\n\t\t\t\t}\n\t\t\t\tif driver == \"sqlite\" {\n\t\t\t\t\tfieldField = \"name\"\n\t\t\t\t\ttypeField = \"type\"\n\t\t\t\t}\n\t\t\t\tif driver == \"mssql\" {\n\t\t\t\t\tfieldField = \"column_name\"\n\t\t\t\t\ttypeField = \"data_type\"\n\t\t\t\t}\n\n\t\t\t\theadName := make([]string, len(columnsModel))\n\t\t\t\tfieldName := make([]string, len(columnsModel))\n\t\t\t\tdbTypeList := make([]string, len(columnsModel))\n\t\t\t\tformTypeList := make([]string, len(columnsModel))\n\n\t\t\t\tfor i, model := range columnsModel {\n\t\t\t\t\ttypeName := getType(model[typeField].(string))\n\n\t\t\t\t\theadName[i] = cases.Title(textLang.Und).String(model[fieldField].(string))\n\t\t\t\t\tfieldName[i] = model[fieldField].(string)\n\t\t\t\t\tdbTypeList[i] = typeName\n\t\t\t\t\tformTypeList[i] = form.GetFormTypeFromFieldType(db.DT(strings.ToUpper(typeName)),\n\t\t\t\t\t\tmodel[fieldField].(string))\n\t\t\t\t}\n\n\t\t\t\treturn true, \"ok\", [][]string{headName, fieldName, dbTypeList, formTypeList}\n\t\t\t}, template.HTML(utils.ParseText(\"choose_table_ajax\", tmpls[\"choose_table_ajax\"], nil)),\n\t\t\t`\"conn\":$('.conn').val(),`)\n\tformList.AddField(lgWithScore(\"package\", \"tool\"), \"package\", db.Varchar, form.Text).FieldDefault(\"tables\")\n\tformList.AddField(lgWithScore(\"primarykey\", \"tool\"), \"pk\", db.Varchar, form.Text).FieldDefault(\"id\")\n\n\tformList.AddField(lgWithScore(\"table permission\", \"tool\"), \"permission\", db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: lgWithScore(\"yes\", \"tool\"), Value: \"y\"},\n\t\t\t{Text: lgWithScore(\"no\", \"tool\"), Value: \"n\"},\n\t\t}).FieldDefault(\"n\")\n\n\tformList.AddField(lgWithScore(\"extra import package\", \"tool\"), \"extra_import_package\", db.Varchar, form.Select).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"time\", Value: \"time\"},\n\t\t\t{Text: \"log\", Value: \"log\"},\n\t\t\t{Text: \"fmt\", Value: \"fmt\"},\n\t\t\t{Text: \"github.com/GoAdminGroup/go-admin/modules/db/dialect\", Value: \"github.com/GoAdminGroup/go-admin/modules/db/dialect\"},\n\t\t\t{Text: \"github.com/GoAdminGroup/go-admin/modules/db\", Value: \"github.com/GoAdminGroup/go-admin/modules/db\"},\n\t\t\t{Text: \"github.com/GoAdminGroup/go-admin/modules/language\", Value: \"github.com/GoAdminGroup/go-admin/modules/language\"},\n\t\t\t{Text: \"github.com/GoAdminGroup/go-admin/modules/logger\", Value: \"github.com/GoAdminGroup/go-admin/modules/logger\"},\n\t\t}).\n\t\tFieldDefault(\"\").\n\t\tFieldOptionExt(map[string]interface{}{\n\t\t\t\"tags\": true,\n\t\t})\n\n\tformList.AddField(lgWithScore(\"output\", \"tool\"), \"path\", db.Varchar, form.Text).\n\t\tFieldDefault(\"\").FieldMust().FieldHelpMsg(template.HTML(lgWithScore(\"use absolute path\", \"tool\")))\n\n\tformList.AddField(lgWithScore(\"extra code\", \"tool\"), \"extra_code\", db.Varchar, form.Code).\n\t\tFieldDefault(\"\").FieldInputWidth(11)\n\n\t// Info table generate options\n\t// ================================\n\n\tformList.AddField(lgWithScore(\"title\", \"tool\"), \"table_title\", db.Varchar, form.Text)\n\tformList.AddField(lgWithScore(\"description\", \"tool\"), \"table_description\", db.Varchar, form.Text)\n\n\tformList.AddRow(func(panel *types.FormPanel) {\n\t\taddSwitchForTool(panel, \"filter area\", \"hide_filter_area\", \"n\", 2)\n\t\tpanel.AddField(lgWithScore(\"filter form layout\", \"tool\"), \"filter_form_layout\", db.Varchar, form.SelectSingle).\n\t\t\tFieldOptions(types.FieldOptions{\n\t\t\t\t{Text: form.LayoutDefault.String(), Value: form.LayoutDefault.String()},\n\t\t\t\t{Text: form.LayoutTwoCol.String(), Value: form.LayoutTwoCol.String()},\n\t\t\t\t{Text: form.LayoutThreeCol.String(), Value: form.LayoutThreeCol.String()},\n\t\t\t\t{Text: form.LayoutFourCol.String(), Value: form.LayoutFourCol.String()},\n\t\t\t\t{Text: form.LayoutFlow.String(), Value: form.LayoutFlow.String()},\n\t\t\t}).FieldDefault(form.LayoutDefault.String()).\n\t\t\tFieldRowWidth(4).FieldHeadWidth(3)\n\t})\n\n\tformList.AddRow(func(panel *types.FormPanel) {\n\t\taddSwitchForTool(panel, \"new button\", \"hide_new_button\", \"n\", 2)\n\t\taddSwitchForTool(panel, \"export button\", \"hide_export_button\", \"n\", 4, 3)\n\t\taddSwitchForTool(panel, \"edit button\", \"hide_edit_button\", \"n\", 4, 2)\n\t})\n\n\tformList.AddRow(func(panel *types.FormPanel) {\n\t\taddSwitchForTool(panel, \"pagination\", \"hide_pagination\", \"n\", 2)\n\t\taddSwitchForTool(panel, \"delete button\", \"hide_delete_button\", \"n\", 4, 3)\n\t\taddSwitchForTool(panel, \"detail button\", \"hide_detail_button\", \"n\", 4, 2)\n\t})\n\n\tformList.AddRow(func(panel *types.FormPanel) {\n\t\taddSwitchForTool(panel, \"filter button\", \"hide_filter_button\", \"n\", 2)\n\t\taddSwitchForTool(panel, \"row selector\", \"hide_row_selector\", \"n\", 4, 3)\n\t\taddSwitchForTool(panel, \"query info\", \"hide_query_info\", \"n\", 4, 2)\n\t})\n\n\tformList.AddTable(lgWithScore(\"field\", \"tool\"), \"fields\", func(pa *types.FormPanel) {\n\t\tpa.AddField(lgWithScore(\"title\", \"tool\"), \"field_head\", db.Varchar, form.Text).FieldHideLabel().\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field name\", \"tool\"), \"field_name\", db.Varchar, form.Text).FieldHideLabel().\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field filterable\", \"tool\"), \"field_filterable\", db.Varchar, form.CheckboxSingle).\n\t\t\tFieldOptions(types.FieldOptions{\n\t\t\t\t{Text: \"\", Value: \"y\"},\n\t\t\t\t{Text: \"\", Value: \"n\"},\n\t\t\t}).\n\t\t\tFieldDefault(\"n\").\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"n\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field sortable\", \"tool\"), \"field_sortable\", db.Varchar, form.CheckboxSingle).\n\t\t\tFieldOptions(types.FieldOptions{\n\t\t\t\t{Text: \"\", Value: \"y\"},\n\t\t\t\t{Text: \"\", Value: \"n\"},\n\t\t\t}).\n\t\t\tFieldDefault(\"n\").\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"n\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field hide\", \"tool\"), \"field_hide\", db.Varchar, form.CheckboxSingle).\n\t\t\tFieldOptions(types.FieldOptions{\n\t\t\t\t{Text: \"\", Value: \"y\"},\n\t\t\t\t{Text: \"\", Value: \"n\"},\n\t\t\t}).\n\t\t\tFieldDefault(\"n\").\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"n\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"info field editable\", \"tool\"), \"info_field_editable\", db.Varchar, form.CheckboxSingle).\n\t\t\tFieldOptions(types.FieldOptions{\n\t\t\t\t{Text: \"\", Value: \"y\"},\n\t\t\t\t{Text: \"\", Value: \"n\"},\n\t\t\t}).\n\t\t\tFieldDefault(\"n\").\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"n\"}\n\t\t\t})\n\t\t//pa.AddField(lgWithScore(\"db display type\", \"tool\"), \"field_display_type\", db.Varchar, form.SelectSingle).\n\t\t//\tFieldOptions(infoFieldDisplayTypeOptions()).\n\t\t//\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t//\t\treturn []string{\"\"}\n\t\t//\t})\n\t\tpa.AddField(lgWithScore(\"db type\", \"tool\"), \"field_db_type\", db.Varchar, form.SelectSingle).\n\t\t\tFieldOptions(databaseTypeOptions()).\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"Int\"}\n\t\t\t})\n\t}).FieldInputWidth(11)\n\n\t// Form generate options\n\t// ================================\n\n\tformList.AddField(lgWithScore(\"title\", \"tool\"), \"form_title\", db.Varchar, form.Text)\n\tformList.AddField(lgWithScore(\"description\", \"tool\"), \"form_description\", db.Varchar, form.Text)\n\n\tformList.AddRow(func(panel *types.FormPanel) {\n\t\taddSwitchForTool(panel, \"continue edit checkbox\", \"hide_continue_edit_check_box\", \"n\", 2)\n\t\taddSwitchForTool(panel, \"reset button\", \"hide_reset_button\", \"n\", 5, 3)\n\t})\n\n\tformList.AddRow(func(panel *types.FormPanel) {\n\t\taddSwitchForTool(panel, \"continue new checkbox\", \"hide_continue_new_check_box\", \"n\", 2)\n\t\taddSwitchForTool(panel, \"back button\", \"hide_back_button\", \"n\", 5, 3)\n\t})\n\n\tformList.AddTable(lgWithScore(\"field\", \"tool\"), \"fields_form\", func(pa *types.FormPanel) {\n\t\tpa.AddField(lgWithScore(\"title\", \"tool\"), \"field_head_form\", db.Varchar, form.Text).FieldHideLabel().\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field name\", \"tool\"), \"field_name_form\", db.Varchar, form.Text).FieldHideLabel().\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field editable\", \"tool\"), \"field_canedit\", db.Varchar, form.CheckboxSingle).\n\t\t\tFieldOptions(types.FieldOptions{\n\t\t\t\t{Text: \"\", Value: \"y\"},\n\t\t\t\t{Text: \"\", Value: \"n\"},\n\t\t\t}).\n\t\t\tFieldDefault(\"y\").\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"y\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field can add\", \"tool\"), \"field_canadd\", db.Varchar, form.CheckboxSingle).\n\t\t\tFieldOptions(types.FieldOptions{\n\t\t\t\t{Text: \"\", Value: \"y\"},\n\t\t\t\t{Text: \"\", Value: \"n\"},\n\t\t\t}).\n\t\t\tFieldDefault(\"y\").\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"y\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field default\", \"tool\"), \"field_default\", db.Varchar, form.Text).FieldHideLabel().\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field display\", \"tool\"), \"field_display\", db.Varchar, form.SelectSingle).\n\t\t\tFieldOptions(types.FieldOptions{\n\t\t\t\t{Text: lgWithScore(\"field display normal\", \"tool\"), Value: \"0\"},\n\t\t\t\t{Text: lgWithScore(\"field diplay hide\", \"tool\"), Value: \"1\"},\n\t\t\t\t{Text: lgWithScore(\"field diplay edit hide\", \"tool\"), Value: \"2\"},\n\t\t\t\t{Text: lgWithScore(\"field diplay create hide\", \"tool\"), Value: \"3\"},\n\t\t\t}).\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"0\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"db type\", \"tool\"), \"field_db_type_form\", db.Varchar, form.SelectSingle).\n\t\t\tFieldOptions(databaseTypeOptions()).\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"Int\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"form type\", \"tool\"), \"field_form_type_form\", db.Varchar, form.SelectSingle).\n\t\t\tFieldOptions(formTypeOptions()).FieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn []string{\"Text\"}\n\t\t})\n\t}).FieldInputWidth(11)\n\n\t// Detail page generate options\n\t// ================================\n\n\tformList.AddField(lgWithScore(\"title\", \"tool\"), \"detail_title\", db.Varchar, form.Text)\n\tformList.AddField(lgWithScore(\"description\", \"tool\"), \"detail_description\", db.Varchar, form.Text)\n\n\tformList.AddField(lgWithScore(\"detail display\", \"tool\"), \"detail_display\", db.Varchar, form.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: lgWithScore(\"follow list page\", \"tool\"), Value: \"0\"},\n\t\t\t{Text: lgWithScore(\"inherit from list page\", \"tool\"), Value: \"1\"},\n\t\t\t{Text: lgWithScore(\"independent from list page\", \"tool\"), Value: \"2\"},\n\t\t}).\n\t\tFieldDefault(\"0\").\n\t\tFieldOnChooseHide(\"0\", \"detail_title\", \"detail_description\", \"fields_detail\")\n\n\tformList.AddTable(lgWithScore(\"field\", \"tool\"), \"fields_detail\", func(pa *types.FormPanel) {\n\t\tpa.AddField(lgWithScore(\"title\", \"tool\"), \"detail_field_head\", db.Varchar, form.Text).FieldHideLabel().\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"field name\", \"tool\"), \"detail_field_name\", db.Varchar, form.Text).FieldHideLabel().\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"\"}\n\t\t\t})\n\t\tpa.AddField(lgWithScore(\"db type\", \"tool\"), \"detail_field_db_type\", db.Varchar, form.SelectSingle).\n\t\t\tFieldOptions(databaseTypeOptions()).\n\t\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\t\treturn []string{\"Int\"}\n\t\t\t})\n\t}).FieldInputWidth(11)\n\n\tformList.SetTabGroups(types.\n\t\tNewTabGroups(\"conn\", \"table\", \"package\", \"pk\", \"permission\", \"extra_import_package\", \"path\", \"extra_code\").\n\t\tAddGroup(\"table_title\", \"table_description\", \"hide_filter_area\", \"filter_form_layout\",\n\t\t\t\"hide_new_button\", \"hide_export_button\", \"hide_edit_button\",\n\t\t\t\"hide_pagination\", \"hide_delete_button\", \"hide_detail_button\",\n\t\t\t\"hide_filter_button\", \"hide_row_selector\", \"hide_query_info\",\n\t\t\t\"fields\").\n\t\tAddGroup(\"form_title\", \"form_description\", \"hide_continue_edit_check_box\", \"hide_reset_button\",\n\t\t\t\"hide_continue_new_check_box\", \"hide_back_button\",\n\t\t\t\"fields_form\").\n\t\tAddGroup(\"detail_display\", \"detail_title\", \"detail_description\", \"fields_detail\")).\n\t\tSetTabHeaders(lgWithScore(\"basic info\", \"tool\"), lgWithScore(\"table info\", \"tool\"),\n\t\t\tlgWithScore(\"form info\", \"tool\"), lgWithScore(\"detail info\", \"tool\"))\n\n\tformList.SetTable(\"tool\").\n\t\tSetTitle(lgWithScore(\"code generate tool\", \"tool\")).\n\t\tSetDescription(lgWithScore(\"code generate tool\", \"tool\")).\n\t\tSetHeader(template.HTML(`<h3 class=\"box-title\">` +\n\t\t\tlgWithScore(\"generate table model\", \"tool\") + `</h3>`))\n\n\tformList.SetInsertFn(func(values form2.Values) error {\n\n\t\ttable := values.Get(\"table\")\n\n\t\tif table == \"\" {\n\t\t\treturn errors.New(\"table is empty\")\n\t\t}\n\n\t\tif values.Get(\"permission\") == \"y\" {\n\t\t\ttools.InsertPermissionOfTable(s.conn, table)\n\t\t}\n\n\t\toutput := values.Get(\"path\")\n\n\t\tif output == \"\" {\n\t\t\treturn errors.New(\"output path is empty\")\n\t\t}\n\n\t\tconnName := values.Get(\"conn\")\n\n\t\tfields := make(tools.Fields, len(values[\"field_head\"]))\n\n\t\tfor i := 0; i < len(values[\"field_head\"]); i++ {\n\t\t\tfields[i] = tools.Field{\n\t\t\t\tHead:         values[\"field_head\"][i],\n\t\t\t\tName:         values[\"field_name\"][i],\n\t\t\t\tDBType:       values[\"field_db_type\"][i],\n\t\t\t\tFilterable:   values[\"field_filterable\"][i] == \"y\",\n\t\t\t\tSortable:     values[\"field_sortable\"][i] == \"y\",\n\t\t\t\tHide:         values[\"field_hide\"][i] == \"y\",\n\t\t\t\tInfoEditable: values[\"info_field_editable\"][i] == \"y\",\n\t\t\t}\n\t\t}\n\n\t\textraImport := \"\"\n\t\tfor _, pack := range values[\"extra_import_package[]\"] {\n\t\t\tif extraImport != \"\" {\n\t\t\t\textraImport += `\n`\n\t\t\t}\n\t\t\textraImport += `\t\"` + pack + `\"`\n\t\t}\n\n\t\tformFields := make(tools.Fields, len(values[\"field_head_form\"]))\n\n\t\tfor i := 0; i < len(values[\"field_head_form\"]); i++ {\n\t\t\textraFun := \"\"\n\t\t\tif values[\"field_name_form\"][i] == `created_at` {\n\t\t\t\textraFun += `.FieldNowWhenInsert()`\n\t\t\t} else if values[\"field_name_form\"][i] == `updated_at` {\n\t\t\t\textraFun += `.FieldNowWhenUpdate()`\n\t\t\t} else if values[\"field_default\"][i] != \"\" && !strings.Contains(values[\"field_default\"][i], `\"`) {\n\t\t\t\tvalues[\"field_default\"][i] = `\"` + values[\"field_default\"][i] + `\"`\n\t\t\t}\n\t\t\tformFields[i] = tools.Field{\n\t\t\t\tHead:       values[\"field_head_form\"][i],\n\t\t\t\tName:       values[\"field_name_form\"][i],\n\t\t\t\tDefault:    values[\"field_default\"][i],\n\t\t\t\tFormType:   values[\"field_form_type_form\"][i],\n\t\t\t\tDBType:     values[\"field_db_type_form\"][i],\n\t\t\t\tCanAdd:     values[\"field_canadd\"][i] == \"y\",\n\t\t\t\tEditable:   values[\"field_canedit\"][i] == \"y\",\n\t\t\t\tFormHide:   values[\"field_display\"][i] == \"1\",\n\t\t\t\tCreateHide: values[\"field_display\"][i] == \"2\",\n\t\t\t\tEditHide:   values[\"field_display\"][i] == \"3\",\n\t\t\t\tExtraFun:   extraFun,\n\t\t\t}\n\t\t}\n\n\t\tdetailFields := make(tools.Fields, len(values[\"detail_field_head\"]))\n\n\t\tfor i := 0; i < len(values[\"detail_field_head\"]); i++ {\n\t\t\tdetailFields[i] = tools.Field{\n\t\t\t\tHead:   values[\"detail_field_head\"][i],\n\t\t\t\tName:   values[\"detail_field_name\"][i],\n\t\t\t\tDBType: values[\"detail_field_db_type\"][i],\n\t\t\t}\n\t\t}\n\n\t\tdetailDisplay, _ := strconv.ParseUint(values.Get(\"detail_display\"), 10, 64)\n\n\t\terr := tools.Generate(tools.NewParamWithFields(tools.Config{\n\t\t\tConnection:               connName,\n\t\t\tDriver:                   s.c.Databases[connName].Driver,\n\t\t\tPackage:                  values.Get(\"package\"),\n\t\t\tTable:                    table,\n\t\t\tHideFilterArea:           values.Get(\"hide_filter_area\") == \"y\",\n\t\t\tHideNewButton:            values.Get(\"hide_new_button\") == \"y\",\n\t\t\tHideExportButton:         values.Get(\"hide_export_button\") == \"y\",\n\t\t\tHideEditButton:           values.Get(\"hide_edit_button\") == \"y\",\n\t\t\tHideDeleteButton:         values.Get(\"hide_delete_button\") == \"y\",\n\t\t\tHideDetailButton:         values.Get(\"hide_detail_button\") == \"y\",\n\t\t\tHideFilterButton:         values.Get(\"hide_filter_button\") == \"y\",\n\t\t\tHideRowSelector:          values.Get(\"hide_row_selector\") == \"y\",\n\t\t\tHidePagination:           values.Get(\"hide_pagination\") == \"y\",\n\t\t\tHideQueryInfo:            values.Get(\"hide_query_info\") == \"y\",\n\t\t\tHideContinueEditCheckBox: values.Get(\"hide_continue_edit_check_box\") == \"y\",\n\t\t\tHideContinueNewCheckBox:  values.Get(\"hide_continue_new_check_box\") == \"y\",\n\t\t\tHideResetButton:          values.Get(\"hide_reset_button\") == \"y\",\n\t\t\tHideBackButton:           values.Get(\"hide_back_button\") == \"y\",\n\t\t\tFilterFormLayout:         form.GetLayoutFromString(values.Get(\"filter_form_layout\")),\n\t\t\tSchema:                   values.Get(\"schema\"),\n\t\t\tOutput:                   output,\n\t\t\tDetailDisplay:            uint8(detailDisplay),\n\t\t\tFormTitle:                values.Get(\"form_title\"),\n\t\t\tFormDescription:          values.Get(\"form_description\"),\n\t\t\tDetailTitle:              values.Get(\"detail_title\"),\n\t\t\tDetailDescription:        values.Get(\"detail_description\"),\n\t\t\tTableTitle:               values.Get(\"table_title\"),\n\t\t\tTableDescription:         values.Get(\"table_description\"),\n\t\t\tExtraImport:              extraImport,\n\t\t\tExtraCode:                escape(values.Get(\"extra_code\")),\n\t\t}, fields, formFields, detailFields))\n\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn tools.GenerateTables(output, values.Get(\"package\"), []string{table}, false)\n\t})\n\n\tformList.EnableAjaxData(types.AjaxData{\n\t\tSuccessTitle: lgWithScore(\"generate table model\", \"tool\"),\n\t\tErrorTitle:   lgWithScore(\"generate table model\", \"tool\"),\n\t\tSuccessText:  lgWithScore(\"generate table model success\", \"tool\"),\n\t\tErrorText:    lgWithScore(\"generate table model fail\", \"tool\"),\n\t\tDisableJump:  true,\n\t})\n\n\tformList.SetFooterHtml(utils.ParseHTML(\"generator\", tmpls[\"generator\"], map[string]string{\n\t\t\"prefix\": \"go_admin_\" + config.GetAppID() + \"_generator_\",\n\t}))\n\n\tformList.SetFormNewBtnWord(template.HTML(lgWithScore(\"generate\", \"tool\")))\n\tformList.SetWrapper(func(content tmpl.HTML) tmpl.HTML {\n\t\theadli := html.LiEl().SetClass(\"list-group-item\", \"list-head\").\n\t\t\tSetContent(template.HTML(lgWithScore(\"generated tables\", \"tool\"))).Get()\n\t\treturn html.UlEl().SetClass(\"save_table_list\", \"list-group\").SetContent(\n\t\t\theadli).Get() + content\n\t})\n\n\tformList.SetHideSideBar()\n\n\treturn generateTool\n}\n\n// -------------------------\n// helper functions\n// -------------------------\n\nfunc encodePassword(pwd []byte) string {\n\thash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn string(hash)\n}\n\nfunc label(ctx *context.Context) types.LabelAttribute {\n\treturn template.Get(ctx, config.GetTheme()).Label().SetType(\"success\")\n}\n\nfunc lg(v string) string {\n\treturn language.Get(v)\n}\n\nfunc defaultFilterFn(val string, def ...string) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tif len(def) > 0 {\n\t\t\tif value.Value == def[0] {\n\t\t\t\treturn val\n\t\t\t}\n\t\t} else {\n\t\t\tif value.Value == \"\" {\n\t\t\t\treturn val\n\t\t\t}\n\t\t}\n\t\treturn value.Value\n\t}\n}\n\nfunc lgWithScore(v string, score ...string) string {\n\treturn language.GetWithScope(v, score...)\n}\n\nfunc lgWithConfigScore(v string, score ...string) string {\n\tscores := append([]string{\"config\"}, score...)\n\treturn language.GetWithScope(v, scores...)\n}\n\nfunc link(url, content string) tmpl.HTML {\n\treturn html.AEl().\n\t\tSetAttr(\"href\", url).\n\t\tSetContent(template.HTML(lg(content))).\n\t\tGet()\n}\n\nfunc escape(s string) string {\n\tif s == \"\" {\n\t\treturn \"\"\n\t}\n\ts, err := url.QueryUnescape(s)\n\tif err != nil {\n\t\tlogger.Error(\"escape error\", err)\n\t}\n\treturn s\n}\n\nfunc checkJSON(values form2.Values, key string) error {\n\tv := values.Get(key)\n\tif v != \"\" && !utils.IsJSON(v) {\n\t\treturn errors.New(\"wrong \" + key)\n\t}\n\treturn nil\n}\n\nfunc (s *SystemTable) table(table string) *db.SQL {\n\treturn s.connection().Table(table)\n}\n\nfunc (s *SystemTable) connection() *db.SQL {\n\treturn db.WithDriver(s.conn)\n}\n\nfunc interfaces(arr []string) []interface{} {\n\tvar iarr = make([]interface{}, len(arr))\n\n\tfor key, v := range arr {\n\t\tiarr[key] = v\n\t}\n\n\treturn iarr\n}\n\nfunc addSwitchForTool(formList *types.FormPanel, head, field, def string, row ...int) {\n\tformList.AddField(lgWithScore(head, \"tool\"), field, db.Varchar, form.Switch).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: lgWithScore(\"show\", \"tool\"), Value: \"n\"},\n\t\t\t{Text: lgWithScore(\"hide\", \"tool\"), Value: \"y\"},\n\t\t}).FieldDefault(def)\n\tif len(row) > 0 {\n\t\tformList.FieldRowWidth(row[0])\n\t}\n\tif len(row) > 1 {\n\t\tformList.FieldHeadWidth(row[1])\n\t}\n\tif len(row) > 2 {\n\t\tformList.FieldInputWidth(row[2])\n\t}\n}\n\nfunc formTypeOptions() types.FieldOptions {\n\topts := make(types.FieldOptions, len(form.AllType))\n\tfor i := 0; i < len(form.AllType); i++ {\n\t\tv := form.AllType[i].Name()\n\t\topts[i] = types.FieldOption{Text: v, Value: v}\n\t}\n\treturn opts\n}\n\nfunc databaseTypeOptions() types.FieldOptions {\n\topts := make(types.FieldOptions, len(db.IntTypeList)+\n\t\tlen(db.StringTypeList)+\n\t\tlen(db.FloatTypeList)+\n\t\tlen(db.UintTypeList)+\n\t\tlen(db.BoolTypeList))\n\tz := 0\n\tfor _, t := range db.IntTypeList {\n\t\ttext := string(t)\n\t\tv := cases.Title(textLang.Und).String(strings.ToLower(text))\n\t\topts[z] = types.FieldOption{Text: text, Value: v}\n\t\tz++\n\t}\n\tfor _, t := range db.StringTypeList {\n\t\ttext := string(t)\n\t\tv := cases.Title(textLang.Und).String(strings.ToLower(text))\n\t\topts[z] = types.FieldOption{Text: text, Value: v}\n\t\tz++\n\t}\n\tfor _, t := range db.FloatTypeList {\n\t\ttext := string(t)\n\t\tv := cases.Title(textLang.Und).String(strings.ToLower(text))\n\t\topts[z] = types.FieldOption{Text: text, Value: v}\n\t\tz++\n\t}\n\tfor _, t := range db.UintTypeList {\n\t\ttext := string(t)\n\t\tv := cases.Title(textLang.Und).String(strings.ToLower(text))\n\t\topts[z] = types.FieldOption{Text: text, Value: v}\n\t\tz++\n\t}\n\tfor _, t := range db.BoolTypeList {\n\t\ttext := string(t)\n\t\tv := cases.Title(textLang.Und).String(strings.ToLower(text))\n\t\topts[z] = types.FieldOption{Text: text, Value: v}\n\t\tz++\n\t}\n\treturn opts\n}\n\nfunc getType(typeName string) string {\n\tr, _ := regexp.Compile(`\\(.*?\\)`)\n\ttypeName = r.ReplaceAllString(typeName, \"\")\n\tr2, _ := regexp.Compile(`unsigned(.*)`)\n\treturn strings.TrimSpace(cases.Title(textLang.Und).String(strings.ToLower(r2.ReplaceAllString(typeName, \"\"))))\n}\n"
  },
  {
    "path": "plugins/admin/modules/table/table.go",
    "content": "package table\n\nimport (\n\t\"html/template\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/paginator\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Generator func(ctx *context.Context) Table\n\ntype GeneratorList map[string]Generator\n\nfunc (g GeneratorList) Add(key string, gen Generator) {\n\tg[key] = gen\n}\n\nfunc (g GeneratorList) Combine(list GeneratorList) GeneratorList {\n\tfor key, gen := range list {\n\t\tif _, ok := g[key]; !ok {\n\t\t\tg[key] = gen\n\t\t}\n\t}\n\treturn g\n}\n\nfunc (g GeneratorList) CombineAll(gens []GeneratorList) GeneratorList {\n\tfor _, list := range gens {\n\t\tfor key, gen := range list {\n\t\t\tif _, ok := g[key]; !ok {\n\t\t\t\tg[key] = gen\n\t\t\t}\n\t\t}\n\t}\n\treturn g\n}\n\ntype Table interface {\n\tGetInfo() *types.InfoPanel\n\tGetDetail() *types.InfoPanel\n\tGetDetailFromInfo() *types.InfoPanel\n\tGetForm() *types.FormPanel\n\tGetNewForm() *types.FormPanel\n\tGetActualNewForm() *types.FormPanel\n\n\tGetCanAdd() bool\n\tGetEditable() bool\n\tGetDeletable() bool\n\tGetExportable() bool\n\n\tGetPrimaryKey() PrimaryKey\n\n\tGetData(ctx *context.Context, params parameter.Parameters) (PanelInfo, error)\n\tGetDataWithIds(ctx *context.Context, params parameter.Parameters) (PanelInfo, error)\n\tGetDataWithId(params parameter.Parameters) (FormInfo, error)\n\tUpdateData(ctx *context.Context, dataList form.Values) error\n\tInsertData(ctx *context.Context, ddataList form.Values) error\n\tDeleteData(pk string) error\n\n\tGetNewFormInfo() FormInfo\n\n\tGetOnlyInfo() bool\n\tGetOnlyDetail() bool\n\tGetOnlyNewForm() bool\n\tGetOnlyUpdateForm() bool\n\n\tCopy() Table\n}\n\ntype BaseTable struct {\n\tInfo           *types.InfoPanel\n\tForm           *types.FormPanel\n\tNewForm        *types.FormPanel\n\tDetail         *types.InfoPanel\n\tCanAdd         bool\n\tEditable       bool\n\tDeletable      bool\n\tExportable     bool\n\tOnlyInfo       bool\n\tOnlyDetail     bool\n\tOnlyNewForm    bool\n\tOnlyUpdateForm bool\n\tPrimaryKey     PrimaryKey\n}\n\nfunc (base *BaseTable) GetInfo() *types.InfoPanel {\n\treturn base.Info.SetPrimaryKey(base.PrimaryKey.Name, base.PrimaryKey.Type)\n}\n\nfunc (base *BaseTable) GetDetail() *types.InfoPanel {\n\treturn base.Detail.SetPrimaryKey(base.PrimaryKey.Name, base.PrimaryKey.Type)\n}\n\nfunc (base *BaseTable) GetDetailFromInfo() *types.InfoPanel {\n\tdetail := base.GetDetail()\n\tdetail.FieldList = make(types.FieldList, len(base.Info.FieldList))\n\tcopy(detail.FieldList, base.Info.FieldList)\n\treturn detail\n}\n\nfunc (base *BaseTable) GetForm() *types.FormPanel {\n\treturn base.Form.SetPrimaryKey(base.PrimaryKey.Name, base.PrimaryKey.Type)\n}\n\nfunc (base *BaseTable) GetNewForm() *types.FormPanel {\n\treturn base.NewForm.SetPrimaryKey(base.PrimaryKey.Name, base.PrimaryKey.Type)\n}\n\nfunc (base *BaseTable) GetActualNewForm() *types.FormPanel {\n\tif len(base.NewForm.FieldList) == 0 {\n\t\treturn base.Form\n\t}\n\treturn base.NewForm\n}\n\nfunc (base *BaseTable) GetCanAdd() bool {\n\treturn base.CanAdd\n}\n\nfunc (base *BaseTable) GetPrimaryKey() PrimaryKey { return base.PrimaryKey }\nfunc (base *BaseTable) GetEditable() bool         { return base.Editable }\nfunc (base *BaseTable) GetDeletable() bool        { return base.Deletable }\nfunc (base *BaseTable) GetExportable() bool       { return base.Exportable }\nfunc (base *BaseTable) GetOnlyInfo() bool         { return base.OnlyInfo }\nfunc (base *BaseTable) GetOnlyDetail() bool       { return base.OnlyDetail }\nfunc (base *BaseTable) GetOnlyNewForm() bool      { return base.OnlyNewForm }\nfunc (base *BaseTable) GetOnlyUpdateForm() bool   { return base.OnlyUpdateForm }\n\nfunc (base *BaseTable) GetPaginator(ctx *context.Context, size int, params parameter.Parameters, extraHtml ...template.HTML) types.PaginatorAttribute {\n\n\tvar eh template.HTML\n\n\tif len(extraHtml) > 0 {\n\t\teh = extraHtml[0]\n\t}\n\n\treturn paginator.Get(ctx, paginator.Config{\n\t\tSize:         size,\n\t\tParam:        params,\n\t\tPageSizeList: base.Info.GetPageSizeList(),\n\t}).SetExtraInfo(eh)\n}\n\ntype PanelInfo struct {\n\tThead          types.Thead              `json:\"thead\"`\n\tInfoList       types.InfoList           `json:\"info_list\"`\n\tFilterFormData types.FormFields         `json:\"filter_form_data\"`\n\tPaginator      types.PaginatorAttribute `json:\"-\"`\n\tTitle          string                   `json:\"title\"`\n\tDescription    string                   `json:\"description\"`\n}\n\ntype FormInfo struct {\n\tFieldList         types.FormFields        `json:\"field_list\"`\n\tGroupFieldList    types.GroupFormFields   `json:\"group_field_list\"`\n\tGroupFieldHeaders types.GroupFieldHeaders `json:\"group_field_headers\"`\n\tTitle             string                  `json:\"title\"`\n\tDescription       string                  `json:\"description\"`\n}\n\ntype PrimaryKey struct {\n\tType db.DatabaseType\n\tName string\n}\n\nconst (\n\tDefaultPrimaryKeyName = \"id\"\n\tDefaultConnectionName = \"default\"\n)\n\nvar (\n\tservices service.List\n\tcount    uint32\n\tlock     sync.Mutex\n)\n\nfunc SetServices(srv service.List) {\n\tlock.Lock()\n\tdefer lock.Unlock()\n\n\tif atomic.LoadUint32(&count) != 0 {\n\t\tpanic(\"can not initialize twice\")\n\t}\n\n\tservices = srv\n}\n"
  },
  {
    "path": "plugins/admin/modules/table/tmpl/choose_table_ajax.tmpl",
    "content": "{{define \"choose_table_ajax\"}}\n        NProgress.start();\n        let info_table = $(\"tbody.fields-table\");\n        info_table.find(\"tr\").remove();\n        let tpl = $(\"template.fields-tpl\").html();\n        for (let i = 0; i < data.data[0].length; i++) {\n            info_table.append(tpl);\n        }\n        let trs = info_table.find(\"tr\");\n        for (let i = 0; i < data.data[0].length; i++) {\n            $(trs[i]).find('.field_head').val(data.data[0][i]);\n            $(trs[i]).find('.field_name').val(data.data[1][i]);\n            $(trs[i]).find('select.field_db_type').val(data.data[2][i]).select2();\n        }\n        let form_table = $(\"tbody.fields_form-table\");\n        form_table.find(\"tr\").remove();\n        let tpl_form = $(\"template.fields_form-tpl\").html();\n        for (let i = 0; i < data.data[0].length; i++) {\n            form_table.append(tpl_form);\n        }\n        let trs_form = form_table.find(\"tr\");\n        let pk = $(\".pk\").val();\n        for (let i = 0; i < data.data[0].length; i++) {\n            $(trs_form[i]).find('.field_head_form').val(data.data[0][i]);\n            $(trs_form[i]).find('.field_name_form').val(data.data[1][i]);\n            $(trs_form[i]).find('input.field_canedit').iCheck(\"check\");\n            if (!(data.data[1][i] === pk || (pk === \"\" && data.data[1][i] === \"id\"))) {\n                $(trs_form[i]).find('input.field_canadd').iCheck(\"check\");\n            }\n            if (data.data[1][i] === \"created_at\" || data.data[1][i] === \"updated_at\") {\n                $(trs_form[i]).find('select.field_display').val(\"1\").select2();\n            }\n            $(trs_form[i]).find('select.field_db_type_form').val(data.data[2][i]).select2();\n            $(trs_form[i]).find('select.field_form_type_form').val(data.data[3][i]).select2();\n        }\n        $(\".hide_filter_area.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_new_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_export_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_edit_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_pagination.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_delete_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_detail_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_filter_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_row_selector.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_query_info.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".filter_form_layout.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_continue_edit_check_box.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_reset_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_continue_new_check_box.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_back_button.ga_checkbox\").bootstrapSwitch('state', true);\n\n        let detail_table = $(\"tbody.fields_detail-table\");\n        detail_table.find(\"tr\").remove();\n\n        NProgress.done();\n{{end}}"
  },
  {
    "path": "plugins/admin/modules/table/tmpl/generator.tmpl",
    "content": "{{define \"generator\"}}\n    <script>\n        $(function () {\n            let pack = localStorage.getItem(\"{{index . \"prefix\"}}package\");\n            let pk = localStorage.getItem(\"{{index . \"prefix\"}}pk\");\n            let path = localStorage.getItem(\"{{index . \"prefix\"}}path\");\n            if (pack !== \"\") {\n                $(\".package\").val(pack);\n            }\n            if (pk !== \"\") {\n                $(\".pk\").val(pk);\n            }\n            if (path !== \"\") {\n                $(\".path\").val(path);\n            }\n\n            let save_table_list_str = localStorage.getItem(\"{{index . \"prefix\"}}save_table_list\");\n            if (save_table_list_str && save_table_list_str !== \"\") {\n                addTableToList(JSON.parse(save_table_list_str));\n            }\n        });\n\n        function getLis() {\n            return $(\"li.list-group-item.list-group-item-action\")\n        }\n\n        function addTableToList(save_table_list) {\n            let list_group = $(\".list-group.save_table_list\");\n            getLis().remove();\n            for (let i = save_table_list.length - 1; i > save_table_list.length - 6 && i > -1; i--) {\n                let new_li = \"<li class='list-group-item list-group-item-action'>\" + save_table_list[i] + \"</li>\";\n                list_group.append(new_li);\n            }\n            list_group.show();\n            getLis().on(\"click\", restoreTableData);\n        }\n\n        $(\".nav.nav-tabs li a\").on(\"click\", function () {\n            let href = $(this).attr(\"href\");\n            let trs = $(\".list-group-item.list-group-item-action\");\n            if (trs.length > 0) {\n                if (href === \"#tab-form-0\") {\n                    $(\".list-group.save_table_list\").show();\n                }\n                if (href === \"#tab-form-1\" || href === \"#tab-form-2\" || href === \"#tab-form-3\") {\n                    $(\".list-group.save_table_list\").hide();\n                }\n            }\n        });\n\n        $(\".btn-group.pull-right .btn.btn-primary\").on(\"click\", function () {\n            let pack = $(\".package\").val();\n            let pk = $(\".pk\").val();\n            let path = $(\".path\").val();\n            if (pack !== \"\") {\n                localStorage.setItem(\"{{index . \"prefix\"}}package\", pack);\n            }\n            if (pk !== \"\") {\n                localStorage.setItem(\"{{index . \"prefix\"}}pk\", pk);\n            }\n            if (path !== \"\") {\n                localStorage.setItem(\"{{index . \"prefix\"}}path\", path);\n            }\n            let table = $(\"select.table\").val();\n            if (table && table !== \"\") {\n                let save_table_list = [];\n                let save_table_list_str = localStorage.getItem(\"{{index . \"prefix\"}}save_table_list\");\n                if (save_table_list_str && save_table_list_str !== \"\") {\n                    save_table_list = JSON.parse(save_table_list_str);\n                }\n                let table_index = save_table_list.indexOf(table);\n                if (table_index !== -1) {\n                    save_table_list.splice(table_index, 1);\n                }\n                save_table_list.push(table);\n                localStorage.setItem(\"{{index . \"prefix\"}}save_table_list\", JSON.stringify(save_table_list));\n                localStorage.setItem(\"{{index . \"prefix\"}}save_table_\" + table, getItemObjData());\n\n                addTableToList(save_table_list);\n            }\n        });\n\n        function restoreTableData() {\n            NProgress.start();\n            let data_str = localStorage.getItem(\"{{index . \"prefix\"}}save_table_\" + $(this).html());\n            if (data_str && data_str !== \"\") {\n                let data = JSON.parse(data_str);\n                $(\".package\").val(data.package);\n                $(\".pk\").val(data.pk);\n                $(\".path\").val(data.path);\n                $(\"select.conn\").val(data.conn).select2();\n                conn_req_refresh($(\"select.table\"), false, \"select\");\n                setTimeout(function () {\n                    $(\"select.table\").val(data.table).select2();\n                }, 2000);\n\n                $(\".extra_import_package\").val(data.extra_import_package).select2();\n                $(\".table_title\").val(data.table_title);\n                $(\".table_description\").val(data.table_description);\n                $(\".form_title\").val(data.form_title);\n                $(\".form_description\").val(data.form_description);\n                $(\".detail_title\").val(data.detail_title);\n                $(\".detail_description\").val(data.detail_description);\n                $(\"select.detail_display\").val(data.detail_display).select2();\n                if (data.detail_display !== \"0\") {\n                    $(\"label[for='detail_title']\").parent().show();\n                    $(\"label[for='detail_description']\").parent().show();\n                    $(\"label[for='fields_detail']\").parent().show();\n                }\n\n                if (extra_codeeditor && data.extra_code && data.extra_code !== \"\") {\n                    extra_codeeditor.setValue(decodeURIComponent(data.extra_code));\n                }\n\n                let info_table = $(\"tbody.fields-table\");\n                info_table.find(\"tr\").remove();\n                let tpl = $(\"template.fields-tpl\").html();\n                for (let i = 0; i < data.infos.length; i++) {\n                    info_table.append(tpl);\n                }\n\n                let trs = info_table.find(\"tr\");\n                for (let i = 0; i < trs.length; i++) {\n                    $(trs[i]).find('.field_head').val(data.infos[i][0]);\n                    $(trs[i]).find('.field_name').val(data.infos[i][1]);\n                    checkItemSwitch($(trs[i]).find('input.field_filterable'), data.infos[i][2]);\n                    checkItemSwitch($(trs[i]).find('input.field_sortable'), data.infos[i][3]);\n                    checkItemSwitch($(trs[i]).find('input.field_hide'), data.infos[i][4]);\n                    checkItemSwitch($(trs[i]).find('input.info_field_editable'), data.infos[i][5]);\n                    $(trs[i]).find('select.field_db_type').val(data.infos[i][6]).select2();\n                }\n\n                let form_table = $(\"tbody.fields_form-table\");\n                form_table.find(\"tr\").remove();\n                let tpl_form = $(\"template.fields_form-tpl\").html();\n                for (let i = 0; i < data.forms.length; i++) {\n                    form_table.append(tpl_form);\n                }\n\n                let trs_form = form_table.find(\"tr\");\n                for (let i = 0; i < trs_form.length; i++) {\n                    $(trs_form[i]).find('.field_head_form').val(data.forms[i][0]);\n                    $(trs_form[i]).find('.field_name_form').val(data.forms[i][1]);\n                    checkItemSwitch($(trs_form[i]).find('input.field_canedit'), data.forms[i][2]);\n                    checkItemSwitch($(trs_form[i]).find('input.field_canadd'), data.forms[i][3]);\n                    $(trs_form[i]).find('.field_default').val(data.forms[i][4]);\n                    $(trs_form[i]).find('select.field_display').val(data.forms[i][5]).select2();\n                    $(trs_form[i]).find('select.field_db_type_form').val(data.forms[i][6]).select2();\n                    $(trs_form[i]).find('select.field_form_type_form').val(data.forms[i][7]).select2();\n                }\n\n                let detail_table = $(\"tbody.fields_detail-table\");\n                detail_table.find(\"tr\").remove();\n                let tpl_detail = $(\"template.fields_detail-tpl\").html();\n                for (let i = 0; i < data.details.length; i++) {\n                    detail_table.append(tpl_detail);\n                }\n\n                let trs_detail = detail_table.find(\"tr\");\n                for (let i = 0; i < trs_detail.length; i++) {\n                    $(trs_detail[i]).find('.field_head').val(data.details[i][0]);\n                    $(trs_detail[i]).find('.field_name').val(data.details[i][1]);\n                    $(trs_detail[i]).find('select.field_db_type').val(data.details[i][2]).select2();\n                }\n\n                toggleItemSwitchOpposite($(\".permission.ga_checkbox\"), data.permission);\n                toggleItemSwitch($(\".hide_filter_area.ga_checkbox\"), data.hide_filter_area);\n                toggleItemSwitch($(\".hide_new_button.ga_checkbox\"), data.hide_new_button);\n                toggleItemSwitch($(\".hide_export_button.ga_checkbox\"), data.hide_export_button);\n                toggleItemSwitch($(\".hide_edit_button.ga_checkbox\"), data.hide_edit_button);\n                toggleItemSwitch($(\".hide_pagination.ga_checkbox\"), data.hide_pagination);\n                toggleItemSwitch($(\".hide_delete_button.ga_checkbox\"), data.hide_delete_button);\n                toggleItemSwitch($(\".hide_detail_button.ga_checkbox\"), data.hide_detail_button);\n                toggleItemSwitch($(\".hide_filter_button.ga_checkbox\"), data.hide_filter_button);\n                toggleItemSwitch($(\".hide_row_selector.ga_checkbox\"), data.hide_row_selector);\n                toggleItemSwitch($(\".hide_query_info.ga_checkbox\"), data.hide_query_info);\n                toggleItemSwitch($(\".filter_form_layout.ga_checkbox\"), data.filter_form_layout);\n                toggleItemSwitch($(\".hide_continue_edit_check_box.ga_checkbox\"), data.hide_continue_edit_check_box);\n                toggleItemSwitch($(\".hide_reset_button.ga_checkbox\"), data.hide_reset_button);\n                toggleItemSwitch($(\".hide_continue_new_check_box.ga_checkbox\"), data.hide_continue_new_check_box);\n                toggleItemSwitch($(\".hide_back_button.ga_checkbox\"), data.hide_back_button);\n            }\n            NProgress.done();\n        }\n\n        function toggleItemSwitch(obj, val) {\n            if (val === \"n\") {\n                $(obj).bootstrapSwitch('state', true);\n            } else {\n                $(obj).bootstrapSwitch('state', false);\n            }\n        }\n\n        function toggleItemSwitchOpposite(obj, val) {\n            if (val === \"n\") {\n                $(obj).bootstrapSwitch('state', false);\n            } else {\n                $(obj).bootstrapSwitch('state', true);\n            }\n        }\n\n        function checkItemSwitch(obj, val) {\n            if (val === \"y\") {\n                $(obj).iCheck(\"check\")\n            } else {\n                $(obj).iCheck(\"uncheck\")\n            }\n        }\n\n        function getItemSwitchValue(obj) {\n            if ($(obj).hasClass(\"checked\")) {\n                return \"y\"\n            }\n            return \"n\"\n        }\n\n        function getItemObjData() {\n            let data = {};\n            data.conn = $(\"select.conn\").val();\n            data.package = $(\".package\").val();\n            data.pk = $(\".pk\").val();\n            data.path = $(\".path\").val();\n            data.extra_code = $(\"#extra_code_input\").val();\n            data.table = $(\"select.table\").val();\n            data.table_title = $(\".table_title\").val();\n            data.table_description = $(\".table_description\").val();\n            data.form_title = $(\".form_title\").val();\n            data.form_description = $(\".form_description\").val();\n            data.extra_import_package = $(\".extra_import_package\").val();\n            data.detail_title = $(\".detail_title\").val();\n            data.detail_description = $(\".detail_description\").val();\n            data.detail_display = $(\"select.detail_display\").val();\n\n            let infos = [];\n            let trs = $(\"tbody.fields-table\").find(\"tr\");\n            for (let i = 0; i < trs.length; i++) {\n                infos[i] = [];\n                infos[i].push($(trs[i]).find('.field_head').val());\n                infos[i].push($(trs[i]).find('.field_name').val());\n                infos[i].push(getItemSwitchValue($(trs[i]).find('input.field_filterable').parent()));\n                infos[i].push(getItemSwitchValue($(trs[i]).find('input.field_sortable').parent()));\n                infos[i].push(getItemSwitchValue($(trs[i]).find('input.field_hide').parent()));\n                infos[i].push(getItemSwitchValue($(trs[i]).find('input.info_field_editable').parent()));\n                infos[i].push($(trs[i]).find('select.field_db_type').val());\n            }\n            data.infos = infos;\n\n            let forms = [];\n            let trs_form = $(\"tbody.fields_form-table\").find(\"tr\");\n            for (let i = 0; i < trs_form.length; i++) {\n                forms[i] = [];\n                forms[i].push($(trs_form[i]).find('.field_head_form').val());\n                forms[i].push($(trs_form[i]).find('.field_name_form').val());\n                forms[i].push(getItemSwitchValue($(trs_form[i]).find('input.field_canedit').parent()));\n                forms[i].push(getItemSwitchValue($(trs_form[i]).find('input.field_canadd').parent()));\n                forms[i].push($(trs_form[i]).find('.field_default').val());\n                forms[i].push($(trs_form[i]).find('select.field_display').val());\n                forms[i].push($(trs_form[i]).find('select.field_db_type_form').val());\n                forms[i].push($(trs_form[i]).find('select.field_form_type_form').val());\n            }\n            data.forms = forms;\n\n            let details = [];\n            let detail_trs = $(\"tbody.fields_detail-table\").find(\"tr\");\n            for (let i = 0; i < detail_trs.length; i++) {\n                details[i] = [];\n                details[i].push($(detail_trs[i]).find('.field_head').val());\n                details[i].push($(detail_trs[i]).find('.field_name').val());\n                details[i].push($(detail_trs[i]).find('select.field_db_type').val());\n            }\n            data.details = details;\n\n            data.permission = $(\"input[name='permission']\").val();\n\n            data.hide_filter_area = $(\"input[name='hide_filter_area']\").val();\n            data.hide_new_button = $(\"input[name='hide_new_button']\").val();\n            data.hide_export_button = $(\"input[name='hide_export_button']\").val();\n            data.hide_edit_button = $(\"input[name='hide_edit_button']\").val();\n            data.hide_pagination = $(\"input[name='hide_pagination']\").val();\n            data.hide_delete_button = $(\"input[name='hide_delete_button']\").val();\n            data.hide_detail_button = $(\"input[name='hide_detail_button']\").val();\n            data.hide_filter_button = $(\"input[name='hide_filter_button']\").val();\n            data.hide_row_selector = $(\"input[name='hide_row_selector']\").val();\n            data.hide_query_info = $(\"input[name='hide_query_info']\").val();\n            data.filter_form_layout = $(\"select.filter_form_layout\").val();\n\n            data.hide_continue_edit_check_box = $('input[name=\"hide_continue_edit_check_box\"]').val();\n            data.hide_reset_button = $('input[name=\"hide_reset_button\"]').val();\n            data.hide_continue_new_check_box = $('input[name=\"hide_continue_new_check_box\"]').val();\n            data.hide_back_button = $('input[name=\"hide_back_button\"]').val();\n\n            return JSON.stringify(data)\n        }\n\n        function conn_req_refresh(selectObj, box, event) {\n            $.ajax({\n                url: \"\\/admin\\/operation\\/_tool_choose_conn\",\n                type: 'post',\n                dataType: 'text',\n                data: {\n                    'value': $(\"select.conn\").val(),\n\n                    'event': event\n                },\n                success: function (data) {\n                    if (typeof (data) === \"string\") {\n                        data = JSON.parse(data);\n                    }\n                    if (data.code === 0) {\n\n\n                        if (selectObj.length > 0) {\n                            if (typeof (data.data) === \"object\") {\n                                if (box) {\n                                    conn_updateBoxSelections(selectObj, data.data)\n                                } else {\n                                    if (typeof (selectObj.attr(\"multiple\")) !== \"undefined\") {\n                                        selectObj.html(\"\");\n                                    }\n                                    selectObj.select2({\n                                        data: data.data\n                                    });\n                                }\n                            } else {\n                                if (box) {\n                                    selectObj.val(data.data).select2()\n                                } else {\n\n                                }\n                            }\n                        } else {\n                            $('.table').val(data.data);\n                        }\n\n\n                    } else {\n                        swal(data.msg, '', 'error');\n                    }\n                },\n                error: function () {\n                    alert('error')\n                }\n            });\n        }\n    </script>\n    <style>\n        .save_table_list {\n            position: absolute;\n            right: 45px;\n            top: 200px;\n            background-color: white;\n            width: 300px;\n            min-height: 50px;\n            z-index: 9999;\n            display: none;\n        }\n\n        .list-group-item.list-head {\n            background-color: #5a5a5a;\n            border-color: #5a5a5a;\n            font-weight: bold;\n            color: white;\n        }\n\n        .list-group-item.list-group-item-action {\n            cursor: pointer;\n        }\n    </style>\n{{end}}"
  },
  {
    "path": "plugins/admin/modules/table/tmpl.go",
    "content": "package table\n\nvar tmpls = map[string]string{\"choose_table_ajax\": `{{define \"choose_table_ajax\"}}\n        NProgress.start();\n        let info_table = $(\"tbody.fields-table\");\n        info_table.find(\"tr\").remove();\n        let tpl = $(\"template.fields-tpl\").html();\n        for (let i = 0; i < data.data[0].length; i++) {\n            info_table.append(tpl);\n        }\n        let trs = info_table.find(\"tr\");\n        for (let i = 0; i < data.data[0].length; i++) {\n            $(trs[i]).find('.field_head').val(data.data[0][i]);\n            $(trs[i]).find('.field_name').val(data.data[1][i]);\n            $(trs[i]).find('select.field_db_type').val(data.data[2][i]).select2();\n        }\n        let form_table = $(\"tbody.fields_form-table\");\n        form_table.find(\"tr\").remove();\n        let tpl_form = $(\"template.fields_form-tpl\").html();\n        for (let i = 0; i < data.data[0].length; i++) {\n            form_table.append(tpl_form);\n        }\n        let trs_form = form_table.find(\"tr\");\n        let pk = $(\".pk\").val();\n        for (let i = 0; i < data.data[0].length; i++) {\n            $(trs_form[i]).find('.field_head_form').val(data.data[0][i]);\n            $(trs_form[i]).find('.field_name_form').val(data.data[1][i]);\n            $(trs_form[i]).find('input.field_canedit').iCheck(\"check\");\n            if (!(data.data[1][i] === pk || (pk === \"\" && data.data[1][i] === \"id\"))) {\n                $(trs_form[i]).find('input.field_canadd').iCheck(\"check\");\n            }\n            if (data.data[1][i] === \"created_at\" || data.data[1][i] === \"updated_at\") {\n                $(trs_form[i]).find('select.field_display').val(\"1\").select2();\n            }\n            $(trs_form[i]).find('select.field_db_type_form').val(data.data[2][i]).select2();\n            $(trs_form[i]).find('select.field_form_type_form').val(data.data[3][i]).select2();\n        }\n        $(\".hide_filter_area.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_new_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_export_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_edit_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_pagination.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_delete_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_detail_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_filter_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_row_selector.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_query_info.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".filter_form_layout.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_continue_edit_check_box.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_reset_button.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_continue_new_check_box.ga_checkbox\").bootstrapSwitch('state', true);\n        $(\".hide_back_button.ga_checkbox\").bootstrapSwitch('state', true);\n\n        let detail_table = $(\"tbody.fields_detail-table\");\n        detail_table.find(\"tr\").remove();\n\n        NProgress.done();\n{{end}}`, \"generator\": `{{define \"generator\"}}\n    <script>\n        $(function () {\n            let pack = localStorage.getItem(\"{{index . \"prefix\"}}package\");\n            let pk = localStorage.getItem(\"{{index . \"prefix\"}}pk\");\n            let path = localStorage.getItem(\"{{index . \"prefix\"}}path\");\n            if (pack !== \"\") {\n                $(\".package\").val(pack);\n            }\n            if (pk !== \"\") {\n                $(\".pk\").val(pk);\n            }\n            if (path !== \"\") {\n                $(\".path\").val(path);\n            }\n\n            let save_table_list_str = localStorage.getItem(\"{{index . \"prefix\"}}save_table_list\");\n            if (save_table_list_str && save_table_list_str !== \"\") {\n                addTableToList(JSON.parse(save_table_list_str));\n            }\n        });\n\n        function getLis() {\n            return $(\"li.list-group-item.list-group-item-action\")\n        }\n\n        function addTableToList(save_table_list) {\n            let list_group = $(\".list-group.save_table_list\");\n            getLis().remove();\n            for (let i = save_table_list.length - 1; i > save_table_list.length - 6 && i > -1; i--) {\n                let new_li = \"<li class='list-group-item list-group-item-action'>\" + save_table_list[i] + \"</li>\";\n                list_group.append(new_li);\n            }\n            list_group.show();\n            getLis().on(\"click\", restoreTableData);\n        }\n\n        $(\".nav.nav-tabs li a\").on(\"click\", function () {\n            let href = $(this).attr(\"href\");\n            let trs = $(\".list-group-item.list-group-item-action\");\n            if (trs.length > 0) {\n                if (href === \"#tab-form-0\") {\n                    $(\".list-group.save_table_list\").show();\n                }\n                if (href === \"#tab-form-1\" || href === \"#tab-form-2\" || href === \"#tab-form-3\") {\n                    $(\".list-group.save_table_list\").hide();\n                }\n            }\n        });\n\n        $(\".btn-group.pull-right .btn.btn-primary\").on(\"click\", function () {\n            let pack = $(\".package\").val();\n            let pk = $(\".pk\").val();\n            let path = $(\".path\").val();\n            if (pack !== \"\") {\n                localStorage.setItem(\"{{index . \"prefix\"}}package\", pack);\n            }\n            if (pk !== \"\") {\n                localStorage.setItem(\"{{index . \"prefix\"}}pk\", pk);\n            }\n            if (path !== \"\") {\n                localStorage.setItem(\"{{index . \"prefix\"}}path\", path);\n            }\n            let table = $(\"select.table\").val();\n            if (table && table !== \"\") {\n                let save_table_list = [];\n                let save_table_list_str = localStorage.getItem(\"{{index . \"prefix\"}}save_table_list\");\n                if (save_table_list_str && save_table_list_str !== \"\") {\n                    save_table_list = JSON.parse(save_table_list_str);\n                }\n                let table_index = save_table_list.indexOf(table);\n                if (table_index !== -1) {\n                    save_table_list.splice(table_index, 1);\n                }\n                save_table_list.push(table);\n                localStorage.setItem(\"{{index . \"prefix\"}}save_table_list\", JSON.stringify(save_table_list));\n                localStorage.setItem(\"{{index . \"prefix\"}}save_table_\" + table, getItemObjData());\n\n                addTableToList(save_table_list);\n            }\n        });\n\n        function restoreTableData() {\n            NProgress.start();\n            let data_str = localStorage.getItem(\"{{index . \"prefix\"}}save_table_\" + $(this).html());\n            if (data_str && data_str !== \"\") {\n                let data = JSON.parse(data_str);\n                $(\".package\").val(data.package);\n                $(\".pk\").val(data.pk);\n                $(\".path\").val(data.path);\n                $(\"select.conn\").val(data.conn).select2();\n                conn_req_refresh($(\"select.table\"), false, \"select\");\n                setTimeout(function () {\n                    $(\"select.table\").val(data.table).select2();\n                }, 2000);\n\n                $(\".extra_import_package\").val(data.extra_import_package).select2();\n                $(\".table_title\").val(data.table_title);\n                $(\".table_description\").val(data.table_description);\n                $(\".form_title\").val(data.form_title);\n                $(\".form_description\").val(data.form_description);\n                $(\".detail_title\").val(data.detail_title);\n                $(\".detail_description\").val(data.detail_description);\n                $(\"select.detail_display\").val(data.detail_display).select2();\n                if (data.detail_display !== \"0\") {\n                    $(\"label[for='detail_title']\").parent().show();\n                    $(\"label[for='detail_description']\").parent().show();\n                    $(\"label[for='fields_detail']\").parent().show();\n                }\n\n                if (extra_codeeditor && data.extra_code && data.extra_code !== \"\") {\n                    extra_codeeditor.setValue(decodeURIComponent(data.extra_code));\n                }\n\n                let info_table = $(\"tbody.fields-table\");\n                info_table.find(\"tr\").remove();\n                let tpl = $(\"template.fields-tpl\").html();\n                for (let i = 0; i < data.infos.length; i++) {\n                    info_table.append(tpl);\n                }\n\n                let trs = info_table.find(\"tr\");\n                for (let i = 0; i < trs.length; i++) {\n                    $(trs[i]).find('.field_head').val(data.infos[i][0]);\n                    $(trs[i]).find('.field_name').val(data.infos[i][1]);\n                    checkItemSwitch($(trs[i]).find('input.field_filterable'), data.infos[i][2]);\n                    checkItemSwitch($(trs[i]).find('input.field_sortable'), data.infos[i][3]);\n                    checkItemSwitch($(trs[i]).find('input.field_hide'), data.infos[i][4]);\n                    checkItemSwitch($(trs[i]).find('input.info_field_editable'), data.infos[i][5]);\n                    $(trs[i]).find('select.field_db_type').val(data.infos[i][6]).select2();\n                }\n\n                let form_table = $(\"tbody.fields_form-table\");\n                form_table.find(\"tr\").remove();\n                let tpl_form = $(\"template.fields_form-tpl\").html();\n                for (let i = 0; i < data.forms.length; i++) {\n                    form_table.append(tpl_form);\n                }\n\n                let trs_form = form_table.find(\"tr\");\n                for (let i = 0; i < trs_form.length; i++) {\n                    $(trs_form[i]).find('.field_head_form').val(data.forms[i][0]);\n                    $(trs_form[i]).find('.field_name_form').val(data.forms[i][1]);\n                    checkItemSwitch($(trs_form[i]).find('input.field_canedit'), data.forms[i][2]);\n                    checkItemSwitch($(trs_form[i]).find('input.field_canadd'), data.forms[i][3]);\n                    $(trs_form[i]).find('.field_default').val(data.forms[i][4]);\n                    $(trs_form[i]).find('select.field_display').val(data.forms[i][5]).select2();\n                    $(trs_form[i]).find('select.field_db_type_form').val(data.forms[i][6]).select2();\n                    $(trs_form[i]).find('select.field_form_type_form').val(data.forms[i][7]).select2();\n                }\n\n                let detail_table = $(\"tbody.fields_detail-table\");\n                detail_table.find(\"tr\").remove();\n                let tpl_detail = $(\"template.fields_detail-tpl\").html();\n                for (let i = 0; i < data.details.length; i++) {\n                    detail_table.append(tpl_detail);\n                }\n\n                let trs_detail = detail_table.find(\"tr\");\n                for (let i = 0; i < trs_detail.length; i++) {\n                    $(trs_detail[i]).find('.field_head').val(data.details[i][0]);\n                    $(trs_detail[i]).find('.field_name').val(data.details[i][1]);\n                    $(trs_detail[i]).find('select.field_db_type').val(data.details[i][2]).select2();\n                }\n\n                toggleItemSwitchOpposite($(\".permission.ga_checkbox\"), data.permission);\n                toggleItemSwitch($(\".hide_filter_area.ga_checkbox\"), data.hide_filter_area);\n                toggleItemSwitch($(\".hide_new_button.ga_checkbox\"), data.hide_new_button);\n                toggleItemSwitch($(\".hide_export_button.ga_checkbox\"), data.hide_export_button);\n                toggleItemSwitch($(\".hide_edit_button.ga_checkbox\"), data.hide_edit_button);\n                toggleItemSwitch($(\".hide_pagination.ga_checkbox\"), data.hide_pagination);\n                toggleItemSwitch($(\".hide_delete_button.ga_checkbox\"), data.hide_delete_button);\n                toggleItemSwitch($(\".hide_detail_button.ga_checkbox\"), data.hide_detail_button);\n                toggleItemSwitch($(\".hide_filter_button.ga_checkbox\"), data.hide_filter_button);\n                toggleItemSwitch($(\".hide_row_selector.ga_checkbox\"), data.hide_row_selector);\n                toggleItemSwitch($(\".hide_query_info.ga_checkbox\"), data.hide_query_info);\n                toggleItemSwitch($(\".filter_form_layout.ga_checkbox\"), data.filter_form_layout);\n                toggleItemSwitch($(\".hide_continue_edit_check_box.ga_checkbox\"), data.hide_continue_edit_check_box);\n                toggleItemSwitch($(\".hide_reset_button.ga_checkbox\"), data.hide_reset_button);\n                toggleItemSwitch($(\".hide_continue_new_check_box.ga_checkbox\"), data.hide_continue_new_check_box);\n                toggleItemSwitch($(\".hide_back_button.ga_checkbox\"), data.hide_back_button);\n            }\n            NProgress.done();\n        }\n\n        function toggleItemSwitch(obj, val) {\n            if (val === \"n\") {\n                $(obj).bootstrapSwitch('state', true);\n            } else {\n                $(obj).bootstrapSwitch('state', false);\n            }\n        }\n\n        function toggleItemSwitchOpposite(obj, val) {\n            if (val === \"n\") {\n                $(obj).bootstrapSwitch('state', false);\n            } else {\n                $(obj).bootstrapSwitch('state', true);\n            }\n        }\n\n        function checkItemSwitch(obj, val) {\n            if (val === \"y\") {\n                $(obj).iCheck(\"check\")\n            } else {\n                $(obj).iCheck(\"uncheck\")\n            }\n        }\n\n        function getItemSwitchValue(obj) {\n            if ($(obj).hasClass(\"checked\")) {\n                return \"y\"\n            }\n            return \"n\"\n        }\n\n        function getItemObjData() {\n            let data = {};\n            data.conn = $(\"select.conn\").val();\n            data.package = $(\".package\").val();\n            data.pk = $(\".pk\").val();\n            data.path = $(\".path\").val();\n            data.extra_code = $(\"#extra_code_input\").val();\n            data.table = $(\"select.table\").val();\n            data.table_title = $(\".table_title\").val();\n            data.table_description = $(\".table_description\").val();\n            data.form_title = $(\".form_title\").val();\n            data.form_description = $(\".form_description\").val();\n            data.extra_import_package = $(\".extra_import_package\").val();\n            data.detail_title = $(\".detail_title\").val();\n            data.detail_description = $(\".detail_description\").val();\n            data.detail_display = $(\"select.detail_display\").val();\n\n            let infos = [];\n            let trs = $(\"tbody.fields-table\").find(\"tr\");\n            for (let i = 0; i < trs.length; i++) {\n                infos[i] = [];\n                infos[i].push($(trs[i]).find('.field_head').val());\n                infos[i].push($(trs[i]).find('.field_name').val());\n                infos[i].push(getItemSwitchValue($(trs[i]).find('input.field_filterable').parent()));\n                infos[i].push(getItemSwitchValue($(trs[i]).find('input.field_sortable').parent()));\n                infos[i].push(getItemSwitchValue($(trs[i]).find('input.field_hide').parent()));\n                infos[i].push(getItemSwitchValue($(trs[i]).find('input.info_field_editable').parent()));\n                infos[i].push($(trs[i]).find('select.field_db_type').val());\n            }\n            data.infos = infos;\n\n            let forms = [];\n            let trs_form = $(\"tbody.fields_form-table\").find(\"tr\");\n            for (let i = 0; i < trs_form.length; i++) {\n                forms[i] = [];\n                forms[i].push($(trs_form[i]).find('.field_head_form').val());\n                forms[i].push($(trs_form[i]).find('.field_name_form').val());\n                forms[i].push(getItemSwitchValue($(trs_form[i]).find('input.field_canedit').parent()));\n                forms[i].push(getItemSwitchValue($(trs_form[i]).find('input.field_canadd').parent()));\n                forms[i].push($(trs_form[i]).find('.field_default').val());\n                forms[i].push($(trs_form[i]).find('select.field_display').val());\n                forms[i].push($(trs_form[i]).find('select.field_db_type_form').val());\n                forms[i].push($(trs_form[i]).find('select.field_form_type_form').val());\n            }\n            data.forms = forms;\n\n            let details = [];\n            let detail_trs = $(\"tbody.fields_detail-table\").find(\"tr\");\n            for (let i = 0; i < detail_trs.length; i++) {\n                details[i] = [];\n                details[i].push($(detail_trs[i]).find('.field_head').val());\n                details[i].push($(detail_trs[i]).find('.field_name').val());\n                details[i].push($(detail_trs[i]).find('select.field_db_type').val());\n            }\n            data.details = details;\n\n            data.permission = $(\"input[name='permission']\").val();\n\n            data.hide_filter_area = $(\"input[name='hide_filter_area']\").val();\n            data.hide_new_button = $(\"input[name='hide_new_button']\").val();\n            data.hide_export_button = $(\"input[name='hide_export_button']\").val();\n            data.hide_edit_button = $(\"input[name='hide_edit_button']\").val();\n            data.hide_pagination = $(\"input[name='hide_pagination']\").val();\n            data.hide_delete_button = $(\"input[name='hide_delete_button']\").val();\n            data.hide_detail_button = $(\"input[name='hide_detail_button']\").val();\n            data.hide_filter_button = $(\"input[name='hide_filter_button']\").val();\n            data.hide_row_selector = $(\"input[name='hide_row_selector']\").val();\n            data.hide_query_info = $(\"input[name='hide_query_info']\").val();\n            data.filter_form_layout = $(\"select.filter_form_layout\").val();\n\n            data.hide_continue_edit_check_box = $('input[name=\"hide_continue_edit_check_box\"]').val();\n            data.hide_reset_button = $('input[name=\"hide_reset_button\"]').val();\n            data.hide_continue_new_check_box = $('input[name=\"hide_continue_new_check_box\"]').val();\n            data.hide_back_button = $('input[name=\"hide_back_button\"]').val();\n\n            return JSON.stringify(data)\n        }\n\n        function conn_req_refresh(selectObj, box, event) {\n            $.ajax({\n                url: \"\\/admin\\/operation\\/_tool_choose_conn\",\n                type: 'post',\n                dataType: 'text',\n                data: {\n                    'value': $(\"select.conn\").val(),\n\n                    'event': event\n                },\n                success: function (data) {\n                    if (typeof (data) === \"string\") {\n                        data = JSON.parse(data);\n                    }\n                    if (data.code === 0) {\n\n\n                        if (selectObj.length > 0) {\n                            if (typeof (data.data) === \"object\") {\n                                if (box) {\n                                    conn_updateBoxSelections(selectObj, data.data)\n                                } else {\n                                    if (typeof (selectObj.attr(\"multiple\")) !== \"undefined\") {\n                                        selectObj.html(\"\");\n                                    }\n                                    selectObj.select2({\n                                        data: data.data\n                                    });\n                                }\n                            } else {\n                                if (box) {\n                                    selectObj.val(data.data).select2()\n                                } else {\n\n                                }\n                            }\n                        } else {\n                            $('.table').val(data.data);\n                        }\n\n\n                    } else {\n                        swal(data.msg, '', 'error');\n                    }\n                },\n                error: function () {\n                    alert('error')\n                }\n            });\n        }\n    </script>\n    <style>\n        .save_table_list {\n            position: absolute;\n            right: 45px;\n            top: 200px;\n            background-color: white;\n            width: 300px;\n            min-height: 50px;\n            z-index: 9999;\n            display: none;\n        }\n\n        .list-group-item.list-head {\n            background-color: #5a5a5a;\n            border-color: #5a5a5a;\n            font-weight: bold;\n            color: white;\n        }\n\n        .list-group-item.list-group-item-action {\n            cursor: pointer;\n        }\n    </style>\n{{end}}`}\n"
  },
  {
    "path": "plugins/admin/modules/tools/generator.go",
    "content": "package tools\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"text/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"golang.org/x/text/cases\"\n\ttextLang \"golang.org/x/text/language\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\ntype Param struct {\n\tConnection string `json:\"connection\"`\n\tDriver     string `json:\"driver\"`\n\tPackage    string `json:\"package\"`\n\n\tTable      string `json:\"table\"`\n\tRowTable   string `json:\"row_table\"`\n\tTableTitle string `json:\"table_title\"`\n\tTableName  string `json:\"table_name\"`\n\n\tHideFilterArea   bool        `json:\"hide_filter_area\"`\n\tHideNewButton    bool        `json:\"hide_new_button\"`\n\tHideExportButton bool        `json:\"hide_export_button\"`\n\tHideEditButton   bool        `json:\"hide_edit_button\"`\n\tHideDeleteButton bool        `json:\"hide_delete_button\"`\n\tHideDetailButton bool        `json:\"hide_detail_button\"`\n\tHideFilterButton bool        `json:\"hide_filter_button\"`\n\tHideRowSelector  bool        `json:\"hide_row_selector\"`\n\tHidePagination   bool        `json:\"hide_pagination\"`\n\tHideQueryInfo    bool        `json:\"hide_query_info\"`\n\tFilterFormLayout form.Layout `json:\"filter_form_layout\"`\n\n\tHideContinueEditCheckBox bool `json:\"hide_continue_edit_check_box\"`\n\tHideContinueNewCheckBox  bool `json:\"hide_continue_new_check_box\"`\n\tHideResetButton          bool `json:\"hide_reset_button\"`\n\tHideBackButton           bool `json:\"hide_back_button\"`\n\n\tTablePageTitle    string `json:\"table_page_title\"`\n\tTableDescription  string `json:\"table_description\"`\n\tFormTitle         string `json:\"form_title\"`\n\tFormDescription   string `json:\"form_description\"`\n\tDetailTitle       string `json:\"detail_title\"`\n\tDetailDescription string `json:\"detail_description\"`\n\n\tExtraImport string `json:\"extra_import\"`\n\tExtraCode   string `json:\"extra_code\"`\n\n\tFields       Fields `json:\"fields\"`\n\tFormFields   Fields `json:\"form_fields\"`\n\tDetailFields Fields `json:\"detail_fields\"`\n\n\tPrimaryKey     string `json:\"primary_key\"`\n\tPrimaryKeyType string `json:\"primary_key_type\"`\n\n\tDetailDisplay uint8 `json:\"detail_display\"`\n\n\tOutput string `json:\"output\"`\n}\n\ntype Config struct {\n\tConnection       string        `json:\"connection\"`\n\tDriver           string        `json:\"driver\"`\n\tPackage          string        `json:\"package\"`\n\tTable            string        `json:\"table\"`\n\tSchema           string        `json:\"schema\"`\n\tOutput           string        `json:\"output\"`\n\tConn             db.Connection `json:\"conn\"`\n\tHideFilterArea   bool          `json:\"hide_filter_area\"`\n\tHideNewButton    bool          `json:\"hide_new_button\"`\n\tHideExportButton bool          `json:\"hide_export_button\"`\n\tHideEditButton   bool          `json:\"hide_edit_button\"`\n\tHideDeleteButton bool          `json:\"hide_delete_button\"`\n\tHideDetailButton bool          `json:\"hide_detail_button\"`\n\tHideFilterButton bool          `json:\"hide_filter_button\"`\n\tHideRowSelector  bool          `json:\"hide_row_selector\"`\n\tHidePagination   bool          `json:\"hide_pagination\"`\n\tHideQueryInfo    bool          `json:\"hide_query_info\"`\n\tFilterFormLayout form.Layout   `json:\"filter_form_layout\"`\n\tExtraImport      string        `json:\"extra_import\"`\n\n\tTableTitle        string `json:\"table_title\"`\n\tTableDescription  string `json:\"table_description\"`\n\tFormTitle         string `json:\"form_title\"`\n\tFormDescription   string `json:\"form_description\"`\n\tDetailTitle       string `json:\"detail_title\"`\n\tDetailDescription string `json:\"detail_description\"`\n\n\tHideContinueEditCheckBox bool `json:\"hide_continue_edit_check_box\"`\n\tHideContinueNewCheckBox  bool `json:\"hide_continue_new_check_box\"`\n\tHideResetButton          bool `json:\"hide_reset_button\"`\n\tHideBackButton           bool `json:\"hide_back_button\"`\n\n\tDetailDisplay uint8 `json:\"detail_display\"`\n\n\tExtraCode string `json:\"extra_code\"`\n}\n\nfunc fixedTable(table string) string {\n\tif utils.InArray(keyWords, table) {\n\t\treturn table + \"_\"\n\t}\n\treturn table\n}\n\nvar keyWords = []string{\"import\", \"package\", \"chan\", \"const\", \"func\", \"interface\", \"map\", \"struct\", \"type\",\n\t\"var\", \"break\", \"case\", \"continue\", \"default\", \"defer\", \"else\", \"fallthrough\", \"for\", \"go\", \"goto\", \"if\",\n\t\"range\", \"return\", \"select\", \"switch\"}\n\nfunc NewParam(cfg Config) *Param {\n\tta := camelcase(cfg.Table)\n\tdbTable := cfg.Table\n\tif cfg.Schema != \"\" {\n\t\tdbTable = cfg.Schema + \".\" + cfg.Table\n\t}\n\n\tfields := getFieldsFromConn(cfg.Conn, dbTable, cfg.Driver, cfg.Connection)\n\ttt := cases.Title(textLang.Und).String(ta)\n\n\tpkey, ptype := fields.GetPrimaryKey()\n\n\treturn &Param{\n\t\tConnection:               cfg.Connection,\n\t\tDriver:                   cfg.Driver,\n\t\tPackage:                  cfg.Package,\n\t\tTable:                    fixedTable(ta),\n\t\tTableTitle:               tt,\n\t\tTableName:                dbTable,\n\t\tHideFilterArea:           cfg.HideFilterArea,\n\t\tHideNewButton:            cfg.HideNewButton,\n\t\tHideExportButton:         cfg.HideExportButton,\n\t\tHideEditButton:           cfg.HideEditButton,\n\t\tHideDeleteButton:         cfg.HideDeleteButton,\n\t\tHideDetailButton:         cfg.HideDetailButton,\n\t\tHideFilterButton:         cfg.HideFilterButton,\n\t\tHideRowSelector:          cfg.HideRowSelector,\n\t\tHidePagination:           cfg.HidePagination,\n\t\tHideQueryInfo:            cfg.HideQueryInfo,\n\t\tFilterFormLayout:         cfg.FilterFormLayout,\n\t\tHideContinueEditCheckBox: cfg.HideContinueEditCheckBox,\n\t\tHideContinueNewCheckBox:  cfg.HideContinueNewCheckBox,\n\t\tHideResetButton:          cfg.HideResetButton,\n\t\tHideBackButton:           cfg.HideBackButton,\n\t\tRowTable:                 cfg.Table,\n\t\tFields:                   fields,\n\t\tFormFields:               fields,\n\t\tDetailDisplay:            cfg.DetailDisplay,\n\t\tOutput:                   cfg.Output,\n\t\tExtraImport:              cfg.ExtraImport,\n\t\tExtraCode:                cfg.ExtraCode,\n\t\tTablePageTitle:           utils.SetDefault(cfg.TableTitle, \"\", tt),\n\t\tTableDescription:         utils.SetDefault(cfg.TableDescription, \"\", tt),\n\t\tFormTitle:                utils.SetDefault(cfg.FormTitle, \"\", tt),\n\t\tFormDescription:          utils.SetDefault(cfg.FormDescription, \"\", tt),\n\n\t\tPrimaryKey:     pkey,\n\t\tPrimaryKeyType: ptype,\n\t}\n}\n\nfunc NewParamWithFields(cfg Config, fields ...Fields) *Param {\n\tta := camelcase(cfg.Table)\n\tdbTable := cfg.Table\n\tif cfg.Schema != \"\" {\n\t\tdbTable = cfg.Schema + \".\" + cfg.Table\n\t}\n\n\tif len(cfg.Output) > 0 && cfg.Output[len(cfg.Output)-1] == '/' {\n\t\tcfg.Output = cfg.Output[:len(cfg.Output)-1]\n\t}\n\n\ttt := cases.Title(textLang.Und).String(ta)\n\n\tdetailFields := make(Fields, 0)\n\tif len(fields) > 2 {\n\t\tdetailFields = fields[2]\n\t}\n\n\treturn &Param{\n\t\tConnection:               cfg.Connection,\n\t\tDriver:                   cfg.Driver,\n\t\tPackage:                  cfg.Package,\n\t\tTable:                    ta,\n\t\tTableTitle:               tt,\n\t\tTableName:                dbTable,\n\t\tRowTable:                 cfg.Table,\n\t\tFields:                   fields[0],\n\t\tFormFields:               fields[1],\n\t\tDetailFields:             detailFields,\n\t\tHideFilterArea:           cfg.HideFilterArea,\n\t\tHideNewButton:            cfg.HideNewButton,\n\t\tHideExportButton:         cfg.HideExportButton,\n\t\tHideEditButton:           cfg.HideEditButton,\n\t\tHideDeleteButton:         cfg.HideDeleteButton,\n\t\tHideDetailButton:         cfg.HideDetailButton,\n\t\tHideFilterButton:         cfg.HideFilterButton,\n\t\tHideRowSelector:          cfg.HideRowSelector,\n\t\tHidePagination:           cfg.HidePagination,\n\t\tHideQueryInfo:            cfg.HideQueryInfo,\n\t\tFilterFormLayout:         cfg.FilterFormLayout,\n\t\tHideContinueEditCheckBox: cfg.HideContinueEditCheckBox,\n\t\tHideContinueNewCheckBox:  cfg.HideContinueNewCheckBox,\n\t\tHideResetButton:          cfg.HideResetButton,\n\t\tHideBackButton:           cfg.HideBackButton,\n\t\tDetailDisplay:            cfg.DetailDisplay,\n\t\tOutput:                   cfg.Output,\n\t\tExtraImport:              cfg.ExtraImport,\n\t\tExtraCode:                cfg.ExtraCode,\n\t\tTablePageTitle:           utils.SetDefault(cfg.TableTitle, \"\", tt),\n\t\tTableDescription:         utils.SetDefault(cfg.TableDescription, \"\", tt),\n\t\tFormTitle:                utils.SetDefault(cfg.FormTitle, \"\", tt),\n\t\tFormDescription:          utils.SetDefault(cfg.FormDescription, \"\", tt),\n\t\tDetailTitle:              utils.SetDefault(cfg.DetailTitle, \"\", tt),\n\t\tDetailDescription:        utils.SetDefault(cfg.DetailDescription, \"\", tt),\n\t}\n}\n\ntype Fields []Field\n\nfunc (fs Fields) GetPrimaryKey() (string, string) {\n\tfor _, field := range fs {\n\t\tif field.IsPrimaryKey {\n\t\t\treturn field.Name, field.DBType\n\t\t}\n\t}\n\treturn \"\", \"\"\n}\n\ntype Field struct {\n\tHead         string `json:\"head\"`\n\tName         string `json:\"name\"`\n\tDBType       string `json:\"db_type\"`\n\tFormType     string `json:\"form_type\"`\n\tFilterable   bool   `json:\"filterable\"`\n\tSortable     bool   `json:\"sortable\"`\n\tInfoEditable bool   `json:\"info_editable\"`\n\tEditable     bool   `json:\"editable\"`\n\tHide         bool   `json:\"hide\"`\n\tFormHide     bool   `json:\"form_hide\"`\n\tEditHide     bool   `json:\"edit_hide\"`\n\tCreateHide   bool   `json:\"create_hide\"`\n\tDefault      string `json:\"default\"`\n\tCanAdd       bool   `json:\"can_add\"`\n\tExtraFun     string `json:\"extra_fun\"`\n\tIsPrimaryKey bool   `json:\"is_primary_key\"`\n}\n\nfunc Generate(param *Param) error {\n\tt, err := template.New(\"table_model\").Parse(tableModelTmpl)\n\tif err != nil {\n\t\treturn err\n\t}\n\tbuf := new(bytes.Buffer)\n\terr = t.Execute(buf, param)\n\tif err != nil {\n\t\treturn err\n\t}\n\tc, err := format.Source(buf.Bytes())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn os.WriteFile(filepath.FromSlash(param.Output)+\"/\"+param.RowTable+\".go\", c, 0644)\n}\n\nconst (\n\tcommentStrEnd = \"example end\"\n\ttablesEnd     = \"generators end\"\n)\n\nfunc GenerateTables(outputPath, packageName string, tables []string, isNew bool) error {\n\n\tif len(outputPath) > 0 && outputPath[len(outputPath)-1] == '/' {\n\t\toutputPath = outputPath[:len(outputPath)-1]\n\t}\n\n\toutputPath = filepath.FromSlash(outputPath)\n\tfileExist := utils.FileExist(outputPath + \"/tables.go\")\n\n\tif !isNew && !fileExist {\n\t\treturn nil\n\t}\n\n\tvar (\n\t\ttableStr          = \"\"\n\t\tcommentStr        = \"\"\n\t\ttablesContentByte []byte\n\t\ttablesContent     string\n\t\terr               error\n\t)\n\tif fileExist {\n\t\ttablesContentByte, err = os.ReadFile(outputPath + \"/tables.go\")\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttablesContent = string(tablesContentByte)\n\t}\n\n\tfor i := 0; i < len(tables); i++ {\n\t\tlowerTable := strings.ToLower(tables[i])\n\t\tif !strings.Contains(tablesContent, `\"`+lowerTable+`\"`) {\n\t\t\ttableStr += fmt.Sprintf(`\n\t\"%s\": Get%sTable, `, lowerTable, cases.Title(textLang.Und).String(camelcase(tables[i])))\n\n\t\t\tif commentStr != \"\" {\n\t\t\t\tcommentStr += `\n`\n\t\t\t}\n\t\t\tcommentStr += fmt.Sprintf(`// \"%s\" => http://localhost:9033/admin/info/%s`, lowerTable, lowerTable)\n\t\t}\n\t}\n\n\tcommentStr += `\n//\n// ` + commentStrEnd\n\ttableStr += `\n\n\t// ` + tablesEnd\n\n\tcontent := \"\"\n\n\tif tablesContent != \"\" && strings.Contains(tablesContent, \"/\") {\n\t\treplacer := strings.NewReplacer(`// `+commentStrEnd, commentStr, `// `+tablesEnd, tableStr)\n\t\ttablesContent = replacer.Replace(tablesContent)\n\t\tkeep := `// example:\n//`\n\t\tkeep2 := `,\n\n\t// ` + tablesEnd\n\t\treplacer2 := strings.NewReplacer(keep, keep, keep2, keep2,\n\t\t\t`//\n//\n`, \"//\", `//\n\n//`, \"//\", `//\n// \"`, `// \"`,\n\n\t\t\t`,\n\n`, \",\")\n\t\tcontent = replacer2.Replace(tablesContent)\n\t} else {\n\t\tcontent = fmt.Sprintf(`// This file is generated by GoAdmin CLI adm.\npackage %s\n\nimport \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n// The key of Generators is the prefix of table info url.\n// The corresponding value is the Form and Table data.\n//\n// http://{{config.Domain}}:{{Port}}/{{config.Prefix}}/info/{{key}}\n//\n// example:\n//\n%s\nvar Generators = map[string]table.Generator{\n%s\n}\n`, packageName, commentStr, tableStr)\n\t}\n\n\tc, err := format.Source([]byte(content))\n\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn os.WriteFile(outputPath+\"/tables.go\", c, 0644)\n}\n\nfunc InsertPermissionOfTable(conn db.Connection, table string) {\n\ttable = strings.ToLower(table)\n\tInsertPermissionInfoDB(conn, table+\" \"+language.GetWithScope(\"query\", \"generator\"), table+\"_query\", \"GET\", \"/info/\"+table)\n\tInsertPermissionInfoDB(conn, table+\" \"+language.GetWithScope(\"show edit form page\", \"generator\"), table+\"_show_edit\", \"GET\",\n\t\t\"/info/\"+table+\"/edit\")\n\tInsertPermissionInfoDB(conn, table+\" \"+language.GetWithScope(\"show create form page\", \"generator\"), table+\"_show_create\", \"GET\",\n\t\t\"/info/\"+table+\"/new\")\n\tInsertPermissionInfoDB(conn, table+\" \"+language.GetWithScope(\"edit\", \"generator\"), table+\"_edit\", \"POST\",\n\t\t\"/edit/\"+table)\n\tInsertPermissionInfoDB(conn, table+\" \"+language.GetWithScope(\"create\", \"generator\"), table+\"_create\", \"POST\",\n\t\t\"/new/\"+table)\n\tInsertPermissionInfoDB(conn, table+\" \"+language.GetWithScope(\"delete\", \"generator\"), table+\"_delete\", \"POST\",\n\t\t\"/delete/\"+table)\n\tInsertPermissionInfoDB(conn, table+\" \"+language.GetWithScope(\"export\", \"generator\"), table+\"_export\", \"POST\",\n\t\t\"/export/\"+table)\n}\n\nfunc InsertPermissionInfoDB(conn db.Connection, name, slug, httpMethod, httpPath string) {\n\tcheckExist, err := db.WithDriver(conn).Table(\"goadmin_permissions\").\n\t\tWhere(\"slug\", \"=\", slug).\n\t\tFirst()\n\n\tif db.CheckError(err, db.QUERY) {\n\t\tpanic(err)\n\t}\n\n\tif checkExist != nil {\n\t\treturn\n\t}\n\n\t_, err = db.WithDriver(conn).Table(\"goadmin_permissions\").\n\t\tInsert(dialect.H{\n\t\t\t\"name\":        name,\n\t\t\t\"slug\":        slug,\n\t\t\t\"http_method\": httpMethod,\n\t\t\t\"http_path\":   httpPath,\n\t\t})\n\n\tif db.CheckError(err, db.INSERT) {\n\t\tpanic(err)\n\t}\n}\n\nfunc camelcase(s string) string {\n\tarr := strings.Split(s, \"_\")\n\tvar res = \"\"\n\tfor i := 0; i < len(arr); i++ {\n\t\tif i == 0 {\n\t\t\tres += arr[i]\n\t\t} else {\n\t\t\tres += cases.Title(textLang.Und).String(arr[i])\n\t\t}\n\t}\n\treturn res\n}\n\nfunc getType(typeName string) string {\n\tr, _ := regexp.Compile(`\\(.*?\\)`)\n\ttypeName = r.ReplaceAllString(typeName, \"\")\n\tr2, _ := regexp.Compile(`unsigned(.*)`)\n\treturn strings.TrimSpace(cases.Title(textLang.Und).String(strings.ToLower(r2.ReplaceAllString(typeName, \"\"))))\n}\n\nfunc getFieldsFromConn(conn db.Connection, table, driver, connName string) Fields {\n\tcolumnsModel, _ := db.WithDriver(conn).Table(table).ShowColumnsWithComment(conn.GetConfig(connName).Name)\n\n\tfields := make(Fields, len(columnsModel))\n\n\tfieldField := \"Field\"\n\ttypeField := \"Type\"\n\tif driver == \"postgresql\" {\n\t\tfieldField = \"column_name\"\n\t\ttypeField = \"udt_name\"\n\t}\n\tif driver == \"sqlite\" {\n\t\tfieldField = \"name\"\n\t\ttypeField = \"type\"\n\t}\n\tif driver == \"mssql\" {\n\t\tfieldField = \"column_name\"\n\t\ttypeField = \"data_type\"\n\t}\n\n\tfor i, model := range columnsModel {\n\t\ttypeName := getType(model[typeField].(string))\n\t\tisPrimaryKey := false\n\t\tif columnKey, ok := model[\"Key\"].(string); ok {\n\t\t\tisPrimaryKey = columnKey == \"PRI\"\n\t\t}\n\n\t\thead := cases.Title(textLang.Und).String(model[fieldField].(string))\n\t\tif comment, ok := model[\"Comment\"].(string); ok && comment != \"\" {\n\t\t\thead = cases.Title(textLang.Und).String(comment)\n\t\t}\n\t\tfields[i] = Field{\n\t\t\tHead:         head,\n\t\t\tName:         model[fieldField].(string),\n\t\t\tDBType:       typeName,\n\t\t\tCanAdd:       true,\n\t\t\tEditable:     true,\n\t\t\tIsPrimaryKey: isPrimaryKey,\n\t\t\tFormType:     form.GetFormTypeFromFieldType(db.DT(strings.ToUpper(typeName)), model[fieldField].(string)),\n\t\t}\n\t\tif model[fieldField].(string) == \"id\" {\n\t\t\tfields[i].Filterable = true\n\t\t}\n\t}\n\n\treturn fields\n}\n"
  },
  {
    "path": "plugins/admin/modules/tools/template.go",
    "content": "package tools\n\nconst tableModelTmpl = `{{define \"table_model\"}}\npackage {{.Package}}\n\nimport (\n\t{{.ExtraImport}}\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\nfunc Get{{.TableTitle}}Table(ctx *context.Context) table.Table {\n\t\n\t{{if eq .Connection \"default\"}}\n\t\t{{if eq .PrimaryKey \"\"}}\n\t\t\t{{.Table}} := table.NewDefaultTable(ctx, table.DefaultConfigWithDriver(\"{{.Driver}}\"))\n\t\t{{else}}\n\t\t\t{{.Table}} := table.NewDefaultTable(ctx, table.DefaultConfigWithDriver(\"{{.Driver}}\").SetPrimaryKey(\"{{.PrimaryKey}}\", db.{{.PrimaryKeyType}}))\n\t\t{{end}}\n\t{{else}}\n\t\t{{if eq .PrimaryKey \"\"}}\n\t\t\t{{.Table}} := table.NewDefaultTable(ctx, table.DefaultConfigWithDriverAndConnection(\"{{.Driver}}\", \"{{.Connection}}\"))\n\t\t{{else}}\n\t\t\t{{.Table}} := table.NewDefaultTable(ctx, table.DefaultConfigWithDriverAndConnection(\"{{.Driver}}\", \"{{.Connection}}\").SetPrimaryKey(\"{{.PrimaryKey}}\", db.{{.PrimaryKeyType}}))\n\t\t{{end}}\n\t{{end}}\n\n\tinfo := {{.Table}}.GetInfo(){{if .HideFilterArea}}.HideFilterArea(){{end}}\n\n\t{{if .HideNewButton}}info.HideNewButton(){{end}}\n\t{{if .HideExportButton}}info.HideExportButton(){{end}}\n\t{{if .HideEditButton}}info.HideEditButton(){{end}}\n\t{{if .HideDeleteButton}}info.HideDeleteButton(){{end}}\n\t{{if .HideDetailButton}}info.HideDetailButton(){{end}}\n\t{{if .HideFilterButton}}info.HideFilterButton(){{end}}\n\t{{if .HideRowSelector}}info.HideRowSelector(){{end}}\n\t{{if .HidePagination}}info.HidePagination(){{end}}\n\t{{if .HideQueryInfo}}info.HideQueryInfo(){{end}}\n\t{{if not .FilterFormLayout.Default}}info.SetFilterFormLayout(form.{{.FilterFormLayout.String}}){{end}}\n\n\t{{- range $key, $field := .Fields}}\n\tinfo.AddField(\"{{$field.Head}}\", \"{{$field.Name}}\", db.{{$field.DBType}}){{if $field.Filterable}}.\n\t\tFieldFilterable(){{end -}}{{if $field.Sortable}}.\n\t\tFieldSortable(){{end -}}{{if $field.InfoEditable}}.\n\t\tFieldEditAble(){{end -}}{{if $field.Hide}}.\n\t\tFieldHide(){{end -}}\n\t{{- end}}\n\n\tinfo.SetTable(\"{{.TableName}}\").SetTitle(\"{{.TablePageTitle}}\").SetDescription(\"{{.TableDescription}}\")\n\n\tformList := {{.Table}}.GetForm()\n\n\t{{- range $key, $field := .FormFields}}\n\tformList.AddField(\"{{$field.Head}}\", \"{{$field.Name}}\", db.{{$field.DBType}}, form.{{$field.FormType}}){{if ne $field.Default \"\"}}.\n\t\tFieldDefault({{$field.Default}}){{end -}}{{if not $field.CanAdd}}.\n\t\tFieldDisableWhenCreate(){{end -}}{{if not $field.Editable}}.\n\t\tFieldDisableWhenUpdate(){{end -}}{{if $field.FormHide}}.\n\t\tFieldHide(){{end -}}{{if $field.EditHide}}.\n\t\tFieldHideWhenUpdate(){{end -}}{{if $field.CreateHide}}.\n\t\tFieldHideWhenCreate(){{end -}}{{$field.ExtraFun}}\n\t{{- end}}\n\n\t{{if .HideContinueEditCheckBox}}formList.HideContinueEditCheckBox(){{end}} \n\t{{if .HideContinueNewCheckBox}}formList.HideContinueNewCheckBox(){{end}}  \n\t{{if .HideResetButton}}formList.HideResetButton(){{end}}          \n\t{{if .HideBackButton}}formList.HideBackButton(){{end}}           \n\n\tformList.SetTable(\"{{.TableName}}\").SetTitle(\"{{.FormTitle}}\").SetDescription(\"{{.FormDescription}}\")\n\n\n\t{{if eq .DetailDisplay 1}}\n\t\tdetail := {{.Table}}.GetDetailFromInfo()\n\t{{else if eq .DetailDisplay 2}}\n\t\tdetail := {{.Table}}.GetDetail()\n\t{{end}}\n\n\t{{- range $key, $field := .DetailFields}}\n\tdetail.AddField(\"{{$field.Head}}\", \"{{$field.Name}}\", db.{{$field.DBType}})\n\t{{- end}}\n\n\t{{if ne .DetailDisplay 0}}\n\tdetail.SetTable(\"{{.TableName}}\").SetTitle(\"{{.TablePageTitle}}\").SetDescription(\"{{.TableDescription}}\")\n\t{{end}}\n\n\t{{.ExtraCode}}\n\n\treturn {{.Table}}\n}\n{{end}}`\n"
  },
  {
    "path": "plugins/admin/router.go",
    "content": "package admin\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/trace\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n)\n\n// initRouter initialize the router and return the context.\nfunc (admin *Admin) initRouter() *Admin {\n\tapp := context.NewApp()\n\n\troute := app.Group(config.Prefix(), admin.globalErrorHandler, admin.traceIDMiddleware, admin.themeMiddleware)\n\n\t// auth\n\troute.GET(config.GetLoginUrl(), admin.handler.ShowLogin)\n\troute.POST(\"/signin\", admin.handler.Auth)\n\n\t// auto install\n\troute.GET(\"/install\", admin.handler.ShowInstall)\n\troute.POST(\"/install/database/check\", admin.handler.CheckDatabase)\n\n\tcheckRepeatedPath := make([]string, 0)\n\tfor _, themeName := range template.Themes() {\n\t\tfor _, path := range template.Get(nil, themeName).GetAssetList() {\n\t\t\tif !utils.InArray(checkRepeatedPath, path) {\n\t\t\t\tcheckRepeatedPath = append(checkRepeatedPath, path)\n\t\t\t\tpath = \"/assets\" + path\n\t\t\t\tadmin.handler.AssetsTheme(path, themeName)\n\t\t\t\troute.GET(path, admin.handler.Assets)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, path := range template.GetComponentAsset() {\n\t\troute.GET(\"/assets\"+path, admin.handler.Assets)\n\t}\n\n\tauthRoute := route.Group(\"/\", auth.Middleware(admin.Conn))\n\n\t// auth\n\tauthRoute.GET(\"/logout\", admin.handler.Logout)\n\n\tauthPrefixRoute := route.Group(\"/\", auth.Middleware(admin.Conn), admin.guardian.CheckPrefix)\n\n\t// menus\n\tauthRoute.POST(\"/menu/delete\", admin.guardian.MenuDelete, admin.handler.DeleteMenu).Name(\"menu_delete\")\n\tauthRoute.POST(\"/menu/new\", admin.guardian.MenuNew, admin.handler.NewMenu).Name(\"menu_new\")\n\tauthRoute.POST(\"/menu/edit\", admin.guardian.MenuEdit, admin.handler.EditMenu).Name(\"menu_edit\")\n\tauthRoute.POST(\"/menu/order\", admin.handler.MenuOrder).Name(\"menu_order\")\n\tauthRoute.GET(\"/menu\", admin.handler.ShowMenu).Name(\"menu\")\n\tauthRoute.GET(\"/menu/edit/show\", admin.handler.ShowEditMenu).Name(\"menu_edit_show\")\n\tauthRoute.GET(\"/menu/new\", admin.handler.ShowNewMenu).Name(\"menu_new_show\")\n\n\tauthRoute.GET(\"/plugins\", admin.handler.Plugins).Name(\"plugins\")\n\n\tif config.IsNotProductionEnvironment() {\n\t\tauthRoute.GET(\"/plugins/store\", admin.handler.PluginStore).Name(\"plugins_store\")\n\t\tauthRoute.POST(\"/plugin/download\", admin.handler.PluginDownload).Name(\"plugin_download\")\n\t\tauthRoute.POST(\"/plugin/detail\", admin.handler.PluginDetail).Name(\"plugin_detail\")\n\t}\n\n\tauthRoute.POST(\"/server/login\", admin.guardian.ServerLogin, admin.handler.ServerLogin).Name(\"server_login\")\n\n\tformats := config.GetURLFormats()\n\n\t// add delete modify query\n\tauthPrefixRoute.GET(formats.Detail, admin.handler.ShowDetail).Name(\"detail\")\n\tauthPrefixRoute.GET(formats.ShowEdit, admin.guardian.ShowForm, admin.handler.ShowForm).Name(\"show_edit\")\n\tauthPrefixRoute.GET(formats.ShowCreate, admin.guardian.ShowNewForm, admin.handler.ShowNewForm).Name(\"show_new\")\n\tauthPrefixRoute.POST(formats.Edit, admin.guardian.EditForm, admin.handler.EditForm).Name(\"edit\")\n\tauthPrefixRoute.POST(formats.Create, admin.guardian.NewForm, admin.handler.NewForm).Name(\"new\")\n\tauthPrefixRoute.POST(formats.Delete, admin.guardian.Delete, admin.handler.Delete).Name(\"delete\")\n\tauthPrefixRoute.POST(formats.Export, admin.guardian.Export, admin.handler.Export).Name(\"export\")\n\tauthPrefixRoute.GET(formats.Info, admin.handler.ShowInfo).Name(\"info\")\n\n\tauthPrefixRoute.POST(formats.Update, admin.guardian.Update, admin.handler.Update).Name(\"update\")\n\n\tauthRoute.GET(\"/application/info\", admin.handler.SystemInfo)\n\n\troute.ANY(\"/operation/:__goadmin_op_id\", auth.Middleware(admin.Conn), admin.handler.Operation)\n\n\tif config.GetOpenAdminApi() {\n\n\t\t// crud json apis\n\t\tapiRoute := route.Group(\"/api\", auth.Middleware(admin.Conn), admin.guardian.CheckPrefix)\n\t\tapiRoute.GET(\"/list/:__prefix\", admin.handler.ApiList).Name(\"api_info\")\n\t\tapiRoute.GET(\"/detail/:__prefix\", admin.handler.ApiDetail).Name(\"api_detail\")\n\t\tapiRoute.POST(\"/delete/:__prefix\", admin.guardian.Delete, admin.handler.Delete).Name(\"api_delete\")\n\t\tapiRoute.POST(\"/edit/:__prefix\", admin.guardian.EditForm, admin.handler.ApiUpdate).Name(\"api_edit\")\n\t\tapiRoute.GET(\"/edit/form/:__prefix\", admin.guardian.ShowForm, admin.handler.ApiUpdateForm).Name(\"api_show_edit\")\n\t\tapiRoute.POST(\"/create/:__prefix\", admin.guardian.NewForm, admin.handler.ApiCreate).Name(\"api_new\")\n\t\tapiRoute.GET(\"/create/form/:__prefix\", admin.guardian.ShowNewForm, admin.handler.ApiCreateForm).Name(\"api_show_new\")\n\t\tapiRoute.POST(\"/export/:__prefix\", admin.guardian.Export, admin.handler.Export).Name(\"api_export\")\n\t\tapiRoute.POST(\"/update/:__prefix\", admin.guardian.Update, admin.handler.Update).Name(\"api_update\")\n\t}\n\n\tadmin.App = app\n\treturn admin\n}\n\nfunc (admin *Admin) globalErrorHandler(ctx *context.Context) {\n\tdefer admin.handler.GlobalDeferHandler(ctx)\n\tresponse.OffLineHandler(ctx)\n\tctx.Next()\n}\n\nfunc (admin *Admin) traceIDMiddleware(ctx *context.Context) {\n\ttraceID := ctx.Headers(traceIDHeaderKey)\n\n\tif traceID == \"\" {\n\t\ttraceID = trace.GenerateTraceID()\n\t}\n\n\tctx.SetUserValue(trace.TraceIDKey, traceID)\n\tctx.SetHeader(traceIDHeaderKey, traceID)\n\tctx.Next()\n}\n\nconst (\n\ttraceIDHeaderKey = \"x-request-id\"\n)\n\nfunc (admin *Admin) themeMiddleware(ctx *context.Context) {\n\ttheme := ctx.Query(context.ThemeKey)\n\n\tif theme == admin.config.Theme {\n\t\tctx.Next()\n\t\treturn\n\t}\n\n\tif theme == \"\" {\n\t\ttheme = ctx.RefererQuery(context.ThemeKey)\n\t\tif theme == \"\" {\n\t\t\tctx.Next()\n\t\t\treturn\n\t\t}\n\t}\n\n\tcookieTheme := ctx.Cookie(context.ThemeKey)\n\tif cookieTheme != theme {\n\t\tctx.SetCookie(&http.Cookie{\n\t\t\tName:  context.ThemeKey,\n\t\t\tValue: theme,\n\t\t})\n\t}\n\tctx.Next()\n}\n"
  },
  {
    "path": "plugins/example/controller.go",
    "content": "package example\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/page\"\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/chart_legend\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/description\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/infobox\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/productlist\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/progress_group\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/smallbox\"\n)\n\nfunc (e *Example) TestHandler(rawCtx *context.Context) {\n\tpage.SetPageContent(rawCtx, auth.Auth(rawCtx), func(ctx interface{}) (types.Panel, error) {\n\n\t\tcomponents := template2.Default(rawCtx)\n\t\tcolComp := components.Col()\n\n\t\t/**************************\n\t\t * Info Box\n\t\t/**************************/\n\n\t\tinfobox1 := infobox.New().\n\t\t\tSetText(\"CPU TRAFFIC\").\n\t\t\tSetColor(\"#3583af\").\n\t\t\tSetNumber(\"100\").\n\t\t\tSetIcon(`<svg t=\"1568904058859\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2216\" width=\"48\" height=\"48\"><path d=\"M864 64l-704 0C142.336 64 128 78.336 128 96l0 832C128 945.664 142.336 960 160 960l704 0c17.664 0 32-14.336 32-32l0-832C896 78.336 881.664 64 864 64zM832 896 192 896 192 128l640 0L832 896z\" fill=\"#e6e6e6\" p-id=\"2217\"></path><path d=\"M353.92 320c17.6 0 32-14.336 32-32S371.584 256 353.92 256L353.28 256C335.616 256 321.6 270.336 321.6 288S336.256 320 353.92 320z\" fill=\"#e6e6e6\" p-id=\"2218\"></path><path d=\"M353.92 512c17.6 0 32-14.336 32-32S371.584 448 353.92 448L353.28 448C335.616 448 321.6 462.336 321.6 480S336.256 512 353.92 512z\" fill=\"#e6e6e6\" p-id=\"2219\"></path><path d=\"M353.92 704c17.6 0 32-14.336 32-32S371.584 640 353.92 640L353.28 640c-17.6 0-31.616 14.336-31.616 32S336.256 704 353.92 704z\" fill=\"#e6e6e6\" p-id=\"2220\"></path><path d=\"M480 320l192 0C689.664 320 704 305.664 704 288S689.664 256 672 256l-192 0C462.336 256 448 270.336 448 288S462.336 320 480 320z\" fill=\"#e6e6e6\" p-id=\"2221\"></path><path d=\"M480 512l192 0C689.664 512 704 497.664 704 480S689.664 448 672 448l-192 0C462.336 448 448 462.336 448 480S462.336 512 480 512z\" fill=\"#e6e6e6\" p-id=\"2222\"></path><path d=\"M480 704l192 0c17.664 0 32-14.336 32-32S689.664 640 672 640l-192 0C462.336 640 448 654.336 448 672S462.336 704 480 704z\" fill=\"#e6e6e6\" p-id=\"2223\"></path></svg>`).\n\t\t\tGetContent()\n\n\t\tinfobox2 := infobox.New().\n\t\t\tSetText(\"Likes\").\n\t\t\tSetColor(\"#6a7c86\").\n\t\t\tSetNumber(\"1030.00<small>$</small>\").\n\t\t\tSetIcon(`<svg t=\"1570468923385\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1124\" width=\"48\" height=\"48\"><path d=\"M508.416 104.96c-225.28 0-408.064 182.784-408.064 408.064s182.784 408.064 408.064 408.064 408.064-182.784 408.064-408.064c0-108.032-43.008-211.968-119.808-288.768-76.288-76.288-180.224-119.296-288.256-119.296z m120.32 460.8c16.384 0 30.208 13.312 30.208 30.208 0 16.384-13.312 30.208-30.208 30.208h-90.624V716.8c0 16.384-13.312 30.208-30.208 30.208-16.384 0-30.208-13.312-30.208-30.208v-91.136H387.584c-16.384 0-30.208-13.312-30.208-30.208 0-16.384 13.312-30.208 30.208-30.208h90.624V495.104H387.584c-16.384 0-30.208-13.312-30.208-30.208 0-16.384 13.312-30.208 30.208-30.208h77.312L387.584 356.864c-9.216-11.776-8.192-28.672 2.56-39.424 10.752-10.752 27.648-11.776 39.424-2.56l78.848 78.848 77.312-77.312c11.264-11.264 29.696-11.264 41.472 0 11.264 11.264 11.264 29.696 0 41.472L548.864 435.2h79.36c16.384 0 30.208 13.312 30.208 30.208 0 16.384-13.312 30.208-30.208 30.208h-90.112v70.144h90.624z m0 0\" fill=\"#ffffff\" p-id=\"1125\"></path></svg>`).\n\t\t\tGetContent()\n\n\t\tinfobox3 := infobox.New().\n\t\t\tSetText(\"Sales\").\n\t\t\tSetColor(\"#d8cd68\").\n\t\t\tSetNumber(\"760\").\n\t\t\tSetIcon(`<svg t=\"1570469111431\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"3801\" width=\"48\" height=\"48\"><path d=\"M298.666667 128v768h426.666666V128H298.666667zM256 85.333333h512v853.333334H256V85.333333zM170.666667 128H85.333333V85.333333h128v853.333334H85.333333v-42.666667h85.333334V128z m768 768v42.666667h-128V85.333333h128v42.666667h-85.333334v768h85.333334z\" p-id=\"3802\" fill=\"#ffffff\"></path></svg>`).\n\t\t\tGetContent()\n\n\t\tinfobox4 := infobox.New().\n\t\t\tSetText(\"New Members\").\n\t\t\tSetColor(\"#6cad6e\").\n\t\t\tSetNumber(\"2,349\").\n\t\t\tSetIcon(`<svg t=\"1570469079555\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2965\" width=\"48\" height=\"48\"><path d=\"M702.9 293.4c26.6 48.9 41.8 105 41.8 164.6 0 190.7-155 345.3-346.2 345.3S52.3 648.7 52.3 458s155-345.3 346.2-345.3c127.4 0 238.7 68.7 298.8 170.9-0.5-1.8-0.7-3.6-0.7-5.5 0-12.1 9.8-21.8 21.8-21.8 4.6 0 9.1 0.1 13.6 0.3C663.8 144.1 539.9 69 398.5 69 183.2 69 8.6 243.1 8.6 458c0 188 133.7 344.8 311.3 381.1 25.2-5.8 51.6-8.9 78.6-8.9 27 0 53.4 3.1 78.6 8.9C654.8 802.8 788.4 646 788.4 458c0-55.1-11.5-107.5-32.2-155-12.3-2-24.9-3.1-37.7-3.1-6.1 0-11.6-2.5-15.6-6.5z\" p-id=\"2966\" fill=\"#ffffff\"></path><path d=\"M319.9 839.1c-68.4 15.8-128.2 51.9-167.7 102.3-7.4 9.5-5.8 23.2 3.7 30.7 9.5 7.4 23.2 5.8 30.7-3.7 45.5-58.1 124.6-94.4 211.8-94.4 88.3 0 168.4 37.3 213.5 96.6 7.3 9.6 21 11.5 30.6 4.2 9.6-7.3 11.5-21 4.2-30.6-39.4-51.8-100-88.9-169.7-105-25.2-5.8-51.6-8.9-78.6-8.9-26.9-0.1-53.3 3-78.5 8.8z\" p-id=\"2967\" fill=\"#ffffff\"></path><path d=\"M732.1 256.6c-4.5-0.2-9.1-0.3-13.6-0.3-12.1 0-21.8 9.8-21.8 21.8 0 1.9 0.2 3.7 0.7 5.5 1 3.8 2.9 7.1 5.6 9.8 4 4 9.5 6.5 15.6 6.5 12.8 0 25.4 1.1 37.7 3.1 132 21.6 229.6 153.8 215.3 290.1-15.7 149.4-146.3 258-291.4 242.7-12-1.3-22.8 7.4-24 19.4-0.1 0.5-0.1 1.1-0.1 1.6-0.1 0.5-0.2 1-0.2 1.6-1.3 12 7.4 22.8 19.4 24 66.7 7 124.1 42.3 153.3 91.9 6.1 10.4 19.5 13.9 29.9 7.7 10.4-6.1 13.9-19.5 7.7-29.9-19.5-33.1-48.6-60.8-83.8-80.7 122.3-31.5 218.3-138.3 232.6-273.8 17.8-169.3-112-332.7-282.9-341z\" p-id=\"2968\" fill=\"#ffffff\"></path></svg>`).\n\t\t\tGetContent()\n\n\t\tvar size = types.Size(6, 3, 0).XS(12)\n\t\tinfoboxCol1 := colComp.SetSize(size).SetContent(infobox1).GetContent()\n\t\tinfoboxCol2 := colComp.SetSize(size).SetContent(infobox2).GetContent()\n\t\tinfoboxCol3 := colComp.SetSize(size).SetContent(infobox3).GetContent()\n\t\tinfoboxCol4 := colComp.SetSize(size).SetContent(infobox4).GetContent()\n\t\trow1 := components.Row().SetContent(infoboxCol1 + infoboxCol2 + infoboxCol3 + infoboxCol4).GetContent()\n\n\t\t/**************************\n\t\t * Box\n\t\t/**************************/\n\n\t\ttable := components.Table().SetInfoList([]map[string]types.InfoItem{\n\t\t\t{\n\t\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t\t}, {\n\t\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t\t}, {\n\t\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t\t},\n\t\t}).SetThead(types.Thead{\n\t\t\t{Head: \"Order ID\"},\n\t\t\t{Head: \"Item\"},\n\t\t\t{Head: \"Status\"},\n\t\t\t{Head: \"Popularity\"},\n\t\t}).GetContent()\n\n\t\tboxInfo := components.Box().\n\t\t\tWithHeadBorder().\n\t\t\tSetHeader(\"Latest Orders\").\n\t\t\tSetHeadColor(\"#f7f7f7\").\n\t\t\tSetBody(table).\n\t\t\tSetFooter(`<div class=\"clearfix\"><a href=\"javascript:void(0)\" class=\"btn btn-sm btn-info btn-flat pull-left\">处理订单</a><a href=\"javascript:void(0)\" class=\"btn btn-sm btn-default btn-flat pull-right\">查看所有新订单</a> </div>`).\n\t\t\tGetContent()\n\n\t\ttableCol := colComp.SetSize(types.SizeMD(8)).SetContent(row1 + boxInfo).GetContent()\n\n\t\t/**************************\n\t\t * Product List\n\t\t/**************************/\n\n\t\tproductList := productlist.New().SetData([]map[string]string{\n\t\t\t{\n\t\t\t\t\"img\":         \"http://adminlte.io/themes/AdminLTE/dist/img/default-50x50.gif\",\n\t\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\t\"label\":       \"free\",\n\t\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t\t}, {\n\t\t\t\t\"img\":         \"http://adminlte.io/themes/AdminLTE/dist/img/default-50x50.gif\",\n\t\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\t\"label\":       \"free\",\n\t\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t\t}, {\n\t\t\t\t\"img\":         \"http://adminlte.io/themes/AdminLTE/dist/img/default-50x50.gif\",\n\t\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\t\"label\":       \"free\",\n\t\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t\t},\n\t\t}).GetContent()\n\n\t\tboxWarning := components.Box().SetTheme(\"warning\").WithHeadBorder().SetHeader(\"Recently Added Products\").\n\t\t\tSetBody(productList).\n\t\t\tSetFooter(`<a href=\"javascript:void(0)\" class=\"uppercase\">View All Products</a>`).\n\t\t\tGetContent()\n\n\t\tnewsCol := colComp.SetSize(types.SizeMD(4)).SetContent(boxWarning).GetContent()\n\n\t\trow5 := components.Row().SetContent(tableCol + newsCol).GetContent()\n\n\t\t/**************************\n\t\t * Box\n\t\t/**************************/\n\n\t\tlineChart := chartjs.Line().\n\t\t\tSetID(\"salechart\").\n\t\t\tSetHeight(180).\n\t\t\tSetTitle(\"Sales: 1 Jan, 2019 - 30 Jul, 2019\").\n\t\t\tSetLabels([]string{\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\"}).\n\t\t\tAddDataSet(\"Electronics\").\n\t\t\tDSData([]float64{65, 59, 80, 81, 56, 55, 40}).\n\t\t\tDSFill(false).\n\t\t\tDSBorderColor(\"rgb(210, 214, 222)\").\n\t\t\tDSLineTension(0.1).\n\t\t\tAddDataSet(\"Digital Goods\").\n\t\t\tDSData([]float64{28, 48, 40, 19, 86, 27, 90}).\n\t\t\tDSFill(false).\n\t\t\tDSBorderColor(\"rgba(60,141,188,1)\").\n\t\t\tDSLineTension(0.1).\n\t\t\tGetContent()\n\n\t\ttitle := `<p class=\"text-center\"><strong>Goal Completion</strong></p>`\n\t\tprogressGroup := progress_group.New().\n\t\t\tSetTitle(\"Add Products to Cart\").\n\t\t\tSetColor(\"#76b2d4\").\n\t\t\tSetDenominator(200).\n\t\t\tSetMolecular(160).\n\t\t\tSetPercent(80).\n\t\t\tGetContent()\n\n\t\tprogressGroup1 := progress_group.New().\n\t\t\tSetTitle(\"Complete Purchase\").\n\t\t\tSetColor(\"#f17c6e\").\n\t\t\tSetDenominator(400).\n\t\t\tSetMolecular(310).\n\t\t\tSetPercent(80).\n\t\t\tGetContent()\n\n\t\tprogressGroup2 := progress_group.New().\n\t\t\tSetTitle(\"Visit Premium Page\").\n\t\t\tSetColor(\"#ace0ae\").\n\t\t\tSetDenominator(800).\n\t\t\tSetMolecular(490).\n\t\t\tSetPercent(80).\n\t\t\tGetContent()\n\n\t\tprogressGroup3 := progress_group.New().\n\t\t\tSetTitle(\"Send Inquiries\").\n\t\t\tSetColor(\"#fdd698\").\n\t\t\tSetDenominator(500).\n\t\t\tSetMolecular(250).\n\t\t\tSetPercent(50).\n\t\t\tGetContent()\n\n\t\tboxInternalCol1 := colComp.SetContent(lineChart).SetSize(types.SizeMD(8)).GetContent()\n\t\tboxInternalCol2 := colComp.\n\t\t\tSetContent(template.HTML(title) + progressGroup + progressGroup1 + progressGroup2 + progressGroup3).\n\t\t\tSetSize(types.SizeMD(4)).\n\t\t\tGetContent()\n\n\t\tboxInternalRow := components.Row().SetContent(boxInternalCol1 + boxInternalCol2).GetContent()\n\n\t\tdescription1 := description.New().\n\t\t\tSetPercent(\"17\").\n\t\t\tSetNumber(\"¥140,100\").\n\t\t\tSetTitle(\"TOTAL REVENUE\").\n\t\t\tSetArrow(\"up\").\n\t\t\tSetColor(\"green\").\n\t\t\tSetBorder(\"right\").\n\t\t\tGetContent()\n\n\t\tdescription2 := description.New().\n\t\t\tSetPercent(\"2\").\n\t\t\tSetNumber(\"440,560\").\n\t\t\tSetTitle(\"TOTAL REVENUE\").\n\t\t\tSetArrow(\"down\").\n\t\t\tSetColor(\"red\").\n\t\t\tSetBorder(\"right\").\n\t\t\tGetContent()\n\n\t\tdescription3 := description.New().\n\t\t\tSetPercent(\"12\").\n\t\t\tSetNumber(\"¥140,050\").\n\t\t\tSetTitle(\"TOTAL REVENUE\").\n\t\t\tSetArrow(\"up\").\n\t\t\tSetColor(\"green\").\n\t\t\tSetBorder(\"right\").\n\t\t\tGetContent()\n\n\t\tdescription4 := description.New().\n\t\t\tSetPercent(\"1\").\n\t\t\tSetNumber(\"30943\").\n\t\t\tSetTitle(\"TOTAL REVENUE\").\n\t\t\tSetArrow(\"up\").\n\t\t\tSetColor(\"green\").\n\t\t\tGetContent()\n\n\t\tsize2 := types.SizeXS(6).SM(3)\n\t\tboxInternalCol3 := colComp.SetContent(description1).SetSize(size2).GetContent()\n\t\tboxInternalCol4 := colComp.SetContent(description2).SetSize(size2).GetContent()\n\t\tboxInternalCol5 := colComp.SetContent(description3).SetSize(size2).GetContent()\n\t\tboxInternalCol6 := colComp.SetContent(description4).SetSize(size2).GetContent()\n\n\t\tboxInternalRow2 := components.Row().SetContent(boxInternalCol3 + boxInternalCol4 + boxInternalCol5 + boxInternalCol6).GetContent()\n\n\t\tbox := components.Box().WithHeadBorder().SetHeader(\"Monthly Recap Report\").\n\t\t\tSetBody(boxInternalRow).\n\t\t\tSetFooter(boxInternalRow2).\n\t\t\tGetContent()\n\n\t\tboxcol := colComp.SetContent(box).SetSize(types.SizeMD(12)).GetContent()\n\t\trow2 := components.Row().SetContent(boxcol).GetContent()\n\n\t\t/**************************\n\t\t * Small Box\n\t\t/**************************/\n\n\t\tsmallbox1 := smallbox.New().SetColor(\"blue\").SetIcon(\"ion-ios-gear-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"345￥\").GetContent()\n\t\tsmallbox2 := smallbox.New().SetColor(\"yellow\").SetIcon(\"ion-ios-cart-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"80%\").GetContent()\n\t\tsmallbox3 := smallbox.New().SetColor(\"red\").SetIcon(\"fa-user\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"645￥\").GetContent()\n\t\tsmallbox4 := smallbox.New().SetColor(\"green\").SetIcon(\"ion-ios-cart-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"889￥\").GetContent()\n\n\t\tcol1 := colComp.SetSize(size).SetContent(smallbox1).GetContent()\n\t\tcol2 := colComp.SetSize(size).SetContent(smallbox2).GetContent()\n\t\tcol3 := colComp.SetSize(size).SetContent(smallbox3).GetContent()\n\t\tcol4 := colComp.SetSize(size).SetContent(smallbox4).GetContent()\n\n\t\trow3 := components.Row().SetContent(col1 + col2 + col3 + col4).GetContent()\n\n\t\t/**************************\n\t\t * Pie Chart\n\t\t/**************************/\n\n\t\tpie := chartjs.Pie().\n\t\t\tSetHeight(170).\n\t\t\tSetLabels([]string{\"Navigator\", \"Opera\", \"Safari\", \"FireFox\", \"IE\", \"Chrome\"}).\n\t\t\tSetID(\"pieChart\").\n\t\t\tAddDataSet(\"Chrome\").\n\t\t\tDSData([]float64{100, 300, 600, 400, 500, 700}).\n\t\t\tDSBackgroundColor([]chartjs.Color{\n\t\t\t\t\"rgb(255, 205, 86)\", \"rgb(54, 162, 235)\", \"rgb(255, 99, 132)\", \"rgb(255, 205, 86)\", \"rgb(54, 162, 235)\", \"rgb(255, 99, 132)\",\n\t\t\t}).\n\t\t\tGetContent()\n\n\t\tlegend := chart_legend.New().SetData([]map[string]string{\n\t\t\t{\n\t\t\t\t\"label\": \" Chrome\",\n\t\t\t\t\"color\": \"red\",\n\t\t\t}, {\n\t\t\t\t\"label\": \" IE\",\n\t\t\t\t\"color\": \"Green\",\n\t\t\t}, {\n\t\t\t\t\"label\": \" FireFox\",\n\t\t\t\t\"color\": \"yellow\",\n\t\t\t}, {\n\t\t\t\t\"label\": \" Sarafri\",\n\t\t\t\t\"color\": \"blue\",\n\t\t\t}, {\n\t\t\t\t\"label\": \" Opera\",\n\t\t\t\t\"color\": \"light-blue\",\n\t\t\t}, {\n\t\t\t\t\"label\": \" Navigator\",\n\t\t\t\t\"color\": \"gray\",\n\t\t\t},\n\t\t}).GetContent()\n\n\t\tboxDanger := components.Box().SetTheme(\"danger\").WithHeadBorder().SetHeader(\"Browser Usage\").\n\t\t\tSetBody(components.Row().\n\t\t\t\tSetContent(colComp.SetSize(types.SizeMD(8)).\n\t\t\t\t\tSetContent(pie).\n\t\t\t\t\tGetContent() + colComp.SetSize(types.SizeMD(4)).\n\t\t\t\t\tSetContent(legend).\n\t\t\t\t\tGetContent()).GetContent()).\n\t\t\tSetFooter(`<p class=\"text-center\"><a href=\"javascript:void(0)\" class=\"uppercase\">View All Users</a></p>`).\n\t\t\tGetContent()\n\n\t\ttabs := components.Tabs().SetData([]map[string]template.HTML{\n\t\t\t{\n\t\t\t\t\"title\": \"tabs1\",\n\t\t\t\t\"content\": template.HTML(`<b>How to use:</b>\n\n                <p>Exactly like the original bootstrap tabs except you should use\n                  the custom wrapper <code>.nav-tabs-custom</code> to achieve this style.</p>\n                A wonderful serenity has taken possession of my entire soul,\n                like these sweet mornings of spring which I enjoy with my whole heart.\n                I am alone, and feel the charm of existence in this spot,\n                which was created for the bliss of souls like mine. I am so happy,\n                my dear friend, so absorbed in the exquisite sense of mere tranquil existence,\n                that I neglect my talents. I should be incapable of drawing a single stroke\n                at the present moment; and yet I feel that I never was a greater artist than now.`),\n\t\t\t}, {\n\t\t\t\t\"title\": \"tabs2\",\n\t\t\t\t\"content\": template.HTML(`\n                The European languages are members of the same family. Their separate existence is a myth.\n                For science, music, sport, etc, Europe uses the same vocabulary. The languages only differ\n                in their grammar, their pronunciation and their most common words. Everyone realizes why a\n                new common language would be desirable: one could refuse to pay expensive translators. To\n                achieve this, it would be necessary to have uniform grammar, pronunciation and more common\n                words. If several languages coalesce, the grammar of the resulting language is more simple\n                and regular than that of the individual languages.\n              `),\n\t\t\t}, {\n\t\t\t\t\"title\": \"tabs3\",\n\t\t\t\t\"content\": template.HTML(`\n                Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n                Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,\n                when an unknown printer took a galley of type and scrambled it to make a type specimen book.\n                It has survived not only five centuries, but also the leap into electronic typesetting,\n                remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset\n                sheets containing Lorem Ipsum passages, and more recently with desktop publishing software\n                like Aldus PageMaker including versions of Lorem Ipsum.\n              `),\n\t\t\t},\n\t\t}).GetContent()\n\n\t\tbuttonTest := `<button type=\"button\" class=\"btn btn-primary\" data-toggle=\"modal\" data-target=\"#exampleModal\" data-whatever=\"@mdo\">Open modal for @mdo</button>`\n\t\tpopupForm := `<form>\n          <div class=\"form-group\">\n            <label for=\"recipient-name\" class=\"col-form-label\">Recipient:</label>\n            <input type=\"text\" class=\"form-control\" id=\"recipient-name\">\n          </div>\n          <div class=\"form-group\">\n            <label for=\"message-text\" class=\"col-form-label\">Message:</label>\n            <textarea class=\"form-control\" id=\"message-text\"></textarea>\n          </div>\n        </form>`\n\t\tpopup := components.Popup().SetID(\"exampleModal\").\n\t\t\tSetFooter(\"Save Change\").\n\t\t\tSetTitle(\"this is a popup\").\n\t\t\tSetBody(template.HTML(popupForm)).\n\t\t\tGetContent()\n\n\t\tcol5 := colComp.SetSize(types.SizeMD(8)).SetContent(tabs + template.HTML(buttonTest)).GetContent()\n\t\tcol6 := colComp.SetSize(types.SizeMD(4)).SetContent(boxDanger + popup).GetContent()\n\n\t\trow4 := components.Row().SetContent(col5 + col6).GetContent()\n\n\t\treturn types.Panel{\n\t\t\tContent:     row5 + row2 + row3 + row4,\n\t\t\tTitle:       \"Dashboard\",\n\t\t\tDescription: \"dashboard example\",\n\t\t}, nil\n\t}, e.Conn)\n}\n"
  },
  {
    "path": "plugins/example/example.go",
    "content": "package example\n\nimport (\n\tc \"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n)\n\ntype Example struct {\n\t*plugins.Base\n}\n\nfunc NewExample() *Example {\n\treturn &Example{\n\t\tBase: &plugins.Base{PlugName: \"example\"},\n\t}\n}\n\nfunc (e *Example) InitPlugin(srv service.List) {\n\te.InitBase(srv, \"example\")\n\te.App = e.initRouter(c.Prefix(), srv)\n}\n"
  },
  {
    "path": "plugins/example/go_plugin/Makefile",
    "content": "all: build\n\nbuild:\n\tgo build -buildmode=plugin -o plugin.so main.go"
  },
  {
    "path": "plugins/example/go_plugin/main.go",
    "content": "package main\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\tc \"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/plugins\"\n)\n\ntype Example struct {\n\t*plugins.Base\n}\n\nvar Plugin = &Example{\n\tBase: &plugins.Base{PlugName: \"example\"},\n}\n\nfunc (example *Example) InitPlugin(srv service.List) {\n\texample.InitBase(srv, \"example\")\n\tPlugin.App = example.initRouter(c.Prefix(), srv)\n}\n\nfunc (example *Example) initRouter(prefix string, srv service.List) *context.App {\n\n\tapp := context.NewApp()\n\troute := app.Group(prefix)\n\troute.GET(\"/example\", auth.Middleware(db.GetConnection(srv)), example.TestHandler)\n\n\treturn app\n}\n\nfunc (example *Example) TestHandler(ctx *context.Context) {\n\n}\n"
  },
  {
    "path": "plugins/example/router.go",
    "content": "package example\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n)\n\nfunc (e *Example) initRouter(prefix string, srv service.List) *context.App {\n\n\tapp := context.NewApp()\n\troute := app.Group(prefix)\n\troute.GET(\"/example\", auth.Middleware(db.GetConnection(srv)), e.TestHandler)\n\n\treturn app\n}\n"
  },
  {
    "path": "plugins/plugins.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage plugins\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\t\"plugin\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/modules/remote_server\"\n\t\"github.com/GoAdminGroup/go-admin/modules/service\"\n\t\"github.com/GoAdminGroup/go-admin/modules/ui\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\n// Plugin as one of the key components of goAdmin has three\n// methods. GetRequest return all the path registered in the\n// plugin. GetHandler according the url and method return the\n// corresponding handler. InitPlugin init the plugin which do\n// something like init the database and set the config and register\n// the routes. The Plugin must implement the three methods.\ntype Plugin interface {\n\tGetHandler() context.HandlerMap\n\tInitPlugin(services service.List)\n\tGetGenerators() table.GeneratorList\n\tName() string\n\tPrefix() string\n\tGetInfo() Info\n\tGetIndexURL() string\n\tGetSettingPage() table.Generator\n\tIsInstalled() bool\n\tUninstall() error\n\tUpgrade() error\n}\n\ntype Info struct {\n\tTitle            string    `json:\"title\" yaml:\"title\" ini:\"title\"`\n\tDescription      string    `json:\"description\" yaml:\"description\" ini:\"description\"`\n\tOldVersion       string    `json:\"old_version\" yaml:\"old_version\" ini:\"old_version\"`\n\tVersion          string    `json:\"version\" yaml:\"version\" ini:\"version\"`\n\tAuthor           string    `json:\"author\" yaml:\"author\" ini:\"author\"`\n\tBanners          []string  `json:\"banners\" yaml:\"banners\" ini:\"banners\"`\n\tUrl              string    `json:\"url\" yaml:\"url\" ini:\"url\"`\n\tCover            string    `json:\"cover\" yaml:\"cover\" ini:\"cover\"`\n\tMiniCover        string    `json:\"mini_cover\" yaml:\"mini_cover\" ini:\"mini_cover\"`\n\tWebsite          string    `json:\"website\" yaml:\"website\" ini:\"website\"`\n\tAgreement        string    `json:\"agreement\" yaml:\"agreement\" ini:\"agreement\"`\n\tCreateDate       time.Time `json:\"create_date\" yaml:\"create_date\" ini:\"create_date\"`\n\tUpdateDate       time.Time `json:\"update_date\" yaml:\"update_date\" ini:\"update_date\"`\n\tModulePath       string    `json:\"module_path\" yaml:\"module_path\" ini:\"module_path\"`\n\tName             string    `json:\"name\" yaml:\"name\" ini:\"name\"`\n\tUuid             string    `json:\"uuid\" yaml:\"uuid\" ini:\"uuid\"`\n\tDownloaded       bool      `json:\"downloaded\" yaml:\"downloaded\" ini:\"downloaded\"`\n\tExtraDownloadUrl string    `json:\"extra_download_url\" yaml:\"extra_download_url\" ini:\"extra_download_url\"`\n\tPrice            []string  `json:\"price\" yaml:\"price\" ini:\"price\"`\n\tGoodUUIDs        []string  `json:\"good_uuids\" yaml:\"good_uuids\" ini:\"good_uuids\"`\n\tGoodNum          int64     `json:\"good_num\" yaml:\"good_num\" ini:\"good_num\"`\n\tCommentNum       int64     `json:\"comment_num\" yaml:\"comment_num\" ini:\"comment_num\"`\n\tOrder            int64     `json:\"order\" yaml:\"order\" ini:\"order\"`\n\tFeatures         string    `json:\"features\" yaml:\"features\" ini:\"features\"`\n\tQuestions        []string  `json:\"questions\" yaml:\"questions\" ini:\"questions\"`\n\tHasBought        bool      `json:\"has_bought\" yaml:\"has_bought\" ini:\"has_bought\"`\n\tCanUpdate        bool      `json:\"can_update\" yaml:\"can_update\" ini:\"can_update\"`\n\tLegal            bool      `json:\"legal\" yaml:\"legal\" ini:\"legal\"`\n\tSkipInstallation bool      `json:\"skip_installation\" yaml:\"skip_installation\" ini:\"skip_installation\"`\n}\n\nfunc (i Info) IsFree() bool {\n\treturn len(i.Price) == 0\n}\n\ntype Base struct {\n\tApp       *context.App\n\tServices  service.List\n\tConn      db.Connection\n\tUI        *ui.Service\n\tPlugName  string\n\tURLPrefix string\n\tInfo      Info\n}\n\nfunc (b *Base) InitPlugin(services service.List)   {}\nfunc (b *Base) GetGenerators() table.GeneratorList { return make(table.GeneratorList) }\nfunc (b *Base) GetHandler() context.HandlerMap     { return b.App.Handlers }\nfunc (b *Base) Name() string                       { return b.PlugName }\nfunc (b *Base) GetInfo() Info                      { return b.Info }\nfunc (b *Base) Prefix() string                     { return b.URLPrefix }\nfunc (b *Base) IsInstalled() bool                  { return false }\nfunc (b *Base) Uninstall() error                   { return nil }\nfunc (b *Base) Upgrade() error                     { return nil }\nfunc (b *Base) GetIndexURL() string                { return \"\" }\nfunc (b *Base) GetSettingPage() table.Generator    { return nil }\n\nfunc (b *Base) InitBase(srv service.List, prefix string) {\n\tb.Services = srv\n\tb.Conn = db.GetConnection(b.Services)\n\tb.UI = ui.GetService(b.Services)\n\tb.URLPrefix = prefix\n}\n\nfunc (b *Base) SetInfo(info Info) {\n\tb.Info = info\n}\n\nfunc (b *Base) Title() string {\n\treturn language.GetWithScope(b.Info.Title, b.Name())\n}\n\nfunc (b *Base) ExecuteTmpl(ctx *context.Context, panel types.Panel, options template.ExecuteOptions) *bytes.Buffer {\n\treturn Execute(ctx, b.Conn, *b.UI.NavButtons, auth.Auth(ctx), panel, options)\n}\n\nfunc (b *Base) ExecuteTmplWithNavButtons(ctx *context.Context, panel types.Panel, btns types.Buttons,\n\toptions template.ExecuteOptions) *bytes.Buffer {\n\treturn Execute(ctx, b.Conn, btns, auth.Auth(ctx), panel, options)\n}\n\nfunc (b *Base) ExecuteTmplWithMenu(ctx *context.Context, panel types.Panel, options template.ExecuteOptions) *bytes.Buffer {\n\treturn ExecuteWithMenu(ctx, b.Conn, *b.UI.NavButtons, auth.Auth(ctx), panel, b.Name(), b.Title(), options)\n}\n\nfunc (b *Base) ExecuteTmplWithCustomMenu(ctx *context.Context, panel types.Panel, menu *menu.Menu, options template.ExecuteOptions) *bytes.Buffer {\n\treturn ExecuteWithCustomMenu(ctx, *b.UI.NavButtons, auth.Auth(ctx), panel, menu, b.Title(), options)\n}\n\nfunc (b *Base) ExecuteTmplWithMenuAndNavButtons(ctx *context.Context, panel types.Panel, menu *menu.Menu,\n\tbtns types.Buttons, options template.ExecuteOptions) *bytes.Buffer {\n\treturn ExecuteWithMenu(ctx, b.Conn, btns, auth.Auth(ctx), panel, b.Name(), b.Title(), options)\n}\n\nfunc (b *Base) NewMenu(data menu.NewMenuData) (int64, error) {\n\treturn menu.NewMenu(b.Conn, data)\n}\n\nfunc (b *Base) HTML(ctx *context.Context, panel types.Panel, options ...template.ExecuteOptions) {\n\tbuf := b.ExecuteTmpl(ctx, panel, template.GetExecuteOptions(options))\n\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n}\n\nfunc (b *Base) HTMLCustomMenu(ctx *context.Context, panel types.Panel, menu *menu.Menu, options ...template.ExecuteOptions) {\n\tbuf := b.ExecuteTmplWithCustomMenu(ctx, panel, menu, template.GetExecuteOptions(options))\n\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n}\n\nfunc (b *Base) HTMLMenu(ctx *context.Context, panel types.Panel, options ...template.ExecuteOptions) {\n\tbuf := b.ExecuteTmplWithMenu(ctx, panel, template.GetExecuteOptions(options))\n\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n}\n\nfunc (b *Base) HTMLBtns(ctx *context.Context, panel types.Panel, btns types.Buttons, options ...template.ExecuteOptions) {\n\tbuf := b.ExecuteTmplWithNavButtons(ctx, panel, btns, template.GetExecuteOptions(options))\n\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n}\n\nfunc (b *Base) HTMLMenuWithBtns(ctx *context.Context, panel types.Panel, menu *menu.Menu, btns types.Buttons, options ...template.ExecuteOptions) {\n\tbuf := b.ExecuteTmplWithMenuAndNavButtons(ctx, panel, menu, btns, template.GetExecuteOptions(options))\n\tctx.HTMLByte(http.StatusOK, buf.Bytes())\n}\n\nfunc (b *Base) HTMLFile(ctx *context.Context, path string, data map[string]interface{}, options ...template.ExecuteOptions) {\n\n\tbuf := new(bytes.Buffer)\n\tvar panel types.Panel\n\n\tt, err := template2.ParseFiles(path)\n\tif err != nil {\n\t\tpanel = template.WarningPanel(ctx, err.Error()).GetContent(config.IsProductionEnvironment())\n\t} else {\n\t\tif err := t.Execute(buf, data); err != nil {\n\t\t\tpanel = template.WarningPanel(ctx, err.Error()).GetContent(config.IsProductionEnvironment())\n\t\t} else {\n\t\t\tpanel = types.Panel{\n\t\t\t\tContent: template.HTML(buf.String()),\n\t\t\t}\n\t\t}\n\t}\n\n\tb.HTML(ctx, panel, options...)\n}\n\nfunc (b *Base) HTMLFiles(ctx *context.Context, data map[string]interface{}, files []string, options ...template.ExecuteOptions) {\n\tbuf := new(bytes.Buffer)\n\tvar panel types.Panel\n\n\tt, err := template2.ParseFiles(files...)\n\tif err != nil {\n\t\tpanel = template.WarningPanel(ctx, err.Error()).GetContent(config.IsProductionEnvironment())\n\t} else {\n\t\tif err := t.Execute(buf, data); err != nil {\n\t\t\tpanel = template.WarningPanel(ctx, err.Error()).GetContent(config.IsProductionEnvironment())\n\t\t} else {\n\t\t\tpanel = types.Panel{\n\t\t\t\tContent: template.HTML(buf.String()),\n\t\t\t}\n\t\t}\n\t}\n\n\tb.HTML(ctx, panel, options...)\n}\n\ntype BasePlugin struct {\n\tBase\n\tInfo      Info\n\tIndexURL  string\n\tInstalled bool\n}\n\nfunc (b *BasePlugin) GetInfo() Info       { return b.Info }\nfunc (b *BasePlugin) Name() string        { return b.Info.Name }\nfunc (b *BasePlugin) GetIndexURL() string { return b.IndexURL }\nfunc (b *BasePlugin) IsInstalled() bool   { return b.Installed }\n\nfunc NewBasePluginWithInfo(info Info) Plugin {\n\treturn &BasePlugin{Info: info}\n}\n\nfunc NewBasePluginWithInfoAndIndexURL(info Info, u string, installed bool) Plugin {\n\treturn &BasePlugin{Info: info, IndexURL: u, Installed: installed}\n}\n\nfunc GetPluginsWithInfos(info []Info) Plugins {\n\tp := make(Plugins, len(info))\n\tfor k, i := range info {\n\t\tp[k] = NewBasePluginWithInfo(i)\n\t}\n\treturn p\n}\n\nfunc LoadFromPlugin(mod string) Plugin {\n\n\tplug, err := plugin.Open(mod)\n\tif err != nil {\n\t\tlogger.Error(\"LoadFromPlugin err\", err)\n\t\tpanic(err)\n\t}\n\n\tsymPlugin, err := plug.Lookup(\"Plugin\")\n\tif err != nil {\n\t\tlogger.Error(\"LoadFromPlugin err\", err)\n\t\tpanic(err)\n\t}\n\n\tvar p Plugin\n\tp, ok := symPlugin.(Plugin)\n\tif !ok {\n\t\tlogger.Error(\"LoadFromPlugin err: unexpected type from module symbol\")\n\t\tpanic(errors.New(\"LoadFromPlugin err: unexpected type from module symbol\"))\n\t}\n\n\treturn p\n}\n\n// GetHandler is a help method for Plugin GetHandler.\nfunc GetHandler(app *context.App) context.HandlerMap { return app.Handlers }\n\nfunc Execute(ctx *context.Context, conn db.Connection, navButtons types.Buttons, user models.UserModel,\n\tpanel types.Panel, options template.ExecuteOptions) *bytes.Buffer {\n\ttmpl, tmplName := template.Get(ctx, config.GetTheme()).GetTemplate(ctx.IsPjax())\n\n\treturn template.Execute(ctx, &template.ExecuteParam{\n\t\tUser:       user,\n\t\tTmplName:   tmplName,\n\t\tTmpl:       tmpl,\n\t\tPanel:      panel,\n\t\tConfig:     config.Get(),\n\t\tMenu:       menu.GetGlobalMenu(user, conn, ctx.Lang()).SetActiveClass(config.URLRemovePrefix(ctx.Path())),\n\t\tAnimation:  options.Animation,\n\t\tButtons:    navButtons.CheckPermission(user),\n\t\tNoCompress: options.NoCompress,\n\t\tIsPjax:     ctx.IsPjax(),\n\t\tIframe:     ctx.IsIframe(),\n\t})\n}\n\nfunc ExecuteWithCustomMenu(ctx *context.Context,\n\tnavButtons types.Buttons,\n\tuser models.UserModel,\n\tpanel types.Panel,\n\tmenu *menu.Menu, logo string, options template.ExecuteOptions) *bytes.Buffer {\n\n\ttmpl, tmplName := template.Get(ctx, config.GetTheme()).GetTemplate(ctx.IsPjax())\n\n\treturn template.Execute(ctx, &template.ExecuteParam{\n\t\tUser:       user,\n\t\tTmplName:   tmplName,\n\t\tTmpl:       tmpl,\n\t\tPanel:      panel,\n\t\tConfig:     config.Get(),\n\t\tMenu:       menu,\n\t\tAnimation:  options.Animation,\n\t\tButtons:    navButtons.CheckPermission(user),\n\t\tNoCompress: options.NoCompress,\n\t\tLogo:       template2.HTML(logo),\n\t\tIsPjax:     ctx.IsPjax(),\n\t\tIframe:     ctx.IsIframe(),\n\t})\n}\n\nfunc ExecuteWithMenu(ctx *context.Context,\n\tconn db.Connection,\n\tnavButtons types.Buttons,\n\tuser models.UserModel,\n\tpanel types.Panel,\n\tname, logo string, options template.ExecuteOptions) *bytes.Buffer {\n\n\ttmpl, tmplName := template.Get(ctx, config.GetTheme()).GetTemplate(ctx.IsPjax())\n\n\tbtns := options.NavDropDownButton\n\tif btns == nil {\n\t\tbtns = []*types.NavDropDownItemButton{\n\t\t\ttypes.GetDropDownItemButton(language.GetFromHtml(\"plugin setting\"),\n\t\t\t\taction.Jump(config.Url(\"/info/plugin_\"+name+\"/edit\"))),\n\t\t\ttypes.GetDropDownItemButton(language.GetFromHtml(\"menus manage\"),\n\t\t\t\taction.Jump(config.Url(\"/menu?__plugin_name=\"+name))),\n\t\t}\n\t} else {\n\t\tbtns = append(btns, []*types.NavDropDownItemButton{\n\t\t\ttypes.GetDropDownItemButton(language.GetFromHtml(\"plugin setting\"),\n\t\t\t\taction.Jump(config.Url(\"/info/plugin_\"+name+\"/edit\"))),\n\t\t\ttypes.GetDropDownItemButton(language.GetFromHtml(\"menus manage\"),\n\t\t\t\taction.Jump(config.Url(\"/menu?__plugin_name=\"+name))),\n\t\t}...)\n\t}\n\n\treturn template.Execute(ctx, &template.ExecuteParam{\n\t\tUser:      user,\n\t\tTmplName:  tmplName,\n\t\tTmpl:      tmpl,\n\t\tPanel:     panel,\n\t\tConfig:    config.Get(),\n\t\tMenu:      menu.GetGlobalMenu(user, conn, ctx.Lang(), name).SetActiveClass(config.URLRemovePrefix(ctx.Path())),\n\t\tAnimation: options.Animation,\n\t\tButtons: navButtons.Copy().\n\t\t\tRemoveInfoNavButton().\n\t\t\tRemoveSiteNavButton().\n\t\t\tRemoveToolNavButton().\n\t\t\tAdd(types.GetDropDownButton(\"\", icon.Gear, btns)).CheckPermission(user),\n\t\tNoCompress: options.NoCompress,\n\t\tLogo:       template2.HTML(logo),\n\t\tIsPjax:     ctx.IsPjax(),\n\t\tIframe:     ctx.IsIframe(),\n\t})\n}\n\ntype Plugins []Plugin\n\nfunc (pp Plugins) Add(p Plugin) Plugins {\n\tif !pp.Exist(p) {\n\t\tpp = append(pp, p)\n\t}\n\treturn pp\n}\n\nfunc (pp Plugins) Exist(p Plugin) bool {\n\tfor _, v := range pp {\n\t\tif v.Name() == p.Name() {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc FindByName(name string) (Plugin, bool) {\n\tfor _, v := range pluginList {\n\t\tif v.Name() == name {\n\t\t\treturn v, true\n\t\t}\n\t}\n\treturn nil, false\n}\n\nfunc FindByNameAll(name string) (Plugin, bool) {\n\tfor _, v := range allPluginList {\n\t\tif v.Name() == name {\n\t\t\treturn v, true\n\t\t}\n\t}\n\treturn nil, false\n}\n\nvar (\n\tpluginList    = make(Plugins, 0)\n\tallPluginList = make(Plugins, 0)\n)\n\nfunc Exist(p Plugin) bool {\n\treturn pluginList.Exist(p)\n}\n\nfunc Add(p Plugin) {\n\t// TODO: 验证插件合法性\n\tpluginList = pluginList.Add(p)\n}\n\nfunc GetAll(req remote_server.GetOnlineReq, token string) (Plugins, Page) {\n\n\tplugs := make(Plugins, 0)\n\tpage := Page{}\n\n\tres, err := remote_server.GetOnline(req, token)\n\n\tif err != nil {\n\t\treturn plugs, page\n\t}\n\n\tvar data GetOnlineRes\n\terr = json.Unmarshal(res, &data)\n\tif err != nil {\n\t\treturn plugs, page\n\t}\n\n\tif data.Code != 0 {\n\t\treturn plugs, page\n\t}\n\n\tplugs = GetPluginsWithInfos(data.Data.List)\n\tpage = data.Data.Page\n\n\tfor index, p := range plugs {\n\t\tfor key, value := range pluginList {\n\t\t\tif value.Name() == p.Name() {\n\t\t\t\tinfo := pluginList[key].GetInfo()\n\t\t\t\tinfo.CanUpdate = utils.CompareVersion(info.Version, plugs[index].GetInfo().Version)\n\t\t\t\tinfo.OldVersion = info.Version\n\t\t\t\tinfo.Downloaded = true\n\t\t\t\tinfo.Description = language.GetWithScope(info.Description, info.Name)\n\t\t\t\tinfo.Title = language.GetWithScope(info.Title, info.Name)\n\t\t\t\tinfo.Version = plugs[index].GetInfo().Version\n\t\t\t\tplugs[index] = NewBasePluginWithInfoAndIndexURL(info, value.GetIndexURL(), value.IsInstalled())\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, p := range plugs {\n\t\texist := false\n\t\tfor _, pp := range allPluginList {\n\t\t\tif pp.Name() == p.Name() {\n\t\t\t\texist = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !exist {\n\t\t\tallPluginList = append(allPluginList, p)\n\t\t}\n\t}\n\n\treturn plugs, page\n}\n\nfunc Get() Plugins {\n\tvar plugs = make(Plugins, len(pluginList))\n\tcopy(plugs, pluginList)\n\treturn plugs\n}\n\ntype GetOnlineRes struct {\n\tCode int              `json:\"code\"`\n\tMsg  string           `json:\"msg\"`\n\tData GetOnlineResData `json:\"data\"`\n}\n\ntype GetOnlineResData struct {\n\tList    []Info `json:\"list\"`\n\tCount   int    `json:\"count\"`\n\tHasMore bool   `json:\"has_more\"`\n\tPage    Page   `json:\"page\"`\n}\n\ntype Page struct {\n\tCSS  string `json:\"css\"`\n\tHTML string `json:\"html\"`\n\tJS   string `json:\"js\"`\n}\n"
  },
  {
    "path": "plugins/plugins_test.go",
    "content": "package plugins\n\nimport \"testing\"\n\nfunc TestLoadFromPlugin(t *testing.T) {\n\tLoadFromPlugin(\"./example/go_plugin/plugin.so\")\n}\n"
  },
  {
    "path": "template/chartjs/assets.go",
    "content": "// Code generated by go-bindata. DO NOT EDIT.\n// sources:\n// assets/chart.min.js\npackage chartjs\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc bindataRead(data []byte, name string) ([]byte, error) {\n\tgz, err := gzip.NewReader(bytes.NewBuffer(data))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\n\tvar buf bytes.Buffer\n\t_, err = io.Copy(&buf, gz)\n\tclErr := gz.Close()\n\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\tif clErr != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\ntype asset struct {\n\tbytes []byte\n\tinfo  os.FileInfo\n}\n\ntype bindataFileInfo struct {\n\tname    string\n\tsize    int64\n\tmode    os.FileMode\n\tmodTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n\treturn fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n\treturn fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n\treturn fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n\treturn fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n\treturn false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n\treturn nil\n}\n\nvar _assetsChartMinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xc4\\xbd\\x7b\\x9f\\xdb\\x36\\xb2\\x28\\xf8\\xff\\xf9\\x14\\xdd\\x3c\\x89\\x86\\x68\\x41\\x6c\\x49\\x76\\xdb\\x6d\\xaa\\xd1\\x5a\\x27\\x8e\\x27\\x99\\xc4\\xb1\\xc7\\x76\\x1e\\x8e\\x46\\xb7\\x07\\x22\\x21\\x09\\x63\\x0a\\x50\\x08\\xa8\\x1f\\x91\\xf8\\xdd\\xf7\\x87\\x02\\x40\\x82\\x92\\xec\\xe4\\xec\\xdd\\xbb\\x1b\\xff\\xd2\\x22\\x01\\x10\\x8f\\x42\\xa1\\x50\\x2f\\x14\\xce\\xcf\\x4e\\xff\\xeb\\xe4\\xec\\xe4\\xeb\\x25\\x2d\\x75\\xf2\\x1f\\x75\\x72\\xfb\\x28\\x19\\x26\\x03\\x93\\xb4\\xd4\\x7a\\xad\\xd2\\xf3\\xf3\\xbb\\xbb\\xbb\\x24\\x33\\xd9\\xff\\x51\\x89\\x2c\\x17\\x26\\x2b\\xce\\xd0\\xc9\\xb0\\x3f\\x1c\\x34\\x9f\\x7d\\x2d\\x85\\x2e\\xf9\\x6c\\xa3\\x65\\xa9\\x4c\\x89\\xb7\\xac\\x60\\x54\\xb1\\xfc\\x64\\x23\\x72\\x56\\x9e\\xe8\\x25\\x3b\\x79\\xf5\\xdd\\xfb\\x93\\x1f\\x78\\xc6\\x84\\x62\\xff\\x75\\x72\\x76\\xfe\\x5f\\xa7\\xf3\\x8d\\xc8\\x34\\x97\\x22\\xd6\\x98\\xa1\\x6d\\x24\\x67\\xff\\x61\\x99\\x8e\\x08\\xd1\\x0f\\x6b\\x26\\xe7\\x27\\xec\\x7e\\x2d\\x4b\\xad\\x3a\\x9d\\xc8\\xd4\\x31\\xe7\\x82\\xe5\\xd1\\xa9\\xcf\\x5c\\xc9\\x7c\\x53\\xb0\\xb1\\xfd\\x49\\x5c\\x51\\xc2\\x62\\x94\\x46\\xbe\\xda\\xa6\\x26\\xfb\\x75\\xa7\\x63\\x7f\\x13\\xba\\xca\\xc7\\xf6\\x31\\x66\\x28\\x8d\\x35\\x39\\xd6\\xc0\\xa2\\x90\\x33\\x5a\\xbc\\x5f\\x72\\x35\\x6e\\x1e\\x53\\xbd\\xdb\\x29\\x56\\xcc\\x51\\x02\\x03\\x37\\xed\\x55\\xb1\\x5e\\x72\\x85\\xe3\\x7a\\x30\\x68\\x1b\\x6d\\x14\\x3b\\x51\\xba\\xe4\\x99\\x8e\\x46\\x99\\x14\\x4a\\x9f\\xb4\\xda\\xa8\\xfb\\x75\\xc7\\x45\\x2e\\xef\\xc6\\x0d\\x1c\\xd0\\xb6\\x64\\x7a\\x53\\x8a\\x13\\x1d\\xa3\\x2a\\xb5\\xd9\\x49\\xc9\\x7e\\xdf\\x30\\xa5\\x9f\\x0b\\xbe\\xa2\\xa6\\xd8\\xcb\\x92\\xae\\xd8\\xc8\\x7f\\x74\\xc2\\x62\\x86\\x39\\x16\\x68\\x6b\\x5b\\x92\\x44\\xec\\x76\\xb1\\x26\\xd7\\xcf\\xcb\\x92\\x3e\\x24\\xeb\\x52\\x6a\\x69\\x9a\\x4b\\x54\\xc1\\x33\\x96\\x64\\xb4\\x28\\x62\\x8d\\xd0\\xa8\\x60\\xfa\\x44\\x91\\xd3\\x01\\xa6\\x64\\x32\\x1d\\xb9\\x66\\xeb\\x9e\\x24\\x49\\x22\\xd0\\x96\\x12\\x19\\x0b\\x84\\xd5\\x6e\\x17\\x2b\\x72\\xda\\xc7\\xda\\x7e\\x6e\\xfb\\x85\\xe3\\x18\\x91\\xeb\\x2d\\xd4\\xc1\\x12\\xba\\x5e\\x17\\x0f\\x31\\xc7\\x14\\x55\\x08\\xa1\\xaa\\xaa\\xbb\\xc7\\xed\\xec\\x9a\\xe6\\xf8\\x41\\x33\\xf5\\x78\\xd9\\x38\\xce\\x0a\\x46\\xcb\\xf7\\x7c\\xc5\\xe4\\x46\\xc7\\x1c\\x61\\x4e\\x14\\xd3\\xfe\\xdd\\xd4\\x81\\x52\\x1d\\x23\\xcc\\xaa\\xca\\x0e\\x54\\x10\\x4d\\xae\\x23\\xa5\\x69\\x69\\x70\\x86\\xe8\\x71\\x54\\xb0\\xb9\\x8e\\xd2\\x88\\x89\\xdc\\x25\\x94\\x7c\\xb1\\x34\\x29\\x19\\x13\\x9a\\x95\\x11\\x96\\xc4\\x54\\x84\\x39\\x6a\\x7f\\xc8\\x82\\x6f\\x78\\x1a\\xb3\\x2e\\x47\\xe7\\x43\\xac\\x82\\xc2\\xb6\\x22\\x57\\xc0\\x57\\x07\\xaf\\xae\\x74\\xca\\x46\\xb7\\xb4\\x3c\\xa1\\x44\\xb0\\xbb\\x93\\xac\\xa0\\x4a\\xd9\\xe9\\x28\\x37\\x99\\x96\\x65\\x8c\\xb6\\x06\\x49\\x92\\x1b\\x37\\x95\\x44\\x6c\\x8a\\x02\\xdb\\x24\\x58\\x59\\x0a\\xbe\\x7b\\x45\\xd7\\x2e\\xb1\\xdc\\x08\\xc1\\xc5\\xc2\\x80\\xd6\\x26\\x14\\x54\\xe9\\x17\\x54\\x33\\x72\\x2b\\x79\\x7e\\xd2\\xaf\\x6e\\x84\\xd4\\x7c\\xfe\\x60\\x7b\\x18\\x4e\\x3e\\x4b\\x0a\\xae\\x34\\x13\\xac\\x54\\x13\\x31\\xc5\\x8a\\xb0\\x24\\xdf\\x94\\x80\\x37\\x23\\x99\\xcc\\x65\\xf9\\x0d\\xcd\\x96\\x71\\x2c\\xc8\\xb5\\x88\\xb7\\xd0\\x76\\xaa\\x31\\x17\\x5c\\x73\\x5a\\xa4\\x2c\\x71\\x4f\\x58\\x6c\\x56\\xef\\x34\\x5b\\xab\\x54\\xe1\\x6c\\x53\\x96\\x4c\\x68\\xf3\\x9a\\xbe\\xa2\\x7a\\x99\\xac\\xb8\\x88\\x79\\x8f\\x25\\x00\\x41\\xac\\xec\\x84\\xdf\\x94\\x6c\\x5e\\x32\\xb5\\x8c\\x7d\\x57\\x18\\x31\\x3d\\x1f\\xb1\\x7a\\xd0\\xbb\\x5d\\xcc\\x82\\x91\\xf5\\x71\\x93\\x45\\x8e\\x21\\x16\\x4b\\x6e\\x36\\xeb\\x9c\\x6a\\x66\\x26\\x7d\\x0f\\x74\\x4d\\x45\\x9d\\x0e\\xe4\\xb9\\xb6\\x6d\\x57\\xdc\\x67\\x9a\\x18\\x88\\x25\\x42\\xde\\xc5\\x68\\xaf\\x57\\x80\\x8d\\xa4\\x6f\\x7a\\x67\\xe1\\xdf\\x40\\x26\\x16\\x58\\x9a\\xe6\\xf9\\x3c\\x3e\\x15\\x89\\x6b\\x65\\xb7\\x3b\\x15\\x09\\xd7\\x6c\\xa5\\x92\\x82\\x89\\x85\\x5e\\x22\\x8b\\xb7\\x6e\\x75\\x2b\\xe2\\x72\\xa1\\x62\\x8a\\x4b\\xe2\\xcb\\xf5\\x06\\xb8\\x20\\xa7\\x83\\xd1\\x5c\\x96\\xf1\\xa8\\xbc\\x26\\xfd\\x51\\xaf\\x57\\x22\\x4a\\xd4\\xa4\\x9c\\x62\\x9a\\xdc\\xd0\\x4c\\xf3\\x5b\\x36\\x8e\\x69\\x72\\xa3\\xa5\\xa6\\xc5\\xb5\\xa8\\xa7\\xab\\xd3\\x89\\x9b\\x17\\xe2\\x0b\\x20\\x4c\\x13\\xcd\\xb3\\x8f\\xb1\\x46\\xa6\\xe6\\x3e\\x4a\\x63\\x53\\x17\\x51\\x93\\xa6\\xc9\\x29\\x56\\xc9\\x5a\\xae\\x63\\xb3\\xca\\x3b\\x9d\\x58\\x26\\x79\\x49\\xef\\x2c\\x14\\x1d\\xda\\x48\\x2c\\xb0\\xc6\\xd1\\xba\\x94\\x8b\\x92\\x29\\x15\\x21\\x84\\xfd\\xe7\\xbb\\x5d\\x5c\\x0f\\xdb\\x2e\\xed\\xbd\\x8f\\x32\\xb9\\x5a\\x17\\x4c\\xb3\\x08\\x61\\xe1\\xf1\\x85\\x9c\\x0e\\x10\\xe6\\xdd\\x7a\\xd8\\x15\\x82\\xd6\\x6a\\xac\\xd5\\xb8\\x4f\\x08\\xe1\\x9d\\x4e\\x0b\\x05\\x06\\xa8\\xba\\x59\\x30\\x20\\x6c\\xca\\xd0\\xbe\\x70\\x8a\\xfc\\xc4\\xb8\\xa9\\x62\\xc9\\x82\\xe9\\x58\\x23\\x4f\\x41\\xf8\\x6e\\x17\\x73\\xb2\\x75\\x55\\xa5\\xa7\\x83\\x1a\\x87\\x4f\\xfb\\x18\\xa6\\x22\\x9d\\x4c\\x71\\xbd\\x14\\xd2\\xad\\xef\\xb5\\x49\\xf6\\xc3\\x4e\\x27\\xd3\\xaa\\xc2\\x2c\\x51\\xa6\\x6a\\xcc\\x11\\xc2\\xbc\\xb2\\x9f\\xb8\\x95\\xef\\x56\\x6d\\xd0\\xc7\\x60\\x75\\xb1\\x69\\xb2\\xde\\xa8\\x65\\xcc\\x51\\x45\\xf3\\xdc\\x52\\x39\\x66\\xd0\\xd1\\x82\\xa0\\xd3\\x39\\xfc\\xd8\\x62\\x10\\x7c\\x95\\x24\\x09\\x43\\xd5\\x92\\xaa\\x90\\xe8\\x7f\\xe2\\x03\\x5b\\xe1\\x75\\xbf\\x82\\x15\\xf7\\x29\\x48\\x79\\x08\\x31\\x80\\x72\\x6b\\x9d\\xc1\\x77\\xc1\\x6a\\xc0\\x0d\\x51\\x20\\xcc\\x35\\x52\\xb2\\x7c\\x93\\xb1\\x38\\x86\\x81\\x90\\x6b\\xbb\\xd2\\xe9\\xbd\\x79\\x4d\\x6e\\x7c\\x69\\x84\\x70\\x1f\\x79\\x1a\\xe5\\x17\\x1d\\xaa\\x5c\\x63\\xa6\\x67\\x66\\xd9\\xb4\\x68\\x98\\x5b\\x29\\xa7\\x83\\xd1\\xe7\\x3a\\xed\\x0a\\x9d\\xc6\\x00\\xc1\\x60\\x6d\\xb7\\x16\\x5d\\xa5\\xb4\\x5c\\xff\\xd9\\xf8\\x4d\\x0f\\xd8\\x6e\\x77\\xca\\x3e\\xb3\\x60\\xb9\\x1f\\x36\\xa0\\x97\\x20\\xbc\\x5e\\x3b\\x76\\xa5\\x0a\\xbb\\x52\\x05\\xe2\\x13\\x31\\x4d\\x32\\x2a\\x32\\x56\\xc4\\x68\\xe4\\x3e\\x22\\x93\\xa9\\x83\\x41\\x40\\x85\\x03\\xe8\\x06\\x4b\\xa4\\x2a\\xd9\\x4a\\xde\\xb2\\x83\\x49\\x76\\x5d\\xce\\x99\\x29\\x16\\x6b\\x54\\x55\\xa3\\xff\\x72\\x9c\\xd8\\xff\\xf5\\x71\\x53\\x7e\\x2c\\xd8\\x79\\x26\\x0b\\x59\\x9e\\xdc\\xf6\\x93\\x41\\xf2\\x2c\\x64\\xc7\\x16\\x5c\\x2f\\x37\\xb3\\x24\\x93\\xab\\xf3\\xb0\\xe4\\x7f\\x97\\x8c\\xe6\\x2b\\x16\\x70\\x67\\xfd\\x93\\x7f\\x6c\\x3e\\x7e\\xa4\\x27\\xdf\\x6f\\xca\\x8f\\xac\\xa0\\x7f\\x8d\\x2b\\xb3\\xf0\\x29\\xc9\\xb6\\x9f\\xf6\\xf1\\x20\\x1d\\xe0\\x61\\x3a\\xc4\\x8f\\xd2\\x47\\xf8\\x71\\xfa\\x18\\x5f\\xa4\\x17\\xf8\\x49\\xfa\\x04\\x3f\\x4d\\x9f\\xe2\\xcb\\xf4\\x12\\x3f\\x4b\\x9f\\xe1\\xe7\\xe9\\xa0\\x8f\\xbf\\x4a\\x07\\x03\\xfc\\x75\\x3a\\x18\\xe2\\x17\\xe9\\xe0\\x11\\xfe\\x26\\x1d\\x3c\\xc6\\x2f\\xd3\\xc1\\x05\\xa6\\x26\\x77\\x66\\x72\\x33\\x93\\x9b\\x9b\\x5c\\x66\\x72\\xe7\\xe9\\xe0\\xa2\\xc2\\x05\\x89\\xfa\\x83\\xe1\\xa3\\xc7\\x17\\x4f\\x9e\\x5e\\x3e\\x7b\\xfe\\xd5\\xd7\\x2f\\xbe\\x79\\x19\\xe1\\xcc\\x6c\\xec\\xc5\\x64\\x70\\xd1\\xd1\\x53\\xbc\\xb4\\x2f\\xf1\\xf0\\x71\\xbf\\xa3\\xd1\\xf5\\xf5\\xe3\\x69\\xd7\\x67\\xe5\\x26\\xab\\xc9\\x20\\x24\\x36\\xe9\\xa8\\xe1\\x8c\\x36\\x06\\xec\\x66\\x5b\\x66\\xe4\\x08\\x8b\\x95\\xc7\\x3a\\x29\\x51\\xa7\\x63\\x7e\\x17\\xee\\x77\\xe6\\x7e\\xa9\\x61\\xeb\\xd0\\x38\\x4b\\x97\\x9e\\xe0\\xe8\\x71\\xf4\\xdf\\x51\\x97\\xc1\\x37\\xf0\\xb3\\xb0\\x3f\\x33\\xd4\\x35\\xe5\\xaf\\x86\\x17\\x17\\x63\\x06\\x5f\\xa6\\x51\\x84\\x52\\xdd\\x30\\x40\\xf3\\x70\\xf2\\xbb\\xc9\\xc5\\xae\\xef\\x18\\x98\\x45\\xc3\\x60\\xd4\\xab\\xad\\xde\\x60\\x0d\\x3d\\xc2\\x2c\\x18\\xcc\\x3a\\xa8\\x66\\x11\\xcf\\xe3\\x61\\x72\\x71\\x71\\xa6\\x11\\xee\\xe3\\xe1\\xc5\\x05\\x6a\\x9a\\x5b\\xed\\x97\\x3b\\x5e\\xec\\x7e\\xaf\\x98\\x3e\\x37\\x15\\xa2\\xf3\\x41\\xbf\\x8f\\xfb\\x78\\x10\\x94\\x9c\\xed\\x95\\x1c\\xf4\\xfb\\xb6\\xc2\\x41\\xbf\\x8f\\xdc\\x50\\x6e\\xc8\\xf9\\xff\\x2a\\x17\\x33\\x3a\\xfe\\x57\\xfc\\x2f\\x75\\x16\\x4f\\x7a\\xdd\\xe4\\x5f\\xf9\\xb4\\x8b\\xe2\\x2f\\xd1\\x78\\xf2\\x2f\\x85\\xa7\\x5d\\x48\\x63\\x9f\\x4f\\x8c\\xc7\\xa9\\x49\\x3f\\x3f\\xc8\\x40\\xe3\\x7f\\xa9\\xb3\\x7f\\xa1\\x2f\\xce\\xdd\\xf2\\x7d\\x20\\xe7\\xff\\x2b\\x5e\\xaa\\x82\\x8e\\x77\\xcb\\xbb\\xd9\\x6e\\xa9\\x6e\\x51\\xd3\\xb0\\xfb\\x6c\\x9c\\xe6\\x6c\\x71\\xa4\\xa1\\x2f\\x0f\\x53\\x5c\\xbb\\x9f\\x69\\xb6\\x06\\xc6\\xad\\xdf\\x19\\x3c\\x0f\\xca\\xce\\x1a\\x9e\\x08\\x0f\\x7a\\x1c\\x19\\x26\\x93\\xc1\\x9f\\xae\\x3e\\x7f\\xd4\\x47\\x5f\\x0e\\x86\\x88\\x5c\\xf3\\x9e\\x38\\x3b\\x9c\\x64\\xd9\\x7b\\x84\\x9f\\xf5\\x24\\x1e\\x20\\xdc\\x1b\\x78\\x22\\x38\\x91\\x71\\x1f\\x61\\x19\\x5f\\x9a\\x3f\\x8f\\xd1\\xb4\\x99\\x89\\xbb\\xfd\\xc6\\x0d\\xaf\\x42\\x62\\xd1\\xd5\\xe7\\x4f\\xfa\\xe8\\xcb\\x27\\xd0\\x0e\\x3f\\x63\\xc7\\x5a\\xc2\\x8f\\x6d\\x3b\\xfd\\xba\\x19\\x11\\x5f\\x20\\x2c\\xe2\\x47\\xe6\\xcf\\x20\\x6c\\xe6\\xd5\\x7e\\x33\\x66\\xd0\\x03\\x9c\\x5c\\x58\\xa1\\x41\\x02\\x89\\x64\\x5d\\x7e\\x3d\\x30\\xcc\\x05\\x19\\x9c\\x03\\x0f\\x8c\\xd9\\x19\\x91\\x98\\x9f\\x11\\x69\\x40\\xd0\\x1f\\xc9\\xab\\x47\\x23\\xd9\\xed\\x22\\x31\\x91\\xd3\\x33\\x32\\xe8\\xb1\\x1e\\xc7\\xe6\\xb9\\x4b\\x98\\x5f\\x53\\xa2\\x69\\xf3\\x63\\x8b\\xaa\\x27\\xe5\\xf9\\xf0\\xe2\\x02\\x73\\xa2\\x93\\x05\\x3c\\x09\\xa2\\x93\\x19\\x3c\\x49\\x52\\x0f\\xce\\x72\\xbe\\x58\\x91\\x7a\\x94\\x2e\\x85\\x92\\x58\\x76\\x15\\x3a\\x1f\\x42\\x7f\\x4b\\x5c\\xe0\\xcc\\x37\\x29\\x4f\\x09\\x51\\x9d\\x4e\\x9c\\x11\\xd9\\x53\\xb8\\x20\\xf4\\x3a\\xb9\\x18\\x67\\xe7\\xf1\\xb0\\x27\\x7b\\x0a\\xa5\\xd9\\x39\\x7c\\x89\\x4b\\x22\\x09\\x21\\x6c\\x1c\\xf3\\x9e\\x40\\xe7\\x59\\x37\\xe6\\x57\\x62\\xfc\\x24\\xed\\xa3\\xd4\\xa4\\xf3\\x71\\x2c\\x7a\\xcc\\xa4\\x0f\\xd3\\x98\\xf5\\xb8\\x79\\x7a\\x8c\\x4b\\xf2\\xa4\\x7f\\x56\\x76\\x93\\x0b\\x84\\x27\\xfd\\x5d\\x89\\x8b\\xdd\\xae\\x8f\\x69\\x00\\xd7\\x77\\x0d\\xb7\\x6e\\x7b\\x13\\x5b\\x11\\x8d\\x2b\\xf8\\x8d\\x19\\x1a\\xeb\\x98\\x4d\\xfa\\x53\\xcc\\x26\\x03\\xf3\\x67\\x38\\x35\\x22\\x8f\\xfd\\x04\\x25\\x2b\\xba\\x8e\\x57\\xc1\\xba\\x7c\\xe3\\xa7\\xc9\\x0d\\xed\\x5d\\x7c\\x8b\\x6d\\x4a\\x53\\xe6\\x45\\xb3\\x76\\x63\\xfd\\xe5\\xa3\\x27\\xfd\\xee\\x23\\x83\\x29\\x8f\\x9e\\xf4\\x9b\\x32\\x5f\\x87\\xa0\\x7f\\x48\\xd8\\x3d\\xcb\\xcc\\x36\\x0a\\x7c\\x17\\x16\\x64\\x78\\x71\\x61\\xb7\\x54\\xbf\\x83\\xb2\\xc9\\xc5\\xf4\\xd4\\x32\\x73\\x82\\xb0\\xc9\\x93\\xe9\\x78\\x1d\\x77\\x4d\\x22\\x4a\\x57\\xee\\x01\\x8d\\xbc\\x38\\xf2\\xc2\\xa4\\x0c\\xa7\\x66\\x96\\xba\\x6c\\xf2\\x68\\x0a\\xf4\\x85\\x9a\\xe7\\xc7\\xf0\\x5c\\xf3\\x73\\x24\\x5a\\xde\\xcd\\x8c\\x48\\x65\\xc6\\x3e\\x0e\\x35\\x03\\xad\\x21\\xbe\\xf2\\x43\\x8c\\x25\\x56\\xd8\\x10\\xdb\\xa5\\xba\\xfd\\xf3\\xcf\\xee\\xf6\\x3f\\x7b\\xe3\\x1e\\xf0\\xb6\\x4c\\xb9\\x01\\xf9\\x22\\xe5\\x06\\xe8\\xb3\\x94\\x4f\\x86\\x53\\x4c\\x53\\xe1\\xc5\\xcc\\xd7\\x64\\x7b\\x9f\\x46\\x39\\x2d\\x3f\\x46\\xf8\\xb7\\x34\\x2a\\x40\\x12\\xc4\\x1f\\xd2\\xa8\\x64\\x11\\xfe\\x35\\x8d\\x66\\xc5\\x26\\xc2\\xbf\\xa4\\xd1\\xa2\\x8c\\xf0\\xcf\\x69\\xb4\\x62\\x39\\xdf\\xac\\x22\\xfc\\x53\\x1a\\xa9\\x82\\x6a\\x16\\xe1\\xe7\\x69\\xc4\\x58\\x84\\xdf\\xa7\\x91\\x2c\\x22\\xfc\\x2e\\x8d\\x64\\x19\\xe1\\xaf\\xd2\\xa8\\xa4\\x11\\xfe\\x3a\\x8d\\x4c\\xa1\\x45\\x84\\x5f\\xa4\\x91\\xa9\\x59\\x45\\xf8\\x6d\\x1a\\x71\\x11\\xe1\\x7f\\xa6\\x91\\xde\\x94\\xbf\\x6f\\x24\\x57\\x11\\xfe\\x26\\x8d\\x96\\x3c\\xc2\\x6f\\xd2\\xa8\\x94\\x11\\x7e\\x9d\\x46\\xb4\\x88\\xf0\\x8f\\x69\\x54\\xb0\\x08\\xbf\\x4a\\xa3\\x9c\\x45\\xf8\\x87\\x34\\x7a\\x60\\x45\\x21\\x23\\xfc\\xd2\\x88\\xb3\\x11\\xfe\\x3e\\x8d\\xb2\\x65\\x84\\xff\\x9e\\x46\\xb4\\xfc\\xa8\\x22\\xfc\\x6d\\x1a\\x31\\x1a\\xe1\\xef\\x6c\\x43\\x8b\\x08\\xff\\x23\\x8d\\xee\\x96\\x51\\x85\\x9f\\x93\\xed\\x6b\\x9e\\xb1\\x5f\\x59\\x1a\\xcd\\xfb\\xf3\\xcb\\xf9\\x3c\\xc2\\x54\\x68\\xfe\\xfb\\x86\\xdd\\x7d\\xa3\\x4d\\x22\\x65\\xb3\\xfc\\x69\\x84\\xe9\\xef\\x1b\\x9a\\x46\\xf3\\x39\\x14\\xf8\\x7d\\x43\\x57\\xb4\\x7c\\xcb\\xd2\\xe8\\xe9\\x7c\\x3e\\xcf\\x1f\\x47\\x98\\xfe\\xb1\\xf9\\x00\\x35\\x40\\x81\\x19\\xe3\\x0b\\xf3\\xed\\xc5\\xfc\\x22\\xcf\\x22\\x3c\\xe3\\xea\\xf7\\x8d\\x79\\x9f\\xb3\\xc7\\xd9\\xe3\\x08\\xcf\\x0a\\x9a\\x7d\\x4c\\xa3\\x3e\\x3c\\x89\\xef\\x59\\xfe\\x7a\\x25\\x45\\x0e\\xf9\\xb3\\x2c\\x8f\\x30\\x74\\x66\\x6e\\x7e\\x6f\\xf9\\x7b\\xa6\\xd3\\xe8\\x92\\x0e\\x67\\x6c\\x18\\xe1\\xd9\\x9b\\x3b\\x91\\x46\\xf4\\x62\\x48\\x87\\x34\\xc2\\xb3\\x4d\\x59\\x3c\\xdc\\x49\\x99\\x1b\\x18\\xcc\\x2e\\x2f\\x9f\\x46\\x38\\xa3\\xaf\\xb4\\xf9\\xfa\\x62\\xfe\\x8c\\xd1\\x7e\\x84\\xbf\\xa7\\xa5\\xfe\\xb0\\x51\\xae\\xa3\\x7d\\x93\\x22\\xb3\\xf7\\xd4\\x0c\\x2c\\x1f\\x3e\\x79\\x36\\x60\\x11\\xce\\xde\\xbd\\x36\\xad\\x3d\\x9d\\x5f\\xf4\\xcd\\x8b\\x98\\x17\\xf2\\x8e\\x95\\xa6\\x92\\x27\\x8f\\x9f\\x5d\\xb0\\x1c\\x12\\x15\\x2f\\x3e\\xc2\\xe8\\x2f\\xcd\\x78\\xb2\\x92\\xaf\\x94\\x14\\x69\\x94\\x67\\x83\\xc7\\x8f\\x4c\\xc2\\x03\\x15\\x1e\\x38\\xf7\\xe6\\xd3\\xcb\\x59\\x84\\xef\\x6d\\xea\\xe5\\x0c\\x5e\\x16\\xef\\x5f\\x89\\x37\\x79\\x1a\\xcd\\x2e\\x2f\\x9f\\xf4\\x4d\\xc2\\x2f\\xf4\\x21\\x8d\\xe8\\x33\\xf3\\xcf\\x64\\x7f\\x78\\x69\\x1a\\x34\\x3d\\xbc\\x5f\\x7c\\x08\\x73\\x3e\\x2e\\xe9\\x47\\x9e\\x46\\xb3\\x7c\\xf6\\xf4\\x89\\xf9\\x6e\\x45\\x17\\x2f\\x35\\x35\\xf5\\xf6\\xfb\\x50\\xf3\\x7b\\x7e\\xcb\\xe0\\xf3\\x8b\\x8b\\x27\\xb3\\xa1\\xe9\\xc1\\x3b\\x2a\\x00\\xfc\\xf3\\xcb\\x0c\\x2a\\x7c\\x97\\x7d\\x93\\xa7\\xd1\\xb3\\x67\\x8f\\x86\\x59\\x16\\xe1\\xfb\\x0f\\xb9\\xfd\\x1a\\xf2\\x94\\x81\\x7d\\x1a\\xb1\\x67\\xcf\\x9e\\x3c\\xa5\\xe6\\xfd\\x5b\\xa8\\xeb\\x72\\x3e\\xcb\\x2e\\x4d\\x5d\\x3f\\x99\\xe1\\x3c\\xbe\\x7c\\x94\\x43\\x5b\\x3f\\x41\\xaf\\x87\\xf3\\xc7\\xf3\\xc7\\x90\\x09\\x5d\\xad\\x5f\\xff\\xc9\\xd2\\x28\\x63\\xf9\\x20\\xc2\\xf7\\x6e\\xe2\\x9e\\x3d\\xee\\xf7\\xf3\\x47\\x11\\xce\\x9f\\xaf\\xd7\\x6f\\x01\\x82\\x83\\xc7\\xcf\\xec\\xbb\\xfa\\xf8\\x60\\xaa\\x9e\\x01\\xd0\\x72\\xbe\\x82\\x9a\\x9f\\x3c\\x33\\xff\\xe0\\x1d\\xaa\\xae\\xdf\\x65\\xbe\\xb0\\x93\\x32\\x60\\xcf\\xfa\\xe6\\x8b\\x39\\xff\\x30\\x2b\\xb9\\x41\\xa3\\xd9\\xd0\\xfc\\x17\\xe1\\x79\\xf1\\xee\\xb5\\xc3\\xd9\\xf9\\x9c\\xce\\xfb\\x11\\x9e\\xcb\\x0f\\x4a\\xff\\xf2\\x5c\\xa4\\xd1\\x70\\x78\\x39\\x83\\x32\\x9b\\xef\\x15\\x07\\x3c\\xee\\x43\\x2d\\x0b\\xfa\\x56\\xcd\\xde\\x49\\x33\\x93\\xe6\\x5f\\x84\\x17\\x4b\\xa9\\xb4\\xab\\xe5\\xd2\\x2e\\x87\\xc5\\x7b\\x40\\xcd\\xfc\\xa9\\x81\\x97\\x9f\\xc6\\x9c\\xd2\\x8b\\x61\\x3f\\xc2\\xd0\\xeb\\xcb\\xbe\\xf9\\x17\\x61\\x0b\\x39\\x80\\xeb\\xe2\\xc3\\xcb\\x1f\\xee\\xd2\\x88\\xe6\\xf3\\xb9\\x99\\x12\\x18\\x8c\\x2f\\xb6\\x94\\x82\\x3d\\xbc\\xba\\x73\\xcb\\x05\\x12\\xb4\\x83\\xce\\x93\\x67\\xb3\\xc7\\x11\\x7e\\x9b\\x73\\x2a\\xcc\\x2c\\x65\\xf9\\x45\\x76\\x91\\x41\\xc2\\x42\\xa6\\xd1\\x63\\x33\\xe5\\xc3\\x08\\xf3\\xdb\\x77\\x0f\\x16\\xdd\\xcc\\xd7\\x0e\\x41\\xe6\\x7d\\xf6\\xe4\\x32\\x8b\\x70\\x41\\x6f\\x5f\\xbe\\x2a\\xd3\\x88\\x3d\\x61\\x4f\\xe6\\xd4\\xbf\\xff\\xaa\\x96\\xf0\\x45\\x7f\\x7e\\x61\\x92\\xee\\x04\\xf4\\xf5\\x69\\x36\\x07\\x0c\\xf9\\x71\\x25\\x45\\xf6\\xcd\\x7c\\x2e\\x2d\\x16\\x53\\xb3\\x08\\x7f\\x33\\xd0\\xa6\\x79\\x7e\\xc9\\x9e\\x44\\xf8\\x37\\xbb\\x4a\\xdc\\x00\\x7e\\xb3\\x98\\xcd\\xdc\\x6a\\xff\\xcd\\x02\\xc5\\x8c\\x77\\x4e\\xe7\\x34\\x1f\\x46\\xf8\\x37\\x80\\x4b\\xfe\\xc8\\xfc\\x33\\x05\\x4c\\x63\\xcf\\xfa\\x8c\\x3d\\xeb\\xc3\\x5b\\x98\\xe7\\x46\\x3e\\x7b\\x92\\x0d\\x22\\xfc\\x9b\\x43\\xc7\\xf9\\x9c\\xf6\\x0d\\x3a\\xfe\\xe6\\xd0\\x71\\xd8\\x9f\\x0d\\x29\\xbc\\x5b\\xac\\xb9\\x7c\\x9a\\x31\\x33\\xb8\\xdf\\x2c\\x42\\x3e\\x7d\\x7a\\x79\\xf9\\xec\\x99\\x79\\x85\\xba\\xeb\\x57\\xa5\\x9f\\x17\\x80\\x64\\xfd\\xec\\xb1\\x21\\x93\\xbf\\x41\\x1f\\xe7\\xf3\\x39\\xeb\\x47\\xb8\\xe0\\x2b\\x66\\x31\\xc1\\x3e\\x43\\x43\\x8f\\x86\\x59\\xfe\\x68\\x18\\xe1\\xe2\\xed\\x4b\\x18\\x4d\\xdf\\x8c\\xde\\x2f\\x39\\x8f\\x35\\x2b\\xfa\\xc6\\x74\\xd2\\xcc\\xb4\\xf9\\xf8\\xe7\\x80\\x1e\\x3e\\x79\\x92\\xe5\\xa6\\xa3\\x3f\\x9b\\x66\\x0d\\x18\\x7f\\xb6\\x8b\\x6f\\x46\\x2f\\x2e\\xcc\\x70\\x7f\\x5e\\x6f\\xca\\xf5\\x8f\\x69\\xf4\\xec\\xd1\\xd3\\x7e\\x3e\\x8b\\xf0\\xcf\\x6e\\x80\\x8f\\xb2\\xd9\\xa3\\xa7\\x83\\x08\\xff\\x0c\\xeb\\xed\\xe9\\xec\\xc9\\xa5\\xd9\\x36\\x7e\\x56\\xeb\\xf2\\xed\\x02\\x0a\\xcc\\xe9\\x33\\x53\\xed\\x3f\\x61\\x35\\xe6\\x03\\xb3\\x90\\x7f\\x86\\x45\\x06\\x78\\xf2\\x74\\x70\\x71\\x79\\x11\\xe1\\x15\\xcf\\x85\\xa1\\xef\\xb0\\x50\\x9e\\x0d\\x9e\\x3d\\xed\\x47\\x78\\xf5\\x56\\x67\\x1f\\xe8\\x0a\\xa8\\xf1\\xdc\\xc0\\x6c\\xc5\\x95\\x7e\\x78\\xa3\\x1c\\x3d\\x66\\x83\\x08\\xaf\\x64\\x96\\x51\\xf5\\xd6\\x26\\xcc\\x2e\\x22\\x2c\\xe8\\x2d\\xfd\\x8f\\xf4\\x8b\\x29\\x67\\x34\\x87\\x34\\xc0\\xe1\\x08\\xbf\\xcf\\x0b\\x9a\\x99\\x9c\\x7c\\x7e\\x61\\xc0\\x63\\x08\\x90\\xc5\\x6e\\x03\\x0d\\xf3\\x96\\x7f\\x35\\x4b\\xa3\\x27\\xb3\\x4b\\x36\\x7c\\x14\\xe1\\x9a\\x1a\\xd1\\x0b\\x93\\x0f\\xaf\\x1f\\x60\\x49\\x3d\\xb6\\x09\\x00\\xa0\\x9c\\x3e\\xed\\xe7\\x4f\\x22\\xbc\\x7e\\xcd\\xfc\\x1a\\x63\\x8c\\x5d\\x1a\\x58\\x9a\\x24\\x40\\xa0\\xcb\\xf9\\xec\\xd9\\x25\\xbc\\x1b\\x30\\xd0\\x39\\x63\\x06\\x48\\xeb\\xd7\\xac\\x06\\x44\\x3e\\x7b\\xda\\x37\\xf4\\x65\\x4d\\xd7\\xf4\\x81\\xde\\x7d\\xb3\\x86\\x31\\xcd\\xf3\\x8b\\x08\\xaf\\xbf\\xfd\\x7e\\xbd\\x99\\xcf\\x61\\x40\\x74\\xf6\\x2c\\xc2\\x6b\\x56\\x6e\\xcc\\x1c\\x5d\\x5e\\x3c\\x9a\\x47\\xd8\\xa1\\x61\\xd6\\xcf\\x66\\x11\\x5e\\x17\\x9b\\x55\\x1a\\xe5\\x39\\xed\\xe7\\x79\\x84\\xd7\\xf2\\xee\\x55\\x69\\xd1\\x88\\x01\\x3e\\xb8\\x39\\x34\\xe3\\x35\\xf0\\xf8\\x30\\x63\\x59\\x46\\x5d\\xe2\\x93\\x27\\x8f\\x1e\\x19\\xdc\\xb3\\x23\\xb4\\x08\\xf2\\x46\\x3d\\xcc\\x4a\\x69\\xb6\\x2e\\x43\\x54\\x0d\\x59\\x7d\\xf3\\xf0\\x1a\\xe8\\xea\\xe0\\xc9\\x33\\x33\\x01\\x8a\\xe6\\xf9\\x8f\\x76\\x73\\xbb\\x9c\\x3d\\xbe\\x18\\x3c\\x8a\\xb0\\x5f\\x08\\xf4\\xb2\\xff\\x74\\x68\\x4a\\x88\\xfc\\xc1\\x96\\x98\\x3f\\xa6\\x8f\\x9f\\xf4\\x23\\xec\\x97\\x06\\xbb\\x9c\\x5d\\x3c\\x35\\xaf\\x6a\\xc9\\x8a\\x02\\xf0\\xfb\\xc2\\xc0\\x45\\xf1\\x97\\x82\\xa6\\x11\\xed\\x5f\\x0c\\x87\\xb9\\x79\\x2d\\x6e\\x59\\x99\\x46\\x59\\xdf\\xfc\\x8b\\x70\\xb0\\x92\\xd8\\x2c\\xc2\\x80\\x77\\x4f\\xe8\\x05\\xac\\x7d\\xb7\\xaa\\xfa\\x97\\x7d\\xb3\\x60\\xdd\\xa2\\x72\\x6f\\x4a\\xc8\\x3b\\x47\\x62\\x69\\x84\\x03\\x04\\x9d\\x3f\\x9d\\x47\\xd8\\xaf\\xb8\\xc7\\x4f\\x2e\\x87\\x86\\x94\\x69\\x43\\x28\\xf2\\xe1\\xec\\xb1\\x21\\x4d\\x9a\\xbd\\xb6\\x78\\x12\\x61\\xfd\\x8d\\xd2\\x3f\\xa6\\x51\\x7e\\x39\\x9b\\xe7\\x97\\x11\\xd6\\x72\\x45\\xb5\\x04\\x0a\\xf8\\xe8\\xf1\\xd3\\x08\\x03\\x9a\\xf7\\x59\\x3f\\xef\\x47\\xd8\\x6d\\x25\\x8c\\x5d\\x0e\\xcd\\xb0\\xfe\\xf1\\xad\\x36\\xb8\\x9c\\xb3\\xd9\\xa3\\x08\\xd7\\xf4\\x1e\\x08\\x91\\x79\\x53\\x2b\\xf9\\xd1\\xb1\\x1e\\x86\\xd4\\xf9\\x05\\x6f\\xa6\\xe1\\x87\\x3b\\x8b\\x46\\x14\\x96\\x78\\x05\\x4c\\xee\\xfb\\x46\\xba\\x7b\\x6b\\x58\\xe1\\xf7\\xbb\\x5d\\xfc\\x9e\\x04\\x26\\x0a\\x6f\\xc1\\xd9\\x56\\x98\\x91\\xd7\\x60\\xa4\\x4a\\x3e\\xb2\\x07\\x15\\x3f\\x47\\x98\\xb7\\x12\\x5e\\x5b\\xb6\\x59\\x60\\x60\\x2e\\x71\\x09\\x92\\x92\\x20\\xfd\\x91\\xb8\\xf2\\x6a\\xc1\\x91\\xe8\\x76\\xd1\\xd6\\xa4\\x53\\x52\\x12\\x36\\x11\\x53\\x27\\x2d\\x79\\x15\\x14\\x08\\x4d\\x8a\\xf0\\x89\\x9c\\xe2\\x92\\x94\\x49\\xc9\\xd6\\x66\\xad\\xc5\\x0a\\xbf\\x9e\\xa8\\x29\\x1a\\x29\\xb2\\xa6\\xa5\\x62\\xdf\\x09\\x1d\\x3f\\x9f\\xd0\\x29\\x1e\\x3c\\x41\\x58\\x4f\\xca\\x29\\x99\\xa8\\xeb\\xeb\\xc1\\x93\\x8e\\x11\\x92\\xd4\\xf5\\xf5\\x25\\x3c\\x0c\\x2f\\x2e\\x3a\\x6a\\x5a\\x79\\xed\\x43\\x15\\x23\\xfc\\x3e\\xd1\\x25\\x15\\x6a\\x4d\\x4b\\x26\\x34\\x99\\x18\\x69\\xbf\\x8f\\xfb\\x53\\x54\\xab\\xe7\\xde\\x4f\\x74\\xa2\\xe5\\x0f\\x86\\x05\\xfa\\x9a\\x2a\\x16\\xa3\\xda\\x3a\\xc4\\x3a\\x9d\\x6d\\x99\\x32\\xcb\\x2e\\x33\\xcb\\x2e\\x33\\xcb\\x2e\\x3f\\x36\\x2c\\xb8\\x1b\\xc1\\xd8\\x30\\xfa\\xe9\\xf0\\xe2\\x22\\xb0\\x02\\xfd\\xe0\\x59\\x72\\x0e\\xea\\x10\\xab\\x75\\x33\\x42\\xdf\\x48\\x4c\\xd8\\xb4\\x91\\xe9\\xfa\\xb8\\x16\\xe6\\x4c\\x46\\xd7\\xfc\\x39\\xe3\\xa0\\x3d\\x66\\xe3\\x47\\x4f\\xfa\\xe9\\x00\\x21\\x2c\\xc8\\x9b\\x58\\x20\\xac\\x93\\x92\\x08\\xd3\\x19\\x9d\\x2c\\x88\\x30\\xdd\\xd1\\xc9\\x8c\\x88\\xc9\\x70\\x1a\\x34\\xfc\\x8d\\x55\\xcc\\xd6\\x5a\\x1c\\x37\\x5d\\x54\\x29\\xbe\\x10\\x31\\xdb\\xed\\xb6\\x15\\xd6\\x2d\\x7d\\xcd\\x77\\x8d\\xd6\\x68\\x5b\\xa6\\x7d\\xbc\\x48\\xfb\\x78\\x96\\xf6\\x31\\x85\\x21\\x79\\x58\\xb4\\x45\\x37\\x8d\\xc6\\xda\\xab\\x69\\xc9\\xa3\\x4e\\x27\\x86\\x6f\\xb5\\x85\\x94\\xb6\\x90\\xd2\\x16\\x52\\xa6\\x12\\x5c\\x17\\x86\\xb2\\x09\\x25\\xab\\x58\\x4f\\x1e\\x4d\\x11\\x42\\x69\\xcc\\x88\\xe9\\xf3\\x5e\\xd3\\x83\\x0a\\x21\\x28\\xc6\\x12\\x8a\\x30\\x6b\\x7a\\xfb\\x47\\x23\\xe1\\x45\\xd6\\x24\\x05\\xb6\\xda\\xe7\\x3a\\xee\\xa3\\x96\\x61\\xd1\\x4f\\xef\\xcd\\xbe\\x84\\x67\\x90\\xd5\\x4b\\x79\\x0c\\x26\\x88\\x4d\\x9e\\x82\\x84\\xd7\\xa0\\x7e\\xd7\\x24\\x8d\\xa0\\x58\\x27\\x66\\x93\\x4b\\x23\\xf3\\x69\\x94\\x5a\\xdd\\x52\\x55\\xcb\\x70\\x5d\\x40\\x0a\\x61\\x45\\x3d\\x2c\\x09\\x48\\x83\\x98\\xfb\\xcf\\x86\\xe6\\x33\\x8e\\x52\\x8e\\xac\\x5c\\x69\\xd2\\x1e\\x9b\\x34\\x81\\x52\\x81\\xb0\\xf4\\x69\\x20\\x52\\x4a\\x94\\x4a\\x2b\\x9e\\xe1\\x45\\x2a\\xf0\\x2c\\x95\\x98\\xa6\\xaa\\xaa\\x2a\\xd3\\xb0\\x91\\x59\\x2b\\x30\\xb3\\x9d\\xbc\\x6c\\x19\\xda\\xac\\x06\\x5a\\x9f\\x70\\xa1\\x34\\x15\\x19\\x93\\xf3\\x93\\x97\\xc8\\x4f\\x7e\\xa3\\x81\\xb6\\xe6\\x57\\x6d\\x41\\x00\\x96\\x3b\\x00\\xc3\\xa8\\xb1\\x41\\x13\\x36\\xe6\\xc4\\xa0\\x42\\x1a\\x29\\x5d\\x72\\xb1\\x80\\xb4\\x4e\\x27\\x56\\x24\\x16\\x44\\x23\\x37\\x81\\x38\\xfa\\x6f\\x93\\x61\\xd0\\xb0\\xd3\\x89\\xcd\\x2a\\x50\\xbb\\xdd\\x85\\xf9\\x19\\x4b\\x83\\x02\\x66\\x44\\x83\\xa7\\x67\\xe5\\xc4\\xe0\\xa7\\x41\\x86\\x20\\x61\\x38\\x35\\x68\\x11\\x24\\x3c\\x9a\\x1a\\x04\\xb1\\x5f\\xbb\\xa4\\xc7\\x53\\xbb\\x92\\xd2\\xa7\\x56\\x71\\xf1\\xec\\x14\\x5a\\x88\\xa1\\x72\\x57\\xeb\\xd5\\xd5\\xe3\\x9d\\xaf\\x6f\\x91\\xba\\x8a\\x7c\\xe2\\x63\\x68\\xc4\\x3c\\x5d\\x34\\x89\\x4f\\xa0\\xa1\\x67\\xd0\\x90\\x79\\x7f\\xda\\x64\\x5d\\xba\\x06\\x91\\xa1\\x6d\\x72\\xb7\\x33\\x24\\x71\\xb7\\x33\\x58\\x56\\xeb\\xfd\\x17\\x33\\xc2\\xdd\\xf3\\x2d\\x2d\\x78\\x4e\\x4e\\x4f\\x79\\xb5\\x60\\xfa\\x04\\xde\\xe2\\x3d\\x4d\\x37\\x24\\x42\\x76\\xb9\\x98\\xc5\\x76\\x65\\x69\\x83\\xe2\\xbe\\xb2\\xda\\xa6\\xa3\\x3b\\x9d\\x58\\x27\\x94\\xdc\\x83\\x1a\\x15\\x61\\x5d\\x29\\xf7\\x95\\xae\\xed\\xa7\\x8b\\x19\\x4c\\x4a\\x55\\x2e\\x66\\xef\\x60\\x5a\\x8e\\x36\\x37\\x8e\\x35\\x69\\xea\\xb7\\xd5\\x82\\x86\\xf6\\xdf\\xe5\\x62\\x46\\xe3\\x2f\\xb6\\x3a\\x29\\x2b\\x7c\\x62\\x7e\\x17\\xee\\x77\\x06\\xbf\\xb6\\xe9\\x0a\\xfd\\x3b\\x35\\x25\\x3f\\x51\\x10\\xfd\\x1b\\xa5\\x75\\xed\\x80\\x3c\\xba\\x5a\\xb2\\xfb\\xcf\\xf5\\x67\\x13\\x0c\\xb7\\xf9\\xb6\\x5a\\xaa\\xe2\\x73\\x5f\\x85\\xcb\\x17\\xec\\x2a\\x6d\\x23\\x06\\x03\\x02\\x8a\\x39\\x01\\x8a\\x2c\\xc8\\x2c\\x36\\xcb\\xcf\\xac\\xa3\\x19\\x2c\\xb6\\x06\\xb0\\x7e\\xf4\\x4b\\x55\\x98\\xd1\\x73\\x18\\x8a\\xa8\\xbe\\x34\\x3f\\xd2\\xfe\\x04\\x23\\x5f\\xaa\\xe2\\x48\\x21\\xf4\\xef\\xea\\xf8\\x20\\x56\\xfc\\xde\\xd2\\x58\\x6f\\x5a\\x01\\x0b\\xab\\xa5\\xf3\\x5e\\x83\\xc8\\x93\\x72\\x31\\xc3\\x92\\x68\\xf3\\x6b\\x5d\\x0f\\xdc\\x20\\x28\\x61\\x80\\x86\\xc9\\x45\\xca\\x70\\x49\\x86\\x67\\x14\\x4c\\xa6\\x22\\xa1\\x3d\\x99\\x50\\x9c\\x91\\x38\\x2e\\xcf\\x0a\\x42\\x7a\\x83\\x71\\x99\\xc6\\x65\\xb7\\x40\\xe7\\xf1\\xa0\\x5b\\x9e\\x15\\x08\\x75\\x07\\xe8\\x7c\\x38\\x52\\x64\\xd0\\xcb\\xb0\\x48\\x4a\\xa0\\x1e\\xd9\\x99\\x48\\xca\\xae\\x3a\\x93\\x49\\xd9\\x4d\\x2e\\xb0\\x48\\x16\\x75\\xf2\\x02\\x92\\x17\\x36\\x79\\x56\\x27\\xcf\\x20\\x79\\x66\\x93\\x29\\xa1\\x67\\x22\\xa1\\xdd\\x78\\xd0\\xa3\\xe8\\xcc\\x74\\x00\\x7a\\x4e\\x44\\x4d\\xe3\\xaa\\xac\\x90\\x82\\x35\\xf3\\x25\\xd8\\xdd\\xc9\\x4b\\x0b\\x18\\x03\\x97\\x8a\\x16\\xeb\\x25\\x3d\\x30\\xf7\\x94\\x8b\\x99\\x25\\xf2\\x76\\x11\\x55\\xe0\\xeb\\xc0\\xca\\xe3\\xe5\\xce\\xc8\\xa0\\xa7\\x6d\\xb9\\x45\\xc9\\x1e\\x54\\x46\\x0b\\x16\\xb0\\x21\\x75\\x49\\xcc\\xc8\\x3c\\x4e\\x1e\\x9d\\x69\\x18\\xeb\\xb3\\x33\\x6d\\x06\\x37\\x18\\x9c\\xe9\\x24\\x58\\x53\\x49\\x49\\xcc\\xf6\\x68\\x76\\x46\\x66\\xeb\\x94\\x6b\\xfa\\xfb\\xe6\\x33\\x6d\\x77\\x5d\\xdb\\x82\\x2d\\xc0\\xf8\\x7e\\xd8\\x70\\x58\\xf9\\xf0\\xe2\\xa2\\xa7\\x93\\x12\\xf6\\x60\\xfb\\xbc\\x80\\x6d\\xd8\\x3e\\xcf\\x6c\\x55\\xa0\\x34\\x63\\xa1\\xf1\\xe5\\x87\\x06\\x97\\xf0\\x10\\x7b\\xb0\\xe4\\xb4\\xfc\\xf8\\x99\\x62\\x3d\\x5f\\x4e\\x51\\xbd\\x29\\xc1\\xc4\\x7f\\xb4\\xe4\\xa0\\xa9\\x90\\xfd\\x69\\xd1\\xba\\xd2\\x52\\xea\\x76\\xb9\\xb6\\x7b\\x92\\x59\\xe7\\xdc\\xb2\\x2c\\x7c\\xd2\\x9f\\x92\\x17\\xb1\\xf9\\xe9\\x32\\xb3\\x00\\xdf\\xc4\\xdc\\xb2\\x23\\xdc\\xb3\\x23\\xdc\\xb3\\x23\\xdc\\xb0\\x23\\x41\\x83\\xbe\\xb5\\x66\\x07\\xff\\x39\\x68\\xd2\\x61\\x93\\x37\\xab\\x7c\\x45\\x34\\xb9\\x6e\\x6d\\x66\\x5f\\x53\\x71\\x4b\\xd5\\xdf\\x4b\\x9a\\x73\\x26\\xf4\\x6e\\x77\\x24\\xf3\\x0d\\xd5\\x9a\\x95\\xa2\\xe1\\x6a\\x7f\\x09\\x1a\\xf8\\x0a\\x58\\x95\\xd4\\xb4\\xd9\\xf4\\xe0\\xdb\\xe3\\x05\\x92\\x1a\\x76\\xc9\\x05\\x4a\\xdc\\xdc\\x24\\x03\\x94\\x04\\xc4\\xae\\xa9\\xe4\\xc7\\x18\\x6d\\x5d\\xb7\\xff\\x13\\x72\\xcf\\x66\\xb1\\x6b\\xd2\\xff\\xb4\\xeb\\x8f\\xee\\x76\\xab\\x2a\\x0e\\x2c\\x5d\\x5f\\x84\\x00\\xd9\\x14\\x05\\x21\\x01\\x77\\xf6\\xc1\\x11\\xc3\\x16\\xff\\xd5\\xe9\\xec\\xb3\\x63\\xde\\xea\\xdc\\xaf\\x69\\xa5\\x63\\xfc\\x1a\\x7f\\x28\\x2d\\xed\\x20\\xbc\\x4b\\x94\\xeb\\x61\\x34\\x09\\x78\\x80\\x44\\x6d\\x66\\x4a\\x97\\x71\\x1f\\x3f\\x45\\x9d\\x4e\\x04\\xb5\\x4f\\x5b\\x39\\xbd\\x27\\x01\\x0c\\x7e\\xda\\xeb\\xf9\\x29\\x21\\xba\\xd3\\xf1\\x35\\x9e\\xd8\\x2e\\xc0\\xf7\\x7f\\xda\\x1b\\x07\\xca\\x5f\\xc1\\xc6\\x19\\x89\\xcd\\x6a\\x06\\x1e\\x47\\x9e\\x73\\xd9\\x9b\\xf9\\x1f\\x21\\x1f\\x75\\x3a\\x5c\\xbd\\xe4\\x82\\x6b\\x16\\x77\\x43\\x43\\xe8\\xef\\x2d\\x26\\xf8\\x57\\x3b\\xc5\\x01\\x13\\xf9\\x7d\\x2b\\xdf\\xba\\x18\\x39\\xcf\\x28\\xed\\x3a\\xf2\\x77\\xe2\\x1c\\x03\\x1a\\x76\\xc8\\xf7\\xa5\\xd3\\xd1\\x09\\x13\\xb9\\xfa\\x85\\xeb\\x65\\x1c\\x7d\\x19\\xa1\\x31\\x48\\x28\\x2f\\x0b\\x49\\x75\\xac\\xc1\\xa4\\x98\\xea\\x73\\x86\\x7f\\xfb\\xdf\\xaa\\xe2\\x8c\\xa5\\x5d\\xdd\\x0c\\xe9\\x9f\\xa1\\x40\\xd1\\xe9\\x1c\\x71\\xfa\\xb3\\x3e\\x45\\xa8\\xd9\\x03\\x9d\\x87\\x1a\\x0b\\x26\\xec\\x1f\\x8d\\x49\\x06\\x4c\\x5b\\x46\\x6c\\x33\\x5b\\x97\\xc1\\x32\\xc4\\xe7\\xb1\\x22\\x9e\\x53\\xc7\\x02\\x19\\xa1\\x4d\\x12\\xd5\\x1b\\x8c\\xe4\\xb5\\x11\\xd9\\x7a\\x3d\\xe4\\xfc\\xe9\\x38\\xd6\\x46\\x5c\\x93\\x68\\xc4\\x0a\\xc5\\x4e\\x6c\\x41\\x23\\xd4\\x29\\x90\\xe6\\x8e\\x97\\xe2\\xf3\\xd8\\xe0\\x0b\\xb2\\xb2\\x60\\x28\\x46\\x6a\\x84\\x15\\xa1\\xbe\\xe1\\x4f\\xd4\\x44\\x27\\xd2\\x70\\x71\\x13\\x39\\x0d\\xc6\\xa3\\x75\\xe0\\x6d\\x67\\x59\\x7b\\x30\\xde\\xe8\\xdd\\xee\\x94\\xed\\x76\\x7e\\x30\\xa7\\x8d\\xb0\\xd6\\xb8\\x67\\x98\\x7e\\x70\\xd2\\x07\\x5b\\x9b\\x13\\x45\\xf9\\x95\\x18\\x75\\xbb\\xdc\\x40\\x42\\x12\\x3d\\xe1\\xe0\\x4f\\x66\\x7e\\x64\\x92\\x53\\x4d\\x15\\xd3\\xdf\\x89\\x9c\\xdd\\x1b\\x9e\\xb4\\x95\\xb0\\xdb\\xc9\\x84\\xd7\\x39\\xf0\\xd4\\xb4\\xe3\\x57\\x66\\xd3\\x6b\\xf0\\xdb\\xd8\\x7a\\xb0\\xd7\\x13\\xb6\\xa2\\xeb\\x98\\x59\\x87\\x0e\\x00\\xd4\\x76\\x6f\\x29\\x67\\x25\\x33\\xc4\\xc9\\x2c\\xb4\\x7d\\x41\\x5c\\x1b\\x09\\xa3\\x96\\xa8\\x61\\x6a\\x49\\xdf\\xba\\x76\\x48\\x18\\x93\\x44\\x6c\\x62\\x44\\xec\\x29\\x31\\x8d\\xdb\\xc7\\x7a\\xd3\\x64\\x8d\\xc0\\xdc\\xb8\\x31\\xea\\x66\\x6d\\xf7\\x06\\x84\\x90\\x49\\x74\\x73\\x03\\xcb\\xf7\\xe6\\x26\\x02\\x4f\\x2a\\xbb\\x90\\x23\\x1c\\x05\\xf2\\x48\\x34\\xb5\\xa3\\x7f\\x3d\\x6f\\x11\\x5c\\xa1\\x1b\\xbc\\x33\\xd3\\x03\\x95\\xb7\\x99\\x3b\\x49\\xd8\\x44\\x1b\\x78\\xf3\\x89\\x9e\\x8e\\x7e\\x8a\\x25\\xea\\x74\\x7e\\x8a\\x15\\x1a\\x4b\\x0d\\xa6\\x2b\\x81\\x52\\x53\\xc0\\x74\\x5f\\x05\\x35\\x4b\\xbd\\x6f\\xbc\\xfd\\x10\\x33\\x34\\x66\\xe9\\x84\\x19\\x81\\x4c\\xd4\\x33\\x3b\\x8f\\x4f\\x7f\\x0a\\xa1\\x5d\\x7b\\xb2\\xc5\\x9c\\x70\\x23\\x15\\xa3\\x64\\xc5\\xca\\x05\\x2b\\x77\\x3b\\xa1\\x01\\x72\\xe0\\xda\\x46\\xfa\\x23\\x7a\\x25\\x47\\xdd\\x2e\\xb5\\x3d\\xff\\x29\\x66\\x44\\x4c\\xe8\\x14\\xa1\\x4c\\x0a\\xcd\\xc5\\x86\\xd5\\xfd\\x0f\\xe7\\x83\\xa1\\xba\\x0a\\x41\\xfa\\x98\\x12\\x59\\xab\\x43\\xae\\xe8\\xa8\\xdb\\x15\\x48\\xc5\\x72\\x22\\xa6\\xde\\x4c\\x77\\x08\\x7f\\xa5\\x5b\\x34\\xca\\x8d\\x73\\x6b\\xfb\\x98\\x52\\x5d\\x05\\x40\\xa0\\x3a\\x20\\x0e\\xc7\\x80\\x2b\\x2c\\x70\\xa5\\x07\\xae\\x00\\xe0\\x4a\\x34\\x56\\x1a\\xdc\\xff\\xd2\\x03\\xf2\\xbc\\xa4\\xea\\xf5\\x9d\\x78\\x53\\xca\\x35\\x2b\\xf5\\x83\\x5d\\x85\\x0c\\x1b\\xd1\\x28\\xf6\\xd3\\x20\\x51\\xd0\\x85\\x52\\xef\\xf1\\xc4\\x35\\x1e\\x44\\x49\\x84\\x99\\x47\\x35\\xc0\\x24\\x5e\\xeb\\x0e\\x52\\xde\\xd4\\x50\\xb8\\x1a\\xf8\\x3c\\x8e\\x60\\xc7\\x69\\xa6\\xca\\x79\\x2f\\x62\\x41\\x4a\\x30\\x0f\\x5b\\xe0\\x8e\\x74\\xa7\\x23\\xae\\xf9\\x08\\x69\\xa2\\x27\\xf5\\xfe\\xc4\\xb1\\xe8\\x71\\x64\\x84\\x70\\xd1\\x1d\\x04\\x5f\\x1c\\x42\\x38\\xd3\\x21\\x4b\\xd8\\x68\\x11\\x12\\x2d\\x7f\\x5a\\xaf\\xbd\\x32\\xa8\\xab\\xad\\x23\\x71\\x3c\\xf0\\x5b\\xd4\\x52\\x9b\\x3d\\xca\\x6e\\x1a\\x66\\xc3\\xc3\\x39\\x24\\x1c\\xa3\\xc8\\x78\\xa3\\xfd\\x1e\\x00\\x74\\x3b\\x51\\xfc\\x0f\\x06\\xc4\\xc8\\x3c\\xb4\\x49\\x91\\x83\\xdc\\x89\\xf9\\x0e\\x81\\x01\\xda\\x4c\\x42\\xcc\\xd1\\x11\\x4a\\x82\\xe7\\xfa\\x28\\x51\\x58\\x1c\\x4d\\x0e\\x7c\\x6a\\x1a\\x18\\x9f\\xb2\\xfd\\xa5\\xc0\\x4d\\xb7\\xd6\\x05\\xd7\\x66\\xca\\x1a\\xfc\\x65\\x00\\xf8\\x9a\\xb6\\x30\\x20\\x27\\x2c\\x10\\x75\\x26\\x6c\\x3a\\x32\\x53\\x20\\xa6\\xbb\\x5d\\x6c\\x7e\\x8e\\xf5\\xe1\\x18\\x8a\\xaf\\x74\\xdb\\x6e\\x7d\\xb0\\x4d\\x32\\xb3\\xf8\\x5d\\x9f\\x31\\x47\\xa9\\x7f\\x8b\\x22\\x64\\x76\\x35\\xc3\\xa1\\xde\\xeb\\x4f\\x78\\x20\\x7b\\x11\\x9a\\x7a\\x2f\\x72\\xe7\\x49\\x6c\\x05\\xf9\\x19\\xcd\\x3e\\x2e\\x4a\\xb9\\x11\\xf9\\xd7\\xb2\\x90\\x25\\x89\\x40\\x4e\\x76\\xba\\xc1\\x64\\x80\\x22\\x57\\x4c\\x96\\x39\\x2b\\x3f\\x5b\\x24\\xb3\\x99\\xff\\xfd\\xe4\\xc9\\x13\\x97\\xe2\\x36\\x06\\x45\\xb6\\x95\\x4b\\x60\\xb7\\x3c\\x63\\x6f\\xf8\\x3d\\x2b\\xde\\x9a\\xae\\x00\\x93\\x6b\\x4f\\x18\\x24\\xeb\\x82\\xea\\xb9\\x2c\\x57\\xc9\\x82\\xe9\\x17\\x7b\\xe5\\x62\\xa7\\x81\\x60\\x05\\x5b\\x31\\x11\\x54\\xc8\\x6e\\xe1\\x75\\x12\\xad\\xe4\\x46\\x81\\xbf\\x5d\\x84\\xed\\xb3\\xdc\\x68\\x43\\x90\\x0b\\x9e\\x7d\\x8c\\x70\\xa4\\xe5\\x26\\x5b\\x5a\\xbf\\x6f\\xf7\\x02\\x65\\x9d\\x33\\xdf\\x5c\\x0a\\x4d\\xb6\\x73\\xba\\xe2\\xc5\\x43\\x1a\\xfd\\xed\\x5b\\x56\\xdc\\x32\\xcd\\x33\\x7a\\xf2\\x23\\xdb\\xb0\\xbf\\xe1\\x93\\x26\\xc5\\xbc\\x3c\\x2f\\x39\\x2d\\xfe\\x86\\x4f\\x14\\x15\\xaa\\xa7\\x58\\xc9\\xe7\\x11\\x36\\x48\\x9c\\x0e\\x86\\x58\\xe9\\x87\\x82\\xa5\\x91\\x90\\xe5\\x8a\\x16\\x11\\x2e\\xb8\\x60\\xdf\\x32\\x23\\x02\\xa5\\x83\\x64\\x88\\xef\\xec\\xa3\\x41\\x03\\xd7\\xff\\xa5\\xbc\\x65\\x65\\x3d\\x1a\\x78\\xfb\\x6a\\x6f\\x42\\xdc\\xaa\\xf9\\x36\\x66\\xfb\\x73\\x85\\xc2\\xaf\\x82\\xf9\\x09\\xbf\\x68\\x92\\xc3\\xd2\\x07\\xe5\\xb2\\xa0\\x04\\x90\\xab\\xe7\\xf7\\x5c\\x91\\xe8\\x3e\\xf2\\x49\\x9a\\x95\\x14\\x70\\x95\\x6c\\x57\\x32\\x37\\x43\\x34\\x62\\xac\\xd2\\x11\\x86\\x3c\\xc5\\x32\\x9d\\x9a\\xe5\\x08\\xc5\\x57\\x94\\x0b\\x4d\\xb9\\x78\\xae\\xd6\\x2c\\xd3\\x76\\xa6\\x4f\\x1d\\xbe\\x49\\xf1\\x2d\\x8c\\xb9\\xf1\\x83\\x97\\xe2\\x6b\\x33\\x4b\\x41\\x8a\\xe1\\x00\\x9d\\x07\\xab\\x7d\\x2f\\x36\\x0b\\x2e\\x9a\\x59\\x2f\\x99\\x5a\\x4b\\xa1\\xf8\\x2d\\xab\\x8b\\x80\\xa8\\xdc\\x42\\x6c\\x48\\x69\\xbe\\x51\\x4b\\x79\\xf7\\x03\\x17\\xcd\\x17\\x39\\x53\\x59\\xc9\\x67\\xe0\\x82\\x69\\xdd\\x80\\x9b\\x3d\\xc6\\xac\\xc7\\x25\\x57\\x66\\x4f\\x42\\x95\\x75\\x2e\\xf5\\x59\\x6b\\x9f\\x85\\xaa\\xa6\\x86\\xf6\\xa7\\x0b\\x6d\\x3f\\x34\\xe3\\x2c\\x79\\x7e\\x90\\x3f\\x77\\xf9\\xa5\\xdc\\x68\\x76\\xe8\\xc7\\xdf\\xb4\\x80\\x55\\xfd\\xc2\\x11\\xa6\\x24\\xba\\x89\\xba\\x6c\\xe4\\x68\\x8a\\x3d\\x52\\xe2\\xf6\\x25\\xce\\x54\\x2c\\xf1\\x76\\x42\\xa7\\xe9\\xf6\\x96\\x16\\x1b\\x96\\x4a\\xb3\\xed\\xdf\\x95\\x5c\\xd3\\x59\\xc1\\x60\\x6a\\x26\\x6c\\x9a\\x6e\\x99\\xd8\\xac\\x58\\xe9\\xd2\\xb0\\x19\\x5a\\x5b\\xca\\x9f\\xd0\\x29\\x66\\x44\\x4d\\x44\\xad\\xfa\\x37\\xbc\\xc2\\x9e\\xee\\x7c\\x5b\\x61\\xb3\\x03\\xa6\\x56\\x78\\xa8\\xb0\\xb2\\x10\\x72\\xdf\\x13\\x5d\\x55\\x15\\xaa\\xaa\\x78\\x7b\\x63\\xe0\\xb3\\xb6\\x3d\\xd0\\xe4\\xfa\\x54\\x5b\\x77\\x64\\xc7\\xeb\\x4b\\x11\\x21\\x7c\\x03\\xd8\\xe6\\x4b\\x44\\x76\\x3d\\x47\\xb0\\x99\\x00\\xa6\\xa6\\xdb\\x9b\\x39\\x2d\\x8a\\x19\\xf8\\x8c\\x04\\x68\\x18\\x55\\x38\\x78\\x4b\\x5b\\x4d\\x9d\\x0e\\xc2\\x6a\\x4f\\x07\\x55\\xe5\\x4d\\x1c\\x33\\x6d\\xed\\x0d\\x6f\\xbe\\xc3\\x37\\x9a\\x0c\\xcf\\x66\\x1a\\x3f\\x68\\x72\\xa3\\xbb\\x33\\x8d\\x6f\\x35\\xb1\\xb2\\x54\\xf2\\xe6\\xf5\\xbb\\xef\\xde\\x7f\\xf7\\xf3\\x37\\x37\\xdf\\xfd\\xf8\\xf2\\xbb\\x1f\\xbf\\x7b\\xff\\x01\\xdf\\x69\\x32\\xd3\\xe7\\x83\\xcb\\x3e\\x7e\\x05\\x4f\\x43\\xfc\\x11\\x7e\\x1f\\xe3\\x77\\xb6\\x9a\\xf3\\x47\\xf8\\x8d\\xab\\xbb\\x90\\x8b\\x41\\x1f\\xbf\\x70\\x6f\\x06\\x5e\\xcd\\xae\\xf3\\x75\\xcb\\x85\\x1b\\x0a\\xac\\xe5\\x5d\\x3c\\x70\\xb6\\x8f\\x79\\x21\\x65\\x19\\xbf\\x01\\xae\\xc5\\xf0\\xb5\\xfa\\xdc\\x3b\\xcc\\xc5\\xfc\\x8a\\x0c\\xc6\\x83\\x94\\x5f\\x91\\xe1\\x78\\x68\\x7e\\x2e\\xc6\\x17\\xe9\\xa0\\x8f\\xce\\x02\\x59\\xee\\x75\\xab\\xf6\\x89\\xd9\\xf9\\x6d\\x1f\\x7e\\x07\\xd7\\x71\\x6b\\xa0\\x72\\x86\\xa9\\xc1\\x48\\x5c\\x71\\xb0\\x48\\xe9\\x2f\\x05\\x21\\x7d\\x30\\x46\\x80\\x7b\\xba\\x40\\xd8\\x3d\\xe9\\x73\\x81\\x1a\\xb7\\x7b\\x42\\x48\\xdc\\xdf\\x71\\xd4\\xe9\\x30\\xef\\xfd\\x8e\\x59\\xa2\\x64\\xa9\\x6b\\xcf\\x71\\xdd\\x63\\x08\\xd9\\xf3\\x07\\xa1\\xa1\\xe2\\x79\\xb0\\x7e\\x4e\\xb9\\xfa\\x91\\xfe\\x18\\xb7\\x64\\xbc\\x50\\x78\\x0d\\x79\\xe5\\xf7\\x7b\\xbb\\xe2\\x09\\x8c\\x86\\xce\\x54\\x6c\\x1a\\xba\\x0a\\x38\\xa6\\xb7\\x7b\\x3c\\x17\\x14\\x04\\x42\\x19\\x1e\\x1c\\xe8\\xb1\\x2b\\x23\\x94\\xf3\\x2e\\xbb\\x0e\\xf5\\x0a\\x3f\\xd4\\xcd\\xd4\\x16\\x3c\\x6f\\xbd\\x03\\xbd\\x65\\xcd\\xae\\x4a\\x80\\x97\\x82\\x0d\\xde\\x88\\x42\\x76\\x28\\x0a\\x38\\xc1\\x64\\xc5\\x45\\xe0\\x8d\\x68\\xfe\\x62\\x65\\x00\\xb4\\xa2\\xf7\\x81\\xdf\\xa2\\xf9\\x8b\\x55\\xc8\\x2e\\x7e\\xd3\\xe2\\xbd\\xce\\x62\\x8b\\x67\\x41\\x81\\xef\\xf6\\x0a\\x0c\\x2e\\xfb\\xe7\\xb3\\x10\\x4c\\x7f\\x78\\x19\\xea\\xf4\\xd7\\x80\\xdd\\xb5\\x0c\\xcb\\x00\\x73\\x2f\\xfd\\x84\\x30\\x39\\x63\\xe8\\xdc\\x70\\x5f\\x7a\\x84\\xd8\\x19\\x19\\xf4\\x31\\xef\\x76\\x6b\\x30\\x35\\x35\\xbf\\xdc\\x03\\x2b\\x4b\\xee\\x7b\\x3a\\xb9\\xc7\\x82\\xb0\\xe4\\xa1\\xa7\\x93\\x07\\xef\\x93\\x09\\x18\\xc6\\xcf\\x78\\x57\\x9c\\x09\\x7f\\xbe\\xcc\\x4e\\x96\\xa6\\x62\\x18\\x8b\\x80\\xed\\x54\\x57\\xbd\\xe4\\xe2\\x6c\\xa6\\x3b\\x9d\\x58\\x75\\xc9\\x8d\\x46\\x78\\x4b\\xc5\\xa2\\x60\\xa9\\xc2\\x39\\xb7\\x5a\\x8d\\x54\\x86\\x3a\\xb2\\x36\\x65\\x6e\\x9a\\xab\\x57\\x8f\\xef\\xd5\\x10\\x75\\x83\\x34\\xdb\\xbf\\x61\\x08\\xea\\xaf\\x5a\\x55\\x19\\x24\\xea\\x3e\\x68\\xf4\\xe5\\x8d\\xee\\xcd\\x02\\x74\\xf8\\x45\\xb7\\x3c\\x27\\x6f\\x74\\xf7\\x06\\x0a\\x05\\x4a\\xb3\\x03\\x49\\x0b\\xbe\\xc1\\xd2\\xfc\\x32\\x43\\xb5\\x7f\\x81\\x63\\x6c\\xd4\\xfc\\xca\\x9e\\x40\\xb8\\x34\\x4f\\xca\\x3c\\x15\\xe6\\x49\\xf4\\x24\\xc2\\x99\\x7d\\x52\\x35\\x64\\x04\\x21\\x44\\xee\\x76\\xc2\\x5a\\x92\\xe8\\x75\\xd9\\xe9\\x14\\x57\\x59\\xa0\\x66\\x3b\\xba\\x1c\\xac\\x3b\\x6c\\xe0\\x89\\xac\\xc3\\x21\\xff\\x27\\x44\\x1e\\xa8\\xa0\\xf7\\x68\\xf8\\xf4\\xc9\\x25\\x36\\x7f\\x9f\\x06\\x05\\xbf\\x08\\xd7\\xa8\\xde\\xed\\xbe\\x70\\x2c\\x3a\\xb2\\x8f\\x96\\x37\\x42\\x63\\xb3\\x47\\xa7\\x26\\xcb\\xf0\\x39\\x63\\xf7\\xdb\\x8d\\x4e\\xa2\\x34\\x8a\\xc0\\x1d\\xde\\xb2\\x38\\x63\\xff\\x50\\x67\\xd9\\xda\\xba\\xd1\\xfa\\xfe\\x24\\xea\\xfa\\xfa\\x02\\xdd\\x5e\\x2d\\x16\\x63\\x69\\xd7\\xa1\\x22\\x6c\\x22\\xeb\\x4d\\xc8\\x9e\\x43\\x34\\x29\\x44\\x27\\x2b\\x46\\xd5\\xa6\\x64\\xef\\xd9\\xbd\\x11\\xbd\\x92\\x3b\\x9e\\xeb\\x25\\xe6\\x96\\x28\\x49\\x84\\xb0\\xba\\x86\\x13\\x54\\x44\\x21\\x1c\\xf8\\x19\\xff\\xa4\\xf7\\x34\\x3e\\x24\\x16\\x44\\x58\\x79\\xd7\\x30\\xaa\\x44\\xc0\\x0f\\x98\\x85\\x15\\x11\\xc9\\x82\\x96\\x33\\xba\\x60\\x5f\\xcb\\xa2\\x60\\x99\\x3e\\x48\\xd8\\xed\\x26\\xd3\\x91\\x00\\xd6\\xf1\\xd4\\x9a\\x07\\xa5\\xab\\x81\\x1c\\xaf\\x60\\x32\\xc5\\xb6\\x38\\x61\\x08\\xeb\\x44\\xd1\\x5b\\x66\\xd8\\x5a\\x97\\x34\\xf2\\x32\\xb6\\x3f\\x85\\xd1\\x52\\x61\\x14\\x38\\xc3\\x4b\\x9c\\xe3\\x8d\\x95\\x45\\x48\\x7f\\x54\\x5c\\x95\\xa3\\xa2\\xdb\\x35\\xe2\\x51\\x4e\\xf8\\xa4\\x98\\x62\\xab\\x75\\xcc\\x3b\\x9d\\x53\\x23\\x8b\\x7d\\x88\\x73\\x84\\x28\\x01\\xb8\\x5a\\x97\\x84\\xbc\\x51\\x3e\\x41\\x26\\x48\\x5a\\xa4\\x8f\\x97\\x24\\xf7\\x4d\\x65\\x57\\xcb\\x51\\xd6\\xed\\xa2\\x0d\\xc9\\x27\\x99\\xad\\x91\\x90\\xcd\\x6e\\xf7\\x21\\xde\\x18\\x22\\xd7\\xaa\\x6e\\x83\\xd0\\x48\\x1b\\x4e\\x4c\\xcb\\x92\\xc5\\x7e\\x83\\x9d\\xd7\\xe7\\xc0\\xce\\x87\\x23\\x3e\\x8f\\xe7\\xd7\\x7e\\x1c\\xd6\\xf3\\xc1\\x76\\x7d\\x0e\\x5d\\xb7\\x27\\x60\\x4e\\xe4\\x44\\x4d\\x8a\\xe9\\x74\\xa4\\x40\\xe4\\xca\\x58\\xdc\\xc7\\xf3\\x5a\\x46\\xa2\\xcd\\xfc\\xfd\\x7a\\xb0\\xea\\x74\\xe2\\x0e\\x28\\xee\\x8b\\x0b\\x58\\x12\\x03\\x03\\x3e\\xae\\x57\\x08\\x3f\\x1f\\xe2\\xe4\\x02\\xa5\\xb5\\x32\\x3a\\xa0\\x86\\x31\\xeb\\x49\\x74\\x26\\xd0\\xb9\\xe8\\xca\\xa6\\xb9\\xdf\\x1d\\xb1\\x88\\x19\\x01\\xf5\\xd9\\x82\\xe9\\xaf\\xa5\\xd0\\x06\\xe7\\xa2\\x61\\x1e\\x21\\xe4\\x67\\x90\\x19\\x20\\x30\\xfd\\xbe\\xa4\\x42\\x19\\xf9\\x05\\x92\\xc0\\xca\\xf3\\x96\\x65\\x1a\\xc4\\x24\\xed\\x70\\x54\\x27\\x4b\\x58\\x15\\xee\\x23\\x0b\\xb9\\x40\\x17\\xbb\\x8f\\xa1\\xd6\\x95\\x04\\x17\\x0e\\xb8\\x19\\x61\\xc9\\x5a\\x72\\xa1\\xdf\\x99\\x55\\x87\\x97\\x84\\x25\\x60\\xb9\\xe0\\x52\\xe0\\xdc\\xbc\\xd0\\x9c\\x6f\\xec\\xb9\\xa6\\x0d\\x89\\x97\\xbb\\x5d\\x1f\\x9d\\xdd\\x69\\x33\\x0d\\x59\\xa7\\x73\\x70\\xc6\\x3a\\x03\\x94\\xcd\\x6a\\xf5\\x73\\x8c\\x70\\xad\\xae\\xfe\\xf6\\xfd\\xab\\x1f\\xbe\\x5b\\xd1\\x05\\xfb\\xc6\\x0a\\x5c\\xa0\\xb8\\x96\\xbb\\x5d\\xab\\x80\\xb5\\x39\\xb4\\x4a\\x04\\x2a\\xbc\\x1a\\xbf\\xc1\\xe7\\xa4\\x30\\xe2\\x2f\\x78\\xe8\\xeb\\xc4\\x59\\x5b\\x36\\xe6\\x39\\x2f\\xe9\\x1d\\x34\\x14\\x67\\xb8\\x97\\x59\\x30\\x9d\\x0f\\xcd\\xa3\\x85\\xd4\\xf9\\x10\\xbb\\x54\\x9c\\xd5\\xc0\\x03\\x2e\\x3f\\xc4\\x3d\\xb3\\xf7\\xc5\\x76\\x37\\xce\\xd1\\x6e\\x97\\x5f\\x91\\x3e\\x42\\x5b\\x75\\xc7\\x75\\xb6\\x8c\\x75\\x32\\x63\\x0b\\x2e\\xde\\x50\\xbd\\x8c\\x11\\xce\\xd0\\x36\\x67\\x73\\xba\\x29\\x74\\xaa\\x13\\x5a\\x66\\xa6\\x53\\x38\\xc7\\x7d\\x6c\\x76\\x22\\x9d\\x64\\x85\\x54\\xcc\\x16\\x1d\\xcd\\x4a\\x46\\x3f\\x8e\\x32\\xaa\\x58\\xa4\\x4b\\x0e\\x9b\\x54\\x94\\xea\\xc4\\x08\\x8e\\xef\\x65\\xcc\\xbb\\x8e\\xbf\\x13\\xf1\\x06\\x9d\\xe5\\x58\\xf4\\xe0\\x3d\\x93\\x0a\\xde\\x11\\xde\\x74\\xc9\\x3b\\x8d\\x75\\x62\\x64\\xc0\\xff\\x13\\xe5\\x3f\\xd9\\xd9\\xd2\\xc8\\x5c\\x06\\xb3\\x59\\x1e\\xa5\\x05\\x49\\x2e\\x06\\x4f\\xce\\x72\\x5c\\x92\\xbc\\x57\\xf8\\x13\\x13\\x50\\x4b\\xf7\\xa3\\x46\\x67\\x25\\xa6\\xa4\\x69\\xc8\\x25\\x39\\xc8\\xf4\\x14\\x16\\x3d\\x8a\\x0b\\xbc\\xe9\\xcd\\x34\\xde\\xf4\\x5e\\x01\\x88\\x20\\xab\\x4b\\xb1\\xe8\\x29\\xc8\\x7a\\xa5\\xf1\\xa6\\x49\\x57\\x58\\x74\\xe1\\x13\\xbc\\xe9\\x06\\xe5\\x7b\\x14\\x8b\\x2e\\x94\\xef\\x9a\\xf2\\xdd\\xd9\\xe7\\xa0\\x6d\\x06\\x10\\xa5\\x66\\x52\\x97\\x68\\x5b\\xda\\xee\\xbd\\xfb\\xe7\\xdb\\xf7\\x83\\x9b\\xe1\\x59\\x6e\\x10\\xc8\\xac\\x2b\\xde\\x2b\\xb1\\xe8\\x95\\x78\\x78\\x06\\xff\\xbb\\x0a\\xaa\\x4d\\x97\\x7c\\xd4\\x21\\x1c\\x74\\x94\\x86\\x83\\x36\\xa0\\x0c\\x47\\x8c\\xa0\\x46\\x3f\\xa7\\x76\\xc4\\x28\\x9c\\x05\\x18\\x68\\x2b\\x05\\x86\\x18\\xa6\\xd8\\xc1\\x7d\\x66\\x40\\x59\\x29\\x95\\x82\\xae\\x04\\xdd\\x83\\xc4\\xff\\xcd\\xce\\xd5\\x5d\\xa9\\x91\\xf2\\xa0\\xbb\\xae\\x73\\x61\\x77\\x8c\\x10\\xf6\\xff\\x59\\xc3\\x18\\x86\\x8c\\xff\\x7f\\x18\\xa6\\xc9\\xfa\\x7f\\x65\\x98\\x61\\xa5\\x39\\x55\\xcb\\x90\\x0a\\x58\\x92\\xd6\\x5e\\xb3\\x75\\x5b\\xa2\\xbd\\x86\\x51\\xa5\\x93\\x39\\x2f\\x0a\\xd8\\x21\\xac\\x66\\xe6\\x17\\x43\\xda\\xae\\xfb\\x9d\\x8e\\x61\\xa5\\x4a\\xf9\\xd1\\xec\\x07\\xcd\\x86\\xf0\\xf7\\x7d\\x8e\\x0f\\x14\\xf4\\xc9\\x05\\x06\\xab\\xd9\\xfd\\x35\\x4b\\x0a\\x36\\xd7\\x3d\\x0e\\x6f\\x57\\x2c\\x81\\x58\\x05\\x5d\\x78\\x7d\\xb8\\x66\\x89\\x96\\x6b\\x9b\\xf7\\x70\\x65\\xda\\xd3\\x5a\\xae\\xba\\x01\\x77\\xff\\x9b\\xdb\\xe1\\x02\\x5a\\x1d\\x52\\x4a\\xb7\\xce\\x6c\\x1b\\x18\\x6a\\xc3\\xae\\x89\\x5e\\x9d\\x68\\x6b\\xed\\x41\\xae\\x5d\\x00\\x7c\\x1d\\x6e\\x69\\xff\\xb4\\x8a\\x81\\x63\\xbb\\xdd\\x3f\\x5a\\x2c\\x5f\\x5b\\x0f\\x5b\\x03\\x34\\xb9\\xc7\\x3c\\x79\\x00\\x0a\\x1f\\xad\\x78\\x9e\\x17\\xcc\\xee\\x33\\xcd\\x39\\x38\\x96\\xdc\\x77\\x79\\x72\\x8f\\xce\\x87\\xa3\\xfa\\x33\\x81\\x59\\xf2\\x10\\xcc\\x8b\\x80\\x4a\\x2a\\xc3\\xfe\\x44\\x74\\xee\\x02\\x38\\xc8\\x53\\x72\\x7a\\x2a\\xc6\\x75\\x21\\xe6\\xda\\x4a\\x5b\\xad\\x9b\\x8a\\x46\\x07\\xfd\\x09\\xcc\\x6e\\xac\\x6d\\xcf\\xf9\\xcc\\x18\\x0c\\x78\\xff\\xe0\\xac\\xfc\\x7a\\x53\\x02\\xee\\x88\\x31\\x4b\\xb2\\xf5\\xe0\\x3e\\x35\\x3f\\xc3\\x7b\\xec\\xde\\x1f\\xec\\xfb\\x03\\x16\\x63\\x0e\\x19\\x29\\x87\\x62\\xfe\\xfd\\xc1\\xbe\\x3f\\xe0\\xc3\\xce\\x30\\xd6\\x80\\x14\\x2b\\xb2\\xad\\x3c\\x9c\\x68\\x68\\x0b\\x2a\\x89\\x72\\xc8\\x56\\x63\\x5f\\x14\\x81\\xb9\\xce\\xa6\\x82\\x72\\xd0\\xb3\\x9d\\xc0\\x70\\xd6\\x18\\xa2\\xea\\xdd\\x1c\\xa2\\x14\\x84\\x9b\\x7b\\x2b\\x6b\\xd2\\x9f\\xb6\\xcb\\x82\\x77\\xd2\\x17\\xb1\\xaa\\x19\\x16\\x64\\x78\\x2a\\xc7\\x09\\x04\\xa9\\x9e\\x1f\\x96\\x89\\xd5\\x80\\x63\\xa7\\x56\\x06\\x47\\x2e\\xb3\\x76\\x80\\xf5\\x21\\xca\\x2b\\x2c\\x55\\x62\\x38\\xb2\\xe7\\x05\\x5f\\x08\\x28\\x52\\xbf\\x91\\x20\\xc7\\x17\\xfb\\x8a\\x2a\\x56\\x40\\x34\\x18\\x57\\xd2\\x27\\x90\\x76\\xbe\\x91\\xd2\\x0c\\x9b\\xea\\xed\\xb0\\xa3\\x6e\\xb7\\x80\\xd9\\xcd\\x08\\x35\\x9c\\xb6\\xe9\\x4d\\x0b\\x58\\x50\\xa1\\x7d\\xf7\\xfd\\x0b\\x72\\xed\\xc0\\x03\\x88\\x1b\\x5e\\xda\\xa2\\x07\\xbc\\xb6\\xa7\\x03\\x64\\x03\\x78\\x05\\xf9\\x26\\x83\\xd9\\x54\\x86\\x89\\xb5\\xd9\\x00\\x22\\x5e\\x14\\xc7\\x73\\x31\\xd4\\xc5\\x3f\\x32\\xbd\\x2c\\xe5\\x66\\xb1\\xdc\\xed\\x54\\x02\\x07\\xbe\\x61\\x5c\\xc1\\x31\\xcb\\x50\\x86\\xca\\x8c\\xe8\\xca\\x7b\\x2c\\xa1\\x99\\xde\\xd0\\xe2\\x2b\\xc3\\x3b\\x70\\xb1\\xf8\\x4a\\xde\\xff\\x60\\x56\\x39\\x25\\xbc\\x7b\\x24\\xef\\xad\\xa1\\x04\\xb8\\x24\\xe2\\xd8\\x87\\xcf\\x55\\xc6\\x84\\xc6\\x05\\x11\\xc7\\x3e\\x7d\\xc1\\x6c\\xb6\\x1b\\x7a\\xd3\\xdd\\xb1\\x75\\xf3\\x1a\\xa6\\xc5\\xa8\\x0d\\xd0\\x60\\xf2\\x0f\\xc8\\x54\\x08\\xc8\\x9c\\x65\\xd2\\xc6\\x2b\\x80\\x94\\xdd\\x6e\\xd8\\x10\\x78\\x89\\x97\\x01\\x4d\\xa0\\x38\\x00\\x75\\x8c\\x2a\\xd1\\x25\\x32\\x69\\xf4\\xf5\\xd5\\x51\\x9a\\xc5\\x59\\xa0\\x10\\xd9\\xde\\xa7\\x1c\\x3f\\xa4\\x02\\xdf\\xa5\\x12\\x2f\\x53\\x85\\x2d\\xff\\x9d\\xd2\\x8a\\xb0\\x51\\xcd\\x27\\x19\\xca\\x08\\x60\\x14\\xc1\\x73\\xf3\\x64\\xd8\\xa7\\x99\\xc6\\xa7\\xfd\\x70\\x1b\\x31\\x5b\\x59\\x8f\\x3a\\xe2\\x6a\\x8a\\x05\\x7c\\x57\\x90\\x7a\\x50\\x0c\\xb7\\x5e\\x66\\x1a\\xbf\\xda\\xaf\\xb9\\x2b\\xeb\\x0f\\xec\\xfc\\x39\\xc6\\xc5\\x56\\x7e\\x24\\x73\\x2f\\xa5\\xfd\\xf6\\x4a\\xe3\\xfe\\x41\\x03\\x7e\\xa0\\x6f\\x2d\\xb3\\x1e\\xd6\\xed\\x53\\x5b\\x45\\x70\\xf0\\xd8\\x07\\x78\\xec\\xd5\\x18\\x80\\x30\\x34\\xa4\\xb3\\xda\\xd2\\x4b\\x6c\\x48\\x90\\x6b\\x3d\\xe1\\xd3\\x2b\\x56\\x3b\\xe2\\xd7\\xaa\\xbb\\xde\\x00\\xab\\xda\\x07\\xa0\\xa7\\xae\\x07\\x23\\x24\\x88\\xea\\xca\\xeb\\xeb\\x01\\xe6\\xb1\\x40\\x63\\x45\\x44\\x2a\\x89\\x70\\xb2\\xe1\\xb6\\x90\\xa9\\xc2\\x4b\\x9e\\x4a\\x7f\\x10\\x54\\xb2\\xe6\\xbc\\x3e\\xb4\\xcb\\x71\\x2c\\x4c\\x7b\\x62\\x3a\\x61\\xd3\\x2b\\x8e\\x10\\x56\\x9f\\x2d\\x72\\x4d\\x38\\x0a\\x8c\\x8f\\x94\\xb5\\x34\\x8e\\x6d\\x3d\\xa3\\x8d\\x42\\x71\\x25\\x3b\\x1d\\xf3\\xf1\\x15\\x1b\\x21\\xd1\\xed\\xba\\xce\\x5f\\x1b\\xa2\\x3b\\x91\\xbd\\xc1\\xf4\\x9a\\x8f\\x90\\xec\\xf5\\x6a\\xdd\\xd1\\x75\\x7f\\xb7\\x93\\x57\\xbe\\x92\\xb1\\x37\\xd5\\x82\\x49\\xdb\\x3b\\xf2\\x94\\x8c\\x4c\\xa2\\xf5\\x46\\x2d\\x23\\x1c\\xad\\xe5\\x3a\\xc2\\x91\\x5a\\xf2\\xb9\\x36\\xbf\\x20\\x79\\x47\\x38\\xda\\x08\\x9b\\x34\\x6d\\x3a\\x5b\\x30\\xcf\\x26\\xdc\\xb8\\x50\\x60\\xe3\\xe6\\xb1\\x09\\x8a\\x62\\xd5\\x2f\\x0c\\xa5\\xf1\\x31\\xfb\\xc4\\x43\\xac\\x71\\xe4\\x3f\\x8a\\xb0\\x59\\x40\\x73\\xbe\\xd8\\xd4\\x86\\x88\\xd0\\x2c\\x31\\xc0\\xd6\\x82\\xb1\\x6d\\x62\\xb8\\x4c\\xd8\\xb4\\xaa\\x10\\x2e\\x59\\x13\\xac\\x87\\x91\\xeb\\x5a\\x2f\\x19\\xdd\\x48\\xf1\\x82\\x6a\\x1a\\x75\\x33\\x50\\xc0\\x09\\xa2\\x27\\x6c\\x7a\\xd4\\x50\\x62\\x23\\x76\\xfc\\x95\\xf6\\x6d\\x9c\\x96\\x26\\xb4\\x96\\xf3\\x22\\x02\\x6b\\x0c\\x0b\\xbc\\x2c\\x8f\\x80\\xa2\\xee\\xa4\\x26\\xd7\\xdb\\x63\\xd6\\xf0\\x09\\x9f\\x9a\\x89\\xe4\\x53\\x17\\x0c\\x06\\x21\\x2c\\xab\\xca\\xc6\\x30\\x6a\\xac\\xf2\\x6c\\xdf\\x91\\xc0\\x37\\x05\\x02\\x2f\\xdf\\x77\\x6c\\xe0\\x4d\\x0f\\xc0\\xdf\\xc3\\xbb\\x1d\\x30\\x34\\xea\\x0d\\x4e\\x09\\x91\\x9d\\x8e\\xf0\\x3a\\x16\\x08\\x08\\x20\\xea\\xf0\\x32\\xbb\\x5d\\xbc\\x0f\\x5b\\xa7\\x9d\\x31\\x80\\x34\\xdd\\xf3\\xaf\\x75\\x1f\\x82\\x8e\\x2e\\x59\\x68\\x77\\x10\\xec\\xee\\xe4\\x1d\\xd3\\xfe\\x8c\\xc1\\xe7\\x9c\\x8b\\x58\\x02\\xe1\\x73\\x26\\x7c\\x0a\\x1c\\x9e\\xf5\\x05\\x20\\x84\\x88\\x7d\\x83\\xbc\\x0c\\x02\\x95\\xb1\\x36\\x78\\xa5\\xb3\\x55\\x38\\x20\\xd6\\x9d\\xca\\x99\\x3f\\x6d\\x62\\x76\\x0f\\x7b\\xe6\\xe5\\x47\\x99\\xb3\\xe0\\x44\\x4b\\xad\\xcd\\x78\\xb7\\xa4\\xb9\\xbc\\x7b\\x2b\\xa5\\x76\\x1e\\x7e\\x8d\\x4e\\x04\\x0e\\x74\\xb0\\x64\\x29\\x95\\x6e\\xd9\\x34\\x36\\xed\\x25\\x3c\\xfa\\x84\\xdd\\x5e\\x8f\\x63\\xd1\\x9c\\xda\\xd1\\x78\\xd0\\x47\\x18\\x26\\x23\\xf0\\x0a\\xf9\\x32\\x42\\xa0\\xae\\x14\\xd6\\xd7\\x2d\\xe8\\xab\\x01\\x0c\\x4a\\x05\\xd1\\x58\\xb8\\x25\\x3c\\x67\\x44\\x93\\x6b\\x17\\x1d\\x0e\\x54\\x52\\xab\\xf5\\x46\\xb3\\x1c\\x76\\xc6\\x58\\xe3\\x3d\\x2f\\x87\\x45\\xdb\\xf6\\x38\\x37\\x30\\x31\\x9f\\xf9\\xc5\\xf0\\x33\\x20\\x3a\\xf3\\xfe\\x1c\\x6b\\x43\\x20\\x34\\x50\\x06\\x1b\\xf6\\x0c\\x47\\x96\\xdc\\x47\\xd8\\x46\\x58\\x0b\\xc8\\xc2\\x8a\\xed\\xab\\xe3\\xb6\\xd5\\x88\\x13\\x3e\\x8e\\x7a\\x51\\x97\\xa7\\x51\\x54\\xbb\\x4d\\x58\\x2f\\xb6\\xc7\\xe0\\xc5\\xb6\\xf5\\xbe\\x46\\x6b\\xd0\\xee\\x8a\\x89\\x9a\\x92\\xd0\\x16\\x34\\x61\\x5d\\xf3\\xbd\\xea\\xf2\\x29\\xda\\xed\\xfa\\x5e\\x0d\\x28\\xac\\x0e\\x08\\x9c\\x98\\xe6\\xba\\x2b\\xac\\x18\\x82\\x85\\x53\\x09\\x11\\x61\\xb6\\x88\\xae\\x70\\x9b\\x53\\xa8\\xf5\\xbd\\x6f\\xed\\xd8\\x19\\xa8\\xac\\x52\\x8e\\x3f\\xa1\\x38\\x4c\\x45\\x45\\x18\\x96\\x64\\xce\\x62\\x8e\\xb0\\x22\\x91\\x95\\xd2\\x7a\\x33\\x79\\x0f\\x22\\x43\\x32\\x93\\xf7\\xef\\xf8\\x1f\\x86\\x31\\xa5\\x64\\x65\\x96\\x51\\xb4\\xa6\\xb9\\xe1\\x6a\\x22\\x84\\x4b\\x97\\x62\\xbf\\x89\\x70\\x04\\x7d\\x8e\\x10\\xde\\xde\\xa7\\x05\\x7e\\x48\\x33\\x3c\\x93\\xf7\\xe9\\xb2\\x22\\x6d\\xef\\xe2\\x66\\x79\\x0b\\xaa\\xf9\\x2d\\xdb\\xed\\x34\\x78\\x99\\x80\\x97\\x02\\x83\\xa5\\x6c\\x16\\xae\\x23\\xec\\x86\\xb5\\x4e\\x39\\xde\\xca\\xf9\\x5c\\x31\\xfd\\x6b\\xaa\\xb0\\x7d\\xfa\\x60\\xd8\\x0e\\xd9\\x44\\xbd\\x20\\xa7\\x03\\xb3\\xa4\\xe2\\x7a\\x53\\x8a\\xb5\\x59\\xe6\\xec\\xba\\x6f\\x90\\xed\\x94\\xef\\x76\\xa7\\x3c\\x51\\x35\\xde\\x23\\x14\\x2b\\x4c\\x31\\x4f\\x34\\x2d\\x17\\x4c\\x23\\x54\\x12\\x88\\x91\\x01\\x2a\\xe3\\xda\\x40\\x0c\\xa1\\xb8\\x3c\\x1f\\xf7\\x75\\xc1\\x99\\xd0\\xa0\\xe3\\x44\\xa3\\x92\\x48\\x23\\xfb\\x31\\xa1\\x7f\\xed\\x69\\x2b\\x1c\\x16\\x75\\xd2\\x87\\x9e\\x06\\xe9\\x31\\x23\\xa7\\x7e\\x46\\xb7\\xf7\\x69\\x89\\x1f\\xd2\\x02\\x40\\x92\\x55\\x95\\x0d\\x7a\\x93\\x83\\xeb\\xe3\\x5c\\x77\\xe3\\x65\\xa7\\x53\\xc2\\x23\\xc2\\x1b\\x02\\x0c\\x80\\x4b\\x33\\x72\\xa6\\x19\\xe5\\x16\\x80\\x9b\\xce\\xb1\\xc5\\x80\\x74\\x51\\x35\\xc1\\x45\\x54\\xa7\\x13\\xcf\\x7b\\x84\\x5a\\xa4\\xe9\\x96\\x4e\\x81\\xb8\\x30\\x49\\xb6\\x78\\xb7\\xac\\x95\\x89\\xdb\\xfb\\x34\\xd4\\x05\\x17\\xbd\\x1c\\x9d\\xcf\\xcf\\xb8\\x53\\x45\\x0a\\x84\\x1f\\x5a\\xf9\\x59\\x6f\\x83\\xce\\x17\\x67\\xdc\\xeb\\x27\\x05\\xf2\\x4c\\xc2\\x0c\\x96\\x66\\x50\\x76\\xd0\\x3f\\x03\\xff\\xd5\\x66\\xcd\\xdc\\x1c\\xb1\\xf6\\xc3\\x9a\\xc4\\xca\\xe1\\xce\\x8a\\x96\\x0b\\x2e\\x22\\x84\\x29\\xd9\\xb0\\x58\\xd6\\x8c\\x3d\\x44\\x5f\\x03\\x60\\xfe\\x62\\x91\\x6a\\xb7\\xbb\\x35\\xcc\\xb7\\x2f\\x64\\x99\\xd6\\xa6\\x94\\x7d\\x77\\xc5\\x0a\\xb2\\x1f\\x1d\\xc3\\x71\\x48\\x06\\x43\\x6a\\x97\\x5f\\xb6\\xdb\\xd5\\xcf\\xbc\\x59\\xa8\\x40\\x47\\x4d\\x41\\xd5\\x38\\x0a\\xa8\\x4f\\xe1\\x01\\xa6\\x66\\x3c\\xca\\xad\\x05\\x7a\\x64\\x2d\\x14\\x2e\\xa3\\x5e\\x36\\x23\\x43\\x9e\\x21\\xb7\\x57\\xb8\\x5f\\x3f\\x61\\x66\\x4d\\x58\\x30\\xf7\\x0a\\xff\\xe0\\x27\\x0e\\x0b\\x33\\x76\\xda\\x00\\x48\\xed\\x01\\x08\\xcb\\xba\\x80\\x03\\x8e\\xda\\x07\\x0e\\x28\\x04\\x60\\x7b\\x08\\xbe\\x84\\x56\\xc3\\x72\\x1e\\x63\\x2d\\xc2\\x31\\x8f\\x70\\x1c\\xfb\\xa6\\x53\\x01\\x50\\xae\\x1b\\x4a\\xa5\\x79\\x07\\x9c\\x06\\x7f\\xbb\\x06\\x5b\\x33\\xff\\xf1\\xb2\\x22\\x05\\xe8\\x34\\x32\\x29\\x34\\x13\\xfa\\x08\\x81\\x69\\xa0\\xfd\\x09\\xaa\\xc2\\xf6\\x09\\xd0\\x28\\xeb\\x11\\xe6\\x70\\xde\\x5b\\x1c\\x96\\x26\\xc9\\xe1\\xbc\\x07\\xa6\\x27\\xaa\\x59\\x78\\xf6\\x32\\xeb\\x29\\xfb\\x09\\xc2\\xcb\\x30\\x5d\\x8c\\x03\\xcf\\x84\\xec\\x5c\\xa0\\x74\\xd9\\x53\\xf5\\xe2\\xc9\\xc8\\x8c\\x35\\x91\\x86\\x32\\x4c\\x71\\x11\\x4a\\xaa\\xcb\\x56\\xf6\\x12\\x97\\x36\\xdb\\x82\\x09\\x21\\x9c\\x75\\x3a\\xa7\\xcb\\x4e\\x27\\x86\\x72\\xd9\\xf9\\x10\\x21\\x7c\\x08\\xa9\\x86\\x96\\x3f\\x1c\\x6c\\x39\\x9f\\xb4\\x00\\x19\\x6c\\x1e\\x60\\x4f\\xef\\x25\\xb6\\xb5\\x2a\\x5f\\x2b\\xad\\x88\\x1e\\x49\\xbf\\x7b\\xd0\\x33\\x81\\xa5\\xdb\\x61\\xd4\\x99\\xc0\\x3a\\xc9\\xf4\\x7d\\xd2\\xb2\\xe9\\x08\\x70\\x76\\x83\\xbf\\x08\\x4b\\x6b\\xf6\\xec\\x74\\x62\\x43\\x46\\xdd\\x9b\\xab\\xac\\xd3\\xa9\\x13\\x2c\\x38\\x21\\x0a\\x63\\x58\\x82\\xd0\\x6e\\xb4\\xbe\\x8f\\x70\\xab\\x18\\x51\\x90\\xe8\\x37\\xe2\\x5b\\x76\\x78\\x8e\\xe2\\x74\\x30\\xd2\\xe5\\x43\\xcd\\x66\\x6d\\x17\\x4c\\x9f\\xac\\xa9\\x52\\xfc\\x36\\x38\\x93\\xa4\\xc9\\x69\\x1f\\x9f\\x0e\\xaa\\x6a\\xe4\\x78\\x04\\x9a\\xe7\\xdf\\xdc\\x32\\xa1\\x7f\\x70\\xac\\x61\\x1c\\x69\\xf0\\xda\\xb2\\xb1\\x34\\x11\\xae\\x03\\xcd\\x1a\\x21\\xf9\\x73\\x25\\xab\\x8c\\x82\\x35\\x05\\x6d\\xc3\\x33\\xc5\\x0d\\x6d\\xbb\\xdb\\xe3\\x56\\x1d\\xeb\\x61\\xb6\\xb2\\x4e\\x87\\x27\\x2b\\xf8\\xfa\\xfc\\x7f\\xc5\\xff\\xca\\xbb\\x28\\xfe\\x57\\x62\\x7e\\xc6\\xeb\\xfb\\x2f\\xce\\x1b\\xf3\\xf7\\xb8\\x2b\\x26\\x83\\x69\\xea\\xc2\\x9c\\x36\\x31\\xa9\\x5a\\x3c\\x4c\\x64\\x37\\xc9\\x88\\x8b\\x13\\x3d\\xde\\xde\\xa7\\x3a\\xb9\\xc7\\x0f\\xa9\\x4e\\x1e\\xaa\\xd4\\x6d\\xf5\\x41\\x64\\xa9\\x7d\\x72\\x6b\\xfe\\xea\\x52\\x16\\x05\\x2b\\x53\\x89\\x73\\xaa\\x69\\xaa\\xf0\\x8d\\x92\\xa5\\x66\\x39\\xe0\\x04\\x36\\xfb\\xd8\\x4d\\x46\\xb3\\x25\\xcb\\x5f\\x31\\x4d\\x13\\xfe\\x2e\\xa3\\x05\\x33\\x4b\\xb5\\xec\\x74\\x0c\\x6b\\x5a\\x26\\xf4\\x9e\\xab\\x4e\\x87\\x76\\x3a\\x75\\x7c\\xc1\\x7a\\xa5\\x96\\xc9\\x4d\\xc9\\x6e\\x59\\xa9\\x2c\\x26\\xaa\\xb1\\x62\\xa9\\x84\\xaf\\x4f\\x1b\\x96\\x36\\x56\\x96\\x2c\\xf0\\x79\\x2c\\x93\\x1b\\xb5\\xa4\\x25\\xcb\\x5f\\xaf\\x4d\\x87\\x55\\x83\\xd8\\x6a\\xd2\\x9f\\x62\\x49\\x8e\\xc8\\x0e\\xc2\\xd0\\xde\\xb7\\x54\\x2c\\x98\\xe1\\x0a\\xfc\\xb3\\x61\\xf2\\x4d\\x85\\xc1\\xd2\\xb0\\xed\\xf4\\xa4\\x21\\xca\\xee\\xa5\\x2b\\x51\\x20\\xe3\\x8a\\xa4\\x90\\x46\\xcc\\xa5\\xc9\\x92\\x57\\x55\\x55\\x35\\x39\\x7d\\x93\\xdc\\x04\\x15\\x0d\\x96\\xe0\\x3b\\x16\\x2a\\x6d\\xfd\\x1e\\x01\\xd6\\xd1\\x77\\x00\\xc6\\x9f\\xb9\\xe2\\xb3\\x82\\xbd\\xb0\\x9e\\x9f\\x06\\x86\\x0a\\xb6\\x05\\xf0\\x8d\\xf5\\x1c\\xa1\\x26\\x7d\\xcc\\x6b\\x4b\\xf1\\x48\\x5f\\xf1\\x51\\xb7\\xeb\\x45\\x88\\x2d\\x30\\xc6\\x29\\xb7\\xf3\\x53\\x56\\x44\\x4d\\xf4\\x14\\x9b\\x6e\\x15\\xa6\\x5b\\x59\\x45\\x3e\\xb2\\x18\\xd2\\x18\\xa6\\x58\\xa2\\xa0\\xd6\\x62\\xa4\\xaf\\x48\\x16\\xd4\\x75\\xc2\\x48\\x39\\xd1\\xd3\\x11\\x4b\\xd4\\x47\\xbe\\xde\\xed\\x6c\\x9c\\x30\\x8d\\xaa\\x60\\x48\\x6f\\x8e\\x6c\\xca\\x93\\x29\\x4c\\xda\\xdf\\x75\\xcc\\xb0\\xf3\\x4f\\x7d\\x5e\\x32\\x8a\\x75\\x72\\xb3\\xe2\\xe2\\x8d\\xa5\\xb8\\xb5\\xb1\\x53\\x7a\\x14\\x7e\\x67\\x05\\x7f\\x16\\x84\\x84\\x36\\xef\\xca\\x08\\xcf\\x5c\\xb8\\x89\\xb2\\x4a\\x65\\x2c\\x50\\xa7\\xe3\\x64\\x97\\xad\\x73\\x6b\\x4d\\x35\\x0e\\x8f\\x52\\xa4\\x1c\\x5b\\x50\\x28\\x23\\x19\\x82\\x56\\x24\\x90\\x6f\\x5e\\x1c\\x9d\\x89\\x63\\xc7\\xbe\\xf7\\xe5\\x8d\\xfb\\x08\\x61\\x7e\\x90\\xfa\\x10\\xa1\\x83\\x83\\x5a\\xba\\x15\\x5e\\x78\\xdc\\xb8\\x5f\\x25\\xf7\\x3d\\x91\\xdc\\xa3\\xb4\\x8f\\x95\\xb7\\xb2\\xdb\\xf4\\x87\\x9e\\x48\\x1e\\xf6\\xcd\\xec\\x6d\\x77\\x1d\\xd9\\x72\\xd4\\x51\\xe0\\xa2\\x53\\xc5\\x76\\x9f\\x3c\\xa1\\x9f\\xf6\\xc1\\x2b\\xff\\x87\\xb3\\x52\\xfe\\xc9\\xac\\x58\\x95\\xae\\xe8\\x74\\x4e\\x0f\\x27\\x47\\xee\\x9d\\x1a\\xc8\\x2c\\x8a\\x7f\\x0d\\xd1\\x9f\\xdf\\x48\\x2e\\x74\\x2c\\xcd\\xf6\\xa6\\x62\\x86\\x33\\x34\\x5a\\x5e\\xd1\\x71\\x5c\\x92\\xc9\\x9f\\x4d\\x64\\x51\\x4d\\x31\\x25\\x4b\\x94\\x2e\\x09\\x21\\xd4\\xb0\\xb3\\x7f\\x69\\xfe\\x0b\\xd0\\x0c\\xe0\\x32\\x08\\xdc\\x76\\x04\\x67\\x5f\\x31\\x38\\x96\\x80\\x21\\x46\\x29\\x25\\x1c\\x08\\x15\\x2e\\x49\\x04\\x9c\\x05\\x1d\\x47\\x5c\\xfc\\x0a\\xa3\\x8c\\xd2\\x88\\x8b\\x0f\\xf6\\xd1\\xaa\\xf9\\x49\\xed\\x51\\x7f\\xf2\\x29\\xd9\\xe4\\xf3\\x0b\\x7c\\xd4\\xf6\\x9c\\xf3\\x6b\\x9c\\x36\\x5e\\x2c\\x1a\\x0e\\x7b\\x68\\xb4\\x8d\\xdd\\xfa\\x16\\x76\\x7d\\xcb\\x0a\\x4e\\x62\\xa0\\x3d\\xda\\x20\\xf7\\x69\\x83\\x22\\x12\\x0e\\xc5\\xb8\\x85\\xcc\\x62\\x85\\x05\\x2c\\xe4\\x58\\xe3\\x46\\xc8\\xd9\\xea\\x49\\x39\\x8d\\xe5\\x84\\x4e\\x61\\x7d\\xa9\\xcf\\xc3\\x97\\x39\\xf8\\xf2\\x0a\\xe1\\x06\\x07\\x64\\x72\\x8f\\xa5\\x5b\\xa0\\x31\\xc4\\x59\\x86\\x13\\xf1\\x49\\xed\\xe7\\xdc\\xe9\\x9c\\x16\\xe3\\xc9\\x34\\x55\\xe0\\x76\\xff\\x9a\\x59\\x8f\\x68\\x95\\xda\\x81\\x7d\\x6e\\x62\\xec\\x9c\\xec\\x76\\xd1\\x7d\\x04\\xb0\\xa9\\xab\\x1c\\x03\\x11\\x72\\x87\\x7b\\x5e\\xf8\\xe7\\xd3\\x01\\x06\\xdf\\xb1\\x46\\xf7\\xe1\\x2d\\x12\\xe3\\xf8\\xcf\\x66\\xa4\\xad\\x24\\xf1\\xa4\\x80\\x4e\\xfa\\xee\\x58\\x12\\xb0\\xb9\\x06\\x1a\\x86\\x2e\\xf3\\x4e\\xc7\\x48\\x83\\x1f\\xf9\\xfa\\x10\\x27\\x79\\x1b\\x66\\xda\\x7f\\x6e\\x21\\xe8\\x30\\x13\\xa5\\x93\\x69\\xe5\\x0b\\xfe\\x35\\x08\\x3c\\x44\\x6e\\xc1\\xff\\x35\\x30\\x98\\x95\\x4f\\x6b\\x7d\\x15\\x6a\\x8f\\x28\\xec\\x21\\x76\\xd8\\x1a\\x80\\x23\\x66\\xd6\\xc3\\x6b\\x04\\xf1\\xee\\x03\\x44\\x33\\xd8\\xd5\\xd8\\x78\\x34\\xa2\\xfb\\x63\\x37\\x28\\x77\\x14\\x65\\x74\\x15\\xb8\\x28\\x61\\x70\\xca\\x49\\xeb\\x71\\x93\\x6b\\x18\\x87\\x1f\\x75\\x38\\x66\\x33\\xa1\\xce\\x73\\x3e\\x2c\\xff\\xe2\\x93\\xe5\\x03\\xe8\\x98\\x6f\\xef\\xc3\\xaf\\x62\\x5b\\x12\\xdc\\xf4\\x03\\x8a\\x60\\x44\\xd6\\x63\\xa5\\x1e\\xda\\xa5\\xaa\\xca\\x11\\xb7\\xe7\\x56\\x67\\xf7\\x96\\x2d\\xbe\\xb9\\x5f\\x1b\\x16\\xcd\\x9e\\x5e\\xd8\\x19\\x56\\x2d\\x1e\\xa7\\x8e\\x57\\x43\\xf1\\xfa\\x7e\\xc7\\x56\\xbb\\x2f\\xd1\\x18\\x7d\\x71\\x8e\\xf0\\xfb\\x4f\\x7c\\xc5\\x35\\x2d\\x78\\xb6\\x73\\x31\\xb9\\x77\\x5c\\x2c\\x59\\xc9\\xf5\\x6e\\x23\\x14\\xd3\\xbb\\x58\\xce\\x0a\\xfe\\xfb\\x86\\xc5\\x27\\xbd\\xf1\\xa4\\xdf\\x7b\\x36\\xb5\\x7f\\x21\\x5c\\x2b\\x32\\xd5\\x06\\x01\\x79\\xf6\\xf8\\xc9\\x38\\x8a\\xba\\x1a\\x39\\x3e\\xf2\\xb9\\x65\\x77\\x4e\\xf9\\x6e\\xe7\\xcf\\x5a\\x18\\xa9\\x75\\x32\\x98\\x7a\\xea\\x3f\\x48\\x86\\x67\\x6c\\xe4\\x5d\\x80\\x48\\x17\\x62\\x3b\\xf2\\xc9\\xa3\\x29\\xda\\x82\\x1d\\x7f\\x7d\\x1f\\xa5\\x8d\\x92\\xd1\\xa4\\x7c\\x19\\xa5\\xfa\\x9c\\x0c\\xfa\\xb5\\xd2\\x89\\x9d\\x85\\x4e\\xc2\\x7b\\xdd\\xd9\\x56\\x58\\x90\\x9f\\x62\\x66\\xe4\\x4c\\x31\\x6e\\x1f\\x78\\x4b\\x19\\x56\\x04\\xdc\\xe6\\xc5\\x98\\x93\\xeb\\xef\\x41\\xc3\\x89\\xf5\\x84\\x4d\\xf8\\x74\\x8a\\x52\\x46\\xae\\xf5\\x84\\x4d\\xd3\\x18\\x91\\x6b\\x1d\\x1c\\x78\\xd2\\x27\\x72\\x7e\\x22\\x91\\x41\\x3a\\xd2\\x55\\x10\\x7c\\xa3\\x7f\\xc4\\x29\\xf7\\x9b\\xd6\\x81\\x76\\xd3\\xad\\xad\\x96\\xeb\\xd4\\x4c\\x2f\\x68\\xc5\\x52\\x83\\x0e\\x56\\x11\\x06\\x89\\x05\\x9b\\x43\\x5a\\x78\\x4c\\xee\\xbb\\x83\\x3a\\x40\\xef\\xf7\\x03\\x9b\\xdb\\xf3\\x31\\xd6\\x1c\\x53\\xab\\xff\\x5c\\x7a\\x60\\xfa\\x89\\xc2\\xa3\\xa7\\x7f\\xb4\\xf4\\xbf\\xd0\\xbf\\x46\\x59\\x6b\\xc5\\x1b\\xeb\\x30\\xd0\\x75\\xfe\\x03\\xb8\\x96\\x85\\xc0\\x71\\xa0\\xeb\\xfd\\x08\\x42\\x05\\xeb\\x4b\\x6f\\x76\\x20\\x1a\\x5c\\x32\\xc1\\x0d\\xef\\xde\\x9a\\x87\\xdd\\x31\\xb8\\xef\\x9d\\x8f\\x2a\\x76\\x87\\xc8\\x46\\x07\\xea\\x57\\x6e\\x64\\xb4\\x46\\xff\\xca\\xf1\\xa0\\xef\\xee\\xbf\\x10\\xf6\\x6b\\x30\\x28\\x32\\xfb\\x8b\\x46\\x86\\x19\\x30\\x78\\x26\\x3c\\x9e\\xbd\\x67\\x66\\x13\\x30\\x23\\x93\\x46\\x52\\xa3\\xa5\\x88\\xff\\xf6\\x9d\\x80\\x10\\x1d\\x27\\xa6\\x23\\x27\\xf0\\xe1\\x89\\x5a\\xb3\\x8c\\xcf\\x39\\xcb\\xd3\\x93\\xe8\\x6f\\x5d\\xd1\\xfd\\x5b\\xf4\\x37\\x23\\xf8\\x44\\x51\\x13\\x0d\\xd5\\x9f\\x2e\\xfa\\xbe\\x76\\xa6\\xc5\\xcc\\x7b\\xd5\\x86\\xc7\\x84\\xde\\xb2\\xf8\\x7b\\x67\\x1c\\x76\\x6a\\x0b\\x16\\xbc\\x20\\xcc\\x91\\x3d\\x6b\\xc4\\xdd\\x51\\x23\\xe1\\x0f\\x15\\x7d\\x5f\\x3b\\xdf\\x62\\xe6\\x1e\\x10\\xb6\\xf0\\x48\\xa3\\xa8\\x0e\\x5e\\xe4\\x0d\\xeb\\xe4\\x0b\\x60\\x61\\x02\\x86\\xf2\\x67\\x76\\xd4\\xfb\\x90\\x9c\\x5a\\xcb\\x99\\x24\\x86\\xd9\\xab\\x55\\xf8\\xf2\\x4a\\xc1\\x59\\x5a\\x43\\x96\\x09\\x1c\\x6e\\xae\\x8f\\x01\\xd2\\x4e\\x27\\xae\\x5f\\xd8\\xd1\\x03\\xda\\xa6\\x08\\x25\\x86\\x30\\x9b\\x06\\x06\\xa8\\xf9\\x98\\x77\\x3a\\x1f\\x62\\x8a\\x6c\\xfe\\x84\\x7f\\xe9\\x69\\xfe\\x74\\xbf\\x20\\xad\\x19\\x3d\\x33\\x6b\\x25\\x5c\\x99\\x00\\x82\\x1b\\x9d\\x15\\x0c\\x8a\\x06\\xbe\\xa3\\x5f\\xb5\\xb4\\xc0\\x2b\\x2e\\xac\\xfa\\x26\\x15\\x15\\xd1\\x5e\\x22\\x82\\xd4\\x5e\\xcd\\xcb\\xfe\\x06\\x87\\x25\\x91\\x2d\\xd6\\x35\\x6f\\x8d\\xaa\\xef\\x17\\x46\\x26\\x56\\x21\\x8e\\x8f\\xab\\xcb\\x03\\x3d\\xf9\\xb7\\x6d\\x15\\x3c\\x18\\xb2\\x35\\x2b\\x61\\x5f\\xd6\\xc9\\x5a\\x2a\\x38\\xe0\\x19\\x46\\x53\\xf8\\xcc\\x07\\x70\\x68\\xf4\\x17\\xd6\\x9c\\x2c\\x36\\x15\\xa0\\x4e\\x47\\x27\\x33\\x79\\x6f\\xc9\\xfc\\x5e\\x6d\\xff\\xd9\\xaf\\xad\\x3e\\xb0\\x01\\xfc\\x52\\x7d\\x28\\x76\\xcc\\x53\\x8d\\x0d\\x93\\xaf\\xd3\\xfa\\xae\\x16\\xe1\\xf0\\x08\\x14\\x53\\xce\\xb1\\xdb\\x99\\x95\\x7a\\xee\\x94\\x77\\xea\\xcb\\xf4\\x7c\\x89\\x2a\\x6c\\xfd\\x0b\\xb6\\x1f\\xf8\\xb8\\x71\\x5a\\x07\\xa2\\x08\\x26\\x8e\\x6e\\x90\\x26\\x4c\\x9a\\x08\\xa9\\xcb\\x87\\xda\\xfe\\xa8\\xe5\\xba\\x51\\x4d\\x69\\xe7\\x90\\xe4\\x1c\\x8f\\xcc\\x6c\\x84\\x99\\xce\\x3f\\xa9\\x70\\xc6\\x73\\x3b\\x2f\\x61\\x01\\x4f\\x71\\xdc\\x03\\xf8\\x3b\\xc1\\x60\\x83\\x32\\x9e\\x58\\xc1\\x6f\\x18\\xec\\xe1\\x40\\x11\\xc5\\xcd\\x04\\x80\\x15\\x77\\x45\\xef\\x9d\\x24\\x32\\xfa\\x29\\xe6\\x30\\x3f\\xbb\\x5d\\xcc\\x81\\x42\\x75\\x3a\\x66\\xd4\\x26\\x6d\\xda\\x23\\x36\\xc9\\x6c\\xf7\\x60\\xf5\\xe2\\xc9\\x52\\x96\\xfc\\x0f\\x29\\x34\\x2d\\xc6\\xde\\xb0\\x91\\x0a\\xef\\x39\\xec\\x3e\\xeb\\xd6\\x9f\\x81\\xec\\xef\\x5a\\xea\\x74\\x3e\\xb0\\x58\\xb6\\x92\\xe2\\x3a\\x12\\xb3\\x0a\\xd5\\x79\\x2c\\x91\\x1b\\xed\\xdc\\xce\\x7a\\x5f\\x98\\x8f\\x34\\xf6\\x98\\x6c\\x71\\x18\\x21\\xef\\x22\\xd7\\xfa\\xc2\\xd2\\x9f\\xfa\\x13\\x8b\\xf5\\x0e\\xdb\\x0d\\x07\\x48\\x14\\x88\\x93\\x77\\xb8\\x20\\x14\\x9e\\x9a\\xf0\\xf9\\xc9\\x1d\\x51\\x58\\x27\\x4b\\x42\\x71\\x6b\\x90\\x5b\\x45\\x57\\x2c\\x2d\\xb1\\xd4\\x4b\\x56\\xa6\\x45\\x95\\xda\\x84\\xc2\\x25\\x94\\x81\\x8c\\xfe\\x2b\\xdb\\x3f\\x88\\x12\\x80\\xb9\\x71\\x09\\x08\\xe3\\x0e\\x6d\\x61\\xdf\\xeb\\x63\\xb3\\x37\\xf6\\xdd\\xce\\xd8\\xf7\\xfb\\x62\\xbf\\x6a\\x7a\\xd7\\x62\\x94\\x85\\xd9\\x7c\\x9b\\x73\\x15\\x86\\xff\\x03\\xf1\\xc4\\x70\\xb9\\x75\\x24\\x20\\x11\\xeb\\xf1\\xa4\\x0d\\xb5\\x69\\x3a\\x69\\xc3\\x24\\xc4\\xe0\\xdf\\x0f\\xd0\\x65\\x32\\x1d\\xb5\\x1c\\xbc\\x9d\\x9f\\x55\\x9b\\xc6\\x82\\x17\\x92\\xa7\\xb3\\x5b\\x47\\x65\\x4b\\x42\\x01\\xd5\\xca\\xc4\\x5d\\x75\\xe3\\xac\\x1c\\xbb\\x1d\\x4b\\xee\\xb0\\xb7\\x6f\\x98\\xb7\\x25\\xfe\\xd5\\xe4\\x36\\x00\\xc7\\xcc\\xe3\\x84\\x05\\xb4\\x72\\x80\\x5e\\x56\\xe4\\x27\\x7b\\x93\\x14\\x45\\xa3\\x62\\x47\\x54\\x63\\x6e\\xc2\\x19\\xc9\\x76\\xbb\\x25\\x2e\\x93\\xf9\\xa6\\x28\\xde\\xf1\\x3f\\xd8\\x6e\\x27\\x2c\\x93\\x4c\\x6b\\x06\\xb8\\xe8\\x74\\x7e\\x67\\xb1\\x80\\x11\\xee\\x76\\xc1\\x81\\x95\\xef\\x8f\\x2c\\x13\\xa7\\xad\\x6e\\x0f\\x9f\\x18\\xb9\\x3b\\x23\\x2c\\x79\\xf8\\xdc\\x56\\xb3\\x07\\x81\\x70\\x68\\xe3\\xd8\\x5a\\x8b\\x48\\xd3\\xd1\\xb1\\xb5\\x15\\xa6\\xce\\x55\\xb1\\x74\\xab\\x3b\\x28\\xc0\\xc3\\xb5\\xe0\\x4c\\x8a\\x69\\xcd\\xa8\\xdc\\x61\\x30\\x36\\x91\\x0c\\x97\\x9e\\x7a\\x64\\xb5\\xd9\\x08\\x3b\\x13\\x05\\x71\\xd5\\xf6\\x6c\\xf3\\x38\\x23\\xbe\\x30\\x4a\\x7d\\x97\\x8a\\xba\\xed\\xa2\\x36\\x45\\xd9\\xaa\\x5b\\x9d\\x35\\x78\\x6a\\x9d\\x2c\\xeb\\xf6\\x0e\\xfb\\xea\\x56\\x61\\xd3\\x59\\xcb\\x3d\\x99\\x0a\\x1d\\x43\\xe5\\x3f\\xee\\x41\\x13\\xb8\\xf0\\x3d\\x44\\x23\\x96\\xdc\\x93\\x02\\xb3\\xe4\\x81\\x64\\xd5\\xbd\\x86\\x9b\\x6f\\xa2\\x82\\x3e\\xc0\\x39\\xe9\\xad\\x9b\\x96\\x74\\x7b\\x7c\\xb9\\x58\\x26\\xb2\\x5f\\x55\\x08\\x82\\x9e\\xfd\\x9d\\x91\\x2d\\xcd\\xf3\\xaf\\xe4\\xbd\\x27\\xcd\\x33\\x79\\xcf\\x14\\xb8\\xb5\\xc1\\x13\\x99\\x4c\\x91\\xe1\\x6f\\x5c\\xf7\\x09\\x0b\\xf0\\x07\\x2e\\x16\\x5a\\x4b\\xc5\\xb5\\xbd\\x83\\xc6\\x3f\\xee\\x76\\x76\\x05\\x79\\xee\\x85\\xf8\\x87\\xdd\\xae\\x6f\\x6f\\x14\\x7a\\x60\\xa5\\x22\\xf5\\xd3\\x6e\\x77\\x10\\x50\\x68\\xb2\\xfd\\x23\\xed\\x63\\xb8\\xf2\\x48\\xa3\\x2d\\x4b\\xdc\\x53\\x55\\x4d\\x2b\\xec\\x7a\\xe6\\xdd\\x54\\x2a\\x6c\\x55\\xde\\xf5\\x18\\x1a\\x55\\x07\\x94\\x1b\\xfb\\xf2\\x8d\\x17\\x45\\xda\\x1b\\x58\\x47\\x0a\\xee\\x36\\x5c\\x56\\x1f\\x59\\xe1\\x78\\x80\\x2a\\xec\\x9d\\x4a\\x6a\\xb4\\x0f\\x20\\xc0\\xeb\\xc7\\x70\\xf4\\xbc\\x7e\\x6c\\x86\\xcd\\xfd\\x46\\x8a\\xfd\\x65\\x56\\xa1\\x7f\\xa9\\xde\\x8f\\x15\\x62\\x98\\xef\\x44\\x5a\\xfd\\x71\\x62\\xe7\\xd3\\x2f\\x32\\x23\\x70\\xb3\\x9e\\xb3\\x6c\\x60\\x4a\\x78\\x4f\\xd6\\xf8\\x7b\\x54\\x53\\x78\\x2c\\xcd\\x91\\x2a\\xd0\\x33\\x06\\xbe\\x1c\\x31\\x1c\\x80\\x42\\xfb\\x1e\\x1d\\x2e\\x56\\x8c\\x3b\\x21\\x5a\\xab\\x72\\x67\\xf2\\x3e\\x95\\x78\\x2d\\x55\\x2a\\x9b\\x11\\x37\\xcb\\x37\\x95\\x09\\x57\\xdf\\xd6\\xaf\\x31\\xf2\\x4c\\x6d\\xc3\\x54\\x34\\x01\\x5a\\x6c\\xe0\\xbb\\xff\\xb0\\x98\\xb5\\x59\\x29\\xc3\\x01\\x79\\x18\\x23\\xab\\x2e\\x15\\xa6\\xd8\\xb7\\x86\\xb6\\x59\\x6a\\xed\\x94\\xa8\\x4d\\x6a\\xbd\\xe5\\xa9\\x26\\xcd\\x20\\xa1\\x2d\\x48\\x9b\\xc4\\x70\\xa7\\xfb\\x11\\x52\\xee\\xc1\\x98\\x69\\x9f\\x1b\\xdd\\xe9\\xd6\\xf7\\x20\\xe5\\xb0\\x66\\x9e\\x8b\\xfc\\xbd\\x5c\\xa7\\x22\\xc9\\xa4\\xc8\\xa8\\x06\\xd3\\xa8\\x69\\xf3\\xb9\\xc8\\xbf\\xb2\\x6b\\x4b\\xfa\\xac\\x02\\xf9\\x27\\x5a\\x3f\\x95\\x08\\xd7\\x6a\\xce\\xd4\\xf6\\xa4\\x7e\\x8f\\x10\\xbe\\x65\\xa5\\xe6\\x19\\x2d\\x9a\\xfa\\x25\\x6a\\xaa\\x0b\\x01\\xac\\x8e\\xd5\\x5d\\x55\\x7e\\xbd\\x22\\x20\\x14\\xbe\\x3a\\x20\\x63\\xcd\\xc7\\xa3\\x7f\\xf8\\x62\\xf8\\x93\\x0e\\x4d\\xc9\\x8c\\xcd\\x65\\xc9\\x7e\\x00\\xfc\\x83\\xe5\\x11\\xbc\\xc3\\xe5\\x6c\\x0e\\x61\\x97\\xa4\\xd8\\xbf\\x6f\\x8a\\xc1\\xd4\\x39\\x14\\xee\\x74\\x4e\\x07\\xe0\\x82\\x13\\xa4\\x25\\x39\\x57\\xeb\\x82\\x3e\\x8c\\x75\\xaa\\xbb\\x70\\x91\\xc9\\x6e\\x37\\xc0\\xb9\\x0f\\xae\\x31\\x2f\\x19\\xfb\\x83\\xc5\\xdb\\x86\\x9a\\xa7\\x0c\\x07\\xe4\\x32\\xe5\\xd8\\x93\\x37\\x89\\xe9\\x2d\\xe5\\x85\\x11\\x11\\x7e\\x71\\x16\\xc1\\x3a\\xc1\\x15\\xa6\\xf8\\xf6\\x2b\\x79\\xff\\xca\\xdb\\x76\\xd5\\xf9\\xf0\\x7c\\x89\\x97\\x36\\xc9\\x17\\x39\\x1f\\x56\\x08\\x6f\\xc8\\xc1\\xa1\\x78\\x89\\x46\\x1f\\x58\\xbc\\xc1\\x7f\\xb0\\x58\\xa0\\xe6\\x48\\xdc\\x5e\\xb9\\x86\\x75\\x49\\x37\\xf8\\x2e\\x55\\x78\\x99\\x52\\x7c\\x9f\\x4a\\xbb\\x85\\x3c\\xa4\\xd2\\x50\\x6e\\xa8\\x6c\\xef\\x9a\\xcc\\x63\\xeb\\xf0\\xc0\\xa7\\xca\\xad\\x40\\xd9\\xda\\x1d\\xbd\\x75\\x53\\xb6\\x56\\x49\\xa7\\xc3\\x92\\x36\\x3c\\xb0\\x6c\\x04\\xf3\\xd6\\x98\\x51\\x5a\\xd7\\xc1\\x92\\x10\\x40\\xcd\\x17\\x9f\\xa9\\xdb\\xd5\\x51\\xc5\\x85\\x47\\xbe\\x0c\\xe1\\x1c\\xe1\\xdf\\x59\\xdc\\xec\\x71\\x78\\xee\\x92\\x8a\\xfa\\x29\\x83\\x27\\x60\\x2f\\x5c\\xe2\\x31\\x0a\\xa5\\x8f\\x32\\x83\\x3c\\x0e\\xf8\\x8e\\x80\\xa3\\xe3\\xd3\\x1e\\x00\\xa8\\xdf\\xb8\\xf0\\x4d\\xf8\\xb4\\x4b\\x04\\x16\\x95\\x4e\\x1e\\xba\\x84\\xc7\\x8e\\x04\\xe8\\xe4\\x1e\\xde\\x1c\\xe9\\xe0\\xb1\\x27\\x17\\xe6\\xd1\\x13\\x84\\x2a\\x9e\\x23\\xfc\\x3d\\x73\\x9b\\xbd\\x5d\\xee\\xae\\xab\\xe6\\xf3\\x79\\x72\\x87\\xe7\\xa6\\xd6\\x79\\xb2\\xb4\\xc5\\xda\\xcb\\xdf\\x16\\x0d\\x8c\\x19\\x8e\\x6f\\x9d\\x5b\\x64\\x30\\xbb\\xf1\\xdc\\x32\\x05\\x80\\x79\\x36\\xb9\\x6b\\x6a\\x75\\x5b\\x33\\xe4\\x76\\x4d\\xed\\x4e\\x62\\x30\\x8f\\xce\\x37\\x26\\xb9\\xab\\xf0\\x3f\\xe2\\x32\\xb0\\x94\\xb4\\xbc\\x26\\x61\\x8d\\x8d\\xda\\xc8\\xc9\\xc3\\xbe\\x18\\xd9\\xc4\\xed\\x41\\x76\\x1c\\x4b\\xb3\\x90\\xab\\x6a\\x64\\xc3\\xef\\xfe\\xc6\\xb6\\x34\\xfb\\x7d\\xc3\\x4b\\xe6\\x0f\\x46\\x02\\x96\\x56\\xa5\\xbd\\x69\\xac\\x4e\\xac\\x8f\\x15\\x0f\\xaa\\x03\\x6b\\xb4\\xdb\\x28\\xab\\x63\\xf6\\x67\\x9f\\x77\\x34\\x1e\\x8c\\x17\\x27\\x07\\x26\\xfb\\x15\\xbd\\xe7\\xab\\xcd\\xca\\x60\\xd1\\x81\\xbc\\xc9\\x5a\\xc2\\xcc\\x6e\\xa7\\xbd\\x9b\\x03\\xb8\\x0d\\x7b\\x9f\\x08\\xbc\\xef\\xde\\xf1\\x29\\x17\\x08\\x76\\x2e\\x50\\xca\\x51\\x55\\x71\\xf5\\x5c\\x6b\\x30\\x14\\x07\\x23\\xec\\x57\\x2e\\x34\\xf1\\x3f\\xd9\\x09\\xbb\\xd7\\x4c\\xe4\\x47\\xc1\\xd4\\x88\\xe3\\x86\\x54\\x36\\x27\\x4b\\xdb\\x6f\\xf6\\x9c\\xe9\\x6e\\x07\\xe1\\x62\\x9c\\xe6\\xe1\\x1f\\x8c\\x6c\\x9b\\x58\\x36\\xa9\\x0d\\x75\\x93\\xcb\\x3b\\x11\\xe1\\x3a\\xaa\\x4d\\x1a\\x06\\xc3\\xb1\\x5e\\x64\\x22\\x77\\x89\\x9b\\x75\\x64\\xb5\\xd5\\xac\\x04\\x5b\\x96\\x4b\\x76\\x97\\xa4\\xba\\x9c\\x1c\\xa2\\xd5\\x07\\x55\\xbb\\xf4\\x83\\xca\\x5d\\xfa\\x66\\x7d\\x58\\x7b\\xc1\\x68\\x5d\\x18\\x58\\x4c\\x97\\x2e\\x37\\x3a\\x48\\xad\\xb0\\xe6\\x44\\x93\\x6b\\x7b\\xd2\\x98\\xe8\\xdd\\x0e\\x02\\x5e\\xd5\\xe1\\x9a\\x39\\x39\\x3d\\xbd\\x65\\x9d\\xce\\xd6\\x39\\x3a\\xa4\\xa7\\xfd\\x2a\\x58\\xe2\\xbc\\xbe\\xac\\x31\\xb1\\x9e\\x1e\\x47\\xfd\\x18\\x0c\\x3e\\xb0\\xf0\\x6a\\x24\\xc1\\x8f\\xf8\\x91\\xc0\\xf7\\xd6\\xd9\\x2e\\x37\\xe4\\x7b\\xb7\\x13\\xd8\\xdd\\xcd\\xba\\xb1\\x87\\x53\\x5e\\xcf\\x14\\x2b\\x6f\\x1d\\xbf\\x51\\x53\\x9f\\x9c\\xc5\\x12\\x8d\\xf6\\xc4\\xc8\\x20\\xe2\\xd9\\x48\\x5c\\xe9\\x84\\xe6\\x39\\xcb\\x7f\\x94\\x39\\x53\\xad\\x58\\xf0\\x8d\\xfd\\xbc\\x29\\x30\\x11\\xd3\\x91\\xb2\\xde\\xba\\xe6\\x87\\xed\\x76\\x3c\\xd6\\xde\\x2d\\xaf\\x32\\xeb\\xaf\\x89\\xc9\\xa1\\x12\\x69\\xfb\\x14\\xe7\\x32\\xdb\\xac\\x98\\xd0\\x78\\x9b\\x2d\\x79\\x91\\x9b\\xb1\\xa7\\xa7\\x7d\\xac\\x36\\x33\\x5d\\x32\\x00\\x1b\\xc2\\x2a\\x88\\x15\\xf7\\x57\\x20\\x00\\x1a\\x76\\x79\\x70\\xdd\\xe9\\x27\\x21\\xf2\\x09\\x18\\x30\\xd2\\x1f\\xb1\\x2b\\xed\\xa6\\xa6\\x0d\\x05\\x66\\x4f\\xb0\\xb7\\x33\\x27\\x6c\\x0a\\x3e\\xc0\\x5b\\xee\\x4f\\x51\\x7e\\x72\\xd8\\xb2\\x3d\\x5e\\x18\\xa4\\xeb\\x28\\xf7\\xf7\\xea\\x5a\\x33\\x13\\x84\\xc1\\xa8\\x43\\xb4\\xf1\\x20\\xea\\x8d\\xf3\\x80\\xd9\\x0f\\x4d\\x35\\xd2\\xa7\\x84\\x50\\xde\\xe9\\xc4\\x94\\x13\\x8d\\x15\\x0f\\xee\\x89\\x75\\xc6\\x46\\xfe\\x29\\xef\\x23\\x1b\\xfc\\x93\\xc5\\x7b\\x0e\\xdd\\x05\\x07\\xc3\\x73\\x60\\x18\\xab\\xa1\\xae\\xcc\\x7c\\x5b\\x54\\x32\\x50\\x57\\x6d\\xa8\\x53\\xd2\\x70\\x4b\\x35\\xf9\\x56\\xa1\\xd7\\xda\\x48\\xb8\\xd0\\x60\\x57\\xad\\xe4\\x4e\\x47\\x98\\x4e\\x38\\x2f\\x1f\\xc3\\xbc\\x5a\\x9b\\x8d\\xe2\\x7f\\xb0\\xe3\\xe8\\x0c\\x81\\xeb\\xcd\\xde\\xe0\\x3c\\xd3\\xde\\x9a\\xcd\\xc1\\x0a\\x10\\x62\\x2f\\xd5\\x52\\xca\\x91\\xbb\\xde\\xd5\\xfc\\x88\\xdd\\x8e\\xc2\\x91\\xc8\\x60\\xb2\\xca\\x7a\\xb2\\x54\\xb8\\x7d\\x9b\\x9d\\x42\\x59\\x5d\\xd6\\x6e\\xf7\\x49\\x5f\\xa5\\x12\\x7a\\x1a\\xe1\\x12\\xd4\\xde\\x89\\x0f\\xd3\\x54\\xc5\\x1a\\xd3\\x96\\x41\\x3c\\xab\\x11\\x1a\\xbc\\x8d\\x72\\xae\\x32\\x29\\x84\\xf5\\x49\\xf4\\xb5\\xd8\\x28\\xee\\x21\\x07\\xa1\\x78\\x73\\x0d\\x27\\xde\\xef\\xcd\\x51\\x97\\xa8\\xa0\\x43\\x55\\x2b\\x56\\xcd\\xf2\\x73\\x73\\xcb\\xac\\x4b\\xbd\\x8f\\x0b\\x9b\\x64\\xfa\\xde\\xcc\\xcc\\x71\\x5b\\xfb\\x3f\\xd8\\x44\\x27\\x86\\xaf\\x9e\\x9a\\xed\\xc9\\x3c\\xe0\\xed\\x7d\\x2a\\x0c\\x63\\x58\\x11\\xe7\\xe3\\xe4\\xa5\\x0d\\x93\\x9b\\x72\\x2b\\x23\\xa4\\x0c\\x5b\\xdf\\xa8\\x54\\xe3\\xfb\\xb4\\xd6\\x93\\x8b\\xb1\\x80\\x80\\x63\\xf8\\xa1\\x49\\x93\\x63\\x69\\x83\\x90\\x55\\x60\\x71\\x34\\x18\\xa2\\xf1\\x01\\x1a\\xf8\\xdb\\x02\\x8d\\xc4\\xea\\xdc\\x8d\\xeb\\xa7\\x0f\\xd3\\x60\\x8a\\xf7\\xbd\\x4b\\xf5\\xe1\\x4c\\x7a\\x1a\\x1c\\x4b\\xf0\\x87\\x31\\xcb\\x14\\xf6\\xc9\\x9c\\x7f\\x6e\\x9f\\x6c\\xc9\\xe5\\x7f\\xbe\\x55\\xd6\\xc6\\x32\\x83\\x02\\x16\\xf8\\xf6\\xa2\\xee\\x4f\\x39\\x35\\x58\\xf3\\x8f\\xb0\\x06\\xe3\\xe7\\xda\\xde\\x62\\xcf\\xe2\\x68\\xe9\\x1c\\x44\\x41\\xa1\\xdb\\xce\\x72\\xde\\x97\\x10\\xe4\\x3c\\xf9\\xc2\\x9d\\x85\\x20\\x5b\\x7f\\x05\\xf1\\xd6\\xeb\\x6d\\x1d\\x0f\\x26\\x9d\\x99\\x66\\xeb\\x44\\x98\\x94\\x7b\\x61\\xa6\\xf6\\x23\\xf5\\x1c\\x88\\xfd\\xc0\\x39\\x1e\\x57\\x55\\x85\\xeb\\xa2\\xa4\\x7e\\xda\\xed\\xa2\\x59\\x21\\xb3\\x8f\\x11\\xe6\\x8d\\xa7\\x28\\x09\\x9e\\x4d\\x81\\xc6\\x65\\x1d\\x6b\\x1e\\xcb\\x20\\x7a\\x2a\\xf8\\xe8\\xd5\\x43\\x08\\x6d\\x34\\xb1\\xf6\\xdc\\x3d\\xaa\\xcc\\xd0\\xb8\\x11\\x60\\x7c\\xfc\\x49\\xdd\\xf2\\x5f\\x44\\x7e\\xe5\\x7b\\xbf\\xdd\\xf3\\x98\\xed\\x76\\x43\\x14\\xba\\x8a\\xfb\\xa6\\x3c\\x20\\xf7\\xdb\\xf2\\x42\\x86\\xf5\\xdf\\xb0\\x21\\x0d\\x01\\x21\\x0f\\x79\\xc7\\x86\\xcb\\xb7\\x33\\x6a\\x6f\\x24\\xac\\x41\\xbf\\x7f\\xc7\\xb0\\x21\\x5d\\x3e\\xcf\\x5f\\x51\\x3d\\x9a\\xf8\\x8e\\xf8\\xc1\\x4f\\x8f\\xb9\\x47\\x08\\x1b\\x13\\xf4\\x8b\\x58\\xa0\\x31\\x73\\xcb\\xbf\\x99\\x79\\x8d\\x52\\xb8\\x2e\\x3a\\x48\\x71\\x84\\xae\\x51\\x6e\\x02\\x98\\x76\\xbb\\x6d\\xad\\x5d\\x0e\\xed\\xc2\\x62\\xcf\\x27\\xc3\\x59\\x1d\\x27\\x7a\\x4a\\xc4\\x44\\x4f\\xed\\xbd\\xd9\\x5e\\xc4\\xb2\\x14\\xd7\\x1d\\xba\\x69\\x46\\x84\\x4f\\xfb\\x9f\\xe4\\xa1\\x5d\\x64\\xbc\\xa3\\x7c\\x74\\xd3\\x49\\x9d\\x7c\\xb1\\x2e\\xe5\\x3d\\x77\\xda\\x3a\\xff\\x42\\xb6\\x95\\xc1\\xf6\\x2d\\x05\\x9e\\x36\\x15\\x1c\\xe7\\x0c\\x9e\\x24\\xc7\\x96\\xe6\\xa5\\x05\\xaf\\x26\\x86\\x26\\x2d\\xb9\\xbd\\xb8\\x45\\xc6\\x75\\xc4\\xd6\\xe3\\x6d\\x06\\x0b\\xed\\xd3\\x6d\\xba\\xa8\\x99\\xa1\\x8b\\xe4\\x28\\xf6\\xdd\\xc8\\xea\\x6e\\x64\\x75\\x37\\x32\\xd7\\x0d\\xce\\x11\\x74\\x40\\x20\\x6c\\x6a\\xf0\\xb7\\xe3\\x7f\\x56\\x58\\xf8\\xc4\\x56\\xff\\x67\\x22\\x44\\xe0\\xb6\\xbf\\xc7\\xf6\\x07\\x4c\\x60\\x73\\x93\\xb5\\xbd\\x83\\x3a\\x67\\x31\\x33\\xc2\\xd2\\x2d\\x2d\\x4f\\x36\\x7c\\x5f\\x57\\x51\\x07\\x10\\xb6\\xb4\\xf9\\x2b\\xaa\\xd8\\x1b\\x17\\xff\\x32\\xfd\\x8d\\x99\\x77\\x9e\\xd5\\x09\\xff\\x64\\xf8\\x85\\x5c\\xd5\\xaf\\x39\\xaf\\xe3\\xd9\\xcd\\x81\\x7b\\xee\\x5b\\xd6\\x79\\x60\\x7e\\xf0\\x82\\x37\\x07\\x11\\x7b\\xb5\\x9b\\xdd\\x10\\x0f\\xfa\\x67\\xb1\\xee\\x91\\x01\\x42\\x67\\x75\\x50\\x02\\x88\\xa3\\x76\\x76\\xa3\\xcf\\x39\\xc2\\x6b\\xbe\\x77\\x27\\xb1\\xfd\\xac\\x07\\xa7\\x18\\x8e\\x7e\\xd2\\x1d\\xe0\\x15\\x27\\xdb\\x82\\x0b\\x46\\xcb\\x54\\x93\\x6b\\x8d\\xcd\\xda\\xfd\\x4e\\xfc\\x73\\x43\\x73\\x78\\x3f\\xb3\\x29\\xaf\\x37\\xda\\x27\\xf5\\xb4\\xe9\\xc5\\x10\\xb9\\x92\\x41\\x4e\\xac\\xcf\\x49\\x72\\x81\\xae\\x06\\xe3\\xe4\\xe2\\x4c\\x9f\\xe9\\xb4\\x97\\x5c\\x9c\\xc5\\x3d\\xff\\x41\\x6f\\xe0\\xbf\\xf9\\x7a\\x33\\xe3\\x99\\xab\\xbe\\x69\\xa0\\x4e\\xb5\\x83\\x34\\x59\\xdd\\x41\\xd3\\x4a\\x90\\xdd\\x6e\\xe6\\x4c\\xa7\\xa6\\x1d\\xf3\\xd5\\xd0\\x7e\\x55\\x77\\xee\\x9f\\x1b\\xb3\\xab\\xfa\\x86\\x5a\\x63\\xb1\\xe9\\xbd\\xb8\\x69\\xec\\x4c\\x37\\x3d\\x0c\\xcb\\x1c\\xb6\\xe7\\x87\\xd6\\x34\\x79\\x16\\x40\\xe4\\x9f\\x1b\\x2e\\xc2\\x46\\xc3\\x66\\x5d\\x4e\\xd8\\x68\\x7b\\x94\\x41\\x91\\xc3\\x56\\x0f\\x46\\xda\\x1e\\xed\\x3b\\x2e\\x20\\x04\\xe3\\xa0\\x89\\x33\\xa3\\xcf\\x5e\\x69\\xe4\\x9b\\xf7\\xf9\\x35\\x26\\x34\\xb9\\xd0\\xb6\\xcf\\x87\\xb1\\xd5\\x55\\xcc\\xf4\\x99\\x0e\\xe6\\xee\\x9b\\xfb\\xb5\\x4c\\x3d\\xc6\\x8e\\xfb\\xe9\\x01\\x7e\\x0e\\x50\\xdd\\xa0\\x2f\\x0b\\x68\\x3d\\x1e\\xa4\\x83\\xde\\x01\\x5a\\x36\\xad\\xfb\\xc2\\x73\\x6e\\x23\\xdc\\xeb\\xab\\xe4\\xc2\\x8c\\x7d\\xaf\\x81\\x21\\x4c\\x13\\x02\\x40\\x0c\\xf7\\xeb\\xf3\\xb9\\x35\\xa2\\xf1\\xd2\\xe2\\xd9\\x35\\x19\\x8c\\x75\\xda\\x8b\\x1b\\x67\\xd6\\x41\\x2f\\x1c\\x97\\xc1\\x2f\\x57\\x36\\x2c\\xe2\\xe7\\x29\\xe8\\xa6\\x2f\\xd6\\xcc\\x4f\\x03\\xae\\x76\\xc5\\xe9\\x7e\\xba\\x9f\\x37\\xd4\\x6d\\xa0\\x59\\x50\\xa5\\x2d\\x5a\\xfb\\x71\\x2f\\x0c\\x1b\\x9a\\xf4\\x9f\\x5e\\xe0\\xe4\\x51\\x03\\xc9\\xc3\\x72\\xeb\\x83\\x72\\x16\\x8c\\xb6\\x64\\x48\\xda\\x92\\xc1\\x60\\x78\\x51\\x73\\x7a\\x7b\\xe0\\x5d\\x70\\x03\\x34\\xcc\\x70\\xf2\\xf8\\xc2\\x74\\xb9\\x9b\\x5c\\x9c\\xad\\xb9\\x05\\xa4\\x4b\\xad\\x5c\\xed\\x5f\\xd1\\xac\\x75\\xd3\\xf3\\x20\\x79\\xda\\x1f\\x5c\\x5c\\xd6\\x4a\\xb8\\x33\\x7d\\x16\\xc7\\xac\\x6b\\x00\\xd6\\x63\\xee\\xab\\xd7\\x1b\\xfd\\xf9\\xcf\\xea\\xa5\\xe0\\x3f\\xed\\x32\\xd4\\x1d\\x54\\xcd\\x80\\xfc\\xe7\\x2e\\x1a\\xe2\\xde\\xc7\\x7e\\x12\\x6c\\xe3\\x83\\x6e\\xcc\\xce\\xc8\\x20\\xb9\\x18\\x5e\\x20\\xdb\\x8b\\xb3\\xe4\\xa2\\xbd\\x66\\x0e\\x0a\\x99\\xf6\\x86\\xcd\\x18\\xe5\\x46\\x64\\x6e\\x15\\xad\\x78\\xe2\\x87\\x00\\xa9\\x66\\x6a\\xeb\\x19\\x71\\x49\\xc1\\xb8\\x9e\\x26\\x17\\x4f\\x86\\x17\\x98\\x93\\x61\\xf2\\xb4\\x06\\xb7\\xbe\\x1a\\x9c\\xf3\\x31\\x83\\xb5\\xab\\xaf\\x86\\xf0\\x0c\\x43\\x4e\\x2e\\xce\\xb9\\x69\\x3d\\x79\\x7a\\x61\\x32\\xcc\\xab\\xcb\\x1a\\x26\\x43\\x9f\\xf7\\xec\\xd1\\xd3\\x8b\\xd4\\xa7\\x3e\\x69\\x92\\x2f\\x1f\\x3f\\x7a\\x7a\\x11\\xc2\\xa8\\xee\\xb5\\x9f\\x56\\xd7\\x77\\x3f\\x20\\x33\\x9f\\x80\\x90\\x07\\x63\\xb2\\x2b\\xa6\\x9b\\x5c\\x54\\xf8\\x9e\\x93\\x28\\xb8\\x5e\\x2e\\xc2\\x33\\x4e\\xb6\\x33\\x29\\x0b\\x46\\x45\\x5a\\xef\\x2c\\xfc\\x3a\\xb9\\x18\\x1b\\x09\\x05\\xe2\\x77\\x1c\\x84\\x51\\x8c\\xf5\\x6e\\x77\\x0f\\x17\\xa9\\x8b\\x04\\xbc\\xac\\x3a\\x9d\\x5f\\x0c\\x77\\x79\\xdf\\xc4\\x8f\\x94\\x9d\\x8e\\xb4\\x79\\x63\\x99\\xac\\xf8\\x3d\\x04\\x97\\x0c\\xef\\x25\\x49\\x59\\x85\\xed\\xa5\\x19\\x4d\\xb3\\xba\\x1b\\xb3\\x9e\\x46\\x67\\xdc\\xeb\\x2e\\x6f\\x78\\x3b\\x44\\xf6\\xbe\\xc7\\x2a\\x9b\\xf0\\xe9\\x48\\x90\\x9f\\x59\\x0c\\x57\\xe2\\x41\\x40\\x15\\xb3\\x7b\\xcb\\xd5\\xb4\\xf1\\xab\\xb0\\xb9\\x26\\x11\\x4b\\x2c\\xa6\\x68\\x64\\xef\\x7a\\xa1\\x99\\x0e\\x23\\x13\\xdf\\xcc\\x0d\\xd7\\x35\\x17\\xbb\\xdd\\x8c\\x3b\\xc9\\x6e\\xb7\\x73\\x76\\x13\\xe5\\x02\\x50\\xdf\\x30\\x0a\\x01\\x8f\\x57\\xa6\\x84\\x7d\\x9e\\xee\\x76\\x2b\\x9e\\xd8\\xcd\\xd5\\x15\\x02\\x9d\\x1f\\x09\\x94\\x91\\x2f\\xa8\\x66\\x89\\x90\\x77\\x31\\x84\\x5e\\xcc\\x19\\x48\\x08\\xfd\\xfa\\xba\\xae\\x7c\\x63\\x43\\x61\\xb8\\xeb\\x7b\\xb4\\xd4\\xb4\\x08\\x3f\\xd7\\x89\\x2f\\xe1\\xbf\\x28\\xa4\\x5c\\x93\\xd3\\x53\\x9d\\x98\\x07\\x97\\x66\\x55\\x4f\\xee\\x0a\\xa1\\xc4\\xf0\\x2d\\xeb\\xfa\\x12\\x30\\x33\\x76\\xa2\\x7c\\x41\\x49\\x44\\x53\\x68\\xc5\\x15\\x53\\x9e\\x2b\\xb3\\x20\\xd9\\xbf\\xea\\xca\\xa6\\x56\\xa1\\x99\\x33\\x50\\x48\\xb9\\xab\\xa4\\x84\\x2f\\x87\\xb6\\x22\\xb9\\x11\\x52\\xf3\\xf9\\x43\\x7c\\x3a\\x68\\x3c\\xeb\\x84\\xef\\xe2\\x44\\xd8\\xde\\xc1\\xd5\\x09\\x3d\\xe1\\xe0\\x85\\xa9\\x29\\xe1\\x07\\xda\\x53\\x23\\x9f\\x41\\x38\\x0e\\x32\\x42\\xb8\\xd4\\xba\\x5f\\x8a\\x03\\x10\\x21\\x53\\x1c\\x60\\xd8\\x25\\xca\\x3c\\xb7\\x81\\x05\\x99\\x0d\\xc2\\xb0\\x00\\x61\\x4c\\x1e\\x40\\xaa\\x85\\x30\\x6c\\x8a\\xaa\\x2a\\xa3\\x22\\x63\\xc5\\x5e\\x0c\\xe6\\x91\\xf6\\x63\\xb6\\x91\\x6a\\x78\\xf6\\x31\\x98\\x6a\\x84\\x75\\x83\\x63\\x03\\xf3\\xd2\\x00\\x05\\x55\\x50\\x38\\x14\\x9b\\x20\\x78\\x34\\xd1\\x3d\\xe6\\xe1\\x21\\x08\\x6b\\x86\\x8d\\xa5\\x79\\x33\\x50\\xc3\\x60\\x5a\\x87\\xbe\\x51\\x30\\xb2\\x9b\\x41\\x95\\xe6\\x49\\xdb\\x63\\xc5\\x85\\x3d\\xa2\\xef\\x9b\\x56\\xa7\\x84\\x94\\x9d\\x4e\\x4c\\x77\\x3b\\x7e\\x25\\x10\\x3e\\xad\\xb3\\x50\\xed\\xfb\\xe9\\x27\\x46\\x4e\\x49\\x69\\x3d\\xf7\\x58\\xd3\\xdb\\x3e\\x1a\\xf1\\xab\\xfe\\xb8\\x55\\x4a\\xa5\\x71\\x41\\xf8\\xb9\\xf8\\x72\\x88\\x0b\\x42\\x3b\\x9d\\xe2\\x7a\\x30\\x1e\\xf6\\x8a\\xb4\\x00\\x1f\\x11\\xb7\\x4a\\x9a\\x13\\x85\\x03\\x1c\\xa8\\xe9\\x0b\\xd8\\xb9\\xc3\\xda\\xcc\\x78\\x44\\xac\\x70\\x69\\xf2\\xaa\\x3b\\xca\\xf7\\x83\\x5d\\x37\\x88\\x6a\\x04\\x93\\x36\\xe6\\x4e\\x9a\\x4b\\x41\\x04\\xbb\\x3b\\x79\\x63\\xd3\\x1b\\xe5\\x9f\\x76\\x26\\xee\\x92\\xa9\\x94\\xe1\\x92\\xfd\\x27\\xe5\\xe0\\x0c\\x5f\\xf9\\x01\\x86\\x93\\x30\\x8e\\x4a\\xa6\\xa2\\x34\\x2a\\xd9\\x7f\\x22\\xcc\\x0f\\xda\\xfe\\xb4\\x57\\xba\\xee\\x76\\xc1\\x21\\x78\\xc2\\xa6\\x31\\xaa\\x6a\\xbf\\x8d\\x3a\\x94\\x7f\\x84\\xb7\\xb0\\xec\\x9d\\x6e\\x07\\xfb\\x79\\x4d\\x07\\xec\\x11\\xb6\\xe0\\x4a\\xa3\\x90\\x6f\\x8d\\xf0\\x5c\\xf8\\xc2\\x66\\xb2\\xfd\\xb3\\x99\\x6e\\xff\\xac\\x65\\xfd\\xf4\\xb0\\x66\\xfe\\x40\\x9e\\x5f\\x71\\x0f\\xed\\xfb\\x56\\xee\\x75\\x73\\xb1\\x00\\x1a\\xdd\\xeb\\x26\\xae\\x7a\\xab\\x97\\x4d\\x14\\xef\\xfd\\xe8\\xdc\\x78\\x2f\\x4a\\x78\\x24\\xc5\\x9b\\x52\\x2e\\x4a\\xa6\\x6c\\x1c\\xf0\\x4e\\x27\\x92\\xe2\\x6b\\xb9\\x5a\\x1b\\x59\\xd8\\xa7\\xcc\\x05\\x3c\\x55\\x08\\x1f\\x80\\xc4\\x86\\x17\\x29\\x64\\xa9\\x52\\xab\\x1f\\x8b\\xe0\\x2d\\xc2\\xeb\\x3a\\x54\\x7a\\x3a\\xf1\\x69\\x51\\x10\\x20\\xdf\\xbc\\xb5\\x03\\xec\\x47\\x53\\xbf\\x95\\xd4\\x75\\xb9\\xeb\\x98\\xda\\x95\\xdd\\x47\\x38\\x7a\\xa8\\x2b\\xb3\\x07\\x90\\x71\\x64\\xc3\\x01\\x45\\x38\\xd2\\x4c\\x28\\x03\\x05\\x88\\x61\\x72\\x1c\\x42\\xaa\\x05\\xa2\\x00\\x72\\xc1\\x08\\x61\\x77\\xe5\\xbe\\xb4\\x5d\\x6b\\xe9\\xb6\\x2e\\x9a\\x6e\\xeb\\xc9\\x7f\\xdc\\xef\\x57\\x95\\x17\\x98\\x8f\\x96\\x30\\xf9\\x6a\\x29\\xef\\x82\\x5c\\x95\\xd6\\x60\\x03\\xc4\\x68\\xed\\xe6\\x15\\xbe\\xb5\\xa7\\x4c\\x3c\\x1c\\xdc\\xce\\x1e\\xe1\\xb0\\xca\\x0a\\x2f\\x79\\xce\\x8e\\xd7\\xa9\\xe5\\x5f\\xad\\xd1\\xa3\\xad\\xdd\\xfb\\x00\\x61\\x8d\\xc8\\xb0\\xd3\\x55\\x05\\x91\\xdc\\x61\\x03\\xbf\\x3d\\xd8\\xc0\\xfd\\x45\\x91\\xa0\\x2a\\x21\\x3a\\xd8\\xae\\xec\\x3c\\x79\\x7b\\x80\\xbf\\xac\\xc2\\xfb\\xea\\xd8\\xe8\\x17\\xde\\x71\\xc7\\xdf\\x6d\\xb3\\x7f\\x6f\\x0c\\x23\\xfb\\xf5\\x79\\xcb\\xe9\\x82\\xe9\\xe0\\x7e\\x98\\x1f\\xe9\\x8a\\xa9\\x58\\x07\\xba\\x1e\\x1e\\x28\\x98\\xb4\\x61\\x2b\\x6c\\x03\\xe2\\xe0\\xd6\\x9f\\x6d\\xb5\\x7f\\x18\\xe0\\x81\\x23\\xe9\\xf5\\x43\\xa3\\xf8\\x43\\x2c\\x92\\xa6\\x79\\xd4\\xe9\\x84\\xaf\\xbb\\xdd\\x84\\x4f\\xf7\\x34\\x4c\\xda\\xfa\\x2a\\xd9\\xdb\\x53\\x34\\xda\\xed\\x98\\xd3\\xa0\\x4b\\x64\\x0d\\x2a\\xd5\\x8d\\x9d\\x29\\xe6\\xce\\x9f\\xee\\x3b\\x59\\x3a\\xff\\x0b\\x2c\\xf6\\x42\\x56\\x84\\x81\\xee\\x9c\\x2f\\x7e\\xed\\x83\\xd4\\x8a\\x4d\\x03\\x17\\x8a\\x35\\xfe\\x49\\x84\\xa1\\x11\\x4f\\xbe\\xb0\\x67\\x5e\\x61\\x6f\\xf3\\x19\\xfc\\xd0\\x99\\x82\\xe3\\xad\\x2b\\x69\\x88\\xc4\\x17\\x21\\x4e\\x55\\x81\\xf2\\x99\\xdb\\xd8\\x11\\x2d\\x0d\\xd2\\x64\\x5a\\x03\\xd5\\xe1\\x04\\xdc\\xbf\\xf2\\xbc\\xae\\xa2\\x15\\x91\\x3c\\xe8\\xd1\\x71\\x45\\xf1\\x64\\x8a\\xc5\\xa7\\xee\\x34\\xb2\\xd6\\x2d\\x11\\x1a\\xb4\\x1a\\x0b\\xc0\\x44\\x4c\\xd8\\x74\\x3a\\x02\\x96\\xd5\\xb3\\x40\\x9d\\x8e\\x8f\\x54\\x9d\\xd8\\x1d\\xa9\\xf6\\xa3\\x74\\x5b\\x4c\\x02\\xd7\\x7c\\xa1\\x2a\\x70\\xeb\\x0a\\x06\\x6f\\x98\\x5d\\xbd\\x64\\x22\\x8e\\x63\\xbb\\x0b\\xd5\\x10\\xac\\x10\\xb6\\x69\\x36\\x10\\xce\\xe1\\x98\\x0f\\x6e\\xea\\x0c\\xb1\\x19\\x0b\\x33\\x4c\\x49\\x74\\xd8\\x98\\x55\\xd7\\x35\\xef\\xa0\\xb1\\x53\\x7b\\xa0\\xc0\\x94\\x34\\xcc\\x89\\x0d\\x40\\x02\\xd0\\x29\\x49\\x73\\x82\\x78\\x54\\x5e\\x93\\xfe\\xa8\\xd7\\x2b\\x7d\\x07\\x0a\\xa2\\x26\\x25\\x2c\\x85\\xe8\\x8b\\x88\\x10\\x52\\x34\\x97\\x0e\\x35\\xd7\\x49\\x99\\x5c\\x37\\x3c\\x28\\x63\\x38\\x40\\x00\\x5d\\x92\\x24\\x8e\\x83\\x3c\\x44\\x5f\\xd8\\xa6\\xe0\\xfb\\xaa\\x8e\\x9a\\x3c\\x29\\xac\\x13\\xdb\\x92\\x48\\xf3\\x68\\xd3\\x73\\xc2\\xcd\\xda\\x8d\\x0b\\xc0\\x9d\\x25\\x60\\x75\\xde\\xe9\\x2c\\xeb\\x99\\x42\\xdb\\xa5\\x77\\x7f\\xc8\\x71\\x86\\x69\\x50\\xf3\\x32\\xf1\\x8c\\x5b\\x95\\x77\\x3a\\x79\\xcd\\x24\\x8e\\x63\\xd3\\x00\\x59\\x02\\xad\\xb9\\xe1\\x71\\x8e\\x35\\x2e\\x70\\x66\\x38\\x40\\xe8\\xf8\\x12\\xa1\\x54\\x9b\\x12\\x59\\xed\\x4b\\x1c\\xb0\\xbf\\xd0\\x05\\x50\\x8d\\xec\\x4d\\x4e\\x78\\x47\\x92\\xbd\\xa3\\xaf\\xbd\\x5a\\x02\\x0d\\x2f\\xff\\x14\\xc6\\x07\\x66\\xa3\\x13\\x5e\\x1f\\x23\\xa4\\x36\\x02\\x53\\x43\\x38\\x31\\x07\\xdf\\x37\\xbf\\xe9\\x37\\x06\\xae\\x3b\\x7e\\xc4\\x1e\\xe3\\x66\\x07\\x0e\\xe8\\xc0\\x55\\xaf\\xf6\\xf4\\x3b\\x96\\xa4\\x09\\x25\\x62\\x38\\xb5\\x31\\x83\\xa3\\xc2\\x61\\x22\\xbd\\x37\\x89\\xde\\x90\\x65\\xdd\\x19\\xc4\\x58\\xa5\\x12\\x33\\x91\\xa7\\x62\\x2c\\xd3\\xf0\\xa6\\xcc\\x57\\xfc\\xc8\\x92\\xd4\\xc9\\x4d\\x7d\\x08\\xb2\\x75\\xfa\\xd1\\xc5\\x80\\xf3\\xc7\\x51\\xad\\x3f\\xb1\\x38\\x38\\xba\\xe2\\xee\\xbb\\x98\\x48\\x77\\x26\\x12\\x1d\\x39\\x6d\\xf5\\x91\\x1f\\x0a\\x87\\x16\\xf5\\xb1\\x22\\x91\\xd9\\xa8\\x6c\\x48\\x52\\x91\\xac\\x64\\xee\\xa2\\xb8\\x3b\\x8f\\x6e\\x23\\xbc\\x58\\x8b\\x1f\\xf3\\xd7\\xbe\\xf7\\x21\\xc0\\x80\\xeb\\x07\\xbd\\x2a\\xeb\\xdb\\xd4\\x0a\\xd2\\x85\\x53\\xab\\x85\\x0d\\xbe\\x02\\x72\\x0f\\x2d\\x8a\\x66\\x2d\\x58\\x3b\\x78\\x46\\x74\\x02\\xc1\\xc9\\xd4\\xa4\\x98\\xe2\\x5f\\xe3\\x0c\\x75\\x3a\\xb1\\xda\\xed\\x5c\\xfc\\x96\\x17\\x3a\\x66\\x88\\x10\\xf2\\x42\\xc7\\x19\\x82\\xd0\\x55\\x5d\\x92\\xd5\\xf4\\x85\\x85\\xe7\\xf8\\x3f\\x33\\x9b\\x89\\xd2\\x34\\xfb\\xc8\\xf2\\x1a\\x1a\\x61\\x60\\x98\\x4e\\xa7\\x31\\xe5\\xd8\\x82\\xc1\\x49\\xfa\\x43\\xaf\\x02\\x50\\xd5\\xc7\\xe6\\xc7\\xd0\\x8e\\x9a\\xa1\\x9e\\x70\\x93\\x6c\\x7e\\x4c\\x72\\x70\\xa8\\xbd\\xae\\xa1\\xd9\\x09\\x85\\xd9\\x09\\x21\\xf2\\xd0\\x2b\\xaa\\xb3\\x25\\x17\\x0b\\x77\\xe0\\xd5\\xce\\x75\\x34\\xa3\\x65\\x84\\x3c\\xe6\\xc5\\x81\\xb5\\xcb\\x08\\x84\\x30\\xaf\\x40\\x67\\xcc\\x46\\x78\\xdd\\xdf\\xed\\x4e\\xcd\\xc3\\x55\\xbf\\x3e\\x3c\\x64\\x8b\\xd4\\xcb\\x71\\x53\\x14\\xc1\\x31\\x6b\\xde\\x0a\\x1e\\x05\\x56\\x56\\x8e\\x83\\xf8\\x10\\x70\\x80\\x08\\x4b\\xc2\\x41\\xb8\\xca\\x3e\\x2a\\x38\\xea\\xe1\\x9e\\x81\\x5a\\x6e\\x6d\\x04\\x89\\x54\\xe1\\x5b\\xfb\\x40\\xdd\\x09\\xd2\\xb2\\x22\\x02\\x17\\x44\\xd9\\x63\\xda\\x19\\xa1\\xf6\\x61\\x79\\x10\\xab\\xc7\\xf6\\xec\\xdf\\x5f\\x6c\\x75\\xc2\\xf3\\x2a\\xf9\\x62\\xcb\\xdc\\x2f\\xb7\\xf0\\xdf\\xed\\x38\\x28\\x15\\xaa\\x7f\\x57\\x10\\xc3\\x49\\x20\\x08\\x06\\x1f\\xdc\\x1e\\xb0\\xd9\\x93\\x2e\\xf2\\x30\\x42\\x02\\xb7\\x17\\xe2\\x6d\\x27\\xc5\\x34\\x15\\x78\\x92\\x4d\\x53\\x55\\x11\\x3e\\xda\\x90\\xf8\\x93\\x83\\x42\\x93\\x6c\\x4a\\xde\\xf0\\x58\\xe2\\xa5\\x69\\x6d\\x33\\x29\\xa7\\x44\\xe1\\x8d\\x91\\x14\\xd7\\xe4\\x05\\x8f\\x37\\x98\\x82\\xff\\xec\\x26\\xb9\\x71\\x9e\\xec\\x3e\\x71\\x10\\x46\\x37\\x7e\\xbd\\x8f\\x83\\xee\\xca\\xa6\\x63\\xc6\\x33\\x8e\\x42\\x67\\x5f\\x23\\x11\\x05\\xa7\\x9d\\x12\\x88\\x59\\x18\\xc6\\xe9\\x7c\\xee\\xaa\\x76\\xb1\\xfb\\x6f\\xe0\\x04\\x60\\xbe\\x7f\\xb9\\x5c\\x10\\x10\\xb5\\x1e\\x9f\\x35\\x2f\\x06\\x18\\xcf\\x26\\x3a\\xb1\\x53\\x97\\xf0\\x7c\\xfa\\xc9\\x8c\\x89\\x3b\\x18\\xed\\x0f\\xa0\\x8e\\xbc\\xed\\xee\\x78\\x29\\xef\\xcf\\xf5\\x1e\\x0c\\x38\\x11\\xdc\\x20\\x10\\x39\\x0f\\x28\\x21\\x05\\x90\\x14\\x8d\\xdf\\x72\\x7f\\x47\\x17\\x1b\\xeb\\xf4\\x80\\x43\\xd2\\x9e\\x19\\xfe\\xe1\\x53\\xcc\\x70\\x9b\\x17\\xce\\xf4\\xbd\\x75\\x3e\\x08\\xee\\xf9\\xaa\\xf5\\x3a\\x16\\xa9\\x0d\\x19\\x7d\\xbd\\x0e\\x2e\\x58\\x0b\\x90\\xdd\\xee\\x2c\\x0b\\x77\\xa6\\xda\\xab\\x8c\\x0c\\xea\\x91\\xfd\\xa2\\xd6\\x6d\\xc1\\xde\\xee\\xe5\\xf8\\x93\\xf0\\x6a\\xae\\x9b\\xfa\\x82\\xaf\\x81\\x57\\x55\\x51\\x4d\\xdb\\x45\\x6c\\x68\\xbe\\x17\\x07\\xe9\\xad\\x80\\x29\\xed\\xac\\xbc\\xa4\\x77\\xef\\x40\\xb5\\x73\\x90\\xfc\\xb5\\xdc\\x88\\x76\\x32\\x13\\x46\\xe0\\xb4\\xf5\\xbc\\x5b\\xd2\\x32\\xec\\xce\\x17\\x99\\xb5\\x3f\\xb7\\x3e\\x70\\xc6\\x64\\xfe\\x07\\x8b\\x51\\x15\\xbe\\xb4\\x54\\x0a\\x98\\x41\\x9c\\xc6\\x1a\\x12\\x23\\x1d\\x88\\x1a\\x2e\\xac\\xe9\\x47\\xc0\\x07\\x05\\x61\\xc0\\x6f\\x1c\\xb1\\x25\\xef\\x78\\xcc\\x1c\\xa6\\x60\\xb8\\x20\\x84\\xe6\\xb9\\xbb\\x5b\\x41\\xc5\\xc8\\x71\\x09\\xdf\\xd9\\x08\\x03\\x6e\\x76\\xed\\x04\\xea\\x2a\\xac\\xf2\\xb0\\x33\\x6e\\x5b\\x6f\\x77\\xcb\\x3b\\x3d\\xb8\\x6d\\x33\\x46\\x58\\x92\\xe0\\xcc\\xb8\\x8d\\x19\\xa1\\xc7\\x2c\\x8d\\x4a\\xfb\\x24\\x52\\x0e\\xc7\\xf7\\xe1\\x62\\xb8\\xef\\x5e\\x90\\xef\\x63\\xe1\\x9f\\xf1\\x6b\\xee\\x1c\\xe2\\x21\\xd0\\x4b\\xf2\\x10\\x14\\x79\\x68\\x15\\x79\\xb0\\x0e\\xf4\\x3c\\x29\\x83\\x22\\x65\\xab\\x48\\x69\\x8a\\x14\\x10\\x14\\xc0\\xdd\\x42\\x87\\x33\\xf3\\xe6\\x3e\\x90\\x71\\x61\\x0f\\x0d\\x21\\xbc\\x24\\x3c\\xb9\\x0d\\x92\\x29\\x56\\xb8\\x34\\xf2\\xc5\\x3d\\xc0\\xc2\\xc5\\xac\\x30\\x8f\\x2f\\x65\\xf9\\x5d\\x1e\\x2b\\x84\\x79\\xf2\\x70\\x3c\\x0f\\x5c\\x5d\\xcb\\xe3\\x79\\x25\\x04\\x7f\\x38\\x9e\\x97\\x99\\xbc\\xdb\\xe3\\x79\\x4b\\xb8\\x39\\xae\\x06\\x70\\x4b\\xf5\\x69\\x6f\\x3c\\x34\\x48\\x5f\\xdf\\x91\\x38\\x69\\xa6\\x74\\x5a\\xd5\\x8b\\xec\\xc8\\x57\\x7b\\xb1\\x0d\\x9a\\xcf\\xa0\\xbd\\xa0\\x03\\xfa\\xd8\\xd7\\x96\\xc4\\x4e\\xf4\\xb4\\x32\\xbc\\xd3\\x6b\\xbd\\x64\\x76\\xd8\\xfb\\x3a\\xc3\\x16\\x0e\\xd7\\xc1\\xa5\\xcc\\xa6\\x6f\\x41\\x31\\xf6\\xc8\\x9a\\xfa\\x94\\x0a\\x88\\x58\\xec\\xc5\\x70\\xc7\\xd6\\x3a\\xd2\\x86\\xaa\\x9b\\x9c\\x29\\x5d\\xca\\x87\\x03\\x15\\x5c\\xb8\\x56\\x6a\\x5a\\xd0\\xe9\\x64\\x2c\\x6e\\x5e\\x61\\x05\\x82\\xe2\\xd3\\x2d\\x97\\x4e\\xc7\\x90\\x78\\x53\\x2b\\xd5\\xf4\\xeb\\x25\\xcb\\x3e\\x1e\\x43\\xfd\\x16\\x82\\x1b\\x81\\xd6\\x5e\\xf0\\x13\\xdb\\x07\\x50\\xf1\\xfd\\x14\\x73\\x34\\xd6\\x8e\\x00\\x1d\\xf3\\x2e\\xdf\\xbb\\x5b\\xd8\\xba\\x15\\xda\\xbb\\xc6\\xeb\\x8b\\x94\\x47\\xc7\\x2e\\x0e\\x63\\xe1\\xc5\\x61\\x70\\xcf\\x2d\\x61\\x13\\x31\\xc5\\x7c\\x22\\xa6\\x64\\x7b\\x9f\\x2a\\xfc\\x90\\xea\\x89\\x9a\\x56\\x81\\x24\\xcb\\x51\\xea\\xfa\\x62\\x45\\xf7\\x58\\x7b\\x70\\xc4\\x06\\x1e\\x1e\\x18\\x08\\x9b\\xd1\\x87\\xa0\\x43\\x08\\xf3\\x4e\\xc7\\xf5\\x95\\xab\\x6f\\xee\\x41\\xe7\\x34\\x2b\\x58\\xcc\\x51\\xa7\\x63\\x7e\\xe0\\xfa\\x79\\x37\\x4e\\x8e\\xaa\\x16\\x75\\xf9\\x33\\x0a\\x16\\x42\\x19\\x6b\\x8f\\xb2\\xee\\xfb\\xf7\\x0f\\x6b\\x06\\xb7\\xc7\\xb9\\x64\\x00\\xd0\\xb1\\x42\\xa8\\x9a\\x6d\\x78\\x91\\xbf\\x2e\\x7f\\x02\\xd4\\xa8\\x9b\\x3f\\xd4\\x56\\xb3\\x3d\\x52\\xc5\\x5a\\x33\\xe9\\x2e\\x75\\x3e\\x1d\\x8c\\x58\\xbb\\x67\\xbc\\x45\\x4d\\xfd\\xc2\\x34\\x12\\x8d\\x63\\x95\\x4e\\x0d\\x9f\\x0e\\x4f\\x70\\xf7\\xcd\\x69\\xdf\\xc0\\xb1\\xc9\\xf6\\x99\\x40\\x97\\x4b\\xa6\\x1e\\x44\\x16\\x74\\x12\\xcb\\x4e\\xe7\\x6b\\x43\\xa3\\xb8\\xe7\\x27\\x42\\xc5\\xd1\\xa7\\x08\\xaf\\xa3\\xfe\\x35\\xf6\\x29\\xb3\\x44\\xe5\\x9a\\x7d\\x0f\\xf8\\x64\\xb7\\x4f\\xe4\\x87\\xe8\\x76\\x23\\x93\\xaf\\xe2\\x7d\\xf4\\x35\\x2c\\xd5\\x28\\x50\\xa5\\xb8\\x4b\\x65\\xdf\\x32\\x25\\x8b\\x5b\\x56\\xc6\\x02\\xb7\\x3c\\xe2\\xac\\x9d\\xc0\\x6f\\xb4\\x0d\\x73\\xef\\x52\\x2a\\x18\\xc2\\xa1\\x4e\\x00\\x6f\\x5b\\xec\\x2d\\xbe\\xa9\\xa3\\xf4\\x04\\xac\\xac\\x07\\x73\\x4a\\x0d\\x13\\x5b\\x3a\\x26\\x36\\xbc\\xa9\\x8a\\x80\\x18\\x6b\\x43\\xa6\\x79\\x81\\x67\\xb7\\x13\\x89\\x0b\\xb6\\x86\\x37\\x44\\x5f\\xf7\\x3b\\x1d\\xe1\\x41\\x39\\xd1\\xbd\\x81\\xd5\\x8c\\xc1\\xb5\\xc8\\x75\\xc7\\x51\\x5d\\x82\\x48\\x5c\\x7f\\x6e\\x66\\x6e\\x49\\xa4\\xf5\\x38\\x5b\\x92\\x0f\\xb1\\x9c\\xe8\\x29\\x1a\\x73\\x18\\x1c\\x83\\xc5\\x69\\x00\\x17\\x83\\xd5\\x0e\\x33\\x94\\xfe\\xd4\\x2e\\xf1\\xba\\xe6\\x2d\\x9a\\x22\\x2e\\xeb\\x4d\\xc9\\x57\\xdc\\xc8\\xff\\xad\\xdc\\xe6\\x8a\\x6c\\x54\\x3b\\xab\\x67\\x93\\x72\\xba\\xdb\\x6d\\x3a\\x1d\\xf3\\x70\\x65\\x98\\xe0\\xe0\\x72\\x2e\\x06\\x77\\x06\\x34\\xc3\\x2b\\xba\\x7a\\x4a\\x32\\xb2\\x34\\x62\\x5b\\x6e\\x64\\x36\\x88\\x2c\\x9c\\x43\\x9c\\x82\\x0d\\xc9\\xd0\\xa8\\x19\\x5b\\x5e\\x51\\x40\\x34\\x8e\\x97\\xa8\\x3a\\xd2\\xa7\\xbd\\x90\\x76\\x6e\\x52\\xa4\\x97\\x2f\\x94\\x91\\x48\\x28\\x91\\x3e\\xfc\\x93\\x13\\x30\\x0a\\x22\\x0d\\x76\\xfc\\x40\\x67\\xac\\x30\\x9c\\x47\\x46\\x24\\x21\\xc4\\xc8\\x1b\\x0d\\x3d\\x73\\x57\\xf7\\xe5\\x78\\x83\\xe7\\x30\\x96\\x9c\\xf4\\xf1\\x86\\x88\\x51\\x7e\\xb5\\x19\\x75\\xbb\\x39\\x9a\\x93\\xbc\\xcb\\xf1\\x72\\x92\\x4f\\x09\\x5c\\x35\\x9a\\xed\\x76\\xd2\\x82\\x2d\\x2e\\x26\\xf3\\x29\\x9e\\x23\\x3c\\x29\\xa7\\xa9\\x72\\x69\\xcc\\xa6\\xd5\\x04\\x6e\\x59\\xed\\xcd\\xcf\\xde\\x50\\xee\\xfd\\x50\\x1e\\x5a\\x43\\x39\\xe8\\x20\\x88\\xd7\\x78\\xe9\\xb4\\x4c\\x7d\\x5c\\x10\\x31\\x2a\\xaf\\x8a\\x51\\xb7\\x5b\\xa2\\x8c\\x94\\xa6\\x8b\\x84\\x4d\\xb2\\x29\\xa6\\x46\\x32\\xd9\\xde\\xa7\\xbe\\x93\\xcb\\x49\\x7f\\x8a\\x33\\x84\\x1f\\xea\\x2e\\x2e\\x27\\x03\\x93\\x52\\x77\\x91\\x56\\xfb\\x08\\xf2\\x57\\xfa\\xb8\\x05\\x46\\xe5\\x7b\\xf6\\x90\\x52\\x08\\xc6\\xf3\\xe0\\x5f\\x4b\\x12\\x3d\\x44\\x15\\x69\\x31\\xbd\\xa6\\xbb\\xfb\\x23\\x0a\\x6f\\x77\\xb3\\x77\\xb2\\x09\\xb8\\x8c\\xad\\xdb\\xcd\\x50\\x4e\\xb2\\x2e\\xc7\\x1b\\xc2\\x26\\xf9\\x14\\x17\\x46\\xf4\\x0a\\x46\\x54\\x68\\x23\\x58\\xc1\\x61\\xaa\\x66\\x50\\x90\\x58\\x9a\\xc4\\x7a\\x5c\\x45\\x05\\xa1\\x01\\x0c\\x2e\\xee\\xf3\\x05\\x21\\xdb\\x5e\\xaf\\xc6\\xa9\\xe7\\x5d\\x1c\\x01\\xfc\\xdc\\x47\\x10\\x45\\x4a\\x4f\\x2b\\x88\\x8f\\xfe\\x4e\\x83\\xc7\\xc5\\xa1\\x2d\\xd7\\xf1\\xa1\\xf2\\x60\\xd7\\xc7\\x0a\\x44\\x29\\x83\\xa5\\x75\\x9c\\xab\\x8f\\x3c\\xde\\x9a\\x1d\\x37\\x7d\\xc5\\x63\\x01\\xb2\\xa4\\xd5\\x7a\\xa4\\x9e\\x61\\x56\\xfe\\x8b\\x0a\\x2b\\xec\\x62\\x51\\x60\\x7b\\x33\\x31\\xaf\\x3c\\xb7\\x0c\\xf1\\xbc\\x5e\\x96\\x72\\xe5\\x07\\xbe\\xaf\\xc8\\xe1\\x13\\xe6\\xda\\xb5\\x37\\x0e\\xba\\x95\\x2d\\xc7\\x3f\\xd2\\x1f\\x53\\x59\\x3b\\xdf\\x8b\\x4e\\xa7\\x96\\x0f\\xeb\\x2f\\x04\\xc4\\x80\\x8c\\x85\\xd3\\xc7\\x10\\x8a\\x75\\xfb\\x0e\\x50\\xed\\xef\\x00\\xd5\\xed\\x3b\\x40\\xb5\\xbb\\x03\\x14\\x2b\\xf2\\x91\\x5b\\x0a\\xb3\\x0f\\x51\\x37\\x1c\\x5a\\x14\\x70\\xa8\\x01\\xfd\\x4f\\xab\\x06\\xfe\\x91\\x8b\\x57\\x74\\xff\\x6c\\xb3\\x21\\xf0\\xc2\\x90\\xd7\\x00\\xfc\\x60\\x41\\xb7\\xf3\\x0e\\x5a\\x32\\x47\\x87\\x3a\\x1d\\x0d\\x6a\\x2d\\x4b\\x5f\\x82\\x7b\\xfb\\x81\\x81\\x3f\\x60\\x1e\\x71\\x41\\x20\\x20\\x65\\xc3\\xa0\\xd5\\x13\\xc8\\xdd\\xd4\\x07\\xd3\\x68\\x6f\\xc0\\xce\\x08\\x04\\x5d\\xf9\\x64\\xc4\\xbf\\x15\\xbd\\xf7\\x99\\x3f\\x7e\\xf3\\xf7\\xe7\\xad\\xcc\\x0a\\xc3\\xb7\\x4b\\x28\\x94\\x57\\x87\\xac\\x1b\\x64\\x33\\xc8\\xe6\\x78\\xc5\\xc5\\x0b\\xb8\\x05\\x20\\x4f\\x85\\x49\\xf2\\x2f\\xb2\\xb2\\x5c\\xe2\\x4f\\x8a\\x95\\x10\\xcf\\x58\\xc5\\x28\\x8c\\x07\\x23\\xc6\\xec\\x93\\x3d\\x80\\xaa\\xe5\\x98\\x7f\\xb2\\xff\\x55\\x15\\x97\\x76\\x79\\x6f\\xf0\\x1c\\x2f\\xf0\\x3a\\x08\\x9e\\xde\\x70\\xf6\\x0b\\x22\\x27\\x9b\\x29\\x9e\\x93\\x85\\x47\\x69\\xbc\\x26\\x8b\\x49\\xe9\\x9e\\x4f\\x7f\\x8d\\xe7\\x68\\xb7\\x5b\\x5e\\xaf\\x77\\xbb\\xfc\\x6a\\x5d\\x19\\x0a\\xb1\\x21\\xfd\\xd1\\xe6\\xca\\x60\\xdf\\x2a\\xb6\\xc1\\x45\\x8e\\xe3\\x7b\\x86\\x35\\x5e\\xe0\\x02\\xe1\\x53\\x85\\xd0\\xa8\\xdb\\xdd\\xb8\\x38\\xce\\xb6\\x0e\\xda\\x1b\\x8c\\x36\\x56\\x2d\\xbf\\x81\\x5b\\xf6\\x57\\x31\\x42\\xdb\\x3f\\xab\\xcb\\x29\\x22\\x7d\\x08\\x61\\x83\\x69\\xcf\\x8b\\xc2\\x16\\x82\\x68\\xf2\\x07\\xfc\\xdc\\x31\\x02\\x83\\xb9\\x3f\\x57\\xfe\\x17\\xb9\\xe6\\x1a\\x36\\xbf\\xc6\\xaa\\x31\\xa1\\xa8\\x40\\x63\\x6b\\x7d\\x78\\x5f\\xdf\\xb2\\x72\\x5e\\xc8\\xbb\\x38\\x38\\x74\\xe8\\xb7\\xbd\\xe7\\xc2\\xf6\\xf0\\x73\\x1d\\x04\\x3e\\xcd\\xa1\\xbc\\x61\\xca\\x1c\\x0b\\x29\\x6b\\xdd\\x47\\x4d\\x43\\xeb\\x40\\xaa\\xa6\\xea\\x94\\x8f\\xa3\\xa8\\xcb\\xeb\\x1d\\xf6\\xa5\\x2c\\x6d\\x53\\x72\\x62\\xa3\\xaf\\x4d\\x51\\x1a\\x45\\xee\\x5e\\x0b\\x61\\xca\\x8a\\x63\\x65\\x45\\x53\\xb6\\xaa\\xbc\\x04\\xf5\\x27\\xec\\xf1\\x88\\xb5\\x14\\x0c\\xec\\x98\\x26\\x87\\x79\\x3b\\x86\\xde\\xed\\x22\\x77\\xfd\\x61\\x04\\xfc\\x72\\x56\\xf0\\x75\\x6b\\xed\\x80\\x4d\\xcb\\x46\\x15\\x6d\\x5d\\x00\\x1e\\x1b\\x8e\\x56\\xcb\\x35\\x28\\x12\\x5c\\xf4\\x7d\\x52\\x47\\xd1\\xb1\\xd7\\x97\\xcc\\x35\\x4a\\x19\\xe1\\x44\\x10\\x49\\x5c\\x54\\x32\\xe6\\x0e\\xae\\x72\\x7f\\x5e\\x55\\xd8\\x50\\x12\\xb2\\xaa\\xe2\\xef\\xe3\\xda\\xc2\\x08\\xf7\\x86\\xe1\\x7d\\xcd\\x67\\xcd\\x0e\\xee\\x3b\\xf9\\x0b\\x02\\xd6\\x08\\x70\\x14\\xbb\\x03\\x96\\xbc\\x39\\x11\\x23\\xd7\\xa9\\x4c\\x98\\xc8\\x5d\\xc3\\x02\\x9e\\x67\\xfe\\xac\\xbd\\x75\\x81\\x81\\x2e\\x08\\xfb\\x52\\x55\\xb1\\x57\\x19\\xd4\\xfa\\x01\\xec\\xd4\\xcd\\x01\\x3a\\x21\\x84\\xaa\\x66\\x42\\x2a\\x88\\x2c\\x71\\x54\\x6e\\xd2\\x36\\x02\\xa1\\x25\\x79\\x62\\x4f\\xeb\\x22\\xeb\\x4b\\x66\\x27\\xe0\\xa5\\x14\\x1c\\xcd\\x35\\xe2\\x28\\x2e\\x4d\\xf9\\x5a\\x8d\\xb5\\xdb\\x19\\xde\\x46\\x07\\x1a\\x2c\\xc3\\x6f\\x39\\x9b\\x9a\\xbd\\xa1\\xcb\\xc6\\x8d\\x11\\x5e\\xb4\\x30\\x14\\xd8\\x3d\\xda\\xe0\\x17\\x0c\\x5b\\xf7\\x17\\x9c\\x91\\x72\\x94\\x5d\\x95\\xdd\\x02\\x78\\x8a\\xba\\xe3\\x72\\x92\\x4d\\x47\\xda\\x99\\xbc\\xc6\\xd4\\xdf\\xa5\\x91\\x36\\x9f\\xa3\\xca\\x31\\x25\\xa3\\x2c\\xbc\\x10\\x2b\\x43\\x74\\x92\\x4d\\x83\\x52\\x0b\\xa6\\xfd\\x25\\x14\\xa1\\x0d\\x79\\x1c\\xd9\\xba\\xa3\\xb4\\x46\\xbc\\x51\\x68\\xc8\\x72\\x72\\xc2\\x51\\xa6\\x42\\x31\\x3d\\xf6\\xf7\\xfd\\x1b\\x19\\xe7\\x45\\x4b\\xa4\\xf4\\x46\\x3f\\x23\\x33\\xef\\x15\\xda\\x2b\\x01\\x80\\xe4\\xd0\\xc5\\xe0\\x68\\xd1\\x3e\\x83\\x02\\x93\\x73\\x20\\x67\\x82\\x42\\x58\\x5f\\x93\\x7e\\xa7\\xa3\\xaf\\xc4\\x41\\x17\\xf7\\x42\\x40\\x33\\x72\\x58\\x64\\xa2\\xa7\\x23\\x05\\xa7\\x52\\x6c\\xdb\\xa0\\x7f\\xa8\\x35\\x8c\\xc7\\xb5\\xfd\\x7b\\xf6\\x3d\\xf7\\x66\\x05\\xbe\\x18\\xae\\xcc\\xb6\\xde\\x1f\\xa7\\x03\\x08\\x4f\\xe9\\x63\\x53\\x5a\\xe2\\xea\\x9d\\x77\\x4a\\x7a\\xe7\\x1f\\x9b\\x60\\x9e\\x2e\\x6e\\x27\\x06\\x56\\xa9\\x9e\\x12\\xeb\\xe8\\x13\\x99\\xba\\xa2\\x0a\\x55\\xb1\\x68\\x49\\x92\\x20\\x02\\x21\\xec\\xd8\\xcb\\x9c\\x88\\x16\\x21\\xc4\\x2a\\x29\\xe9\\x1d\\x91\\x35\\x1f\\x08\\x51\\xf5\\x0d\\x27\\x11\\x8c\\x58\\x1c\\x1f\\xf1\\xff\\xc3\\xf1\\x2a\\xa6\\x6b\\x87\\xa7\\x63\\xd1\\x39\\x3f\\x33\\x3c\\xc5\\xb4\\x1b\\x61\\xad\\x4d\\x6b\\xc6\\xe9\\x8c\\x41\\x30\\x56\\xaf\\xcd\\x90\\xcd\\xa9\\x53\\xef\\x74\\x77\\xca\\xb0\\x02\\x73\\x1f\\xe1\\x58\\x55\\x9f\\x45\\xce\\x7d\\xb6\\xd9\\x15\\xde\\x2f\\x65\\xf2\\x0e\\x15\\x26\\x09\\xcf\\xb1\\x46\\xd5\\x67\\x10\\x3b\\x8c\\xec\\xf6\\x57\\xea\\xdf\\xab\\x9c\\x99\\xea\\x3f\\xf5\\x0d\\x66\\xa4\\x01\\xe0\\xe1\\x5a\\xf1\\xeb\\x9a\\x10\\xc2\\x2c\\xdf\\xd8\\xde\\x77\\x30\\x25\\x1a\\xee\\x72\\x61\\x46\\x08\\xb5\\xb6\\x4d\\x71\\x4c\\xeb\\xde\\xe9\\x2c\\x75\\x6c\\x1d\\x38\\x4a\\x6f\\x95\\x7b\\xcb\\x63\\x43\\xb5\\xea\\xe8\\xcb\\xa2\\xad\\x4c\\x59\\x92\\x6c\\x0f\\x5c\\x8d\\x4e\\x45\\x58\\x9d\\x0a\\xd6\\x08\\xe7\\x44\\x8e\\x27\\xba\\x1b\\x7d\\x2b\\x6f\\xe1\\xe6\\x84\\xa5\\xfd\\xd5\\x38\\x8a\\xa6\\xe9\\x04\\x7e\\x8c\\xf0\\x7d\\xa0\\x79\\x69\\x93\\x01\\xbc\\x44\\x78\\xbe\\xef\\xf2\\xe6\\x16\\x94\\x9a\\xe8\\x29\\xc2\\x0b\\x92\\x79\\xea\\xf3\\x23\\x5d\\xd5\\xc6\\x89\\xd8\\xb0\\x7d\\xe0\\x92\\xd1\\x5a\\x4e\\x1c\\x4b\\x64\\x64\\x33\\x8f\\x57\\x8b\\xc0\\x21\\xa6\\x7e\\x26\\x05\\x36\\x30\\xdb\\x3b\\x36\\xf4\\x96\\xc7\\x0b\\xeb\\xe7\\xb8\\xa8\\xa7\\xad\\x6d\\xe2\\x3f\\x4a\\xd4\\xec\\x5e\\x74\\x7c\\x8e\\x1a\\x57\\xb3\\x60\\xaa\\x5a\\x73\\x51\\x36\\xde\\x9f\\xa7\\x70\\x8d\\x54\\xbd\\x69\\x37\\x7e\\x7f\\xc1\\x2d\\x59\\xad\\x89\\x52\\x8e\\x2c\\x28\\xa6\\xeb\\x7e\\x1e\\x4e\\x15\\xf8\\x90\\xc8\\x3f\\x9b\\x06\\x85\\x46\\x70\\xa5\\x4c\\x5b\\xeb\\x45\\x71\\x0b\\xb8\\x10\\xe8\\x1b\\xa1\\xda\\xf5\\xc3\\x48\\xda\\xb7\\x3c\\x96\\xb8\\xe8\\x74\\x8a\\xa6\\xc3\\x0d\\xe3\\x08\\xe9\\x37\\x75\\xe0\\xc8\\x4e\\x27\\x3e\\x02\\xf7\\x0c\\x21\\x0c\\xac\\xee\\xbb\\xd0\\xf8\\xe4\\x9c\\xc5\\xb4\\x9f\\x33\\xd4\\x5a\\x89\\x2d\\x3b\\x55\\xed\\x5e\\xda\\xb6\\x5e\\x1d\\xb1\\xe8\\xa1\\x8a\\x8b\\xac\\xd8\\xe4\\xec\\xc8\\x1a\\x3f\\x65\\xbb\\xdd\\x7b\\x0e\\x9e\\x5c\\x81\\x46\\xff\\xa6\\x19\\xd5\\x0b\\xae\\xcc\\x20\\x72\\xc7\\xa9\\xd4\\xb2\\xbb\\x97\\x7b\\xdf\\xc3\\x6d\\x77\\xfb\\xbe\\x23\\x7e\\x03\\x3d\\x82\\x51\\x0c\\x0b\\x54\\xf3\\x8e\\x66\\x0b\\xb5\\xcf\\x7b\\x60\\x70\\xe7\\x0f\\x3b\\x9d\\xd3\\xf7\\x3c\\x66\\xc8\\xef\\xe6\\x87\\xd5\\xf9\\xdd\\xa8\\x5d\\xe7\\x8d\\x0a\\x58\\x07\\xdb\\x51\\xcf\\x91\\x10\\xd1\\x76\\xe4\\xaa\\x99\\x0c\\xd3\\xb1\\xd1\\xa7\\x7b\\xcd\\x5b\\xfd\\xde\\x3a\\x84\\x4d\\x4f\\x85\\xeb\\xdb\\xc1\\x54\\x4a\\xb4\\xdb\\xc9\\xca\\x9f\\x65\\x04\\x82\\x11\\x74\\xc9\\xdb\\x34\\x82\\x8e\\x72\\xec\\x09\\x20\\x58\\xb5\\x15\\xd3\\xff\\xc3\\x8f\\xfa\\x40\\x79\\x4d\\x6b\\x0e\\xc5\\x83\\xef\\x3f\\x6d\\x22\\xf1\\xab\\x69\\x54\\xf3\\x4c\\x41\\xf5\\x0e\\xbc\\xad\\x8e\\x99\\xfc\\xff\\x73\\x0d\\xd8\\x41\\xec\\x29\\xca\\x3f\\x2b\\xae\\x84\\x5c\\x93\\x73\\x45\\x6f\\x12\\x46\\xe2\\x9a\\x8f\\x59\\x72\\xc3\\x85\\x62\\xa5\\xae\\xab\\xe4\\x58\\xf4\\x38\\xd6\\x28\\x15\\x57\\xe0\\xce\\xe8\\xe0\\x56\\xe7\\x0b\\xcc\\x7b\\xa2\\x39\\x10\\x50\\xab\\x49\\xc0\\xc9\\x4f\\x9a\\x2f\\xac\\x5e\\xac\\x8f\\x25\\xaa\\xf6\\x2b\\x87\\xb9\\x22\\xa7\\xfd\\x23\\x74\\xb3\\xad\\xa4\\xb2\\x94\\x0c\\xb6\\x35\\xe6\\xdc\\xdc\\xbc\\x2f\\x9b\\x0f\\x77\\xe1\\x83\\x31\\x75\\x09\\x03\\x56\\x3e\\x74\\x7f\\xa3\\xa3\\xb2\\xd7\\x43\\x7a\\x52\\x4e\\x89\\x9e\\x94\\x3d\\x36\\xb5\\xde\\x9e\\x85\\xbd\\x2d\\x49\\x8f\\x4a\\x08\\x90\\x5f\\x22\\x65\\x4a\\x18\\xb2\\x25\\xf6\\x77\\xec\\x91\\xa8\\x75\\x88\\x9d\\x4e\\x11\\xcb\\xda\\x0c\\x81\\x45\\xd2\\x68\\xf3\\x31\\x37\\x42\\xc0\\xa6\\x6d\\x62\\x51\\x86\\x85\\xc3\\xb5\\x2d\\x6e\\x2f\\xb7\\x5e\\x76\\xd5\\x3e\\x64\\x8f\\xb8\\x0c\\x06\\x92\\xa7\\x21\\x7e\\xa1\\x66\\x33\\x8c\\xf3\\xe8\\xfa\\xe6\\x03\\xe4\\x81\\x12\\x9d\\xb7\\xcd\\x77\\xf6\\x3c\\xad\\x45\\x88\\xa0\\x58\\xe5\\x2e\\x73\\x7c\\x63\\x44\\x91\\x06\\x51\\x69\\xb9\\x80\\x08\\x27\\xcd\\xad\\x21\\xd0\\xf4\\xfe\\x6c\\xba\\xd5\\x5d\\x6f\\x1b\\x21\\xbe\\xf5\\x34\\xf0\\x3b\\xae\\x7a\\xb9\\xae\\x6d\\x95\\xfb\\xa3\\x3e\\xb6\\x26\\x9a\\xbb\\x44\\x07\\x75\\x1d\\xef\\xac\\xdf\\xc9\\xf1\\x5a\\xfa\\x61\\xc1\\x66\\x78\\x9f\\x68\\x12\\x6c\\xfe\\x47\\x47\\x84\\xf7\\x47\\xde\\x1b\\xd6\\xf5\\xfe\\x24\\x54\\xab\\x0b\\x7b\\xdf\\xf6\\x0f\\xbe\\x45\\x55\\xf5\\x03\\x4f\\x1c\\x5b\\x07\\xba\\x81\\x1f\\x78\\x02\\x47\\x91\\xcd\\x4e\\x7c\\x84\\x07\\x05\\x9d\\xe8\\x61\\xa1\\xfd\\x12\\xce\\x11\\xe5\\x9b\\xb6\\x23\\x8a\\xeb\\xd6\\x7d\\xcb\\x8f\\xe2\\xa1\\xf5\\x16\\x1c\\x64\\xf9\\x94\\xb7\\x48\\xe8\\x80\\xea\\xdc\\x12\\xb5\\x94\\x85\\xe6\\xeb\\x37\\x2e\\x94\\x60\\xa3\\xf4\\x33\\xbc\\xff\\x43\\xca\\xab\\x46\\x5f\\x53\\xca\\xb5\\x8a\\xbd\\x8b\\xfe\\x14\\x37\\x8a\\x1b\\x5f\\xb4\\x5a\\x52\\x65\\x15\\x30\\x35\\x2f\\xfd\\x5c\\x5b\\x1c\\xb8\\x47\\x9d\\x8e\\x7f\\x7e\\x00\\xf9\\xd1\\x56\\x77\\x4c\\xa9\\xba\\xdf\\x55\\xef\\x48\\xd4\\xdc\\xfc\\xc3\\x43\\x4f\\xef\\xe3\\xe1\\x67\\x6b\\x6f\\xef\\x4e\\x47\\x80\\x8f\\x93\\x73\\x45\\x1d\\xc3\\xdb\\x8d\\x96\\x70\\x25\\x81\\xbb\\x2e\\xf4\\x9b\\xf6\\x44\\x36\\xaf\\x6f\\xe5\\x46\\xd7\\x67\\xaf\\x5c\\xa3\\xdf\\x35\\xf1\\x70\\x9a\\xb8\\xed\\x7c\\x4f\\xea\\x6c\\x8b\\x66\\xe0\\x3c\\xb5\\xad\\x1a\\xc7\\xd2\\xee\\x3f\\xde\\xbd\\xfe\\xd1\\xc5\\x0f\\xe7\\xf3\\x07\\xef\\x66\\x29\\xc8\\x77\\xd6\\x93\\xb6\\x71\\xa9\\x16\\x46\\xe4\\x83\\x06\\xbf\\x13\\xba\\x48\\xac\\x86\\xf4\\xa5\\x2c\\x57\\xd4\\x46\\xf5\\xc0\\xdf\\xd9\\x60\\x2e\\xf6\\xba\\x02\\x51\\x81\\x0a\\xc7\\x80\\x02\\x0a\\x78\\xf6\\xed\\x25\\x27\\x5b\\xa7\\x30\\xd6\\xe4\\xfa\\x83\\x3d\\x7a\\x1a\\x45\\x5d\\x8d\\xe1\\xb6\\x56\\x9e\\x05\\x8a\\x22\\xd0\\x23\\x38\\x48\\x47\\xfd\\x68\\x74\\x68\\x7a\\x68\\x82\\x64\\x4a\\xb8\\xd3\\xc9\\x79\\x88\\x12\\x0d\\xde\\x81\\xfe\\x6a\\x89\\x41\\xb3\\x7d\\xd5\\x6a\\xf5\\x3a\\x26\\x38\\x9f\\xf4\\xa7\\x56\\xdf\\x8f\\x70\\x90\\xc8\\x6b\\xda\\xe0\\x73\\xd1\\x28\\x66\\x57\\x03\\xd6\\x7b\\xbc\\xdb\\xb1\\xeb\\x01\\x1b\\x5c\\xc0\\x35\\x60\\x24\\x52\\x19\\x67\\x42\\xf3\\x39\\xcf\\x22\\x84\\x15\\x39\\x12\\xde\\xaf\\x56\\x80\\x5e\\x3f\\x1a\\xb3\\xc9\\xd0\\x55\\xd8\\x63\\x13\\x5f\\x77\\xda\\x3c\\xf6\\x58\\xdd\\x9f\\x51\\xd3\\x1d\\x74\\x3d\\xe8\\x74\\xf4\\x29\\x69\\x9d\\xf4\\x43\\x10\\x08\\x5f\\xf7\\x5a\\x69\\xfb\\x3e\\xf4\\x95\\x37\\x78\\xbc\\xd1\\xcd\\x98\\x15\\xb8\\xec\\xb4\\x61\\x61\\x36\\xd7\\xde\\xe0\\x2c\\xa8\\x8c\\x22\\x3c\\xec\\x23\\xdc\\x47\\xb8\\x20\\x5b\\xe1\\x6e\\x73\\x4f\\x25\\x5e\\x71\\xc1\\x57\\x9b\\xd5\\xcb\\x92\\xc2\\x40\\x5f\\xf0\\x05\\xd7\\x2a\\x2d\\xf1\\xca\\x86\\x5b\\xd8\\x4f\\xdf\\x0f\\x9c\\xe1\\x78\\xd4\\xa2\\x45\\x1c\\xe0\\x40\\x9c\\x72\\xd8\\x82\\x30\\x60\\xb1\\xc0\\x05\\xaa\\x70\\x21\\x17\\xb4\\xe4\\x7a\\xb9\\xfa\\x6b\\xa8\\x71\\x5e\\x1f\\x00\\x1f\\xf4\\x71\\x30\\x98\\x37\\x06\\x07\\x1b\\xe8\\x0c\\x6c\\x64\\xa3\\xa1\\xfd\\xb9\\x30\\x3f\\xe3\\x97\\x3c\\x71\\x38\\x98\\x64\\xb4\\x28\\xec\\xad\\xc0\\xb6\\x49\\x50\\xde\\x42\\x98\\xdc\\x9f\\x39\\xd9\\xda\\x5e\\x6a\\x56\\xaa\\xf4\\x25\\x0f\\x62\\x97\\x7d\\x75\\xe0\\xfc\\xd8\\x1a\\x1d\\x58\\x69\\x56\\xf4\\xfe\\xbd\\x79\\xf9\\x81\\xaf\\xb8\\x0e\\xc2\\xdd\\xb6\\xa2\\xa2\\xf8\\xcf\\x6c\\x5c\\x1e\\xeb\\xe7\\x65\\xaa\\x80\\x48\\x16\\xc8\\x6a\\x20\\x2d\\x46\\x9d\\xf3\\x6e\\xcc\\xc6\\xfd\\x74\\x60\\xe3\\xda\\xdc\\xac\\xe8\\xfd\\x0f\\x2e\\xa3\\x75\\x5d\\x53\\x78\\x08\\x12\\xb8\\x28\\x89\\x20\\xd8\\x11\\xf8\\xb9\\xae\\xe8\\x7f\\x64\\xe9\\xc4\\xf8\\x7c\\xfc\\xf9\\x80\\xb1\\x9f\\x0a\\x53\\xc9\\xbb\\x5d\\xa4\\x27\\x7c\\x6a\\x2b\\x03\\xfe\\xcc\\xec\\xf5\\x3c\\x0c\\xf2\\xca\\x50\\x0a\\x2a\\xd2\\xda\\xea\\x44\\x89\\x9c\\xf4\\xa7\\xb8\\x24\\x72\\xa2\\x7a\\x83\\x29\\x2e\\xdc\\x75\\x50\\xea\\xba\\x26\\xb0\\x6d\\x5d\\x5a\\x70\\x8f\\x81\\xbd\\x8a\\x68\\xd2\\x9f\\x3a\\x43\\x83\\x0d\\x4f\\xc0\\x78\\x11\\x0b\\x33\\xaa\\xfe\\xa8\\xb9\\x39\\x1b\\x6e\\xa9\\x95\\xf6\\x7a\\xa6\\xd8\\x75\\x4c\\x4f\\xe4\\x14\\x61\\xd5\\xed\\x42\\x2d\\xea\\x4c\\x4c\\x91\\xa1\\x58\\x05\\x96\\x58\\x9d\\x0b\\x84\\x8b\\x5a\\x4f\\xb1\\xaf\\xcd\\xf3\\xa8\\x76\\x7c\\xea\\x02\\x17\\x5d\\x03\\x2d\\x3e\\x8f\\xd9\\xd5\\xb0\\xd1\\x75\\xdb\\xbe\\xba\\x80\\x5c\\x83\\x11\\x07\\xa7\\x02\\x0e\\xf1\\xd2\\x5c\\x14\\xcb\\xde\\x60\\x7a\\xda\\xdc\\x96\\xdc\\x5c\\xe2\\x24\\xdc\\x74\\x79\\x5a\\x72\\xce\\xdb\\x77\\xd0\\xd5\\xab\\x59\\xe2\\x41\\xe3\\xdb\\xf0\\x5a\\xc7\\xa2\\x7d\\x0f\\x13\\x0b\\x8f\\x70\\xe8\\x2b\\x06\\xc7\\x11\\xeb\\x01\\xa8\\x89\\x86\\x19\\x60\\xd7\\xb2\\x3e\\xf2\\x59\\x1d\\x6b\\xa1\\x8a\\x25\\x04\\x6a\\xb1\\xd3\\xd5\\x77\\x17\\x1a\\x62\\x5e\\xaf\\x44\\x75\\x3d\\x18\\x87\\x97\\xac\\x96\\x3d\\x8a\\xce\\x63\\x05\\xa1\\x1a\\x80\\xbb\\x30\\x9d\\xfa\\x85\\x03\\xcc\\x33\\x0c\\x01\\x7a\\xfa\\x29\\xed\\x09\\x4c\\x11\\x76\\x77\\xc9\\x41\\x07\\x39\\x74\\xb0\\x2e\\x08\\x37\\x46\\xc9\\x89\\xee\\x0e\\x9a\\xb3\\x9c\\x75\\x66\\x89\\x5d\\xa0\\x1f\\x3b\\xc0\\xb4\\xec\\x9a\\x99\\xac\\xf6\\x8a\\x99\\xa4\\x7a\\xcd\\xfe\\xc2\\x8f\\x5d\\xb9\\xf6\\x7d\\x2c\\x70\\xbf\\x09\\x9a\\xcf\\x45\\xfc\\x7d\\x2c\\xb1\\x9f\\x5d\\xd4\\x3c\\x85\\xbe\\x0b\\xee\\x3a\\x7a\\x1e\\xa0\\x22\\x07\\x0f\\xa3\\xb8\\x24\\xb2\\x27\\x30\\x27\\xe5\\x79\\xb0\\x18\\xcb\\x73\\x8e\\x10\\xce\\x88\\x1a\\x65\\x57\\xfd\\x11\\x5a\\x76\\xbb\\xd8\\xdd\\xde\\x69\\x21\\xa6\\xba\\xcb\\x33\\xee\\xe6\\xae\\xa1\\xd5\\x0a\\xf7\\xd1\\xa8\\xb8\\xa2\\xa3\\xa2\\xdb\\x45\\xe0\\xb2\\x12\\xe2\\x74\\x31\\x45\\xf8\\x13\\x15\\xa1\\xfa\\xa0\\x29\\xb8\\x0b\\x46\\xb8\\x0e\\x5f\\x75\\xda\\x77\\xf7\\x0d\\xa7\\xa7\\x03\\xec\\x7c\\xee\\xcd\\xe3\\x8c\\x2d\\xb8\\x78\\xae\\x7f\\x63\\xa5\\x84\\x57\\xb0\\xa5\\xa6\\x11\\xd0\\xb2\\x08\\x2f\\x4a\\x9a\\xb1\\xb4\\x8f\\x17\\x25\\xcf\\xd3\\xb0\\xae\\x82\\x0b\\x17\\x88\\x77\\x00\\x61\\xbb\\xbf\\x82\\x03\\x94\\x26\\xc7\\xbc\\xbd\\x16\\x5f\\xd7\\xc1\\x8f\\x5d\\x12\\xd0\\x43\\xf3\\x62\\x6a\\xb6\\xd4\\x2b\\xbd\\x84\\x17\\x5b\\x4d\\x1d\\x52\\xb8\\xae\\x19\\x32\\xe1\\x34\\x67\\x93\\x09\\x67\\x12\\x83\\x81\\xd8\\x73\\x9b\\x2f\\xa8\\x5a\\x1a\\xa2\\xd3\\xbc\\xbd\\xb6\\x25\\xfa\\x38\\x38\\xd8\\x99\\x0e\\x2a\\xac\\xb9\\x0e\\x63\\x7a\\x19\\xe6\\x95\\xdd\\x1b\\xd6\\x04\\xb7\\xe2\\xa8\\x3f\\xf6\\x76\\xa7\\xc7\\x55\\x05\\xdd\\x50\\xe9\\x76\\xc5\\xc5\\x5b\\xbf\\x3d\\xf6\\xcd\\x36\\x58\\xbf\\x5d\\xf4\\xf1\\x8a\\x97\\xa5\\x2c\\x7d\\x7d\\xef\\x74\\x29\\x3f\\x3a\\xf0\\xf4\\x83\\x14\\x3b\\x98\\xa0\\xb1\\x47\\x38\\x00\\x29\\xdd\\x68\\xf9\\xee\\xe3\\xff\\xcd\\xde\\xbb\\x36\\xb9\\x6d\\x63\\x8b\\xa2\\x7f\\xa5\\x5b\\x95\\x68\\x08\\x0b\\x62\\xab\\xbd\\xcf\\xcc\\x3e\\x87\\x32\\xac\\xf2\\x23\\x4e\\x9c\\x38\\x89\\x63\\x3b\\x33\\x49\\x54\\x2a\\x1d\\x36\\x09\\xb5\\x30\\x61\\x03\\x0a\\x09\\xb5\\xa5\\x48\\xfc\\xef\\xb7\\xb0\\x16\\x00\\x82\\x14\\xd5\\x76\\xf6\\xde\\xf7\\xc3\\xad\\xba\\x5f\\xba\\x45\\x10\\x00\\xf1\\x5c\\xef\\x87\\xd8\\x84\\xbf\\xdf\\xfa\\x8a\\xa0\\xad\\xf4\\xd3\\xca\\x9c\\xc3\\xe9\\x3f\\x45\\xdc\\x20\\x2a\\x6b\\xd1\\x60\\x70\\xb7\\x2a\\x93\\x43\\x4d\\x01\\x4c\\x9b\\x1f\\x69\\x21\\x6e\\x65\\x32\\xc8\\x6c\\xb8\\xd0\\xac\\x54\\x55\\xf5\\x0c\\xcb\\xd0\\x55\\xb3\\x5a\\xab\\x8f\\xa0\\xd4\\x7c\\x9e\\x66\\xbf\\xe7\\xa5\\xda\\xc0\\xea\\xda\\xdf\\x76\\xdc\\xe5\\xed\\x4d\\x1a\\x3d\\xfe\\xfb\\xdf\\xe9\\x45\\xf3\\x67\\x12\\xff\\xe7\\xdf\\xc9\\xc0\\xd7\\x74\\xe3\\x7d\\x6c\\x1d\\x66\\x4b\\x05\\xb1\\xd7\\xe0\\x30\\xc6\\xf6\\x4c\\x79\\x0f\\x5e\\xff\\xf3\\xb4\\xaa\\x39\\x6f\\xed\\x9a\\xa1\\xbb\\xef\\xd9\\xfa\\x6d\\x9f\\xe0\\x4f\\xb6\\x82\\xd3\\x70\\x76\\x40\\x8d\\xb3\\xaf\\xbb\\x4b\\x6d\\x57\\xe8\\xb6\\xf3\\xf3\\xa5\\x46\\xad\\x64\\xf5\\x2f\\xa1\\xd7\\xd1\\x00\\xa3\\x68\\x0f\\x08\\x24\\x29\\x0c\\x5f\\xa4\\x2b\\xb3\\x03\\x64\\x38\\x1c\\xb8\\x3d\\x74\\x9e\\xd1\\xc0\\x77\\x97\\xf0\\x14\\xfa\\x59\\x6b\\xf6\\x74\\xd0\\x1c\\x6c\\x57\\xd9\\xac\\xe5\\xf3\\x76\\x69\\xd7\\x45\\x19\\x0d\\x86\\xdb\\xee\\xc9\\x38\\x13\\xef\\x11\\xfe\\x4d\\x10\\x3a\\x0a\\x62\\x27\\xa3\\x37\\x12\\x06\\x4e\\x36\\xbf\\x67\\x7a\\xce\\x17\\x23\\x91\\x98\\x7f\\x63\\xd1\\x10\\x41\\x3f\\xf4\\x7b\\x75\\x59\\xa4\\xc5\\xad\\x5a\\xd9\\x23\\xc9\\xca\\x42\\xcd\\x69\\xf5\\x44\\x4d\\xab\\x11\\x93\\xce\\x85\\x4b\\xcf\\x03\\x58\\x59\\x91\\x45\\x9f\\x23\\xd7\\xbf\\x7b\\x42\\x9e\\x22\\x21\\x69\\x09\\x8c\\x40\\x70\\xc4\\xa9\\x1c\\x5f\\x13\\xc8\\x41\\x81\\x41\\x13\\x20\\x56\\x18\\x4d\\xcd\\x33\\x97\\x39\\x3e\\x95\\xec\\x9a\\x8f\\xff\\xe1\\x8c\\x1e\\xd1\\x8e\\x04\\xde\\xbc\\x52\\xa5\\x01\\x53\\x2e\\x96\\x67\\x24\\x20\\x8f\\x20\\x50\\x91\\x33\\x0f\\x9b\\xb3\\x71\\x45\\xd3\\x71\\x46\\x12\\x70\\x25\\xb1\\xf9\\xfc\\x5a\\xcd\\xaf\\xc9\\x38\\x23\\x57\\x8f\\x93\\x28\\x1b\\xf7\\xf4\\x6d\\x70\\xe3\\xd5\\x63\\x9a\\x8d\\x98\\x7a\\xc2\\x67\\x45\\x32\\x2e\\x68\\xf6\\xa4\\x1a\\x97\\xc7\\x63\\xf6\\x34\\x1d\\x95\\xc4\\x67\\x47\\x0a\\xf2\\x71\\x7c\\x21\\x42\\x7d\\x54\\xec\\xe1\\xe9\\x0c\\x57\\xc2\\x82\\xd3\\x20\\xf5\\xee\\xaf\\xa2\\xf1\\xf7\\xd5\\x2e\\x06\\xa1\\xeb\\x78\\xe2\\x19\\xc3\\x57\\x3c\\xc2\\xbc\\x5c\\x98\\xef\\x17\\x32\\x12\\xb8\\x14\\x04\\x2e\\xd6\\xce\\xaf\\x91\\x8e\\x0d\\x08\\x23\\x33\\xfc\\xef\\xd0\\xee\\x35\\x79\\x24\\x82\\x04\\x57\\x23\\x97\\xf9\\x26\\x48\\xb6\\xe3\\x37\\x0e\\xed\\x7e\\x65\\x63\\x7c\\x61\\x96\\xd6\\x06\\xe5\\xc6\\x50\\xb9\\x97\\x4d\\x01\\xb8\\x06\\x01\\xd7\\x65\\x38\\x6b\\x7f\\x16\\xf5\\xcc\\xbe\\x4f\\x9a\\x7a\\x7a\\x86\\xaf\\x13\\x4d\\x22\\x05\\xbc\\x35\\x4a\\x33\\x7e\\x69\\x82\\x53\\x76\\x04\\x1b\\x9a\\x1c\\xaa\\xed\\x86\\x97\\xce\\x0b\\x46\\xe4\\x4c\\x83\\xb6\\xce\\x3c\\xa0\\x47\\xcc\\x27\\x5c\\x60\\x3a\\xbe\\x38\\xd6\\x51\\xc7\\xaa\\x6a\\xb0\\x1b\\xb5\\x69\\xb5\\xb0\\xae\\x54\\x61\\x11\\xe4\\x17\\x09\\x0b\\x30\\xcf\\x48\\x58\\x82\\x01\\x05\\xc3\\x12\\x1b\\x7b\\xb1\\xe5\\x22\\x83\\x69\\xe7\\x2b\\x9f\\x34\\xc7\\xe5\\xff\\xc0\\x6c\\x20\\x3e\\x69\\x0e\\xd6\\x76\\x09\\xbe\\x5b\\x5d\\xf8\\xb4\\xde\\xad\\x52\\x7b\\x0a\\x3e\\x74\\xa6\\x62\\x8b\\x9f\\x9f\\xce\\xc8\\xbe\\x79\\xd3\\x9d\\x98\\x2d\\x7f\\x77\\xf2\\x05\\xf0\\x02\\x6b\\xad\\x89\\x41\\x3f\\x0e\\xa9\\xb6\\x87\\x28\\x64\\x77\\xc8\\xed\\x55\\x28\\x53\\x79\\xcb\\x5b\\x45\\x00\\x20\\x0c\\x58\\xc2\\x0a\\x06\\x3f\\xbc\\x11\\x92\\xbf\\xd6\\xfc\\x0e\\xad\\x05\\x5d\\xdc\\x1c\\xf3\\xd1\\xfe\\x52\\xc3\\x87\\xb5\\x4b\\xe1\\xe0\\xb3\\x66\\xe9\\x2d\\x17\\xe6\\x4b\\x0a\\x25\\x6f\\x79\\xa5\\x3f\\xf0\\x9d\\x7e\\x91\\x66\\x6b\\xde\\xf8\\x62\\x35\\xb0\\xa8\\x3d\\x70\\x07\\x93\\x3a\\xd3\\x09\\x53\\x51\\x37\\xae\\x56\\xdb\\x8a\\x97\\xdf\\x77\\xa7\\x0e\\x85\\x9d\\xf5\\x59\\x56\\xdb\\x5b\\x33\\x10\\x9e\\x9f\\x54\\x6f\\xde\\x74\\xdb\\xc0\\x8a\\x75\\x26\\x84\\x78\\x07\\x64\\x6c\\xbe\\x2c\\x6b\\xcf\\x2c\\x4f\\x75\\x0a\\x6c\\x6e\\x05\\x53\\xce\\xcf\\xb9\\x62\\x81\\xe3\\x55\\x57\\xc7\\x30\\xf5\\x76\\x44\\x0c\\xc8\\x56\\xa7\\x0c\\xe4\\x1d\\x7b\\x78\\x34\\xdd\\x64\\x68\\x4a\\x46\\x79\\x33\\x6b\\xa7\\x20\\x00\\xbb\\x4a\\xe2\\xdf\\xa4\\xbb\\xf0\\x4d\\xba\\x43\\x7f\\xad\\x70\\xea\\xcd\\xeb\\xb0\\xb8\\x53\\xaf\\xd5\\x4d\\x58\\x4c\\x42\\x23\\x7c\\x07\\x96\\xeb\\x8e\\x39\\xa2\\x81\\x7a\\x07\\x37\\xd2\\x44\\x53\\x37\\xb4\\x84\\xd3\\xd6\\x58\\x12\\x41\\x5b\\xdf\\x04\\xd7\\x54\\xb3\\x38\\xde\\x79\\xe7\\x8f\\x48\\xd3\\x73\\xb6\\x8a\\x84\\x72\\xf6\\x47\\xc4\\xe9\\x39\\x63\\x47\\x42\\x05\\xfb\\x23\\x12\\x0f\\xb4\\x97\\xec\\x8f\\x48\\x3e\\xd0\\x1e\\xec\\x29\\xff\\x40\\xab\\xad\\xbb\\x74\\x97\\xfc\\x01\\x3a\\xbc\\xd0\\x32\\xf3\\x17\\xc3\\xb4\\x06\\xc6\\x99\\xbf\\x44\\x9c\\xd4\\xa1\\x29\\x6b\\x67\\xd7\\x91\\x6f\\x46\\x3b\\x4d\\x34\\xc6\\x0c\\x7b\\xab\\xc2\\xae\\xd2\\x1a\\x1d\\x2c\\x5a\\x76\\x9e\\x86\\x1b\\x1d\\x0e\\x53\\x12\\xda\\x7b\\x62\\x3f\\x4e\\xe6\\x59\\xb2\\xf3\\x7e\\xc7\\x0d\\xa7\\x5c\\xb0\\x09\\x64\\x4c\\x71\\x94\\xca\\x93\\x0c\\x8c\\xff\\x05\\x2b\\xe7\\xc5\\x22\\x6e\\x52\\xce\\xc7\\xcd\\x54\\x30\\x1b\\x2e\\x08\\x49\\x43\\x6d\\x15\\x1c\\x3f\\x42\\xd3\\xe3\\x31\\x52\\x2c\\x60\\xa1\\x41\\x14\\x44\\x5a\\x96\\xa9\\x66\\xb1\\xff\\x88\\x14\\xc8\\x4f\\x71\\x39\\x15\\xfd\\xc3\\xca\\x6a\\xea\\x30\\x0d\\x5c\\x3b\\xb2\\x94\\x33\\x5a\\x34\\x60\\x5e\\x87\\xd0\\xf6\\x78\\x44\\x68\\xaf\\x03\\x98\\x6d\\xca\\x10\\x13\\xe8\\x16\\x00\\x36\\xe5\\x16\\x27\\xe8\\x36\\x2c\\x3f\\x1e\\x27\\xf0\\x75\\x20\\x2b\\x3a\\xde\\x6b\\x00\\x19\\xea\\xc0\\x07\\xa1\\xad\\x83\\x6c\\x5c\\xe2\\xa6\\x61\\xab\\x26\\xb3\\x91\\x69\\xe4\\xf4\\xe8\\xed\\x6c\\x41\\x33\\x1d\\xef\\xb0\\xd3\\x44\\xc7\\x7b\\xfc\\x45\\x8e\\x47\\xed\\x1b\\xcd\\x17\\x75\\x3b\\x1f\\xcd\\xe1\\x73\\x81\\x90\\x6d\\x87\\x1e\\x4b\\x11\\x39\\xfc\\x14\\xb5\\x46\\x15\\xbe\\xa5\\xe0\\xc1\\xb7\\x20\\x0f\\xc4\\x33\\x03\\xad\\x62\\x5b\\xce\\x57\\x31\\x15\\x57\\xe9\\xdd\\xa6\\xe0\\x06\\x51\\x4c\\x65\\xdc\\xfe\\x20\\x95\\x0d\\xba\\xd5\\xf8\\x60\\xd1\\x2c\\xa7\\xb2\\xc1\\xdb\\x27\\xe1\\x53\\x3e\\x81\\xc7\\x85\\xe9\\x18\\x91\\x1b\\x60\\x26\\x79\\x8a\\xac\\x64\\x2f\\xba\\x93\\xa7\\xb8\\xce\\x0d\\xf9\\x3d\\xd7\\x2f\\xc5\\x1d\\x86\\x3a\\xaa\\x60\\xe4\\xd5\\x49\\x09\\xb0\\x2d\\xa7\\x15\\x03\\x24\\x28\\xbb\\x7b\\x6b\\x33\\x20\\x8e\\x04\\xa6\\x3e\\x11\\xb1\\xb3\\xeb\\x44\\x3a\\x66\\x24\\x20\\x01\\x8a\\x70\\x96\\xa8\\xf2\\x74\\x1b\\xc1\\xfc\\x0c\\xc7\\xf8\\xd2\\xbf\\x82\\xef\\xe6\\x5c\\xf3\\xf2\\x4e\\xc8\\x6e\\x39\\x0c\\xb3\\x53\\x66\\xa9\\x83\\xe7\\x3c\\x92\\xb4\\xd9\\x44\\x90\\x6c\\x90\\xbe\\xaf\\x32\\x48\\x40\\x65\\xbf\\xfb\\x7c\\x2b\\x8a\\xdc\\x5e\\x8a\\x66\\xe5\\xe3\\x9b\\xa0\\x18\\x4c\\x42\\xed\\xa7\\xc3\\xea\\xde\\x0b\\xa1\\x7a\\x22\\x5b\\x0c\\xcb\\x54\\xc6\\xcb\\x4c\\xc9\\x7b\\x5e\\xe2\\x75\\xfb\\xa0\\xec\\xc5\\x4a\\x67\\x3f\\x88\\x48\\xba\\xf3\\x45\\x12\\xfb\\xd3\\x7c\\x38\\xb4\\x14\\x76\\x63\\x7b\\x91\\x16\\xd9\\xb6\\x48\\x35\\x7f\\x13\\x52\\x4e\\x50\\x21\\x3b\\xff\\x0a\\xc6\\x79\\xb6\\xa9\\x72\\xcc\\x82\\x21\\xc0\\x63\\x27\\x86\\x38\\x1e\\x07\\xe6\\xe7\\x00\\x7c\\xc2\\x2a\\xb5\\x2d\\x33\\xa0\\xd0\\xdd\\x7a\\x3c\\x17\\xb0\\xb4\\x7e\\xb0\\xdd\\x23\\x49\\x68\\x0a\\x1e\\x06\\xbd\\x93\\x0e\\xda\\xe1\\xb4\\x5e\\x09\\xb4\\xe8\\x5b\\xd9\\xff\\x30\\xe0\\x57\\xe1\\x83\\xbb\\x63\\x67\\xbd\\xf8\\xa6\\xde\\x18\\x3a\\x90\\xb3\\x5b\\xaa\\x6a\\xaa\\xbb\\x07\\x35\\xe2\\xd6\\x08\\xba\\x31\\x91\\x26\\x49\\xcb\\x6c\\xda\\x1d\\x51\\x76\\x29\\x9d\\x2f\\xab\\x23\\xe7\\x38\\x0d\\x58\\x4b\\x26\\xcc\\x53\\x9b\\x7c\\x93\\xd4\\xcb\\xf1\\x99\\x18\\x43\\x75\\x90\\xc6\\x7c\\x50\\xb6\\x42\\x33\\xc2\\x56\\x79\\xdd\\x9a\\x6a\\x17\\x7e\\x05\\x2f\\x3d\\xf8\\xea\\xbd\\xcd\\xfd\\x80\\xaf\\x55\\xc9\\x77\\xd0\\xb9\\xf6\\xdd\\xd0\\x86\\xdd\\x65\\x73\\x91\\xe7\\xb5\\x87\\x74\\x2e\\x9d\\xeb\\xc4\\xe7\\x64\\x75\\x49\\x7b\\x92\\x28\\x08\\x3e\\xef\\x61\\x21\\xc5\\xd4\\xb0\\x93\\x26\\xcf\\xab\\xab\\x65\\x96\\x39\\x64\\x29\\x26\\x34\\xc4\\x6f\\xe1\\x23\\x72\\x16\\x41\\x81\\x65\\x4e\\x26\\x75\\x1f\\xcc\\xea\\x5d\\xc7\\xfe\\xd5\\x58\\x66\\x69\\x51\\x7c\\xa3\\xd4\\xef\\x27\\xa6\\x31\\x53\\x6e\\x91\\x1e\\x06\\x0c\\x7c\\x5b\\x6c\\x0d\\x2c\\x37\\x78\\xa3\\x43\\xb7\\xfe\\xd4\\x18\\xca\\xcf\\xf5\\x82\\xce\\xb9\\xdf\\xa5\\x10\\x46\\x79\\x9c\\xe6\\x3e\\x37\\xe8\\xd6\\x19\\x90\\xba\\x17\\xe2\\x1d\\xea\\x13\\x80\\x77\\xda\\x59\\xa7\\xca\\xc0\\x0d\\x21\\x84\\x55\\xe7\\x86\\xd0\\xd4\\x19\\x58\\x27\\xe0\\x36\\x81\\x30\\x5f\\xd4\\x27\\x70\\xef\\xcc\\x08\\xda\\x5d\\x41\\xef\\xe6\\xc9\\xc2\\x81\\x17\\x00\\x1a\\x2a\\xcc\\x09\\xd9\\x7b\\x64\\x7b\\x2b\\xfb\\xcd\\xba\\xe5\\x92\\x97\\xa9\\x86\\x5a\\x16\\xb0\\xf4\\xd9\\x33\\xb5\\x50\\x78\\xaf\\x1b\\x8b\\x0e\\xdd\\x58\\xe4\\x68\\x44\\x2a\\x06\\xb9\\x8d\\x2d\\x21\\xc3\\x7e\\x8a\\x44\\xec\\x24\\x77\\x74\\x6e\\x45\\xae\\x54\\x52\\xbd\\xa0\\x36\\xb8\\x18\\xa6\\x0e\\xc2\\xc6\\x5f\\x40\\x62\\x64\\x6c\\x4a\\xc0\\x2b\\xdc\\xda\\xcb\\x48\\x7a\\x4d\\xa8\\x1a\\x8f\\xa9\\x1c\\x8f\\x09\\xae\\xe1\\x67\\xae\\xc6\\xf9\\xba\\x1d\\x40\\x70\\x0e\\xc6\\xf7\\x2f\\x6f\\x7f\\x6d\\xdf\\xe5\\x39\\x84\\x72\\xea\\x48\\xe1\\x42\\xcf\\x99\\xe5\\x76\\x1a\\xd1\\x13\\x81\\x1d\\x10\\xcc\\xae\\x17\\x43\\x95\\x56\\xa8\\x35\\x75\\x45\\x61\\x38\\x26\\xa6\\xa6\\x28\\xc6\\x5a\\x8a\\xca\\x12\\xf2\\x06\\xe9\\x5e\\x06\\xb9\\x35\\xd4\\x53\\x56\\x1d\\x8f\\xf2\\x09\\xbb\\x3e\\x1e\\x2f\\xbb\\x80\\xaa\\x13\\xd1\\xae\\x2d\\x66\\x50\\x4d\\x7a\\x43\\x0c\\x4a\\xf5\\xc6\\xa3\\xae\\x88\\xd0\\x9c\\xad\\x0d\\xfc\\xe2\\x95\\xcb\\xa4\\xb3\\x65\\xeb\\x78\\x2d\\x6e\\xd7\\xa6\\xc4\\x66\\xff\\x58\\xb1\\x1f\\x74\\xe4\\x7c\\xc6\\xa1\\xd6\\x38\\xa7\\x13\\xda\\x00\\x45\\x32\\x4d\\x99\\xcb\\xbe\\x32\\x6b\\x8a\\xaf\\x64\\xb2\\xba\\x8a\\x40\\x5c\\x99\\x8f\\xfe\\xf1\\x14\\x13\\xab\\x43\\x49\\xe4\\x6b\\xc7\\x7f\\x4f\\xae\\x41\\x8b\\x1f\\xc0\\xcc\\xf1\\x17\\x22\\x42\\x81\\x37\\x19\\xfb\\xac\\xbc\\xe3\\x5f\\x4d\\x21\\xc8\\xb3\\x5d\\x1e\\x38\\xbf\\xbf\\x2b\\x25\\xc1\\xcb\\xaf\\x89\\x49\\x9e\\x3f\\xca\\x47\\xdb\\x47\\x5b\\x42\\x33\\xf6\\x5a\\x37\\xfa\\x62\\xb4\\x1c\\xa8\\xdc\\x2f\\x53\\x14\\x75\\xa7\\x3b\\xfa\\x07\\xb9\\x4a\\xa9\\x19\\x54\\x4f\\xed\\xf2\\xaa\\x30\\xaf\\xc6\\xcd\\xab\\xed\\x15\\x18\\x3d\\x67\\x21\\x4f\\xe4\\xab\\x57\\x34\\x23\\xe0\\x22\\xd9\\xde\\x92\\xac\\x7e\\x90\\x44\\xe9\\xbd\\x0f\\x9f\\x38\\xbd\\x01\\x61\\xd1\\x7f\\xfa\\x5f\\x09\\xed\\x2b\\xaf\\x4e\\xa2\\xcd\\x52\\xce\\x6c\\x96\\xb9\\x89\\x4b\\xfe\\x32\\xa9\\xa9\\x0f\\x2b\\xe5\\x8c\\x54\\x0f\\xa8\\x29\\x92\\x56\\xcb\\xa4\\x50\\x6b\\x56\\xd5\\xe8\\x0c\\xdd\\x3e\\xbf\\xb0\\xa7\\xed\\x73\\x6a\\x4e\\x79\\xea\\x3e\\x9c\\xb2\\x5f\\x05\\xf0\\x8f\\xad\\x5d\\x04\\xf3\\xee\\x59\\xc4\\x4f\\x11\\xaf\\xcb\\xf1\\xc2\\xbe\\x10\\x51\\x45\\x46\\xa9\\x21\\x60\\xfa\\x10\\xae\\x6b\\xea\\xaa\\x19\\x5a\\xda\\x11\\x7c\\xed\\x5b\\xea\\x0c\\xb3\\x56\\xa2\\xac\\xcc\\x2c\\x8b\\xb4\\xd2\\x89\\xa2\\x78\\x1d\\x92\\x8a\\xda\\x73\\x61\\x38\\xf4\\x9e\\x9b\\x53\\xb0\\xc7\\x8f\\xa4\\x3b\\x9d\\x34\\x63\\x5f\\xe9\\xee\\xd5\\x23\\x74\\xcd\\x7c\\xb6\\x81\\xcc\\xdc\\x35\\x9f\\xa0\\x20\\xb3\\x3e\\x05\\x5e\\xbd\\x20\\x63\\x54\\xb0\\xcd\\x26\\x49\\xfe\\xc8\\x8a\\x46\\x47\\xeb\\x47\\x2e\\x69\\xf6\\xd4\\x4f\\x35\\x74\\xb4\\x0d\\xe6\\xec\\x38\\x8e\\x51\\x41\\xea\\x20\\xd9\\x4d\\xab\\xe3\\xb5\\xef\\x38\\x0f\\x3b\\xc6\\xe5\\x6a\\xf7\\xeb\\x96\\xdc\\xf2\\x37\\xa6\\x57\\xf0\\x16\\xb3\\x67\\xd0\\x71\\xf0\\x82\\x2a\\x9a\\xd3\\x35\\xa9\\xcd\\xdb\\x75\\x2a\\xf3\\x82\\x7f\\x8f\\x6c\\x9f\\xd9\\xff\\x90\\x7e\\xf2\\xf4\\xa1\\x05\\x20\\xda\\x33\\x88\\x40\\x4f\\x85\\xcf\\xa5\\xa5\\x9b\\x9a\\x6c\\x9f\\x2e\\xcd\\xa7\\xee\\xe4\\xa0\\x09\\x08\\xae\\xa6\\x7f\\x2c\\x0a\\x3b\\xd4\\x6a\\x13\\x3e\\xda\\x24\\xd8\\xf5\\xe9\\x74\\x4e\\xa3\\xe9\\x41\\xd4\\x09\\xab\\x1e\\x45\\x0d\\x63\\xe5\\x55\\x9b\\x69\\x4d\\x5d\\xbe\\xe0\\xa4\\xac\\x1b\\xdf\\x03\\x5a\\x30\\x48\\x64\\xd5\\x3e\\x0c\\x34\\x63\\xa0\\x7f\\xc2\\xd0\\xd4\\x18\\xc4\\x08\\x03\\x21\\x98\\x93\\xd0\\x4d\\x32\\xec\\x86\\x50\\xa2\\xef\\x41\\x4b\\xbf\\x32\\x21\\x63\\x9b\\x8f\\x75\\xcd\\x94\\xcd\\xf1\\x7d\\x5a\\x4b\\xb5\\x8e\\xfa\\xf8\\xda\\xc6\\x4f\\x80\\xa8\\x09\\x93\\x69\\x31\\xcb\\x66\\x51\\xce\\xe4\\xa3\\x06\\xec\\x8b\\x47\\xc1\\x4a\\xe7\\x4c\\x3c\\xf2\\xf0\\x7f\\xcb\\xe4\\x23\\xee\\xa8\\xdc\\x01\\x70\\x06\\x66\\xf4\\xd5\\x6c\\xeb\\x76\\x22\\x19\\x70\\x99\\x63\\x59\\xee\\x08\\x62\\xd3\\x89\\xcb\\xc2\\xf4\\x98\\xfa\\xaa\\x57\\x8f\\x0d\\x0b\\x16\\x12\\xbe\\x1e\\x70\\x46\\xf9\\xb8\\x1c\\xa5\\xe4\\x91\\x72\\xb9\\x9b\\xec\\x8f\\x71\\x09\\xd6\\x5b\\xaa\\x4d\\x0f\\x37\\xcd\\xb6\\xe3\\x75\\x6f\\xb3\\xb5\\x69\\x86\\xb7\\xc1\\xd9\\xaf\\xe1\\x8c\\xae\\x1e\\x03\\xc6\\x76\\x0f\\xd3\\x70\\x4e\\xde\\x28\\xc8\\xad\\x85\\x9f\\x1a\\x98\\xa9\\xb9\\x2e\\xa8\\x64\\xe1\\x90\\x0c\\xc5\\x2e\\x46\\x69\\x53\\x60\\x49\\x74\\x39\\x4a\\xeb\\xba\\x7b\\x33\\x4e\\x02\\xaa\\xdb\\x93\\x89\\x31\\x75\\xc2\\x6b\\x11\\xba\\xcf\\x07\\x4b\\x46\\x3b\\xd5\\x08\\x6d\\x9f\\xf6\\x9e\\x66\\x1f\\xd4\\xa6\\x53\\xa9\\xd5\\xa8\\x6c\\x2f\\x69\\x9b\\xf5\\x38\\xa9\\xd8\\x6a\\x6a\\xd9\\x9a\\xd3\\xb6\\x36\\x8b\\xec\\xe9\\xcd\\xb3\\xd4\\x60\\x2f\\xb2\\x72\\x6f\\x3c\\xae\\x6a\\xdf\\x0b\\x0b\\xb1\\xcd\\xb5\\x49\\x74\\x73\\xfd\\xb8\\x35\\xaa\\x75\\x71\\x7e\\xad\\x41\\x5d\\xa0\\xef\\xb5\\x39\\x71\\xed\\x13\\x86\\x10\\xab\\x45\\xf5\\xca\\x26\\xf8\\xed\\xc8\\x03\\x3d\\x4a\\xb2\\xaf\\xeb\\x7e\\xc6\\xfe\\x94\\x69\\x7a\\x90\\xea\\x07\\xe6\\xa9\\x87\\x88\\xa7\\xfc\\x01\\x92\\x37\\x22\\x75\\x17\\xf5\\xf4\\x08\\x02\\x00\\x02\\xfa\\x2a\\x68\\xdf\\x7b\\xd6\\x80\\x2f\\x14\\xea\\xa1\\x91\\xac\\xc5\\x8b\\x53\\xe1\\xa3\\x05\\x0f\\x87\\x91\\x64\\x3f\\x08\\xf0\\x53\\x80\\xed\\x0e\\x04\\x1e\\xe8\\x4c\\xac\\xee\\x36\\x5b\\x4b\\x8d\\xe0\\xb8\\x24\\x95\\xde\\x92\\xdb\\xdb\\x5c\\xf5\\xd4\\x0b\\xc3\\x56\\xea\\x5d\\x22\\xe8\\x89\\x56\\xc9\\xe9\\x07\\xa8\\x62\\x60\\x68\\x67\\xcd\\xf6\\x2c\\xb5\\x8c\\xf1\\x48\\x30\\x6c\\x01\\xbd\\xa3\\x3b\\x36\\xa1\\x37\\x56\\xfb\\x9e\\xb2\\xc9\\x34\\x05\\x5b\\x34\\x0c\\x5d\\x9a\\x31\\x3d\\x4f\\x2d\\x73\\x42\\xd7\\xac\\xe5\\x94\\x63\\x56\\xfb\\x95\\x6a\\x9c\\x0a\\x21\\xce\\x9a\\xa1\\x41\\x98\\xa1\\x89\\xd1\\x92\\xd8\\x80\\xbe\\x79\\xbe\\x80\\x3f\\xc7\\xe3\\x01\\xe2\\x0d\\x1d\\x6a\\x7a\\x9b\\x25\\xf3\\x45\\x4d\\x57\\x6c\\x1d\\xa8\\x87\\xe9\\x2d\\x33\\x5c\\xfb\\x17\\x51\\x46\\x8e\\xc7\\x5f\\xa3\\x8c\\xc0\\x08\\xe0\\x47\\x13\\x0c\\x26\\x73\\xbc\\x97\\x8b\\x09\\x73\\x07\\xb1\\x7a\\xe8\\x17\\xd1\\x1d\\xb4\\x32\\x7f\\xa3\\x5b\\xf6\\xab\\x8e\\x04\\xdd\\xa2\\x53\\xc7\\x36\\xbe\\xcd\\xe8\\x2d\\xbd\\x23\\x74\\x33\\x62\\x2b\\x84\\x67\\x17\\xbd\\x55\\x32\\x42\\x37\\x6c\\x35\\x55\\x68\\x78\\x70\\x0b\\x5e\\xb1\\xe6\\xd7\\x86\\xd0\\x20\\x10\\xc7\\x2d\\xdd\\x11\\x7a\\xd3\\x3c\\x6f\\xe8\\x0d\\xa9\\x3b\\xd9\\xbc\\xbf\\x8d\\x5a\\x39\\x17\\xcd\\x09\\xba\\xcd\\xc0\\xee\\xd3\\xda\\x3f\\x3c\\x46\\x13\\x65\\x88\\x23\\xfb\\xd4\\x86\\x90\\x45\\x63\\x45\\x09\\xf1\\x6b\\x6d\\x84\\x49\\x14\\x9a\\xcf\\xc5\\x5c\\x2d\\x16\\x53\\xe1\\x38\\xc3\\x09\\x95\\x98\\x2d\\x36\\x92\\x4d\\xfc\\xa2\\x25\\xb3\\xa1\\x52\\x7e\\x5c\\x45\\x3b\\x42\\xf7\\xac\\xf2\\x8f\\x37\\x84\\xde\\x33\\xcd\\x9e\\x46\\x96\\x44\\x55\\x73\\xbd\\x30\\x1c\\x95\\x25\\x54\\x2b\\x7c\\xac\\x9b\\x3c\\xf7\\x40\\xcf\\xdd\\x47\\x13\\x82\\x24\\xdd\\x7d\\xc4\\x0d\\x0f\\x62\\xe9\\xba\\xfb\\x68\\x49\\x3c\\x69\\x77\\x1f\\xed\\x09\\x66\\x37\\xac\\x12\\x65\\x3b\\xac\\x0c\\x41\\x7b\\x12\\x01\\x41\\xb7\\xd5\\x60\\x0e\\xd7\\xda\\x97\\x81\\x96\\xec\\x87\\xf4\\x07\\x53\\x01\\x5e\\xbc\\x52\\x25\\x54\\x04\\xbf\\xfc\\x2e\\x86\\xee\\x86\\x7a\\xc0\\x2b\\xe8\\xd3\\xeb\\x4c\\x8e\\x47\\xfd\\x94\\x7b\\xfc\\x3d\\x93\\xdb\\xa2\\x48\\xbc\\xeb\\x40\\xeb\\xf3\\x7c\\xae\\x9d\\x75\\x77\\xf8\\x95\\x97\\x3c\\x13\\x77\\x69\\xd1\\x03\\xa6\\xda\\x02\\x3c\\x83\\x77\\xd8\\xf5\\x58\\x93\\x20\\x4f\\x61\\x20\\x00\\x1c\\xe9\\x47\\xdc\\xd1\\x57\\x6e\\x78\\xff\\xd6\\x90\\x6e\\x23\\x94\\xe6\\xcd\\x7e\\x31\\x65\\x36\\xa2\\x23\\x9d\\x40\\x26\\x6a\\xc8\\x78\\x07\\x83\\x08\\x57\\xc2\\x0d\\x26\\xd2\\xe3\\xae\\xee\\x98\\x5c\\x85\\x8a\\xe8\\x69\\xc7\\x7f\\x38\\x18\\xf3\\xec\\x7a\\xcc\\x13\\x6e\\x3e\\x00\\xf9\\xe9\\xa0\\xeb\\x36\\x0c\\x3f\\xdd\\x24\\x5b\\x6a\\x1a\\x58\\xa7\\x0a\\x52\\xb7\\x9f\\x83\\xf0\\x2c\\x1a\\x54\\x57\\xbc\\xa3\\xa8\\x7c\\x32\\x81\\x08\\xbd\\x33\\x9e\\x40\\x8c\\x30\\xfe\\x74\\x32\\x33\\x9c\\x52\\xe8\\xe5\\xd9\\x23\\x93\\x81\\x9d\\x85\\x54\\x1a\\x81\\xc3\\xbe\\xe8\\xf8\\xe7\\xdb\\x14\\x8f\\x3e\\xf6\\xef\\xa7\\x3d\\xd4\\xff\\x82\\x4f\\xbe\\x19\\x41\\xe0\\x61\\x8f\\x3e\\xe7\\xa6\\x10\\x1c\\xce\\x79\\xd7\\xa5\\x5e\\x36\\x91\\xdf\\xcf\\x05\\x07\\x88\\x20\\xe5\\xee\\xa9\\x9f\\xba\\x62\\x9c\\x3e\\x34\\x1a\\x49\\xe8\\xa1\\xb2\\x71\\xaa\\x70\\x18\\xce\\x62\\x8b\\x10\\xb0\\x4c\\x97\\x54\\xd5\\x81\\x95\\xf8\\x59\\xf1\\x8b\\x15\\xbd\\x88\\x5e\\xc6\\xcb\\xea\\x2e\\xd3\\x9b\\xaa\\xc9\\xf7\\x66\\x10\\x99\\xea\\x94\\x1b\\x5e\\xcc\\x94\\x57\\x7d\\x1c\\x5e\\xca\\x78\\xdc\\x31\\x53\\x04\\xb5\\x23\\xab\\x66\\x55\\x4b\\x68\\x32\\x4a\\x13\\x03\\xdc\\x4d\\x71\\x47\\x96\\x90\\xfa\\x30\\xe2\\x17\\x27\\xd2\\xe5\\xe2\\x91\\x7c\\x5a\\x3e\\x52\\xb3\\xf2\\x4a\\x26\\xc5\\x95\\x4a\\x8a\\x47\\xea\\x49\\xf9\\x48\\xce\\x8a\\x2b\\x99\\x94\\x57\\xaa\\x0e\\x99\\xe9\\xb6\\x3e\\xd2\\xad\\x80\\xe5\\x6b\\x1d\\xb9\\x03\\x0a\\x8c\\x4b\\xc6\\xf4\\xec\\xf2\\x52\\x7b\\x50\\xd1\\xaf\\x21\\x76\\x9e\\x1c\\x13\\x8f\\xa1\\xbf\\x0e\\x35\\x6a\\xbd\\xc7\\x18\\x4c\\x13\\xfc\\xb6\\x83\\x0d\\xb7\\x63\\x79\\x0e\\x28\\x08\\x68\\x28\\xb2\\xb4\\x66\\x0a\\x22\\xbc\\x59\\xdb\\xff\\x82\\xf1\\xce\\xfc\\x69\\xe6\\x6e\\x86\\xf3\\x4c\\x8c\\xca\\xd9\\x75\\x32\\x31\\x5c\\x33\\xf0\\xee\\x34\\x37\\xd8\\x7f\\xcb\\xaa\\x87\\xec\\x26\\x56\\x6c\\x1b\\x37\\xd6\\xb9\\xb3\\x6d\\x1c\\x9a\\xc3\\x4e\\xe8\\x2d\\x5b\\x5d\\x3d\\xa6\\xed\\x30\\x32\\x76\\x3f\\x7e\\xd1\\x91\\xa4\\x1a\\x62\\xc0\\x19\\x5c\\x76\\x47\\x77\\xf4\\x86\\x2e\\xe9\\x9e\\xde\\xd3\\x8f\\xf4\\x7b\\xfa\\x3b\\x7d\\x4f\\xdf\\xd2\\x97\\x10\\xe8\\xdf\\xd2\\x91\\x29\\xb9\\x63\\x9b\\x88\\x3b\\x32\\x96\\xde\\x33\\xf7\\x7b\\xbc\\xa6\\xdf\\xb3\\xbb\\xf1\\x2d\\x7d\\xcf\\x36\\x11\\x48\\xfc\\xc9\\xe8\\x96\\xbe\\xf4\\x7a\\x15\\x88\\x06\\x78\\x61\\xba\\x6a\\xe8\\x50\\xd7\\x1b\\x90\\xe2\\xef\\xad\\x2a\\xe6\\x25\\xb4\\xb7\\x1f\\x18\\xdf\\xd2\\x7b\\x76\\x37\\xba\\xa5\\xdf\\x33\\xa8\\x36\\x5a\\x37\\xfd\\x38\\x9b\\x31\\xd7\\x8b\\xa5\\xcb\\xf7\\xcc\\xfe\\x1c\\xaf\\xe9\\x47\\x18\\xd1\\xef\\xd0\\x23\\x70\\x09\\xa3\\x5b\\xfa\\xd6\\xa9\\x7f\\x9a\\x9e\\xbc\\xa9\\x99\\xeb\\x0a\\x39\\x8a\\xdf\\x9d\\xc6\\xe8\\x2d\\x74\\x80\\xfd\\x8f\\x6f\\xe9\\x1e\\x46\\xf4\\x91\\x61\\xbd\\x70\\x48\\x40\\x54\\xa3\\x5b\\x8b\\x33\\xc3\\xf5\\xbd\\xe2\\xa2\\x8c\\xfc\\xd4\\xae\\x1e\\x8f\\xe2\\xbf\\x13\\xdf\\xf6\\xe7\\x28\\x25\\xcd\\x19\\x0f\\xe3\\x19\\xa4\\x04\\x7d\\x0c\\x20\\x54\\x09\\x8e\\xaf\\x13\\x2c\\xf6\\x14\\xd0\\x0b\\x42\\xea\\x66\\x41\\xbd\\x6e\\xcb\\xad\\xe5\\xfd\\x68\\x5d\\xfb\\x41\\xef\\x1f\\x1e\\x34\\xcc\\xd1\\xcd\\xfe\\xea\\xf1\\xff\\x9b\\x23\\xde\\xc3\\x76\\x7d\\x64\\xfb\\xf1\\x3a\\x5c\\x7c\\xfb\\x71\\x88\\x74\\xb3\\x63\\x93\\xe9\\x0e\\x4c\\x38\\x76\\xcd\\xb7\\xcf\\x5f\\x8f\\x1d\\x21\\xa0\\xdb\\x6b\\xec\\xcd\\x21\\xf3\\x37\\x18\\x98\\xa7\\xac\\x8a\\x1b\\x9b\\x5b\\x50\\xf0\\x66\\xb0\\x54\\x6d\\xfb\\x72\\x43\\x34\\xc7\\xde\\x84\\x9d\\x6e\\xed\\x13\\x98\\x1b\\xd3\\x95\\x7d\\x7a\\xde\\xee\\xe7\\xf6\\xa4\\x18\\xfb\\x9a\\xde\\xb0\\x7f\\x8b\\x88\\xd3\\x1d\\x2d\\x09\\xf5\\x91\\xfa\\x6f\\x86\\xc3\\x68\\xc9\\xe0\\x32\\xde\\x50\\x41\\x68\\x31\\xdb\\xb3\\x8f\\xec\\x77\\xf6\\x96\\x2d\\x93\\x7b\\xf6\\x3d\\x7b\\xcf\\x5e\\xb2\\x25\\xcd\\x6d\\x46\\x2b\\xbd\\xbb\\x4e\\xf6\\x54\\xef\\xaf\\x93\\x7b\\xaa\\x77\\x8f\\x93\\x8f\\x54\\xef\\x1f\\x27\\xdf\\xd3\\xdd\\x75\\xf2\\x3b\\xdd\\x5f\\x27\\xef\\xe9\\xee\\x71\\xf2\\x96\\xee\\x1f\\x27\\x2f\\x5d\\xd2\\x6a\\x4c\\xe7\\x97\\xa8\\xd0\\x92\\x3e\\x3d\\x35\\xa4\\xcf\\x02\\x4b\\xfd\\xd0\\x30\\x7f\\x4b\\xdb\\x73\\x49\\x56\\xb4\\x6f\\x72\\xc9\\x6d\\x1d\\xe2\\xcc\\x96\\xad\\x59\\x46\\x79\\xdb\\xd0\\xec\\x8e\\xe6\\x6d\\xc6\\xe8\\x33\\x60\\xae\\x87\\xb4\\x1e\\xc4\\x2a\\x6b\\xb7\\x5f\\xd5\\x4c\\x02\\xae\\xea\\xc0\\xd7\\xd2\\xab\\x27\\xac\\xe8\\xaa\\x08\\xad\\xe2\\x33\\x2f\\xc7\\x5a\\x3b\\xdb\\xfe\\xbc\\x66\\x15\\xdd\\x1a\\xe0\\x2b\\x51\\xfa\\x6e\\xa0\\xeb\\x68\\x4d\\x6f\\x59\\x3e\\x1b\\x9b\\x89\\x6f\\xd8\\xf8\\x2b\\x73\\xc6\\x3a\\xc8\\xf6\\xce\\x31\\x68\\xbd\\x10\\x94\\xbe\\xa0\\x3f\\xb2\\xc1\\x9d\\xc8\\xf3\\x82\\x0f\\x42\\x70\\xaa\\xc8\\xc7\\x06\\x80\\x22\\x90\\x33\\x28\\xf8\\x97\\x67\\x3b\\x51\\x61\\x50\\x34\\x33\\x50\\x88\\x12\\x41\\xfa\\x00\\x28\\xb6\\x37\\x60\\xe5\\xb3\\x1b\\x3b\\xa8\\xa9\\x9a\\xeb\\x83\\xed\\x7e\\xed\\x69\\xb7\\x25\\xd3\\xef\\x19\\x5a\\x04\\x43\\xa1\\x61\\x42\\xe2\\x5d\\x7d\\x0a\\x38\\xff\\x47\\x7a\\xeb\\x87\\x9e\\x66\\x8e\\x3d\\xb0\\x73\\x15\\xc0\\x21\\x75\\x06\\x0e\\x29\\x0b\\x87\\x0c\\xb7\\x34\\xfd\\xc8\\x3e\\x0b\\x0a\\x8d\\x56\\xf5\\x83\\x2b\\xf9\\x29\\xb8\\xa9\\xc8\\x3d\\x3b\\x85\\x9a\\xe3\\xbf\\x3c\\xdc\\xfb\\xcf\\x1b\\xae\\x1f\\x6c\\xff\\x82\\x37\\x8b\\x5d\\xdb\\xf1\\x0e\\x87\\x51\\x23\\xeb\\x2b\\x66\\x3f\\xa2\\x48\\xd6\\x8b\\xf8\\x8a\\xe1\\x30\\xfa\\x91\\xb9\\x23\\xe6\\xd3\\xa7\\x3f\\xb3\\x5f\\x09\\x89\\xc3\\xa9\\x85\\xc7\\xf4\\xa6\\xb1\\xae\\xdb\\x3d\\xb9\\x41\\xd0\\xbc\\x64\\xe5\\x7c\\xb7\\xa0\\x7b\\xb6\\xc4\\xab\\x32\\xfd\\x2c\\x58\\x3d\\xfd\\x1d\\x4d\\xfa\\x5a\\x4c\\xe2\\x8e\\x8c\\xac\\x5e\\xd6\\x02\\xe4\\xf7\\x8c\\x9f\\x15\\x61\\xec\\x08\\x7d\\xcb\\xde\\x87\\x32\\x89\\x97\\xec\\xd7\\x68\\x4f\\x66\\x7b\\x6f\\xd2\\xee\\x59\\xbc\\x97\\x56\\x08\\x8a\\xe8\\xa0\\xb0\\x47\\x33\\xf0\\xe2\\x41\\xd0\\xdf\\xf6\\xf5\\xb1\\x29\\x3b\\xc4\\x2a\\x4a\\x67\\xd1\\x3d\\xfb\\x9d\\xbe\\x60\\xfe\\x36\\xcf\\xd0\\xcf\\x86\\x31\\x96\\x1d\\x8f\\x06\\xb2\\x6f\\x66\\xe3\\x97\\x8f\\xde\\x8e\\xde\\x5e\\x3d\\x4e\\x82\\x23\\x92\\xcd\\xc6\\xcf\\x3a\\x54\\xf2\\xd5\\xe3\\xb1\\x30\\x15\\x93\\x93\\x37\\xd8\\xf8\\xa4\\xdf\\x93\\x2e\\xfb\\x7b\\x4c\\xba\\xc5\\x66\\x3c\\x10\\xe2\\xf8\\xc5\\x23\\x06\\x0e\\x7c\\xd1\\x47\\x98\\x43\\x74\\x3d\\x7e\\x49\\x1e\\xbd\\xbd\\x7a\\x4c\\xa8\\x8e\\x4f\\xfc\\x84\\x1a\\xa8\\x0c\\xde\\x03\\x1d\\x47\\x20\\x83\\x62\\x9f\\xd9\\xfe\\x2b\\xb3\\xeb\\x92\\x3d\\x43\\xae\\xc0\\x3c\\xd9\\x78\\xe0\\x1f\\x47\\x2f\\xc6\\x00\\xaa\\x68\\xc5\\xee\\xc7\\x48\\x3a\\x4d\\xab\\x8f\\x42\\x67\\xeb\\xe8\\x47\\x72\\xc8\\xd2\\x8a\\x3b\\x08\\x99\\xa8\\x31\\x13\\x57\\x8f\\x31\\x96\\xe5\\x14\\xde\\xd8\\xf3\\x08\\x6f\\x6a\\xdb\\xea\\x7b\\xdb\\xca\\xae\\x42\\x52\\x8d\\x99\\x6c\\xb7\\xb2\\xae\\x04\\xe6\\x45\\xbd\\xb5\\xd6\\xf3\\x15\\x58\\xdb\\x29\\x8b\\x1a\\xe5\\xc8\\x29\\x52\\xac\\x24\\x45\\x8c\\xbc\\x78\\x1b\\x91\\x66\\x33\\x5b\\x38\\x12\\x75\\x7d\\xe7\\x32\\x4b\\x3a\\xcf\\xb0\\x0d\\xba\\x6d\\x25\\x7b\\xba\\x52\\x52\\x27\\xef\\x6d\\x43\\x49\\xab\\xc0\\x1f\\xac\\xb0\\x4f\\x1e\\xbb\\xf2\\x9d\\xb6\\x68\\xf3\\x05\\xf5\\x97\\x34\\xf9\\x1e\\x7e\\x1b\\x76\\xdc\\x9c\\xe0\\xe4\\x47\\x0a\\x39\\xf9\\x0a\\xfc\\xd0\\xfc\\x9e\\x7e\\x5c\\x78\\x2f\\xac\\x64\\x5b\\x7b\\x6c\\x7b\\x57\\x9f\\x85\\x57\\x96\\x9f\\xf7\\x28\\x53\\x5b\\x94\\xd9\\x95\\x17\\x8b\\x55\\x64\\x30\\xdb\\xa9\\x91\\xbe\\x53\\xad\\xbb\\x53\\xee\\xdd\\x31\\xec\\xf2\\xda\\x0c\\x73\\x6e\\x1b\\x1c\\x27\\xe6\\x61\\x0c\\x47\\x8b\\xa7\\x99\\x60\\xae\\x9d\\x05\\x35\\xf6\\x05\\xe8\\x14\\x6c\\x5f\\x84\\x8a\\xfa\\x1c\\x30\\xeb\\x92\\x06\\xcd\\x94\\x84\\xf3\\xde\\x0b\\x70\\xbb\\x74\\x18\\x5d\\x79\\x24\\x5f\\xd5\\x75\\x40\\x44\\xa4\\x4c\\x8f\\x2a\\xcc\\xa0\\xda\\x81\\x6b\\x2d\\xbe\\xd6\\x39\\x10\\xb9\\x69\\x39\\xf4\\x29\\x66\\x6a\\x16\\x15\\x76\\x4a\\xc0\\xc7\\xc1\\x0c\\x46\\x15\\x49\\x22\\xff\\x34\\x4e\\xa9\\xbf\\xb9\\x72\\x56\\x30\\xef\\xdb\\xd2\\x5c\\x5c\\x09\\xbd\\x78\\x97\\xbd\\x31\\x2b\\xaf\\x1e\\x93\\xa4\\xdd\\x33\\x70\\x23\\x24\\xf0\\x88\\x71\\x1f\\xc7\\x02\\x5f\\xc7\\x7f\\x1c\\x1e\\xba\\xdf\\xb6\\x8b\\x7f\\xf6\\xd3\\xa3\\xe6\\xd3\\x41\\xbf\\x88\\xc0\\x48\\xd2\\x94\\x1e\\x9a\\xd3\\x5a\\xd0\\x5d\\x92\\xd5\\x6d\\x3a\\xee\\x59\\xc9\\xd3\\xae\\x7c\\x1e\\xc2\\x70\\xb5\\xe5\\xef\\xb8\\x3b\\x27\\x49\\x1c\\x83\\x74\\x28\\x3e\\x22\\xbe\\xdd\\xe6\\x93\\x1d\\x38\\x1e\\xc3\\x15\\x39\\xa0\\x11\\xad\\x35\\x9d\\x06\\xce\\xc1\\x1a\\xd4\\xfa\\x0b\\xed\\x8c\\xa5\\x91\\x9b\\x48\\xdc\\x81\\x16\\x2d\\xdd\\x88\\xed\\x09\\x59\\x27\\x6b\\xa7\\xeb\\xad\\xa9\\x2d\\x1b\\x85\\x1d\\x59\\xc8\\x51\\xbb\\x64\\x6c\\xc0\\x83\\xfb\\x0c\\xa5\\x51\\x28\\xe0\\xd7\\x8d\\xf9\\x40\\x27\\x87\\x69\\xc2\\x6b\\xfc\\x8a\\x00\\xb8\\x24\\x2d\\x5c\\x52\\x5e\\xb2\\x6b\\xa5\\x6f\\x98\\x6b\\xb8\\x4a\\xef\\x31\\x4d\\xcd\\x4a\\x14\\x05\\x84\\x7d\\x02\\xd3\\x44\\xf3\\xf4\\x8e\\x67\\x10\\xb0\\x83\\x2a\\x8c\\x3c\\x5d\\xf2\\x4a\\xab\\xd2\\x09\\xf8\\xde\\x38\\xfe\\x27\\x14\\xe6\\x9e\\x35\\x9c\\x32\\x94\\x2f\\x2a\\x50\\xce\\x9a\\xe3\\x74\\xdd\\xcc\\xa4\\x97\\x64\\xac\\x84\\xcc\\x31\\x11\\x4e\\xc4\\xd9\\x53\\x8e\\x42\\x59\\x88\\xf1\\x40\\x50\\x56\\xce\\x26\\x5e\\x00\\x21\\xce\\x12\\x03\\x92\\x90\\x86\\x69\\x73\\x60\\x0e\\xd7\\xf8\\xeb\\x52\\xe4\\x9f\\x1c\\x3e\\x0a\\x69\\xf4\\x0e\\x33\\x28\\xb7\\x4c\\xa5\\x41\\x88\\xd7\\xb1\\x9e\\xe6\\xf1\\x39\\x19\\x90\\x8d\\x33\\x4a\\x53\\xef\\x74\\xe0\\x9d\\x29\\x0f\\x56\\x93\\x3f\\x1c\\x0a\\xa4\\x21\\xc0\\x5a\\xd6\\xee\\x91\\x6c\\x86\\xef\\x34\\xfe\\x54\\xc6\\x88\\x04\\x70\\xe7\\x6c\\x23\\xb4\\xc4\\x7e\\x03\\x46\\x7f\\xd5\\x3a\\x12\\x1d\\x9e\\xd4\\xf5\\xd4\\xf0\\x59\\x4c\\x9c\\xf2\\xa8\\x32\\x06\\x17\\xef\\xb7\\xa9\\x5e\\xa3\\x55\\xba\\xba\\xe7\\x1f\\x54\\xa4\\xe3\\x1d\\xd5\\xf1\\xde\\xf5\\xf1\\x41\\x45\\x3c\\xde\\x51\\x8e\\x25\\x38\\x16\\xa8\\x1e\\x1c\\x16\\x0c\\xb7\\xe2\\x76\\xd9\\x90\\x78\\x18\\x9f\\xc1\\xe7\\xc5\\xab\\x20\\x12\\x56\\x15\\x06\\xa9\\xad\\x16\\x53\\x11\\x77\\x5c\\xc2\\x87\\xc3\\x32\\x3a\\xec\\x12\\x1d\\xef\\xae\\xe9\\x3e\\xd1\\xf1\\xfe\\xba\\xa6\\xf8\\xfc\\x18\\x9f\\x1f\\xd7\\x54\\x13\\x2a\\x1a\\x3f\\x47\\xdf\\x42\\xdb\\x26\\xda\\xb7\\xd1\\xb6\\x91\\x36\\xad\\x0e\\x0e\\x31\\x37\\x6c\\x38\\x5e\\x9a\\x90\\x4d\\x0f\\x38\\xdd\\x2e\\x2b\\x7e\\xca\\xf8\\xf6\\x33\\xeb\\x35\\xa9\\xeb\\x46\\xae\\xd6\\x15\\xc3\\x5a\\xc3\\x20\\x4e\\x51\\x81\\xe7\\xef\\x37\\x48\\x01\\x65\\x8d\\x89\\xe7\\x64\\x78\\xbe\\xbb\\xf9\\x3f\\x2a\\x26\\x43\\xb9\\x9d\\x6a\\xcb\\xed\\xe0\\xfe\\x55\\x6d\\x00\\x99\\x3e\\xd0\\xe1\\x24\\xbc\\x30\\x18\\xa9\\x38\\xe0\\xb7\\xc3\\xe4\\x1f\\x3d\\x46\\xbe\\x05\\xfb\\x45\\x47\\xdc\\x1a\\xf6\\xd2\\x8a\\x8c\\xab\\xab\\xc7\\x34\\x73\\x85\\x68\\x8d\\x92\\x92\\x51\\x7a\\xf5\\x98\\xae\\x59\\xce\\x4a\\x92\\x44\\x6b\\xf7\\x16\\x48\\x3a\\x6c\\x91\\xbb\\x32\\x0b\\x27\\x6d\\x93\\x82\\x65\\x0c\\xd2\\x34\\xd9\\xab\\x21\\x82\\xab\\xd1\\x9a\\x35\\x64\\x7a\\x69\\x2e\\x88\\x7b\\x87\\x7b\\x2c\\x5a\\x47\\x5c\\xb8\\x23\\x5e\\xd0\\xb5\\xeb\\xf1\\x83\\x8a\\x32\\x9a\\x13\\xdf\\x0b\\x54\\xf3\\x47\\x1b\\xf6\\xf2\\x8c\\xd6\\x1a\\x61\\x5d\\x1b\\x43\\xb5\\x01\\x5d\\xa0\\x17\\x32\\x50\\x45\\x06\\x10\\x23\\x40\\x7b\\x53\\x39\\x1c\\xfe\\x86\\x71\\x93\\x7c\\x34\\x29\\x1e\\xfa\\x64\\x20\\xec\\x09\\x7c\\x34\\x3a\\xdd\\x9c\\x42\\x9d\\xcf\\xbd\\x81\\xa0\\x17\\x00\\x2f\\x5f\\xf0\\xd1\\x06\\x9e\\xab\\xa1\\x5d\\x0d\\x91\\x15\\x20\\x8d\\xe6\\x85\\x85\\x41\\xa2\\xc1\\x21\\xc1\\xbb\\x02\\x0d\\x2d\\xfc\\xb3\\x06\\x0b\\x0a\\xff\\xe8\\x2c\\x90\\x7c\\x81\\xb5\\x17\\x21\\x94\\x73\\x40\\x45\\x13\\x8a\\xec\\x93\\x05\\x52\\x10\\xcf\\x56\\x0e\\x87\\x3f\\x69\\xc3\\xb8\\xe2\\xbd\\xd7\\x8d\\x68\\xbf\\x8b\\x29\\x1b\\xd3\\x06\\x6b\\x6b\\x27\\x7c\\x48\\x0b\\xb8\\x5f\\x6e\\xe3\\xba\\x38\\xc9\\x47\\x4c\\x79\\xc5\\x23\\x61\\x0d\\x23\\x53\\xc3\\xb8\\x78\\x43\\x4a\\xcc\\x72\\x06\\xd4\\x27\\x5e\\x0c\\x56\\x05\\x1c\\xe3\\xd5\\xe3\\x69\\x68\\x2b\\x31\\x8b\\x8a\\x11\\x4b\\xdd\\x91\\xfe\\x35\\x12\\xe8\\x28\\x3d\\x1c\\x9a\\xf2\\xb0\\xdd\\x23\\xfb\\xaa\\xb1\\x37\\x32\\x74\\x93\\x69\\xab\\xd5\\x06\\x07\\x75\\x80\\x89\\xfc\\x02\\x92\\x36\\x5d\\xf0\\x5f\\x31\\x41\\x02\\xde\\xf8\\x9c\\x7a\\x8e\\x62\\x5b\\xb3\\xd3\\x60\\x39\\xb6\\x03\\xb5\\x49\\x2a\\xa4\\x18\\x52\\x47\\x97\\x94\\x96\\x20\\x29\\x6a\\xa6\\xc3\\x7c\\x25\\xec\\xbc\\xe2\\x25\\x5a\\x33\\x15\\x49\\x9a\\xd2\\x82\\xd0\\x9c\\x7d\\x23\\x6c\\x64\\x56\\x9a\\xb1\\x62\\x9c\\xc2\\xed\\x6e\\xca\\x72\\xa8\\x5a\\x1a\\xb2\\x62\\xcb\\x02\\x02\\x78\\xfc\\xbd\\x4e\\xbe\\x47\\xcd\\x1a\\x4c\\x6a\\xed\\x26\\x95\\x37\\x93\\xca\\xc2\\x49\\xd5\\x18\\x87\\xa9\\xa0\\x9c\\x96\\x64\\xca\\x21\\xe4\\x26\\xac\\x18\\x9d\\xd0\\x09\\xad\\x1c\\x60\\x77\\x78\\xb1\\x77\\x65\\x02\\x5e\\xe9\\x67\\x11\\x95\\x10\\xb8\\xa6\\xcd\\x33\\x39\\x2e\\xb2\\xcd\\x3a\\x65\\x74\\xbd\\xa8\\xf1\\xd0\\xf5\\x29\\x83\\x03\\x2a\\x07\\x93\\x65\\x75\\x68\\x39\\x8a\\x45\\x96\\xf4\\xb0\\x4f\\x0e\\x31\\xd8\\x47\\x7b\\x98\\xed\\x93\\x87\\x34\\xa4\\x5e\\x16\\xe9\\x9e\\x97\\xbd\\x89\\xbc\\x4e\\xec\\xa8\\x87\\x43\\x47\\x47\\xfd\\x79\\x3c\\x4e\\x30\\xf3\\x54\\x29\\x72\\x53\\x6c\\xfe\\x43\\x69\\xb3\\xab\\xed\\x71\\x63\\xcc\\x00\\xc6\\xd8\\x2f\\xad\\x78\\x80\\x65\\xfa\\x71\\x36\\x3f\\xfc\\x99\\x48\\x8a\\xe1\\xe0\\xc9\\x41\\x9f\\xce\\x4f\\x37\\xf3\\xe3\\xee\\xc9\\x4e\\xa8\\xae\\xa9\\x69\\x3d\\xc2\\x18\\x30\\x91\\x6f\\x6e\\x67\\x8f\\xaf\\x45\\xa7\\x73\\x3b\\x7d\\x4e\\xea\\x7a\\x91\\xcc\\x7b\\x2a\\xe0\\xab\\xfa\\x9c\\x76\\xae\\x8f\\xbe\\xf3\\xaa\\x56\\xcc\\x29\\x6c\\xeb\\xb7\\x52\\x0b\\x63\\xae\\xae\\x74\\x27\\xaa\\xd1\\x00\\x93\\x0f\\x0e\\xc0\\x82\\xa6\\x07\\x9c\\x8a\\x33\\xe0\\x14\\x82\\x48\\x2d\\xa6\\xe9\\x5c\\x2e\\x20\\x8b\\xae\\xc8\\x8f\\x47\\x3d\\x1c\\x62\\xd2\\xcc\\x4b\\xc8\\x01\\x6a\\xcd\\x4b\\x52\\xcf\\x7f\\xab\\xfa\\x9c\\x3c\\xaa\\x51\\xb6\\xbd\\xe2\\x51\\x4f\\x98\\xb4\\x10\\x9d\\x5b\\x6d\\x65\\xa3\\x46\\x27\\x08\\xbd\\xea\\xe5\\x5d\\xba\\xc3\\x18\\x6c\\xbd\\x49\\x0d\\xce\\x7c\\x7a\\x42\\x02\\xe0\\x74\\x16\\x12\\x38\\xfb\\x44\\x7e\\x15\\xff\\x67\\xe2\\x85\\x47\\x61\\x32\\xe2\\x3f\\x20\\xc2\\x03\\x9b\\x0f\\x06\\x0b\\xc3\\x98\\x19\\x16\\x83\\x41\\xdc\\x6c\\x3d\\x9f\\x2c\\x08\\x39\\xac\\x0d\\xb5\\x0e\\xce\\xb2\\xa9\\x8c\\x06\\x3e\\x0e\\xc9\\x80\\x6a\\xd2\\x44\\xaf\\x3a\\xcc\\xdf\\xef\\xef\\x6e\\x54\\x11\\x6b\\xf5\\x1e\\xec\\x8a\\x3e\\xa4\\xb7\\x8b\\x64\\x80\\xe2\\xcf\\x01\\x6d\\x42\\x3c\\x27\\x97\\x13\\xba\\xac\\x20\\xc4\\x74\\xa2\\xe9\\xb2\\x54\\x0a\\xa3\\x87\\x57\\x89\\xa0\\x4d\\x8c\\x13\\x49\\x0d\\xd7\\xfe\\x21\\x2d\\x6f\\xb9\\x4e\\x14\\x55\\xf7\\xbc\\x2c\\x45\\xce\\x13\\xc5\\x9e\\xfe\\x21\\xa2\\xb9\\xa2\\x71\\x1c\\xeb\\x85\\x05\\x9d\\x3e\\x6c\\x9d\\xe4\\x1f\\x2f\\xde\\x96\\x6a\\xb7\\x8f\\x2a\\x7a\\x40\\xfb\\x9c\\xb7\\x98\\xc5\\x7b\\x9f\\x44\\x48\\xd3\\x47\\x3e\\x31\\xac\\x58\\x50\\xf7\\x3b\\x5e\\x42\\x46\\x69\\x67\\xd1\\x33\\x9f\\x2c\\xcc\\xdb\\xcb\\x09\\xa1\\xe6\\xf3\\x11\\x26\\xe5\\xfc\\x16\\x42\\xa6\\x62\\x44\\xf1\\x33\\xa1\\xce\\x82\\x0c\\xb7\\x15\\x66\\xb8\\x15\\xab\\x48\\x99\\x65\\xfb\\x4d\\x44\\x15\\x90\\xc3\\x84\\xae\\x75\\xa4\\xbc\\x3b\\xc3\\x4f\\x66\\xed\\x15\\x99\\x29\\x09\\x9d\\x9b\\xdf\\x89\\x02\\xa3\\x21\\xaa\\xa9\\x80\\x50\\xe3\\x5c\\xff\\xf8\\x51\\xba\\x69\\xbc\\xe4\\x18\\xb0\\xa6\\x09\\xa7\\xf4\\x8e\\xaf\\x0a\\x9e\\xc1\\xb5\\xe9\\xad\\x17\\xe9\\xd8\\x2e\\xf7\\x7c\\xb2\\x30\\xe0\\x1e\\xc3\\x68\\x22\\xf0\\xf8\\x71\\x95\\x44\\xed\\x3e\\x82\\x57\\x11\\xec\\x3f\\x5d\\xa7\\x95\\xfb\\x56\\x29\\x23\\x4d\\x62\\x1b\\x21\\x1b\\x92\\xcf\\xab\\x8f\\xf2\\x3b\\xbe\\x87\\x00\\x91\\xf0\\x92\\x1a\\x72\\xdb\\x33\\x50\\x11\\x7c\\x5c\\xab\\x32\\xbd\\xe5\\x90\\xcc\\xde\\x3d\\x30\\x15\\x11\\x42\\xe6\\x7c\\xc1\\x44\\xb3\\xea\\xdc\\x6f\\x88\\xb6\\x1b\\x72\\x39\\x21\\x61\\x7a\\xea\\xef\\x7a\\x92\\x81\\x1f\\xc2\\x93\\x75\\x4d\\x97\\x1b\\xb3\\xfd\\xe6\\x60\\x59\\x23\\x0e\\xf4\\xd3\\xbf\\x81\\x53\\x01\\x3e\\xfa\\x1a\\x8e\\x17\\xff\\x78\\xf1\\x9e\\x6b\\xba\\xcc\\xfd\\x3a\\x55\\xc9\\xd7\\x10\\xc9\\x10\\xa6\\xf0\\xc2\\x35\\x66\\x4f\\x83\\x8f\\xb6\\x8e\\xa1\\x29\\x8f\\x5d\\x41\\xa4\\xc8\\xf9\\xb3\\xa8\\xfe\\xca\\x59\\xd4\\xad\\x93\\xe7\\x16\\xf2\\x5b\\x1c\\x44\\xcf\\xd9\\x73\\x74\\x83\\x9d\\xb8\\x6c\\x26\\xae\\x82\\x89\\x57\\xed\\x99\\xa6\\x8e\\x90\\x28\\x99\\x9c\\xf3\\xc5\\x34\\xd7\\x51\\x49\\x0c\\x08\\x14\\xd5\\x7b\\x1f\\x0f\\x09\\x42\\x89\\x47\\xe5\\x59\\x4a\\xc5\\x7e\\x51\\x35\\x5f\\xac\\x82\\x2f\\xa6\\x6e\\xa9\\xcb\\x9a\\x41\\xf8\\xbb\\x32\\x5e\\x03\\xd8\\x27\\x7a\\x5d\\xaa\\x8f\\xb0\\x3c\\x5f\\x95\\xa5\\x2a\\xa3\\xc1\\x3b\\x9e\\x6d\\xc1\\x0e\\xf4\\x22\\xe7\\x9a\\x67\\x9a\\xe7\\xc9\\xc5\\x60\\x34\\x8f\\xe3\\xb8\\x5c\\xc4\\xff\\x56\\x42\\x46\\x83\\xf1\\xd3\\x01\\x19\\x99\\xbf\\x23\\x4d\\xa6\\x25\\x26\\xcd\\x27\\x94\\x33\\x1e\\x55\\x34\\x3d\\x1e\\x25\\xa1\\x65\\x8c\\x0b\\x68\\xca\\x7f\\xc6\\xa1\\x73\\xa6\\x64\\xa4\\xdc\\xe9\\xb7\\xa9\\x04\\x5b\\x41\\x0e\\x69\\x89\\xb7\\x6c\\xfa\\x2b\\xcc\\xbf\\x6c\\x0c\\x43\\xff\\x1b\\xd3\\x0e\\x17\\xda\\x4d\\x7e\\xad\\x23\\x97\\x25\\x76\\x38\\x34\\xf7\\x84\\x70\\xc6\\xe7\\xb6\\xe8\\x4b\\x67\\x01\\xb7\\x08\\x74\\x48\\x1c\\x61\\xaf\\xe7\\x4a\\xa8\\x64\\x7e\\x2a\\x61\\x2e\\x6e\\x7d\\xc9\\x98\\x99\\x01\\x04\\x7e\\x6c\\xc0\\x4f\\x61\\xc0\\x8f\\x68\\xda\\x2b\\x69\\x93\\x29\\x16\\x64\\x6a\\x43\\xd0\\x7d\\x67\\xe0\\x59\\x45\\xd3\\xe1\\x30\\x9d\\xeb\\x05\\x2d\\x09\\xa9\\xeb\\xee\\xda\\x98\\x13\\xf1\\xda\\x05\\xb1\\x22\\x64\\xfa\\x93\\x30\\x2f\\xf0\\x5c\\x7c\\x67\\xc8\\x33\\x45\\xab\\xe1\\xb0\\x32\\x57\\x37\\x6d\\x96\\xb6\\xac\\xed\\xd9\\x7c\\x10\\x7c\\xe1\\xc9\\xe6\\x71\\xb8\\x60\\x71\\x5a\\x14\\x06\\x9e\\xcc\\x1c\\x44\\x82\\x33\\x43\\x05\\x99\\x1d\\x38\\x04\\xfc\\x74\\x18\\xc4\\xf9\\x0c\\xdb\\x67\\x27\\xa3\\x4b\\x3e\\x0d\\x0d\\x0d\\x08\\xfe\\x0b\\x20\\xd0\\xc2\\x3f\\x1c\\x6c\\x77\\x54\\x1e\\xfc\\x85\\x3d\\xd8\\x32\\x0f\\x0c\\x5d\\x52\\x67\\x08\\x1b\\xc9\\x24\\x0d\\x2f\\x7d\\x07\\xc0\\x7d\\x8d\\x98\\xf8\\x10\\x04\\x25\\xbb\\x9c\\xd0\\x26\\x8a\\xd8\\xe5\\xa4\\xf6\\xc7\\x30\\xa8\\x63\\x68\\xa7\\xe6\\x31\\x0c\\x3b\\x66\\x88\\x25\\xff\\x44\\x97\\x76\\x75\\x13\\x05\\xb2\\x79\\xf8\\x6d\\x20\\x81\\xb5\\x29\\xf5\\x6f\\x69\\xd8\\x77\\xf0\\x79\\x49\\x43\\xf8\\x90\\xe4\\x86\\xcd\\x9b\\x09\\x98\\xbc\\xa0\\xc1\\x41\\x31\\x6f\\x24\\x99\\x49\\x78\\x23\\x5d\\xae\\xf5\\xdf\\x7c\\x36\\x75\\x3d\\xd3\\xa3\\x4c\\x47\\x9c\\x24\\x9c\\xfe\\xe4\\x4b\\xf1\\xd6\\x0e\\xd2\\x3c\\xdd\\x68\\x5e\\x56\\x60\\xe5\\xd5\\xc4\\x2a\\xfb\\xb6\\x15\\x86\\x4a\\x32\\x83\\x2e\\x7c\\x62\\x4b\\x4f\\xa0\\x88\\x08\\xf0\\xab\\x04\\x2f\\x4d\\x83\\x5e\\x30\\xbe\\xb1\\xef\\x45\\x77\\x8d\\x0a\\x73\\x0d\\x61\\x8d\\x61\\x7f\\x13\\x6d\\x47\\xca\\xa5\\x1b\\xd3\\xe5\\xc4\\xe5\\xe1\\x46\\x63\\xe9\\x01\\x63\\xe6\\x60\\xa8\\xd5\\x85\\x9e\\x15\\x20\\x0a\\x21\\xf6\\xe4\\x35\\x23\\x95\\x01\\xc8\\x68\\x2e\\xa4\\xea\\x64\\xbc\\xe7\\x12\\x32\\x91\\x40\\x00\\x4f\\x48\\xb8\\x90\\x1b\\xc2\\xbc\\x49\\xb7\\x20\\x23\\x1e\\x7b\\x72\\x08\\xf8\\x34\\x0b\\x47\\x14\\x19\\x0e\\x15\\xa6\\x27\\x56\\x41\\xf4\\xd1\\x0b\\xe5\\x15\\xd7\\x90\\xb4\\x8b\\x43\\x5e\\x17\\xb3\\x10\\x22\\xac\\x05\\x99\\xff\\x7c\\x6a\\x36\\x3f\\xe6\\x13\\x30\\x87\\x72\\x8d\\x86\\x38\\xa3\\xd5\\xe9\\x90\\xa4\\x61\\xbb\\x0d\\x98\\xd6\\x86\\x1a\\x53\\x0b\\x5a\\x32\\x8b\\x57\\x2d\\x88\\xb6\\xd9\\x35\\x0b\\x56\\xc9\\xa8\\xa4\\x29\\x15\\xb4\\x3a\\x1e\\x83\\x28\\xd5\\xdb\\xa2\\xb8\\x44\\x8d\\x74\\x74\\x69\\x20\\x24\\x39\\x1e\\x2b\\x94\\xd7\\x47\\xbe\\x4d\\x65\\x38\\x58\\x57\\x93\\x90\\xe1\\xd0\\x90\\x7f\\x80\\x1a\\x28\\x10\\xac\\x8a\\x56\\x88\\x16\\x3b\\xf6\\x09\\x48\\x3a\\x46\\x4d\\x28\\xba\\x0b\\x21\\x2f\\xb4\\x21\\x42\\xcc\\x2d\\x3c\\xd4\\x84\\x9a\\x1f\\x35\\x21\\xc1\\xf5\\xab\\x3a\\x3b\\x37\\x15\\x53\\x22\\x58\\xb0\\x9f\\x3d\\x71\\xed\\x52\\x6b\\x4e\\xde\\xec\\xb4\\xb0\\x3b\\x0d\\xa2\\x0b\\x62\\x90\\x84\\x90\\x5b\\xee\\x55\\x20\\xc2\\x86\\x6d\\x5d\\x9b\\x0b\\xd0\\x04\\x6e\\x6d\\x7a\\x2c\\x9b\\x44\\x70\\xcc\\x12\\x42\\x1e\\x67\\x1d\\x8f\\x91\\x2f\\xec\\x8d\\x6a\\xeb\\x36\\xa0\\x33\\x1c\\x4d\\x9a\\x02\\x6d\\x0a\\x42\\xb3\\x04\\x41\\x42\\x84\\xd2\\x89\\x74\\xb8\\x1c\\x10\\x42\\x08\\xb7\\x28\\xd7\\x0e\\xc4\\x6c\\x00\\x5f\\xd4\\x0d\\x69\\x49\\x08\\xe5\\xf6\\xf2\\x14\\x92\\xd9\\x28\\x44\\x5f\\xbd\\x7d\\xff\\xfa\\xcd\\x8f\\x3f\\x1c\\x8f\\xd7\\x7c\\x7c\\xfd\\xbf\\x68\\xe6\\x6f\\x15\\xf7\\xe1\\x7e\\x87\\xc3\\x4b\\x73\\x4d\\xe3\\xea\\x77\\xb1\\x19\\x0e\\xe1\\x4e\\xfb\\x75\\x58\\xf7\\x9c\\x49\\x0d\\x35\\x67\\x3c\\xd1\\xb4\\x62\\x1c\\x98\\x3c\\x5b\\x20\\x68\\xc9\\xfe\\xa9\\xa3\\x8a\\x2a\\x42\\x0b\\xf3\\x2b\\x85\\x8c\\x35\\x5c\\x5f\\x64\\xac\\xbc\\x8a\\xca\\x51\\x41\\xe8\\x9a\\x15\\xf8\\x6b\\x9a\\x31\\x51\\xfd\\x90\\xfe\\x10\\x65\\x64\\x36\\x49\\x32\\xba\\xb6\\x8f\\x6b\\xf3\\xb8\\xb6\\x5b\\x95\\x33\\xf9\\x28\\x03\\xc7\\x30\\x67\\xa4\\x7d\\xd8\\x94\\xfc\\x5e\\xa8\\x6d\\x95\\x1c\\x76\\x49\\x15\\xef\\xc6\\xf9\\xa3\\x28\\x8d\\x77\\x63\\x15\\xef\\x30\\xff\\xeb\\x1e\\x4b\\xf6\\x63\\x15\\xef\\x49\\x4d\\xa5\\xa1\\x0e\\xb0\\xea\\x68\\xdb\\xad\\x8a\\x25\\xb6\\x6a\\xb0\\xfd\\x79\\x6f\\x94\\x62\\x2a\\x98\\x4d\\x7a\\x0e\\x9b\\x55\\x44\\x13\\xc3\\x09\\xbb\\x22\\x17\\x4c\\x9d\\xa6\\xb4\\x64\\x99\\x59\\xb7\\x09\\x5a\\x6f\\xa0\\xbf\\x02\\x07\\x7f\\x05\\xb1\\x8a\\x2a\\x96\\xd2\\x94\\x95\\xae\\x92\\x1a\\x5d\\x13\\x8a\\x5e\\x24\\x65\\xc3\\x77\\x96\\xf1\\x6e\\x9c\\xc6\\xbb\\xa9\\x98\\xab\\x05\\x78\\xf9\\xe9\\x59\\x54\\xc6\\xfb\\x71\\x1a\\xef\\xc9\\x95\\x4e\\x26\\xb5\\x34\\x2f\\xaa\\x59\\x39\\x7b\\xa9\\x23\\x31\\x57\\xe3\\xeb\\x05\\xb9\\x64\\x0c\\x1f\\x16\\x66\\x05\\x6d\\xe9\\x08\\x9e\\xaf\\x1e\\x27\\xf8\\x68\\xfe\\x2d\\xda\\x5e\\x18\\xed\\x70\\x90\\x41\\xa8\\x49\\x3b\\x17\\x70\\x1c\\x0f\\xe7\\x63\\xde\\xad\\xd9\\x64\\xba\\x7e\\x22\\xc7\\xd7\\xd3\\xd1\\x68\\x4d\\x0a\\x96\\xb9\\x3a\\x6b\\x33\\x9d\\x62\\x38\\xcc\\x86\\xc3\\xe8\\x83\\x8e\\xf8\\x7c\\xbd\\xa0\\x13\\x5a\\x48\\x32\\x13\\xf3\\xf5\\x82\\x89\\xf9\\x7a\\x74\\xbd\\x60\\x93\\x24\\x52\\xe6\\xf7\\xe2\\x0a\\x2a\\x54\\xb6\\x1c\\x9f\\x6c\\xa4\\xf5\\x8d\\xfa\\x18\\x29\\xfa\\x98\\x8c\\xfc\\x53\\x45\\x1f\\x13\\x5a\\x3e\\x61\\xff\\xe7\\x78\\x8c\\x52\\xf6\\x1f\\x57\\x8d\\x1b\\x76\\x49\\x28\\x74\\xaf\\x1e\\xa5\\x8f\\xa0\\x0f\\xfb\\x9d\\xca\\x3e\\x13\\x88\\xde\\x8d\\xe0\\xb2\\xed\\x81\\xd2\\x38\\x9e\\x04\\x33\\x07\\xfd\\x1e\\x4d\\x4f\\x66\\x5d\\xb2\\xc9\\xb4\\x7c\\x22\\xc0\\xa1\\xe6\\x00\\x5c\\xa5\\x81\\xc9\\xa9\\xab\\x59\\x9a\\xb9\\x5f\\x56\\x1d\\x70\\x73\\xd8\\x25\\x82\\xee\\x93\\xa2\\x66\\xd5\\x54\\x81\\xbb\\x53\\x24\\xe0\\x08\\x5e\\xfd\\x07\\xad\\xe2\\x6c\\x73\\xbd\\x63\\x62\\x2c\\xf1\\xe7\\x9e\\x15\\x63\\xf9\\x88\\xcf\\xcb\\x05\\x04\\x7a\\x31\\x75\\xcd\\x81\\x15\\xae\\xee\\xe3\\x1d\\x13\\x23\\xac\\xfb\\x78\\xcf\\x8a\\x91\\xad\\x5b\\xd7\\xc0\\x34\\x35\\xe7\\x77\\xdb\\x45\\xb1\\xa7\\xb1\\xeb\\x81\\x74\\xe2\\x41\\x9b\\xd5\\x69\\xcc\\x70\\xb3\\xfd\\x80\\x1c\\xe3\\x6a\\x93\\xca\\xaf\\xd3\\x0d\\xba\\x70\\xe8\\x2e\\xa8\\xfa\\x5d\\x6c\\x0c\\x99\\x39\\xb8\\x53\\x52\\x69\\x25\\x31\\x21\\x5a\\x9c\\x6d\\x6f\\x44\\xf6\\x5a\\x6a\\x5e\\x6e\\x14\\x4a\\x08\\xbf\\x57\\x39\\x27\\x70\\xb7\\xa6\\x81\\xb7\\xa4\\x9c\\xe9\\x79\\x23\\xcf\\x5d\\x24\\xda\\x05\\x29\\x57\\x6c\\x02\\x06\\xf3\\x2e\\x2a\\xf9\\x93\\x0a\\xee\\x50\\xca\\xf4\\x1c\\x10\\xdd\\xda\\xa0\\xef\\x94\\xda\\xc8\\xa7\\x66\\x52\\x6a\\x74\\x4d\\xab\\x71\\x24\\x21\\xc2\\x3b\\xf9\\xb2\\x5a\\x50\\x1e\\x6b\\x8c\\x46\\x42\\x68\\x8a\\x8b\\x5d\\xc6\\x0e\\x82\\xc4\\x3b\\x2c\\xdb\\x87\\x65\\x7b\\x28\\x7b\\x6c\\xea\\x19\\xd0\\x61\\xeb\\x3c\\xde\\xbb\\xe7\\x3d\\x15\\x2c\\xad\\x79\\x9c\\xa5\\x9b\\xe7\\xfc\\x4f\\xc1\\xcb\\xb7\\x4a\\x48\\x5d\\x0d\\x87\\x3d\\x89\\x0c\\xa8\\x3d\\x48\\xb4\\x64\\x5f\\x6b\\xe0\\xe4\\x5d\\x64\\x8b\\x9e\\x88\\xf0\\xa3\\x91\\x20\\x29\\x1c\\x28\\x03\\x1b\\x84\\xb9\\x5c\\xc3\\x21\\x34\\x13\\xa3\\x6b\\x10\\x1a\\x54\\x10\\xca\\x13\\x98\\xd3\\x14\\x82\\x0a\\xc1\\x7c\\xb6\\xd2\\xfe\\xa2\\x68\\x93\\x40\\xbd\\x91\\xb6\\xc2\\xc9\\xb9\\x0a\\x7b\\x8a\\xa6\\x41\\xde\\xb0\\x9c\\xd0\\xd2\\x76\\xf3\\xd8\\x77\\xf3\\xb8\\xbf\\x9b\\xc7\\xbe\\x9b\\xc7\\xa7\\xdd\\x10\\x9b\\x3a\\xc1\\x1f\\xa5\\xdb\\xe0\\x28\\xf9\\x4c\\x23\\x3a\\xde\\x8d\\xc4\\xa3\\x88\\xc7\\xbb\\xb1\\x46\\x00\\xac\\xe3\\x3d\\x96\\xec\\xc7\\x1a\\x00\\xb0\\xef\\x60\\xf3\\x79\\x1d\\x38\\x29\\x34\\xd8\\x59\\x88\\x27\\xf1\\xdf\\x67\\x3a\\xde\\x27\\x3c\\xde\\x27\\x36\\x38\\xb0\\x7d\\x71\\xed\\xcb\\xc5\\xd3\\xc9\\xcc\\xfc\\xd7\\xf1\\x3e\\xf8\\xdc\\x5d\\x0f\\x96\\x83\\x0f\\xc2\\x7a\\xec\\xf1\\xc7\\xbe\\xa6\\x95\\x29\\xe5\\xb8\\xd8\\x7b\\xfc\\xb1\\xaf\\x69\\xca\\x60\\xbe\\xca\\x5c\\xa8\\xd2\\xfc\\x36\\x7b\\x2e\\x0c\\x06\\xbc\\x95\\x51\\x05\\xd7\\x90\\x66\\xe6\\xb7\\x01\\xa6\\xc2\\x60\\xc0\\x5b\\x43\\x56\\x15\\x4d\\xc6\\x56\\xb3\\x60\\x19\\x5d\\xb7\\xd6\\x70\\xd7\\xbd\\xc2\\x7a\\xd6\\x97\\x35\\xd2\\x40\\x17\\xf6\\x54\\x8f\\xf4\\x88\\x8f\\x85\\xe1\\x75\\x40\\x9a\\x6f\\xb0\\x17\\x67\\xba\\x0e\\x04\\xf9\\x9a\\x3d\\x0d\\xcc\\x52\\xf4\\x4c\\xf7\\x05\\x7f\\x75\\xe6\\x27\\xbb\\xb7\\xc5\\xd6\\x0b\\x9c\\xf4\\x98\\x83\\x2e\\xe4\\x95\\x2a\\xdf\\xe8\\x32\\x28\\xad\\x31\\x67\\x89\\xc1\\xae\\x86\\x09\\x6e\\x7d\\xbd\\xf3\\x69\\xdd\\xe9\\x72\\xd4\\xdb\\x65\\xb0\\x25\\x37\\xed\\x7b\\x34\\x1d\\x14\\x1a\\x02\\x3a\\xf3\\xe1\\x70\\x50\\xea\\xc2\\xc6\\xba\\x8d\\x20\\xcd\\x6c\\x2a\\xef\\xd3\\x2a\\xae\\xf4\\x1e\\x12\\x16\\xcf\\x85\\xcb\\x79\\x63\\xb8\\x4e\\xb4\\xc3\\x18\\xe4\\xa2\\xe4\\xd0\\x31\\xa4\\xfc\\x0d\\xde\\xbf\\x2d\\x85\\x2a\\x85\\xde\\xb7\\xaa\\x2c\\x28\\xd8\\x4c\\xb8\\x3a\\xe1\\x3b\\xca\\xe9\\x40\\xdc\\x6d\\x54\\xa9\\x53\\xa9\\x07\\x10\\x5b\\xa9\\xe4\\xf7\\x1f\\xf8\\x4e\\xbf\\x74\\x75\\x58\\x08\\x89\\x97\\x76\\x1e\\xde\\x0e\\x9d\\x0f\\x87\\x91\\x97\\xb0\\x9d\\xb4\\xa5\\xed\\xe9\\x9c\\x1f\\x05\\xc0\\x92\\xf9\\xf5\\x22\\x24\\x9d\\xf7\\x81\\xdb\\xc9\\x20\\x95\\xb7\\x78\\x33\\xf4\\xec\\x70\\xc3\\xf5\\x47\\xce\\x65\\xf2\\x8d\\xa6\\x99\\xba\\xdb\\xa4\\x25\\x4f\\x9e\\x6b\\x2a\\x55\\x79\\x97\\x16\\xe2\\x4f\\x9e\\xfc\\x4b\\xd7\\x89\\xaf\\xe4\\xe5\\x5d\\xfa\\x69\\x18\\x0d\\x5a\\x90\\xe1\\x50\\x3f\\x69\\xdc\\x39\\x51\\x93\\x65\\x7b\\x0b\\x4e\\x4a\\xd3\\xab\\x6e\\xef\\xe8\\xbd\\x8c\\x0e\\x40\\xd4\\x26\\x9a\\x72\\x99\\x27\\x9c\\x66\\x6a\\x0b\\xf9\\x58\\x0b\\x05\\x46\\x39\\x30\\xe3\\x44\\xd5\\xfe\\x68\\xdb\\xda\\x5f\\x0a\\xac\\xff\\xa5\\xab\\x39\\x1c\\x46\\x7c\\xac\\x47\\xd7\\xe4\\x4b\\xc1\\x0c\\x8a\\xb0\\xed\\x9a\\x4f\\x7d\\x6c\\xa5\\x4f\\x76\\xa9\\x93\\x0d\\xcd\\x6f\\xed\\xf4\\x9c\\x0c\\xd0\\x7c\\xd4\\x7c\\x43\\xc1\\x17\\xaa\\x9a\\x09\\x30\\x70\\xb7\\xe4\\xde\\xc1\\x4d\\xaf\\xa4\\x6e\\x71\\x8a\\x60\\x7e\\x59\\xcd\\xf6\\x12\\xfd\\xcc\\xa0\\x93\\x35\\x74\\x92\\xe3\\x20\\xb7\\x76\\x58\\xab\\xae\\x96\\xd1\\xdb\\x0a\\x3e\\x30\\x06\\xbf\\x17\\x69\\xf0\\xb9\\xd2\\x7d\\xae\\x68\\x12\\x84\\x3b\\x3d\\xa4\\x1d\\x41\\x0e\\x5d\\x6c\\x71\\x04\\xab\\x1a\\xd3\\xfa\\xac\\x90\\x2f\\xca\\x47\\xac\\xa0\\x5b\\xf3\\x27\\x63\\x13\\x43\\x85\\x4f\\xb3\\x27\\xeb\\xe1\\x30\\x8d\\xca\\x88\\xcf\\xf3\\x2f\\x8b\\xc5\\x5c\\x2e\\x08\\xd8\\x35\\x41\\x66\\xe3\\x7c\\x3c\\xa6\\xdb\\xf1\\x78\\x9a\\x7f\\x69\\x9a\\x7d\\xc9\\x7c\\x56\\x88\\xed\\x93\\x7c\\x38\\x8c\\x4c\\x47\\xa4\\xff\\xb3\\x76\\xe2\\x1a\\x4f\\x70\\xed\\xc4\\x50\\xf4\\xd6\\x69\\x88\\xc0\\x99\\x9a\\xde\\xb0\\xcb\\x6b\\xba\\xb4\\x89\\xb3\\x00\\xe6\\xee\\x99\\x61\\x21\\x6f\\x8e\\xc7\\x22\\x52\\x74\\x47\\x37\\x64\\x38\\x34\\x17\\xa6\\x34\\x4f\\x84\\xde\\xc3\\xdb\\xcb\\x9b\\xe3\\x71\\xc2\\x4c\\x61\\x45\\x37\\xc4\\x54\\xad\\xa0\\x6a\\x90\\xb2\\xc3\\x90\\xe9\\xeb\\xa9\\x7e\\xc2\\xf2\\xe9\\x68\\xa4\\xc9\\x1d\\xe3\\x73\\xfd\\x65\\xba\\xa0\\x77\\x40\\xa7\\x1c\\x8f\\xd1\\x86\\x65\\xd1\\x1d\\xcc\\xf6\\x86\\x15\\xd1\\x06\\x6d\\xb9\\xcc\\x38\\x18\\x63\\xcb\\xe1\\x70\\x0f\\xda\\xc9\\x25\\xc3\\xcf\\x6c\\xa8\\x22\\x33\\x9d\\x08\\xcf\\xff\\x2e\\x87\\xc3\\x7b\\xa8\\x71\\x8b\\x12\\xbc\\xe6\\x58\\x2f\\x61\\x19\\xb4\\xdb\\x7f\\x3c\\xdd\\xa9\\x3f\\x07\\x84\\xd8\\xe9\\x82\\xb3\\x0c\\xdd\\xb1\\x4d\\x97\\x09\\x5f\\x0e\\x87\\x67\\x3a\\xcd\\x1f\\xe8\\xf4\\xb6\\x39\\xf7\\xdf\\xcb\\xde\\x58\\xf2\\x15\\xbf\\x85\\xfc\\x67\\x7e\\x91\\xac\\x07\\x75\\x98\\xee\\xc5\\xa7\\xf2\\xf8\\x28\\x23\\xc3\\x5b\\x18\\xc0\\x06\\x84\\x8d\\xa1\\x58\\x2a\\xcf\\x29\\xda\\x60\\xf3\\x71\\x1c\\x57\\x5e\\x2f\\x17\\x30\\xe2\\xbf\\x9f\\x50\\xd5\\xb6\\x93\\x30\\x7a\\xa0\\xa3\\x25\\x21\\x78\\x95\\x23\\x80\\x56\\xd1\\xa5\\xcb\\xa0\\x32\\x5f\\x78\\x85\\xd6\\xe5\\xa5\\x8e\\x97\\x66\\xea\\xee\\xa8\\xa5\\xb0\\x1c\\x65\\x9f\\xea\\xde\\x4e\\xcc\\xf0\\xa4\\xe3\\x6b\\x30\\xb0\\x1a\\x0e\\x2f\\x25\\xf0\\xdc\\x86\\xfd\\x02\\x2e\\x57\\x21\\x97\\x3b\\x25\\x6a\\x34\\x9a\\x36\\x6f\\x7a\\x5e\\xa8\\x2f\\x19\\xa7\\x62\\x38\\x8c\\xaa\\x11\\x53\\x64\\x5a\\x3d\\x55\\xa6\\x5a\\xf5\\x25\\x77\\x15\\xab\\xf1\\xd8\\x67\\x45\\x36\\x75\\x0f\\xed\\x5b\\x5c\\x43\\xcc\\x9a\\xca\\x66\\x7c\\x01\\x11\\x96\\x97\\xff\\xbc\\x97\\xd1\\xbc\\x3d\\x1f\\xdc\\xde\\xaa\\x5e\\xa0\\x90\\xa9\\xa9\\x77\\x46\\x00\\x7e\\xd1\\x44\\x57\\x6b\\x85\\x2d\\x60\\x9c\\x16\\x28\\x95\\xc3\\x28\\x05\\x7c\\x74\\x3d\\x4d\\x9f\\x30\\x81\\x81\\x0a\\xfc\\xae\\xcc\\xd3\\x2f\\x15\\xf8\\xc9\\xc3\\x85\\x10\\x71\\xa5\\xd5\\x66\\x56\\xb8\\xfb\\x21\\xcd\\xcd\\xb4\\x2e\\xfd\\x76\\x98\\xfc\\x4b\\x9c\\x57\\x94\\x8e\\xaf\\xc9\\x97\\xca\\xc2\\xe1\\x9a\\x50\\xce\\x4a\\x66\\xdb\\xa7\\x90\\xa6\\x86\\x24\\x51\\xc9\\x52\\x5a\\x58\\x69\\x42\\xc4\\x59\\x4a\\x0c\\xc8\\x12\\x75\\xfb\\xac\\x97\\xc3\\x61\\xff\\x27\\xca\\xb0\\xfb\\xaa\\x06\\x0a\\xbf\\x7c\\x92\\xce\\xca\\x91\\x4a\\x4a\\x0a\\x07\\x62\\xb5\\x2d\\x8a\\x37\\x4a\\x6d\\x86\\xc3\\x09\\x26\\x29\\x2a\\x19\\x63\\x6a\\x7c\\x4d\\x60\\xf5\\x9a\\xd3\\xf8\\xbe\\x4b\\x42\\x09\\x73\\x80\\x1b\\xcd\\xd2\\x70\\xc8\\x67\\xe7\\x38\\x61\\xde\\x44\\x58\\x73\\x8a\\x6d\\x48\\x43\\x64\\xb3\\xe7\\xa7\\xac\\x0a\\xc4\\x3b\\x25\\x8a\\x77\\x6c\\x4e\\x1f\\x03\\x61\\xf9\\xbc\\xfa\\x52\\xba\\x5d\\xa8\\x70\\x17\\xca\\x98\\xcb\\x7c\\x9a\\x36\\x97\\x6d\\xcd\\xf8\\x3c\\x35\\xd5\\x0a\\xf6\\x56\\x46\\x2d\\x33\\xcd\\x83\\x75\\x59\\xc6\\x9b\\x3b\\xa0\\x9b\\x49\\x92\\xd1\\xcd\\x75\\xb2\\x36\\x37\\xfe\\x25\\x64\\x03\\x83\\xc0\\xfe\\xad\\x25\\xac\\x60\\x01\\xd3\\xf1\\x35\\x2e\\x60\\x19\\xc3\\xcd\\xb1\\xe0\\xb8\\x26\\x54\\xb3\\xc2\\xb0\\xab\\x66\\xa1\\x32\\xb6\\x36\\x8f\\x75\\xf5\\x24\\x35\\x6c\\xc6\\x5f\\xe8\\xa8\\x30\\xdb\\x02\\x9d\\x34\\x7a\\x79\\xbb\\x78\\x49\\x90\\xb1\\xe0\\x6d\\x40\\x8b\\x9c\\x98\\xe3\\xa2\\x35\\x53\\x50\\x62\\xad\\x05\\x5f\\xa4\\x9b\\xf7\\x16\\x79\\xb4\\x0b\\xda\\x96\\x86\\x37\\x0f\\x5a\\x19\\x9e\\x98\\x6d\\x62\\xc1\\xb7\\x4a\\xc8\\x76\\xe7\\xbe\\xa4\\x95\\xda\\x46\\xb7\\x6c\\xe5\\x02\\xdb\\xb8\\x66\\x50\\xe8\\xa2\\xe0\\xa7\\xfa\\xb2\\x9d\\xc6\\x9d\\x0f\\x87\\x9d\\x1c\\x81\\x9a\\x5c\\x32\\x76\\x92\\x37\\xb0\\xbe\\x4f\\xcb\\x8b\\x17\\xb2\\x93\\x66\\xf9\\xb0\\x5c\\x82\\x55\\xc9\\x72\\x09\\xd7\\x89\\xf2\\xb4\\x12\\xf2\\xf6\\xab\\xd5\\x8a\\x67\\xba\\x4a\\xee\\x9c\\x97\\xe1\\xbf\\xe8\\xad\\x4d\\x66\\x8b\\x63\\xfb\\x86\\x4a\\xb3\\x53\\x3f\\xd0\\xad\\xc8\\x93\\x7f\\x53\\x51\\xfd\\xb0\\x2d\\x8a\\x1f\\xcb\\x9f\\x65\\xce\\x57\\xc9\\x17\\x54\\x54\\x20\\xa5\\x4a\\x7e\\xa5\\xa2\\xc2\\xef\\x25\\x3f\\x53\\x51\\xbd\\x12\\x52\\x68\\x9e\\xfc\\x42\\x57\\xf0\\xe3\\xc7\\xf2\\x25\\x26\\x4f\\x4c\\xfe\\xa0\\x60\\x50\\xdc\\x14\\x7c\\x47\\xb5\\x7a\\xcb\\x4b\\xc3\\x40\\xa4\\xb7\\x3c\\xf9\\x9a\\x6a\\xe5\\xe3\\x7c\\x26\\xbf\\x35\\x49\\x74\\x7e\\xa2\\x3c\\xcd\\xd6\\xc9\\xb7\\x74\\xe9\\xb2\\x83\\x7f\\xf5\\xc7\\x36\\x2d\\x12\\xad\\x69\\x56\\x28\\xc9\\x13\\xae\\xe9\\xf2\\x8e\\x97\\xb7\\xbc\\x4c\\xa4\\xa6\\xf0\\x2b\\x51\\xf6\\xc7\\xeb\\x55\\x52\\xf9\\xd7\\xaf\\x57\\x49\\x0a\\xba\\xe1\\x4d\\xc9\\xb3\\x54\\xf3\\x3c\\x39\\x85\\x85\\x21\\x51\\x6d\\xae\\x94\\x2a\\x78\\xfc\\x31\\x2d\\x65\\xa4\\x47\\x7f\\x4b\\x2e\\x06\\x7f\\x1b\\x89\\xd1\\xdf\\x06\\x17\\xa2\\xba\\x68\\x7a\\x89\\x2f\\xde\\x16\\x3c\\xad\\xf8\\xc5\\xb6\\xe2\\xa6\\x86\\x84\\x1a\\xb2\\xd2\\x3c\\xcd\\xff\\x46\\x6a\\x6a\\xcd\\x3c\\x70\\x91\\xbe\\xe3\\xfb\\xa4\\xd0\\x74\\x99\\xa5\\x1b\\xa1\\x2d\\xd1\\xa7\\x69\\x6e\\x03\\xaa\\xaf\\xb5\\x59\\x42\\x3b\\xa8\\x24\\x07\\xfe\\xc7\\x4e\\x77\\xab\\xa9\\x56\\xaf\\x94\\xd4\\x68\\x86\\x91\\x7c\\x01\\xd3\\x4a\\xab\\x6d\\xc9\\x0d\\xb9\\x9f\\xfc\\xaa\\x5b\\xc1\\x68\\x92\\x9f\\x35\\xc5\\x20\\x17\\xe0\\x93\\x95\\xfc\\x62\\x56\\x8b\\xa7\\xe5\\x0b\\x60\\x05\\x92\\x3f\\x34\\x98\\xf5\\x80\\xa0\\x21\\xf9\\x4e\\xd3\\xa5\\xa8\\xe0\\xf7\\x6b\\x09\\x69\\xa1\\xbe\\x36\\xb5\\xc5\\x06\\x7e\\xff\\xa6\\xe9\\x56\\xfa\\xa7\\x9f\\x34\\x5d\\x56\\x9a\\x6f\\x36\\x1c\\xac\\xad\\x3f\\xa8\\xe4\\x5b\\x4d\\x97\\x37\\x20\\xb6\\x78\\xb1\\x2d\\xef\\x4d\\x89\\xe6\\xb4\\xe4\\x32\\xe7\\x25\\x0c\\x84\\x73\\x9a\\xe6\\xf9\\x3b\\x73\\x31\\x79\\xfe\\x8e\\x67\\xfa\\x6d\\xaa\\xd7\\x89\\xe0\\x66\\xb8\\xea\\xf7\\xed\\x26\\x91\\xfe\\xe7\\xf3\\xbd\\x59\\x1e\\xc5\\xe9\\xb2\\x0c\\x0b\\x2a\\x4e\\x97\\x28\\x1e\\x7a\\xee\\x88\\x58\\x4e\\x0b\\x51\\x69\\x2e\\xe1\\x0c\\x7e\\x75\\x6f\\x4e\\x45\\x52\\x70\\xba\\x95\\xa7\\xc5\\x19\\xa7\\xcb\\xd4\\x3c\\xff\\x2c\\xc5\\x1f\\x5b\\x9e\\xac\\x39\\x5d\\xb6\\xb3\\x9d\\x27\\x7f\\x08\\xba\\x4c\\xb5\\x4e\\xb3\\xb5\\x33\\x10\\xf8\\x4e\\x74\\x6d\\x08\\x68\\xb5\\x29\\x84\\xe4\\x30\\xc7\\x64\\x2d\\xc3\\xc7\\xef\\xad\\x8c\\x2a\\xc9\\x25\\x5d\\x62\\x98\\x72\\x94\\xe3\\xbc\\xc0\\x20\\xf5\\x28\\xce\\x49\\x56\\x68\\xfc\\xf2\\x36\\x2d\\xb9\\xd4\\x3f\\xa8\\x9c\\x27\\x39\\xa7\\x2e\\xf5\\x76\\x72\\x0b\\xbf\\xdf\\xf1\\x22\\xd5\\xe2\\x9e\\xbb\\x14\\xac\\xc9\\x0e\\x8a\\xbf\\xc7\\xbc\\x8e\\xef\\xcd\\x71\\x59\\x9a\\xd5\\xd5\\x42\\xa6\\xef\\x21\\x14\\xc5\\x9e\\xd3\\x6a\\xbb\\x31\\xdc\\x63\\x05\\x13\\x7e\\x03\\x0b\\xc0\\x4b\\x6b\\x4d\\x94\\xdc\\x9b\\xea\\x69\\xfe\\x73\\xc5\\x73\\x68\\xfe\\x91\\x83\\xbb\\x93\\x3d\\x45\\x67\\x62\\x72\\xf0\\xd1\\xe0\\x62\\x30\\xd2\\xa3\\xc1\\x66\\x77\\x31\\x18\\x09\\x73\\x86\\xff\\xd8\\xf2\\x0a\\xb2\\xcd\\xbf\\x2a\\xd3\\x3b\\x9e\\x68\\xaa\\xd7\\xa5\\xd2\\xba\\xe0\\x86\\xed\\xca\\xf9\\x8d\\xda\\xca\\x8c\\x27\\x82\\x2e\\xb5\\x7a\\xc3\\x57\\x1a\\xa2\\x6f\\xbd\\x00\\xe1\\x40\\x22\\xed\\x49\\x7c\\x6f\\x30\\xc1\\x57\\x32\\x4f\\x14\\x5d\\x9a\\x55\\xfe\\x25\\xa9\\xe8\\x72\\x83\\xc7\\xce\\x1c\\xa6\\xe4\\x56\\xfa\\xc3\\xd5\\x12\\xf2\\x25\\x1b\\xe9\\xce\\x58\\xbb\\xfc\\x4e\\x52\\x4c\\xb0\\x85\\xaa\\x89\\xe4\\x4f\\x41\\xb5\\x7a\\xe3\\x8d\\xa7\\x92\\x77\\xe6\\x28\\xf1\\x34\\x07\\x96\\xfd\\x83\\x82\\x34\\xb3\\xc9\\x1b\\x4e\\xb5\\xfa\\xf0\\xee\\xf9\\x9b\\xe4\\x2b\\xf7\\xeb\\x85\\x2a\\x25\\x2f\\xab\\xe4\\xb5\\x29\\x70\\x69\\xb2\\xfe\\xe4\\xf6\\xc6\\x25\\xaf\\xb8\\xbb\\xc4\\xc9\\x3f\\xcd\\x69\\xca\\xf3\\xaf\\x21\\xf5\\xda\\x73\\x4e\\xdf\\xbe\\x4e\\x6e\\x34\\xfd\\xf0\\xec\\xe7\\x64\\xa9\\xe9\\xdb\\xd7\\xe6\\xc7\\x5e\\x53\\x97\\x9f\\x21\\xb9\\xd7\\xf4\\xdd\\xb3\\x97\\xcb\\xb7\\x5f\\xbd\\x5b\\xbe\\xfc\\xea\\xeb\\xe4\\xa3\\xa6\\xdf\\x3c\\x7b\\xf3\\x6a\\xf9\\xf6\\x75\\xf2\\xbd\\xa6\\x3f\\xfd\\xfc\\xec\\xdd\\x87\\xaf\\xde\\x99\\xa7\\xdf\\x35\\xfd\\xf0\\xaf\\x1f\\x97\\x1f\\xbe\\x79\\xfd\\xee\\xe5\\x7b\\x53\\xf0\\xde\\x10\\xfd\\xb7\\xd7\\x93\\xe4\\xad\\xa6\\x95\\xb8\\x95\\xc9\\x4b\\x4d\\xa5\\xc8\\xf8\\x0f\\xdb\\xbb\\xe4\\x85\\xa6\\xcb\\x55\\x9a\\x69\\x55\\x9a\\x0d\\xfd\\x51\\x03\\x6c\\x86\\xf9\\x3f\\xd3\\x34\\x2d\\xee\\x54\\xa5\\x01\\x66\\x54\\xc9\\x07\\xf7\\xfc\\xaf\\xb5\\x2a\\x78\\xf2\\xce\\x5c\\x5e\\xc8\\x96\\xf0\\x4c\\xe6\\xdf\\xa7\\x3b\\xbc\\x5e\\x6f\\x0c\\x64\\x79\\x97\\xe6\\x22\\x95\\x55\\xf2\\x95\\x79\\x78\\xc9\\x6f\\x4b\\xce\\xab\\xe4\\x35\\x40\\x4b\\x08\\x82\\xf3\\xb6\\x48\\x33\\x5e\\x25\\x7f\\x6a\\x73\\x1c\\x9f\\xc9\\xdb\\x82\\xbf\\x2a\\xd5\\x1d\\xc2\\x8f\\x57\\x9a\\xe6\\xa2\\xd2\\xa9\\xcc\\xb8\\xbd\\xa0\\xf6\\xc4\\xff\\xd3\\xc0\\x20\\x53\\xf7\\xa5\\x58\\xad\\x92\\xe7\\x9a\\x2e\\x3d\\xef\\x09\\x5d\\x24\\xff\\x72\\x15\\x9e\\x37\\xe2\\x84\\x65\\x21\\xee\\x04\\xc6\\x20\\x4a\\x7e\\x80\\x64\\x5b\\xfa\\xfa\\x1f\\xef\\x52\\x79\\xcb\\x93\\x7f\\xc3\\xd7\\xdf\\xe9\\xe2\\x19\\x2a\\x93\\x93\\x9d\\xf4\\xb6\\x3b\\x2d\\x99\\x47\\x72\\x23\\xa9\\x35\\x20\\x6f\\x97\\x2f\\xcd\\x41\\x32\\xa0\\xe8\\x3d\\x92\\x41\\xc9\\xc7\\x4e\\x41\\x95\\x7c\\x0f\\xb6\\x36\\x60\\xda\\xed\\xcb\\x7e\\x97\\x35\\xb1\\xb9\\x98\\x7f\\x94\\xed\\x94\\x45\\x41\\x4e\\x7a\\xcc\\x50\\x84\\x59\\x0f\\x40\\x7f\\xc6\\x5c\\xa6\\x22\\x3b\\x46\\x26\\x6c\\x5e\\x23\\x30\\x21\\xef\\x04\\x97\\x31\\x94\\x6e\\x2d\\xaa\\x57\\xaa\\xfc\\xb0\\xdf\\x84\\x41\\x9b\\x6c\\xbd\\xc6\\x32\\x54\\x54\\x81\\x29\\x43\\x93\\x28\\x15\\xbe\\xdf\\x54\\xa3\\x41\\x13\\x43\\x58\\xdd\\x1a\\xc0\\x50\\xf6\\x18\\x68\\xda\\xfe\\x4f\\x2c\\x24\\x50\\x6f\\x31\\x8d\\x4e\\x03\\x90\\x0c\\x44\\x3e\\x10\\xf2\\x42\\x0f\\x87\\x03\\x97\\x2a\\x19\\x9e\\x6b\\x12\\x09\\x08\\x3d\\xcf\\x78\\xec\\x3f\\x28\\x48\\x68\\x53\\x0f\\x53\\x07\\x11\\xbc\\xc8\\x41\\x30\\x02\\x0b\\x35\\x1a\\xc4\\x83\\x51\\x65\\x5d\\x27\\x4e\\x0c\\x89\\x70\\xe1\\x73\\xc5\\xab\\x0b\\xa9\\xf4\\xc5\\x3a\\xbd\\xe7\\x17\\x02\\x8c\\x89\\xbc\\xe6\\xf2\\xa2\\xba\\x10\\xf2\\x42\\x1d\\x8f\\x91\\x9a\\x57\\x0b\\xa6\\xe9\\x39\\x22\\x5c\\xe9\\x6e\\x50\\x1f\\x60\\x9f\\xe7\\x62\\xb6\\xd3\\x36\\xdb\\x72\\x72\\xa8\\xa9\\x7d\\x40\\x93\\x5a\\x3b\\xc5\\x05\\x99\\xda\\xfc\\x8d\\x68\\xbc\\xdc\\xce\\x0b\\xdd\\x95\\xd6\\x87\\x9a\\x58\\x4e\\x9a\\x7c\\xd4\\xc2\\xab\\xb4\\x25\\xc3\\xb0\\x62\\x3a\\x1a\\xc4\\x03\\x02\\x5e\\x27\\x1b\\xb5\\x89\\x0c\\x2d\\x3c\\xd7\\x90\\xe1\\x24\\x4b\\x75\\x24\\x89\\xb5\\x95\\x32\\x75\\x52\\xc6\\xe7\\x62\\x11\\xb6\\x2a\\x59\\x6a\\x5b\\x15\\x2c\\x6d\\x6a\\x4e\\x7d\\x36\\xbd\\x8a\\x2a\\x5a\\xd0\\x92\\x40\\xd0\\x32\\xde\\x1d\\x35\\x99\\xba\\xa4\\x74\\x80\\xe7\\x86\\xc3\\x30\\x49\\x1d\\xd6\\xf6\\x2f\\x41\\x26\\x9f\\x52\\xc8\\xc3\\xe3\\x4e\\x34\\x34\\xf0\\xd6\\x72\\x98\\xac\\xcb\\x3f\\x57\\x84\\xd0\\xb4\\x36\\xeb\\xa8\\xdb\\xf1\\xad\\xe0\\x10\\xcc\\xf5\\xa2\\xde\\xca\\x73\\xe7\\xd2\\x1e\\x14\\x81\\x07\\xc5\\x26\\x9c\\x86\\xb3\\x32\\x05\\x95\\x3f\\x1f\\x0e\\x43\\x83\\x1b\\x39\\x1c\\x42\\xf1\\x4e\\xcf\\xe5\\xa2\\x11\\x87\\xc2\\xa3\\x79\\xdf\\xba\\x86\\xbe\\xe9\\x4a\\xcf\\xc5\\x82\\xd4\\x40\\x36\\x3f\\xc3\\xc4\\xda\\x70\\xd6\\xfa\\xb2\\xad\\x37\\x09\\x67\\x2a\\xa8\\xf8\\xa3\\x8c\\xde\\x08\\x3a\\xb0\\xa9\\xdd\\xab\\x01\\x18\\xf7\\x41\\x4d\\x47\\xa6\\xba\\x6a\\x5f\\x09\\x3a\\x70\\x65\\x03\\x5b\\x67\\x83\\x51\\xe9\\x5d\\x15\\x3c\\x2c\\x74\\x60\\x8b\\x5d\\x2d\\x8c\\x20\\xe0\\x2a\\xfd\\x22\\xa8\\x4b\\x1b\\xe8\\x92\\xda\\x9b\\xbb\\x9a\\xbf\\x83\\x25\\x2c\\x05\\x37\\xe7\\xa6\\x33\\xd4\\xb0\\x9f\\xf6\\xe8\\x16\\x75\\x9a\\xe7\\x51\\x1c\\xc7\\xda\\xc5\\x84\\x37\\x64\\x76\\x34\\x70\\x1b\\x32\\xa0\\xda\\x40\\x8d\\x3b\\x75\\xcf\\x7b\\x6a\\x35\\x1b\\x07\\xf5\\xd2\\x3c\\x7f\\xd1\\x7c\\xf4\\xe1\\x5e\\x69\\x77\\x8c\\xd0\\xdc\\x27\\xd7\\xff\\x8c\\xb6\\x6e\\x0a\\xd0\\xd0\\xc5\\xf7\\xff\\x8c\\x76\\x76\\x75\\xa1\\x19\\x10\\x4f\\x9f\\xd5\\x0a\\x17\\x8f\\xb8\\x40\\x69\\x38\\xe8\\xee\\x89\\x5e\\xc2\\x29\\x3f\\x99\\x1a\\x1d\\x34\\x0f\\x03\\xe8\\xc2\\xce\\xf3\\xa1\\xf6\\x6e\\x7a\\xfe\\xd4\\x60\\x4b\\x9c\\xe8\\x43\\x0d\\xed\\xfc\\xdc\\x31\\xc2\\x66\\x30\\xd1\\x87\\x5a\\xd9\\xc3\\x61\\x63\\x99\\xb9\\x3d\\x7f\\x78\\x3b\\x5b\\xdb\\xdf\\xb3\\xa1\\xd8\\xc7\\x03\\x7b\\xda\\xd3\\x41\\xb3\\xab\\xd8\\xfa\\xfc\\xc6\\xf6\\x34\\xf6\\x5b\\x8b\\x6d\\xcf\\xee\\x6e\\x4f\\x53\\xb7\\xbf\\x58\\xa3\\x27\\xbd\\xd0\\x14\\xcd\\x62\\x1a\\x10\\xce\\x3d\\x08\\x57\\x4c\\x1c\\x8f\\x12\\x96\\xd3\\xde\\xc2\\xbd\\xc3\\xdf\\x9c\\x4c\\xc5\\xf1\\xa8\\xe2\\x06\\xa3\\x73\\x72\\x3c\\x2a\\xc6\\x0c\\x98\\xc7\\xd1\\x0e\\x87\\x3c\\x16\\xf9\\x4c\\xc6\\x4b\\xbe\\xe3\\x19\\xe8\\xfb\\x38\\x49\\xbe\\x8d\\x38\\xfd\\xec\\x4f\\xb4\\xdb\\x1a\\x18\\x4f\\xcc\\x4c\\xb0\\xa8\\x35\\x93\\xcc\\x9c\\xb9\\xe9\\x4f\\x91\\x98\\xbb\\xf4\\xa7\\x23\\xb9\\xa0\\xf3\\x05\\xe8\\xec\\xe7\\x7a\\x11\\x09\\x42\\xe1\\x2d\\xaa\\x39\\xfd\\xcb\\xba\\xef\\xcb\\x1a\\x15\\x00\\x68\\xcc\\x34\\x99\\xf2\\x27\\xbd\\xe0\\xc8\\x49\\x62\\x79\\x23\\x9f\\x12\\xac\\xb7\\xe6\\x9c\\x2f\\xd0\\x7f\\x35\\xa4\\x7f\\x88\\x17\\x06\\x87\\x47\\xd7\\xae\\x5d\\x6d\\x8f\\x70\\x47\\xc2\\x86\\xc8\\xc6\\xf4\\x85\\x8c\\x3c\\xc8\\x48\\xbb\\x04\\xc5\\xdf\\x06\\x7f\\x1b\\x69\\xcb\\xc6\\x1b\\x82\\x22\\xbd\\x70\\x87\\x82\\xe7\\x17\\x86\\xc3\\x07\\x0c\\xea\\x93\\x7e\\xd7\\x96\\xf2\\xfb\\x20\\xfb\\xf0\\xc2\\x52\\x48\\xa1\\xd9\\x7c\\x51\\x63\\xba\\x91\\xfe\\x40\\xdc\\x53\\xbb\\xe6\\xaf\\xa5\\xc0\\xd8\\x0a\\x20\\x1f\\xc3\\xa6\\x2a\\xb6\\xec\\x68\\x63\\xcd\\x5a\\x45\\x1a\\xd0\\x89\\x8a\\x97\\xb6\\x57\\x5b\\x99\\x6a\\x3a\\x10\\xb2\\xd2\\x69\\x51\\x0c\\x02\\x27\\x0d\\x39\\x53\\x2d\\x73\\xdb\\x48\\x7b\\xd3\\x2f\\x49\\x92\\x93\\x77\\xe0\\x93\\xe8\\x7a\\x76\\xf9\\xf5\\x9d\\x9b\\x7e\\xce\\x2b\\x5d\\xaa\\x7d\\x30\\xca\\xa0\\xe2\\xa0\\xd2\\x6a\\x33\\x38\\x33\\xb0\\xad\\x6c\\x86\\x46\\xd3\\x7a\\xd9\\x5d\\x10\\xc9\\xe4\\xf1\\x78\\xa8\\xa7\\x1d\\xe3\\x49\\x1d\\xf8\\x43\\xda\\xdd\\x9d\\x3a\\x6b\\xc7\\x9f\\xc0\\xac\\x8f\\xce\\x39\\x95\\xd4\\x07\\x29\\x5f\\x80\\xa0\\x52\\xc6\\x99\\x61\\x38\\x0a\\xb0\\x60\\xf6\\x96\\x8f\\xf6\\xc7\\xa4\\x16\\xf2\\x3e\\x2d\\x84\\x4d\\xcf\\xf3\\x45\\x14\\x24\\x26\\x23\\x2e\\xdb\\xd9\\x52\\x15\\x39\\x66\\x82\\x0c\\xde\\xb6\\xf2\\x28\\xe2\\x19\\x22\\x75\\x67\\xfd\\x0e\\x62\\xd5\\xea\\xb0\\x05\\x59\\xa1\\x68\\xda\\x22\\x65\\x6c\\x6f\\xf6\\xf7\\xe9\\x5e\\x93\\x76\\xb0\\x50\\x5c\\xb7\\xf7\\x3a\\xd5\\xfc\\xc5\\xda\\xf0\\x3d\\x18\\x68\\xb9\\xee\\x3d\\x26\\xa1\\x66\\x64\\x38\\xd4\\x36\\x15\\x15\\x95\\xec\\xbb\\xc8\\xa7\\x27\\x18\\x0e\\x9b\\x4c\\x05\\x0e\\x47\\x1c\\x6a\\x43\\x71\\xf6\\x99\\x1a\\x9a\\x5b\\xdf\\x0a\\x6f\\xf4\\xcc\\x03\\x2c\\x24\\xca\\x5a\\xc9\\xec\\xa7\\x4d\\x34\\x50\\xc8\\x12\\x6f\\x8d\\xd0\\x9f\\xc9\\xb8\\x41\\x59\\x62\\xae\\x17\\xfe\\xb4\\x4a\\xa6\\x5d\\x77\\x10\\x56\\xb4\\xdd\\x97\\x0c\\xfb\\x6a\\x12\\x01\\xcc\\xf5\\x62\\x3a\\x06\\xf3\\x57\\x1f\\x59\\xd7\\x30\\x1a\\xf6\\x63\\x22\\x08\\xda\\x1c\\xf9\\x93\\x7c\\x79\\x7d\\xc9\\xcc\\x89\\xeb\\x0a\\xe4\\xc3\\xbb\\x09\\x21\\x9a\\xdb\\xfe\\xdd\\x7e\\x40\\x36\\x20\\xb3\\x1b\\x50\\x20\\x64\\x2f\\x19\\x9f\\xa7\\x0b\\x5a\\xb0\\x77\\x66\\x6e\\x65\\x2c\\xf2\\x05\\x95\\x64\\xda\\xd8\\xbd\\x3a\\xd1\\x37\\xce\\x33\\x29\\xbd\\x6f\\xec\\x1b\\x19\\xf9\\x2d\\x2a\\x69\\x41\\x2b\\x52\\xb7\\x65\\xde\\x8a\\x4a\\x83\\x03\\xe6\\x8b\\xba\\xff\\x18\\xb4\\x69\\x64\\x7f\\x82\\x21\\x78\\x9d\\x68\\x9d\\x63\\x6f\\x95\\xd9\\x36\\xad\\xe2\\x71\\xa5\\xee\\x38\\xe0\\x30\\xb7\\x0f\\xb1\\xc8\\x61\\x65\\xfd\\x13\\x21\\x84\\x4c\\xc3\\xb3\\x18\\xa1\\xb6\\x3e\\x00\\x00\\x9d\\xb7\\xa0\\xb9\\x87\\xb7\\x69\\x69\\xc8\\x95\\x46\\x92\\xfd\\xae\\x23\\xc9\\x3e\\x1e\\x61\\x5f\\xf4\\xcc\\x9a\\x60\\x1f\\xea\\x44\\x83\\x58\\xba\\x69\\xf2\\xa6\\x57\\x35\\x85\\xa3\\x03\\xab\\xe5\\xef\\x90\\xa7\\x72\\x5b\\x87\\x92\\x2e\\xb4\\x67\\x46\\xe3\\x6b\\xef\\x33\\xd7\\x96\\xf3\\x45\\x15\\x95\\x68\\x5d\\xdc\\xb2\\xc4\\xbf\\x0e\\x2d\\xf1\\xaf\\xa9\\x33\\x97\\xbf\\x9c\\x84\\x26\\xfc\\x5f\\x75\\xd4\\x90\\x3b\\x8c\\x0f\\x6d\\x48\\x7f\\x88\\xe1\\x7c\\x70\\x0e\\x42\\x51\\xc4\\xfd\\x1b\\x53\\x4c\\xec\\x6b\\x82\\x27\\xf7\\xd9\\x4e\\x54\\xc7\\x23\\x0f\\x1f\\x44\\xf8\\x30\\xd8\\x0d\\x9a\\x8f\\xbe\\x6e\\x2d\\x9e\\x0d\\xfd\\x7e\\x3c\\x62\\x44\\x30\\x3d\\xd3\\x09\\xba\\x4c\\x1e\\x8f\\x3e\\x30\\x1d\\x84\\xf9\\x77\\x0e\\xd8\\xa4\\x13\\x20\\x65\\xb0\\x1b\\x24\\xe7\\xc2\\xb0\\x0c\\xf6\\x03\\x6b\\xf1\\x0e\\x29\\x1e\\xb3\\x75\\x5a\\x3e\\xd3\\xd1\\x84\\xc4\\x5a\\xbd\\x51\\x1f\\x79\\xf9\\x22\\xad\\x78\\x84\\x51\\x6e\\x03\\xe5\\xec\\x9f\\x1d\\xa3\\x56\\x7b\\xce\\xc1\\x27\\xcc\\xe5\\x8e\\x3d\\xd4\\xe0\\x9a\\x62\\x19\\x9e\\xef\\x22\\xde\\x82\\x41\\xdc\\x31\\x39\\xfd\\x36\\x94\\x2b\\x3d\\xc7\\x94\\xcf\\x66\\x0d\\xb1\\x66\\x72\\xa8\\x6b\\xf0\\x16\\xc5\\x47\\xb3\\xb6\\x54\\x31\\xb3\\x3f\\x98\\x1b\\x1a\\x0e\\x46\\x1f\\x8f\\x9f\\xf6\\x95\\x4e\\xdb\\x42\\x16\\x00\\x78\\x32\\x60\\xd7\\x9b\\x48\\xe2\\x1c\\xc0\\x10\\x2d\\x99\\xdd\\x15\\x5a\\xb0\\x3e\\xeb\\xa9\\x0b\\x0d\\xce\\xe7\\x03\\xf4\\xd6\\x58\\x0e\\x92\\xc1\\x12\\x14\\x1f\\xcb\\x41\\x1d\\x95\\x54\\x11\\x9a\\x19\\xb6\\xdf\\x0f\\x7d\\x5a\\xcd\\xcb\\x05\\x33\\x7f\\x8e\\x47\\x4d\\xd3\\xb9\\x5e\\xb0\\xea\\x8c\\x88\\x02\\x53\\x07\\x94\\x35\\xe5\\x14\\x02\\xaf\\x67\\xf3\\x62\\xb1\\x30\\x04\\x1f\\xc5\\xb3\\xe8\\x8f\\x5d\\x9f\\xb0\\x41\\x31\\x01\\xcb\\x63\\x36\\x17\\x96\\xa9\\x64\\xad\\x73\\xf7\\x95\\x8c\\x14\\x4e\\x2a\\x5a\\xe9\\xb9\\xb2\\x47\\x36\\x18\\x67\\xb8\\x40\\xc5\\x99\\x05\\xea\\xb1\\x57\\xf4\\x6e\\x28\\x7e\\x41\\xe0\\xe8\\x0a\\xc6\\x9b\\x85\\x61\\x90\\x35\\x3f\\x12\\x0c\\x4f\\x38\\x87\\xc3\\x38\\xd8\\x41\\x54\\xa9\\x48\\xd3\\xd2\\x60\\x2a\\x31\\xe7\\xde\\x33\\x78\\x71\\x3c\\x1a\\x8a\\xf1\\x78\\xe4\\xd3\\x74\\xae\\x16\\x2c\\x85\\xf1\\xf6\\xad\\x59\\xa5\\x23\\xf3\\xd2\\xad\\x1d\\xaf\\x29\\x18\\x22\\x14\\x73\\x8d\\x2b\\x67\\x16\\xaf\\x1d\\x00\\xb5\\x7f\\x62\\x10\\x10\\xb5\\xd2\\x11\\xa7\\xf3\\x9d\\x0f\\xec\\xc7\\xf1\\x60\\x52\\x57\\x82\\x7b\\x91\\x82\\xea\\x32\\x80\\x1c\\xaf\\x02\\x9e\\x2d\\xd2\\xe6\\xfe\\x9a\\x95\\x75\\x7b\\xc5\\x74\\x00\\x2d\\xe6\\x0b\\x97\\x6f\\xa9\\x62\\x61\\x9a\\x55\\xea\\x3c\\x58\\xfe\\x89\\x42\\x8a\\xef\\xd3\\x0d\\x7d\\x2e\\x1b\\xa7\\x00\\xf7\\xa9\\x7f\\xb5\\x56\\xfe\\x9f\\xd2\\x91\\xc3\\x8e\\x90\\x06\\xeb\\x36\\x1e\\x11\\xfa\\x4f\\x88\\x47\\x82\\x06\\xbb\\xcf\\x25\\x38\\x01\\x08\\x62\\x96\\x1b\\x3f\\xf3\\x8d\\x0c\\x82\\xe5\\x38\\xb4\\x5d\\xa0\\x37\\xcd\\xd4\\x6b\\xc8\\xa4\\xa1\\x37\\xd0\\x1f\\xc4\\x91\\xc8\\x3f\\xc8\\x6e\\x3e\\x77\\x8b\\x92\\x00\\xe5\\xf5\\x84\\x32\\x6e\\x2f\\x08\\x33\\x6b\\x05\\xbf\\x08\\x05\\xd0\\x42\\x75\\x0d\\x7f\\x31\\xd4\\xba\\x81\\xf0\\x48\\xb0\\xb9\\x45\\x68\\x65\\x45\\x28\\x5b\\xef\\x0c\\xef\\x7b\\x61\\x36\\xa8\\x13\\x5b\\xdd\\x8e\\x05\\xf6\\xae\\xae\\x5c\\x9d\\xce\\x48\\xad\\x28\\x17\\xfa\\x30\\xc3\\x39\\xd3\\x87\\x79\\x05\\x7d\\x40\\x9d\\x6e\\x1f\\x7e\\x46\\xc0\\x87\\x5f\\x58\\x78\\x78\\xa6\\x2b\\xfb\\x16\\x7a\\x53\\x8d\\x0f\\x7a\\x5f\\x1d\\x3b\\x2e\\x0b\\x45\\xcf\\xf4\\xe7\\xd8\\xa4\\xad\\x4b\\x51\\xd9\\x8a\\xc2\\x6d\\x6b\\x21\\x92\\xb7\\x7a\\xc1\\x6c\\x6d\\x4e\\x06\\x2c\\x7b\\x1d\\x16\\x1d\\xba\\xab\\x8f\\x0d\\x5c\\x8e\\xfe\\xf6\\xea\\xbb\\x77\\xb5\\x3d\\xd4\\x0d\\xbe\\x6e\\x24\\x10\\x70\\x4a\\xc1\\xb7\\x67\\x3e\\xf7\\xf2\\xb3\\x78\\x30\\xd2\\x74\\x30\\x58\\x2c\\x88\\x6f\\xfb\\x4c\\x8a\\xbb\\xd4\\xa3\\x76\\xec\\x24\\x80\\xb3\\xff\\x92\\xd1\\xff\\xfd\\xe2\\xa0\\xeb\\x18\\xe2\\x45\\x00\\xc2\\x8b\\xbf\\x38\\xf0\\xfa\\xff\\xba\\xbe\\xff\\xaf\\xef\\xbb\\x53\\xad\\xb2\\xf5\\x06\\x61\\xd1\\x60\\xc4\\x17\\xf4\\xc1\\xf1\\x58\\x71\\xc6\\xc3\\xa3\\x19\\x3f\\x34\\x04\\x27\\xe2\\x70\\xdf\\x6f\\x7f\\xcc\\xbf\\x1d\\x8c\\xb8\\xfb\\x74\\x97\\xea\\x69\\x61\\x5b\\x91\\x4f\\xdb\\x5f\\x77\\x4a\\x80\\x7a\\x8c\\xed\\xda\\x83\\x71\\xd2\\x45\\xe8\\x3f\\x8e\\x63\\xb8\\xbc\\x30\\xfb\\xb4\\x08\\x69\\x28\\x03\\x71\\xe0\\xe3\\x48\\x49\\xe6\\x96\\xb2\\x6a\\xf3\\x1a\\x9d\\x33\\x61\\x93\\xb1\\x88\\x0e\\xc4\\x91\\xc3\\xe1\\x25\\x07\\xfb\\x1f\\x77\\x63\\x85\\x05\\x3c\\xe8\\xc0\\xd7\\xa5\\xde\\x5a\\xe6\\x8c\\x8e\\x68\\x96\\x18\\x6c\\x5f\\xd9\\xc4\\x2a\\x55\\x48\\xe6\\x36\\x83\\x13\\x04\\x02\\x43\\xa3\\xd4\\x1e\\xb3\\xb5\\xd9\\x41\\x34\\x11\\xc0\\x1c\\xc0\\xe4\\x6d\\x59\\x8e\\x41\\x3e\\x8d\\xf3\\x71\\xeb\\xdd\\x37\\x32\\x2a\\xd1\\xbf\\x98\\xb4\\x5e\\x69\\xfb\\x4a\\x52\\x7d\\xe6\\x8d\\xc7\\xa2\\x67\\x6b\\xec\\xf4\\xd9\\x57\\xb7\\xf8\\xaa\\xf6\\x5c\\x53\\xc1\\xd0\\x39\\xce\\x2d\\xec\\x73\\x09\\xce\\xaa\\x9c\\x0c\\x87\\x95\\x55\\x49\\x14\\x84\\x16\\x35\\x84\\xda\\x68\\x2d\\x69\\x77\\x35\\x35\\xae\\x66\\x3b\\x3b\\xc4\\x5c\\x9b\\xf1\\x72\\x1c\\x6f\\x48\\xda\\xda\\xa2\\x83\\x6d\\x63\\xc6\\x7c\\xab\\x17\\xb5\\xbd\\xf3\\x3f\\xa4\\x77\\x3c\\xf7\\x11\\x33\\x90\\x66\\x87\\x78\\x13\\x81\\xcd\\xfb\\x17\\xd5\\x3a\\x2d\\x79\\x6e\\xc8\\x69\\x7a\\x70\\xb0\\x22\\xa9\\x28\\xb8\\x56\\xf3\\x95\\xd8\\x71\\xf0\\x5b\\xff\\xb7\\x8c\\x7a\\xc0\\x09\\xe4\\x73\\xb0\\x1e\\xed\\xa0\\x1e\\xea\\xa1\\x12\\x0f\\x2d\\xe7\\xd5\\xb6\\xc3\\xaa\\xac\\xd9\\xd7\\xc2\\x9c\\xc7\\x13\\x87\\x4d\\xb1\\x8a\\x04\\xf8\\x5c\\xe6\\x3a\\x32\\x3b\\x45\\x8e\\x47\\x09\\xcf\\xbf\\xe2\\xa3\\x13\\x29\\x4c\\x3c\\x37\\x59\\x47\\x95\\x39\\x07\\x07\\x15\\xdb\\x29\\xb1\\xcb\\xeb\\x29\\xb8\\x4b\\x57\\x54\\x30\\xeb\\x34\\x1b\\x91\\xc4\\xea\\xf8\\x3a\\xac\\x87\\xa6\\x82\\xa6\\x84\\xd4\\x1d\\x7f\\x3d\\x4e\\x94\\x21\\xf9\\xca\\x20\\x7d\\x86\\xaa\\x4f\\x9a\\x72\\x2a\\x30\\x8c\\x87\\xf7\\x56\\xf7\\x0b\\xa9\\x1e\\x58\\xba\\xc6\\x19\\xe0\\xe7\\x88\\x93\\xd9\\x77\\xc2\\x90\\x78\\x36\\x7c\\x39\\x95\\xa4\\x65\\xdf\\xfc\\x6f\\xd9\\xf1\\xc3\\x75\\x37\\x49\\xb6\\xae\\x6f\\xa3\\xff\\x6a\\x94\\x7a\\x02\\xd5\\x4e\\x36\\xf4\\x15\\x43\\xaa\\x03\\x5d\\x60\\x2f\\x2b\\x72\\xa8\\x58\\x33\\xda\\x3f\\x04\\x32\\x92\\xe1\\xe6\\x8b\\x8e\\xeb\\x4f\\x8b\\xe1\\x68\\x82\\x52\\x0c\\xd6\\xea\\x9e\\x97\\x03\\x73\\x2b\\x30\\xf2\\x5e\\xa4\\x68\\x63\\x30\\x5a\\x59\\xca\\xe5\\x0b\\x73\\xfe\\x0c\\x2f\\x44\\x1d\\xe7\\x43\\x6d\\x40\\x4e\\xe7\\x87\\x30\\xc8\\x5c\\xa4\\xbb\\x41\\xe0\\x94\\xf8\\x6b\\x9b\\xd3\\x72\\x21\\x53\\x5b\\x0c\\x94\\x3e\\x1e\\x41\\x06\\xf1\\x85\\xf4\\x42\\x08\\x4d\\x5c\\x3e\\x3c\\xde\\x2c\\xe5\\xcf\\x6d\\x7e\\xc0\\x1f\\xd9\\xc0\\xf5\\xe4\\x42\\x98\\x5d\\x67\\xc0\\x51\\xcc\\xc4\\x9c\\x2f\\xc6\\x72\\xce\\x17\\x89\\x29\\x1d\\x9b\\xb2\\x60\\x63\\x7e\\xe9\\xb0\\x58\\x2e\\xd0\\x66\\x13\\xf6\\x2c\\x75\\x78\\x72\\xca\\x3b\\x39\\x8f\\x51\\x96\\xfb\\x0e\\x6c\\x71\\x06\\x20\\xde\\x05\\x51\\x90\\x7c\\xa1\\xee\\x36\\x05\\x87\\xe4\\xd4\\x8b\\x16\\xad\\xfa\\xc7\\x5f\\xf8\\x98\\xef\\xed\\x6d\\xa9\\x6e\\x4b\\x5e\\x55\\x27\\xbd\\x7d\\x27\\x3d\\x71\\x32\\xd8\\x4a\\x6b\\xe3\\x34\\xb8\\x74\\xae\\xd6\\x1f\\x85\\xcc\\xd5\\xc7\\xe1\\xb0\\xef\\x5d\\xae\\xb2\\xad\\x41\\x86\\x81\\x0f\\x7d\\xa8\\xfa\\x30\\x3d\\x0f\\x87\\x3d\\xce\\xdb\\x9a\\xb9\\x96\\x71\\xa3\\x6c\\x79\\xbe\\x7f\\x6d\\x40\\x7b\\x02\\x02\\x32\\x1f\\x0a\\x42\\x33\\x8c\\x83\\x82\\x62\\x33\\x30\\x8b\\xb2\\xae\\x68\\xf8\\x40\\x3c\\xd5\\xfd\\x9b\\x64\\x87\\x9a\\xfe\\x24\\x59\\xc8\\x12\\xc0\\x78\\x3a\\xdc\\x23\\xf0\\x33\\x55\\xf4\\x9b\\x6c\\x79\\xde\\xba\\x0e\\xcd\\x29\\x21\\x04\\xb5\\xb5\\x8e\\x60\\xfe\\xf6\\xc4\\x9a\\xa0\\xa3\\x7b\\x70\\xba\\x15\\x43\\x3e\\x23\\x6d\\xfb\\x83\\x0c\\x1d\\xca\\xbf\\xc6\\xe8\\x2c\\xec\\x27\\x69\\xaf\\x5c\\x8f\\xfe\\x1c\\x6d\\xbe\\x2e\\x44\\x75\\x91\\x16\\x25\\x4f\\xf3\\xfd\\x85\\x90\\x17\\xdb\\x8a\\xc7\\x17\\x10\\xf5\\xf1\\xe2\\xa3\\xd0\\xeb\\x8b\\xd7\\x2f\\x2f\\xfe\\x36\\x18\\x55\\xb1\\xc8\\x47\\x83\\xbf\\x5d\\xdc\\x6d\\x2b\\x7d\\x71\\xc3\\x2f\\xac\\x34\\x98\\xe7\\x17\\x28\\xc0\\xbe\\xd0\\x6b\\x7e\\x81\\xd3\\x31\\xff\\x4c\\x95\\x92\\x6f\\x2b\\x9e\\xc7\\x03\\xe2\\xd1\\x2c\\xef\\x02\\x3f\\x1b\\x02\\xaa\\x8d\\x97\\xa8\\x6c\\xc7\\x55\\x9c\\x5a\\xf1\\x7e\\xaa\\x57\\xaa\\xbc\\x63\\x12\\x05\\xcb\\x02\\xac\\x45\\xde\\xda\\x52\\xe0\\x51\\x3d\\x4a\\x94\\xbe\\x76\\x9c\\x66\\x7f\\x6c\\x45\\xc9\\x5d\\x6f\\x8a\\x96\\x71\\x5a\\x6d\\x78\\xa6\\xdf\\x99\\xc3\\x0a\\xf1\\xd1\\x86\\xc3\\xc2\\x6e\\x04\\x5d\\xb3\\x6c\\x38\\xcc\\x5c\\x78\\xd9\\x1c\\x9f\\x30\\x6c\\x30\\xea\\x9e\\x73\\xf6\\x6f\\x47\\xdf\\x66\\x7a\\xc7\\x0a\\xfb\\x13\\xb7\\x31\\xc3\\x27\\xcc\\xe7\\x99\\xe3\\x83\\x4d\\xe6\\xb9\\xb6\\x34\\xb1\\xa3\\xd4\\x4b\\xfb\\x1c\\x8c\\x05\\xa9\\x97\\xa0\\xc0\\x56\\xc1\\x58\\x63\\x6c\\x6e\\x75\\xd5\\xcb\\x3b\\x6e\\x19\\x44\\x5f\\x02\\x71\\x57\\x2a\\x2b\\x94\\xc6\\xb2\\x1b\\xb5\\xe3\\x4d\\x8d\\x6c\\x5b\\x96\\x5c\\xea\\x97\\xfc\\x5e\\x64\\x98\\x57\\x0a\\xbf\\x18\\xb6\\xf0\\xd0\\xaf\\x55\\xba\\x4c\\x33\\x2d\\xee\\x79\\xf3\\xad\\x22\\xad\\x34\\x98\\x93\\xb5\\xab\\x15\\xd6\\xb8\\xac\\x32\\x17\\xc2\\x8e\\x0a\\x62\\x7a\\x7d\\xdf\\x1d\\xad\\x95\\xea\\xb8\\x6a\\xf0\\xd8\\xee\\x2b\\x54\\x81\\x7f\\x90\\x58\\xf8\\xc5\\xa6\\x54\\x3b\\x11\\xb4\\x5b\\xae\\x45\\x9e\\x73\\xf9\\x5a\\xe6\\x22\\x0b\\x8a\\xd1\\x58\\x0f\\x50\\xb0\\x9b\\x80\\x83\\x4b\\xd5\\x4b\\x51\\x19\\xdc\\x9f\\xb7\\xbe\\xe6\\x73\\x3f\\xb5\\x86\\x90\\xab\\x77\\xbc\\x12\\x7f\\x72\\x26\\x22\\x0c\\x8c\\x65\\x4a\\x2d\\xc7\\x34\\x28\\xe1\\xd5\\x80\\x10\\x5a\\xc6\\xf8\\xfb\\x25\\x87\\x7c\\xd6\\x13\\x42\\x7f\\x93\\x73\\x19\\x8b\\x7c\\xc1\\x24\\x38\\x26\\xcf\\xa2\\x34\\xc6\\xa5\\x89\\x24\\x1d\\x64\\x16\\xba\\x0e\\xe8\\x2f\\xe0\\x22\\xda\\xbc\\xd9\\x58\\x48\\x39\\xa0\\x7f\\x48\\x73\\xfe\\x83\\x13\\x0e\\xf7\\xc1\\x4d\\x6b\\x38\\x94\\x6e\\x18\\x84\\x24\\xce\\x0c\\x95\\xe3\\x6d\\x7e\\x95\\x8a\\x82\\xe7\\x17\\x5a\\x5d\\xe0\\x2d\\xbb\\xc0\\x80\\xa6\\xe6\\x3a\\xfe\\x4d\\x5f\\xd8\\x8b\\x70\\x61\\xe7\\x7b\\xb1\\x2a\\xd5\\x1d\\x5c\\xda\\x5b\\x71\\xcf\\xe5\\x85\\xd0\\xfc\\x0e\\xf5\\xc2\\x17\\xc1\\x11\\x3c\\x21\\x12\\x0f\\xc1\\x4b\\x48\\x27\\x26\\xa4\\x4e\\x85\\x7c\\x16\\x94\\xf2\\xda\\x67\\x29\\xb1\\x21\\x8f\\x25\\x0d\\xcf\\xb9\\xa3\\xd7\\x1d\\x88\\xfc\\x22\\xd2\\x64\\xc6\\x87\\x43\\x35\\x53\\x89\\x9c\\x89\\x2b\\x99\\x60\\x56\\xb8\\x73\\x3c\\xf6\\x83\\x2c\\x76\\xc8\\x61\\xeb\\x87\\xb8\\xeb\\x87\\xd8\\xea\\x13\\xae\\xba\\xb5\\x1d\\xed\\x48\\xd8\\x5e\\xa2\\xdc\\x41\\xb0\\x81\\x5a\\x8f\\xd0\\xc6\\x1f\\xa5\\xe4\\xd5\\x46\\xc9\\x4a\\xdc\\xf3\\x99\\xb6\\x87\\x27\\x22\\xc9\\x9e\\x47\\x3a\\xa8\\x94\\x77\\xee\\xa9\\xe9\\xe0\\x46\\xc8\\x1c\\xed\\x56\\x21\\xb6\\x5f\\x1f\\x3a\\x77\\x1f\\xab\\xfb\\xe0\\x63\\x4b\\xd6\\xee\\xc1\\xe3\\xcc\\xdc\\xb1\\xe6\\x31\\xb9\\x34\\xf8\\xf3\\x78\\xec\\x43\\xbc\\x3f\\xae\\x56\\x55\\x56\\x72\\x2e\\x5f\\x58\\x8c\\xa8\\xc1\\x94\\x39\\x95\\x59\\xcf\\x5b\\xe8\\xf7\\x27\\x0e\\x61\\xb7\\x72\\x51\\x5b\\xde\\xdf\\x7d\\xff\\x0f\\x1b\\x1a\\xcf\\x02\\x5d\\x07\\x4d\\x11\\xae\\xd6\\x95\\x36\\x78\\xd0\\xd5\\x4d\\xc1\\xe1\\x03\\xea\\xdb\\xf7\\x76\\xd5\\x60\\x42\\x69\\x5c\\x6e\\xa5\\x84\\x34\\xc7\\xa6\\xc2\\xcc\\x93\\xbb\\xe2\\x4f\\xfe\\x1c\\x76\\xe0\\x65\\x99\\x7e\\x74\\x69\\xc0\\xb5\\x3b\\x90\\xbc\\x4e\\xc2\\x9a\\x28\\x97\\x0b\\x1f\\x5a\\xec\\x2c\\xe4\\x88\\x74\\x71\\x1d\\x0d\\x55\\x6b\\xc7\\x6d\\x28\\xda\\x9e\\x0b\\x60\\x68\\x9f\\x10\\x8a\\xa7\\x4c\\x34\\xe8\\xa8\\x6d\\xb2\\x1b\\x41\\x88\\x2a\\x5a\\x61\\xf8\\xd2\\x33\\x50\\x9a\\x1a\\x7c\\xd6\\x3d\\x12\\xc7\\x63\\xbb\\xd3\\x6e\\xa3\\x88\\x4c\\x6d\\x8c\\x6a\\xc6\\x58\\xda\\x44\\xb5\\xb6\\xe8\\xc8\\x94\\xe1\\x4f\\x74\\x68\\x29\\x8e\\xc7\\xc8\\xd5\\xb7\\xb5\\xa9\\xaf\\xec\\xaa\\x52\\xd1\\xc6\\x57\\xed\\x69\\xee\\x79\\x24\\x68\\x01\\xda\\x69\\xd1\\x3d\\x9e\\x16\\x62\\xd2\\x83\\xf9\\x97\\xa4\\xb5\\xa1\\x38\\x65\\xac\\x24\\x02\\x59\\x3a\\x17\\x34\\x05\\x73\\x03\\x11\\x00\\x3a\\xd1\\x40\\x61\\x43\\xd2\\x89\\x18\\x2d\\xc7\\x23\\x42\\x6a\\x2e\\xab\\x6d\\x69\\x4d\\x39\\xbe\\x49\\xef\\xf9\\xeb\\x97\\xe6\\x7a\\x7f\\xdb\\x8e\\xc6\\x18\\x28\\x01\\x22\\xab\\xf0\\x3a\\x68\\x83\\xc0\\x79\\x4d\\x48\\x7d\\xb3\\x15\\x45\\xfe\\x63\\xf9\\x33\\xc0\\x52\\x6b\\x14\\xf2\\x89\\x68\\x9e\\xd6\\x1c\\x06\\x9c\\xdc\\xf0\\xa7\\x62\\x1d\\xe5\\x40\\xc9\\xf3\\x6d\\xc6\\x23\\xf7\\x3d\\x8c\\x48\\x64\\x30\\x11\\x21\\xf4\\x50\\x3b\\x3e\\x68\\xbe\\x98\\x82\\xb3\\x17\\xab\\x9c\\x29\\x5f\\x27\\x38\\xcb\\x5d\\xba\\x69\\x4b\\x99\\x0d\\xf9\\x4f\\xa5\\xd7\\x2f\\x28\\x36\\x40\\x77\\x73\\x5a\\x59\\xc9\\xb8\\x8b\\xa5\\xef\\xe1\\x34\\xa7\\x79\\x93\\x53\\x69\\x16\\xb0\\x36\\x49\\x35\\xf3\\xb9\\x37\\x2c\\x03\\x94\\xa3\\x14\\x65\\x36\\x28\\xd3\\x5c\\xa4\\xc5\\x1b\\x01\\x59\\x06\\x4c\\xc5\\x2c\\xd5\\xfc\\x56\\x95\\x7b\\x53\\x15\\x4b\\xeb\\x1a\\x04\\x1e\\xdf\\x46\\x15\\x0d\\x74\\x08\\x55\\x70\\x41\\x52\\x66\\xc8\\x24\\xd4\\x86\\xa4\\xe6\\x68\\x17\\xec\\xbb\\x08\\xa5\\x4f\\x54\\xc4\\xf0\\xad\\x40\\x54\\xdc\\x64\\x03\\x18\\x0e\\x7f\\x95\\x51\\xf3\\x48\\x4b\\xc2\\x18\\xfb\\x55\\x46\\x22\\xce\\x03\\xb5\\x55\\x50\\x83\\x85\\x6f\\xa8\\x9a\\xa7\\x0b\\x76\\x39\\xb1\\x01\\x60\\xc0\\xd3\\x53\\xac\\xa2\\xd4\\x10\\xb4\\x72\\x38\\x94\\xf3\\x74\\x81\\xa2\\x5b\\xc6\\x0a\\x92\\x31\\xf3\\x8c\\x61\\x21\\x32\\x43\\x66\\x58\\xad\\x34\\x5a\\x44\\x15\\x84\\x44\\x07\\x91\\x27\\x29\\xca\\x43\\x0a\\x88\\x07\\xae\\x21\\x48\\x34\\x22\\x54\\x5d\\x13\\x2a\\xe7\\x19\\xa0\\xf9\\xac\\xce\\x62\\x03\\x6d\\x41\\x04\\x50\\xc3\\xca\\xa8\\xe0\\xbc\\x1d\\x8f\\xd6\\xa0\\xd0\\x70\\x71\\xf8\\x5a\\xa2\\x0d\\xcf\\xd7\\x3c\\x76\\x21\\xcd\\x00\\xe4\\x50\\xcf\\x49\\x11\\xfa\\x35\\x44\\xdf\\x79\\xae\\x76\\x08\\x98\\x08\\xa9\\xad\\xf3\\x80\\x25\\xa6\\x30\\x18\\x7f\\x8f\\xd8\\xcd\\x91\\x86\\x70\\x48\\x81\\x15\\x9d\\x4a\\xeb\\x06\\x2e\\xe6\\x72\\xc1\\x0c\\x43\\x49\\xcd\\x1f\\x66\\xd0\\x0d\\x54\\x60\\xbc\\xdb\\x7b\\x7f\\x48\\x52\\xdf\\xb5\\x60\\x5d\\xa5\\x92\\x75\\x5e\\x6b\\xfc\\xd8\\x30\\x2b\\x80\\x08\\x4d\\x81\\xc4\\x94\\x43\\xd8\\x09\\x4e\\x34\\x18\\x9d\\x18\\xde\\x21\\x88\\xf3\\x6a\\x18\\x17\\xee\\x52\\xe9\\x0a\\x2a\\xc7\\x02\\x72\\xf3\\x77\\x48\\x48\\x1e\\x57\\x98\\x6b\\x97\\xc4\\xe6\\x4d\\xf4\\xb3\\x8c\\x06\\xe0\\x25\\x35\\xa0\\x03\\x98\\xcc\\x80\\x00\\x18\\xbf\\x53\\xf7\\xfc\\x67\\x59\\xf2\\x15\\x2f\\xb9\\xcc\\x9a\\x0e\\x4e\\x22\\xbe\\xfb\\x59\\x99\\xfb\\x02\\x79\\x90\\xdd\\xa4\\x12\\x51\\xd7\\x4c\\x4f\\xdd\\x8c\\x9e\\x0a\\xcf\\x1e\\x36\\x11\\x2b\\x91\\xec\\x0e\\xa5\\x74\\x20\\xff\\x60\\x4f\\x0f\\x13\\xc6\\x58\\x4b\\x7a\\x01\\xaa\\xbf\\x78\\x69\\x7b\\x27\\xc4\\xf7\\xd6\\xbf\\x1a\\x92\\x9c\\xc0\\xa8\\xd0\\xec\\xee\\x64\\x7f\\x50\\xc7\\xdf\\xde\\x16\\x17\\x5c\\x06\\x24\\x5c\\x10\\x53\\xf6\\xfc\\xb2\\x50\\xc9\\x26\\xa1\\x87\\xac\\x7c\\xa2\\xa6\\xb2\\x31\\x6b\\x50\\xcc\\x9c\\x1e\\xe7\\x98\\x08\\xe8\\xa6\\x35\\x58\\x1f\\xcc\\x5e\\x79\\x4d\\x62\\xa0\\x2d\\x01\\xde\\x13\\x7e\\x0d\\x87\\x95\\x8b\\xb9\\x9b\\x62\\x5e\\xf8\\xde\\xb9\\xd3\\xde\\x8f\\x10\\x6a\\xed\\xe8\\x53\\x5a\\x35\\xfa\\x49\\x97\\x60\\xd9\\xeb\\x2a\\xd3\\x86\\x8e\\x32\\x2d\\xe0\\x78\\x30\\x85\\xff\\x8f\\xc7\\x09\\xd5\\x71\\xdf\\x5d\\xaa\\x20\\x0c\\x28\\x2a\\xd6\\xd8\\x60\\x30\\x52\\x36\\xbd\\x76\\x15\\xdf\\x63\\x4c\\x62\\x73\\x9f\\x2a\\x3b\\x20\\x17\\xa0\\x19\\x9a\\x34\\xd6\\x8d\\x24\\x7c\\xb0\\x54\\x3a\\xf6\\xde\\xa9\\x18\\x17\\x42\\xfe\\xee\\x70\\x8e\\x85\\x42\\xf6\\x1a\\x3f\\xf3\\xac\\xaf\\xb5\\x26\\x4d\\x09\\x3d\\xb4\\xb5\\x0c\\x1f\\x00\\x58\\xc3\\x71\\x0d\\x4b\\xca\\xba\\x65\\x79\\x90\\x2e\\xa6\\xed\\x84\\xb5\\x41\\x00\\x69\\xec\\x31\\x6c\\x8c\\x9f\\x75\\x16\\xa8\\x25\\xa1\\x7d\\x9f\\x1c\\x0e\\xdb\\xd5\\x14\\xa9\\xdb\\xf3\\x02\\x86\\xcd\\x86\\x54\\xb5\\x06\\x38\\xad\\xf5\\xf1\\xd1\\x26\\xbb\\x7b\\x60\\x4e\\x20\\x07\\xfa\\xcb\\xf7\\x7e\\x92\\x11\\xfe\\xdb\\xa8\\x73\\xbe\\x69\\x64\\x63\\x34\\x1e\\x4e\\x0e\\x8b\\x20\\xe1\\x6a\\x43\\xb7\\x91\\x19\\x2c\\xd8\\x2d\\xc3\\xc3\\xc1\\x93\\x7f\\xe1\\x17\\x91\\x12\\x3d\\xa5\\x5d\\xb8\\x1e\\x10\\xa7\\x2f\\xeb\\x0d\\x63\\x8d\\x3a\\x33\\xe1\\x59\\x33\\xca\\x1b\\x4e\\x5f\\x74\\x65\\x1e\\xa2\\x57\\xe6\\xd1\\xcd\\x01\\xfb\\x6d\\xe4\\x29\\x0e\\x20\\x05\\xbe\\xe6\\x31\\xde\\x60\\x83\\x16\\x20\\xee\\x7e\\x60\\x38\\xc5\\x7b\\xd9\\xdc\\xcb\\x7e\\x49\\x60\\x2f\\xf5\\x44\\x79\\xdc\\x4b\\x12\\x79\\x71\\x92\\xd5\\x90\\xb4\\x48\\x15\\x1e\\xf0\\xfd\\x98\\xfe\\xc2\\x56\\x6a\\x3e\\xcc\\x81\\x65\\x01\\xf9\\xd3\\x16\\x05\\xb3\\x90\\x30\\x61\\x2b\\x5b\\xfc\\x0c\\x6f\\xb1\\x37\\xb0\\x7c\\xde\\xb0\\x2c\\x30\\xd7\\xa3\\x18\\xe8\\xb0\\x9f\\xd5\\xc2\\x71\\x0f\\xe8\\xe1\\x4e\\xe5\\x3c\\xd1\\xb4\\x31\\x02\\x04\\x83\\x9d\\x6e\\xde\\x8d\\xce\\x7c\\x5b\\xe0\\xf5\\x54\\x5c\\x8a\\x9f\\x70\\x27\\xc5\\x7e\\xca\\xe9\\x1f\\x26\\xa1\\xa9\\x1a\\x1c\\x88\\x3e\\xfc\\x38\\xd5\\x4f\\x44\\x60\\xbc\\x76\\x68\\x4e\\x68\\x22\\x6a\\x34\\x50\\x0d\\xcf\\xb0\\x36\\x64\\xde\\xa5\\x1c\\x0e\\x41\\xb2\\x9c\\x06\\xd6\\x6d\\x53\\xd1\\x1e\\xba\\x3f\\xbf\\x8a\\xb8\\x70\\x66\\x77\\xe9\\x2e\\x1a\\x09\\xcb\\x6c\\xfc\\x78\\xcf\\xcb\\x55\\xa1\\x3e\\x46\\x84\\x96\\xa4\\xe6\\xf1\\xf2\\x4e\\x48\\xeb\\xc9\\xc6\\x4a\\xb3\\xd4\\x78\\x6a\\xdf\\xa4\\x7b\\xb5\\x85\\xcb\\x2f\\x8f\\xc7\\x6f\\xa3\\x14\\x8f\\x9d\\x6e\\xae\\x0f\\x69\\xea\\xda\\x81\\xa2\\xf9\\x61\\x2f\\x2f\\xda\\xd9\\x0d\\xb0\\xe7\\xb1\\x92\\xac\\x06\\x77\\xff\\x39\\xa0\\x83\\xa5\\xc8\\x0d\\xda\\xc6\\xd7\\x56\\xb4\\x34\\x1c\\xf2\\x78\\x09\\x27\\xe7\\x9b\\x54\\xe6\\x05\\xc8\\x09\\x9b\\xb7\\xc0\\x62\\x70\\xcf\\x0e\\xd4\\xed\\xf1\\xf7\\x25\\x02\\x79\\xe0\\xd4\\x60\\xab\\x01\\x3d\\x9c\\x39\\x2e\\x5f\\x73\\x77\\xa9\\x0d\\x85\\x86\\x8c\\x91\\x4f\\x3f\\xd5\\x4a\\x2e\\xef\\x49\\x6c\\x60\\x17\\xa1\\xe6\\x13\\x36\\x31\\x7c\\x1a\\xd6\\x7e\\xc2\\x26\\x53\\x1e\\x4a\\xf3\\xbe\\x85\\xac\\xcb\\x3b\\x77\\xc1\\xe5\\x70\\x18\\x90\\xe9\\x8c\\x41\\x3c\\x0b\\xa4\\x6e\\xc1\\x6a\\xca\\x53\\x8b\\x8d\\x31\\xa7\\x21\\x1d\\xc3\\x85\\x75\\xe1\\x32\\x74\\xec\\x13\\x14\\x10\\x03\\xf7\\x78\\x58\\xa9\\x21\\x56\\x3c\\x53\\x64\\xf6\\x00\\xd8\\xa2\\x33\\x9b\\x69\\x17\\xc9\\x2f\\x75\\xb0\\xfd\\x5d\\x60\\x38\\x70\\x62\\xf9\\x40\\xf6\\x8e\\x7b\\x70\\x79\\x76\\x0f\\x5c\\x77\\x9f\\xba\\xc1\\x9e\\x9c\\x44\\x6a\\xe5\\xcc\\x35\\x33\\xb4\\xcb\\x68\\x24\\x49\\xf7\\xb0\\x46\\x92\\x8a\\x99\\x8e\\x1c\\x36\\x05\\xcc\\x9c\\xc8\\x9a\\x24\\xba\\xe7\\xbe\\xc3\\xb4\\xcf\\x8c\\xab\\x26\\x75\\x67\\x21\\xce\\x88\\x0c\\xfa\\x6e\\xf4\\xc1\\x50\\x9c\\x89\\xb4\\x49\\xeb\\x35\\x85\\x2e\\x79\\x67\\xaa\\x53\\x58\\xad\\x13\\x2e\\xba\\xb5\\x5a\\x6e\\x50\\x0a\\xdc\\xea\\x42\\x7c\\xb7\\x74\\x07\\x16\\xa2\\xa9\\xf9\\x8e\\x0d\\x1f\\x7a\\xd2\\x65\\x38\\xcf\\xa6\\x47\\x83\\x26\\xe5\\x69\\x86\\x24\\x1c\\xd6\\x19\\x49\\x97\\xd5\\x25\\x9d\\x5c\\xa4\\xe1\\x30\\x4a\\x6d\\x20\\xf0\\x99\\x0e\\xd8\\xfb\\xcb\\x40\\x74\\x03\\x91\\xc8\\xc1\\x42\\x34\\xd2\\x24\\x89\\x6c\\x3a\\x09\\x42\\x7f\\x91\\xd1\\xc1\\xb3\\x5c\\xc4\\xe6\\xfa\\xe8\\x8c\\x09\\xd8\\x0b\\xcc\\x47\\x77\\x22\\xf7\\x71\\xa0\\x16\\xa5\\x3f\\xdc\\x67\\x84\\xac\\x59\\x4f\\xe5\\xa9\\x2f\\xb3\\x26\\xad\\x3d\\x72\\x24\\x30\\x47\\x85\\x6f\\x79\\x4b\\x97\\xe0\\xa6\\xeb\\xe6\\xa6\\x3b\\xf0\\xe1\\xa0\\xcf\\x99\\x45\\x33\\x9d\\x9e\\x87\\x3d\\x4d\\x60\\x1b\\x7b\\x77\\x01\\xcf\\xa0\\x5b\\x45\\xc3\\x8f\\x18\\x76\\x2e\\xfe\\xd3\\x40\\x17\\xc3\\x5d\\xc1\\x13\\xe6\\x44\\x69\\x20\\x12\\x71\\x3c\\x80\\x79\\xe1\\x2f\\x2f\\x09\\xba\\x79\\xa8\\x6d\\xbf\\xb0\\x11\\x86\\x8e\\x3e\\x20\\x98\\xbc\\xa3\\x95\\xb5\\xe3\\xc4\\x1e\\xb9\\xcd\\xc9\\x51\\xe1\\x02\\x9d\\x38\\x06\\xc5\\x5d\\xe9\\xce\\x25\\x6e\\x62\\x13\\x1b\\x06\\x44\\x0f\\x87\\x97\\xca\\x51\\xe4\\x20\\x01\\x33\\x00\\x4f\\x05\\xc1\\x81\\x1e\\x4e\\x25\\x72\\xe2\\xe9\\xd4\\x33\\xf2\\x4b\\xb0\\xea\\x6f\\xad\\xd3\\x49\\xea\\xc3\\x07\\xb7\\xd4\\x36\\xfb\\x9c\\xad\\xe5\\xec\\x53\\xc9\\x4f\\x3c\\x65\\x21\\xfc\\xda\\x8c\\xaf\\xa7\\xe2\\x29\\x9b\\x4c\\xc7\\x63\\x41\\xda\\x5b\\x1a\\xf1\\xb9\\x58\\x9c\\xdd\\xaf\\x70\\x5c\\xed\\x29\\xf6\\xd3\\xb4\\x90\\x13\\x4b\\xc7\\xcb\\xac\\x10\\x1b\\xd8\\x9a\\x06\\xc1\\x55\\x16\\x8c\\x69\\x07\\xc6\\x90\\x3a\\xe9\\x85\\x62\\x0f\\xc3\\x7c\\x5c\\xa5\\xca\\x40\\x09\\xc8\\xb2\\x85\\x19\\x5d\\x61\\x7d\\x25\\x44\\x86\\x9c\\x4d\\x12\\x05\\x3f\\xc6\\xf8\\x6c\\x13\\x23\\xd9\\x1a\\xf0\\x30\\xb3\\x78\\x39\\x51\\x36\\x63\\xa7\\x2d\\x87\\xf4\\x8b\\xb6\\xa2\\x56\\x1b\\xe8\\x49\\xab\\xcd\\x18\\x9e\\x5c\\xa6\\x25\\xfb\\x1e\\x9f\\x66\\x0e\\xb3\\x27\\xca\\x96\\x8c\\xdc\\x2b\\xc3\\x3d\\x84\\x40\\xd6\\x42\\x28\\x48\\x7c\\x45\\xab\\x0e\\x98\\x7d\\x10\\x9d\\xb8\\x29\\x87\\x4e\\x7f\\xd5\\x33\\x24\\x6d\\x5e\\xa9\\xf2\\x7b\\x95\\xf3\\x53\\x2b\\xf7\\x1f\\x79\\x6c\\x30\\x45\\xd5\\xc4\\x40\\xef\\x41\\xb4\\x6a\\xa6\\x30\\x1f\\x13\\x06\\x9f\\x4d\\xe6\\x90\\x8c\\xa7\\x8d\\x82\\xda\\xd7\\xb2\\x85\\x40\\xe7\\xba\\xf1\\x14\\x70\\x72\\x11\\x6f\\xbd\\x15\\xca\\x32\\x50\\x6a\\x81\\xad\\x42\\xd5\\xb5\\xb7\\xed\\xc2\\xc8\\xec\\x73\\xbd\\x60\\x68\\x1e\\x04\\xc1\\x65\\x40\\xbe\\x32\\x5f\\x38\\xd6\\x12\\x0b\\x03\\x22\\x18\\x9e\\x51\\xa9\\x87\\xbf\\x77\\x68\\xd4\\x8b\\x0f\\xfb\\xf0\\x01\\x98\\xf9\\x84\\x1b\\x32\\xd1\\xf3\\xf5\\x0e\\xa1\\xba\\x81\\x25\\x9c\\x2e\\x37\\x69\\x59\\xf1\\xdc\\x7c\\xd4\\xc2\\x9f\\xe4\\xf2\\xba\\xb6\\xd6\\x65\\x9e\\xd5\\x6a\\x01\\x05\\xa7\\x0d\\x74\\x9e\\x40\\x5e\\x3b\\xe8\\xf0\\x10\\x2c\\x2f\\x84\\x4b\\x82\\x82\\x41\\x0d\\xdb\\xd8\\xbe\\xbb\\x2f\\xd4\\x56\\x76\\x3b\\x7e\\xf8\\x9a\\xdb\\xab\\x5d\\x9f\\x88\\x18\\x3e\\xb5\\x61\\x98\\xe7\\xce\\x7b\\x39\\x4d\\x5b\\xe2\\xc0\\x93\\xcd\\x77\\x47\\xe7\\x46\\xa9\\x82\\xa7\\xc1\\xc9\\x11\\x31\\x2e\\xfc\\xec\\xd2\\xfd\\x4a\\x2e\\xb9\\xfd\\x55\\x57\\xbe\\x1b\\x18\\x95\\x28\\x84\\xde\\x23\\xc5\\xd3\\xff\\x15\\xdb\\x8e\\x5d\\xf2\\x5a\\xab\\xdb\\x5b\\x9c\\x6b\\xd8\\xd4\\x71\\xdf\\x2d\\x0d\\xae\\x39\\x2d\\x97\\xfd\\xe5\\xee\\x14\\xb7\\xfb\\xb0\\x73\\x3e\\xd3\\xa4\\x4d\\xa0\\x75\\x07\\xde\\x21\\xd5\\xf8\\x6c\\x50\\xad\\xd5\\xc7\\x41\\x32\\x58\\x8b\\xdc\\x50\\x40\\xbd\\xc4\\x5b\\xc5\\x54\\x8b\\xcc\\xb2\\xb6\\x4b\\xde\\x18\\xb5\\x8a\\xbc\\x01\\xd5\\x14\\x8c\\x19\\xfb\\x3f\\x4e\\xbd\\x22\\x59\\xd1\\x83\\xc5\\x65\\x09\\xaf\\x09\\xf5\\xe2\\x03\\xcc\\xb2\\x1a\\xd2\\xa9\\x60\\x19\\x2f\\x9d\\x1b\\x06\\xa9\\xd7\\xe0\\x53\\xef\\xd6\\xf1\\xfc\\x54\\x2f\\xaf\\x49\\x6d\\x66\\xf6\\x59\\x75\\xad\\x3b\\x5b\\x57\\x1e\\xd7\\x87\\x1c\\x3c\\x7c\\x00\\x4e\\xcd\\x3d\\xc0\\x79\\xc4\\xd4\\xa9\\x6e\\x95\\x20\\x4b\\x61\\xb8\\x68\\xf6\\x03\\x11\\x09\\x52\\x31\\x05\\xed\\x49\\xed\\x2b\\x74\\x93\\x73\\x62\\x78\\x22\\x9b\\x9d\\xd3\\xa5\\xb3\\x69\\xe4\\x9b\\xa8\\x35\\xa4\\xa9\\x95\\x92\\x98\\x0d\\x43\\x9a\\xa2\\x5f\\x5a\\xed\\x29\\x8c\\x73\\x42\\xc8\\xa9\\x97\\x61\\xb6\\xac\\xa0\\x31\\x6b\\x6f\\x47\\x7c\\xf1\\x87\\x76\\x24\\xa3\\x57\\xc9\\x95\\x1c\\x22\\x3f\\x39\\x28\\x03\\x2f\\xad\\x95\\x08\\x80\\x30\\xd0\\x27\\xd8\\x08\\x8d\\x27\\x08\\xdb\\x79\\x5a\\xfa\\x45\\xfa\\x4d\\xce\\x75\\x2c\\xf2\\x45\\xad\\xd5\\xf3\\xb4\\xe2\\xff\\xf8\\x5f\\xaf\\xef\\xd2\\x5b\\xe7\\x7d\\xdf\\xd2\\x8d\\x63\\x3c\\x57\\xad\\xcc\\x64\\x7e\\x7e\\xf7\\x06\\xab\\xd4\\xe1\\x68\\x7b\\x64\\xfb\\x5e\\x88\\x03\\x52\\x64\\x37\\x07\\x2a\\x59\\x24\\xa9\\xc2\\xb4\\xb8\\x69\\x9e\\xb7\\x82\\x08\\x45\\x90\\x35\\x8c\\x50\\x43\\x97\\x31\\x55\\x53\\xe5\\xeb\\x72\\x8c\\xb3\\x20\\xec\\x46\\xf4\\xb6\\xf2\\x01\\x1a\\xe4\\x82\\xd4\\x56\\xae\\xec\\xad\\xe1\\x2c\\xea\\xe3\\xb1\\x82\\x90\\x6a\\xbf\\x30\\x41\\xdd\\xef\\x5f\\x99\\x34\\x74\\x79\\x5b\\x34\\x80\\x19\\x6e\\xbf\\x0d\\x12\\x52\\xa3\\xd0\\x09\\xd8\\x6a\\x19\\x69\\x83\\x6b\\xfb\\x55\\xf0\\x36\\xe9\\xc2\\xb4\\x62\\x8d\\x28\\xd1\\xd9\\x7b\\x79\\xed\\xbc\\x79\\x53\\x7b\\xb1\\x11\\x24\\x9e\\x50\\xd1\\x00\\x19\\x99\\x01\\x4d\\x4d\\xcf\\x8d\\xd1\\xc9\\x84\\x36\\x5a\\x7d\\x2a\\x1b\\xc5\\x67\\x05\\x4f\\x39\\xc7\\x46\\x66\\xc8\\x1c\\xbb\\xd2\\x2d\\x8b\\x15\\xd5\\x6d\\xd1\\x7c\\xa6\\xa6\\x22\\x16\\xd5\\x33\\x5b\\x39\\xf2\\xb6\\x68\\xb3\\x34\\x22\\x09\\x8f\\x08\\x26\\x03\\x69\\x8d\\xa5\\x6e\\x1f\\xd3\\x87\\x36\\xde\\x66\\xa3\\x6e\\x9b\\xf1\\x80\\xbf\\x79\\xb3\\x32\\xc1\\xd9\\xee\\xdb\\x58\\x81\\xaa\\x2a\\x27\\x28\\x85\\x78\\x71\\x10\\xc0\\xaa\\xeb\\x8b\\x2d\\x66\\x83\\x8a\\x43\\xfc\\x67\\xe8\\x67\\x10\\xc6\\xff\\x87\\xcb\\xec\\xac\\xdf\\xbd\\xa7\\x71\\x3f\\x3a\\x9b\\x4f\\x16\\x2d\\x20\\x09\\xec\\xae\\x07\\x35\\xf3\\xc1\\x72\\x30\\x92\\xa3\\x81\\x6d\\xd2\\x0c\\x67\\xb0\\x88\\x08\\xa1\\x29\\x9b\\x40\\x4a\\x5d\\xe7\\xc3\\xf9\\xa4\\xc4\\xb0\\x95\\x15\\xd3\\xf3\\x74\\xe1\\xe9\\x73\\x73\\x10\\x7a\\xbe\\x5d\\xb5\\x3f\\x1c\\x7c\\xd6\\x2c\\x24\\x9f\\xcb\\xd1\\xa0\\xf5\\x41\\x1f\\xc3\\x80\\xb6\\x5b\\x3a\\x4d\\x06\\xa9\\x0d\\x8e\\x7b\\x06\\xa6\\x56\\x81\\x00\\xbc\\xc5\\xae\\xa0\\x21\\xd6\\xf1\\x38\\x5f\\x18\\x8c\\xdc\\xa9\\xdb\\x0b\\xa4\\x9b\\x16\\x40\\xc9\\x83\\x56\\xb9\\x23\\xff\\x70\\x14\\xbc\\xa8\\x43\\x87\\x9e\\x1e\\x61\\x24\\x10\\x1a\\xa7\\x0e\\xf3\\x83\\x1f\\xd4\\x85\\xed\\xf0\\x62\\xa5\\xb6\\x32\\xbf\\x48\\xf5\\x05\\x74\\x19\\xc6\\xe0\\xe9\\x7e\\xd3\\x2e\\x46\\x22\\x61\\x31\\xe6\\x62\\xe1\\x47\\x51\\x13\\x32\\xbd\\xd4\\x20\\xab\\xc1\\xb4\\x9d\\xce\\xfe\\x4c\\x36\\xc2\\xc7\\x66\\x65\\x2b\\xa8\\x47\\xea\\x36\\xf8\\xec\\x44\\x32\\x0f\\x4d\\xca\\x62\\xe7\\x79\\x8e\\x54\\x32\\x5c\\xed\\x9e\\x5e\\x7b\\x42\\x3d\\x40\\x10\\x1e\\x07\\x41\\xc0\\xe0\\x98\\x56\\x9f\\xe1\\x47\\xdb\\x41\\xe2\\x6d\\xac\\x6e\\x80\\x8c\\xf0\\x6f\\xf0\\x20\\x10\\x38\\x9b\\x15\\x48\\xf8\\x69\\xc9\\xc4\\x4c\\x27\\xe8\\x60\\x31\\x4d\\x3d\\xc7\\xef\\x4c\\xc0\\x82\\x2b\\x96\\x52\\x05\\x0c\\x82\\xc1\\xf8\\xb4\\xc9\\x6a\\x86\\x85\\xbd\\x2d\\x4a\\xdf\\xc2\\xe0\\xfd\\x16\\x44\\xed\\x23\\x91\\x0e\\x50\\x23\\xd1\\xb4\\xe4\\x9b\\x22\\xdd\\x9f\\x88\\xac\\x0c\\x87\\xc8\\x9e\\x9e\\x08\\xfe\\x8f\\xc7\\x96\\x4d\\x86\\xd5\\x06\\x34\\xb6\\xdb\\xe8\\x72\\x48\\x3c\\x53\\x7d\\x46\\xe6\\x05\\xb0\\x66\\x00\\xb8\\xa3\\x9b\\x12\\x58\\xc4\\xcb\\x35\\x8c\\x1b\\xea\\xe0\\x52\\x39\\x3e\\xe4\\xb3\\xa4\\x5f\\x41\\xdf\\x34\\xaa\\x8e\\x47\\x69\\x18\\x5d\\x79\\xcb\\xf3\\x96\\xd1\\x09\\x15\\xf5\\xc9\\x77\\xda\\x6b\\x74\\xb0\\x47\\x35\\x91\\x6c\\xbe\\xf0\\x7e\\xdd\\xaa\\x66\\x02\\x28\\x47\\x3c\\x33\\x29\\xe3\\x56\\x69\\x30\\x5f\\xd0\\xc2\\x0c\\xca\\xda\\x2a\\x58\\xca\\xfc\\x4e\\x6d\\x2b\\xae\\xb6\\x1a\\x72\\x61\\x59\\x9d\\x69\\x54\\x22\\x39\\x7a\\x96\\x57\\xac\\x70\\x23\\x2b\\x83\\x8c\\x32\\x36\\xc8\\x0a\\x91\\xfd\\x8e\\x02\\x64\\xd3\\xc1\\x4c\\x04\\xb2\\xf3\\x04\\x12\\xb4\\x07\\x46\\x9c\\x40\\x8c\\x7c\\x0d\\x0e\\x7f\\x01\\x83\\x2f\\x42\\x25\\x81\\xb9\\x88\\x3f\\x45\\x2a\\x56\\x12\\x8e\\x0f\\x9d\\x6b\\x5a\\x52\\x01\\xf6\\x3a\\x38\\xde\\xed\\x26\\x1c\\xae\\xfd\\x7e\\xab\\x04\\xa9\\xa0\\x3b\\x2e\\xb7\\x4d\\xf9\\xf1\\x88\\x9d\\xbe\\x30\\xd5\\x83\\x4e\\x89\\x59\\x17\\xad\\xa3\\x92\\x4a\\x42\\xa3\\xe2\\x78\\x84\\xd4\\x7e\\xc2\\x43\\x82\\xd2\\x8c\\xee\\xf4\\xce\\x96\\xe0\\x1f\\xdf\\x99\\x5d\\x46\\x0b\\x97\\x8c\\x4c\\x2b\\x40\\xb8\\xdf\\x46\\xdf\\xca\\xd8\\xd9\\xad\\x21\\x89\\xa0\\xfb\\x95\\x4d\\x84\\x50\\xae\\xd8\\x65\\x90\\xe7\\x0b\\xcc\\x21\\x4f\\x20\\xe0\\x87\\xb5\\xa8\\x2e\\xee\\xb8\\x5e\\xab\\xdc\\x85\\x0d\\x11\\x77\\x1b\\xdc\\x2b\\x9e\\x27\\x17\\x5c\\xe8\\x35\\x2f\\x2f\\xa4\\xba\\xb0\\x89\\xce\\x9c\\x79\\x34\\xc2\\x4b\\x55\\x5e\\xa4\\xf2\\x42\\x48\\x67\\x1b\\x7a\\x21\\xa4\\xe6\\xb7\\x65\\x8a\\xb1\\xe5\\xd3\\xea\\x62\\x53\\xaa\\x7b\\x91\\x83\\x1d\\x75\\x6d\\x95\\x6f\\x68\\x9b\\x67\\x63\\xf5\\x0b\\x5e\\x45\\xdf\\x4a\\x7a\\x70\\xc1\\xc8\\x92\\x30\\x71\\x1e\\x57\\x18\\x5c\\x35\\xd9\\xe9\\x9a\\xfa\\x69\\xf7\\x57\\xf9\\x4d\\xd6\\x3e\\x66\\xde\\x99\\x2a\\x2b\\x5d\\xd3\\xd2\\x46\\x7c\\xe9\\xaf\\xf1\\x4c\\xd6\\xf4\\x9e\\x43\\x72\\xc7\\xfe\\x0a\\x83\\xff\\x88\\x1f\\xc7\\xd7\\x83\\x9a\\x1a\\x1e\\x1c\\x78\\xea\\xde\\x6a\\x3f\\x49\\xf7\\x25\\x5e\\xf6\\xd7\\x40\\xd2\\x96\\x3d\\x3d\\x3c\\x43\\x37\\x55\\x78\\xa4\\x5a\\x41\\xfe\\xe2\\x26\\x9a\\xcf\\xa7\\x1b\\x87\\xa1\\xac\\x6c\\x7b\\x1f\\xd3\\x4f\\xaa\\x5e\\xb7\\x55\\x6f\\x19\\x7a\\x3c\\x1e\\xea\\x1a\\x03\\x4d\\x06\\x08\\xdb\\x1c\\x94\\x1a\\x84\\x0f\\x2d\\xb3\\x4b\\x28\\xc6\\xca\\xa7\\xe5\\xe0\\x64\\xd6\\x0e\\x20\\x6d\\x8a\\x73\\xb1\\x5a\\xf5\\x95\\x83\\xb4\\xfc\\xc7\\xde\\x57\\x5c\\xe6\\xf8\\xa2\\x5d\\x5c\\x4b\\xd5\\x84\\x1b\\x0c\\xfd\\x6d\\xdb\\x76\\x02\\x52\\x85\\x81\\x02\\x49\\x0d\\x8e\\xfd\\x4a\\xb1\\xc3\\xd2\\x5c\\x8b\\x44\\xaa\\xba\\xb9\\x10\\x95\\x0a\\x09\\x8f\\xb0\\x4f\\x03\\xcf\\xb5\\xf5\\xc4\\x8b\\xbf\\xb8\\x49\\xcb\\xd0\\x77\\xe4\\x5c\\x86\\xe8\\xc1\\x4d\\x5a\\x5a\\xa5\\xaa\\x60\\x41\\x00\\x90\\x1e\\xd9\\xb0\\x1c\\x8d\\x88\\x60\\xc2\\xd9\\xcf\\x19\\x46\\x22\\x64\\x33\\x0d\\x31\\x55\\x14\\x6f\\x41\\xfc\\xf3\\x4f\\x74\\xbd\\xd0\\xc4\\xb0\\x74\\xc1\\x88\\xd8\\x9a\\x47\\x02\\x75\\x91\\x51\\x93\\x52\\x82\\x10\\x12\\x58\\x29\\x34\\xb5\\x6b\\x17\\xf6\\xd0\\xe7\\xd9\\x01\\xfa\\x19\\x47\\xe4\\xdc\\x1b\\x80\\xa2\\xff\\x8f\\xc7\\xff\\xf9\\x8f\\xff\\xbc\\x64\\x4c\\x0d\\x87\\x63\\xf3\\xfb\\x7f\\xe3\\x6f\\xc8\\x08\\x0a\\xda\\x90\\x26\\xd1\\x45\\x4a\\xe1\\x67\\x7a\\x53\\x45\\x6a\\x5c\\x91\\xe3\\x31\\x05\\x2d\\xba\\x22\\x75\\x90\\xb7\\x87\\x77\\xf3\\xf6\\x28\\x5c\\x42\\xb0\\xf5\\x7c\\xa5\\x4a\\x4c\\x3a\\x02\\xa2\\x5f\\x5a\\x5a\\x89\\xb1\\xf7\\x05\\x70\\xa9\\x7f\\x30\\x35\\xf5\\xc3\\x1d\\x7d\\x10\\xd9\\xef\\x86\\x51\\x2d\\x1b\\x49\\x5e\\x1a\\xa4\\xbd\\x53\\xdd\\x2c\\x39\\x17\\xbf\\x46\\x9a\\x3c\\x10\\x42\\x45\\xc4\\xf6\\x0a\\xcc\\x27\\x0b\\x30\\xaf\\x09\\x4a\\xae\\x17\\x98\\x4c\\xb0\\x49\\xa6\\x84\\x46\\xb0\\x5e\\x7b\\xad\\x5c\\x32\\xb7\\x82\\xa5\\x34\\x63\\xe5\\xd4\\xaf\\x54\\x4a\\x9e\\xfa\\xdf\\x90\\x98\\xb4\\x60\\x25\\xcd\\x58\\x6a\\x78\\x51\\x01\\x51\\x2f\\x16\\x2c\\x33\\xd4\\x62\\xb6\\xad\\xb4\\xba\\x63\\x87\\x9b\\xb4\\x84\\xf8\\xb2\\x49\\x41\\x6f\\xd2\\xf2\\x2b\\x99\\x27\\x59\\x3b\\x0b\\x06\\xbd\\x13\\x32\\x49\\xe9\\x5d\\xba\\x4b\\x4a\\x97\\x42\\x82\\x4a\\x92\\x34\\xfd\\xf9\\x81\\x83\\x69\\x4b\\x90\\xb9\\x4f\\xf5\\x05\\x24\\x11\\x60\\x3c\\x01\\x56\\x4c\\xf7\\xf8\\x33\\x65\\xca\\xac\\xb4\\x4d\\xa1\\x6e\\x26\\xaa\\x18\\x63\\x15\\x2d\\x9c\\x1a\\xc4\\xe6\\xf7\\x47\\x6f\\x44\\x26\\xe8\\x9a\\x89\\x91\\x9c\\x66\\x4f\\xd6\\x90\\x1f\\x63\\xcb\\xf8\\x3c\\x5b\\xd0\\xdc\\x30\\x65\\xf9\\x5c\\xd9\\x41\\x95\\x90\\xb6\\x1c\\xc6\\x95\\x9a\\xd7\\x19\\xa1\\x85\\x4d\\x63\\xae\\xa2\\x2d\\xcd\\x69\\x45\\xb3\\x26\\x45\\x6b\\x10\\x46\\xa5\\x50\\x61\\xd4\\xb7\\xe1\\xd0\\x1b\\x63\\xea\\xd8\\xad\\x55\\xb7\\xf0\\x2b\\x99\\xd7\\x08\\x11\\x33\\x75\\xc1\\x77\\x9a\\xcb\\xbc\\xba\\x78\\x23\\x0e\\xf0\\xf9\\xb7\\xa5\\xb8\\x13\\x06\\x37\\xbf\\x04\\x4b\\xfc\\xce\\x29\\x09\\xd6\\x08\\x61\\x22\\x84\\x60\\xfe\\xbc\\xaa\\x08\\x9a\\xda\\x75\\xad\\x6b\\x27\\xc6\\x38\\x56\\x14\\x57\\x38\\xa9\\x6a\\xa6\\xe9\\x01\\x44\\xc6\\xdf\\xf1\\x7d\\x92\\xb2\\xc1\\x6e\\x80\\x42\\x63\\xf3\\x58\\xb2\\xc1\\x7e\\x50\\x5b\\xd9\\xb6\\xe9\\x59\\xc8\\x5b\\x5a\\x58\\xdb\\x59\\x5c\\xcf\\x59\\x9a\\x98\\x63\\x84\\x45\\x55\\x53\\xb4\\x76\\x5b\\x94\\xd3\\x2d\\x5d\\xd1\\x5b\\xd8\\xa2\\x9c\\x09\\xba\\x85\\x2d\\xca\\x9f\\x6c\\xa7\\xa3\\x51\\x4e\\x6e\\x19\\x9f\\xe7\\x0b\\xba\\x32\\x5b\\xb4\\xf2\\x5b\\xe4\\xf6\\xa7\\xd0\\xd1\\x2d\\x2d\\x08\\xcd\\x09\\x5d\\xfb\\x2d\\x82\\xc2\\x8c\\xd0\\x15\\xad\\x68\\xde\\x6c\\xd4\\xda\\x32\\xd0\\x10\\xd8\\x16\\x42\\xe9\\x02\\x18\\x6b\\x16\\xa0\\xda\\x6e\\xbc\\x7d\\xd9\\xb9\\x4a\\x81\\x0b\\xa6\\xbd\\x07\\x53\\x35\\x1c\\x72\\x43\\x14\\x06\\x2e\\xd2\\x06\\xec\\xda\\x23\\x0a\\xec\\xff\\x9d\\x90\\xcd\\x8d\\x84\\x47\\xc3\\x24\\x08\\x08\\x69\\x7a\\x97\\xee\\x9a\\xdb\\x09\\x8f\\xe6\\x5d\\xba\\x43\\x3d\\x06\\x9c\\xec\\x67\\x12\\x81\\xed\\xa9\\xf6\\xaf\\xf9\\x1c\\x75\\x3b\\x27\\xdc\\xce\\xc9\\x9a\\x71\\xda\\xb0\\xf8\\x6e\\x22\\x28\\x6f\\xb5\\x83\\xa7\\x29\\x2b\\x54\\x54\\x91\\xd9\\x60\\x3e\\x18\\x55\\xa8\\x2a\\x1e\\x0d\\xe8\\x85\\x79\\xe0\\x32\\x1f\\x0d\\x16\\x83\\x64\\x30\\x18\\x49\\x7f\\xc9\\x3c\\x5c\\x54\\x73\\x89\\x7b\\xe1\\x79\\x51\\x30\\xec\\x33\\xb5\\x45\\x5f\\x6d\\x7b\\xe3\\x89\\xa5\\x13\\xd2\\xba\\x3e\\xef\\xfa\\xa1\\x63\\x2e\\x0d\\x59\\x61\\x2d\\xb9\\xd6\\x69\\x29\\xe4\\x2d\\xbb\\x9c\\x50\\xdc\\xa1\\xb0\\xa1\\x47\\x3d\\xb8\\xe6\\x60\\x39\\xda\\x32\\x72\\x8c\\x08\\x16\\x9e\\x31\\x33\\x0b\\x5b\\x4f\\x03\\x67\\x24\\x2f\\x00\\x40\\xce\\x92\\x4e\\xa8\\xb5\\x8a\\xb0\\x36\\xb9\\xda\\x89\\x63\\x1a\\x49\\x41\\x5f\\x14\\x3a\\x5a\\x31\\x6b\\xe7\\x06\\x56\\xe5\\x10\\x05\\xee\\xe4\\x88\\x40\\x44\\xd9\\x5b\\xae\\x9f\\xa7\\x15\\x3a\\x1a\\xd8\\xd0\\xb2\\xa2\\xfa\\x46\\x95\\xe2\\x4f\\x25\\x75\\x6a\\x8a\\x32\\xd3\\xf8\\x96\\xeb\\x77\\xdb\\x02\\x18\\xa7\\x35\\x53\\xb1\\x15\\x95\\xbf\\x6c\\xcc\\x0e\\x9d\\x6f\\x38\\x04\\xcc\\xcd\\x11\\x3c\\xbe\\x07\\xe7\\x69\\xf7\\x66\\x4d\\xe8\\x16\\xac\\x3b\\x81\\x55\\x74\\xa5\\x92\\xe6\\x64\\xaa\\xec\\xec\\xdb\\x0d\\x72\\x2a\\xe9\\x3a\\xcc\\x1a\\xc9\\xa7\\xeb\\x27\\x7c\\x24\\xa6\\xeb\\xc6\\x92\\x95\\xe3\\x97\\xec\\x21\\x5b\\x13\\x2a\\x58\\x75\\x3c\\x7e\\x11\\xf1\\x79\\x6a\\x37\\x7e\\x76\\xb8\\x49\\x2b\\x6e\\x2e\\x3e\\x4f\\xf3\\xa4\\xac\\x13\\x58\\x8a\\x22\\xdb\\x16\\xa9\\xe6\\xcf\\x53\\x3c\\x28\\x30\\x7d\\x18\\xe2\\x8a\\x75\\xde\\x03\\x67\\xef\\xde\\x9b\\xeb\\x7d\\xcb\\x22\\xee\\x6c\\x85\\x31\\xec\\x93\\xfd\\x14\\xdd\\xb0\\xc3\\xda\\xaf\\x1c\\x60\\xa7\\x8a\\x27\\x22\\x36\\xff\\x28\\x9e\\xac\\xe7\\xa0\\xde\\x7a\\x97\\xe6\\x62\\x5b\\x25\\x97\\xb7\\xc7\\x63\\xa1\\x22\\x8f\\xd9\\x08\\x04\\x91\\xb4\\xf2\\x83\\xdb\\x78\\xa9\\xd5\\xa6\\x53\\x82\\xaa\\x4b\\xba\\x4b\\x8a\\x99\\x88\\x61\\x3e\\xab\\x18\\xd3\\xb2\\xd1\\x7d\\x52\\xcc\\xdc\\x43\\x82\\x2f\\x9d\\x79\\x84\\x79\\x01\\x7e\\x1a\\x96\\x86\\x40\\xe5\\x6a\\x31\\xb3\\x09\\xb7\\xf1\\x65\\x3d\\xdd\\x0e\\x87\\xd1\\xc6\\x53\\xc2\\xb9\\xf9\\xf4\\xf9\\x6d\\x5e\\x43\\x58\\x07\\xd5\\x3e\\xb5\\x91\\x9e\\xaf\\x17\\x74\\x4d\\x37\\x06\\xde\\xa3\\x25\\x01\\xac\\x52\\x9f\\x65\\x7b\\x70\\x1a\\x2d\\x7a\\xb5\\x16\\x36\\xbd\\x94\\xa4\\xf6\\xa1\\x24\\x21\\x42\\x50\\xe3\\x13\\x62\\xfa\\xe7\\x39\\x78\\xee\\xd8\\x1b\\x92\\x3a\\xf8\\x5e\\xd2\\x02\\xce\\x0e\\xe6\\xdd\\xac\\x7c\\xde\\xcd\\x82\\xc9\\x79\\xb9\\xa0\\x4d\\xfa\\x87\\x06\\x0a\\x14\\x1d\\x9a\\xd3\\x1e\\x2b\\x4e\\xe6\\xad\\x37\\xa7\\x57\\x09\\x0f\\xc0\\x54\\xac\\xa2\\x2f\\x22\\x4d\\x8e\\x47\\x4c\\x46\\xab\\x89\\xcf\\xe6\\x59\\x8b\\x55\\x84\\x12\\x11\\x65\\x7d\\xcb\\x1b\\x0b\\xc0\\x02\\xa7\\x41\\x8e\\x47\\x1f\\xc9\\x52\\x39\\x7c\\xcd\\x18\\x73\\xaf\\x87\\xc3\\x14\\x51\\x8d\\x2b\\xa0\\x85\\x3f\\x1b\\x9a\\xdc\\x94\\x3c\\xfd\\xbd\\xf6\\x3e\\x56\\xb8\\x18\\xc7\\xa3\\x6d\\x62\\x15\\x4d\\x34\\x6d\\x76\\x05\\x95\\x9a\\x3d\\xd1\\x62\\xed\\x9e\\x39\\xf7\\x49\\xaf\\xcb\\xf4\\xef\\xbc\\xb7\\x42\\x57\\xa6\\x16\\xb7\\xb6\\x5c\\x98\\xad\\x6a\\x56\\x79\\xd6\\xf8\\xd2\\x73\\x92\\x8c\\xaf\\x2d\\xf8\\x86\\xb5\\x50\\x33\\xe9\\x8d\\x21\\x12\\x55\\x07\\xd0\\xe6\\x21\\x0f\\x9e\\x16\\x08\\x86\\xe3\\x63\\x4f\\x52\\x93\\x75\\x87\\xa6\\x96\\x7c\\x9e\\x80\\xd7\\x56\\x00\\x49\\xa7\\xd5\\x93\\x74\\x3a\\x1a\\x55\\xc4\\x46\\xf0\\x93\\xa7\\x24\\xb8\\x0e\\x8e\\x40\\x45\\x1c\\xde\\xa1\\x15\\x09\\xfd\\x9f\\x6f\\xd2\\xf2\\xc3\\x5a\\x64\\xbf\\x4b\\x5e\\x39\\xdf\\xc1\\x83\\x21\\x3f\\xcb\\xe3\\xb1\\x52\\x91\\x24\\x74\\x03\\xa0\\x23\\x51\\x96\\x44\\x95\\x00\\x3a\\x4a\\xfc\\x14\\x90\\xab\\x32\\x5e\\x72\\x99\\xe3\\x73\\xe5\\x77\\x26\\xd1\\x71\\x67\\xab\\x08\\xad\\x10\\xbf\\xd2\\xdb\\x52\\x6d\\x37\\x3c\\x4f\\x78\\x6c\\x7f\\x51\\x10\\x2f\\x24\\xe5\\xec\\x3a\\xe1\\xb1\\xf3\\xf1\\x69\\x32\\xae\\x3c\\x82\\x61\\x36\\xcf\\x75\\x7d\\x16\\x02\\x76\\xe5\\xce\\x87\\x7b\\x87\\xdd\\x97\\xf6\\xae\\x01\\x7e\\x6f\\x53\\x00\\x00\\xe7\\x94\\xa1\\xba\\x9f\\xa7\\xe5\\x1b\\x58\\x5e\\x43\\xbf\\xf1\\xc0\\x85\\x88\\xb7\\x49\\x01\\x83\\x79\\x1c\\x29\\x50\\x18\\x52\\xa0\\x24\\x0d\\xd9\\xcc\\x52\\x87\\xb5\\xe9\\x96\\x4d\\xe8\\x8a\\xc9\\x19\\x8f\\xd3\\xcd\\xa6\\xd8\\xc3\\x6a\\x40\\x52\\x27\\x49\\x92\\x7c\\xba\\xba\\x64\\x0c\\xf2\\xc9\\xb1\\xd5\\x38\\xa7\\x2b\\x96\\x43\\xf2\\xe0\\x28\\x67\\xa5\\xa7\\x7b\\xe9\\x0a\\x1f\\xbe\\x92\\xf9\\x38\\x28\\x9d\\x60\\xcb\\x97\\x3a\\xca\\x6d\\xe6\\x63\\x57\\x8b\\x40\\x7f\\x13\\x42\\xb7\\x23\\x96\\xbb\\x8d\\xbe\\x65\\x5f\\x44\\x8a\\x1c\\x8f\\xc5\\x6c\\x9b\\x28\\x4c\\x43\\x87\\xc0\\xaa\\x7d\\x60\\x6e\\xc9\\x34\\x63\\x8d\\xef\\x75\\xdc\\xa7\\xe6\\x9e\\xf5\\xb4\\xdb\\x8e\\x56\\x24\\xd9\\xd0\\x35\\xcb\\xc6\\x9b\\x06\\x2e\\x55\\xc3\\xa1\\xe7\\x8b\\xd6\\xe4\\x49\\x65\\x58\\x4e\\xb6\\x7e\\x32\\x99\\x8d\\xab\\xa4\\xa2\\x06\\x32\\x98\\xb9\\x6f\\xc6\\x6c\\x7d\\xf5\\xd8\\x60\\xe9\\xcd\\x68\\xed\\xc6\\x7b\\x67\\xa0\\xcc\\xc4\\x80\\xa3\\x0d\\xc8\\x60\\x4f\\xbe\\x78\\x47\\x9a\\x9b\\x85\\x64\\x93\\x90\\x1c\\x92\\x16\\x05\\x55\\xae\\x1e\\x4f\\xd7\\x4f\\x27\\xb3\\x68\\x33\\x62\\x9a\\xae\\xc7\\x4c\\x93\\x64\\xfd\\x64\\x82\\xdf\\xd4\\x74\\x3d\\x62\\xda\\xb1\\xd6\\xe8\\x06\\xb8\\x46\\x84\\xb7\\x41\\x4c\\x9b\\x51\\x8b\\x8c\\xb2\\xd1\\xfa\\xea\\x71\\xe7\\xc8\\x85\\x48\\xb5\\x57\\x81\\x8f\\xa6\\xf2\\x21\\xac\\x07\\xf2\\xb1\\xfa\\x5d\\x6c\\x7e\\xd8\\x16\\x05\\x4d\\xd9\\x77\\x11\\x90\\xab\\xcf\\x83\\xfb\\x47\\xaf\\xaf\\x26\\xc4\\xc3\\x7e\\x48\\x3d\\x6c\\x2f\\x48\\x03\\xa7\\xaa\\x99\\xe8\\x5e\\x2c\\x4d\\x12\\x1e\\x37\\x37\\xcf\\x30\\x0d\\xab\\x82\\x5b\\x56\\x22\\xbc\\xdf\\x0f\\xf0\\xc6\\x3c\\xc6\\x7b\\x6e\\x46\\x39\\xd7\\x36\\xa5\\x1a\\xd3\\x4f\\x27\\x33\\x35\\xd7\\xe3\\xeb\\x05\\xda\\xb9\\x94\\x4c\\x3f\\x51\\x1e\\xd2\\x99\\x57\\x23\\xfb\\xca\\x47\\x3a\\x10\\x3d\\xf7\\x77\\x6a\\xf3\\x0b\\xa6\\x20\\x6d\\xa8\\xc6\\x91\\x7d\\x2e\\x67\\xdc\\x50\\xcb\\x63\\x8e\\x04\\x74\\x52\\x8e\\x2b\\xe2\\x93\\x11\\x96\\x20\\x68\\xae\\x46\\xd5\\x38\\x75\\xc7\\x22\\x33\\x6d\\xab\\x71\\x20\\xae\\x28\\x09\\xb9\\x7a\\xfc\\xc8\\x49\\xab\\x0f\\xd9\\x7a\\x2b\\x7f\\x4f\\x1a\\x6e\\x7c\\x9c\\xc2\\xeb\\x2b\\x69\\x01\\x8c\\x68\\xc3\\x11\\x0b\\xd2\\x32\\xcb\\x63\\x2b\\x73\\x2b\\x1f\\x12\\x1f\\xb4\\x60\\xa5\\x83\\xcf\\xde\\x69\\x5c\\x91\\x59\\x54\\x31\\x6e\\x46\\xf6\\xa8\\x6f\\x15\\x00\\x82\\xb7\\xbe\\x4f\\x92\\xa8\\x62\\xea\\x91\\xa1\\x6f\\xaf\\x09\\xb5\\xa3\\xaf\\xfc\\x68\\x53\\x3b\\x3e\\xb7\\x37\\x73\\xbd\\x18\\x57\\xe6\\x28\\xfa\\xd1\\x1a\\xb6\\x3c\\xee\\xe0\\x35\\x1b\\x2b\\x91\\x8a\\x53\\x02\\x9f\\x56\\x33\\xed\\x6c\\x36\\xa6\\x25\\xcb\\x2c\\xdf\\x92\\xc5\\xf0\\xe5\\x47\\x6b\\xf7\\xeb\\xea\\x31\\x2d\\x42\\xa1\\x90\\xab\\x90\\xc5\\x30\\x30\\xab\\xda\\x2d\\x59\\x0f\\xce\\x11\\x2d\\x38\\xe9\\x71\\x8e\\x26\\xed\\x1e\\x71\\x95\\xb8\\xed\\x6f\\xea\\x33\\xa5\\x19\\x42\\x77\\x5c\\x5c\\x3d\\xb6\\xc4\\xee\\xc8\\xfc\\xb4\\xd7\\xb0\\xa4\\x70\\x49\\x8b\\xba\\xcf\\xea\\x96\\x86\\x21\\x60\\x4e\\xf1\\xea\\xfd\\x7b\\x7f\\x1b\\x81\\x2b\\x31\\x57\\x31\\x48\\x22\\x9a\\x5a\\x8f\\x89\\xdf\\x74\\x84\\x76\\x86\\x3c\\x34\\x37\\x4d\\x81\\xf6\\x4a\\x89\\x0d\\x9a\\x1b\\x62\\xd5\\xd4\\xcf\\x70\\x38\\x54\\xf3\\xd4\\x1b\\xab\\x2e\\x33\\xbd\\x23\\xd3\\x9f\\x6c\\x77\\xa4\\xae\\x33\\x15\\x8b\\x9c\\x81\\x3c\\x91\\x66\\xca\\xe7\\xe9\\x60\\x7d\\xae\\x54\\x97\\xd7\\x27\\xbe\\x54\\xb6\\xe1\\xc9\\x91\\x4a\\xe2\\xff\\x4d\\x5b\\x27\\x2a\\x89\\xff\\x8f\\xc7\\xae\\x97\\x13\\xda\\xf8\\xe0\\x24\\x07\\x09\\x79\\x77\\xaa\\xc4\\x26\\xd7\\xc3\\xc7\\x01\\xdd\\x78\\xa1\\x7d\\x32\\x1f\\xec\\x06\\x74\\xb0\\x1f\\xd0\\x81\\xd9\\x88\\x01\\x1d\\x00\\xa1\\x3d\\xa0\\x03\\xa4\\xc3\\x07\\x8b\\xba\\xae\\xcd\\xe8\\xbd\\x4c\\x9e\\x1d\\x84\\xd9\\x9a\\x14\\x13\\xd6\\xa0\\x35\\xba\\xf5\\x7b\\xac\\xa9\\x0b\\x81\\x6a\\x83\\x69\\xba\\xef\\x7a\\x0f\\x5e\\x8a\\x16\\x14\\x66\\x98\\xb7\\xa5\\xc8\\x93\\x83\\x7f\\xae\\x6b\\x6a\\xe3\\x6d\\xba\\x46\\xd6\\xd7\\x97\\xde\\xf0\\x5b\\x21\\x9f\\xe9\\xdf\\x78\\xa9\\xa0\\x9e\\x8b\\x4d\\xb3\\x6e\\xc9\\x80\\x5a\\x0c\\x32\\xa0\\xb3\\xcf\\x66\\x8b\\x3f\\x25\\xe5\\xd9\\x39\\x29\\xcf\\xfe\\xbf\\x21\\xe5\\x09\\x45\\x6c\\x67\\x04\\x6c\\x39\\x0a\\xd8\\xac\\xf8\\xec\\xb0\\x4b\\x02\\xc1\\x4d\\x0e\\x6a\\x35\\x42\\xf7\\x49\\x15\\x16\\x96\\x50\\x68\\x89\\x92\\x24\\x1f\\x0e\\xf3\\xb8\\x1c\\x0e\\x47\\x79\\x5c\\xd6\\x81\\xcc\\xad\\xeb\\x81\\x63\\xe7\\x05\\xb6\\x90\\xda\\x1b\\x28\\xf2\\xfa\\x94\\xc9\\x47\\x29\\xf8\\x24\\x10\\x82\\x37\\x69\\xeb\\xa7\\x12\\x0d\\x80\\x25\\x11\\x61\\x8e\\x64\\x3d\\x97\\x8b\\x18\\x6d\\x4f\\xae\\x1e\\x83\\x65\\x8e\\x67\\x15\\x7d\\xa0\\xcf\\xa7\\x93\\xe1\\x50\\xfc\\x45\\x89\\xcd\\xce\\xd1\\x74\\xfb\\x4f\\x4a\\x6c\\xfa\\x64\\x2a\\xf1\\x8e\\xd0\\x94\\xf5\\xc9\\x66\\xe2\\x3d\\x88\\x42\\xbd\\x88\\xaa\\x25\\xa1\\xe1\\xd6\\x05\\xd3\\xaa\\x8d\\xa2\\xc1\\xa8\\x42\\x91\\x4f\\x3a\\x8a\\xca\\x19\\xfc\\x2a\\x93\\xc1\\x80\\x8c\\x06\\x64\\x50\\x7f\\x86\\xd8\\x04\\x40\\x51\\xbf\\xec\\x04\\xc4\\x26\\xff\\x2d\\x89\\x89\\x5b\\xa3\\xd4\\xad\\x51\\x59\\xb7\\x65\\x28\\xb4\\xf8\\xb4\\x18\\x24\\xeb\\x13\\x83\\x14\\x28\\x41\\x39\\x11\\x83\\x64\\x8d\\xa4\\xa3\\x60\\x7c\\x5a\\x80\\xa4\\xa3\\x08\\x25\\x1d\\x7a\\x5e\\x2c\\xa8\\x60\\x97\\xd5\\x70\\x18\\x0a\\x3d\\x0a\\xf3\\xa1\\x6a\\x96\\x86\\xc8\\xe4\\x25\\xa6\\xf2\\x8a\\xe2\\xbf\\x93\\x24\\xed\\xc3\\x32\\x3b\\x42\\x73\\x56\\xcd\\xca\\x8e\\xfc\\x27\\x29\\xfb\\x2a\\xef\\x09\\xdd\\xb2\\xc3\\x2e\\xc9\\xe8\\x3e\\xc9\\xa9\\xa1\\xc1\\x12\\x64\\x70\\x33\\xcf\\xea\\xe6\\xa4\\x9e\\xae\\x0d\\xe9\\xec\\x05\\x08\\x0f\\xad\\x4e\\x01\\xea\\x83\\xb0\\x7a\\x5c\\x82\\x4c\\x84\\x4d\\x7a\\xa4\\x0a\\x9c\\x16\\x74\\x4b\\x25\\xa9\\xfb\\xc5\\x44\\x19\\x95\\xb4\\x20\\xf5\\xf9\\xaf\\x9d\\x4a\\x1f\\xc2\\x43\\x6e\\x2d\\xa2\\x11\\x96\\x3d\\xdc\\xc9\\x54\\xba\\x80\\x80\\x90\\xf9\\xaa\\xad\\x67\\x3b\\xd4\\x54\\xd2\\x26\\x06\\xe2\\x75\\x1d\\xc4\\xcd\\x93\\x76\\x7a\\xce\\x2a\\x00\\x35\\xdf\\x36\\x23\\x7d\\x24\\x9b\\xc9\\x53\\xf7\\x7b\\xc4\\xbe\\xc3\\xa0\\x6b\\x8e\\x4b\\x52\\x84\\xca\\xba\\x5e\\x5b\\x3c\\xb8\\xbd\\xb9\\x29\\xf8\\x80\\xae\\xff\\x0b\\xa8\\x10\\xb2\\xf0\\x0d\\xfe\\xeb\\xa8\\xad\\xc9\\x6f\\x3a\\xa0\\x03\\x1c\\x2c\\x62\\xb6\\x75\\x0b\\xb3\\x39\\xf4\\xb5\\xeb\\xe0\\xa0\\x9a\\xee\\xbb\\x25\\x35\\xb5\\xea\\xfa\\xe4\\xa0\\x95\\x2a\\xb4\\xd8\\x24\\x07\\x97\\x13\\xd4\\x94\\x09\\x5d\\xf0\\x24\\x22\\xec\\xe9\\x60\\x50\\x37\\x38\\x6b\\xdb\\xc2\\x59\\x27\\xa1\\xd5\\x60\\x3f\\xd1\\x3e\\xf7\\x21\\x14\\x86\\x41\\xc0\\xa4\\x74\\x42\\xb9\\x56\\xd4\\x28\\xb5\\xd5\\xfd\\xe5\\xd6\\x8e\\xf1\\xb4\\xec\\x57\\x5b\\x56\\x87\\x1e\\xe1\\x87\\x50\\x75\\x7c\\xc6\\xa0\\x3b\\xc2\\xb0\\xc8\\x2e\\xfd\\x55\\x17\\x71\\x28\\x8a\\xbe\\x42\\x8a\\x69\\x5a\\x31\\x3d\\xe2\\x53\\x05\\x54\\x95\\x22\\x32\\xb6\\x48\\x67\\xae\\x16\\x6c\\x24\\xe6\\x6a\\x81\\xe2\\x13\\xa5\\x61\\x77\\x1b\\x1d\\xf6\\x57\\xba\\x1d\\x4e\\xa5\\xb4\\x35\\xc6\\xff\\x67\\x82\\x5e\\x3f\\x2f\\x44\\x99\\x6d\\xef\\x6c\\x2c\\x81\\xf3\\xed\\xb2\\xb0\\x1a\\x69\\x7d\\xec\\x2b\\xb3\\x1f\\xa0\\x37\\x47\\xdf\\xd9\\xa5\\xa6\\x9c\\x8d\\x97\\xba\\x65\\xc5\\x1e\\x6a\\x81\\xa7\\xf2\\x89\\xb5\\x52\\xe9\\xb7\\xe9\\x1d\\x8d\\x24\\x84\\xef\\xb4\\x75\\x7a\\x1c\\xf6\\x43\\xf6\\xa2\\xc5\\x74\\x37\\x86\\xbf\\x81\\xe4\\x0e\\x55\\x10\\xad\\xe5\\x41\\xd9\\xf8\\xe9\\xf4\\xa7\\x3a\\xd0\\x9c\\xd0\\x8a\\x50\\xde\\x60\\x66\\x4e\\xab\\x51\\xea\\x79\\x5f\\xb7\\x90\\x89\\xa6\\xad\\xb5\\x49\\xf8\\x58\\x9f\\xc3\\x63\\xd4\\x3b\\x98\\xd2\\x83\\x27\\x95\\x0d\\x1e\\x16\\xa0\\x18\\x0f\\xf1\\x8c\\x19\\x32\\x1c\\x0d\\x2b\\x44\\xf9\\x3e\\xdd\\x3d\\x6f\\xee\\x60\\x44\\x46\\xae\\x14\\x13\\x16\\x47\\x6d\\xb5\\x6b\\xe4\\x27\\x21\\xad\\xb3\\xab\\xb4\\x2e\\x31\\x04\\x98\\x3b\\x3a\\x69\\x71\\x16\\x5f\\x07\\x06\\x5f\\xd9\\x56\\xab\\x2d\\xc4\\x64\\x87\\x94\\xcf\\x1c\\x17\\x4e\\xc8\\xdb\\x7f\\x41\\xfb\\xc8\\x59\\xb8\\xd1\\x43\\x7b\\xda\\x6b\\xea\\x57\\x24\\xaf\\x5d\\xb3\\xee\\x09\\xa1\\x07\\x60\\x5d\\x7e\\x49\\xb6\\xc8\\xac\\xfd\\x9a\\xac\\x2c\\x41\\xfb\\x4b\\x72\\x6b\\x7f\\xfd\\x9a\\x6c\\xba\\xa9\\xda\\x5d\\xcc\\xd2\\x6b\\xaa\\xd8\\x35\\x45\\xb1\\x1e\\xc8\\x39\\xf8\\x93\\xa5\\x6e\\x92\\x76\\x68\\x5a\\xb0\\x72\\xc4\\x69\\x86\\x33\\xcb\\x54\\x15\\x95\\x06\\xed\\xc2\\x53\\x25\\x24\\x44\\x44\\x68\\xde\\x15\\x06\\xbf\\xf9\\x77\\x05\\xa1\\x2b\\x0c\\x8a\\x2e\\x09\\x7b\\xfa\\x8d\\x8e\\x34\\x2d\\x69\\x41\\x66\\xd7\\x49\\x70\\x00\\xf8\\x23\\x41\\x25\\x95\\x8f\\x04\\xe8\\x03\\x4e\\x2b\\x8f\\x5d\\x6d\\x21\\xdb\\xb5\\x37\\x6c\\x15\\x4d\\x68\\x46\\x73\\x42\\xef\\xd8\\x2a\\xfa\\x5e\\xd3\\x35\\xdd\\x12\\xba\\x63\\xb7\\xd1\\x8d\\xc6\\xf2\\x1b\\xf8\\x3d\\xb2\\xaf\\xa6\\x92\\x45\\x9b\\xf1\\xce\\xec\\x95\\x62\\xd1\\xdd\\xf8\\xc6\\xfc\\xaa\\xd8\\x38\\xda\\x8c\\xa0\\x30\\x65\\xe3\\xe8\\x6e\\x64\\x4a\\xfd\\x81\\xc4\\x95\\x95\\x6e\\x65\\x95\\x5f\\xd9\\xca\\xaf\\x6c\\x5a\\xd7\\x51\\x4e\\xd7\\xb4\\x30\\xc3\\x70\\x67\\xc3\\x9c\\x88\\x2d\\xdd\\x99\\x67\\x3c\\x23\\xa6\\x60\\x45\\x6f\\x9a\\xe3\\xe4\\xe7\\x74\\x47\\x77\\xf6\\xf4\\x2c\\xd9\\x6f\\xc1\\xa1\\x41\\x84\\x40\\x6f\\x08\\xdd\\xb3\\x68\\x39\\xf6\\x0d\\x97\\x8f\\x0a\\x3a\\x21\\xe4\\x0a\\x8f\\x43\\xdb\\x67\\x06\\xcf\\xd3\\x07\\x05\\xea\\xa6\\x69\\x63\\x26\\x7e\\xfb\\x68\\x19\\x18\\x8a\\x6f\\x1e\\x2d\\xa9\\x8a\\xb5\\xa9\\x65\\xee\\x8e\\x13\\x26\\xd9\\x66\\xa6\\x62\\x00\\xad\\x97\\xe3\\xfd\\xa3\\xee\\x81\\xb5\\xf7\\xc3\\x1f\\x5b\\xde\\x82\\xfb\\xcd\\xde\\x86\\x1d\\x8d\\xf7\\x8f\\x32\\x0a\\xde\\xe9\\x1d\\x1a\\xb2\\xa2\\x13\\x5a\\x05\\x24\\xe6\\xb2\\x75\\x07\\x3e\\x23\\xe4\\x58\\xfb\\x8a\\x8b\\x5e\\x10\\xd4\\xe4\\x04\\x97\\x4d\\xc0\\x07\\xfb\\x8b\\xc3\\x95\\xe2\\xc7\\xe3\\xe5\\x27\\x04\\x8e\\xc7\\xa3\\x15\\x08\\x29\\x8f\\x29\\xf4\\x62\\x36\\x49\\x44\\xb3\\x86\\xed\\xef\\x86\\xf5\\x1e\\x55\\x57\\xcb\\xff\\xba\\xca\\x11\\x01\\x5c\\xc9\\xd2\\xc0\\x12\\xb1\\x60\\xe9\\x69\\x10\\x0b\\x9a\\xb1\\xa8\\x04\\x77\\xc0\\x51\\x89\\xbe\\x7e\\xe6\\x70\\xad\\x4d\\xa1\\x56\\x9b\\x51\\x69\\x7d\\xf6\\x4c\\x61\\xce\\xaa\\xe1\\xb0\\x70\\x8b\\x80\\x72\\x89\\x2d\\xcb\\xc1\\x19\\x30\\xd8\\x4f\\xba\\xb2\\x65\\xc1\\x66\\xd2\\xdb\\x4f\\x93\\xec\\x9b\\x3e\\x92\\xfd\\xd6\\x5c\\x92\\x1e\\x92\\x7d\\x83\\xc4\\xe3\\x8e\\xde\\x9c\\xa0\\x15\\xc0\\x72\\x3b\\x36\\x99\\xee\\x9e\\xf0\\xe9\\x68\\xb4\\x23\\x37\\x23\\xe0\\x1f\\x5a\\x2b\\xbd\\xa3\\x95\\xab\\xc8\\x4d\\xc5\\x91\\x80\\xaa\\x81\\x6a\\xb3\\xa7\\x01\\x15\\x4c\\xcf\\x77\\x0b\\x9a\\x02\\x45\\x3e\\x52\\xee\\xba\\xd0\\x7d\\xb2\\xf6\\x4f\\xbf\\xa2\\xe8\\x0b\\x53\\xef\\xde\\x50\\x2e\\x73\\xfb\\xd3\\x00\\xc5\\x36\\x92\\xa2\\xc1\\x0a\\x25\\x2b\\x1a\\xac\\x61\\xb2\\xad\\xa7\\x77\\xe0\\xee\\xed\\x68\\xfa\\xcd\\xc3\\x4a\\xc1\\x1d\\x28\\x05\\x6f\\x46\\x86\\x9b\\xec\\xd0\\xf0\\x82\\xee\\x40\\x6a\\x7f\\x86\\x86\\xdf\\x50\\x49\\x6f\\x49\\xdd\\xbd\\xd5\\xdd\\x54\\x06\\xcd\\x95\\xe1\\xd6\\x0d\\xc8\\x99\\x70\\x59\\xc6\\xda\\x30\\xd8\\xa2\\xc9\\xe4\\x24\\x5a\\xec\\x93\\x3f\\xd7\\x62\\xe1\\x32\\x38\\xf1\\xe1\\xf0\\x12\\x19\\x18\\x4e\\xac\\x67\\xc0\\xb9\\x9b\\x84\\xe9\\x6e\\x47\\xcc\\x4b\\x47\\x79\\x63\\x59\\x26\\xeb\\x33\\x77\\xe9\\x21\\xf6\\x15\\x40\\x99\\xbf\\xe3\\x86\\x8f\\xbf\\x74\\x6a\\xc3\\xd9\\x52\\x3f\\x8a\\xfc\\x87\\x34\\xb9\\xe2\\x24\\x99\\xfc\\x35\\x26\\x5f\\x04\\x8a\\x08\\x00\\x3e\\xa8\\xfb\\x6a\\x12\\x8d\\x28\\xf6\\xa7\\x88\\x78\\x70\\xd7\\x69\\xa3\\x56\\x2d\\x94\\xb9\\x57\\x1d\\x0b\\x0b\\x09\\xe9\\x8d\\x06\\x03\\xcb\\xc0\\xab\\xba\\x3e\\xa5\\x46\\xba\\xc1\\x3a\\x9c\\xd0\\xa3\\x71\\x44\\x80\\x01\\x85\\x1e\\x22\\x28\\xa9\\xbf\\xd4\\x04\\xe9\\xdb\\x09\\xe8\\x72\\x7b\\xa9\\x41\\x47\\xf2\\x8a\\x55\\x24\\x4f\\x69\\x41\\x45\\xc8\\xc1\\x4a\\x25\\x42\\xfa\\x4f\\x11\\xaa\\x19\\xf6\\x85\\x90\\xa8\\x21\\x06\\x4b\\x3c\\x00\\x65\\x18\\x7c\\x63\\x8a\\x7a\\x54\\x1c\\x91\\xdd\\x9b\\xc9\\xb4\\x19\\x9a\\xee\\x0e\\xa6\\x60\\x0f\\x71\\x8d\\x8a\\xd0\\x01\\xdc\\x28\\xc3\\xeb\\x15\\x31\\x32\\x4f\\xcf\\x0a\\x71\\x2b\\x21\\x0b\\x4e\\x20\\xeb\\x71\\x2f\\x61\\x1d\\x8f\\xc7\\x09\\x2d\\xd0\\xc2\\xfc\\x79\\xab\\xb4\\xb1\\x2a\\x12\\x75\\x8b\\xea\\xd3\\xd6\\xf5\\x29\\x10\\x30\\x39\\x53\\xc1\\x8e\\x91\\x60\\xfb\\x4e\\x9d\\x1f\\xba\\x20\\xd3\\x16\\xc9\\xab\\x2d\\x68\\xc1\\x98\\x5b\\x30\\xb6\\x1f\\x5d\\x41\\x90\\x95\\xad\\x17\\xe7\\xf6\\x8f\\x6e\\x2a\\x9e\\x68\\x18\\x52\\x70\\xef\\x4e\\xb6\\x15\\xdd\\x46\\x46\\x8d\\x7e\\x39\\xa0\\x40\\x45\\xb3\\x1c\\xdd\\x0f\\x07\\x8a\\x6d\\x3f\\x87\\xef\\xa2\\xe0\\x43\\x5d\\xc7\\xdb\\xf8\\x23\\x86\\x80\\xb9\\x26\\xd4\\xf2\\x43\\x0f\\x10\\x29\\x27\\x3a\\xf3\\xd3\\x19\\x9f\\xf9\\x92\\xdd\\x0d\\x72\\x3c\\x5e\\xd7\\xf5\\x16\\xb9\\xf9\\x5c\\x6d\\x6f\\xd7\\x72\\xab\\x07\\x74\\xfb\\x5f\\xe0\\xe7\\xd3\\x32\\x0b\\xb8\\xf9\\xe4\\xd0\\x22\\x0f\\x1a\\x21\\x36\\xa2\\xca\\xe4\\xf2\\xba\\xfe\\xcb\\xac\\x7f\\x0b\\x61\\x0c\\xe8\\xc0\\x61\\x93\\x81\\x3d\\xdb\\x88\\x2d\\x06\\x74\\x10\\x60\\x92\\x81\\xcd\\x10\\xe7\\x2a\\x3a\\xf1\\x01\\x9e\\xa1\\x8e\\x1c\\x61\\x51\\xd7\\x14\\xb9\\x8d\\x64\\xf0\\xf7\\xc9\\x97\\x83\\x86\\x81\\x98\\x74\\xb0\\xd5\\x7f\\xfc\\x63\\x42\\x91\\xc4\\x4c\\x06\\xd7\\x13\\x53\\xd5\\x07\\x8b\\x4b\\x06\\xe5\\xa0\\x36\\x2b\\x18\\x08\\x21\\xc2\\x20\\xc5\\xd7\\x8d\\x94\\xa1\\xe0\\xb7\\x5c\\xe6\\x09\\xc2\\xb5\\x2a\\x39\\xdc\\x72\\xc9\\x4b\\x88\\x38\\x74\\xd3\\xd5\\x81\\x23\\x92\\xf1\\x61\\x76\\xb1\\x85\\x77\\xc7\\xe1\\xdd\\x7d\\x9d\\xf9\\x2a\\xe8\\x9c\\xd5\\x49\\xac\\x74\\xc2\\x9d\\x4e\\x48\\xc7\\xe2\\x04\\x7d\\x79\\x7c\\x3a\\x87\\x83\\xe6\\x3b\\x9d\\x70\\xba\\x12\\x45\\x01\\xaf\\x12\\x19\\xdf\\xa4\\xd9\\xef\\xb7\\xa5\\xda\\xca\\xfc\\x85\\x2a\\x54\\x49\\x2b\\x5d\\xaa\\xdf\\xb9\\x7f\\x0b\\xeb\\x8a\\x6f\\x0a\\xa7\\xd4\\xf5\\xe5\\xf0\\xe4\\x9c\\xf2\\x2f\\xfb\\xd1\\x5c\\xe8\\xbb\\x95\\xcc\\xcd\\xde\\x58\\x9f\\x0e\\xc7\\x82\\x39\\x4e\\xbb\\xd7\\x19\\xdc\\x93\\xd7\\xae\\x96\\x0b\\xa1\\x56\\xd7\\xf4\\x53\\xd2\\x1d\\x0a\\x6b\\xd7\\x40\\x0b\\x9b\\x18\\xcb\\x8b\\x0f\\x06\\x90\\x08\\x3e\\x46\\x8b\\x7b\\x6d\\x2d\\xc1\\xa7\\xde\\x78\\x99\\x93\\x59\\xc4\\x7d\\x4c\\x49\\x42\\xf9\\x7c\\xb2\\x18\\x31\\x41\\x12\\x3e\\x62\\x82\\xf2\\x3a\\x10\\x1e\\xad\\xfe\\xc7\\x14\\x1e\\x0f\\xf0\\xf7\\x2d\\x99\\xbb\\x8f\\x92\\x80\\x71\\x13\\x20\\x21\\xa5\\x0f\\x6d\\x50\\x19\\xc6\\x3f\\x75\\xd8\\xb1\\x2f\\xf6\\x9b\\xc1\\x98\\x07\\xab\\xe5\\xa5\\x19\\x18\\x88\\x14\\xa7\\xcc\\x71\\x83\\x66\\x03\\xed\\x9c\\xc5\\xa9\\x36\\xa4\\x0e\\xc6\\x4d\\xe8\\x58\\xdd\\xa6\\x5e\\x73\\x51\\xd6\\xc0\\x3c\\xa3\\x45\\x1b\\x05\\x4b\\x96\\x0c\\x0c\\xa9\\xd7\\xf4\\x4e\\xc8\\x97\\x18\\x43\\x3a\\xc9\\x4d\\x91\\x7b\\xd8\\xd6\\x68\\x46\\xf8\\x73\\x65\\xb0\\xd5\\x56\\xe6\\x55\\x44\\xa6\\x39\\xb8\\x79\\xfe\\xa0\\x1b\\x8e\\x51\\xf1\\xa8\\xa4\\xb6\\xdf\\x8c\\xc4\\x85\\xa2\\x62\\x26\\x13\\xc5\\x41\\xbc\\xdb\\x23\\xa3\\xce\\x88\\xa9\\x44\\xe8\\x84\\xca\\xf1\\x35\\x98\\xd1\\x6f\\x67\\xbe\\xbf\\x74\\xd7\\xea\\x6f\\x4d\\xe2\\xb5\\x18\\x5d\\x53\\x61\\x48\\xfe\\xb3\\x3d\\xae\\x09\\x56\\x23\\xa0\\xfb\\x1d\\xab\\x44\\x8e\\x95\\x37\\x60\\xb0\\xf6\\xe3\\xb8\\xb4\\x55\\x5d\\x47\\x82\\x2a\\x9a\\x1a\\x76\\x14\\x22\\xab\\x80\\xd9\\x08\\x46\\x57\\x33\\x8f\\x60\\x28\\xc0\\x0a\\x7a\\x92\\x55\\xd5\\xe9\\x0d\\xb8\\xd3\\x1b\\x08\\xba\\x04\\x51\\x28\\x18\\xf6\\x56\\x89\\x34\\xeb\\xab\\xd8\\x61\\x67\\x56\\x16\\xb4\\xb8\\x74\\x67\\x96\\x97\\x83\\x01\\xee\\xde\\x94\\x0a\\x28\\xdd\\x9b\\x52\\x61\\x4a\\x6b\\xeb\\xaa\\xd9\\x78\\x31\\x04\\x1d\\x32\\x45\\x2f\\x27\\x4d\\x76\\xe0\\xd8\\xf4\\x0b\\x41\\x5a\\xee\\x84\\x3c\\x1e\\xcd\\x73\\xba\\xc3\\xe7\\x74\\x67\\x9e\\xf7\\xf8\\x5e\\xb8\\xf7\\x7b\\x7c\\x0f\\x1f\\xea\\xa4\\xb8\\x70\\xfe\\x23\\x54\\x11\\x5a\\xd5\\x88\\x88\\x4b\\x36\\x01\\xc5\\x87\\xc5\\x62\\x54\\xc6\\xcb\\x1c\\x54\\x0d\\x9a\\xe7\\xec\\xf2\\xb2\\x0a\\x1e\\xa9\\x8c\\x41\\xd4\\x5c\\x31\\xe5\\xcd\\x0f\\x78\\x48\\x6f\\x34\\xb8\\xcd\\xcb\\xd8\\x81\\xfb\\x77\\xa6\\x7d\\x6b\\xf5\\xf1\\x8d\\x90\\xfc\\x78\\x8c\\xb2\\x10\\x7a\\xb1\\x09\\xa1\\x59\\x5c\\xf1\\x5b\\xd3\\x32\\x48\\x57\\x62\\x4b\\xba\\xac\\x7a\\x24\\x5d\\x1a\\x1c\\x87\\x19\\xf3\\xe4\\x32\\xf5\\xee\\x7c\\x59\\x4d\\x75\\x0f\\x7b\\xaf\\x20\\x67\\xeb\\xff\\x94\\xea\\xa8\\xb1\\x9d\\x2a\\xba\\x5a\\xa4\\xec\\xd3\\x2c\\xe9\\xba\\x8f\\x25\\xcd\\xd0\\xc8\\xf6\\x84\\x25\\xb5\\x46\\xb6\\x7e\\x51\\x36\\xa9\\xfc\\x3a\\xdd\\x18\\x76\\xf8\\x99\\x8e\\xb6\\x64\\xb6\\x4d\\x7e\\x00\\x14\\x1f\\xbf\\xfd\\xf1\\xfd\\xeb\\x0f\\xaf\\xff\\xf9\\xd5\\xf2\\xf5\\x0f\\xaf\\x5e\\xff\\xf0\\xfa\\xc3\\xaf\\xc0\\x1d\\x9f\\x85\\x3f\\xc7\\x63\\x75\\x3c\\x0e\\xa4\\x92\\x1c\\xa3\\x53\\xa3\\x0d\\x14\\x70\\x2d\\xa1\\x2e\\x8a\\x8f\\xaf\\x1b\\x35\\x56\\xc6\\xf8\\x34\\xb3\\x5c\\x6d\\x16\\xaa\\xb1\\xb2\\x05\\x15\\x2d\\xbb\\xdd\\xcc\\x8c\\xfa\\x76\\xc6\\x93\\x43\\x4d\\xef\\xd8\\x17\\xa8\\x72\\xda\\xb1\\x6d\\xbc\\x63\\xfd\\xda\\x2b\\x9a\\x11\\x7a\\xc3\\xb6\\xf1\\x9e\\x55\\xc7\\xe3\\xdd\\x67\\xa9\\xb1\\x8a\\x99\\x0a\\x8d\\xc8\\x4a\\x2a\\x68\\x41\\x12\\x11\\xef\\x69\\x46\\xa6\\x5b\\xb0\\x2c\\x62\\xc8\\x7f\\xed\\xbc\\x56\\xeb\\x86\\x1c\\x8f\\x77\\x74\\x0b\\xb1\\x28\\x58\\x06\\xaa\\xd6\\x78\\x37\\xde\\xc4\\xbb\\xa7\\x2b\\xba\\x45\\xe5\\x71\\xce\\x04\\xcd\\x5b\\x8a\\xaf\\xf5\\xc3\\x4c\\x72\\x06\\x4c\\xf2\\xad\\xa9\\xd4\\x55\\x73\\x65\\xa0\\xe6\\xa2\\x1b\\x26\\xce\\xb0\\xc9\\x6b\\x2a\\x69\\x46\\xce\\x28\\xa1\\x5b\\x81\\x00\\x5a\\x9c\\xa0\\x27\\x53\\x42\\x29\\x54\\x98\\x2a\\xba\\xc3\\x7a\\xb8\\x50\\x7c\\x90\\xb5\\xd9\\x00\\x1f\\x7f\\xe1\\x1d\\xbf\\xeb\\x21\\x8e\\x9a\\x4f\\xac\\x8a\\x5a\\x3f\\x30\\xe7\\x09\\x38\\x41\\xab\\x79\\x63\\xfb\\xf4\\x19\\x8d\\x9a\\xca\\x0d\\x99\\xef\\xa1\\xbf\\x04\\xef\\xd8\\xab\\xc7\\xce\\x98\\xa5\\x57\\x39\\x5c\\x71\\x47\\x7e\\xd8\\x68\\xa0\\x6f\\x01\\x20\\x85\\xc4\\x79\\x63\\xa7\\x62\\x91\\x3b\\xf6\\x57\\xd7\\x2b\\xa4\\xcd\\x0d\\x09\\x35\\xa0\\xab\\x4f\\xd0\\xe5\\xb6\\xda\\x39\\x5d\\x9b\\x03\\x65\\x86\\x1a\\x77\\x37\\x12\\x28\\xf1\\x55\\xaf\\xca\\xec\\x9c\\xc5\\xc7\\x39\\xb3\\x8e\\x86\\xac\\xb9\\xfd\\x6b\\x3a\\xb1\\xcf\\xd7\\x7b\\xfd\\x35\\x75\\xfc\\xd2\\xf9\\xb2\\x98\\x1e\\x5c\\x14\\xde\\x4f\\xe8\\xe8\\x3b\\x6d\\xce\\x5b\\x27\\xb5\\x03\\x73\\xf2\\x40\\xa8\\xea\\x49\\x0d\\x81\\x32\\xc4\\xb1\\xc0\\x08\\x63\\xc2\\x8a\\x0f\\xc7\\x22\\xd6\\x6a\\x63\\x28\\x89\\x86\\x88\\x40\\x19\\x76\\xca\\xbc\\x59\\x9c\\x39\\x5b\\x56\\xf5\\xd1\\x98\\x05\\xcd\\xaa\\xab\\xeb\\xc9\\xe4\\xd1\\xe9\\x8b\\xe4\\xda\\x4a\\xb5\\xcf\\xc5\\x8c\\x9a\\xea\\xd6\\x6a\\x56\\xe3\\xf4\\x91\\x0b\\xae\\xa6\\x5b\\xeb\\xdf\\xaa\\x37\\x4e\\xff\\xbb\\x22\\x57\\xd5\\xd2\\x2d\\x9e\\x95\\xba\\xb6\\xdd\\x42\\x4a\\x14\\xa7\\xae\\x59\\x16\\xef\\x5e\\xa0\\x5b\\x41\\xce\\xb2\\x78\\x6f\\x7f\\x6f\\x59\\x66\\x7a\\x05\\x33\\x39\\xe0\\xeb\\xa2\\x09\\x19\\xc7\\x7f\\x7f\\x74\\x83\\xf2\\x9c\\x15\\xbd\\x65\\x5b\\x0b\\x18\\x36\\xec\\x3f\\xfe\\x31\\xb9\\x52\\x31\\x90\\x53\\x76\\x61\\x9a\\x38\\x18\\x80\\x21\\x56\\x6c\\x32\\x5d\\x81\\x70\\x74\\x45\\x6e\\x51\\x38\\xaa\\xee\\x36\\x5b\\xcd\\xb1\\xeb\\x15\\x05\\xf9\\x2a\\xd6\\xe4\\xa6\\xe6\\x48\\x4c\\x57\\x6d\\x73\\x88\\xd5\\xc2\\x0a\\x98\\x6e\\xe9\\x1d\\xbb\\x1d\\xf5\\x77\\x41\\x2d\\x0e\\xe9\\xf0\\x29\\x2b\\x32\\x83\\xd9\\xbc\\x14\\xe8\\x43\\xfd\\xaa\\x54\\x77\\x38\\x4f\\x8f\\x31\\x4a\\x8c\\x66\\xb1\\x5a\\x90\\x64\\x32\\xbd\\x65\\x77\\x60\\xb1\\xd0\\x16\\x3d\\x0f\\x87\\xd1\\xce\\x10\\x24\\x45\\x5b\\x2a\\x0f\\xc2\\x9d\\x3b\\xb6\\xf5\\x26\\x00\\x37\\xec\\x60\\x48\\xe8\\x7d\\x92\\xb7\\x04\\xac\\x93\\x96\\xf0\\x75\\x17\\x0a\\x6d\\x45\\x23\\xb4\\xbd\\x6b\\x82\\x0f\\x3c\\x00\\x2e\\x57\\x54\\x92\\x7a\\x7a\\x8a\\x54\\x56\\xf4\\x06\\xdc\\x31\\xfa\\xb7\\xa2\\x2d\\x0d\\x6a\\x9d\\x99\\x1e\\x47\\x25\\x27\\xb8\\xf1\\xfc\\x30\\xc8\\x36\\x4e\\xa2\\xe5\\x3b\\x39\\x26\\xae\\x9f\\x5c\\x7c\\x4a\\xb4\\x2a\\xc9\\x70\\x28\\x46\\xa3\\x1a\\xf2\\x12\\xb7\\xf7\\xb0\\x27\\xf6\\xc7\\x03\\xb6\\xd5\\x4e\\x57\\xfd\\xb0\\x19\\x47\\x9c\\x9a\\xae\\x8f\\x47\\x41\\x92\\x49\\x5d\\xdf\\x22\\xa0\\xdf\\xa8\\x22\\x2d\\x21\\x52\\x2f\\xbd\\xed\\x42\\xfb\\xff\\x8e\\xbc\\x65\\xf2\\xd7\\xe5\\x2d\\x4e\\x56\\xd2\\x12\\xa0\\x7c\\x96\\xd0\\xc5\\x30\\xeb\\x2d\\x81\\x48\\x78\\xa2\\x26\\xb5\\x99\\xd9\\xff\\x2f\\x1d\\xf9\\xff\\xb6\\x74\\x24\\xc1\\x34\\x83\\x8d\\x64\\x11\\x57\\x74\\x8e\\x4f\\x00\\x9b\\x17\\xa3\\x5e\\x41\\x49\\x5d\\x37\\x46\\xa5\\xa5\\x3b\\x80\\xad\\x0c\\x31\\x14\\x2e\\x86\\x79\\xa8\\x92\\x43\\x2e\\x2a\\x08\\x0c\\x63\\xe8\\x94\\xb6\\xdd\\xa8\\xb5\\x37\\x05\\xc9\\x5c\\x91\\x96\\x70\\xc6\\x81\\xd2\\x79\\x63\\x4f\\x4c\\xd8\\xb4\\x75\\x00\\x3d\\xa1\\xb2\\x69\\x08\\x95\\xad\\x3a\\xd4\\x1b\\x7b\\x07\\x05\\x1f\\xd0\\x4d\\x78\\xfb\\xac\\x54\\x70\\xf2\\x17\\x24\\x82\\xee\\x13\\x77\\x2d\\x5a\\xe8\\xaf\\xe8\\x4e\\x9c\\xb9\\x73\\x9f\\xb1\\x58\\xc7\\xa2\\x31\\xf0\\x01\\x9f\\xeb\\x85\\x33\\x6d\\x1c\\x8c\\xf8\\xa9\\x71\\xa4\\x98\\x5b\\x2f\\x31\\xf2\\xa0\\x51\\x48\\xd7\\xf4\\xda\\x51\\xee\\xce\\xf6\\x1a\\x74\\x37\\x95\\xf7\\x75\\x0a\\x47\\x00\\x59\\x5a\\x3c\\xd3\\x4d\\x5d\\xe4\\xb1\\x4b\\xc6\\x74\\xa3\\x8c\\xfe\\x2f\\xb2\\xe0\\xa2\\xc3\\x82\\xfb\\xf8\\x69\\x87\\x65\\xa1\\xd4\\xc6\\x9c\\x8a\\xe5\\x6a\\x5b\\x14\\x6f\\xcc\\x83\\xbb\\xef\\xa0\\x74\\xb6\\x24\\x9e\\x43\\x61\\xa2\\x9e\\x9e\\xe5\\xd0\\x53\\x43\\x08\\xf6\\xf0\\xe2\\x13\\xaa\\xfe\\xba\\x35\\x67\\x87\\x02\\xea\\xba\\xc0\\x96\\xce\\x05\\x36\\xa0\\xa0\\x3e\\xd3\\x00\\xf3\\x93\\x96\\x8d\\x99\\xe5\\x5a\\xcd\\x4e\\xbc\\xb5\\x21\\xdf\\x1b\\x3e\\xd4\\x86\\x0c\\x9b\\x17\\x0b\\xc3\\xdb\\x97\\xb3\\xd4\\x11\\x5b\\x49\\x16\\xef\\x68\\x0e\\x25\\x7b\\x5f\\xb2\\x47\\xd3\\x4b\\xa4\\x1d\\xe0\\x7e\\xfe\\x3f\\xbc\\xbd\\x69\\x77\\xdb\\x46\\xb6\\x28\\xfa\\xfd\\xfd\\x0a\\x8b\\x37\\x97\\x17\\x25\\x6c\\x42\\xa4\\x92\\xee\\xd3\\x07\\x54\\x89\\xcb\\x71\\x86\\x76\\x62\\xa7\\x33\\x38\\xe9\\xa4\\xf9\\xb8\\x74\\x21\\xb2\\x28\\x56\\x1b\\x44\\xb1\\x51\\x45\\x8b\\x0c\\x89\\xff\\xfe\\x56\\xed\\x1a\\x01\\x52\\xb6\\x73\\xfa\\x9c\\xf7\\x45\\x22\\x6a\\x1e\\x77\\xed\\x79\\xe7\\x73\\xf3\\x80\\xc5\\x8a\\x98\\xab\\x48\\x11\\x33\\x5e\\xea\\x27\\x55\\x29\\x9b\\x66\\x6d\\xee\\x5c\\x5d\\x2c\\xf4\\xcd\\x5f\\xff\\x7b\\x14\\x4e\\xe7\\xd1\\x89\\xe8\\x1d\\x17\\xea\\x3c\\x3f\\xe8\\x16\\xf2\\x83\\x86\\xd5\\xb9\\x79\\xda\\x34\\xe1\\xa2\\x3b\\x7e\\xf2\\x49\\x7a\\x3f\\xb4\\x0a\\xd0\\x64\\x17\\xae\\xfa\\x52\\x1c\\x9a\\x9d\\x99\\x99\\x9c\\x6b\\xd8\\x57\\xf7\\x60\\x17\\xcf\\x2d\\x8c\\x6d\\x84\\xef\\x06\\x02\\xa9\\xdd\\x87\\x94\\xf2\\xcd\\x34\\xff\\x80\\xa2\\x62\\x00\\xd6\\xbd\\x44\\x83\\x62\\xfc\\x34\\xea\\xce\\x5d\\xb8\\x6c\\xf4\\x9d\\x03\\x6c\\xfe\\x18\\x8d\\x49\\xe3\\xc5\\xe5\\xde\\xc7\\x2b\\x5b\\xd6\\x8c\\xfd\\xce\\x92\\xc3\\xdd\\x1d\\xfa\\x7a\\xb9\\xbb\\x33\\xf6\\x46\\x9f\\x17\\x75\\x88\\x83\\x91\\xcf\\x05\\x7c\\x8e\\x8a\\xa3\\x51\\xda\\x4a\\xc0\\x17\\x56\\xfc\\x14\\xa5\\x6e\\x05\\xe8\\x35\\x8a\\x52\\x96\\x02\\xbe\\x77\\x18\\x52\\x94\\xfc\\x20\\xe0\\x7b\\x1e\\x97\\xdb\\x08\\xf8\\x51\\x9f\\xa8\\x28\\x69\\x2d\\xe0\\x27\\xb3\\x15\\x51\\xe2\\x4e\\x34\\x24\\xf8\\x9d\\xb9\\x13\\x71\\x94\\xef\\xf3\\x58\\x70\\x65\\x2c\\x29\\x5f\\x17\\xf5\\x03\\xaf\\x72\\x01\\xbb\\x5c\\xc2\\x3e\\x2f\\x5a\\x18\\x74\\xdd\\xc2\\xae\\xcb\\xc6\\x3a\\xe7\\x9a\\x53\\x71\\x55\\x8f\\x55\\x86\\xcf\\xd8\\xf7\\x85\\x5a\\xa1\\x9f\\xf7\\xa2\\x9e\\x27\\x46\\x02\\xcd\\x07\\x73\\xa8\\xd2\\x39\\x81\\xf2\\x56\\x4c\\x12\\x5d\\xba\\x8c\\xf2\\x4b\\x9d\\x87\\x65\\x2e\\x86\\x84\\xe4\\x21\\x43\\x40\\x95\\xbe\\x56\\xc0\\x07\\xaf\\x15\\x7a\\x03\\x2d\\x85\\x64\\xbe\\xf5\\x79\\xc9\\x37\\x49\\x14\\x21\\x79\\x7f\\xc6\\xb3\\xc8\\x2b\\x16\\xf9\\xb8\\xbc\\x8f\\x4c\\xc3\\x61\\x6a\\xd0\\x3a\\xe4\\x3a\\x3b\\x1c\\xef\\xcb\\x6a\\xe1\\x90\\x3f\\x97\\x8e\\x1f\\x3a\\x7d\\x46\\x3c\\x47\\x26\\xe1\\x03\\x66\\xf4\\xc2\\x3c\\x3d\\x2c\\xa1\\xba\\x64\\x57\\xd7\\x04\\xea\\x56\\x5c\\xe3\\x84\\x0f\\xa2\\x22\\x8a\\x90\\xcb\\xea\\xea\\xda\\x61\\x73\\xdf\\xa9\\x44\\xc1\\x10\\xa2\\x02\\x8c\\x90\\xc6\\x47\\xa5\\xf3\\xa3\\xcb\\xeb\\xc4\\x2a\\xd9\\xe0\\x27\\x01\\x37\\xd6\\x90\\xf1\\x65\\xb5\\x20\\x10\\xc6\\x9d\\x7f\\xa7\\x12\\xab\\xab\\x63\\x8d\\x31\\xa1\\xb0\\xf9\\xba\\x5a\\xc8\\xfd\\xb2\\x5a\\x60\\x5e\\x14\\x22\\xfb\\xdd\\x89\\xd3\\x9a\\xc3\\x2e\\xe7\\xa9\\xba\\xf4\\xba\\x7c\\x8c\\xc0\\x3e\\xaf\\x5c\\x8a\\xe4\\x55\\xc2\\xe2\\x06\\x1e\\x5b\\x27\\x6d\\x97\\x73\\x5d\\x3a\\x46\\x52\\x44\\x38\\x71\\xb2\\x75\\xe2\\x8a\\x86\\xb2\\x58\\xb3\\xb2\\xad\\x27\\x56\\x18\\x45\\xca\\x96\\x4e\\x59\\x5a\\x40\\xbc\\x50\\xf3\\xb0\\x34\\xab\\x78\\x39\\x16\\x61\\xee\\xdb\\x86\\xee\\x05\\x02\\xe9\\x1a\\xe4\\x40\\x10\\x58\\xd2\\x7a\\x30\\x87\\x07\\x5a\\x0f\\x56\\xb0\\xa1\\x22\\x9d\\x5f\\x2d\\x61\\x4d\\xe5\\x60\\x75\\xf5\\x00\\x3b\\x5a\\xa6\\x0b\\xb8\\xa7\\x65\\xba\\x85\\x3b\\x2a\\xd2\\xc5\\xd5\\x0e\\xf6\\x54\\x0e\\xb6\\x57\\xf7\\x46\\xd6\\x73\\x7a\\xdc\\x39\\x54\\x50\\xc3\\x06\\xd6\\x04\\x56\\xb7\\xc3\\xf0\\xb0\\xbd\\x13\\xc9\\x03\\xac\\x8d\\xa3\\x11\\x53\\x92\\x65\\x3b\\x60\\xd9\\x1e\\x56\\xb0\\x06\\x99\\xbe\\x56\\xc4\\x7a\\x5d\\x7b\\xa7\\xcb\\xde\\x83\\x34\\x65\\xb1\\x1b\\x0d\\x94\\xde\\x88\\xe4\\x5d\\xb6\\x83\\x77\\x68\\x2a\\xd0\\x69\\xf9\\x1e\\xf6\\xe7\\x5a\\xde\\x62\\xbb\\xb0\\x4f\\x71\\x45\\xbf\\x7f\\x49\\x4c\\x1c\\x06\\x37\\xcc\\x12\\xf4\\x4c\\x4a\\xd0\\xf3\\x32\\x41\\x28\\x17\\x9d\\x76\\x77\\x70\\x77\\xae\\xdd\\x05\\xdc\\xb9\\x26\\x41\\x0c\\xc2\\xc8\\x1f\\x75\\x9d\\x25\\x88\\xd3\\x91\\x3f\\x66\\x3b\\x78\\xd4\\x23\\x9f\\x77\\x7a\\x58\\xc2\\xe6\\x5c\\x0f\\x73\\x6c\\x17\\x36\\xa4\\x69\\x5d\\xfa\\x70\\xc8\\x5e\\xb7\\x0e\\x59\\x78\\x8e\\x29\\x83\\x8a\\x5a\\x7d\\x10\\xb4\\xcb\\x8d\\xf4\\x41\\xc6\\x2d\\x0c\\xab\\xdf\\x4f\\xaa\\x89\\x1d\\xa1\\x41\\xb9\\xae\\x2f\\x5b\\x05\\xc0\\xe4\\x7d\\x23\\x78\\x45\\x7b\\x48\\xee\\xf4\\x30\\xd0\\x46\\xa8\\xf0\\x74\\xf1\\x7b\\xf6\\x8e\\x95\\x3d\\x02\\x2c\\xd3\\x18\\xdb\\x0b\\x5e\\xcf\\x4b\\x26\\xfb\\xfd\\xb3\\xc2\\xc4\\xc3\\x2e\\xaf\\x60\\xef\\xac\\xd7\\xdd\\xbd\\xf0\\x57\\xa4\\x68\\x5d\\x91\\x5a\\xcf\\xb0\\x7c\\xea\\x8a\\xd4\\xfa\\x8a\\xcc\\x3b\\x57\\xa4\\x46\\x00\\xbd\\x32\\xca\\x5b\\xe8\\x20\\xd4\\xb5\\x4d\\xad\\x55\\x2b\\x7e\\xa4\\x77\\x0a\\xec\\x23\\x01\\x51\\x91\\x22\\xfe\\xa0\\xad\\x1a\\xad\\xb6\\x52\\x54\\x45\\x8f\\xa7\\x3b\\x18\\xa0\\x0b\\xe1\\xd3\\x2b\\x52\\x81\\x80\\x39\\x48\\xdd\\xa1\\xc4\\x63\\xb7\\xa2\\xc3\\xf1\\xea\\xa6\\x55\\x79\\x9c\\xa6\\x2b\\xa2\\x32\\x43\\x5a\\x26\\x2e\\x18\\xc7\\xf9\\xb6\\x4a\\x90\\xd8\\xda\\xc7\\x34\\xd4\\x58\\x45\\x62\\xa8\\xfa\\x7d\\x37\\x5b\\x0b\\xb0\\x20\\x94\\x22\\xd6\\x71\\xd3\\xdb\\x80\\xf5\\x7c\\xc9\\xbb\\x5e\\xed\\x0c\\xab\\xd7\\xb2\\x5e\\x9d\\x64\\xa2\\x15\\x1d\\x3c\\xa6\\xa2\\x5a\\x39\\x61\\x0d\\x5b\\xc9\\x7e\\x9d\\xe3\\xc4\\x3f\\x6a\\x39\\x11\\x9d\\x16\\x6a\\x93\\xa2\\xe5\\xd0\\x49\\xfd\\x7e\\x5b\\xfc\\x68\\x3c\\xbb\\x92\\x86\\x57\\x28\\xf0\\x3c\\xeb\\x76\\x42\\xe3\\xda\\xb5\\xd8\\xc8\\xc4\\xf1\\x4e\\xd0\\x97\\xe5\\xa1\\xb0\\x00\\x7d\\x61\\x59\\x7c\\xb9\\x6c\\xe8\\x57\\x9a\\xdc\\x38\\xec\\x72\\x05\\x7b\\xf4\\xd1\\x1e\\x23\\x1b\\x45\\x38\\xd7\\x1d\\x44\\xa2\\x85\\x64\\xcc\\x3b\\x14\\xe8\\xaa\\x39\\x19\\xc5\\x1f\\xe7\\xdc\\x40\\x47\\xcb\\x46\\xcf\\xc0\\x3e\\xb6\\xc9\\xea\\x96\\xde\\xa9\\xe3\\xf1\\xaf\\x2a\\x11\\x80\\x26\\xdb\\xfd\\x7e\\x22\\x6f\\x69\\xd9\\xef\\xcb\\x1b\\x6a\\xc4\\x41\\x86\\x5c\\x40\\x82\\x23\\x12\\x45\\xe7\\x0c\\xf6\\x39\\x8f\\xaf\\x6e\\x15\\xa6\\x28\\x5a\\x53\\x94\\xad\\x29\\x16\\xa7\\x53\\xfa\\x37\\x98\\x52\\xc6\\xf3\\x6d\\x52\\xa5\\x82\\xa0\\x65\\x74\\x22\\xd3\\x82\\x78\\x4c\\x43\\x0f\\x33\\x8d\\xd4\\xf4\\x2f\\x4b\\x3d\\xe8\\x34\\x52\\xd5\\xbf\\x2c\\x9b\\xc6\\xe2\\xdb\\x8e\\x9a\\xea\\xfa\\x2d\\x39\\x59\\x02\\x23\\x17\\x3a\\x47\\x60\\x3b\\x79\\x01\\x8a\\xc2\\x9c\\x02\\x9b\\x71\\x16\\x10\\x9f\\xce\\x27\\xc0\\xf4\\x24\\xfb\\xf4\\xd3\\x7c\\xd8\\x86\\x25\\x06\\xe0\\x2d\\x4b\\x21\\xea\\x84\\xb5\\x2f\\xd6\\x95\\xbe\\xf8\\x17\\xc9\\x10\\x81\\x53\\x2b\\xe7\\x78\\x6c\\x01\\xc2\\x9b\\xa1\\x4e\\x88\\x96\\xed\\x66\\x48\\xd0\\x5b\\x8d\\xca\\x64\\xf1\\x0e\\x9d\\x8f\\xf7\\xfb\\x9d\\x26\\x22\\x93\\x07\\x4e\\x93\\x16\\xb8\\x0c\\xa0\\x4f\\x2f\\xb4\\xca\\x54\\x5d\\x54\\xb2\\x2c\\x14\\x4b\\xfc\\x4a\\x73\\x72\\x59\\x81\\x5f\\x65\\xfd\\xa5\\xdf\\x33\\xcf\\x4a\\x43\\x5b\\xfb\\x36\\x2b\\xcd\\x81\\x20\\x9f\\x1f\\x31\\xd3\\xe2\\xc7\\x03\\xc7\\xdd\\x5a\\x21\\x72\\x78\\x0f\\x5c\\xb7\\x10\\xae\\xa3\\x19\\xd8\\x85\\x93\\x9c\\x98\\xc1\\x25\\xa4\\xb1\\x0a\\xbb\\x1d\\x4b\\x24\\x0c\\x43\\x78\\xbe\\x93\\x4e\\xd1\\xff\\xad\\x37\\x25\\xc0\\x55\\xdb\\xaa\\xf9\\x7c\\xed\\x93\\x6b\\x26\\x95\\xa8\\x91\\x35\\x17\\x5e\\xf6\\x9f\\x2c\\xfe\\x49\\x19\\x39\\x98\\x27\\xf5\\x45\\xb1\\xa1\\xdf\\x7a\\xf6\\xc8\\x8b\\x62\\x83\\xab\\x03\\xac\\x93\\x80\\x00\\xdc\\xb8\\xd9\\xf8\\xa2\\x90\\xab\\x24\\x54\\xd1\\x9f\\xbe\\xb8\\xfe\\xc0\\x87\\xa9\\xb4\\x05\\x8d\\x3a\\x21\\x6d\\x17\\x37\\x89\\xad\\x4a\\x26\\x89\\xc4\\xef\\x7c\\xa8\\xa3\\x3f\\xdb\\xc3\\xf2\\x29\\xae\\x86\\xc1\\x19\\xbe\\x6d\\xf3\\x79\\x7c\\x71\\xfc\\x22\\x9d\\x03\\x10\\xcd\\x1a\\x8f\\x00\\x8b\\xbf\\x22\\x6c\\xe8\\x7b\\xe1\\x80\\xb6\\xc7\\xb8\\x78\\xb6\\x03\\x9e\\xed\\xa3\\x42\\x5f\\xb8\\x85\\x3d\\x34\\x11\\x70\\x77\\x5c\\x1f\\xa7\\x9e\\x43\\x87\\xc6\\xc1\\x23\\xad\\x06\\xa3\\x86\\x72\\x97\\x8e\\x80\\xfb\\x04\\xfb\\x10\\xc6\\x7d\\x72\\x44\\xc1\\xa0\\x0d\\x90\\xb8\\x29\\x34\\xe0\\x2c\\x8e\\x47\\x71\\x5b\\xf7\\xfb\\xf2\\xb6\\xf6\\xde\\x2f\\x50\\xf7\\xc7\\x52\\x03\\x79\\x09\\xc8\\xd8\\x62\\x99\\xfe\\x07\\xbc\\x64\\x55\\x3e\\xbf\\x29\\xfb\\xfd\\x8b\\xd5\\xa4\\x4a\\xe7\\x83\\x32\\x9f\\x0f\\xca\\xe8\\x64\\xbc\\xe8\\xd2\\x77\\x07\\xc3\\x88\\xcb\\x85\\xe7\\xc7\\x48\\x3d\\x40\\xdb\\x8b\\xf3\\x4d\\x51\\x9b\\x5e\\x4a\\xdb\\x41\\x43\\xbf\\x10\\x89\\x41\\x51\\x61\\xd5\\x72\\xc0\\xea\\xb5\\x7f\\xa4\\x62\\x9b\\x0d\\x5b\\x4c\\xbe\\x51\\xb9\\xca\\x14\\xab\\x24\\xc6\\x13\\xec\\xad\\x45\\x25\\x94\\x55\\xcf\\x50\\xd9\\x7c\\x7b\\xcf\\xe7\\x2f\\x35\\x40\\xdc\\x88\\x12\\x19\\xa7\\xaf\\xc5\\x82\\x4d\\x14\\xcb\\xbf\\x17\\x4d\\x62\\x3d\\x71\\x1a\\x07\\x88\\x87\\xb5\\x78\\xc7\\x72\\x54\\x6f\\xab\\xd9\\x3b\\x56\\x4b\\x96\\x6f\\x1a\\x5a\\x1d\\x8f\\x87\\xc6\\xba\\x46\\x1c\\x8e\\x17\\x37\\x74\\x8e\\x5e\\x11\\xb7\\x54\\x4c\\x93\\x3a\\x4d\\x36\\x93\\xf9\\x60\\x91\\x2f\\x08\\xf9\\xdf\\xc5\\x0c\\x8c\\xf2\\xc4\\xf1\\x98\\x3c\\x68\\x94\\x55\\x37\\xf7\\x46\\x24\\xdb\\x6c\\x07\\x5b\\x8d\\x54\\x3f\\xd0\\x8b\\x11\\xc9\\x57\\x89\\x82\\x25\\x6c\\x61\\x03\\xd2\\xcd\\x40\\x53\\x37\\xdb\\x60\\x5a\\x8f\\x7e\\x77\\x7c\\xeb\\xf9\\xd0\\xb4\\x7d\\xae\\x1e\\x81\\x8b\\x8b\\xc8\\xfb\\xe5\\xdf\\xce\\x50\\xd6\\xcc\\xb2\\x41\\xdd\\x72\\x4b\\x70\\x27\\x05\\xd7\\xb9\\x8e\\xd7\\xd9\\x2c\\x40\\x19\\x2f\\xc0\\xdc\\x2d\\x00\\x22\\xa7\\x60\\x3d\\x45\\x6a\\xc2\\x89\\x0e\\x61\\xe7\\xf5\\xd9\\xef\\x35\\x39\\x9d\\x14\\x69\\x32\\x9f\\xd4\\x03\\x95\\x2b\\x42\\xfe\\xb7\\x84\\x3b\\xe3\\x35\\x76\\x79\\x41\\xe9\\x03\\x3a\\x61\\xb4\\x67\\x7e\\x0d\\x0f\\xee\\xb2\\xe1\\xd7\\xb2\\xf5\\xb5\\x21\\xd6\\x47\\xac\\x71\\x60\\x24\\xa6\\xf7\\xc9\\x90\\xcc\\xc0\\x2f\\xe7\\x22\\xdb\\xc1\\x22\\xdb\\x13\\x87\\x46\\xd2\\x1a\\x71\\x47\\x0d\\x69\\x4d\\xe9\\x15\\x99\\xc1\\x02\\x37\\xc2\\xfb\\x1c\\xf3\\x41\\x0f\\x74\\x65\\x4e\\x17\\xd9\\x1e\\x2a\\x3a\\x3c\\xb2\\x71\\x45\\x29\\xdd\\x4e\\x12\\x7e\\xb3\\x9c\\x2c\\x29\\xcf\\xf9\\xad\\x1e\\xe8\\x03\\xe5\\x68\\x0b\\xb6\\xbb\\x5c\\xa7\\x8c\\x5c\\xa5\\xe9\\x8e\\xe4\\xc9\\x5d\\x12\\x8d\\x12\\x43\\xa2\\x6c\\x69\\xa5\\x57\\x00\\x96\\x14\\x2b\\x6c\\x28\\x6f\\xee\\x62\\xda\\xe7\\xb9\\x68\\x4b\\x88\\xe2\\x80\\xfb\\x01\\x5c\\xe9\\xb7\\x2c\\x7c\\x39\\x6d\\x45\\x1b\\x01\\xc8\\xc4\\x91\\xb6\\x6a\\x64\\xc7\\xa3\\xca\\x90\\xc5\\xac\\xdf\\xc7\\xf3\\xc7\\x9d\\x3d\\x71\\xdc\\x75\\x0d\\x7b\\x66\\x8e\\x47\\x4e\\x26\\x7f\\x13\\xf9\\x0b\\xd1\\xbc\\x35\\xdc\\x41\\x14\\xe3\\xbd\\x8d\\x39\\x83\\xd1\\x2b\\x9f\\xf7\\x8c\\xd3\\x94\\x1e\\x44\\x20\\x2d\\xef\\xfd\\xaf\\xe5\\x72\\xe9\\x92\\xbc\\x04\\x37\\x82\\x90\\xf9\\xb5\\x73\\xca\\x31\\xb4\\xac\\x5a\\xab\\x3d\\x11\\x75\\xf4\\xa3\\x7e\\xe3\\x75\\x6f\\xed\\xc7\\x35\\xef\\x75\\x12\\x7a\\x2e\\x44\\xc9\\x1b\\x71\\x2e\\x06\\xa7\\xa6\\x33\\xae\\xbf\\x08\\x1c\\xb4\\x1f\\xa3\\x4b\\xf0\\x46\\xf4\\xfb\\x26\\x42\\xaa\\xd5\\x89\\xf3\\xf2\\xb7\\x53\\xe7\\x3c\\x46\\x41\\x14\\xcd\\x40\\xd4\\x6a\\x2c\\x8e\\xc7\\xc4\\x7f\\x61\\xf0\\x5f\\xd3\\x0f\\xb0\\x4c\\xa7\\xd8\\x1b\\xd3\\xef\\x8b\\x98\\xee\\x25\\x60\\x5e\\xc5\\x10\\xa5\\xdb\\xd3\\x2a\\x82\\x44\\xde\\x77\\x9f\\xf0\\x0c\\x74\\x70\\x83\\xec\\x42\\xca\\x82\\x3e\\x17\\x89\\xc5\\x0b\\xac\\x61\\xe7\\x33\\xb1\\x7c\\x26\\x08\\x76\\x27\\xa1\\xce\\xa4\\x7b\\xc1\\x62\\xd2\\xcb\\xf8\\x1c\\xa9\\xdd\\xdb\\x80\\x1c\\xc4\\x9c\\xa7\\xfa\\xc5\\x20\\x18\\x69\\xb5\\xc5\\xa6\\x6b\\x93\\x5e\\xe8\\xa8\\xd6\\x50\\x57\\xaf\\x3e\\x9a\\xba\\x72\\x6a\\x85\\xde\\x9c\\xfc\\x1c\\xb9\\x85\\x47\\xb8\\x9d\\xe2\\xc4\\x25\\xed\\x54\\x5c\\xf9\\x76\\x8a\\x11\\xe8\\xb4\\xd2\\xdc\\x9a\\xb5\\x53\\x23\\x55\\xcc\\x51\\xab\\xb2\\x89\\x04\\x6a\\x92\\x9f\\x22\\xb0\\xce\\x2a\\x4a\\x3d\\x8d\\x3f\\x6b\\x8c\\x39\\xe1\\x4f\\xdc\\x48\\xfe\\xc4\\x8d\\x24\\xfd\\xfe\\x05\\x77\\x77\\xb2\\xdf\\xbf\\x60\\x9d\\x01\\x46\\x31\\x65\\xbc\\xea\\xe2\\x84\\x99\\xc5\\xcb\\x59\\x58\\xb2\\xf1\\xb2\\x4a\\x7c\\x5d\\xe0\\x60\\x23\\x94\\x77\\x67\\x3b\\x6c\\x1a\\xc9\\xd4\\xb3\\xcd\\xd9\\xc9\\x8c\\x7d\\x79\\xaa\\xa2\\xd8\\x55\\x6e\\x65\\xa3\\x24\\xbd\\x25\\x67\\x5a\\x1f\\x69\\xc2\\xcb\\x35\\xde\\x0d\\x4f\\x82\\xa9\\x58\\xc0\\x35\\xd8\\x2d\\xe2\\xd2\\x5d\\x64\\xba\\xb0\\xa7\\x6f\\xdd\\xa6\\xc4\\x66\\xf7\\x36\\x97\\x90\\x66\\xc9\\x6b\\xa9\\xba\\x9a\\x1b\\x7e\\xd8\\x56\\x9c\\x69\\x06\\x30\\xf6\\x58\\x83\\x97\\xc9\\x4f\\x31\\xcc\\x0e\\xde\\x8d\\x59\\x53\\x16\\x1f\\xdb\\x12\\xba\\x85\\x6a\\x81\\xe9\\x67\\xdc\\xb4\\xc6\\x07\\xa3\\x99\\xc6\\xbb\\x67\\x0d\\xf7\\xdb\\xfd\\x61\\x03\\x58\\x35\\x65\\x46\\x8c\\x69\\x9b\\x2f\\xe8\\xeb\\x2a\\xe1\\x70\\xb0\\x8a\\x10\\xfb\\x9c\\xb5\\x5c\\x7a\\x8b\\xc6\\x84\\x14\\x29\\xda\\x8a\\x88\\xde\\x0f\\x23\\x06\\xdf\\x78\\x2f\\xba\\xb4\\xa9\\xfe\\x38\\xba\\xb4\\xae\\xf2\\x87\\xaa\\x49\\x2a\\xef\\x9b\\xd0\\x7a\\x1b\\x1a\\xc2\\x8a\\x7a\\x3f\\x92\\xce\\xe5\\x50\\x2c\\xbc\\xb0\\x50\\x67\\xd5\\xd0\\xc2\\xf8\\xf9\\x96\\x53\\x3e\\x83\\x2d\\x95\\xd3\\x15\\x2a\\x54\\x2e\\xf4\\x03\\x4c\\x0e\\xb5\\x71\\x4f\\x64\\xdc\\x0c\\x1a\\x37\\xa1\\x66\\x42\\x4b\\x5a\\x26\\x1a\\xe9\\xf0\\x26\\x80\\x89\\x18\\x2c\\xa6\\x6c\\x46\\xae\\x92\\xed\\x94\\xcd\\xcc\\x6f\\x02\\x95\\x47\\x89\\xc6\\xcb\\x29\\x9b\\x99\\x45\\xb5\\x8d\\x2e\\xbd\\x4d\\x96\\x7e\\x0a\\x5c\\x04\\x99\\x49\\x3d\\x1d\\xce\\xf2\\xba\\xd1\\x47\\xfa\\x27\\xb3\\xd1\\x1d\\x15\\x9b\\xe7\\x26\\xe4\\x24\\x49\\x14\\x18\\xd5\\x3b\\xe0\\x04\\x8b\\x3f\\x19\\x44\\xc7\\x1f\\x18\\xa9\\x01\\xb6\\x5d\\xac\\x82\\x56\\xe6\\xda\\x8e\\x19\\x65\\x18\\xce\\x91\\xf2\\xe3\\xd1\\x49\\xa7\\x9d\\x66\\x27\\x3b\\x05\\xee\\x45\\x9f\\x4a\\x8c\\x2a\\xe6\\x21\\x38\\xc3\\xb5\\x64\\x29\\xd7\\x10\\xdc\\xe1\\x08\\x17\\x85\\xa5\\xf0\\x9f\\x94\\xfe\\xda\\xb3\\x86\\x68\\x5c\\x22\\x6c\\xc7\\xc7\\xe3\\x74\\x46\\xfc\\x65\\x90\\x1d\\x96\\xab\\xa7\\xb5\\xf1\\x35\\xb5\\xe8\\x61\\x44\\x09\\x82\\xf0\\xc0\\xbe\\xdf\\x47\\x3b\\xe9\\x2e\\x74\\x15\\x2d\\x00\\x4e\\x62\\xc9\\xc3\\x97\\x67\\x5d\\xcb\\xbb\\x1b\\x71\\x98\\xf2\\x19\\x7a\\xc3\\x8a\\x78\\x2e\\x7c\\x06\\x55\\x5b\\xf3\\x15\\xcd\\x4e\\x07\\x92\\xdc\\x08\\xe7\\x26\\x46\\x64\\x2b\\xae\\x0c\\x2e\\xd2\\xbc\\x8a\\x55\\x56\\x5f\\x9d\\xa2\\x36\\x8e\\x16\\xcd\\x7b\\xf7\\x5b\\xa5\\x1c\\x22\\xa3\\x11\\xb0\\x7c\\x3a\\x83\\x2e\\x2d\\xe9\\x51\\x1b\\x4f\\x2b\\xe6\\xbd\\x35\\x8f\\x90\\x22\\x83\\xf2\\x7c\\x0a\\xf3\\x62\\xf3\\x39\\xfb\\x9d\\x5b\\xde\\x8b\\xcc\\x2f\\x86\\x70\\xfe\\x3e\\xe5\\x3d\\x3b\\xa2\\x9e\\x93\\xbc\\xc6\\xda\\xb0\\x60\\xcf\\xb2\\xfe\\x69\\xef\\x69\\x3e\\x6c\\xa2\\x79\\x7c\\x34\\xe6\\xd4\\x46\\xda\\xa2\\x8f\\x9e\\x6d\\x4e\\xce\\x6b\\xbe\\x51\\xa2\\x96\\xf4\\x70\\x67\\x7e\\xdb\\xa8\\x47\\x60\\x54\\x6f\\xf1\\x4b\\xd1\\xdb\\x5e\\x58\\x13\\xd4\\xa2\\xe8\\xf7\\x7b\\x7a\\xe0\\xf8\\xdb\\xc9\\x9e\\x5f\\xfe\\x5b\\x5c\\x58\\xab\\x42\\xde\\x62\\xbf\\xbe\\xe5\\x9b\\x0e\\x3f\\x36\\xc2\\x11\\xfe\\x2b\\xec\\x51\\x7f\\xc6\\x76\\xb9\\x80\\x3d\\x9e\\xb2\\x27\\xb9\\xa6\\xad\\xe3\\xb6\\x11\\x8f\\x89\\x1a\\x08\\xb8\\x26\\xa9\\xff\\x66\\x03\\x09\\xd7\\xe4\\xc6\\x7f\\x57\\xe1\\x00\\xa6\\xce\\x79\\x11\\x5c\\xeb\\x01\\xfd\\xea\\x47\\x14\\x7c\\xc9\\xf8\\x78\\xb6\\xba\\x4b\\xa6\\x4b\\xfd\\xf6\\xde\\x52\\x7b\\x2c\\xf5\\x01\\x06\\xe7\\xd3\\xf3\\x09\\x0a\\x3b\\xae\\x68\\x63\\xd4\\xce\\x9d\\x85\\x59\\xa2\\xa8\\x6a\\x87\\xb4\\x42\\x8f\\xde\\x76\\x1e\\xc7\\xe3\\xb0\\x6d\\x03\\x8b\\xa1\\xfa\\xd1\\xf4\\xf5\\x47\\x57\\xc0\\xaf\\xd8\\xf5\\x65\\xc2\\xd2\\x04\\x4b\\xdc\\x77\\x6c\\x76\\x3f\\xc8\\x8c\\x1c\\x33\\x4b\\x42\\x73\\xdb\\xf3\\x4d\\x36\\xd2\\x78\\xc1\\x7b\\x18\\x6e\\xef\\x13\\xf5\\xbc\\x8f\\x89\\xf7\\xad\\x32\\xa1\\xfd\\x8c\\x2c\\xcb\\x38\\xfb\\x37\\x5b\\xd0\\xc1\\x03\\x62\\xf8\\xe9\\x5f\\x53\\x0b\\x75\\x54\\x04\\x75\\x02\\x84\\xfb\\xfd\\xac\\x6c\\xd5\\x3a\\x07\\x36\\x4e\\xc7\\xa5\\xf3\\x49\\x5e\\xb4\\x41\\xdd\\x87\\x3c\\x27\\x02\\xf3\\x7e\\x5d\\xc1\\xf8\\xfd\\xf3\\x43\\x0a\\x1e\\xd7\\x27\\xc9\\x82\\x16\\x57\\xd7\\x5e\\x48\\xcb\\x35\\x46\\x21\\x48\\xcc\\x13\\xc2\\xef\\x39\\xad\\x06\\x0b\\x58\\xd1\\x2a\\x5d\\x90\\x3c\\x59\\x50\\x89\\x75\\xf8\\x60\\x01\\x25\\xe5\\xe9\\x22\\xe6\\x19\\xa1\\xf1\\xd3\\x8a\\x46\\x66\\x07\\x82\\x10\\x1b\\xd4\\xba\\xc6\\x78\\xd4\\x73\\x1b\\xc0\\xba\\x74\\x01\\xa8\\x57\\xd1\\x8a\\x7c\\x25\\x62\\x63\\xc6\\xb6\\xa4\\xff\\xa7\\xb7\\x5c\\x83\\x3b\\x6f\\xdc\\x18\\x96\\x99\\x4d\\x12\\x5d\\x3c\\x9a\\xd8\\x2f\\x9a\\xf8\\xee\\xe9\\x5e\\x7b\\xd0\\xc3\\xfe\\x7a\\x9a\\xea\\x29\\x24\\xbb\\x55\\xd9\\x8e\\xe4\\x26\\xdf\\x0c\\xa0\\x07\\x3d\\x25\\x36\\x2e\\xff\\x46\\x65\\x7b\\x02\\x5c\\x63\\x07\\x17\\x43\\xe0\\x24\\xe7\\x61\\x74\\xbf\\x44\\x2f\\x12\\x06\\x05\\x82\\xc8\\x1f\\x6b\\x35\\x49\\x0a\\xca\\x41\\xd1\\xcf\\x45\\xa2\\x68\\x22\\xa8\\x22\\x94\\xd2\\x44\\x52\\x46\\x26\\x45\\x2e\\x28\\xa5\\xc5\\x44\\x93\\x6c\\x1c\\x18\\x21\\xb9\\x29\\x06\\x26\\x68\\x6a\\xe8\\xc1\\x27\\xda\\xab\\x6d\\xf5\\x7e\\x30\\xfa\\x2d\\xcb\\x7b\\xac\\x5a\\x98\\xdf\\x3c\\x8f\\x2a\\xfd\\xfd\\x34\\x30\\x8d\\x9a\\x0c\\xf3\\x53\\x1f\\x34\\x28\\x2a\\xe3\\x11\\xef\\xe1\\xaf\\x2d\\xde\\x83\\x3e\\x8e\\x04\\x6f\\x99\\xb1\\x06\\x60\\xc6\\x1a\\xa0\\x42\\x46\\x04\\xda\\x03\\x30\\x0c\\x1c\\x2e\\x9e\\x34\\xa3\\xec\\x6e\\x99\\xb9\\x5f\\x82\\xe2\\xb6\\x82\\xa4\\x5f\\xb2\\xa4\\x0a\\xba\\xa8\\xf9\\xdf\\x45\\x82\\x01\\xc9\\x41\\xe2\\x5f\\xbd\\xdc\\x50\\x9b\\x54\\x13\\xbf\\x5c\\xda\\xff\\x43\\x60\\x04\\xee\\x4d\\x8e\\x75\\xe9\\x2f\\xdd\\x0f\\xac\\x55\\x9a\\x3c\\x1c\\xaf\\x34\\xff\\x74\\x1d\\xf4\\x5c\\xcb\\xaf\\xae\\xa1\\xba\\xba\\xd6\\xfd\\x9f\\x97\\xd8\\x9e\\x89\\x34\\x50\\x75\\x6e\\xdb\\x69\\x91\\xde\\x8c\\x80\\x38\\x99\\xb0\\xd5\\x46\\x91\\xf4\\xa5\\xa6\\xe5\\x63\\x95\\x12\\xdc\\xe9\\xda\\xae\\x44\\x49\\xab\\xe3\\xf1\\xe7\\x24\\x38\\xa2\\x55\\x62\\xf3\\x4a\\x5f\\x91\\xbf\\x8b\\xe4\\xa2\\x3c\\x1e\\xd1\\x8b\\x8b\\xfe\\x67\\x27\\x64\\xb3\\x8d\\xe2\\x87\\x12\\x9b\\x1f\\xf1\\x06\\x75\\x0b\\xbb\\x35\\x73\\x05\\x4c\\x71\\xb3\\x4c\\xed\\xd6\\x4d\\x5a\\xd4\\x41\\x28\\x14\\x57\\xea\\x74\\x13\\x6a\\xb9\\x9e\\xa2\\x62\\x56\\xf1\\x24\\x5a\\xef\\x96\\xea\\x4b\\xae\\x1f\\x14\\xd3\\xdb\\x3e\\x37\\xc7\\xe8\\x31\\xe7\\xb0\\x42\\xa7\\x4b\\x46\\xa0\\xd6\\x18\\xf9\\x5a\\x28\\x99\\x8a\\xac\\x74\\xa5\\x53\\x91\\x29\\x5d\\x63\\x20\\xb2\\x72\\x20\\xb2\\x5a\\xd7\\x1c\\x88\\x4c\\x0d\\x44\\x76\\xef\\x5a\\xf0\\xab\\xe8\\x4f\\xfe\\x30\\xac\\x5d\\xb0\\x56\\xd1\\x2d\\x89\\xac\\x24\\xd1\\x4a\\x76\\x2b\\x60\\x6a\\xb7\\x46\\x4d\\x5a\\x8b\\xd9\\xaa\\x13\\xd2\\xe3\\x5a\\xf7\\xb6\\x9f\\x78\\x35\\xcf\\x54\\x3b\\xe9\\xed\\xde\\xf4\\xd6\\xc4\\x82\\x94\\xef\\xce\\x60\\xc3\\xd6\\x4f\\x11\\x03\\xe9\\x7e\\x72\\x28\\x34\\xd6\\x75\\x91\\x88\\x7e\\x5f\\x92\\x7e\\x1f\\x5f\\x98\\x80\\x13\\x17\\x1a\\x0b\\x3f\\x1e\\xd9\\x2d\\x52\\x63\\x4b\\xd5\\xef\\xb3\\x1b\\x5a\\x58\\x07\\x42\\xfd\\x7e\\x22\\x8f\\x47\\xae\\xf3\\x94\\xd8\\xf4\\xfb\\x5c\\x67\\x59\\x3f\\x42\\x61\\x1c\\xff\\xb4\\x6f\\x96\\xc6\\xf2\\xe7\\xca\\xab\\x78\\xb0\\xec\\x11\\x58\\xb6\\x22\\xcd\\x4b\\x67\\x1d\\x80\\x6a\\x8e\\x2f\\x4f\\x91\\x6a\\x83\\x05\\x8f\\xc0\\x3f\\x88\\xfa\\x77\\xc7\\x71\\x87\\x4b\\xb2\\x05\\x3e\\x33\\xda\\xd2\\x16\\xa7\\x9e\\xa3\\x88\\xab\\xe7\\x76\\xfd\\xd3\\x48\\xd5\\xb9\\x89\\x3a\\xfc\\xef\\xc0\\x7e\\x2d\\xca\\xfa\\xc9\\xbf\\x85\\xb2\\x86\\x67\\xa9\\x95\\xac\\x1f\\x9b\\x56\\x02\\x3e\\xe1\\xed\\x9a\\xf8\\x98\\x7f\\x10\\x95\\x3d\\x87\\x2c\\x05\\x1c\\xd6\\x5c\\x2a\\x6e\\xc4\\xd5\\x1a\\xb0\\xfd\\xd5\\x12\\xac\\x20\\xf4\\xeb\\xe4\\x50\\x50\\xe2\\x2e\\xca\\xf1\\x18\\xae\\x80\\xfe\\x1d\\x8e\\x76\\xf8\\xc2\\xcc\\x09\\x67\\xf9\\x3f\\x05\\xea\\x55\\xca\\x71\\x90\\xba\\x66\\x8f\\xc8\\xcf\\x7a\\xec\\xf7\\xab\\x6c\\x85\\x3f\\x57\\x88\\x99\\xc5\\x2c\\x47\\x73\\x2a\\xbd\\xd2\\x1f\\x7e\\x73\\xd2\\x42\\xc4\\x58\\x07\\x79\\x43\\xa1\\x63\\x8f\\xbd\\x63\\x95\\x58\\x2c\\x7a\\x27\\xba\\x28\\xe7\\x5b\\x38\\x91\\xc7\\x1a\\xd1\\x65\\x4b\\x58\\xd9\\x21\\x04\\x9c\\x36\\x9f\\x68\\x85\\xc8\\x3d\\x8b\\x9c\\x87\\x32\\xa8\\x3b\\xfa\\x14\\x76\\xee\\x8a\\x99\\xa8\\xe7\\x1f\\x81\\x9e\\x1b\\x0c\\xb0\\x82\\x28\\x34\\x8e\\x78\\x5a\\xbf\\xc0\\x22\\x80\\xa1\\x70\\x07\\x8d\\x17\\x93\\x84\\xa5\\x15\\xb9\\xba\\xc6\\xc6\\xc5\\x84\\xe7\\x09\\xc7\\xef\\x26\\x60\\xb2\\x9e\\xff\\x63\\x82\\x7f\\xa9\\x49\\x38\\x90\\x57\\xd7\\x79\\x74\\x16\\x75\\xad\\x4f\\x22\\xd7\\xe2\\x9f\\x9c\\xde\\x6f\\x8b\\xa6\\x39\\x95\\xe5\\x16\\xed\\x3b\\xec\\xca\\x02\\xce\\x05\\xf9\\x19\\xc6\\xb7\\xdd\\xc9\\x03\\x3e\\xf9\\xef\\xbd\\xd7\\xfa\\xd0\\xfe\\xf6\\x21\\x65\\xe0\\xe7\\xf5\\xdc\\xaa\\x6e\\xe7\\x6f\\x8d\\x7e\\xaf\\xfb\\x7c\\x25\\x00\\xb7\\xce\\x7d\\xbf\\x14\\xf0\\x79\\x51\\xbb\\xaf\\x4f\\x5a\\xaa\\xba\\x3f\\x0b\\x1b\\x0e\\x32\\x16\\xd2\\xb4\\x9c\\x6c\\xa1\\x4d\\x90\\xe5\\x9e\\xc6\\x85\\x20\\x4a\\x2b\\x54\\x01\\xe7\\x62\\x9f\\xee\\x13\\x05\\x18\\x2d\\xbc\\x07\\x07\\x63\\x4c\\xc1\\x9a\\x98\\x89\\xf2\\x2b\\xf6\\xde\\xf5\\xa9\\xe3\\x0d\\xd0\\x14\\xbd\\x3d\\xe0\\x00\\x1b\\x42\\x1a\\xbd\\x28\\xff\\x12\\xf4\\xc0\\x17\\x79\\xcf\\x0e\\x82\\x8b\\xaa\\x07\\x21\\xae\\x6a\\x51\\x3e\\x88\\x9a\\xab\\xd5\\x3a\\xef\\xad\\x79\\x35\\x58\\x17\\x9a\\x28\\xc5\\x2d\\x5c\\x58\\xb3\\x17\\x8c\\x55\\x6c\\x35\\xd8\\x0d\\x9b\\x27\\xb7\\x37\\x8b\\xde\\x62\\x4c\\x4c\\x6e\\x5d\\x85\\x2c\\x9c\\x69\\x34\\xee\\x30\\x0e\\x73\\x1c\\xd0\\x48\\x3c\\x7a\\xe3\\x27\\x87\\x9d\\x30\\x13\\x69\\xdf\\x5c\\x1b\\x5c\\x9d\\x5c\\x46\\x3a\\xf5\\x56\\xf5\\xf4\\xc4\\x3e\\x0a\\x69\\x1b\\x79\\x3c\\x1a\\x43\\xab\\x31\\x5f\\x26\\xbd\\xbd\\x3e\\xf0\\xbf\\xb0\\x64\\x5a\\x44\\x01\\xf2\\x7d\\x4b\\x33\\x1f\\x6d\\x59\\x97\\x45\\x46\\xd1\\x05\\xa5\\xb5\\x89\\xd9\\xdc\\x62\\xa9\\xce\\xa9\\x32\\x21\\x38\\xe4\\xb4\\xce\\xb0\\xee\\xcb\\x2f\\x66\\xbe\\x56\\x81\\xfe\\xac\\xe6\\x2e\\x1c\\xb0\\xe2\\x6b\\x16\\x12\\xa2\\x2e\\xc2\\x10\\xac\\xf7\\x76\\x97\\x67\\xe4\\xaa\\x96\\xc1\\xb7\\xb0\\x5e\\x37\\xb6\\x6d\\x87\\x26\\xb1\\xcd\\x4a\\xe4\\xce\\xa4\\x02\\xe1\\x04\\xb0\\xce\\x7d\\x89\\xf1\\x22\\x1f\\x05\\x7d\\x8c\\x7d\\x95\\x94\\xb1\\xaf\\x92\\x79\\x43\\xe5\\x89\\xaf\\x92\\x48\\x02\\x8d\\x2e\\x4b\\xd0\\x83\\x88\\x89\\x18\\x08\\x05\\x7a\\x2a\\x19\\x02\\x47\\x1f\\x24\\x15\\x9d\\x4f\\x3a\\x05\\x6a\\xeb\\x7a\\x44\\x00\\x27\\x03\\xa1\\x31\\x3a\\xe8\\x38\\x13\\xa9\\x9a\\x26\\xa9\\xa1\\x44\\x06\\xf6\\xf6\\x86\\x7e\\x76\\x59\\x91\\x9f\\x51\\xb0\\xc5\\x4a\\xc9\\x0e\\xf2\\x91\\xab\\xf9\\x2a\\xf9\\xc4\\xc4\\x12\\x65\\xe6\\x6e\\xd0\\x32\\x88\\x1f\\xde\\x73\\x57\\x98\\xbf\\x2b\\xce\\x83\\x99\\xe3\\x63\\x45\\x21\\x72\\x2f\\x86\\xf0\\xc0\\x54\\x90\\xbe\\x75\\xc4\\x10\\xfe\\x7a\\x36\\x20\\xe3\\x62\\x2e\\x32\\xae\\x19\\x8f\\x6a\\xd0\\x38\\x33\\xf3\\x37\\x86\\x1c\\xe6\\x1a\\x50\\x97\\x4a\\xdd\\xf7\\xf2\\x15\\xed\\xca\\xf6\\x40\\xb8\\xdd\\xc3\\xa8\\x2d\\xc5\\x7a\\x53\\x32\\x79\\x3c\\xe2\\xa1\\x90\\xb7\\x94\\x07\\x67\\x26\\xc6\\x59\\x0f\\x03\\x96\\xf2\\x60\\x54\\x34\\x9d\\x41\\x4d\\x13\\x3e\\xb8\\x26\\x57\\x89\\x1c\\x5c\\xbb\\xc0\\xa1\\xc3\\xe0\\x48\\x24\\xe5\\x83\\x51\\x57\\x3a\\x4f\\x0d\\x3b\\xb9\\x98\\x96\\x69\\x3a\\xa3\\x6a\\xba\\x99\\x59\\x61\\xb9\\x1c\\x5c\\x9b\\x98\\x71\\xfe\\xfc\\x80\\x8c\\x1a\\x8b\\xd4\\xb7\\x92\\x55\\x3a\\x22\\x97\\x35\\x49\\x47\\x29\\x83\\x75\\x20\\x77\\xda\\x45\\xae\\x4d\\x11\\xe0\\x24\\x65\\xb0\\xa3\\xeb\\xc1\\x1c\\x3b\\xae\\xe8\\x7c\\x5c\\xdd\\xac\\x31\\x96\\xad\\x48\\x29\\x7a\\xef\\xdf\\x81\\xb4\\xbf\\xf6\\x63\\x71\\x45\\x77\\x20\\xaf\\xe8\\xce\\xab\\x0f\\x44\\xcd\\xae\\x5c\\xaf\\x77\\x4f\\x8e\\xe7\\xb0\\xcb\\xf7\\xb0\\xcf\\xdf\\x35\\x38\\x37\\xec\\x72\\x4b\\x97\\x74\\x30\\x82\\x8a\\xde\\x8f\\xab\\x9b\\x3b\\xec\\x79\\x49\\xb3\\x3f\\x5d\\x06\\xc1\\xc1\\x7e\\x20\\xc8\\x65\\x62\\x46\\x30\\x78\\x47\\x06\\xc9\\x7e\\x60\\x06\\x46\\x2e\\x13\\x39\\x78\\x47\\x08\\x2c\\x6f\\xb7\\x26\\x86\\x12\\x2c\\x70\\xa4\\xf0\\x40\\x2b\\x32\\xb6\\xab\\xb8\\x80\\x0d\\x7d\\xf0\\x61\\xc5\\xdc\\xca\\xce\\x67\\x50\\x34\\x49\\x89\\x4b\\x5f\\x01\\xb7\\x5e\\xf3\\xc6\\x78\\x24\\x1c\\x24\\x3d\\x73\\x2a\\xac\\xb8\\xd9\\xf9\\xfd\\x03\\x1b\\x24\\x55\\xef\\x1e\\x1d\\xc2\\xc6\\x6f\\xc9\\x5a\\x1f\\x80\\x9d\\xd9\\x64\\xb8\\x47\\xb1\\x46\\xb6\\x83\\x3b\\xf4\\x7b\\x99\\xed\\x06\\xf7\\xd6\\x1f\\x1f\\x1b\\x0b\\xeb\\x5d\\x44\\x90\\x83\\xa4\\x6a\\x2a\\x66\\x68\\xc9\\xaf\\x8b\\x90\\xab\\xbb\\xcb\\x0a\\x6a\\x2a\\xb3\\xbd\\x57\\x83\\x18\\x1e\\x11\\x46\\x32\\x4a\\x69\\x49\\xea\\x9b\\xed\\x24\\xd9\\x62\\xa4\\x59\\x41\\xf2\\xfa\\x76\\xd9\\xef\\x27\\x4b\\x5a\\xc3\\x8a\\x0a\\x74\\xe9\\xbb\\xb9\\x7c\\x48\\x65\\xb6\\x23\\x57\\x69\\xba\\x31\\x37\\xd5\\x41\\x23\\x31\\x18\\xa1\\x2c\\xea\\x93\\x64\\x4e\\xfa\\xfd\\x8b\\x4f\\x92\\x15\\x09\\xef\\x9f\\x3f\\x31\\x73\\x58\\x69\\x78\\xe1\\xc9\\x20\\xfd\\x3d\\x66\\x26\\xec\\x94\\xfe\\xc7\\xfb\\xfd\\xb5\\x8d\\x4e\\x91\\x65\\x19\\x4a\\x6e\\x76\\xf9\\x43\\x43\\xa0\\x32\\x65\\xaa\\x33\\x65\\x2a\\x5b\\xa6\\x11\\xe8\\x8a\\xc4\\x14\\xb4\\x25\\x14\\xc6\\x0b\\xb6\\x1f\\x12\\x6d\\x11\\xf4\\x8a\\x82\\x3e\\x21\\x7a\\x92\\x2b\\xba\\xa0\\xa2\\x71\\x3b\\xb9\\xf6\\xbb\\xe7\\xf6\\xce\\xbe\\x8a\\x79\\x37\\x1c\\xfa\\xff\\xfd\\xb9\\x92\\xdb\\xcd\\x06\\xbd\\x46\\x3d\\x0b\\xcf\\xe8\\x33\\x0f\\x09\\x9e\\xfd\\x9f\\x4f\\x0e\\x11\\x60\\x68\\xfe\\xcf\\xff\\x25\\x0d\\x8b\\x65\\xd1\\x2b\\x0d\\x3b\\x1a\\x58\\x30\\xa9\\x6a\\xb1\\xd7\\x80\\x05\\x9f\\xc7\\x26\\x8a\\x3b\\xfd\\xad\\xe8\\xb2\\x5e\\x4e\\x1c\\x2b\\x9d\\x28\\x93\\x68\\xdc\\xd7\\xfa\\xee\\xb7\\xae\\xf2\\x55\\x51\\x3f\\x30\\x15\\x31\\xb1\\x7d\\x08\\xbd\\x0a\\xfd\\xf5\\x5f\\x5c\\x9c\\xe0\\xd0\\x04\\x2e\\x46\\x17\\x98\\x6f\\x1d\\x82\\xea\\x92\\x17\\x58\\x65\\xd2\\x13\\x35\\x7f\\xe0\\x55\\x2f\\xaf\\x08\\x06\\x8b\\xe6\\xcb\\xe4\\xe7\\xa4\\x72\\x2f\\xa8\\xb5\\x71\\xaf\\x32\\x44\\x53\\x48\\xbf\\x5f\\x59\\x67\\x5b\\xc8\\xd2\\xff\\xaa\\x14\\x85\\x0a\\xcc\\xa1\\x67\\xbf\\x26\\x82\\xd8\\x70\\x5e\\xe6\\x62\\x0b\\x82\\x61\\xef\\x92\\xde\\x40\\x3f\\x9c\\xd5\\x74\\x38\\xeb\\xf7\\x7b\\xa9\\xfb\\x6d\\xd4\\x30\\x52\\x41\\xe0\\x22\\x11\\x9a\\x24\\x3e\\x1e\\xc5\\xcd\\xf0\\x78\\x14\\x1a\\x74\\xf6\\xfb\\x82\\xe4\\x53\\x37\\x3a\\x70\\x88\\x29\\x72\\xd3\\xf0\\x6b\\xfe\\xb6\\x37\\xf3\\xb1\\xf6\\x2a\\x72\\x4b\\x87\\xfd\\x7e\\x65\\xd5\\x1a\\xbe\\x3e\\x1f\\xff\\x7c\\x47\\x55\\xb6\\x33\\x54\\xda\\x9e\\xaa\\x6c\\x6f\\x7e\\xd6\\xce\\x35\\x85\\xf9\\x71\\x4e\\x6a\\xd8\\x36\\x12\\xf0\\xbc\\x0f\\x23\\x61\\x77\\xfc\\x4c\\x3d\\x7e\\xfb\\x28\\x1a\\x05\\xbe\\x3b\\xd5\\x44\\x2a\\xf2\\xd2\\x68\\xf1\\x83\\xd5\\xd9\\x44\\xad\\xfb\\x0b\\x9e\\xdd\\xe3\\xfb\\xdc\\x96\\x2a\\x77\\x49\\x8b\\x3a\\xf0\\xb7\\x8c\\x38\\x52\\x19\\xdb\\xc8\\xb3\\xba\\xc5\\x82\\x5c\\x56\\x6d\\xdd\\x62\\x4c\\xb1\\x6a\\xe2\\x31\\x77\\xe2\\x1f\\x51\\x40\\xe5\\xc4\\x22\\x42\\x46\\x30\\xf0\\x94\\x59\\xe7\\xe4\\xd4\\x13\\x98\\xb4\\x8e\\xc0\\x50\\xd6\\xc5\\x35\\x8a\\xd2\\x76\\x57\\xd2\\xb2\\xdd\\x75\\x9a\\x8e\\x52\\x83\\xbe\\x42\\x93\\xb1\\x46\\x15\\x6d\\x82\\x9e\\xbb\\xac\\xa7\\xb0\\xba\\x9d\\x6e\\x3c\\x88\\x15\\x3b\\xf3\\x3a\\x6a\\x68\\xaa\\xcf\\xe8\\x8a\\x06\\x2e\\x2b\\x9f\\x14\\x9e\\xcb\\xca\\x27\\x75\\xfe\\x73\\xc2\\xc9\\x84\\x67\\x16\\xb3\\x76\\x4e\\x93\\x8c\\x5d\\xaa\\xa6\\x75\\x1f\\x6a\\xbe\\xc8\\x9c\\x5d\\xb7\\x7b\\xa3\\xe7\\x36\\x78\\xdf\\x59\\x6b\\x56\\x64\\xaf\\x69\\x68\\xf1\\xb5\\x48\\x0e\\x3b\\xb4\\x60\\xdd\\xa3\\xd5\\xaa\\xdd\\x19\\xf6\\x01\\x1f\\x1b\\x2b\\xd2\\x58\\xcd\\x5f\\x3a\\x1c\\x97\\x37\\x62\\x9c\\xa6\\x25\\x91\\x06\\x8a\\xbd\\xa7\\xdb\\x12\\x56\\xc1\\x29\\x90\\xd4\\xd7\\x33\\x7f\\x72\\x03\\x30\\x82\\xb3\\xdb\\x03\\x8f\\x42\\x62\\xd0\\xb5\\x2e\\x57\\x9a\\x4f\\x84\\xe7\\x0e\\x47\\x0b\\xa7\\x13\\x95\\xd8\\x98\\xe5\\xb3\\x1b\\xd7\\x75\\x49\\x65\\xc0\\x40\\x58\\x54\\xcc\\x47\\x8c\\x92\\x75\\x9c\\x53\\x11\\xf8\\x15\\x63\\x9d\\xe9\\xd3\\xd0\\x09\\xb5\\xab\\x2f\\xd2\\x44\\x18\\x72\\x6d\\x9f\\x57\\x13\\xfd\\x23\\x17\\x0d\\xc1\\x14\\x3d\\xcb\\x70\\x44\\x7f\\x08\\xbc\\x6e\\x13\\x41\\x20\\x67\\x36\\x3e\\x24\\xb7\\x2e\\x0a\\x2a\\xf4\\x70\\x80\\xb4\\xb6\\x3b\\x56\\x22\\x08\\xeb\\x6b\\xea\\x64\\xe2\\x2d\\xcd\\x89\\x18\\xed\\x9e\\xce\\xc0\\x3a\\x65\\xf8\\x09\\xc1\\x7f\\xdb\\xc1\\x8d\\x09\\xcc\\x1a\\xd4\\xb6\\x15\\x1d\\x8e\\xd5\\x8d\\x8b\\xe3\\x39\\x56\\xc1\\x70\\x5a\\xd0\\x6a\\xaa\\x90\\x78\\x08\\xc1\\x6c\\x99\\x09\\x58\\x3a\\xfe\\x46\\x20\\x64\\xe4\\xd9\\xb6\\x92\\x2b\\xbe\\x54\\x89\\x70\\xf4\\x91\\xd7\\x5f\\xe0\\x0d\\x72\\xfa\\xc7\\x36\\x98\\x13\\x97\\xfa\\xa0\\xd9\\x25\\x72\\xae\\x7d\\x1a\\x10\\xa4\\x3b\\x94\\xe2\\xcc\\x50\\x18\\x2d\\xf4\\x50\\x42\\x41\\x0b\\x73\\xc6\\xea\\x86\\x22\\x10\\xc2\\xc2\\xe8\\xdf\\xbd\\x9e\\xaa\\x99\\x89\\x2b\\x63\\xe4\\x21\\xec\\xf1\\xd9\\x2b\\x91\\x38\\xad\\x5e\\xe9\\x75\\xd5\\x0e\\x4d\\xe3\\x4c\\xcc\\xbe\\x11\\x54\\xd1\\x5b\\x43\\x57\\xa1\\x5e\\x89\\xa1\\x8f\\x2e\\x54\\x66\\x7c\\x4a\\x84\\x07\\xcf\\xd9\\xad\\x87\\x07\\x6f\\x1a\\x46\\xa5\\xe9\\x1b\\x71\\xc3\\xbd\\xa7\\xe1\\x30\\x7c\\x49\\xb9\\x46\\x72\\x0e\\xa8\\x02\\x94\\x17\\x50\\x16\\x52\\xe5\\xb5\\x61\\x30\\xa0\\xb9\\xab\\x1e\\x38\\x83\\xde\\xae\\x67\\xd4\\x65\\x90\\xd3\\x5d\\xf4\\xfb\\x35\\x21\\x7c\\x99\\x14\\xa4\\xf2\\xcb\\x5c\\x1a\\xf2\\xe3\\x19\\x12\\x69\\x26\\xaa\\x2c\\x81\\x8b\\xda\\x86\\x91\\xb5\\x49\\x59\\x96\\x55\\xd1\\x91\\x63\\x27\\x83\\x56\\x59\\x0c\\x9d\\x75\\x56\\xcb\\x57\\xe1\\xa1\\x09\\x11\\x70\\xa6\\x7c\\x86\\xee\\x93\\xfd\\x01\\x2c\\xa8\\x72\\x5a\\x4a\\x28\\xd9\\xa3\\x17\\x23\\x28\\xe9\\xc5\\xa8\\xb3\\x8b\\xf2\\xec\\x2e\\x4a\\xbd\\x39\\x15\\x2d\\xa6\\x76\\xff\\x66\\xba\\xf9\\x39\\x7e\\xb3\\x6a\\xa1\\xbf\\xf0\\xb8\\xdd\\xea\\xf7\\x5c\\xdc\\xd0\\x39\\x39\\x98\\x08\\xfd\\x15\\x94\\xf8\\x7f\\x6e\\xfd\\x3c\\x3b\\xf7\\x8f\\x66\\x41\\x6b\\xb3\\xa0\\xa5\\x5d\\xd0\\x2a\\x7a\\x11\\xb8\\x0d\\x23\\x64\\x0c\\x14\\xf0\\x66\\x5c\\x8c\\x82\\xeb\\x51\\x85\\xf7\\xf9\\x62\\x08\\x9c\\x2a\\x92\\xf3\\x73\\x17\\xea\\xb0\\xcb\\x39\\x75\\x37\\x1b\\x7f\\x34\\x54\\xe9\\x47\\x05\\x22\\x75\\x65\\x7d\\x4f\\x83\\x3f\\x15\\xaf\\xbe\\xd9\\x62\\x70\\x78\\xef\\xf0\\x53\\x65\\x27\\x8f\\xbe\\xd5\\x14\\xce\\xdc\\x39\\x36\\xaf\\x26\\x89\\xf4\\xc1\\xcf\\x18\\x42\\xe5\\xaa\\x21\\x10\\xd2\\x0a\\x97\\x66\\x80\\x8b\\xc1\\x36\\xa3\\x3a\\x1c\\x45\\x15\\xfb\\x56\\x1d\\x9d\\x56\\xe8\\x34\\xa2\\xa9\\x41\\x69\\x4d\\x26\\xdc\\x41\\x9d\\x74\\xae\\x08\\x0f\\x57\\x24\\xd2\\xe7\\x30\\xba\\x7c\\x55\\xe4\\x2d\\xa2\\x72\\xf0\\xcd\\x2f\\x76\\x25\\xdb\\xd1\\x3e\\x90\\x00\\x40\\x7c\\xcf\\x1d\\xa7\\x29\\xb3\\x01\\x7e\\xf1\\xbc\\xf1\\xe0\\x97\\x4e\\x1f\\x9e\\xb1\\xc3\\xe9\\x4c\\x6c\\xe1\\x08\\x15\\x1a\\x23\\xe7\\xea\\xe2\\xd7\\x80\\xc6\\x3d\\x33\\x24\\xa9\\x21\\x7c\\x2e\\xa4\\x43\\xee\\x10\\xc3\\x97\\xd9\\x3b\\x03\\xf1\\x42\\x59\\x17\\x2c\\x58\\xa3\\xf6\\x12\\x87\\xd4\\xb8\\x1a\\x61\\xf8\\x42\\x06\\x83\\x87\\x98\\xa9\\x6b\\x95\\x68\\x55\\xac\\x52\\x9d\\x19\\x15\\xbc\\x6c\\x67\\xd8\\xbd\\x3e\\xd9\\x2a\\xf9\\xb9\\xf4\\xf7\\xdb\\x96\\xcb\\xc8\\x0b\\x06\\xd7\\xf3\\x8c\\xb8\\x2c\\x82\\x32\\x7d\\x57\\x34\\xe4\\x50\\x33\\x1f\\x7f\\x0a\\x8d\\xb6\\x28\\xaa\\xb4\\x24\\x82\\xfe\\x5d\\x25\\x82\\x80\\xd4\\xff\\x25\\x21\\x91\\x12\\x9e\\x6a\\x29\\xe1\\xc5\\xb2\\xfe\\x42\\x9e\\x0a\\x69\\xfb\\x7d\\x36\\xa9\\x90\\x10\\x01\\xa6\\xa9\\x91\\x5c\\x4d\\xf4\\x47\\xce\\x26\\xfa\\x33\\x1f\\x86\\xda\\x75\\x1b\\x92\\x1c\\x14\\x1e\\x09\\xfb\\xee\\x8a\\xc6\\x3b\\xc2\\x0d\\x9e\\xde\\xc2\\x98\\x82\\x2a\\xbf\\x35\\xfa\\xe0\\xa8\\xa2\\x60\\x58\\xbd\\x12\\xb5\\xb8\\xda\\x96\\x98\\x28\\xd8\\x29\\xa0\\x82\\x7a\\x50\\x80\\x18\\x44\\x8c\\xfa\\x68\\x09\\xcb\\x33\\x8e\\x44\\x58\\x0b\\xba\\xa1\\x21\\xb0\\xe8\\xf7\\xfd\\x26\\x89\\x6c\\x07\\xa2\\x65\\xc4\\x32\\x8f\\x63\\x8d\\x19\\x7f\\x17\\x1c\\x0c\\x55\\x92\\x57\\xe0\\x67\\x20\\x60\\x8e\\x4c\\x5c\\x69\\x1f\\x6c\\xcb\\xde\\x7b\\x5a\\x0a\\xed\\x61\\xa6\\xf0\\x30\\x13\\x64\\x00\\x1a\\x85\\x7b\\x3c\\xac\\xfe\\xc6\\x33\\xb1\\x7c\\x56\\x45\\x11\\x6f\\x65\\xc2\\x21\\x02\\x16\\x0e\\x54\\xe8\\xe3\\x26\\xc4\\xc6\\x80\\xec\\x00\\x6c\\xc8\\xc1\\xc6\\x0c\\x3f\\x48\\xb1\\xad\\xe7\\x2c\\x57\\x61\\x0a\\xf6\\x34\\x84\\xb6\\x50\\x37\\xd3\\xb6\\xd7\\x9c\\xa8\\x31\\xd6\\xf4\\xb5\\x91\\xd2\\x47\\xa3\\x63\\x7a\\x74\\x75\\x08\\xd5\\x83\\xa3\\x93\\x1e\\x8e\\xe3\\x4f\\x1c\\x9d\\x31\\xbc\\xd1\\x84\\xec\\x63\\x85\\xda\\x78\\x35\\xe9\\x4e\\xb2\\x24\\x4f\\x0d\\xd5\\x69\\x8f\\xa2\\x5a\\x5d\\x21\\x93\\x0a\\x6a\\x4f\\x28\\x39\\x92\\x9c\\x34\\x38\\xfc\\x56\\x11\\xa4\\xa1\\x1c\\x0d\\x4f\\xf4\\xcb\\xee\\x79\\x1f\\x4d\\x62\\xf8\\x5a\\x61\\x10\\xae\\x57\\xe6\\x7a\\x2d\\x5d\\x40\\x5c\\xab\\xfd\\x19\\xcd\\xf4\\x80\\xba\\xea\\xf9\\x09\\x9b\\xbf\\xa6\\xb2\\xa1\\x87\\xa6\\xa1\\x2c\\xc8\\x9c\\x62\\xa9\\x4f\\x0d\\x78\\x57\\x0a\\x90\\x32\\x11\\x1a\\xc5\\xef\\x8a\\x8a\\x2c\\x48\\x5c\\xd0\\x8b\\x0b\\x9e\\x75\\x08\\x34\\x32\\x5e\\x4c\\x5a\\xb0\\x23\\x2f\\x8d\\x6e\\xe5\\x4a\\xcf\\xc3\\x54\\xdc\\xd2\\x8b\\x8b\\xaa\\x53\\xb1\\xb4\\x36\\x31\\x0b\\x6f\\x10\\x73\\x31\\x6c\\x08\\x2c\\xe9\\xa2\\xdf\\xdf\\x8e\\x97\\xc7\\xa3\\x6d\\x66\\x0e\\xe2\\x14\\x38\\xa1\\x4c\\x6a\\x39\\xf1\\xb2\\xad\\xbc\\x57\\x89\\xea\\x77\\x56\\x8b\\x5e\\xc7\\xaa\\xce\\x5f\\x9b\\xd5\\x09\\x5e\\x71\\x8a\\xcb\\x3b\\x14\\xd7\\x20\\xf2\\x06\\xb3\\xd5\\x54\\x9f\\x3e\\xbc\\xbf\\x26\\xdc\\x83\\xf3\\xf3\\x98\\xec\\x09\\xe7\\x9c\\x91\\x48\\x8b\\xf9\\x4c\\xd4\\x01\\xa6\\xc9\\x24\\xef\\xb2\\x1b\\x91\\x6f\\x87\\xdd\\x58\\x0a\\x5b\\x13\\x06\\xae\\xd3\\x1f\\x22\\x76\\xbf\\xa0\\x48\\x3c\\xba\\xe6\\xc5\\x33\\x5e\\x19\\xe2\\x47\\x2c\\x9f\\x7d\\x2d\\x26\\x22\\xe7\\x7a\\x23\\x2b\\xd2\\x24\\x8c\\x80\\x81\\x11\\xc2\\xc2\\x01\\x09\\x45\\xc4\\xed\\xf7\\x1a\\xac\\x50\\xd2\\x1a\\x57\\x15\\xe6\\x18\\xcb\\xbc\\x2d\\x04\\x3c\\x14\\xf7\\x7a\\xab\\x56\\x74\\x0e\\xf7\\xac\\x14\\x8f\\xf9\\x82\\xce\\x1b\\x5a\\x22\\x4c\\xd4\\xc8\\x4f\\x5b\\xe3\\xb6\\xdf\\x4f\\xfe\\xa1\\x8c\\x6c\\xf1\\x1c\\x8a\\xd2\\x05\\x59\\xa6\\x6d\\x61\\x5b\\x96\\x50\\xd4\\xac\\xc8\\x0b\\x3b\\x5c\\x6b\\x6f\\xc7\\x8d\\x9e\\xef\\xc4\\x3e\\x2a\\xb9\\xf1\\x72\\x15\\x4e\\xb3\\x01\\xcc\\x65\\xbf\\x2f\\x2f\\x28\\x15\\xfa\\xbd\\x31\\x87\\xa7\\x30\\xce\\x38\\x11\\x66\\x9e\\x74\\x6c\\x00\\xa4\\x5b\\x98\\x3a\\xc0\\xce\\xb2\\x69\\x6b\\xe4\\xfa\\x6e\\x7c\\xab\\x56\\xc4\\xff\\xfe\\x96\\xe5\\x07\\x5b\\x6e\\x7c\\x65\\xd1\\x5d\\x8f\\x95\\x5b\\x69\\xb3\\x1e\\xbc\\xbb\\x7d\\x04\\x7e\\x50\\x89\\xb2\\x12\\xa8\\x85\\x34\\x12\\x28\\xbd\\x81\\xac\\xee\\x41\\xb1\\x54\\xac\\xb6\\xa7\\xcd\\x8a\\x94\\xba\\xa7\\x3f\\xe9\\x08\\x8a\\x62\\xa5\\x65\\x10\\x2e\\xfc\\xad\\x0b\\x9e\\x82\\x2c\\x6f\\x3a\\x1c\\x17\\x18\\xdf\\xa3\\x20\\xf2\\xf4\\xb4\\x17\\x04\\x39\\xa1\\xce\\x95\\x58\\x69\\xd0\\xd0\\xba\\xdf\\xaf\\x83\\x33\\xe0\\x3a\\x3e\\xa8\\xaf\\xf4\\x3e\\x95\\xf4\\x60\\xf1\\x9f\\xfc\\xcc\\x0d\\x29\\x9c\\x27\\xbc\\xc2\\xdc\\xc9\\x6f\\x45\\x52\\x63\\x84\\x1f\\x30\\x57\\x55\\x99\\xd5\\x90\\xb1\\x07\\xbf\\x13\\x79\\x94\\x5b\\x39\\xe7\\x71\\x0d\\xd7\\xbb\\x46\\x9c\\xf3\\x13\\xb3\\x60\\xb4\\x04\\xe1\\xe8\\x93\\x93\\xa9\\x96\\x54\\x4c\\x8b\\x19\\x94\\xfd\\x3e\\x62\\x7c\\x25\\xde\\x12\\xf4\\xd1\\xa9\\x7f\\xd0\\x4a\\xa2\\xc1\\x3c\\xcf\\xf4\\x1e\\x17\\x0f\\x85\\x62\\x84\\x38\\xa1\\xde\\x17\\x5e\\x79\\x3c\\xac\\x7b\\x2f\\x64\\x19\\x23\\x96\\x45\\x5d\\x3c\\xbe\\xe1\\x6b\\x8c\\x8d\\xfb\\x01\\x32\\x18\\x69\\x1b\\x8f\\xae\\x78\\x1a\\x86\\xd1\\xe0\\xc5\\x78\\xcc\\x4c\\x90\\xdf\\x08\\x2e\\x09\\x8d\\xd8\\xda\\x99\\x8e\\x35\\xfe\\xcd\\x11\\xb9\\x38\\xeb\\xb4\\x58\\xa2\\x09\\xb8\\x86\\x95\\x18\\x62\\x9b\\x83\\x24\\xa4\\xf1\\xd3\\xb1\\x47\\x25\\x9e\\x96\\x86\\x55\\xa7\\xb9\\xbd\\x8b\\x78\\x66\\x6d\\xa1\\xdf\\x1f\\xa0\\xf6\\x19\\xad\\xde\\x37\\xb1\\xaa\\x33\\xb1\\x68\\xd8\\xb1\\xcf\\xe5\\xee\\xf8\\xcf\\xed\\x0a\\xcb\\xd6\\x4c\\x15\\xbe\\xb1\\xca\\x6e\\x76\\x65\\x37\\xbb\\x77\\xd2\\x40\\x7b\\xef\\xa2\\xbe\\xab\\x76\\xdf\\x91\\x20\\xd8\\x1f\\x90\\xfc\\x62\\x08\\xae\\x66\\x7e\\xa6\\xe9\\xc6\\x51\\xb4\\x5b\\x89\\x51\\xff\\x08\\xbd\\xd5\\x34\\xca\\xe1\\x5e\\xec\\xfe\\x6a\\x14\\x5b\\x39\\x65\\x70\\x2f\\x76\\xd6\\xb1\\x24\\x65\\xfa\\x8d\\xf2\\xc2\\xae\\xad\\x64\\xdf\\x7b\\x65\\x80\\x28\\x02\\x10\\x6a\\xaa\\xb2\\x20\\x2f\\x40\\xcd\\x53\\xa6\\x51\\xf1\\xd0\\x14\\x44\\x7d\\x00\\x57\\x6c\\x6d\\x3f\\x22\\xf5\\x64\\x4e\\x42\\x80\\x0b\\xf9\\xb1\\x3a\\x3e\\x77\\xc5\\x62\\x11\\x59\\x8c\\x19\\xef\\x9f\\x7f\\xe5\\xea\\x73\\xb1\\x63\\xc8\\x36\\x32\\xa5\\x50\\x81\\x89\\x2d\\x5e\\x2a\\xb6\\x36\\xe0\\x03\\x93\\x5d\\xe8\\x9a\\xd7\\x62\\xc1\\x7c\\x13\\xb8\\xc6\\xde\\x63\\x73\\x4b\\x91\\x28\\xb0\\xf0\\x4d\\x49\\xb5\\xa3\\x66\\x6f\\xa2\\xbe\\x75\\x17\\x1d\\x5f\\x25\\xa2\\xdc\\xae\\xab\\x9f\\xf8\\xef\\xac\\x9d\\xee\\x35\\xa0\\xdb\\xc9\\xeb\\xc2\\x2e\\x54\\x37\\xf5\\xef\\x27\\x2a\\x49\\xaa\\x63\\x7e\\x67\\x1e\\x8f\\x76\\x27\\x6c\\xd9\\x6e\\xa8\\x3e\\x69\\x7a\\x75\\xda\\xdb\\xa9\\xf6\\xd3\\xdd\\x1a\\x1d\\x4b\\x74\\xf4\\xff\\x2d\\x63\\xb3\\x5d\\xf7\\xb4\\x39\\x4d\\x2c\\xeb\\xf9\\x77\\xdd\\x71\\x9f\\x6a\\xfb\\x8f\\xab\\x30\\x53\\x05\\x55\\xb4\\x18\\x0c\\xaa\\x30\\x08\\x0e\\x55\\xa6\\x0f\\x35\\x5f\\x1b\\xd2\\x5c\\x22\\xff\\xf7\\x7e\\xcb\\xcb\\x85\\x63\\x49\\x83\\xbe\\x62\\x2a\\x21\\x4d\\xa7\\x5c\\x4b\\x4d\\x7c\\xac\\x3a\\x3c\\xcc\\x49\\x62\\xd5\\x1d\\xa8\\xf2\\x03\\xd1\\x94\\x86\\x5e\\xc5\\xa1\\x7e\\x60\\x71\\x2c\\xb6\\x0c\\xba\\x2c\\xb2\\xab\\xa7\\xc2\\x50\\x41\\xe1\\xc6\\xe8\\xe2\\x76\\x43\\x5c\\x29\\xd2\\xb4\\x86\\x78\\xea\\x25\\xdc\\x47\\x30\\xb3\\x81\\xce\\xac\\x0d\\x37\\xa7\\x3f\\x20\\x3b\\x39\\xf6\\x64\\x0b\\x53\\x7b\\x44\\x67\\xa0\\x08\\xba\\xba\\x47\\xa1\\x92\\x62\\x35\\xde\\x4c\\x6e\\x3f\\x92\\x84\\xd3\\x5b\\x97\\x93\\x78\\xf8\\x85\\xaf\\x29\\x21\\x44\\x93\\xf5\\x52\\xd4\\xca\\xd6\\xd1\\x3f\\x93\\x04\\x89\\x45\\x5d\\x0b\\x3f\\x79\\x80\\x3c\\xa1\\x56\\x18\\xaa\\xc5\\xb1\\xfb\\x7d\\xee\\x7e\\x1a\\xa3\\xeb\\xe8\\x32\\xf0\\x06\\x77\\xa2\\x3d\\x5d\\xef\\x58\\x8a\\xc1\\x5c\\xed\\x0c\\x77\\xdb\\x90\\x72\\xd6\\xff\\x6a\\xac\\x92\\x12\\xed\\x8a\\x5d\\xef\\x21\\x89\\xa2\\xb2\\x99\\xe5\\x02\\x41\\xbf\\x62\\x49\\x95\\x2d\\x45\\x85\\xfa\\xcd\\x02\\x9d\\xf4\\x23\\xa7\\xce\\x79\\x65\\x7e\\xc3\\x55\\xc9\\xcc\\x2e\\x25\\x31\\x78\\xaa\\x63\\x90\\x54\\x36\\x74\\xab\\x09\\x2a\\x19\\x0c\\xe7\\x38\\x36\\xaa\\x5b\\x54\\x35\\xaf\\x1e\\xe0\\xf4\\xd8\\xcc\\xe3\\x03\\xa3\\xc7\\x79\\xb7\\xe4\\xea\\x47\\xf1\\x28\\x93\\x02\\x24\\x06\\x55\\x4d\\x47\\x43\\x92\\x27\\xab\\xd6\\x49\\x99\\xdb\\x82\\x2f\\x44\\xd9\\x2e\\x08\\x6e\\xc2\\x91\\x44\\x96\\xf9\\x0e\\x8e\\xc7\\xd0\\x99\\x2e\\x6a\\xd7\\xc4\\x97\\x5d\\x99\\xb2\\xa6\\x13\\x5b\\xf8\\xaf\\xf6\\x04\\xfa\\x71\\x9d\\xb7\\x3d\\x3b\\xe8\\xcd\\x90\\xe0\\x5a\\xcf\\x43\\xac\\x11\\xef\\x51\\x79\\x53\\x2c\\x16\\xbc\\x7a\\xc8\\xeb\\xa6\\x69\\xa8\\xb0\\x01\\x55\\xba\\x60\\x77\\xae\\x53\\x03\\x80\\x9b\\x0e\\x67\\x68\\xb2\\x60\\x1c\\x66\\x2d\\xa8\\x1a\\xcb\\x4c\\xb1\\x9d\\x42\\x7b\\x75\\x6a\\x6d\\x03\\x4c\\xd2\\xe7\\x85\\x64\\xba\\x26\\xed\\xad\\xf9\\x62\\x51\\xb2\\x1e\\x56\\xd9\\xd2\\xc1\\x08\\x96\\x74\\xe0\\xed\\x37\\x45\\x7c\\xc4\\x22\\x65\\x24\\x15\\x29\\x23\\x3d\\x7b\\xa0\\x3c\\x65\\x57\\xd7\\xa9\\xcc\\xd6\\xac\\x90\\xdb\\x9a\\xbd\\x61\\x3b\\x95\\x28\\xec\\x87\\x58\\xbd\\x26\\x74\\x6f\\x23\\x8e\\xc7\\xf9\\x74\\x1e\\xe2\\x3b\\xa4\\x0f\\xe9\\xf5\\x65\\x7d\\x5b\\x90\\x7e\\x3f\\x59\\xa4\\x74\\x05\\x51\\x6e\\x22\\x6e\\x87\\x93\\x61\\x3e\\x22\\x33\\x3a\\x84\\xa5\\xce\\xdc\\xa6\\x29\\x81\\x72\\x2a\\x66\\xd4\\xd8\\x56\\x0c\\xd1\\xb6\\x62\\x09\\xb5\\x78\\xcc\\xb7\\xd6\\x76\\xe4\\xc1\\xd9\\x8e\\x54\\x0d\\xb4\\xbb\\xa2\\x0f\\x69\\xdd\\x10\\x02\\x8b\\xc6\\x1f\\x85\\x0f\\xed\\x8d\\x3d\\xa9\\xff\\xce\\xe6\\xc4\\xaf\\xd2\\x54\\x6f\\x4e\\x31\\x50\\x76\\x73\\x6a\\xd8\\xa2\\x8b\\x84\\xa1\\x53\\x6c\\x80\\x75\\xf0\\x9a\\xfe\\x51\\xeb\\x5e\\x7c\\xc4\\xba\\xa3\\x16\\xc0\\x32\\x65\\xb8\\xd0\\x2b\\xb3\\xce\\xdb\\xb4\\x86\\xb9\\x65\\x8a\\x98\\x65\\xdb\\xba\\x65\\x5b\\x36\\x04\\x1e\\x4c\\x89\\x75\\x9a\\x7a\\xe5\\x80\\xa1\\x0f\\x7e\\xac\\x91\\x88\\x2d\\x14\\x44\\x6f\\x09\\x4b\\xeb\\x78\\x3f\\x1e\\x70\\x3f\\x36\\x9a\\x7a\\xca\\xd7\\x76\\x3f\\x8a\\x68\\x3f\\x36\\xa9\\x3e\\x9a\\xb8\\x07\\x29\\xdd\\xbe\\x6f\\x04\\x8b\\xa6\\x58\\xfc\\x73\\x2b\\x95\\x5b\\xcd\\xee\\x7b\\x82\\x91\\x17\\x3d\\x6c\\x6c\\x43\\xb2\\x71\\xa4\\x65\\x78\\x1e\\x1e\\xb5\\x77\\x2a\\x66\\x41\\x17\\xe8\\xd7\\xa1\\x82\\xee\\x36\\x4b\\xbd\\xcd\\x08\\x38\\x8d\\x43\\xb3\\x16\\x54\\x32\\x0c\\xe8\\x82\\x0e\\x35\\x3d\\x9e\\x54\\xf6\\x1d\\x4b\\xa5\\x7b\\xc7\\x06\\x91\\x15\\x96\\x9c\\x16\\xb3\\x98\\x43\\x55\\x3e\\x13\\xcb\\x67\\x9c\\x14\\x48\\x98\\xd4\\xe2\\xb1\\xdf\\x4f\\x0a\\xf3\\xeb\\x63\\x1b\\x23\\x50\\xa2\\xad\\x00\\xc5\\xe7\\x30\\x65\\xa9\\x84\\xd2\\x3c\\xa4\\x35\\xd4\\x29\\x2d\\xcd\\x31\\x48\\x65\\x83\\xea\\x29\\xdd\\x91\\xba\\x2a\\xee\\x0d\\x1d\\xa8\\xf8\\xc4\\x4e\\x8b\\x99\\x7b\\x52\\x4f\\xc7\\x5c\\xea\\x92\\x17\\x94\\x16\\x76\\xcc\\x73\\x51\\xfe\\xf1\\x66\\xed\\xe8\\x69\\x6d\\x07\\x9d\\x52\\x3f\\x61\\x1c\\xbc\\x29\\x96\\xca\\xa6\\x69\\xaf\\xb9\\x53\\xdd\\x55\\x62\\x83\\x1c\\xea\\xd8\\x08\\xde\\xa1\\x4b\\xc7\\xa3\\x33\\x76\\x7a\\xaa\\x84\\x8b\\x0b\\xd3\\x3d\\x5b\\xa7\\x47\\x2b\\x52\\x2f\\x99\\xab\\xdd\\xf8\\x1f\\x2a\\x61\\x80\\x2c\\xfa\\x3b\\xd3\\x84\\x26\\xe6\\x19\\x69\\x9a\\xbb\\x33\\x2d\\xb6\\xde\\xe0\\xb0\\x0a\\x96\\x41\\x65\\x76\\x32\\xaf\\xf0\\x79\\x2e\\x50\\x47\\xd1\\x9c\\xc2\\xda\\x9d\\xc2\\xb2\\xa1\\x0c\\xe6\\x74\\x87\\x6b\\x28\\x6a\\x58\\xd1\\x5d\\x95\\xb0\\xac\\x56\\xa5\\x3d\\x1d\\xee\\x15\\x23\\xb0\\xd0\\x4f\\x73\\x69\\x9f\\xe6\\x83\\xe1\\x62\\x6c\\xc1\\x9d\\xe2\\x65\\x43\\x4b\\x78\\xa0\\x0b\\xf3\\x60\\x6f\\xe8\\xc3\\xd5\\x35\\x82\\xa2\\xf5\\x58\\x59\\x4a\\x48\\x95\\x1a\\xad\\x28\\xa2\\x37\\x63\\x15\\x7e\\x27\\xe6\\xfd\\x70\\xf9\\x27\\x0f\\x08\\x14\\x91\\xb5\\x61\\xf6\\x27\\x28\\xcc\\x6b\\xbe\\xb0\\xaf\\xb9\\xd5\\xc6\\xf4\\xc8\\xc0\\x2e\\xa2\\x55\\xee\\x63\\xc4\\xe0\\x0e\\x11\\x83\\x12\\x1e\\x08\\xec\\x69\\x17\\x05\\x80\\x77\\xce\\x13\\xfb\\x99\\xab\\x3d\\x5e\\xd3\\xfd\\xe4\\xb0\\xcb\\x45\\x52\\xbb\\x8b\\xb3\\xf4\\x17\\xa7\\x9a\\x0e\\x67\\x04\\xf6\\xb9\\x39\\x9d\\xcb\\xf4\\x9d\\x61\\x24\\x0c\\x9b\\xfc\\xb0\\xcb\\x7d\\xe9\\xbd\\xad\\xac\\xcb\\xbc\\xc3\\xda\\x2e\\x2c\\xcc\\x74\\xe8\\x4f\\xad\\xab\\x09\\xf7\\x95\\xa5\\x1a\\x19\\x2e\\xc9\\x17\\xbc\\x66\\xc8\\x2e\\x73\\x58\\xd3\\x23\\xbd\\x4b\\x97\\x63\\xf5\\x04\\x2c\\x67\\xf0\\x5a\\xc3\\xf2\\xa2\\x65\\xc0\\xc9\\x70\\xd5\\x90\\x6d\\x77\\x3c\\x6e\\xf5\\x22\\x46\\xca\\xfd\\x71\\x96\\xed\\xe2\\x2d\\x2d\\x5a\\xd0\\x9f\\xc5\\xd0\\x1f\\x7e\\x6a\\x6d\\x20\\x0b\\xbf\\xd1\\x11\\x5a\\xd8\\xe6\\x32\\xfc\\x26\\x04\\xbe\\xa7\\xbb\\xf4\\xe1\\xea\\x3a\\x7d\\x8b\\xc7\\xe3\\x0b\\xba\\xce\\x76\\xf0\\x82\\xae\\xb3\\xfd\\x78\\xa5\\xe9\\x01\\x1b\\xc5\\xd7\\x1d\\xba\\xfd\\xe4\\xb5\\x7e\\x63\\xbe\\x48\\xbf\\x4f\\x97\\xb7\\x76\\xb5\\xfb\\xfd\\x04\\x2b\\xa4\\xf4\\x11\\xd6\\x78\\x2c\\xd2\\x14\\xb0\\x21\\xfa\\xc4\\xe6\\x98\\x52\\x33\\x42\\x72\\x6c\\xed\\x45\\xfa\\x78\\xeb\\xd6\\xbe\\xdf\\x4f\\x4c\\xd5\\x2f\\x52\\xee\\xca\\x59\\xb0\\xb6\\x0c\\xad\\x63\\x7f\\xf4\\xc9\\xdd\\x73\\xf5\\x1c\\xe0\\x19\\x5f\\x74\\x45\\x29\\x7c\\x99\\x84\\xd0\\x5e\\xbb\\x1b\\x3a\\x8c\\x03\\x7c\\xdd\\xdf\\x0c\\xdd\\xfb\\x52\\x58\\x6e\\xa2\\xc7\\x8c\\xbf\\xb5\\x1c\\x19\\x83\\x95\\x8e\\x90\\x01\\x1c\\xef\\x9b\\xce\\xf7\\x5f\\x30\\x27\\xf6\\xa2\\x38\\xa7\\x70\\xf6\\x37\\x18\\x83\\x7b\\x97\\xdb\\xf1\\xeb\\xd6\\x4e\\xc2\\x70\\x44\\x6d\\x27\\x6e\\xee\\x03\\xac\\xfd\\x3d\\x69\\x5d\\xc7\\x0a\\x8a\\x13\\xb7\\x6c\\xd1\\xb7\\x19\\x54\\xd7\\xf5\\x9c\\xeb\\x13\\xa6\\xe6\\x99\\x69\\x31\\x26\\x02\\xd2\\x74\\xb0\\x5a\\x3c\\x3b\\xa3\\x50\\xfa\\xd3\\x0f\\x3f\\xbe\\xb9\\xbe\\xba\\x8e\\x0d\\x1a\\xac\\x03\\x0f\\xd3\\x95\\xb7\\x5c\\xe2\\x99\\xfb\\xd9\\xb2\\x97\\xa8\\x1a\\x90\\x74\\x95\\xed\\xbe\\x2f\\xb7\\x1a\\x43\\xdb\\x5d\\x5d\\x93\\xf1\\xb7\\x2a\\x29\\x8c\\x0e\\x58\\xba\\x21\\x4d\\xa4\\x68\\x29\\xa8\\x55\\xdd\\xd2\\x68\\x49\\xf2\\x30\\xb8\\x27\\x26\\x56\\x93\\x6e\\x41\\x1f\\xb1\\xaf\\x44\\xfd\\x4a\\xd5\\xba\\x19\\x02\\x35\\x7d\\xc9\\xbc\\x37\\x3a\\x63\\x78\\x41\\xc6\\x45\\x4b\\x0e\\x68\\x35\\xa8\\x51\\x4d\\x47\\x26\\x35\\xc9\\xa4\\x58\\x33\\x14\\xa8\\x0f\\x31\\x40\\x02\\x99\\x70\\x96\\x14\\x70\\x30\\x6e\\xc5\\x05\\x3c\\xe6\\x3b\\x58\\xe5\\xde\\x18\\xaf\\x6e\\x48\\x5e\\x18\\x51\\xa2\\x04\\x01\\x3b\\xb8\\x27\\xf6\\x02\\x27\\x04\\x86\\x46\\xdc\\x5c\\x04\\x6f\\x42\\x45\\xcc\\x48\\x5e\\x65\\xbb\\xe4\\x0b\\x02\\x2f\\x80\\x11\\xf8\\x82\\xca\\xe4\\x27\\xf8\\x22\\xdd\\xa5\\x1b\\x77\\x43\\xda\\xac\\x78\\x7d\\x5c\\x99\\x1e\\x09\\xc7\\x7b\\x0b\\x0a\\x58\\x7a\\x77\\x75\\x0d\\x0b\\x38\\x68\\x60\\xfb\\x96\\xa9\\x55\\x2d\\xb6\\x0f\\xab\\x9c\\x5b\\xa5\\x12\\xf0\\xd7\\x3b\\xe7\\xe1\\xaa\\x37\\x9d\\x7e\\xf7\\x93\\x75\\xb6\\x4b\\xe9\\xf7\\xe9\\x32\\x37\\x77\\x57\\xe3\\x6a\\x77\\x4f\\xc1\\xb8\\x26\\x7a\\x33\\x9e\\xa4\\xb1\\x51\\x0b\\x13\\x7d\\xde\\x83\\xd4\\x8f\\x13\\xb7\\x8f\\x53\\x41\\x7f\\xd7\\x1f\\xf6\\x69\\x32\\xe2\\x45\\x7e\\x1e\\x93\\xab\\x9f\\x7e\\xef\\x4a\\xcb\\x18\\x9a\\xa3\\x8f\\x18\\xf3\\xa8\\xc3\\x8a\\x4a\\x7c\\xe1\\xf4\\x7a\\x18\\xbb\\xbe\\xd4\\x18\\x05\\x6c\\x61\\x69\\xd1\\x0b\\x78\\xf0\\xf6\\x16\\x4f\\xe0\\x74\\x0f\\x01\\xdb\\xcd\\xb2\\x2c\\x46\\xba\\x34\\x26\\x6c\\x20\\xcc\\x02\\x96\\x54\\x24\\x2c\\xc3\\xf7\\x1a\\x02\\x30\\x7b\\x20\\x6d\\x5d\\xe0\\x16\\xf2\\x93\\xd5\\x6c\\xb1\\x9d\\x33\\x44\\xe5\\x19\\xa1\\xb7\\xbe\\x1b\\x05\\x2c\\x60\\x45\\x43\\x32\\xde\\xd2\\x45\\x1a\\x5a\\xc7\\x1e\\x23\\x78\\x36\\xf0\\x51\\x72\\xec\\x12\\x0e\\x9e\\x40\\x77\\x9d\\xda\\xd1\\x86\\x8a\\x64\\x0e\\x4b\\x58\\xa6\\x0f\\x64\\x1c\\x81\\x7b\\x5a\\x47\\x0f\\x44\\x95\\xcc\\x0d\\x4a\\x76\\xf6\\x7d\\x2f\\x3b\\x9e\\x06\\x0c\\x3a\\x52\\xb6\\x3c\\x09\\xf8\\x34\\xfd\\xf4\\x4b\\x47\\xc8\\x33\\x96\\x94\\xee\\xac\\x6e\\x60\\x0b\\x92\\x34\\x67\\x07\\x7b\\xd6\\xb9\\x80\\x3d\\x3e\\x4c\\x1f\\x1f\\x65\\x8f\\x0f\\xa7\\x18\\x17\\xd0\\x1f\\x1f\\xcf\\x3c\\xb5\\x27\\x68\\xc2\\x70\\xc7\\x4c\\xbb\\x29\\xb7\\x0b\\x9b\\x0f\\x31\\x66\\xf7\\x2b\\xff\\x1a\\x3f\\x57\\xa7\\x3e\\x88\\x9c\\xf2\\x1f\\x18\\x54\\xf0\\x96\\x72\\x6b\\x36\\xaa\\x6e\\x28\\x77\\xaf\\x1b\\xd3\\xc9\\x68\\x31\\xca\\x6e\\xa8\\xd3\\x2f\\xc3\\xe0\\xf4\\x12\\xcb\\xc7\\x04\\x06\\x54\\x74\\x38\\xae\\x82\\x8e\\x52\\x9a\\x56\\x84\\x2f\\x13\\x41\\xe5\\xb4\\x9a\\x81\\xba\\xa5\\x22\\x74\\x20\\x9c\\x11\\xf0\\xa3\\xf1\\x36\\xc3\\x74\\xae\\xeb\\x47\\x58\\xa3\\x60\\x7b\\x4a\\x9c\\x6c\\x32\\xc6\\x2e\\xa6\\x95\\xd7\\x0c\\x42\\x81\\xe4\\xaa\\xa8\\x16\\x25\\xfb\\xf2\\x1d\\x8b\\x4c\\xee\\x9e\\xf0\\xd3\\x75\\x71\\xe2\\x9d\\xb5\\xb7\\x16\\x5b\\xc9\\xd6\\xe2\\x9d\\xd7\\x02\\x61\\x99\\xa8\\xfe\\x2a\\xde\\xb1\\x1a\\xfd\\xd0\\x56\\xaf\\x58\\xf1\\x8e\\x79\\x5d\\x67\\xeb\\x1f\\xd7\\x46\\x3a\\xea\\xf7\\x93\\xde\\x5c\\xff\\xc0\\xba\\xe8\\x4c\\x69\\x2b\\xd9\\xd6\\xa0\\xeb\\x51\\x1d\\xaf\\x19\\x93\\x18\\x4d\\x38\\xf0\\x62\\xda\\x88\\xf3\\x74\\xba\\x6b\\xd9\\x0e\\x54\\xb6\\x37\\xb2\\xd6\\xf6\\x30\\x8d\\x79\\x91\\xa7\\x90\\x59\\x8b\\x2b\\x0d\\x35\\xda\\x7f\\x82\\xd5\\x66\\x4a\\x04\\x2d\\x88\\x57\\xeb\\x96\\xfd\\xbe\\x57\\x2c\\x7c\\x69\\x55\\x10\\x65\\x2b\\x41\\x17\\xe0\\x3e\\xc7\\x44\\x69\\x1a\\x17\\xfd\\xfe\\x45\\xdd\\xef\\xff\\x90\\x70\\xb7\\x24\\x30\\x55\\x50\\x00\\x9b\\x19\\x47\\xe4\\x6d\\xae\\x38\\x54\\x71\\x71\\x5c\\x4c\\x5d\\xbc\\x32\\xc5\\xf1\\x6d\\x7b\\x56\\xb9\\x6c\\x5c\\xc9\\x28\\x7b\\x6c\\x3d\\x30\\x34\\x28\\x35\\x7c\\xb0\\x52\\x43\\xb3\\xff\\x3d\\xb8\\xb3\\x61\\x54\\xf2\\xa5\\x55\\x7f\\x39\\x55\\x12\\x31\\x45\\xd1\\x69\\xdf\\x52\\x26\\xc8\\xe9\\x30\\x10\\xd4\\xfb\\x9f\\x77\\x92\\xb9\\x86\\x8c\\xbf\\x66\\x99\\x33\\x19\\x62\\x28\\x37\\xe5\\x04\\xbe\\x66\\x59\\xb1\\x58\\x7c\\x2e\\x76\\x68\\xcd\\xda\\x80\\x54\\x62\\xa3\\x4f\\xd6\\xd7\\x2c\\xab\\x71\\x0f\\x4c\\x96\\xeb\\x89\\x04\\x7b\\x3e\\x93\\xe0\\x64\\x39\\xe7\\x85\\x9a\\xae\\xd4\\xd9\\xae\\x2b\\x2f\\x20\\xe0\\x8d\\x91\\x90\\xfe\\x7c\\x1a\\x21\\xc9\\x35\\xc0\\x3a\\x6c\\x6a\\x3d\\xec\\x36\\x47\\xc1\\xb6\\x61\\xef\\x86\\x3e\\xf2\\x7a\\x0a\\x1a\\x78\\x1c\\x8f\\xae\\x99\\x2c\\xbe\\x3f\\x2c\\x63\\xfa\\x7f\\x4b\\x26\\xe4\\x83\\x58\\x0d\\xc1\\xbd\\x3f\\xb9\\xf1\\xac\\x51\\xb4\\x5d\\x44\\x3a\\xde\\x7c\\x1e\\x39\\x10\\xbd\\x18\\x81\\xe1\\xe2\\xe7\\x23\\xf6\\x69\\x37\\x42\\x58\\x38\\xfc\\xf1\\x01\\xc4\\x08\\x4f\\xb8\\x43\\x63\\x71\\x2a\\x6e\\xad\\xc8\\x24\\x11\\xfa\\xc5\\xd7\\x3f\\xf5\\x73\\x82\\x6f\\x3f\\xbd\\x18\\x92\\x3c\\x11\\x18\\xa8\\xa9\\x9d\\x3e\\x22\\x0d\\xd8\\x33\\x68\\x74\\x65\\xed\\xf9\\x35\\x1f\\x8e\\x09\\x62\\xc8\\xc8\\x28\\xa2\\x98\\x83\\xcb\\x06\\xd6\\x7b\\x82\\xee\\xb3\\xa1\\xa7\\x34\\x47\\x43\\xf8\\x50\\x40\\x38\\x2f\\xb8\\x06\\xcf\\x54\\x6b\\xe1\\x97\\x39\\x8f\\x31\\xc8\\x18\\x81\\xf1\\x9a\\x51\\x4d\\xe3\\xf7\\xdb\\x03\\xb2\\x10\\xff\\xda\\xcb\\x28\\xdb\\xc2\\x49\\x13\\x55\\x4e\\x45\\x3c\\x34\\x75\\x3e\\x7e\\xdc\\x64\\x68\\x0d\\x71\\x35\\xe6\\xf8\\x3b\\x4b\\x8a\\x96\\x9b\\xe3\\x76\\x70\\xb9\\xa9\\x0d\\xd7\\x39\\x33\\x8f\\x72\\x14\\x6b\\xae\\x38\\xd1\\xc5\\xf0\\x34\\x5c\\x2e\\xa3\\x28\\x72\\x56\\x88\\x0e\\x96\\x18\\xc8\\x8b\\xae\\xaf\\x68\\x87\\x8c\\xfb\\x1c\\xc4\\xcc\\xdb\\x64\\x41\\x2b\\xcf\\x52\\x0a\\x8e\\x2e\\xf0\\x79\\xc1\\xcf\\x73\\x88\\x6d\\x97\\xd4\\x96\\x9e\\xaa\\xdd\\xe3\\x72\\xf5\\x59\\x2b\\x28\\x5e\\xd1\\xb2\\x4c\\x8f\\x37\\xe6\\x78\\x2c\\xce\\x62\\xf7\\x45\\xc0\\xee\\xa3\\xad\\xd3\\xa5\\xfd\\x67\\xd7\\x30\\x3a\\x3e\\xe8\\xb9\\x5d\\xd1\\xa6\\x31\\x12\\x48\\x8c\\x7d\\x87\\xa1\\x93\\x3e\\x74\\x1e\\x43\\x5c\\xb9\\xe8\\x4a\\xba\\x6b\\x88\\xdb\\xd5\\xeb\\x35\\x68\\x69\\xe4\\x1c\\x7c\\xe5\\x2d\\x07\\x5f\\x8a\\xde\\x5e\\x58\\xd5\\x35\\xf9\\x77\\xae\\x56\\x49\\x4f\\x54\\x3d\\xe2\\x6f\\x43\\xb7\\xe8\\xb4\\xd7\\x3e\\xe9\\x3d\\xe8\\x19\\x29\\x50\\x0f\\x7a\\x52\\xd4\\x0a\\xad\\x6c\\x30\\xfe\\xb6\\x44\\x7b\\x26\\x1f\\xdc\\xee\\xa3\\x65\\xaf\\xff\\x65\\x49\\xe9\\x9d\\xbd\\x8e\\xff\\x03\\xc2\\xcc\\x0f\\xfa\\x6d\\xf8\\xef\\x91\\x5b\\x3e\\xed\\x1d\\x52\\x3f\\xfc\\xdc\\x09\\x0c\\xb9\\x95\\x04\\x5e\\x54\\x67\\xa5\\x5a\\xdc\\x0e\\xd7\\xa1\\x81\\x0e\\x8d\\xf3\\x88\\x1b\\x1d\\x92\\x71\\x28\\x64\\x85\\x8f\\x10\\x15\\xb7\\xc5\\x98\\x57\\xdf\\xfa\\x2d\\xa9\\x0c\\x9f\\x65\\x62\\xfe\\x5b\\xdc\\x2e\\x1f\\x8d\\x79\\x58\\xf6\\xdf\\x59\\x52\\x05\\x14\\xd5\\x5b\\xba\\x5e\\x06\\xf1\\x59\\x1b\\x49\\x75\\x15\\x6d\\xbf\\x63\\xde\\x15\\x7f\\xf9\\x11\\xc9\\xdc\\x0d\\x57\\x76\\x19\\xa3\\x67\\x31\\x68\\xb7\\x13\\xe3\\x0e\\xdb\\xb4\\xcd\\x22\\x35\\xdc\\xcb\\xe7\\xf5\\x43\\x00\\xd7\\xa8\\x74\\xcb\\x00\\xd9\\xfb\\xdc\\xe9\\xde\\x56\\xd6\\x9b\\x55\\x30\\x6f\\xb0\\xa1\\x20\\xa0\\xa6\\x85\\xa1\\x57\\x82\\xb5\\x11\\x2c\\x82\\x50\\xe3\\x0c\\xa1\\x85\\x91\\xb4\\x30\\xce\\xba\\x24\\xb0\\xa2\\x2c\\x55\\x50\\x52\\x39\\xe0\\x24\\xb7\\xec\\x46\\x4a\\x69\\xe1\\xc7\\xaf\\x4b\\xf3\\x54\\xc1\\x0a\\xeb\\x54\\x1a\\xbf\\x5a\\x50\\x13\\x5d\\x98\\xe4\\xc9\\x9c\\xca\\x81\\xcb\\x43\\xb7\\x4f\\x0b\\x6a\\xb2\\xa0\\xa4\\xd5\\x80\\x11\\x30\\xc1\\xd7\\x7e\\xcd\\xe7\\x06\\x94\\xfc\\x96\\xaf\\x82\\x04\\xae\\x0c\\xa0\\x6b\\xd1\\x9c\\x63\\x0c\\x83\\x65\\xfe\\xa2\\x93\\xd3\\x18\\x6f\\x7e\\x82\\x6c\\x15\\x31\\xb9\\x2b\\xad\\x9c\\xee\\xaf\\xd6\\xa3\\x44\\xaa\\xc2\\x6e\\x6b\\xc2\\xce\\x8d\\xac\\x70\\x23\\xab\\xcf\\x8e\\x6c\\xde\\x50\\xcb\\x72\\xc6\\x5d\\x92\\x64\\xcc\\xd0\\xa2\\xc2\\x50\\x56\\x43\\x18\\x82\\x70\\x6c\\x5f\\x47\\x8a\\x9d\\x6d\\x26\\x02\\xc9\\x55\\xc2\\xcd\\x96\\x11\\x88\\xa9\\xbe\\xdc\\x53\\x7d\\x2e\\x2a\\x84\\xae\\x38\\x2d\\xa0\\x9e\\x35\\xc4\\xa0\\x9f\\x6b\\x8b\\x7e\\xe2\\x88\\x23\\xec\\x73\\xd3\\xc1\\x3e\\x2f\\xce\\xab\\x5b\\x6a\\x1c\\x74\\x73\\x16\\x07\\x65\\x4f\\xe3\\xa0\\xa8\\x00\\x13\\xe3\\xa0\\xa8\\xf8\\x8e\\x23\\xf8\\xbc\\x14\\xf3\\xb7\\x94\\xa3\\x37\\xa6\\x08\\x31\\x0d\\x58\\x47\\x28\\x35\\xee\\x60\\xab\\x2c\\x42\\x53\\x43\\xa9\\x0f\\xa1\\xaa\\xed\\xf6\\xde\\x8f\\xae\\xc6\\xee\\x24\\x5a\\x78\\x61\\xf4\\x5a\\xe9\\x93\\x92\\x1f\\x2c\\x46\\xd8\\xbb\\x17\\xe5\\xa2\\xd7\\xb4\\xf0\\xc6\\x08\\xbb\\xea\\x20\\x9b\\xf6\\x59\\x73\\xe8\\xe4\\x35\\xfb\\xd4\\x77\\x69\\x5c\\x87\\xb8\\x57\\xb3\\x37\\xb7\\x2e\\x2e\\x9f\\x7c\\xfe\\xda\\xfe\\x2d\\x2f\\x46\\x5e\\x99\\x69\\x27\\xe9\\xa1\\x78\\xc7\\xea\\xc2\\xf8\\x4e\\x31\\x22\\xb8\\x96\\xa3\\xdd\\x0b\\x63\\x6c\\x8f\\x32\\x55\\x3a\\xf4\\x16\\xf4\\x9a\\x2a\\x66\\x74\\x18\\x3b\\x07\\x66\\x37\\x7c\\x9c\\xa6\\x31\\x78\\x9f\\xb2\\x59\\x66\\x0f\\x10\\x82\\xf6\\x7e\\x9f\\x67\\xab\\x42\\x5a\\xab\\xc3\\x70\\x13\\x35\\xa8\\x6f\\x07\\x79\\x21\\xe3\\x2a\\x45\\xc3\\x54\\x91\\xa2\\x51\\x6a\\x9a\\x4a\\x6f\\xb1\\xb3\\xcb\\xab\\x2b\\xe4\\xd4\\x5d\\xc9\\xa6\\x81\\x8a\\x15\\x35\\x93\\xca\\xd3\\xb7\\x4f\\x8c\\x1f\\x35\\xb8\\x51\\x75\\x7e\\x07\\x9a\\x7e\\xdc\\x43\\x4d\\xbf\\xc3\\x10\\xcc\\xd9\\xf7\\x7f\\xfb\\xe9\\xe5\\x9b\\x97\\xbf\\x7c\\x79\\xf7\\xf2\\xbb\\xaf\\x5e\\x7e\\xf7\\xf2\\xcd\\x6f\\x26\\x24\\x15\\x1d\\x42\\x88\\x43\\x31\\xe6\\xa8\\x78\\x18\\x1f\\x95\\x29\\x6f\\x4d\\xae\\x42\\x37\\x41\\x67\\x26\\xf7\\x8b\\x4a\\x18\\x54\\xdd\\x38\\x35\\x84\\x8c\\xd5\\x4d\\xdd\\xef\\x27\\x35\\x55\\x20\\x68\\x45\\x9a\\x86\\x2f\\x13\\x11\\xaa\\x89\\x33\\x6b\\x22\\x71\\x49\\x34\\x72\\xbb\\x0f\\x8b\\x81\\xb1\\x10\\x9b\\xd8\\xa6\\xfa\\x5e\\xb6\\xdc\\xf6\\xb0\\x7e\\x3f\\xf9\\x2d\\x61\\x64\\xf2\\xbc\\xae\\x8b\\x7d\\x86\\x9e\\x61\\x34\\x39\\x8d\\x92\\xda\\xac\\xd8\\x6c\\xca\\x3d\\x96\\xcf\\xad\\xed\\x17\\x23\\x2d\\x4f\\x7e\\x77\\x32\\xb2\\x88\\xed\\x19\\xde\\x4f\\xf0\\x46\\xaf\\x8e\\x47\\x15\\xeb\\x8f\\xfe\\x84\\xf9\\xe8\\x6e\\xdd\\x19\\xdf\\xf4\\xfe\\xdf\\xaa\\x47\\x6e\\x07\\xa3\\x89\\xca\\xe4\\xa6\\xe4\\xca\\x24\\xc4\\x7e\\xff\\xf6\\x2d\\xeb\\x09\\x07\\x72\\x78\\x1b\\x77\\xac\\xac\\xd6\\xa9\\x68\\xd0\\x4f\\xd8\\x89\\xaa\\x6b\\x15\\x87\\x8c\\xb6\\xf4\\x47\\x5e\\xd8\\xc0\\xbc\\xb5\\xf5\\xfe\\xd1\\x8e\\x04\\x1c\\xdc\\xd6\\x39\\xcd\\x55\\x57\\xcb\\x78\\x67\\xcd\\xe3\\x10\\xc0\\x82\\x40\\x5d\\x3c\\xe6\\x1d\\x42\\x67\\x5a\\xcd\\x4c\\x4c\\x57\\x31\\x83\\x76\\x70\\xcf\\xbc\\x76\\xe3\\xcf\\x3b\\xe1\\xd5\\x7d\\xb8\\xe6\\x5c\\x74\\xa7\\xe8\\xe7\\x1e\\x47\\x3e\\x94\\x5d\\x95\\xf6\\x3b\\x6b\\x23\\xa3\\x76\\x70\\xb8\\x17\\x8b\\x7d\\x5e\\xc1\\x52\\x08\\xc5\\xea\\x5c\\x58\\x7c\\xda\\xf8\\x45\\xf1\\x54\\x5c\\x11\\x89\\xe5\\xac\\xf2\\xf6\\x57\\x2c\\x61\\x99\\xae\\xfc\\x15\\xbe\\x65\\x73\\x93\\x80\\xb5\\x4d\\xca\\xca\\xa4\\x98\\x86\\x4d\\xd2\\x82\\x3a\\x7e\\x17\\x6c\\x43\\x7c\\xdf\\xa5\\x57\\x08\\x05\\x44\\x8f\\x58\\x40\\x8f\\xf4\\xcd\\xdb\\x50\\x87\\xfb\\xd8\\x18\\x1a\\x55\\x97\\x5b\\xaa\\x52\\x96\\x19\\xa8\\x6c\\xdb\\x49\\x0d\\xa3\\x4f\\x86\\x4f\\xa4\\xea\\xdd\\xc5\\x86\\x21\\xb2\\x88\\x76\\x1a\\x34\\x98\\x7a\\x9f\\x8b\\xc5\\xde\\x15\\x56\\xa6\\x70\\x94\\x04\\x8b\\x7e\\x3f\\xd9\\xa4\\x74\\x71\\x39\\x8f\\x71\\xb3\\x64\\x31\\x18\\x91\\x4b\\x3b\\xe7\\x9f\\x36\\xc5\\x9c\\x57\\x0f\\xa9\\xfd\\x34\\xa1\\xa0\\x3e\\x37\\x1c\\x40\\xd8\\x91\\xc3\\x26\\xa5\\xcb\\xcb\\xc4\\x2b\\x58\\x21\\xc9\\x24\\x27\\x9e\\xcf\\x8b\\xa2\\x6e\\xdf\\x34\\xc9\\x5b\\x5f\\x69\\xb2\\x1b\\x2c\\xc9\\x65\\xd9\\xea\\x7c\\x67\\x3a\\xd7\\x3b\\x60\\xfb\\x6e\\xb6\\x66\\x98\\x6e\\xcd\\xcd\\x18\\xde\\x88\\x4d\\xba\\xbd\\x5c\\xb5\\xea\\x6e\\x4d\\x5d\\x53\\xcc\\xd6\\x36\\x8b\\x7d\\xef\\x3d\\x69\\xdc\\xb5\\x4c\\x29\\xd6\\x81\\xf3\\xbd\\x06\\xde\\xd6\\x2c\\xb1\\x62\\xc5\\xf4\\xde\\x07\\xf9\\x7c\\xc6\\x9d\\x6e\\xbd\\x55\\xde\\x9a\\x3b\\x9e\\xef\\x37\\x89\\x7d\\x22\\xe1\\xce\\x67\\x96\\x71\\x66\\xb4\\x1f\\x73\\x51\\xcd\\x0b\\x95\\x44\\xfb\\x41\\x74\\xad\\x7b\\xda\\x5d\\xc5\\x22\\xbd\\xce\\x87\\xf0\\x4d\\x52\\x01\\x92\\xf0\\xa1\\x19\\x5d\\xfc\\x1b\\x1b\\x47\\x45\\xba\\x0f\\x6c\\x0d\\xee\\xd0\\x10\\xf1\\x1e\\xe9\\x04\\x1c\\xc5\\x2a\\x1e\\x85\\x59\\x19\\x33\\xc6\\x60\\x31\\xb0\\x4e\\xe9\\x83\\x15\\xa1\\x5a\\xfd\\x94\\xb5\\xd3\\x4f\\xd9\\xc4\\x81\\x42\\xbb\\x3a\\x44\\xe8\\x3d\\xd9\\x7a\\xb1\\xc5\\xd8\\x43\\x4e\\x0b\\xc6\\xab\\x14\\xe7\\xce\\x2f\\xac\\xf5\\x08\\xdb\\x38\\x7b\\xf3\\x39\\x75\\x48\\x81\\xc3\\xd2\\xed\\x27\\xfa\\x99\\x98\\x53\\x71\\x43\\x93\\x3a\\x2d\\xc9\\xd5\\xf5\\xc4\\x60\\xc6\\xb9\\x75\\xf2\\x9a\\x8b\\x1b\\x2a\\xaf\\xae\\x27\\x73\\xab\\xe0\\x95\\x8b\\x5b\\x5a\\x0c\\xe4\\xd5\\x75\\xbf\\x9f\\xcc\\xa9\\x2d\\xd4\\x95\\x1f\\x3d\\x31\\xe2\\x0a\\x0a\\xca\\xb3\\x79\\x51\\x33\\xa5\\xb1\\x8e\\xd4\\xfe\\xfe\\xde\\xdc\\x52\\x37\\x30\\x87\\x98\\xab\\x7e\\x5f\\xa4\\x32\\x2d\\x6e\\x99\\x59\\xab\\xe3\\xd1\\xf6\\x66\\xf3\\x06\\x72\\x50\\xdc\\x0c\\x8f\\x47\\x4b\\xd7\\x25\\x73\\xeb\\x5a\\xce\\x0c\\xcc\\x4e\\x8f\\xc0\\x3c\\x0a\\x8a\\x79\\x62\\xe5\\xc3\\xb2\\xbd\\x15\\x58\\x9f\\xb3\\x45\\xd9\\xe7\\x3c\\x28\\x18\\x51\\xe6\\x0f\\xe5\\x4d\\xa5\\x97\\x49\\xe3\\x46\\x39\\xbf\\x75\\x9a\\x7b\\x03\\x4c\\xb4\\x04\\x8f\\x47\\xc1\\x0c\\xc2\\xe8\\x7d\\x41\\x18\\xac\\x98\\x65\\x3b\\xdb\\x6b\\xb4\\xc5\\xb0\\xb7\\x28\\x73\\x74\\x02\\xde\\x9e\\x9c\\x00\\xbf\\x78\\xb9\\x80\\x78\\xf1\\x72\\x09\\x73\\x51\\x57\\xad\\xf0\\x79\\xe0\\xfa\\xab\\x5d\\xdb\\xa5\\x3e\\x35\\x73\\x2a\\x52\\x09\\x2b\\x5a\\xa4\\xd2\\xea\\x8a\\xb5\\xe7\\x5e\\x32\\xe3\\x39\\xf9\\xd1\\x0a\\x4c\\xbd\\xf6\\x78\\x58\\x7e\\x36\\xe1\\x03\\x1a\\xf0\\x4c\\x9d\\xd2\\xef\\x27\\x3a\\xed\\xea\\x9a\\x00\\x5a\\xcb\\xd7\\xc1\\xba\\xab\\x2b\\x5b\\xd4\\x1d\\xe8\\xa7\\xc2\\x2e\\xad\\x88\\x7a\\xb0\\xa4\\x23\\x9b\\x54\\x29\\xe5\\x79\\x35\\xa0\\x11\\x05\\xc9\\x26\\x22\\xe5\\xb9\\xb8\\xba\\x86\\xaa\\xc1\\x00\\xb5\\x73\\x72\\x7a\\x96\\xcb\\x89\\x3f\\x3f\\xf5\\x64\\x91\\xd2\\x79\\x1e\\x46\\xad\\xb1\\x9c\\xc5\\x80\\xce\\x49\\x1e\\x97\\x19\\xd0\\x55\\xb7\\x4c\\x4a\\x57\\xe8\\x08\\xe1\\x3b\\x95\\x2c\\x60\\x08\\x95\\x39\\x7f\\x03\\xe6\\x75\\x12\\x74\\xce\\x16\\x73\\xec\\xde\\x7b\\xe1\\x5a\\x1c\\xa8\\xed\\xe4\\xb4\\xb5\\x85\\x92\\x27\\x63\\x67\\x13\\x95\\xed\\x52\\xe5\\xbd\\x04\\xc6\\xeb\\x1d\\xe5\\x0c\\x2a\\xc3\\x44\\xc8\\x75\\x5a\\x85\\x5c\\x8a\\x28\\xd2\\x59\\x84\\x24\\x69\\xfc\\x6b\\x3a\\x03\\xc4\\x9b\\xe2\\x38\\x67\\x9d\\x67\\x9c\\xf5\\xfb\\x9e\\x0d\\x1c\\xfd\\x74\\x68\\xdf\\x99\\xa4\\xcc\\x47\\x1c\\xf7\\x57\\x62\\xa2\\x7c\\xf8\\xf2\\x84\\x6b\\x9c\\xca\\xf0\\xa1\\x5e\\x7c\\x34\\x1f\\x4a\\xe8\\xd7\\x43\\xed\\x5d\\x48\\xce\\xbb\\x62\\xae\\xf8\\x3b\\x16\\x94\\xff\\x1d\\x9f\\xea\\x2e\\x62\\x54\\xdd\\x21\\xcb\\xfc\\xfb\\x73\\x8c\\xa0\\x3b\\x19\\x58\\x3e\\xae\\x05\\x8c\\xbc\\xff\\xbc\\xb2\\xee\\x83\\x3a\\x81\\x6b\\xec\\xd4\\x8c\\xb2\\xb3\\xeb\\xf5\\x93\\xe2\\x7c\\xe9\\x4f\\x34\\x82\\xc7\\x76\\x6d\\x46\\xd3\\x13\\x6c\\x33\\xbd\\x76\\xdf\\x9f\\xc6\\xcf\\xc1\\xc7\\xab\\xcd\\x2b\\xf3\\x2f\\x56\\x87\\x85\\xd6\\x49\\xf0\\xaf\\x58\\x9b\\xcd\\x85\\x2f\\x4d\\x2b\\xc9\\xdc\\xfe\\x56\\xd2\\xfe\\x34\\x69\\xd7\\x2e\\xf0\\xc7\\xad\\x0a\\x10\\x0c\\xfd\\x7a\\x9a\\xf4\\x5b\\x9b\\xed\\xa7\\x11\\x5a\\xf3\\xce\\x9e\\xa6\\x07\\xc6\\xfc\\x99\\x4c\\x8d\\x1c\\xb4\\x2a\\x36\\xbc\\xe2\\x8a\\x17\\xa5\\x75\\xa3\\xdf\\x5e\\xfc\\x8f\\xd9\\xec\\xce\\xf6\\x35\\x77\\x35\\x93\\xa2\\x7c\\xc7\\x42\\xf1\\x73\\xdc\\x99\\x93\\x36\\x51\\x22\\xe9\\x78\\x81\\x6c\\xdc\\x45\\x8b\\x21\\xf6\\xde\\x2d\\x19\\x06\\xb7\\x37\\x1a\\xb4\\x0f\\xe1\\x83\\x10\\x0c\\x60\\x62\\x3d\\x38\\x6a\\xba\\xd4\\xd5\\xf0\\x47\\x4f\\xd3\\x73\\xe1\\x1c\\x82\\x44\\xde\\xc6\\x3b\\x9e\\xf8\\x7e\\x44\\x30\\xf5\\xb4\\x83\\xd4\\x8d\\xa1\\x19\\xfa\\xe9\\x3a\\xb4\\x1d\\x74\\x4a\\x74\\xa2\\x10\\x8f\\xa7\\xad\\xae\\xe8\\x05\\x1e\\x6e\\xc9\\xd0\\xf1\\xac\\x5f\\xbf\\x84\\x05\\x22\\x20\\x6e\\x44\\x53\\xe3\\x38\\xfd\\xd6\\xb5\\x82\\xb6\\xb3\\x5d\\xfb\\x35\\xaf\\x19\\x7a\\xee\\x20\\x70\\xb0\\x85\\x73\\x0e\\x71\\xb5\\xbc\\x02\\x4d\\xe3\\xe5\\x3d\\x9b\\xd8\\x6b\\x08\\x31\\xb2\\x4a\\x7c\\x19\\xf5\\xe8\\x8d\\x9e\\xc8\\x29\\x4b\\xf7\\xe0\\x01\\x15\\x3e\\xe0\\xb8\\xd4\\xe6\\x9a\\x61\\x0d\\x4b\\x73\\x72\\x98\\xaa\\x19\\xd1\\x0b\\x6b\\x6e\\x65\\x3b\\xb9\\xa0\\x95\\xb9\\x72\\xa7\\x55\\xac\\xd7\\x90\\xe0\\x2f\\xa3\\xa6\\xf7\\x32\\xa9\\x35\\xc4\\x15\\x84\\x40\\xf8\\x92\\xad\\xaf\\x42\\x7f\\xe9\\x61\\x7f\\xee\\x6f\\x7c\\x8b\\x4e\\xfe\\x5e\\x26\\x2c\\x80\\xd8\\x18\\x93\\xb5\\x34\\xb2\\x9e\\x9a\\xee\\x1f\\xfd\\xde\\x86\\xea\\x1f\\x98\\x7a\\x18\\xe6\\x37\\x89\\x82\\x96\\x1f\\x8f\\x83\\xe9\\x23\\x9f\\xce\\x50\\x6c\\x23\\xf5\\x0f\\x9c\\x73\\x3e\\x9d\\x35\\x20\\xe9\\x17\\x32\\xa9\\x40\\x91\\xf1\\xbd\\x1e\\x99\\x43\\x89\\x65\\xe2\\xc6\\x86\\xc4\\x2c\\x8e\\x38\\xe1\\xa0\\x88\\xc6\\x87\\x75\\x41\\x83\\x2d\\xdb\\x5b\\x1c\\x65\\x9b\\x5c\\x8b\\x3e\\xeb\\x56\\xf0\\xe7\\x69\\x23\\xc2\\xb1\\x01\\x34\\x86\\x2d\\xf4\\x5c\\x9f\\x3b\\xd0\\xf7\\xbe\\xf5\\x0a\\x54\\xd7\\xb9\\xe5\\xfa\\x0a\\xe1\\xe4\\x1f\\x3a\\x2b\\xa6\\xca\\xe9\\x61\\x59\\x9e\\x49\\xf7\\xa7\\xe5\\x4c\\xa5\\x7f\\xeb\\xb8\\xdc\\x99\\x7b\\x82\\x37\\xe2\\xac\\xb2\\x85\\x7d\\x31\\xd1\\xc3\\xd7\\x5d\\xb0\\xf4\\xc1\\x8d\\x77\\xce\\x97\\xac\\xdd\\x2e\\x3a\\x3e\\x74\\x1e\\x1b\\x6a\\x3a\\x44\\x13\\x6a\\x17\\x59\\xeb\\xa6\\x1c\\xa7\\x69\\x4d\\xac\\xfe\\xfc\\x5e\\xaf\\xad\\x85\\x33\\x7c\\x5a\\xcf\\x48\\xa4\\x0d\\xe3\\x2d\\x95\\xe6\\x74\\xee\\x2d\\x95\\x12\\x7d\\x29\\x85\\x26\\xa6\\x5d\\x12\\x26\\x40\\x65\\x4d\\x8e\\xb8\\x62\\xeb\\x9f\\x8c\\xb1\\x92\\xae\\x66\\x8d\\x95\\x8c\\x3b\\xdb\\x90\\x9b\\x18\\xa4\\x57\\x57\\xf9\\x26\\x99\\x43\\xc2\\xfd\\x61\\xad\\xf4\\x61\\x54\\x61\\xbb\\x35\\x76\\xed\\x5c\\xa2\\x44\\x8f\\x8c\\x39\\x48\\xa8\\xef\\xe1\\xbc\\xc7\\x54\\xdd\\xb7\\x26\\x2e\\x53\\xb4\\xca\\xf8\\x27\\x27\\x2a\\xd2\\xa0\\x9d\\x55\\xfc\\x8c\\x09\\xf7\\x1d\\x3f\\x5f\\xd2\\x25\\x46\\xcf\\x56\\x01\\x2c\\x46\\x03\\xe6\\x30\\xff\\x28\\x29\\x54\\xfc\\x68\\xf0\\x93\\x47\\x83\\xbb\\x1d\\x77\\xa6\\xd8\\x7a\\x43\\xd1\\xc1\\x95\\xe5\\x4e\\x78\\x48\\xbe\\x93\\xd3\\xca\\x0b\\x39\\x66\\xee\\x8a\\x09\\xe0\\x1d\\x04\\x8a\\x8c\\x35\\x79\\xd6\\x3a\\x68\\x95\\x26\\x5c\\x0d\\xaa\\x82\\x23\\x30\\x80\\x16\\x6d\\xac\\x79\\x8c\\xb0\\x60\\x66\\x04\\xce\\x5c\\x89\\x90\\x17\\xa5\\x06\\x04\\x06\\xb3\\xc2\\xa5\\xb6\\xf9\\x16\\x95\\xc1\\x4c\\x7b\\x5d\\x75\\x8e\\x37\\xbd\\xe0\\x0e\\xbb\\x93\\x68\\xe4\\x06\\x35\\x6d\\x3f\\x2c\\x87\\x06\\x9d\\x82\\x43\\x49\\x5f\\xcb\\x84\\xfb\\xd7\\x18\\x6a\\x02\\x73\\xfa\\xd6\\xb8\\xd9\\x28\\xc1\\x65\\x90\\x31\\x77\\x98\\x52\\x69\\x7f\\x00\\x77\\x88\\x52\\x69\\x7f\\x80\\xa4\\x07\\x8b\\xa1\\xe6\\x23\\x88\\x9d\\xcc\\x19\\x2a\\xc9\\x92\\x06\\x8e\\xa4\\x71\\xe4\\x80\\x21\\xd1\\x7e\\xd5\\x98\\xba\\xf9\\xf9\\x5b\\xae\\xb2\\x7d\\x63\\xf4\\x70\\x86\\x68\\x06\\x6d\\x5b\\xed\\xf7\\x93\\xa8\\x8b\\x61\\xa3\\x47\\xd5\\xc6\\x49\\x0b\\xe0\\x27\\x78\\xa7\\xd4\\x08\\xc3\\x39\\xec\\xc5\\x9a\\x6f\\x27\\x28\\xf8\\x52\\x1a\\x83\\xd0\\x68\\x78\\x5d\\x15\\x65\\xfc\\xdb\\x1d\\x05\\xcb\\x75\\xf4\\x4b\\x15\\xde\\x61\\xa3\\xb2\\x82\\x1e\\xb0\\x17\\x75\\xf1\\xf8\\x42\\xcf\\xe1\\xbc\\x61\\x13\\x9e\\x4f\\x24\\x48\\x7d\\x7c\\x74\\x2c\\x34\\x66\\x91\\xb3\\x9a\\x11\\x88\\x6c\\x3f\\xc2\\x7b\\xe4\\xd3\\xae\\x75\\xda\\x75\\x3b\\xed\\x53\\x9d\\xf6\\xa9\\x71\\xeb\\xde\\x69\\x33\\x76\\xf9\\x68\\x09\\x66\\x47\\xdd\\x5a\\x97\\xee\\x70\\x68\\x51\\xc2\\x12\\x02\\xcd\\x5c\\x20\\xd7\\x64\\xa7\\x09\\x62\\x4d\\x0b\\x2b\\xc7\\x41\\x99\\xbb\\x8d\\x5b\\x69\\x32\\x3f\\x04\\x26\\xc6\\x78\\xbb\\xa7\\x84\\x9a\\x98\\x24\\x1b\\x5a\\xa6\\xab\\xab\\x6b\\xf0\\x94\\x64\\x35\\x49\\x8c\\xd1\\xd5\\x62\\x50\\xc0\\x03\\xdd\\xa4\\x05\\xac\\xe9\\x66\\x50\\x60\\x78\\x9f\\x3a\\x9d\\xeb\\x9c\\x14\\x73\\x06\\x98\\x93\\x16\\xe8\\xcd\\x84\\xe4\\xc9\\x96\\x46\\x8d\\xd4\\xa9\\x4c\\x8b\\x88\\xf2\\xd3\\x29\\xf3\\x81\\x1c\\x14\\x79\\x84\\x6b\\x83\\xa3\\x93\\xc5\\x24\\x79\\xa0\\x25\\x6c\\xe8\\xc3\\xa0\\x80\\x05\\xdd\\x0e\\x0a\\x58\\xd2\\x6d\\xaa\\x3b\\x7d\\xd0\\x03\\xd4\\x39\\x29\\xe6\\xa4\\x98\\x33\\x28\\x08\\xac\\xe9\\x83\\x26\\x6e\\x47\\xf9\\x02\\x76\\xd7\\xf9\\x16\\x76\\x9f\\xe6\\x4b\\xd8\\x8f\\xf2\\x07\\xd8\\x5f\\xe7\\x1b\\xd8\\x7f\\x9a\\xaf\\x9b\\x48\\xf9\\xf6\\xa9\\x90\\x7b\\x4e\\xeb\\x56\\xc4\\x8e\\xb1\\x8d\\x3b\\x08\\xbe\\x4c\\xa4\\xab\\x31\\xa7\\xbb\\x2a\\xe1\\xa8\\x5e\\x5b\\x65\\x3b\\x47\\x4a\\x1b\\x83\\x1f\\x95\\xed\\xe8\\x4f\\xfa\\x3a\\x5a\\x10\\x63\\xef\\x1e\\x81\\xd8\\x76\\x60\\x1e\\x29\\x90\\xc6\\xe5\\x5c\\xa9\\x33\\x86\\x22\\x46\\x34\\x1a\\x71\\x90\\x35\\x2c\\x89\\x99\\xab\\xc0\\x5a\\x5a\\xa5\\x98\\xe5\\x02\\x88\\x23\\x0f\\xaf\\x70\\x3c\\x3c\\xe3\\x12\\x52\\xa2\\x4b\\x48\\x53\\x09\\x59\\x95\\x62\\x5a\\xce\\x60\\x9e\\xed\\xf4\\x14\\xf4\\xa3\\xb6\\x4f\\x8b\\x96\\x00\\xd6\\xa4\\xd1\\x38\\x31\\xad\\xa1\\x4c\\x47\\xde\\x3f\\xd4\\x3e\\x75\\x1d\\xc7\\x1c\\xde\\x41\\xed\\xac\\x7c\\x70\\x38\\x56\\x7e\\xd8\\xf5\\x66\\x8d\\x7b\\x50\\xd0\\x16\\x4d\\x35\\xe5\\x33\\x74\\xb0\\xd1\\x7d\\x8f\\x74\\x7a\\xe4\\x1a\\xa0\\x0c\\x0a\\x55\\xf3\\x86\\x0a\\xc3\\x5b\\x17\\x11\\xfb\\x7d\\xa1\\x77\\x44\\xba\\x40\\x4f\\x02\\x83\\x2d\\x67\\xbb\\x04\\x23\\x65\\x97\\x37\\x31\\xf7\\x77\\x92\\xc4\\x5f\\x83\\x92\\x5c\\x5d\\xe7\\x43\\x78\\xa0\\x2c\\xdb\\xa7\\x4b\\xf3\\x10\\x9d\\x55\\xe9\\x67\\x5e\\xa5\\x3f\\x32\\x8b\\xd5\\xb5\\x63\\xc5\\x9f\\xfa\\xac\\xd6\\x4f\\x7d\\x5e\\xa7\\x7f\\xd4\\x00\\xa7\\x55\\xac\\x91\\xbf\\x85\\x39\\x49\\xe7\\x57\\xd7\\x20\\xe9\\x43\\x5a\\x5e\\x5d\\x8f\\xdb\\x61\\xcc\\x44\\xb6\\xde\\x96\\x8a\\x7f\\xcb\\xf6\\x9f\\x7b\\xf5\\xa9\\x96\\xcb\\xa3\\xb3\\x05\\xbe\\x75\\x90\\x4f\\x76\\xc3\\xd0\\x17\\x67\\x22\\x6b\\xf8\\x9c\\x73\\xc1\\xcf\\x4c\\x2b\\xc6\\xd4\\x20\\x8e\\xa2\\x56\\xb4\\xe3\\xb6\\x8d\\x3e\\xd0\\x4f\\x6c\\x52\\x11\\x2b\\x67\\xa1\\xb7\\x96\\xd3\\x08\\xfe\\xa7\\xfa\\x5b\\xc7\\xe3\\xd0\\xbf\\xaa\\x27\\x0b\\xd8\\x5d\\xd4\\xca\\x5a\\x4d\\x6c\\x61\\x44\\x60\\x3e\\xc0\\xf0\\x4f\\x2f\\x83\\xe6\\x9a\\xb3\\x79\\x68\\x5b\\x39\\xc8\\x33\\x56\\x0e\\x27\\xee\\xd1\\x3e\\xb0\\xf0\\x5c\\x43\\x21\\xeb\\x6f\\xf7\\x01\\x1e\\x35\\xb4\\xce\\xcb\\xe0\\xe8\\x97\\xc4\\x51\\x48\\x9c\\xf9\\xc3\\x07\\x76\\xa1\\x3d\\x02\\xd7\\x01\\xd7\\x1d\\xa4\\x23\\xdd\\xc5\\xe0\\x5a\\x77\\x32\\xb8\\x3e\\xd7\\x0d\\xba\\x0c\\xf8\\xc0\\x98\\x4d\\x81\\x1f\\x31\\xa0\\x0f\\x3c\\x80\\x3e\\xe1\\x7e\\x74\\xdd\\xd4\\xf7\\x0f\\xd4\\xb7\\xc3\\x41\\x8f\\x4d\\x8f\\xac\\x1c\\x5c\\x13\\xd2\\xc4\\x15\\x4f\\x58\\x25\\x53\\x3e\\x43\\x20\\xee\\x88\\xa5\\x13\\x18\\x6e\\xe4\\x75\\xa2\\xa1\\x95\\xf9\\x69\\x41\\x63\\x2e\\x41\\x7f\\x99\\x07\\xb5\\x80\\x96\\x7c\\x24\\xaf\\xe1\\x29\\x48\\xc2\\x0d\\x24\\xe1\\x01\\x92\\x58\\xd6\\x72\\x0c\\x23\\x60\\xeb\\x85\\x42\\xcb\\xf3\\xcf\\x02\\x3c\\x04\\x66\\x31\\x27\\x87\\x08\\xe2\\x72\\x58\\x1a\\x70\\x9b\\x6e\\x0d\\x70\\x5d\\x78\\x28\\xbb\\x48\\x65\\x03\\x1b\\xba\\x8c\\x1e\\x8a\\xc2\\x74\\xbf\\x86\\x1d\\xdc\\xc3\\x1d\\xec\\xe1\\x1d\\x3c\\x1a\\x4d\\x81\\xe8\\x65\\x29\\x9e\\x7c\\x41\\x58\\x47\\x92\\xe3\\x1f\\xaa\\x8d\\x79\\x9d\\x5a\\xc1\\x0d\\xc5\\xc2\\x2c\\x0f\\x7c\\x93\\x54\\x11\\x4a\\x0c\\x0f\\x1a\\x76\\xd6\\xfd\\xbe\\x7d\\xcb\\x2f\\x28\\xdd\\x4c\\x22\\x1c\\xa2\\x98\\xcc\\xaf\\xae\\xd3\\x51\\x3e\\x47\\x99\\xd3\\x1d\\x1d\\xc2\\xbb\\xf0\\x96\\xde\\xdd\\xbc\\x1b\\xa7\\xe9\\x1d\\x39\\xe8\\x31\\xaf\\xa9\\x98\\xde\\xcd\\x50\\x5e\\xd9\\xdd\\xe4\\xbb\\x59\\x6b\\x34\\x3b\\xf8\\x26\\x59\\x3b\\xfa\\xfc\\x81\\xc0\\x3d\\x5d\\x5b\\x22\\xbc\\xee\\xf7\\xef\\x83\\xff\\xad\\x2a\\x6b\\xbf\\x31\\x0c\\x14\\xdc\\xc1\\x52\\x4f\\x6e\\x11\\xe4\\x73\\xad\\xad\\x2b\\x09\\x81\\x3d\\x1d\\xc2\\x23\\x75\\xed\\x8c\\xf7\\x37\\x8f\\xe3\\x34\\xdd\\x93\\x87\\xe4\\x7e\\xba\\x9f\\xe9\\xaa\\x71\\x8d\\xb1\\x1e\\x8a\\xa1\\xf1\\x1f\\x48\\xb3\\xa5\\xc3\\x4e\\x3e\\x2e\\x97\\xa7\\x04\\xf4\\x68\\x55\\xb6\\x1f\\x50\\x89\\xa7\\x36\\x10\\xe9\\x67\\x71\\x0f\\x2b\\x55\\x3b\\x45\\x3e\\x5a\\xa8\\x47\\xf9\\x71\\xa8\\x87\\x69\\xcc\\xe3\\x1e\\xf6\\x69\\xee\\x48\\x3e\\xe1\\x09\\x73\\xc6\\xa4\\x55\\xff\\x83\\x38\\x49\\x2c\\xc3\\x6e\\x1f\\x23\\x93\\x73\\x1e\\x09\\xa9\\xe9\\x70\\x5c\\x23\\x12\\x52\\xb7\\x91\\x90\\x7a\\x06\\xe5\\x1f\\x43\\x42\\x78\\x5b\\x56\\x6b\\x10\\xbd\\x00\\xb6\\x4e\\xa4\\x77\\x4e\\x27\\xda\\x02\\x04\\xe9\\x30\\xec\\x5d\\x5e\\xc0\\x3e\\xaf\\x23\\x14\\xba\\x74\\x28\\xb4\\x85\\x06\\x55\\x16\\x63\\xe1\\xe3\\x78\\xb6\\xd5\\x09\\x94\\x63\\xad\\x67\\xae\\x6a\\x3d\\x73\\x2c\\x36\\x34\\x6c\\x45\\x41\\x64\\x1d\\xd7\\xa6\\x6b\\xf1\\x4e\\xd3\\x0f\\x45\\xba\\xd2\\xa4\\x9e\\xc3\\x91\\x65\\xbf\\x6f\\xf8\\xf0\\x27\\xf4\\x4b\\x20\\x39\\x8a\\xb4\\x1c\\x60\\x25\\x96\\xfd\\x6b\\x5b\\x2c\\xea\\x42\\xf1\\xf9\\x8b\\x6d\\x6d\\x9b\\x2b\\xa1\\x06\\xfc\\x9b\\xae\\x08\\x44\\x57\\x58\\xfa\\xcb\\x4d\\xd1\\xad\\xdc\\xc7\\x74\\x03\\x1a\\x9d\\x5f\\x3d\\xdd\\x51\\x3a\\x07\\x3b\\x98\\x74\\x4e\\x20\\x92\\x7e\\x7d\\xdc\\x34\\x6c\\xbd\\x73\\xad\\x9b\\xb6\\x5d\\xff\\x9d\\x69\\x38\\x02\\xe4\\xa3\\x66\\x61\\x16\\xe2\\x7c\\x1f\\x60\\x57\\x9f\\xb5\\x5c\\x32\\x32\\xf7\\x40\\xb7\\x36\\xf0\\x76\\xd8\\xef\\xb3\\x60\\xb0\\x78\\x67\\x68\\x56\\x4f\\xc6\\xbe\\x41\\x97\\x77\\xe7\\x79\\x5d\\x8e\\xc1\\xce\\x62\\x11\\x8d\\x86\\x0d\\x9a\\xbc\\xdd\\x81\\x34\\x3f\\xf6\\x88\\x86\\x1e\\x8f\\x32\\xc0\\x90\\x9d\\x9c\\xaa\\x2e\\x2f\\x84\\x41\\xe0\\x9e\\xb1\\x13\\x9e\\x48\\xec\\x4d\\x7a\\x1c\\xd9\\xfd\\x38\\x16\\x04\\x9a\\xea\\x9f\\x61\\x41\\x54\\x60\\x0b\\x39\\x46\\x04\\x28\\xcf\\x81\\x50\\x86\\x03\\x41\\xc6\\x42\\x13\\xf9\\x94\\xd2\\x79\\xb6\\xeb\\xf7\\xa5\\xff\\xd8\\xa3\\x01\\x75\\x97\\x2b\\xc1\\x4e\\xb8\\x12\\x96\\xed\\x40\\x0b\\xcb\\x7e\\x70\\x7c\\x07\\x5a\\x38\\x06\\x04\\x73\\xe2\\x99\\x0a\\xc3\\x0a\\x5a\\xc1\\x4c\\x85\\xf1\\x05\\xdf\\xc7\\x38\\x60\\x30\\x27\\xa4\\xf9\\x60\\xd4\\xe0\\x98\\x45\\xc5\\xda\\x2c\\x2a\\x1b\\x18\\x83\\x39\\x0e\\x47\\x7b\\x21\\x59\\xf6\\xc4\\x76\\xf3\\xe0\\xc5\\xf2\\xf0\\x5e\\xde\\x4a\\x03\\x92\\x7a\\xc7\\xd2\\x2c\\xdb\\x37\\x63\\xeb\\xba\\xac\\xb8\\x97\\x49\\x45\\x6e\\xb2\\xe1\\x70\\x34\\x19\\xe6\\x61\\xcf\\x5a\\xd2\\x57\\xa8\\x9d\\xe5\\xa8\\x7d\\x42\\x8e\\x47\\x76\\xaa\\xc3\\x83\\x89\\xed\\xcf\\xae\\x4e\\x8f\\x4e\\xb3\\x8c\\x60\\xa7\\xa1\\x17\\xa4\\x39\\x75\\x1c\\xd1\\x5d\\x65\\x0f\\xa5\\xb8\\x2f\\xca\\xe7\\xe5\\x66\\x55\\x50\\xbd\\x79\\x1d\\xe0\\x2b\\x01\\x23\\xbe\\x13\\x34\\xfc\\xb7\\x6a\\xb7\\xc1\\x20\\x16\\xa4\\x81\\xe6\\x0a\\x5f\\xa3\\x40\\xa0\\xeb\\x5a\\x88\\x95\\x78\\x74\\xaf\\x95\\x62\\x9f\\x52\\x9b\\x76\\x77\\xb6\\xe5\\xc8\\xe7\\x24\\xf2\\x5c\\x9e\\xe3\\x5d\\x70\\x41\\xc7\\xba\\xe1\\x9a\\xcc\\x4d\\xd1\\x34\\x46\\x23\\x4f\\xca\\x9e\\x67\\x68\\xba\\xdb\\x25\\xd0\\x71\\xd2\\x26\\x49\\x92\\x43\\xdb\\x1c\\xc3\\xaa\\xd4\\xb1\\x86\\x44\\x8c\\x5e\\x1e\\x89\\x96\\x62\\x05\\x3b\\xe5\\x2e\\x65\\x37\\x50\\x4c\\xef\\x45\\x51\\x55\\x42\\x3d\\x5b\\xf2\\x6a\\xf1\\xac\\x78\\x66\\xbb\\x78\\x56\\xa8\\x67\\xd8\\xfc\\xb3\\x5e\\x1a\\xc2\\xf8\\x75\\xfa\\x77\\xfa\\x6e\\x95\\x51\\xa2\\x63\\x33\\x3f\\x22\\xf4\\x33\\x4e\\x2f\\x94\\x32\\x91\\x98\\x91\\x45\\xea\\x00\\xc8\\x8b\\x55\\x51\\x3d\\xb0\\x45\\x22\\x80\\x91\\x71\\x22\\x8f\\x47\\xf4\\x35\\xe4\\xe7\\x4b\\x4f\\x79\\xac\\x94\\x01\\x77\\x77\\xec\\x62\\x48\\x48\\xdb\\x86\\xf2\\x7d\\xdc\\xe0\\x98\\xe5\\x8b\\xae\\xc2\\x90\\xed\\x4b\\x2f\\x46\\x86\\xf3\\x6b\\xec\\x14\\xc5\\x16\\x31\\x4d\\xe7\\xf6\\x3f\\x29\\x5a\\x8b\\xe8\\x76\\xe9\\xb9\\xc2\\xfe\\xbe\\x12\\xf5\\x6b\\xb1\\x40\\x95\\xe2\\x6c\\x2d\\x16\\xcc\\xa8\\xbc\\x57\\xc1\\x1b\\x58\\x11\\xbc\\x81\\x11\\x6f\\x2e\\x7d\\x66\\xfa\\x45\\x08\\x8f\\xf8\\x4c\\x52\\x76\\x3c\\xea\\xd5\\x2a\\x40\\x90\\xe3\\xb1\\x06\\xd9\\x5a\\x91\\x02\\x12\\x2f\\xed\\x3c\\x1e\\x03\\x2b\\xd2\\xae\\x5b\\x7b\\xad\\xd0\\x75\\xc6\\x0e\\xbd\\x6a\\xec\\x9b\\x78\\xdd\\x80\\x11\\x14\\x5c\\x9e\\x8c\\x24\\x52\\xde\\xb1\\xac\\x57\\xee\\x18\\xaf\\x95\\xd7\\x00\\x77\\x7c\\x42\\xa9\\x5f\\x03\\xd1\\x7d\\x0d\\x6c\\x00\\x4a\\xef\\x9e\\x17\\x5d\\x3d\\xe2\\x24\\xf4\\xff\\x6c\\x77\\x3c\\x56\\xf8\\x63\\x4f\\x9a\\xe6\\x45\\x30\\x7e\\x60\\xb5\\x6e\\x0e\\xc5\\x92\\x7f\\x73\\xaa\\xeb\\x56\\x5e\\x19\\x94\\xd7\\x5f\\x48\\x88\\xca\\xe7\\x3b\\x69\\xa4\\x6c\\x2f\\x2b\\xee\\xf5\\xd9\\x39\\x82\\x0c\\x5b\\x15\\x45\\xbd\\x2f\\x64\\x72\\xb8\\x73\\x7a\\xa1\\xde\\x92\\xb2\\x09\\x8e\\x44\\xdb\\x2a\\xe4\\x91\\xe2\\x46\\x50\\xd8\\x88\\x24\\xe6\\x9c\\x34\\x50\\x33\\xc9\\xd4\\x1f\\xa9\\x60\\x5c\\xc6\\x76\\x1f\\x03\\x57\\x1a\\x38\\xf5\\xb2\\x5b\\xd6\\x18\\xdf\\xf7\\x2a\\xab\\x84\\xe2\\xcb\\xfd\\xf7\\xe5\\xf6\\x81\\x57\\xd2\\xf9\\x01\\x7d\\x63\\x8a\\xa1\\x27\\x4b\\xa3\\xab\\x65\\xd4\\x4f\\xb0\\xe9\\x6c\\xae\\x10\\x93\\xed\\xd4\\x34\\xd2\\xd7\\x76\\xc5\\x33\\x06\\x96\\xe8\\x5a\\xc7\\x0e\\x23\\x0e\\xdc\\x67\\x78\\xd8\\xe3\\x30\\xb7\\x33\\x66\\x97\\x76\\x28\\xd9\\xdc\\x9c\\x23\\x7a\\x31\\x24\\x4d\\xac\\x57\\xef\\x43\\x32\\x0e\\xc1\\x9d\\x58\\x63\\xc6\\x18\\x54\\xe5\\xad\\xf6\\x7a\\x0f\\x4e\\xc2\\x68\\xd6\\x0f\\xf7\\x45\\x32\\x44\\x03\\x8a\\x61\\xf6\\x17\\xd2\\x83\\xc0\\x70\\xcc\\x7b\\xff\\x6b\\xb9\\x5c\\xda\\x94\\xaf\\xce\\xa9\\xe8\\xc7\\x7c\\xcb\\xfc\\x1a\\x4e\\x58\\x86\\xf9\\x9f\\x21\\x30\\x45\\xad\\x62\\x13\\x78\\xa2\\xd4\\xb5\\x1f\\x53\\xf8\\xd7\\xe0\\x88\\xf4\\xfc\\xd0\\x44\\xd4\\xbe\\xad\\x1b\\x51\\x22\\xae\\x76\\x8b\\x66\\xc8\\xaf\\xa1\\x43\\x1c\\xe5\\x7f\\x86\\x40\\xd8\\x9c\\xda\\x18\\x04\\xfa\\xc8\\x75\\xe1\\x4c\\x0d\\xfe\\xdc\\x56\\x61\\xbb\\x8e\\x38\\xf5\\x7f\\x6a\\xab\\xb3\\xfd\\x39\\xe2\\x3c\\x58\\x65\\xdd\\xa0\\x34\\x6c\\x3c\\x0e\\x79\\x76\\xc4\\x13\\xf9\\xa7\\x4c\\x1a\\x37\\xbd\\x36\\x93\\xe3\\x62\\xd8\\x0e\\x73\\x1a\\xef\\x1e\\xe9\\x06\\x5f\\xf5\\xc8\\x67\\x7e\\x58\\x6c\\x6b\\xf3\\xeb\\xb3\\xe1\\x10\\x58\\x21\\xf5\\x8c\\x7a\\xac\\x90\\xec\\x6f\\x5b\\xf5\\xc3\\xb6\\xa8\\x55\\xaf\\x09\\xc5\\x65\\x7e\\xa8\\x50\\xe9\\x5f\\xe6\\x07\\xa3\\xdc\\x60\\x3e\\x7b\\xce\\x19\\x34\\x67\\x32\\x0f\\x11\\x69\\x11\\x01\\xea\\x41\\xcf\\x60\\x3e\\x3d\\xe8\\x19\\xe0\\xe6\\x7e\\xfc\\xd6\\x9b\\x35\\xe0\\x64\\x47\\x07\\xd7\\xb7\\x8d\\x92\\x09\\x7e\\x60\\xd7\\xc3\\x61\\xd3\\x40\\x10\\x73\\x1f\\x22\\x55\\x88\\xfc\\x3b\\x73\\x8c\\x7c\\x64\\x55\\x83\\xcc\\xdc\\x0e\\xa3\\xeb\\x3e\\x1d\\xce\\x10\\xf7\\x0b\\xc2\\x65\\xe7\\xb4\\xb1\\xa2\\x7c\\xe2\\x24\\xc8\\xf9\\xd0\\x79\\xbd\\xb0\\xb4\\x84\\xf7\\xef\\xdc\\xb3\\x6f\\xee\\x89\\xc7\\x2c\\xfd\\xf8\\x78\\x3d\\x1a\\xaf\\x6c\\x86\\x6d\\x1f\\x8f\\xbd\\x9e\\xb1\\xfc\\xc7\\xcf\\x50\\x0a\\x3f\\xd1\\xde\\xc1\\x90\\x11\\x5e\\x97\\xfd\\xa6\\xf2\\xbe\\x0b\\xa6\\x51\\xf2\\xcc\\x1a\\x2a\\xf4\\x7a\\x16\\x72\\xb8\\x69\\x07\\xa4\\xcf\\x7f\\xa0\\x2a\\x42\\xfe\\x9d\\x51\\xc2\\x77\\x2b\\xf2\\x5f\\x9d\\x90\\x9d\\x48\\xda\\xcb\\x35\\xfe\\x91\\xb5\\x75\\xf3\\x8f\\xc7\\x6e\\x8a\\x31\\x72\\xb1\\x66\\xcc\\xed\\x65\\xd0\\x0f\\x3a\\x4b\\xa9\\x6e\\x88\\x44\\xda\\x46\\x9d\\xfa\\xb6\\xdb\\x4f\\x12\\x4e\\x34\\x15\\x91\\x52\\x8d\\x0a\\x36\\x10\\x64\\x05\\x6d\\x10\\x7e\\x1e\\xc3\\x6a\\x99\\x85\\x93\\xb3\\x26\\xcc\\x2a\\xac\\xad\\x47\\xaa\\xe2\\x8b\\xd3\\x0e\\x37\\xdd\\x05\\x8a\\xa7\\xa1\\xa4\\xe3\\x8b\\xc5\\x5a\\x74\\x7e\\xe0\\x5a\\xfb\\x0c\\x34\\x4f\\xee\\x72\\xb3\\x5b\\xb9\\xd6\\x40\\xb9\\x6d\\x04\\xdc\\xd8\\x75\\xf0\\x2c\\xb4\\x0e\\x6e\\xeb\\xf6\\xcf\\xc3\\x4f\\x5b\\x3e\\x48\\x31\\xfe\\x07\\x17\\x2f\\x12\\x7f\\xb0\\xb3\\xe2\\x0f\\xe6\\xc5\\x1f\\x8d\\x3d\\xc3\\xee\\xa0\\x7a\\xa2\\xc4\\x1f\\x61\\x83\\xf6\\xe7\\xdf\\x39\\x7b\\x0c\\x5b\\xc6\\x25\\x37\\x27\\x16\\x5c\\xfe\\x4d\\xe8\\x2d\\x45\\xe5\\x9f\\x81\\x38\\x25\\xbc\\x51\\x26\\xe1\\xfd\\x56\\xce\\xce\\x4e\\xf9\\x02\\x95\\xb5\\x7b\\x4e\\xb1\\xc3\\x7d\\xbb\\x57\\x14\\xbf\\xdb\\x36\\x61\\x31\\x84\\x6a\\xd9\\x8e\\x8d\\x3a\\xb6\\x63\\x31\\xf4\\xbd\\x5b\\xda\\x4a\\xed\\x0c\\x19\\xe7\\xf4\\x7c\\x72\\x4f\\x2f\\xe0\\x62\\x81\\x2f\\x77\\x51\\xfe\\x0d\\x77\\xfd\\xa7\\xb9\\xd8\\x20\\xd0\\xc5\\x88\\x2b\\x05\\x92\\x46\\x1a\\xae\\x3e\\xef\\xea\\xcc\\x75\\x83\\x5a\\x7f\\xe1\\x23\\x52\\xe6\\xff\\x12\\xf0\\x15\\xfa\\x08\\xcf\\x17\\x12\\x8c\\x4b\\x91\\xfc\\x41\\x82\\x01\\x35\\x6b\\x09\\x16\\x89\\xc9\\xff\\x26\\xe3\\x78\\xd6\\x6f\\xce\\x06\\xb5\\x32\\x36\\x4b\\x0c\\x69\\x1d\\x8c\\x22\\xe4\\xe0\\x5a\\xe2\\xc3\\x3f\\x9f\\x18\\x41\\xb1\\x89\\x37\\x9d\\x1a\\x8c\\x72\\xe3\\x5f\\x8c\\x11\\x13\\xc3\\x8d\\x13\\x5b\\xcf\\xbb\\x70\\x41\\x2c\\xad\\x2c\\xa4\\x39\\xa8\\xd8\\xd9\\x84\\xe7\\x2e\\x4c\\xe3\\x8f\\x41\\x75\\xf7\\xd7\\x27\\x54\\x77\\x95\\xf3\\xdf\\x8d\\x16\\x99\\x08\\x7e\\xda\\x4a\\xb5\\x28\\x04\\xc2\\x80\\xe8\\x74\\xd8\\xa0\\x29\\x93\\x47\\xd5\\x3e\\x49\\x54\\x08\\x80\\xb4\\xf5\\x71\\x95\\xb8\\x57\\x26\\x70\\xce\\x35\\xc6\\xd1\\xac\\x09\\xbd\\xd5\\x65\\x31\\xa0\\x3a\\x4e\\xea\\x3b\\x65\\xe2\\xe2\\x5a\\xee\\x25\\x01\\x24\\x0d\\x12\\x46\\xb9\\xfc\\x4a\\xa3\\xb0\\x2c\\x61\\xa4\\xdf\\xe7\\x53\\x36\\xc3\\x3a\\x2c\\x7f\\x63\\x18\\x31\\xdf\\x22\\xdb\\x26\\x04\\x8e\\x1a\\x8c\\x48\\xb3\\x60\\x8a\\xd5\\x6b\\x14\\x99\\xa9\\xe2\\x15\\x5f\\x73\\x75\\xa2\\x06\\x7a\\x88\\x82\\x3a\\xb3\\x38\\xa8\\x33\\x6f\\x8c\\x1d\\x58\\x2b\\xa8\\x73\\xc9\\x14\\x46\\x84\\xae\\x30\\x22\\xb4\\xb0\\x45\\x5e\\xf3\\xea\\x75\\xb1\\xd3\\xc4\\xdf\\xb8\\xa7\\xf8\\xfc\\xad\\x34\\x7e\\x65\\x02\\xe8\\xd1\\xb5\\x35\\xa4\\x3f\\x1e\\x93\\x8a\\x0e\\x09\\x70\\x0c\\xc5\\xa9\\xce\\x84\\x6a\\xc4\\x80\\xd0\\x2a\\x5b\\xf3\\x8a\\x56\\x80\\x0e\\x82\\xa9\\x30\\xde\\xa9\\xdf\\xe8\\x86\\xcf\\x29\\xb1\\xae\\x79\\x85\\xa6\\x92\\xeb\\x62\\xd7\\xd2\\x4f\\x15\\x06\\x5c\\x86\\xd0\\x0e\\xed\\x0e\\xc7\\x92\\x0e\\x8d\\x96\\x3f\\x47\\xe7\\x34\\xae\\xff\\x89\\xcc\\xa5\\x8f\\x9f\\xcc\\xd3\\x11\\x3a\\xad\\x8c\\x76\\xdd\\x0b\\x13\\x7c\\x95\\xa4\\x42\\xb7\\xbb\\x60\\x8a\\x46\\x07\\x07\\xc7\\xa6\\xb3\\xb3\\x3f\\xe5\\xc3\\x38\\x90\\x1e\\x1b\\xab\\x1b\\xca\\x31\\xf8\\x9a\\x55\\xf4\\xb2\\x71\\xd9\\x55\\x13\\x14\\x5f\\x1b\\x37\\x58\\x1f\\x0f\\xb1\\xc3\\xb5\\x3a\\x73\\xa4\\x9e\\x29\\x8c\\x4b\\xaa\\x6e\\x1c\\x0f\\x68\\xc2\\xa6\\x6a\\x96\\xab\\x26\\x58\\xdb\\x76\\xd4\\x61\\xf1\\xd8\\x47\\xc6\\xb8\\xe4\\xc4\\x89\\x34\\xea\\xc7\\xde\\x59\\xb2\\x19\\xa3\\x2d\\x4a\\x7a\\xd1\\x4d\\x41\\x26\\x4b\\x3b\\x7a\\x63\\x67\\xb4\\x4e\\xe7\\xc4\\x62\\x85\\x17\\xde\\xca\\x51\\x53\\x87\\x94\\x65\\xf6\\x2e\\x11\\x02\\xfe\\x3e\\x7c\\x57\\x7c\\x97\\xb7\\xc2\\x42\\x1a\\xb8\\x54\\x26\\x89\\x1a\\xb0\\x78\\xa5\\xc9\\x15\\x8b\\xf7\\xa8\\x35\\x98\\x37\\xe8\\x23\\xa6\\xb3\\x72\\x78\\x4a\\xfd\\x9a\\xdd\\x0c\\x8f\\x47\\x75\\xcb\\xc2\\x11\\xc0\\x8b\\xe8\\x96\\xb8\\x3d\\x2b\\xbd\\x9e\\x36\\x2c\\xa5\\xee\\x05\\x13\\xbf\\x12\\xb5\\x89\\x42\\x79\\x7e\\xca\\xcf\\xa2\\xfb\\xdc\\x1a\\x76\\x6a\\xe2\\x78\\x9a\\x49\\x45\\x8d\\x5c\\x9e\\xce\\x26\\x8a\\x74\\xd9\\x7a\\xde\\x6d\\xa0\\xc6\\xe6\\x47\\x99\\xf1\\x05\\xed\\xcd\\x0b\\xc5\\x1e\\x44\\xbd\\xef\\xc1\\x8f\\x32\\x73\\xb4\\x1e\\x3d\\xe0\\x74\\x73\\xaf\\x0e\\x9a\\xff\\x28\\x23\\x53\\xd5\\xee\\x31\\xf3\\x1e\\x37\\x5e\\x7d\\x3c\\xb8\\xc4\\x39\\xb5\\x00\\x25\\xab\\x16\\x1d\\xeb\\x85\\x27\\x00\\x2a\\xb3\\x16\\xa3\\x1f\\x07\\x66\\x3d\\x2a\\xa8\\xf4\\xb9\\x74\\x87\\xe9\\x49\\x93\\x59\\x63\\x86\\x4c\\xfa\\xfd\\x0b\\x0f\\x3d\\x53\\x65\\x5f\\x8f\\x54\\x59\\x4e\\x95\\x3e\\x21\\xd8\\x95\\x79\\x35\\x4f\\x41\\x24\\xca\\x64\\x9e\\xab\\x7f\\xb0\\x5a\\x98\\x18\\x58\\xf3\\xb7\\x0e\\x40\\x3a\\x4e\\x56\\x0c\\x46\\xab\\x18\\x8c\\x8a\\xf7\\x81\\x51\\x74\\x9a\\x8d\\x86\\x4d\\x9e\\x17\\xa5\\xe8\\xad\\xa4\\xd5\\x44\\xe6\\x0a\\x4a\\xfd\\x51\\x50\\x31\\x29\\x72\\x34\\x83\\x66\\xc7\\x23\\x0f\\x43\\xfb\\x42\\x25\\x92\\x00\\xd3\\xff\\x0b\\x32\\x56\\x37\\x9a\\x64\\xb8\\x19\\x4e\\xca\\x64\\x48\\x72\\x85\\x04\\x84\\xfe\\x53\\x27\\x43\\xd2\\x48\\x6a\\xbc\\x0e\\x97\\x49\\xa1\\xe1\\x19\\x3b\\x1e\\xeb\\x44\\x46\\x90\\x56\\x5a\\x48\\x5b\\x18\\xc5\\xf3\\xf9\\x5b\\x7c\\x2a\\xde\\x17\\x08\\xc0\\xdc\\x1f\\x63\\xfc\\x7d\\x58\\x17\\x3b\\x04\\xce\\x58\\x0b\\xe3\\x99\\xb1\\x8d\\xb1\\xe7\\x8a\\x2c\\xcc\\xc4\\xc4\\x86\\xe5\\x98\\x33\\x5e\\x26\\xd8\\xdf\\x95\\x20\\x83\\x28\\x78\\x33\\x8e\\xe5\\x4a\\x90\\x74\\x94\\x27\\xc6\\x07\\xa0\\xf5\\x77\\xe7\\xc7\\x03\\x15\\xad\\x8e\\xc7\\xd1\\x08\\x63\\xb6\\xc4\\x61\\x3e\\x2a\\x54\\x78\\xe5\\xcd\\x69\\x15\\x77\\x60\\x9e\\xb2\\x47\\xff\\xc0\\xdb\\xd2\\x76\\xca\\xe8\\xe6\\x6c\\x23\\xba\\x44\\xdd\\x8c\\xa3\\x98\\xe4\\xd7\\x41\\xb1\\x53\\x3c\\x1d\\x03\\xf6\\xa0\\x57\\x49\\x1f\\x15\\x5e\\xe5\\x02\\x8f\\x81\\x84\\x4d\\xcd\\xe6\\x1c\\x43\\x3a\\x16\\x30\\x17\\xdb\\x4a\\x19\\xaf\\x16\\x38\\xba\\xbc\\xc4\\x53\\xc5\\x1f\\xb8\\x92\\xf9\\x1c\\x56\\x1e\\x40\\xe7\\xab\\x86\\x2a\\x58\\xe0\\xca\\xc0\\x96\\x96\\x83\\x11\\x1e\\xc6\\x7c\\x89\\x8d\\x3e\\x34\\x18\\xb1\\xfc\\xe2\\x93\\x44\\x10\\x58\\xeb\\xff\\x92\\xc0\\x4e\\xff\\xaf\\x09\\xdc\\xd3\\xe4\\x61\\xb0\\x24\\x57\\x73\\x9c\\x95\\x55\\x2a\\x80\\xd7\\xf4\\x85\\x4a\\x4c\\xc6\\xf6\\x6a\\x41\\x2e\\x17\\xfa\\xec\\xbd\\xbe\\x19\\xb1\\xc1\\xe8\\xb3\\x7e\\xff\\x62\\xd3\\xef\\x5f\\xac\\x2d\\x9a\\x33\\xb5\\xcf\\xd6\\xb2\\x01\\xfb\\xeb\\xa1\\x99\\x8d\\x1f\\xa3\\x8d\\x7e\\xb8\\x7a\\xdd\\xda\\xe4\\xe5\\xd5\\x6b\\x02\\x8f\\x18\\x1b\\x1f\\xfb\\x79\\xbc\\x7c\\x6d\\x7b\\x21\\xf0\\x49\\x52\\xe8\\x4b\\x6d\\x43\\xf5\\x6f\\xc4\\x63\\x32\\xc2\\x40\\xc8\\xaf\\xa3\\xf6\\x5e\\x5f\\xde\\x91\\xab\\x3b\\x02\\x7b\\xda\\x69\\xf4\\xf2\\x35\\xbc\\xeb\\xf4\\x7b\\xf9\\x1a\\x36\\xfd\\xfe\\xba\\xdf\\xaf\\xfa\\xfd\\x1f\\x55\\x92\\xc8\\x81\\x20\\x57\\x15\\xbc\\xbe\\x1a\\xb1\\x4f\\xc9\\x24\\x79\\x0c\\xe7\\xc7\\x64\\xbd\\x86\\x52\\x77\\x66\\x3e\\x1e\\x61\\x4f\\x05\\xbc\\xa3\\x92\\xe4\\xbb\\x49\\xb2\\xa7\\x9b\\x89\\xc8\\xf7\\xf0\\x8e\\xae\\x27\\x32\\x7f\\x07\\x8f\\xb4\\x1e\\x8c\\x74\\xd9\\x77\\x83\\x3d\\xb9\\x7a\\x24\\x79\\xf2\\x68\\x7f\\xbf\\x86\\x47\\xfa\\x46\\x25\\x8f\\x10\\x01\\xfd\\x47\\xe2\\x3a\\x6d\\x25\\xe6\\x61\\xb8\\x8f\\x84\\x40\\x7b\\xde\\x7a\\x31\\x26\\xbf\\xab\\xe4\\x35\\xc9\\x0b\\x3f\\x5d\\x53\\x73\\x8f\\x6b\\xe0\\xa6\\x6b\\xd2\\xde\\x61\\x1a\\xee\\xe3\\x5b\\xeb\\x42\\x62\\x83\\xfc\\xe7\\x18\\xbb\\x10\\x0d\\x81\\xfd\\x0d\\x15\\xfd\\xfe\\xdb\\x34\\x85\\x37\\x2d\\x44\\x33\\xd9\\xa7\\x6f\\x2f\\x5f\\x13\\xd3\\xb4\\x80\\xfb\\xcb\\x64\\x35\\x49\\x7a\\xbd\\x54\\x10\\xef\\xaa\\x87\\x10\\xac\\x48\\xc6\\x6f\\x51\\x4d\\xe2\\x2d\\x69\\xb7\\xfe\\x44\\x63\\x01\\xa3\\x59\\x4f\\xde\\xa8\\x84\\x4f\\x03\\x82\\x6a\\x1f\\x52\\x90\\xa1\\x3b\\x19\\x77\\x37\\x39\\x53\\x18\\x5d\\xf9\\xc4\\xdd\\xca\\x86\\x74\\x52\\xde\\x35\\x68\\xb0\\xe9\\xe1\\x92\\xbd\\x65\\x26\\xda\\xb7\\x8d\\xfb\\x5d\\xec\\xa2\\xdb\\xc6\\x33\\xff\\x1b\\x81\\x57\\xce\\x33\\x07\\xc3\\xec\\x3d\\xe4\\x19\\xfe\\x8f\\xae\\xa0\\xca\\xee\\xfc\\x47\\x42\\xe2\\xfb\\xd8\\xc5\\x9f\\x1a\\x8d\\x15\\xd6\\xfa\\x7d\\x39\\x1e\\xbd\\x50\\x21\\xe0\\xc9\\xcc\\xe3\\xc7\\xaf\\x54\\x22\\x40\\x41\\x0f\\x67\\xd1\\x23\\xc0\\x7c\\x58\\xf2\\x44\\xb4\\x82\\x98\\x98\\xd7\\xd6\\x60\\xbc\\x18\\x25\\xd2\\x60\\x9a\\xa8\\xc4\\xe5\\xf3\\x78\\x15\\xf2\\x8a\\x1d\\x01\\xf1\\x24\\x0e\\x08\\xc6\\xd9\\x8b\\x87\\xe8\\xb6\\x76\\x65\\x6a\\xa2\\x02\\xca\\x19\\x24\\xb1\\x8d\\x66\\xf7\\xfb\\xec\\x44\\x49\\x3f\\xa9\\x06\\x9c\\x5c\\x85\\x48\\x4a\\x7e\\x2b\\x61\\x44\\xae\\xae\\xc7\\x7c\\x40\\x15\\x54\\x29\\x55\\x4d\\x1b\\x6b\\xe6\\x7a\\xbd\\x3c\\x56\\x50\\x75\\xd0\\xef\\x6a\\xc0\\xcf\\x22\\xc6\\xf6\\x8c\\xfd\\xce\\x13\\x15\\x79\\x01\\x0b\\x91\\x6b\\xc4\\xbc\\x28\\x19\\x69\\x2c\\x25\\xf8\\x65\\x40\\x6d\\x5e\\xc9\\xc3\\x47\\x92\\x49\\x86\\x3e\\xf2\\x84\\x51\\x44\\xf5\\x98\\x67\\xf4\\x57\\x4d\\x6d\\xb2\\x7c\\x68\\x5f\\xd3\\x5f\\x31\\x2c\\x7c\\x3e\\x02\\x95\\x3d\\x85\\x67\\x9c\\x7b\\xb0\\x4e\\x7d\\xeb\\x77\\x3c\\xed\\xc6\\x48\\xa5\\x7d\\x4c\\x8d\\x79\\xed\\x67\\x43\\x12\\xc7\\x72\\xb0\\xa2\\x70\\xdd\\xf6\\x57\\xa2\\x52\\xae\\xd3\\x21\\x19\\x9f\\x69\\xc1\\xb0\\x61\\xaf\\x62\\x2f\\xb0\\xe7\\x51\\xfa\\x88\\xbe\\xf5\\x38\\x7a\\x17\\x53\\x8e\\xd0\\xf4\\x2e\\xee\\x47\\xae\\xba\\xf8\\xdd\\x79\\x34\\xba\\x25\\x9e\\x8d\\x30\\x66\\xd7\\xd5\\x19\\xa4\\xb9\\xdb\\x70\\x64\\xb7\\xfc\\x32\\x36\\x21\\x1e\\xe9\\x71\\x5f\\xc5\\xb0\\x36\\x7a\\x4a\\xbe\\xc7\\x18\\x83\\xa4\\xf9\\xd2\\xe0\\xd3\\x8e\\xe1\\xfc\\xe5\\xfb\\xb0\\xe9\\x5f\\xb8\\x67\\x58\\xd6\\x32\\xab\\xb6\\x6b\\x56\\xf3\\xb9\\xc7\\xa2\\x7f\\xff\\xff\\x05\\x8b\\x7e\\x0a\\x5f\\x76\\x18\\xc7\\xab\\x18\\xe3\\xc7\\xfc\\xb6\\x29\\x19\\xb0\\x19\\xb2\\x65\\xd0\\x82\\xc3\\x1d\\x31\\x7d\\x82\\xfb\\x7d\\x7e\\x3b\\x9c\\x70\\xe4\\x0b\\x8d\\x4d\\x5f\\xbf\\xb3\\x5a\\xd0\\x8b\\xe1\\xc7\\x72\\x17\\x3e\\xea\\xda\\x78\\x28\\x31\\x04\\x66\\x02\\x57\\xc7\\xb7\\x28\\xca\\xe5\\x3e\\xd7\\xb3\\x17\\x02\\x76\\x6e\\x0c\\x44\\xed\\xf8\\xc8\\xfb\\x2e\\xde\\x47\\x62\\xfe\\x7f\\x94\\x39\\x82\\xa8\\xa1\\x06\\x9e\\xc2\\x02\\x4f\\xaf\\xe0\\x4e\\x6f\\x2b\\xca\\x26\\x55\\xae\\xa0\\xd0\\x1f\\x82\\xf2\\x89\\xc8\\x15\\xd4\\x34\\x76\\x6b\\xfd\\xd4\\x79\\x4c\\x99\\xc6\\x30\\x4d\\xa0\\xcf\\xea\\x86\\x0e\\x27\\x89\\x4c\\x46\\x04\\x8a\\x64\\x34\\x24\\x24\\x4f\\x64\\x52\\x27\\x15\\x20\\x42\\x5f\\x24\\x75\\x22\\x60\\x84\\x66\\x66\\xba\\x64\\xbf\\x2f\\x31\\x05\\x33\\x05\\x26\\x14\\x58\\xda\\x60\\xff\\xb8\\x56\\xfd\\x3e\\x8e\\x19\\x79\\x67\\x77\\x72\\xfb\\xf0\\xc0\\xa4\\x62\\x8b\\xd7\\xbc\\xea\\xf7\\x75\\xa7\\x16\\x33\\x87\\x21\\x31\\x8d\\xd9\\x9e\\xfe\\x18\\x93\\x26\\x20\\xd2\\xe7\\x31\\xe2\\xf6\\x94\\xf1\\x81\\x26\\x3e\\x72\\x1f\\xc2\\x28\\x4c\\x6b\\x5d\\x5b\\x8e\\x46\\x63\\x9e\\xbb\\xf3\\x2f\\x3b\\xce\\xa7\\x57\\x12\\x31\\x00\\x5c\\x9a\\xa2\\xd3\\xa1\\x31\\x4f\\x8c\\xd2\\xe4\\x55\\x1b\\x09\\x25\\x50\\xd2\\xe2\\x66\\x38\\x39\\x69\\xbc\\xb8\\x47\\x73\\xc6\\x7c\\x34\\x5e\\x88\\x43\\x9b\\x99\\xa3\\xa9\\xbb\\x7f\\x8a\\x3a\\x7f\\x29\\x13\\x49\\x1a\\x02\\x69\\x5a\\xc3\\x68\\x68\\x3d\\x32\\xd4\\x74\\x04\\x69\\x5a\\xe8\\x66\\x6f\\xe9\\x70\\x32\\xca\\x4b\\x02\\x32\\xc6\\xe8\\xea\\xcb\\xf6\\x08\\x2e\\x4b\\x72\\x55\\x36\\x8f\\x2b\\x5e\\xb2\\xa4\\xb8\\xe1\\xc7\\x63\\x41\\x31\\xba\\x7c\\x7d\\xe3\\xc9\\x8d\\xb9\\x59\\x83\\x62\\x07\\x32\\xb2\\x9f\\x8e\\x87\\x34\\xef\\x0c\\x49\\x68\\x34\\x89\\x57\\x1a\\x9b\\xd9\\x4a\\x56\\xbf\\xb6\\x08\\x92\\xfb\\x2c\\x76\\x0d\\x7c\\x08\\x65\\xe1\\x4f\\xa0\\x2c\\xfc\\xdf\\x47\\x59\\xde\\xfb\\xd2\\x1b\\xf0\\x87\\x6f\\x50\\x6f\\xd8\\xcb\\x3f\\xf4\\xf0\\xbf\\x17\\xf9\\x59\\xf3\\xea\\x2c\\x23\\x2c\\x06\\xb7\\xfa\\xfc\\x74\\x79\\x81\\xfa\\x76\\xe2\\x50\\x07\\x98\\xfb\\xb1\\x3c\\x30\\x3b\\x76\\x23\\x37\\xc0\\x7f\\xc7\\x23\\xf2\\xc0\\xf4\\x8a\\x78\\xf6\\x97\\x8b\\xa6\\xa1\\xc8\\xd3\\x8c\\x30\\x85\\xbb\\xb1\\xe6\\xd5\\x64\\x98\\x1b\\x58\\xf1\\x61\\xc6\\xd8\\x7b\\x59\\x56\\x48\\xe9\\x9e\\x7d\\x5f\\x5b\\x58\\x83\\x3d\\x95\\x6d\\x6e\\x16\\xef\\xf2\\xad\\xc2\\x03\\xfc\\x95\\xec\\xba\\x16\\xd4\\xd8\\x26\\x0a\\x41\\xad\\xa8\\x5a\\x03\\xa1\\x4e\\xf0\\x20\\x65\\x3c\\x5e\\xe9\\x37\\x76\\x51\\x8b\\xcd\\xf7\\x1d\\xdf\\xf5\\xdf\\x26\\x46\\xab\\x58\\xa3\\x9e\\x4b\\x2f\\x13\\xdf\\xa9\\xf0\\x41\\x52\\x87\\xd8\\xb8\\x78\\xe3\\x51\\xb4\\xfc\\x5f\\x64\\x6c\\x88\\xe4\\xf0\\x0d\\x4a\\x35\\x21\\xad\\xd0\\x10\\xed\\x60\\xe2\\x8e\\xb3\\x01\\xbf\\xba\\xc6\\xd8\\xe3\\x2c\\xe5\\x57\\xd7\\x4d\\xae\\x6e\\x74\\x91\\xdb\\xb8\\x80\\xc9\\x6e\\x72\\x97\\xe2\\x8a\\x47\\x4b\\xf0\\x79\\x8c\\x83\\x0c\\xcd\\x06\\x8f\\xfe\\x62\\x0f\\xb0\\x55\\x5d\\xcd\\xd5\\xcd\\xe8\\x2f\\xc3\\x8e\\xbb\\xa2\\xd0\\xc4\\xdf\\xbd\\x54\\xe5\\x3f\\x6d\\x03\\xd7\\xff\\x61\\x1a\\xe0\\xd9\\x7e\\x40\\x59\\xb6\\xba\\xba\\xce\\x13\\x75\\x7b\\xfd\\x1f\\xc3\\xe3\\x51\\xdd\\xfc\\xe7\\xd0\\xa8\\x20\\x99\\xac\\xc8\\x5d\\xca\\x5f\\x4f\\x7d\\xf0\\x28\\xc3\\xcd\\x47\\x57\\x82\\x44\\x64\\x45\\x3d\\x4f\\x54\\xb6\\x33\\x5e\\xf5\\x40\\x65\\x7b\\xfb\\x8b\\xc1\\x10\\xee\\x94\\x0d\\xd7\\xe0\\x88\\x05\\x7d\\x2e\\x05\\x0f\\x4a\\x4e\\xf8\\x86\\x8f\\x85\\x53\\x5e\\xe6\\xd9\\x0e\\x78\\xb6\\x0f\\xfc\\x6f\\x49\\x47\\x63\\x79\\x53\\x8d\\x65\\x9a\\x92\\xb3\\xf5\\x25\\x30\\x02\\xc2\\x29\\xe7\\xba\\xfa\\xd1\\x5a\\x7e\\x17\\xaf\\xe5\\x73\\x7d\\xec\\x27\\x2a\\x1f\\x36\\xbf\\x5b\\xa4\\x4d\\x3c\\x14\\x35\\x57\\xab\\x35\\x9f\\xf7\\xe0\\xf7\\x8f\\xc7\\xdc\\xa2\\x7a\\x16\\x4c\\x46\\x4a\\x32\\xc1\\x11\\xf1\\x3f\\x5b\\xb4\\xc3\\x7b\\x11\\x3a\\xbb\\x80\\x6d\\x77\\x24\\x67\\xd2\\x16\\x75\\xf1\\xc8\\xab\\x87\\xe7\\x35\\x2b\\xda\\x68\\x1d\\xca\\x4c\\x0d\\x8f\\x3f\\xf8\\x8d\\x09\\x89\\xce\\xb5\\xcb\\x87\\x82\\x89\\x9e\\x09\\x1d\\x7a\\x36\\x3e\\xa8\\xd5\\x62\\x79\\x23\\x36\\x54\\xdf\\x58\\x07\\x44\\xc9\\xd5\\x35\\xf8\\xd3\\x40\\x5b\\x2c\\x3b\\xeb\\xd8\\x87\\x84\\x33\\x12\\xe7\\x7b\\xc2\\x62\\x10\\xb7\\x4d\\x4c\\xf9\\x78\\xd2\\x9e\\x13\\x73\\xb6\\x82\\x8f\\x5f\\x72\\x75\\xfd\\x6f\\x22\\x9d\\xa3\\x18\\xe9\\x44\\xae\\xb0\\x95\\x27\\xb6\\xc9\\x36\\x9f\\x83\\x14\\xdc\\xf0\\x0f\\x52\\x70\\xa7\\xe4\\x55\\x67\\x8f\\xaf\\xf4\\xe2\\x46\\xc2\\x79\\x54\\x51\\x35\\x3e\\xb1\\xb1\\x9d\\x53\\x0f\\xf0\\x7a\\x1b\\x5f\\xb5\\x99\\xf6\\xdd\\xf2\\x4e\\xf1\\x1b\\xed\\x30\\x5a\\x07\\x87\\xb5\\xe4\\x6c\\x46\\x59\\x55\\xa1\\xb4\\xd5\\x4b\\x67\\x7f\\x48\\x58\\xe4\\xfb\\xd8\\x57\\xf5\\x3e\\x09\\x34\\x85\\xc0\\x67\\x41\\x83\\xf0\\x59\\x75\\x3c\\x0e\\xd1\\x96\\xb7\\xca\\x7b\\xbd\\x86\\x90\\x73\\xa1\\x54\\x23\\xbc\\x6f\\x1c\\xc1\\x79\\xd6\\xea\\xc1\\xc5\\x1f\\x89\\x3d\\xea\\x79\\xab\\xca\\x32\\x1f\\x42\\x9d\\xdb\\xdd\\x07\\x95\\x0f\\xe1\\x3e\\x3f\\x7b\\x42\\x1a\\xe0\\xd4\\x06\\xa5\\x35\\x91\\x48\\x9c\\x86\\xf4\\x74\\x06\\xb5\\xfe\\x53\\x9e\\x95\\x36\\x22\\x48\\x32\\xd1\\x46\\xca\\x71\\x95\\xa6\\xc1\\xce\\x46\\x9d\\x5d\\x8e\\xa7\\x5c\\xde\\x54\\x84\\x8c\\xeb\\x69\\x35\\xa3\\xa5\\x1b\\x93\\xf3\\xa2\\xd9\\x06\\x6c\\x55\\xfb\\xd8\\xa7\\xba\\x4e\\x70\\x2a\\x16\\x42\\xd1\\x8d\\x51\\x6f\\xd0\\xd8\\xcc\\x6c\\x9d\\xcd\\xcc\\xdc\\xba\\x53\\x5e\\xd1\\x6d\\x6c\\x74\\x24\\xe8\\x6f\\x89\\xc6\\x98\\xe2\\x2d\\xd7\\xcd\\x4e\\x0e\\x8f\\xf9\\xcf\\x2a\\x99\\xc3\\x1c\\xdb\\x81\\x05\\x81\\x55\\xbe\\xb0\\x13\\xbf\\x5c\\x35\\xf9\\xe1\\x31\\x9f\\xb7\\xbc\\x15\\x2e\\x5c\\x10\\xb4\\x55\\xbe\\x6a\\xa0\\xd0\\xf3\\x11\\xde\\xb8\\x0d\\x67\\x83\\x52\\xf5\\xe7\\xd5\\x03\\x86\\x4e\\x80\\x07\\xfa\\x52\\x25\\x4b\\x02\\x1b\\xfa\\x8b\\x4c\\x1e\\x40\\x66\\x3b\\x10\\xd9\\x23\\x0c\\x61\\xf4\\x97\\x21\\x81\\xb5\\x4b\\xdd\\x83\\xc8\\x56\\xf0\\x9f\\x43\\xb8\\xfe\\x8f\\x21\\x19\\x6f\\x0c\\xba\\x77\\xc3\\xb2\\x12\\xd5\\x13\\x4b\\x6a\\x53\\x80\\x67\\x25\\xd5\\xad\\x69\\x0c\\xf0\\x96\\x65\\x35\\x66\\xd7\\x14\\xbf\\x81\\x67\\xb5\\xce\\x5c\\xfb\\xda\\x26\\xba\\x8a\\xa2\\x6b\\x5f\\x5b\\x99\\x02\\xa6\\xf6\\x3d\\x66\\xdf\\xd3\\xb5\\xad\\x7d\\x4f\\x97\\x04\\x9d\\x30\\xa3\\x87\\xed\\xb1\\x46\\xed\\x98\\xfa\\x91\\x2d\\xb6\\x73\\x73\\x91\\x5b\\xfb\\x82\\x6f\\x2c\\xa8\\x73\\x90\\xd6\\x6f\\x56\\x20\\x69\\x96\\x1a\\x56\\x6e\\x09\\x86\\x48\\xd2\\x98\\x13\\x37\\xd2\\xa7\\xaf\\x6a\\xb1\\x36\\x10\\xd1\\x63\\x83\\x5b\\x83\\xf7\\x78\\x1c\\x19\\x41\\x51\\x6e\\x30\\xc8\\xa7\\x8e\\x22\\xa3\\xe6\\x9e\\x2d\\xd1\\x16\\xf9\\xec\\x73\\x59\\xc1\\x43\\xca\\xcc\\x59\\x02\\xa1\\xf7\\xe4\\x74\\xaf\\x34\\x6d\\xa1\\x37\\x74\\xfc\\x77\\x99\\x08\\x40\\x0f\\x23\\xee\\xa4\\x7f\\x2e\\x13\\x61\\x23\\x0a\\x8f\\xe7\\xc1\\x6e\\xbf\\x9c\\xf0\\x6c\\x97\\xb7\\xdc\\xd0\\xf1\\x6c\\x37\\x90\\xd9\\xe3\\xd5\\x75\\x6e\\x7f\\xd9\\x36\\x56\\x74\\x9e\\xea\\xaf\\xd3\\x05\\xd3\\x47\\xe8\\xb0\\xd3\\xc5\\x61\\x9f\\xf3\\x6c\\x1f\\xb9\\xd1\\x2e\\x8d\\x8f\\xf4\\x39\\x86\\x40\\xd5\\x59\\xc6\\x01\\xdc\\xca\\xf9\\x4c\\xe7\\xd9\\x3e\\x95\\xd9\\xaa\\x69\\x9a\\x44\\x91\\x1c\\x0d\\x83\\x63\\x1f\\xbf\\x4e\\x7b\\xb1\\xe9\\xee\\xe3\\x99\\xd8\\xdd\\x7a\\x6e\\x82\\xb2\\xac\\x34\\x34\\x9d\\xe4\\x55\\xc2\\xb3\\x40\\x6e\\x19\\xde\\x64\\x3d\\xb0\\xd6\\x74\\x30\\x24\\x71\\xb9\\x5a\\x13\\x8b\\x03\\x96\\x59\\x8e\\xd1\\x5c\\xc8\\x84\\x67\\x68\\x1e\\x33\\x88\\x6a\\xdf\\x0f\\x12\\xef\\x38\\xaf\\x8a\\x9f\\x3a\\xdf\\x9a\\xa9\\x78\\x4f\\xc6\\x82\\x7e\\xa7\\x57\\x1c\\xa4\\xfe\\x2f\\x75\\xeb\\xdf\\x69\\x0a\\x12\\x6a\\xfd\\xbf\\x26\\x50\\x9d\\x79\\x18\\x8b\\x5d\\xa2\\xae\\xae\\xc1\\xbf\\x92\\xf1\\x13\\x3c\\x48\\x44\\x2a\\xf1\\x49\\x6d\\xa7\\x16\\x69\\xad\\x53\\x35\\x15\\xdd\\x5d\\x3c\\x7d\\x02\\x0a\\xa8\\x31\\x06\\x79\\x9c\\x7e\\x3e\\xbc\\xaf\\xa4\\xc2\\x79\\x0b\\x1c\\x88\\xd6\\x35\\x29\\xa8\\x4a\\xdb\\x29\\x35\\xe5\\x9d\\x94\\x92\\xba\\xf8\\x4b\\x03\\x11\\x2d\\xcc\\xa0\\x6a\\xb7\\x35\\x16\\xe7\\xf0\\x8b\\xa4\\xc0\\xa9\\xa5\\x26\\xca\\x93\\xc6\\x09\\xcf\\x21\\x19\\xc6\\xc9\\x67\\xea\\xa2\\x3d\\x45\\xab\\xdf\\xb4\\xef\\x41\\xc0\\x19\\xff\\xae\\x12\\x75\\x99\\xdc\\xa9\\xab\\xae\\x1e\\x85\\x63\\x62\\xa7\\x5f\\xaa\\xd6\\x13\\x6d\\xa0\\x0c\\x36\\x73\\x3c\\x0e\\x8d\\x4d\\xc9\\x7b\\x6e\\x7a\\xf7\\xed\\xee\\x68\\x07\\x7d\\x57\\x7c\\x37\\x0e\\xda\\xdc\\x31\\x66\\x60\\xd8\\x1c\\x03\\x43\\x0a\\x8e\\xbd\\x6a\\x68\\x27\\xaa\\xf9\\xc4\\x16\\x53\\xe4\\x92\\xe7\\xa8\\x0c\\xa1\\x8b\\x5f\\xf2\\x98\\xbc\\x3b\\x1d\\x9d\\x55\\xfb\\x3c\\x3f\\x10\\x4f\\xfe\\x29\\x3d\\x86\\x27\\x87\\xf4\\x9e\\x31\\x99\\x62\\xdc\\xc8\\x59\\x52\\x1c\\x4b\\x1b\\x4e\\x9d\\xb7\\x05\\xe9\\x6e\\xd1\\xe0\\xb5\\xf2\\xbe\\x45\\x73\\x7f\\x75\\x2a\\x72\\xc9\\x52\\xee\\x29\\x92\\x7d\\xee\\xaf\\xa8\\xcd\\x71\\x14\\x4a\\xa1\\x9b\\xc9\\xab\\xe6\\xa4\\xfb\\xb0\\x37\\x91\\x1e\\x81\\xe7\\x5c\\x77\\x06\\xea\\xd9\\xcc\\x4f\\x6f\\x31\\x23\\x41\\x31\\xc3\\x57\\x7c\\x7f\\xc3\\x61\\x08\\xc7\\xe3\\xd0\\xf7\\xa1\\x5b\\x70\\x9e\\xcd\\xfd\\xa8\\x5f\\x19\\x1d\\xcd\\xd0\\xae\\xa1\\xd3\\x10\\x66\\x32\\x03\\x33\\x2d\\xc4\\xac\\x1c\\xc4\\xb4\\x36\\x20\\xa7\\x40\\x58\\x39\\xef\\x5c\\x1f\\xa8\\xde\\xb5\\x9c\\x3d\\x51\\x83\\xe8\\x2a\\xbc\\xc2\\x43\\xcd\\x17\\xf9\\x61\\xce\\xeb\\xf9\\xb6\\x2c\\xea\\x9c\\x37\\x4d\\x3b\\xd4\\x03\\x8b\\xf5\\xff\\xe6\\x6a\\x37\\xae\\x9c\\xe5\\x58\\xd5\\x32\\x74\\x45\\x82\\xf4\\x43\\xaf\\x67\\x24\\x15\\x22\\xc0\\xe1\\x1c\\x3e\\xa7\\xdb\\x8d\\x8d\\x34\\xab\\x38\\x18\\xac\\xfd\\x4a\\x8c\\x3d\\x90\\x8b\\x23\\x89\\x93\\xfe\\xba\\xe6\\x27\\xd3\\x3d\\x13\\xbd\\x02\\x0e\\x78\\xba\\x5e\\xa1\\x3f\\xb9\\xca\\xcc\\x5e\\x34\\x94\\x83\\x3c\\x8f\\x5d\\xb6\\xfc\\xc7\\xf0\\x73\\x68\\x6f\\xbf\\x7f\\xce\\x49\\xaf\\xa6\\xc6\\xa3\\x20\\xdb\\x51\\x3d\\x7d\\xb0\\xa9\\xf2\\x94\\xb4\\xa0\\x6c\\x30\\x1a\\x8b\\x5b\\x3a\\x1c\\x8b\\xc1\\x20\\xc0\\x9c\\xea\\x49\\x4c\\x55\\x20\\x2a\\x60\\xbd\\x8f\\x63\\xd0\\x63\\x6b\\xf7\\xfc\\xd4\\xd3\\xbc\\xb2\\xe7\\x64\\xe1\\xce\\xc9\\xb6\\xa1\\x67\\x1e\\x7a\\x31\\x33\\xe7\\x63\\x51\\x8b\\x8d\\x39\\x1d\\xcb\\x86\\x32\\x34\\x6a\\xfb\\x24\\x59\\x92\\x0f\\xb1\\x74\\xa2\\x78\\xaf\\x74\\x09\\x3c\\x78\\x88\\x98\\x0f\\x6c\\x00\\xca\\xd5\\xc0\\x44\\x74\\x5c\\x0c\\xe6\\xce\\x6b\\x2c\\x6c\\x07\\x2b\\xcf\\xe1\\x21\\x0d\\x63\\x09\\x87\\x0e\\x1e\\x2c\\x66\\x68\\x1f\\x2c\\x5b\\x56\\xe4\\x20\\x5d\\xcc\\x0f\\x66\\x63\\x7e\\xc4\\x73\\x3f\\x1b\\xd4\\xa3\\x21\\x1a\\x0f\\x01\\xa9\\x9f\\xa0\\x88\\x61\\x65\\xd0\\xb9\\x38\\x40\\x31\\x52\\x55\\x5e\\x8e\\x72\\xa8\\x3f\\x88\\x13\\x32\\xab\\x4c\\xe6\\x83\\xf7\\x89\\x27\\xf7\\x8e\\x0f\\x46\\xa7\\x61\\x78\\x5b\\xcf\\x35\\x1e\\x58\\x4d\\xf0\\xb9\\x2b\\xe9\\x26\\x5a\\x44\\xb1\\xab\\x6a\\xbd\\x31\\x17\\xb2\\xdf\\xbf\\xa8\\x8e\\xc7\\x8b\\xe2\\x78\\xbc\\xa8\\x8f\\x47\\x7e\\x33\\x3c\\x1e\\x13\\xe1\\xae\\xa7\\x68\\x3b\\x69\\xb1\\xcc\\x18\\x63\\xb1\\x5e\\x83\\x68\\xb9\\x69\\x89\\x55\\xd4\\x1d\\xdb\\x26\\x72\\xd1\\x72\\x46\\x83\\x5d\\x9c\\x5e\\x7e\\x0e\\x12\\x2a\\x5d\\x3b\\xbe\\xbe\\x22\\xf8\\x3e\\x11\\xb1\\x3d\\x27\\x46\\x0c\\xa9\\x41\\x12\\xb4\\x64\\x0c\\x31\\x8c\\x0e\\xc6\\x1f\\x86\\x9d\\x43\\xf1\\x84\\x82\\xe9\\xb8\\xd0\\xf7\\xa5\\x08\\xf7\\x45\\xbc\\xe7\\xbe\\x14\\xc4\\xc7\\x05\\x97\\xd1\\x1a\\xce\\x1b\\x4d\\x1a\\xf5\\xfb\\xd2\\xd0\\x30\\x7e\\x6d\\xe6\\x1d\\xbb\\x7f\\xa9\\xbf\\xa3\\xb5\\x12\\xad\\xb5\\x62\\xdd\\xb5\\x12\\xa7\\x6b\\xf5\\xe1\\x13\\xc4\\xdf\\x43\\x55\\x38\\xba\\xb7\\xfd\\xbe\\x15\\xc6\\x9c\\xfd\\xac\\xab\\x81\\x33\\x5c\\xbf\\xc8\\x50\\xbe\\xcc\\x76\\x50\\x66\\x7b\\x02\\xc1\\xc8\\x9d\\x34\\xac\\x0b\\x4e\\x3f\\xc7\\x49\\x24\\xe4\\x80\\x5f\\x6e\\x03\\x3e\\x0c\\x5e\\x2b\\xca\\x03\\x67\\xf8\\x24\\x36\\xd5\\x38\\x1c\\xf3\\x36\\xce\\x30\\x24\\xce\\x5f\\xe0\\xd8\\x6f\\x3e\\xcb\\x5c\\x18\\x1e\\xf6\\xd4\\x94\\xd0\\xf2\\x80\\x69\\x54\\x3c\\xf6\\x84\\xe1\\x03\\xcd\\x3c\\xe5\\xf7\\xe2\\xf4\\xd6\\x0b\\xa8\\xdd\\xad\\x37\\xc2\\x9d\\x0b\\x2f\\xfb\\x68\\x0f\\xbd\\x7c\\xcf\\x41\\xab\\x89\\x0d\\x14\\xe1\\x58\\x00\\x7c\\x99\\xc8\\x0f\\xee\\xbd\\x1d\\xcc\\xb4\\x76\\x3a\\xa9\\x50\\x62\\xd8\\x42\\x5c\\xf3\\xcf\\x2d\\x94\\x25\\x87\\x82\\xb2\\x16\\xa5\\x2f\\xac\\xe9\\x91\\xb7\\xb1\\x0f\\xd0\\xb7\\xcc\\x5a\\x60\\x7c\\x1c\\xc1\\xed\\xf2\\x14\\x6e\\xb3\\x00\\xa9\\x07\\xc5\\xd5\\xb5\\x03\\xd6\\x03\\x39\\x98\\xdb\\x90\\xc2\\x16\\x6c\\x17\\x1e\\x68\\x9b\\x8c\\x36\\xdc\\x66\\x60\\x47\\x04\\x43\\x18\\x48\\x98\\xbb\\x2b\\x57\\x1a\\xf8\\xdc\\x58\\x4f\\x95\\xe1\\x98\\xc5\\x91\\x94\\x9b\\xe6\\x9f\\x86\\xef\\x5b\\x17\\x0b\\x5e\\x94\\xaf\\xac\\xc8\\xfe\\x9f\\x31\\xe3\\x37\\x0a\\x3b\\x69\\x2c\\x26\\x58\\x3b\\x02\\xa5\\x8f\\x36\\xd0\\x83\\xe8\\x89\\x8f\\xab\\x85\\xbb\\x3f\\x8a\\xad\\x77\\xa6\\xb3\\x53\\x9b\\x9d\\x61\\xd3\\x45\\x8c\\x2e\\x46\\x0d\\x04\\x02\\x22\\x1f\\x82\\x65\\x44\\x9f\\x6c\\x95\\xee\\xe9\\x03\\x7a\\x05\\x10\\xa3\\x03\\x9d\\x37\\xd7\\xf2\\x8e\\x3b\\xdb\\x94\\x5f\\x43\\x34\\x11\\x13\\x35\\x49\\xef\\x41\\x3e\\x1a\\x06\\xdb\\x39\\x8c\\x0f\\xe8\\xcd\\x18\\xff\\xd4\\x34\\xd1\\x02\\x1a\\x83\\x1a\\x7a\\xe8\\x85\\xb5\\x31\\x1b\\xd3\\xcb\\x7b\\x91\\x45\\x54\\x0f\\x7a\\x2d\\xde\\xa1\\x2d\\x31\\xb7\\x79\\xe6\\xda\\xb4\\x53\\x6d\\x2f\\xde\\xe6\\x86\\xc6\\x18\\x56\\x6c\\xe7\\xa2\\x17\\xb4\\xe7\\x43\\x2b\\x7d\\x22\\xe9\\x61\\xcd\\xcb\\x92\\x4b\\x36\\x17\\x95\\x5e\\x69\\xb1\\x5e\\x8b\\x4a\\x4f\\xcf\\x4c\\x0c\\xd5\\xb8\\x64\\x3e\\x62\\x9f\\x36\\xf0\\x54\\x19\\xf6\\xa9\\x2d\\xf5\\xe7\\x61\\x03\\x6b\\x5e\\x6d\\x15\\x3b\\x29\\xf4\\x67\\xf6\\x59\\x54\\x68\\x25\\xb6\\xf5\\x49\\x91\\x4f\\xff\\xcc\\xfe\\x64\\xcb\\x5c\\x7f\\xd6\\xc0\\xa2\\xd8\\x9f\\x14\\xf9\\xcb\\x9f\\x3f\\xf3\\x65\\x3e\\x1d\\x36\\xf0\\xc8\\xd8\\xdb\\x50\\x68\\x64\\xbb\\x1a\\x7e\\xf6\\x17\\x5f\\xea\\xb3\\x06\\xd6\\xa2\\x52\\xab\\x93\\xa6\\xae\\xff\\x7c\\xfd\\x17\\xf6\\x67\\x37\\xbd\\xeb\\x06\\xfe\\xb5\\x2d\\x6a\\xc5\\xea\\x93\\xe6\\xfe\\xe3\\x2f\\x7f\\xf9\\xcc\\x17\\xfc\\xac\\x81\\x3d\\x2b\\xce\\x8c\\x7d\\xf4\\xa7\\xcf\\xd8\\x7f\\x34\\x0d\\xfc\\xe6\\x2d\\x82\\xde\\xb2\\xbd\\x4c\\x3e\\x91\\x91\\x2d\\xcf\\xcf\\xed\\x90\\x47\\x6a\\xc0\\x82\\x20\\xe6\\x57\\x19\\x59\\xbf\\xb0\\x27\\xac\\x5f\\xb2\\xbb\\x62\\x51\\x6c\\x34\\xfc\\x3d\\xa0\\xe6\\x49\\x9d\\x57\\x60\\xac\\x55\\x05\\x70\\x29\\xfe\\xce\\xd8\\x5b\\xbd\\x6a\\xd2\\x20\\x96\\xba\\xc4\\xdf\\x36\\xca\\xb0\\x6d\\x0a\\xaf\\x40\\xdc\\x73\\x7d\\x06\\x65\\xef\\x0a\\xbd\\x01\\x54\\xf8\\x46\\xff\\x6a\\x74\\x47\\x0b\\x7a\\x62\\x40\\x54\\x4d\\xb8\\xb5\\x2d\\x28\\xa0\\x42\\x55\\x41\\xf3\\x11\\x0c\\x0d\\x0a\\xa3\\x0f\\x9e\\x08\\x6c\\xaf\\xa7\\x77\\xa7\\x77\\x41\\xa9\\x38\\x1e\\x2f\\x9e\\xab\\x44\\x92\\x7e\\xff\\x42\\xa3\\x73\\x72\\xc2\\x0d\\x17\\xe0\\x6f\\x4b\\xf4\\x04\\x90\\xc7\\x9f\\x3d\\x3b\\x91\\x1e\\x48\\x42\\x20\\x2d\\x22\\x69\\xdb\\xbf\\xba\\xd2\\xb6\\x67\\x82\\xfe\\x26\\x63\\x0e\\xb4\\x11\\x8a\\xfd\\x26\\xbd\\x89\\x94\\x22\\x63\\x79\\x23\\x06\\xa3\\x71\\x9a\\xca\\xf0\\x6e\\x7e\\x22\\xa7\\xbf\\xc9\\xa9\\x9c\\xcd\\x50\\xbb\\x04\\x77\\x76\\x62\\xff\\xe7\\x56\\xbf\\xf9\\xf5\\xf3\\x5f\\xef\\x7e\\x7a\\xfe\\xd5\\x97\\x77\\x2f\\xbf\\x7b\\xf3\\xe5\\xd7\\x5f\\xfe\\x68\\x14\\xc8\\xcc\\xae\\xf7\\xfb\\x41\\x22\\x91\\xf0\\x01\\x23\\x57\\x89\\xb8\\xb4\\x82\\x52\\x72\\xe3\\x6d\\xb1\\x9e\\x61\\x1f\\x4d\\xf8\\x10\\x83\\xd1\\x2c\\xcc\\xe6\\x5b\\xcf\\x63\\x43\\x51\\xe1\\xc1\\x86\\x95\\x8c\\x34\\xff\\x0e\\xa5\\xc8\\x2b\\x58\\x71\\xf4\\xc4\\xa6\\x71\\x72\\x46\\xc6\\x6a\\xca\\xa7\\xd5\\xec\\x96\\xb2\\x89\\xfe\\x9f\\xf3\\xa9\\x98\\xcd\\xe8\\xc5\\xd0\\xba\\x8d\\x55\\x53\\x86\\x5f\\xbe\\x93\\xaf\\x4f\\x18\\x79\\x53\\x3d\\xe9\\x43\\x83\\xc8\\x6d\\xc7\\x41\\x96\\x5e\\xc1\\x42\\x63\\x74\\xe8\\x4f\\xaa\\x20\\x35\\x65\\xd3\\x62\\x06\\x62\\x5a\\xcf\\x68\\x01\\x55\\x4b\\xff\\xa1\\xb6\\x82\\xbd\\x8b\\x51\\x50\\x4b\\x1d\\x1a\\x67\\x08\\x7c\\xf2\\x3e\\xc4\\xda\\x1f\\x61\\x49\\x53\\xe1\\xf7\\x9d\\x4d\\x87\\x4e\\x87\\xb5\\xd2\\x08\\x27\\x9b\\xb2\\xae\\xbe\\xaa\\xf3\\x4e\\x6d\\x1d\\x53\\xcb\\x71\\x7d\\x43\\x8b\\x71\\xad\\x5b\\x29\\x16\\x8b\\xa4\\x86\\x11\\x54\\x84\\x94\\x94\\xa3\\xeb\\x2b\\xb4\\xde\\x49\\xd8\\xb4\\x9c\\x65\\x38\\x50\\x7a\\x11\\xd4\\xf5\\x98\\xc1\\x7b\\x05\\xaa\\x40\\x59\\x3d\\xc6\\x7f\\xfc\\x01\\x8b\\x36\\xf4\\x9b\\x4f\\xd1\\x4b\\x08\\x7a\\x45\\x37\\x2f\\xc8\\x74\\x06\\x45\\x59\\xa2\\x53\\x74\\x53\\x6c\\x5b\\x71\\x45\\x7b\\x8b\\x62\\xdf\\xb3\\x09\\x38\\x90\\x9f\\x75\\x6a\\x4b\\x34\\x69\\xf4\\x3e\\xa5\\xde\\x14\\x93\\x50\\xe9\\xb7\\xaa\\xe4\\xbf\\xb3\\x05\\xbd\\x18\\xf9\\x80\\xaa\\xf6\\x36\\xc7\\x71\\x0e\\xba\\x21\\xb7\\x14\\x5f\\x33\\x34\\x32\\xd2\\x3f\\xe8\\xa1\\x21\\x50\\x59\\x4e\\x86\\x5d\\x74\\xf4\\x19\\x21\\x44\\x76\\x67\\x9c\\x42\\x64\\x36\\x19\\x03\\x51\\x30\\x32\\x96\\x2a\\xf1\\x21\\x25\\xbf\\xc2\\x07\\x53\\x6a\\x5a\\xdf\\xfc\\x4a\\x08\\x39\\x19\\x8b\\x03\\x43\\x16\\x16\\xd4\\x16\\x1a\\xf1\\xcc\\x3a\\x67\\x0c\\x30\\x89\\x67\\xe1\\xa3\\x01\\xa3\\x22\\x62\\xa6\\x40\\x4e\\x67\\xcd\\xb2\\xf0\\x71\\xc6\\x66\\x25\\x52\\x58\\x41\\x78\\xf3\\xab\\xb4\\x8e\\x39\\x48\\xe3\\x6c\\xb4\\xf7\\x62\\xab\\x12\\xbb\\x71\\x59\\x3b\\xf1\\x23\\x37\\xf1\\x63\\xe4\\xa3\\x6d\\x7d\\xac\\xe8\\x6c\\x57\\x68\\xe5\\xb0\\x66\\x99\\x3e\\x03\\xc7\\x23\\x1e\\x02\\x6f\\xab\\xe2\\x8c\\x14\\x22\\x95\\xb8\\x22\\x56\\x89\\xab\\xcf\\xa9\\xc4\\xf9\\x1b\\x8d\\x8a\\x26\\x85\\x57\\x69\\x41\\x5e\\x22\\x1a\\x01\\x7a\\x9e\\xb6\\x30\\x1a\\x65\\x84\\x40\\x1d\\x15\\x2b\\x76\\xba\\x58\\xc4\\xa9\\xb7\\xb6\\x2a\\x84\\x34\\x45\\xbf\\x5f\\x1f\\x8f\\x49\\x99\\x98\\xd8\\xd5\\x06\\x8f\\xb2\\x1d\\x13\\x38\\xa7\\xad\\xd4\\x33\\xcb\\x65\\x12\\x0d\\x3a\\x22\\xc5\\xb6\\x9e\\xb3\\xe3\\xb1\\x4c\\x3a\\x72\\x62\\xd4\\x2d\\xfb\\x35\\x11\\x41\\x16\\x2c\\xc8\\x44\\xe4\\x69\\x00\\xfa\\x5f\\x14\\x4a\\xef\\xf8\\x63\\x42\\xf4\\xe5\\x97\\xf4\\x57\\xf3\\x54\\x98\\xc2\\x92\\x4c\\xa4\\x2e\\xcc\\xaa\\x45\\xb7\\x68\\x3a\\xb2\\xba\\x73\\xd1\\xd4\\xe5\\x00\\x8d\\x07\\xd7\\xc5\\x2e\\xcc\\x54\\xa4\\x23\\x4d\\xe2\\x9e\\xcc\\xad\\x1d\\xb1\\xd6\\xe5\\xbe\\xe1\\x6b\\x26\\x55\\xb1\\xde\\x38\\x4d\\x44\\xf6\\x64\\x0c\\x46\\xe0\\x2e\\xeb\\xbb\\x2f\\xbf\\x7e\\xde\\x0e\\xcf\\x18\\x2c\\xfc\\x9d\\x67\\x45\\xef\\x25\\x41\\x4d\\x55\\x00\\x6e\\xa4\\x2d\\x65\\xff\\x43\\x66\\x34\\x6b\\x66\\x4f\\xda\\xfc\\xad\\x04\\x41\\xa3\\x5d\\xa9\\xec\\x7e\\x4c\\xd4\\xd9\\x79\\xe5\\xb8\\xd3\\x46\\xf0\\x9d\\xc4\\xb6\\xa6\\x61\\x8b\\x45\\x18\\xb8\\x59\\xe4\\xa0\\xd9\\x76\\x3c\\x0a\\x3d\\x11\\xb3\\xca\\x41\\xc3\\x4d\\x27\\x8b\\x68\\x62\\x41\\x65\\x13\\x15\\xd2\\x0a\\x5a\\x30\\x14\\x98\\x58\\x31\\x5d\\x88\\x97\\x8e\\x80\\x92\\xdb\\xbb\\x92\\x54\\x59\\xb1\\x55\\xe2\\xa7\\xb7\\x7c\\x33\\xf9\\x97\\x4c\\xb8\\xae\\xab\\x61\\x26\\x38\\xb5\\x36\\xa3\\xf8\\xe6\\x37\\xf3\\x45\\x61\\x7c\\x5b\\x24\\x92\\x90\\xbc\\xfb\\xf0\\x80\\x30\\xac\\x0c\\x8f\\x17\\x78\\xd6\\x85\\xbc\\x8d\\xd1\\x04\\x4e\\xc6\\x32\\xb0\\x31\\x38\\xc5\\x97\\x1b\\x65\\x0d\\x72\\xca\\x67\\xfe\\xd9\\x0f\\x37\\x3c\\x5b\\xf0\\xe5\\x32\\x11\\x18\\x6f\\xf5\\x96\\xb2\\xc1\\xc8\\xfb\\x95\\x88\\xde\\x7b\\x3e\\x69\\x75\\x91\\x0f\\x67\\xfa\\xe1\\x29\\x5c\\xc0\\xbf\\xb3\\x53\\x33\\xca\\xa4\\xe1\\xa5\\xa8\\xcc\\xf3\\x15\\xdc\\x86\\xf5\\x34\\xfe\\x69\\xfc\\x38\\xe1\\xc2\\xb5\\xe4\\xfd\\x6e\\xae\\xac\\x8d\\x03\\xa5\\x23\\xe0\\x11\\xa6\\xe4\\x62\\xa0\\x9a\\xf9\\xfd\\x26\\xa7\\x6c\\xe6\\xe6\\x18\\xa1\\x2e\\x4c\\x8f\\xd6\\xf4\\x41\\x1c\\x3d\\xa4\\x10\\x66\\x1b\\xea\\x4c\\x1a\\x82\\xff\\x9c\\x43\\x28\\x40\\xb4\\xa3\\x68\\xcd\\x84\\x34\\x71\\xd5\\xae\\x58\\xc7\\x47\\x3f\\xb5\\x91\\x5b\\xd9\\x89\\x55\\x44\\x74\\x91\\x4e\\x34\\xeb\\x2c\\x09\\x3f\\x1d\\xa2\\xdc\\x16\\xd5\\xd2\\x9d\\xd5\\xee\\x68\\xc0\\xf3\\xe4\\x89\\xe2\\xa3\\x19\\x19\\x70\\x72\\x75\\x8d\\x97\\xe8\\x6c\\x89\\xd6\\x3d\\x95\\xed\\x96\\xab\\x3c\\xa9\\x06\\x1f\\xaa\\x77\\x3d\\x23\\xe4\\xea\\x9a\\x78\\x2d\\x0a\\x97\\x71\\xf3\\xe9\\x24\\xfb\\x53\\x9e\\x5d\\xff\\x69\\x2c\\xe8\\x77\\x2a\\x11\\x80\\xf6\\x59\\x52\\xff\\x96\\xe6\\x37\\x8b\\x10\\x03\\xa3\\x0b\\x27\\x50\\x17\\x4e\\xc2\\xb2\\xd0\\x78\\x49\\x3e\\xba\\xd2\\x80\\x2d\\x95\\xa4\\x69\\xa2\\xbb\\x7c\\x26\\x34\\x91\\x7b\\x94\\x3a\\xe6\\x28\\x88\\xfb\\x3a\\x78\\x22\\xa9\\x30\\xf0\\xa4\\xa0\\xd2\\x5e\\xc4\\x7f\\xc9\\x44\\xfa\\x13\\xaa\\xf7\\xe6\\xdc\\xa5\\xe3\\xa8\\xee\\xfb\\x6d\\x22\\x83\\x9d\\xcf\\x88\\x40\\x69\\x71\\x7f\\x63\\x2d\\x29\\xa3\\xa7\\x1f\\xe6\\xf4\\xb9\\x4a\\x4a\\x72\\x3c\\x5e\\xe8\\x07\\xbc\\x84\\x95\\xd3\\x36\\x41\\xa7\\xfa\\x94\\xeb\\x4b\\x37\\xef\\xf7\\x93\\x25\\x4d\\x99\\x7f\\x20\\x96\\x11\\x55\\x50\\x12\\x02\\x9d\\xcc\\xf9\\x04\\x1f\\xd8\\x1c\\x57\\x0d\\x2f\\x66\\x05\\x1c\\x0a\\x72\\x3b\\x62\\x7f\\xba\\xac\\x4f\\x3c\\xc1\\xf1\\xb4\\xf7\\xac\\xa8\\x16\\xcf\\x7a\\x69\\xa5\\x7f\\xd5\\xec\\x99\\x12\\xe2\\xd9\\xb2\\xa8\\x9f\\x15\\x9b\\xa2\\x56\\xcf\\x1e\\xb9\\x5a\\x3d\\x73\\xd3\\x79\\x26\\x96\\xcf\\x7a\\x69\\x9d\\xf6\\x9e\\xf5\\xd2\\xc2\\xed\\xe3\\x03\\x45\\xef\\x2e\\xe8\\x14\\xb3\\xf5\\xfc\\xe9\\x63\\x6a\\x3d\\x7e\\xb4\\x9e\\x11\\x7d\\x2f\\x17\\x74\\x89\\x4e\\x8e\\x17\\x37\\xd5\\x78\\xa1\\x27\\xa0\\xb1\\xd6\\x05\\xd4\\x7a\\xb3\\xb7\\x69\\x4a\\xbe\\x95\\xc9\\x0a\\x16\\x10\\xd4\\x32\\x17\\x17\\x94\\x56\\xfd\\xbe\\x05\\xce\\x9a\\x8e\\xf2\\xc0\\x79\\x74\\x41\\xe9\\xf6\\x78\\xf4\\x55\\x20\\xa6\\x39\\x57\\xc4\\x45\\x4e\\xb1\\x91\\x4b\\x07\\x8c\\x58\\x6d\\x25\\x45\\x6f\\x53\\x65\\x84\\x63\\xef\\x37\\x88\\x8f\\x0f\\x4d\\x2c\\xbc\\xd5\\x67\\x24\\xc4\\xdf\\xb4\\x4e\\xb3\\x0c\\xaa\\x38\\x61\\x16\\x53\\x34\\x5e\\x04\\xe3\\x2c\\x92\\xb7\\xf2\\xda\\x18\\x26\\xe2\\x9e\\xba\\x5d\\xd2\\xdc\\x29\\x34\\xb1\\xd1\\xc9\\x5f\\x3d\\x4d\\x42\\x38\\x51\\xba\\x3b\\xbb\\xfa\\xc8\\x22\\xb2\\xd5\\xc1\\x5c\\x6b\\x2a\\x0c\\xf8\\x42\\xd1\\x79\\x80\\x44\\x30\\xa7\\x75\\xbf\\x5f\\x68\\x32\\x61\\x45\\x4b\\xfd\\xab\\x9c\\xc1\\x82\\xf2\\x29\\x9b\\xc1\\x56\\x27\\xac\\xfa\\xfd\\x45\\xbf\\xbf\\x30\\x90\\x17\\x96\\xba\\xb2\\x03\\xfb\\x7e\\x16\\xd5\\xf1\\x98\\x6c\\x27\\xab\\x7c\\x4e\\x08\\x3c\\x50\\x6b\\xc7\\xeb\\xb5\\xbc\\xdc\\x12\\x3d\\x4c\\x7e\\x48\\x1e\\x60\\xba\\xd4\\x73\\x98\\x69\\x4a\\x77\\xf9\\x84\\x7e\\x9a\\x8f\\x5e\\xfd\\xbe\\x98\\xd5\\x15\\x06\\xab\\x06\\xeb\\xea\\xd9\\x6e\\xd4\\x99\\x25\\xab\\x2c\\x25\\xc5\\xc0\\x98\\x1e\\x9d\\xc0\\xa7\\xf3\\xba\\xd4\\x2d\\x4b\\x24\\x2f\\x0b\\x6f\\x4b\\xad\\x3f\\xa8\\x98\\x6d\\x5c\\xb0\\x5a\\xc8\\xf5\\x24\\x60\\x8d\\x84\\xdf\\xe7\\xac\\x9d\\x2c\\x6a\\x98\\x56\\xe4\\x92\\x67\\x06\\xdc\\x7d\\xa4\\xc2\\xf5\\xd3\\x3d\\xbb\\x3a\\x57\\xae\\xc5\\x01\\xe2\\x94\\x61\\x20\\x6b\\x5e\\xa5\\xd5\\x65\\x7b\\xb6\\x1e\\xe0\\xfd\\x64\\xe3\\xc9\\x3d\\xe9\\xeb\\xd4\\xe0\\x60\\xba\\xd7\\xb9\\xda\\x9d\\x0d\\x5d\\x0b\\x82\\x7e\\xa9\\x12\\xd6\\x31\\x42\\x9b\\x70\\xdd\\xdf\\x8f\\xce\\x8d\\x0f\\xe2\\x04\\xee\\xcb\\x2b\\xd6\\xcc\\x05\\x3e\\xb6\\x56\\x89\\x45\\x6a\\x44\\xd7\\x38\\x29\\x7d\\xda\\x34\\x0d\\xb9\\x11\\x4e\\x5a\\xfd\\x98\\x57\\x97\\x32\\xad\\x2f\\x0b\\x58\\xe5\\xd5\\x65\\x91\\xd6\\x97\\xb2\\x69\\x4e\\x81\\xf9\\xfb\\xe7\\x87\\xc8\\xe6\\x09\\x79\\x28\\x68\\x35\\x35\\xa8\\xdb\\xec\\x78\\xac\\xb2\\x88\\x97\\x88\\x1c\\x86\\xf3\\x37\\x7a\\xa8\\x11\\x04\\x06\\x53\\x35\\xd3\\xcf\\x5c\\x40\\x11\\x8c\\x0f\\x4d\\x96\\xb5\\x97\\x5d\\x76\\x2c\\x4a\\x4e\\x96\\xd0\\x3a\\x81\\xbd\\x2a\\xb2\\x47\\xef\\x01\\xf6\\xaa\\xc8\\x56\\x64\\x30\\xf2\\xd1\\xb4\\x6e\\x87\\x93\\x3a\\x1f\\x35\\x67\\x80\\x73\\x5b\\xc5\\x37\\x84\\x91\\x77\\x01\\xf2\\xd0\\x1b\\x13\\x3a\\xd5\\xe4\\xcb\\xa4\\x6a\\xc7\\x6d\\x7f\\xd6\\x91\\xa5\\xbc\\x2e\\xd4\\x7c\\xc5\\xab\\x87\\x5f\\xb8\\xe4\\xf7\\x25\\x7b\\xcd\\x54\\xa1\\xc1\\x3f\\xf2\\x8e\\x22\\x02\\x37\\x60\\xd7\\xc1\\x11\\x58\\xd4\\x19\\xd5\\xe8\\x75\\xc7\\x35\\xd4\\xf3\\xb2\\x34\\x21\\xbe\\x7f\\x31\\xb1\\x13\\x14\\x89\\x20\\x85\\x38\\x85\\x14\\x95\\x8b\\x6c\\x2c\\xa6\\xec\\xc3\\x6d\\xc5\\xd8\\x78\\x34\\x0e\\x15\\xe8\\xf0\\xa4\\x0a\\xaf\\xc6\\x93\\xab\\x17\\x85\\x42\\xb4\\xde\\xdf\\xbc\\x33\\x52\\x0d\\xda\\x8c\\xab\\xb6\\xd6\\xbc\\x59\\x7b\\xfd\\xbc\\x13\\x96\\x10\\xdc\\x5e\\x74\\x83\\xdb\\x9b\\x90\\xf0\\x09\\x32\\x4c\\xc5\\x94\\xcf\\xce\\x0c\\xde\\xf4\\x4d\\x5b\\x6b\\x3e\\x61\\x79\\x3c\\x1d\\x46\\x9a\\xf0\\x11\\xb4\\x4d\\x56\\x2c\\x51\\xe6\\xf5\\xfc\\x59\\x92\\x58\\x51\\xfe\\x07\\x19\\x45\\xa8\\x35\\xaa\\xb1\\x50\\x18\\x25\\xff\\xaa\\x75\\x38\\x35\\x06\\x1a\\xd9\\x5a\\xe9\\x3b\\xac\\xa6\\xd5\\x0c\\x0a\\xaa\\xa6\\x62\\x66\\xf4\\xfd\\x1d\\x99\\x51\\x19\\xbe\\xc6\\x58\\x52\\x9e\\x95\\x02\\xdd\\xc7\\xae\\xf0\\xe8\\x4d\\x25\\xb2\\x26\\xa7\\xc5\\xac\\x71\\xee\\x2c\\xc4\\xa0\\xf2\\x87\\x79\\x22\\xd3\\xa4\\x18\\x48\\x72\\x99\\xb0\\x41\\x45\\xae\\xea\\x5c\\x36\\xff\\x30\\x92\\x1b\\x7d\\x4d\\x7b\\xf0\\x8f\\x58\\x62\\x63\\x70\\x86\\xdc\\x60\\x2c\\xe0\\x38\\x3e\\xf9\\xa1\\x01\\x5d\\x38\\x77\\x2c\\x9c\\x8b\\x11\\xe8\\x5b\\xac\\xff\\x1b\\x26\\xce\\xc5\\x28\\xe6\\xdf\\x5c\\x8c\\xc0\\xe2\\x82\\x79\\x2f\\xba\\xe4\\xde\\x41\\xa2\\x85\\x07\\xf9\\xa1\\x69\\xbc\\x4c\\x06\\x51\\xa2\\xbc\\xa7\\xc9\\xb9\\xde\\x89\\x1d\\xc0\\x28\\xd8\\x01\\x7c\\x13\\x78\\x6f\\xff\\xf8\\x80\\x1d\\xc0\\x1d\\xba\\xfb\\x0a\\x1a\\xfc\\xeb\\x62\\x87\\xf2\\xcb\\x98\\x2b\\xe6\\x68\\x8c\\x73\\x67\\x13\\x9d\\x4d\\xb8\\xd3\\xfb\\x95\\xa8\\xdf\\xe8\\xe6\\x12\\x32\\x56\\xae\\x65\\x95\\x21\\x01\\xfe\\x4a\\x88\\xb7\\xdb\\x8d\\xc9\\x65\\x96\\x24\\xb3\\x3d\\xb9\\xa2\\xc1\\x08\\x3b\\x70\\xb3\\x5c\\xd7\\x8c\\x34\\x27\\xcd\\x78\\xd5\\xa3\\xb6\\x52\\xbd\\x55\\x6a\\xbb\\x50\\xed\\x9b\\x31\\x3d\\xe0\\xee\\x30\\xd8\\x08\\x99\\x0f\\x1b\\x30\\x9f\\x1c\\x3f\\x47\\xcd\\xcc\\x2b\\x39\\x4c\\x99\\xb9\\x5f\\xe6\\x3c\\xea\\x6b\\x63\\x48\\x28\\x8f\\x3c\\x08\\x64\\xe6\\x0a\\x62\\xce\\x1f\\x14\\xb7\\x9a\\x54\\xbb\\xe1\\xfd\\xbe\\xe5\\xe7\\x16\\x41\\x13\\xdd\\x24\\x70\\x02\\x55\\xf3\\xd4\\x42\\x9d\\x01\\x96\\xe1\\xca\\x17\\x65\\xe9\\xe0\\xe4\\x53\\xf7\\xdc\\xaa\\xdd\\x76\\x61\\x30\\x54\\xf4\\x3c\\xa3\\xc2\\x3f\\xcf\\x3e\\x08\\xa1\\x1e\\xb8\\xa5\\xc0\\xe2\\xfb\\xcc\\x1d\\xbc\\xab\\x08\\xc9\\x5d\\xd9\\x09\\xcf\\x2b\\x68\\x0f\\x90\\x32\\x60\\x67\\x90\\x98\\xf3\\x9e\\xa9\\x1d\\x32\\x81\\xde\\x95\\x63\\xf0\\xcd\\xc3\\x79\\xb8\\x1d\\xf6\\xfb\\x17\\x9f\\xa0\\xe5\\xc3\\x55\\x94\\x9c\\xf3\\xf7\\x23\\x3e\\xfc\\x2c\\xe2\\x53\\x59\\xc4\\x47\\x90\\xcb\\x2a\\x46\\x7c\\xce\\x60\\x70\\xb6\\x9d\\x1f\\xac\\x01\\x84\\x39\\x93\\xa0\\x9c\\x59\\xb8\\x1b\\xc7\\xff\\x30\\xda\\xf4\\x03\\x86\\x80\\x34\\x7d\\x57\\x97\\xed\\xae\\x01\\x1d\\xe5\\x7e\\x13\\x00\\x93\\x64\\x35\\x67\\xb2\\x07\\xdf\\x44\\xe0\\x29\\x02\\x55\\xe8\\x1f\\x59\\x15\\x1f\\xf0\\xa8\\xf7\\xc2\\x3a\\x66\\xfa\\x69\\x5e\\x94\\x2c\\xff\\x51\\x82\\x11\\x53\\x9b\\xcf\\x2f\\x25\\xbc\\x0a\\xb6\\x47\\x26\\xed\\x77\\x09\\x3f\\x46\\xf2\\x6c\\x93\\xf8\\x4f\\x09\\xfa\\x98\\x99\\x8f\\x7f\\xd8\\x0f\\x1c\\x9e\\x49\\xfa\\x46\\x06\\xb1\\xc6\\x37\\x55\\x56\\xb3\\x07\\x2e\\x15\\xab\\x93\\x7b\\x01\\xaa\\x80\\xdf\\x04\\x3c\\x97\\x04\\xbe\\xa9\\xb2\\x15\\x2b\\x37\\xac\\x96\\xf4\\x90\\x65\\xd9\\x8b\\xaa\\xd1\\x49\\x8e\\x56\\x90\\x54\\x08\\xfd\\xed\\x9d\\xd8\\xd3\\x3b\\xde\\xfa\\x96\\xf4\\x1d\\x26\\x18\\x39\\xba\\xa8\\x69\\xa1\\xbf\\xc2\\x53\\x2d\\xe9\\xf3\\xd6\\x27\\x06\\xc0\\x94\\xba\\x8c\\xf5\\x28\\xf9\\xc2\\xe7\\xd1\\x57\\xd8\\x92\\xf5\\xe1\\x4d\\xbf\\xc4\\x2f\\xeb\\x58\\x5a\\xd2\\xdf\\x70\\x1c\\x2f\\x83\\xeb\\x42\\xfa\\x37\\xa6\\x53\\x4a\\xe4\\x88\\x4b\\xfa\\x35\\x7e\\x6d\\xca\\x42\\x69\\xf2\\x46\\xd2\\x2d\\x56\\xc7\\x85\\xa0\\xbf\\xe2\\x6f\\xe4\\x47\\xd2\\x5f\\x78\\x27\\x4a\\xef\\x37\\x15\\x44\\x0b\\x02\\x5b\\x8e\\x6b\\xf2\\x02\\xa3\\x71\\x7f\\x53\\x41\\x6f\\x5b\\x2d\\x0c\\x4f\\x3b\\x38\\x29\\x7b\\xe4\\xd5\\x42\\x3c\\xf6\\xfb\\x89\\xf9\\xe1\\x0b\\xeb\\x9a\\x0d\\x21\\xe3\\xff\\xe7\\xff\\x0b\\x00\\x00\\xff\\xff\\x3b\\x38\\xee\\x9a\\xb4\\xc8\\x02\\x00\")\n\nfunc assetsChartMinJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_assetsChartMinJs,\n\t\t\"assets/chart.min.js\",\n\t)\n}\n\nfunc assetsChartMinJs() (*asset, error) {\n\tbytes, err := assetsChartMinJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"assets/chart.min.js\", size: 182452, mode: os.FileMode(420), modTime: time.Unix(1621756582, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.bytes, nil\n\t}\n\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n\ta, err := Asset(name)\n\tif err != nil {\n\t\tpanic(\"asset: Asset(\" + name + \"): \" + err.Error())\n\t}\n\n\treturn a\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.info, nil\n\t}\n\treturn nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n\tnames := make([]string, 0, len(_bindata))\n\tfor name := range _bindata {\n\t\tnames = append(names, name)\n\t}\n\treturn names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n\t\"assets/chart.min.js\": assetsChartMinJs,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"}\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"}\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n\tnode := _bintree\n\tif len(name) != 0 {\n\t\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\t\tpathList := strings.Split(cannonicalName, \"/\")\n\t\tfor _, p := range pathList {\n\t\t\tnode = node.Children[p]\n\t\t\tif node == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t\t\t}\n\t\t}\n\t}\n\tif node.Func != nil {\n\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t}\n\trv := make([]string, 0, len(node.Children))\n\tfor childName := range node.Children {\n\t\trv = append(rv, childName)\n\t}\n\treturn rv, nil\n}\n\ntype bintree struct {\n\tFunc     func() (*asset, error)\n\tChildren map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n\t\"assets\": &bintree{nil, map[string]*bintree{\n\t\t\"chart.min.js\": &bintree{assetsChartMinJs, map[string]*bintree{}},\n\t}},\n}}\n\n// RestoreAsset restores an asset under the given directory\nfunc RestoreAsset(dir, name string) error {\n\tdata, err := Asset(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo, err := AssetInfo(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// RestoreAssets restores an asset under the given directory recursively\nfunc RestoreAssets(dir, name string) error {\n\tchildren, err := AssetDir(name)\n\t// File\n\tif err != nil {\n\t\treturn RestoreAsset(dir, name)\n\t}\n\t// Dir\n\tfor _, child := range children {\n\t\terr = RestoreAssets(dir, filepath.Join(name, child))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc _filePath(dir, name string) string {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\treturn filepath.Join(append([]string{dir}, strings.Split(cannonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "template/chartjs/assets_list.go",
    "content": "package chartjs\n\nvar AssetsList = []string{\n\t\"/chart.min.js\",\n}\n"
  },
  {
    "path": "template/chartjs/bar.go",
    "content": "package chartjs\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"html/template\"\n\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n)\n\ntype BarChart struct {\n\t*Chart\n\n\tJsContent BarJsContent\n}\n\ntype BarJsContent struct {\n\tJsContent\n\n\tData BarAttributes `json:\"data\"`\n}\n\ntype BarAttributes struct {\n\tAttributes\n\n\tDataSets BarDataSets `json:\"datasets\"`\n}\n\ntype BarDataSets []*BarDataSet\n\nfunc (l BarDataSets) Add(ds *BarDataSet) BarDataSets {\n\treturn append(l, ds)\n}\n\ntype BarDataSet struct {\n\tLabel           string    `json:\"label\"`\n\tData            []float64 `json:\"data\"`\n\tType            string    `json:\"type,omitempty\"`\n\tBackgroundColor Color     `json:\"backgroundColor,omitempty\"`\n\tBorderCapStyle  string    `json:\"borderCapStyle,omitempty\"`\n\tBorderColor     Color     `json:\"borderColor,omitempty\"`\n\n\tBorderSkipped string  `json:\"borderSkipped,omitempty\"`\n\tBorderWidth   float64 `json:\"borderWidth,omitempty\"`\n\n\tHoverBackgroundColor Color   `json:\"hoverBackgroundColor,omitempty\"`\n\tHoverBorderColor     Color   `json:\"hoverBorderColor,omitempty\"`\n\tHoverBorderWidth     float64 `json:\"hoverBorderWidth,omitempty\"`\n\n\tOrder   float64 `json:\"order,omitempty\"`\n\tXAxisID string  `json:\"xAxisID,omitempty\"`\n\tYAxisID string  `json:\"yAxisID,omitempty\"`\n}\n\nfunc (l *BarDataSet) SetLabel(label string) *BarDataSet {\n\tl.Label = label\n\treturn l\n}\n\nfunc (l *BarDataSet) SetData(data []float64) *BarDataSet {\n\tl.Data = data\n\treturn l\n}\n\nfunc (l *BarDataSet) SetType(t string) *BarDataSet {\n\tl.Type = t\n\treturn l\n}\n\nfunc (l *BarDataSet) SetBackgroundColor(backgroundColor Color) *BarDataSet {\n\tl.BackgroundColor = backgroundColor\n\treturn l\n}\n\nfunc (l *BarDataSet) SetBorderCapStyle(borderCapStyle string) *BarDataSet {\n\tl.BorderCapStyle = borderCapStyle\n\treturn l\n}\n\nfunc (l *BarDataSet) SetBorderColor(borderColor Color) *BarDataSet {\n\tl.BorderColor = borderColor\n\treturn l\n}\n\nfunc (l *BarDataSet) SetBorderWidth(borderWidth float64) *BarDataSet {\n\tl.BorderWidth = borderWidth\n\treturn l\n}\n\nfunc (l *BarDataSet) SetBorderSkipped(skip string) *BarDataSet {\n\tl.BorderSkipped = skip\n\treturn l\n}\n\nfunc (l *BarDataSet) SetHoverBackgroundColor(hoverBackgroundColor Color) *BarDataSet {\n\tl.HoverBackgroundColor = hoverBackgroundColor\n\treturn l\n}\n\nfunc (l *BarDataSet) SetHoverBorderColor(hoverBorderColor Color) *BarDataSet {\n\tl.HoverBorderColor = hoverBorderColor\n\treturn l\n}\n\nfunc (l *BarDataSet) SetHoverBorderWidth(hoverBorderWidth float64) *BarDataSet {\n\tl.HoverBorderWidth = hoverBorderWidth\n\treturn l\n}\n\nfunc (l *BarDataSet) SetOrder(order float64) *BarDataSet {\n\tl.Order = order\n\treturn l\n}\n\nfunc (l *BarDataSet) SetXAxisID(xAxisID string) *BarDataSet {\n\tl.XAxisID = xAxisID\n\treturn l\n}\n\nfunc (l *BarDataSet) SetYAxisID(yAxisID string) *BarDataSet {\n\tl.YAxisID = yAxisID\n\treturn l\n}\n\nfunc Bar() *BarChart {\n\treturn &BarChart{\n\t\tChart: &Chart{\n\t\t\tBaseComponent: &template2.BaseComponent{\n\t\t\t\tName:     \"chartjs\",\n\t\t\t\tHTMLData: List[\"chartjs\"],\n\t\t\t},\n\t\t\tdataSetIndex: -1,\n\t\t},\n\t\tJsContent: BarJsContent{\n\t\t\tJsContent: JsContent{\n\t\t\t\tType: \"bar\",\n\t\t\t},\n\t\t\tData: BarAttributes{\n\t\t\t\tAttributes: Attributes{\n\t\t\t\t\tLabels: make([]string, 0),\n\t\t\t\t},\n\t\t\t\tDataSets: make(BarDataSets, 0),\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc (l *BarChart) SetID(s string) *BarChart {\n\tl.ID = s\n\treturn l\n}\n\nfunc (l *BarChart) SetTitle(s template.HTML) *BarChart {\n\tl.Title = s\n\treturn l\n}\n\nfunc (l *BarChart) SetHeight(s int) *BarChart {\n\tl.Height = s\n\treturn l\n}\n\nfunc (l *BarChart) SetLabels(s []string) *BarChart {\n\tl.JsContent.Data.Labels = s\n\treturn l\n}\n\nfunc (l *BarChart) AddDataSet(s string) *BarChart {\n\tl.dataSetIndex++\n\tl.JsContent.Data.DataSets = l.JsContent.Data.DataSets.Add(&BarDataSet{\n\t\tType:  \"bar\",\n\t\tLabel: s,\n\t})\n\treturn l\n}\n\nfunc (l *BarChart) DSLabel(s string) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetLabel(s)\n\treturn l\n}\n\nfunc (l *BarChart) DSData(data []float64) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetData(data)\n\treturn l\n}\n\nfunc (l *BarChart) DSType(t string) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetType(t)\n\treturn l\n}\n\nfunc (l *BarChart) DSBackgroundColor(backgroundColor Color) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBackgroundColor(backgroundColor)\n\treturn l\n}\n\nfunc (l *BarChart) DSBorderCapStyle(borderCapStyle string) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderCapStyle(borderCapStyle)\n\treturn l\n}\n\nfunc (l *BarChart) DSBorderSkipped(skip string) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderSkipped(skip)\n\treturn l\n}\n\nfunc (l *BarChart) DSBorderColor(borderColor Color) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderColor(borderColor)\n\treturn l\n}\n\nfunc (l *BarChart) DSBorderWidth(borderWidth float64) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderWidth(borderWidth)\n\treturn l\n}\n\nfunc (l *BarChart) DSHoverBackgroundColor(hoverBackgroundColor Color) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBackgroundColor(hoverBackgroundColor)\n\treturn l\n}\n\nfunc (l *BarChart) DSHoverBorderColor(hoverBorderColor Color) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderColor(hoverBorderColor)\n\treturn l\n}\n\nfunc (l *BarChart) DSHoverBorderWidth(hoverBorderWidth float64) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderWidth(hoverBorderWidth)\n\treturn l\n}\n\nfunc (l *BarChart) DSOrder(order float64) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetOrder(order)\n\treturn l\n}\n\nfunc (l *BarChart) DSXAxisID(xAxisID string) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetXAxisID(xAxisID)\n\treturn l\n}\n\nfunc (l *BarChart) DSYAxisID(yAxisID string) *BarChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetYAxisID(yAxisID)\n\treturn l\n}\n\nfunc (l *BarChart) GetContent() template.HTML {\n\tbuffer := new(bytes.Buffer)\n\ttmpl, defineName := l.GetTemplate()\n\n\tif l.JsContentOptions != nil {\n\t\tl.JsContent.Options = l.JsContentOptions\n\t}\n\n\tjsonByte, _ := json.Marshal(l.JsContent)\n\tl.Js = template.JS(string(jsonByte))\n\n\terr := tmpl.ExecuteTemplate(buffer, defineName, l)\n\tif err != nil {\n\t\tfmt.Println(\"ComposeHtml Error:\", err)\n\t}\n\treturn template.HTML(buffer.String())\n}\n"
  },
  {
    "path": "template/chartjs/chart.go",
    "content": "package chartjs\n\nimport (\n\t\"html/template\"\n\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n)\n\ntype Chart struct {\n\t*template2.BaseComponent\n\n\tID     string\n\tTitle  template.HTML\n\tJs     template.JS\n\tHeight int\n\n\tJsContentOptions *Options\n\n\tdataSetIndex int\n}\n\nfunc (c *Chart) SetID(id string) *Chart {\n\tc.ID = id\n\treturn c\n}\n\nfunc (c *Chart) SetTitle(title template.HTML) *Chart {\n\tc.Title = title\n\treturn c\n}\n\nfunc (c *Chart) SetHeight(height int) *Chart {\n\tc.Height = height\n\treturn c\n}\n\nfunc (c *Chart) SetOptionAnimationDuration(duration int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Animation == nil {\n\t\tc.JsContentOptions.Animation = new(OptionAnimation)\n\t}\n\tc.JsContentOptions.Animation.Duration = duration\n}\n\nfunc (c *Chart) SetOptionAnimationEasing(easing string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Animation == nil {\n\t\tc.JsContentOptions.Animation = new(OptionAnimation)\n\t}\n\tc.JsContentOptions.Animation.Easing = easing\n}\n\nfunc (c *Chart) SetOptionLayoutPaddingLeft(left int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Layout == nil {\n\t\tc.JsContentOptions.Layout = new(OptionLayout)\n\t}\n\tc.JsContentOptions.Layout.Padding.Left = left\n}\n\nfunc (c *Chart) SetOptionLayoutPaddingRight(right int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Layout == nil {\n\t\tc.JsContentOptions.Layout = new(OptionLayout)\n\t}\n\tc.JsContentOptions.Layout.Padding.Right = right\n}\n\nfunc (c *Chart) SetOptionLayoutPaddingTop(top int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Layout == nil {\n\t\tc.JsContentOptions.Layout = new(OptionLayout)\n\t}\n\tc.JsContentOptions.Layout.Padding.Top = top\n}\n\nfunc (c *Chart) SetOptionLayoutPaddingBottom(bottom int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Layout == nil {\n\t\tc.JsContentOptions.Layout = new(OptionLayout)\n\t}\n\tc.JsContentOptions.Layout.Padding.Bottom = bottom\n}\n\nfunc (c *Chart) SetOptionLegendDisplay(display bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Legend == nil {\n\t\tc.JsContentOptions.Legend = new(OptionLegend)\n\t}\n\tc.JsContentOptions.Legend.Display = display\n}\n\nfunc (c *Chart) SetOptionLegendPosition(position string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Legend == nil {\n\t\tc.JsContentOptions.Legend = new(OptionLegend)\n\t}\n\tc.JsContentOptions.Legend.Position = position\n}\n\nfunc (c *Chart) SetOptionLegendAlign(align string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Legend == nil {\n\t\tc.JsContentOptions.Legend = new(OptionLegend)\n\t}\n\tc.JsContentOptions.Legend.Align = align\n}\n\nfunc (c *Chart) SetOptionLegendFullWidt(fullWidth bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Legend == nil {\n\t\tc.JsContentOptions.Legend = new(OptionLegend)\n\t}\n\tc.JsContentOptions.Legend.FullWidth = fullWidth\n}\n\nfunc (c *Chart) SetOptionLegendRevers(reverse bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Legend == nil {\n\t\tc.JsContentOptions.Legend = new(OptionLegend)\n\t}\n\tc.JsContentOptions.Legend.Reverse = reverse\n}\n\nfunc (c *Chart) SetOptionLegendRt(rtl bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Legend == nil {\n\t\tc.JsContentOptions.Legend = new(OptionLegend)\n\t}\n\tc.JsContentOptions.Legend.Rtl = rtl\n}\n\nfunc (c *Chart) SetOptionLegendTextDirection(textDirection string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Legend == nil {\n\t\tc.JsContentOptions.Legend = new(OptionLegend)\n\t}\n\tc.JsContentOptions.Legend.TextDirection = textDirection\n}\n\nfunc (c *Chart) SetOptionLegendLabels(labels *OptionLegendLabel) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Legend == nil {\n\t\tc.JsContentOptions.Legend = new(OptionLegend)\n\t}\n\tc.JsContentOptions.Legend.Labels = labels\n}\n\nfunc (c *Chart) SetOptionTitleDisplay(display bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.Display = display\n}\n\nfunc (c *Chart) SetOptionTitleFontSize(fontSize int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.FontSize = fontSize\n}\n\nfunc (c *Chart) SetOptionTitlePosition(position string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.Position = position\n}\n\nfunc (c *Chart) SetOptionTitleFontFamily(fontFamily string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.FontFamily = fontFamily\n}\n\nfunc (c *Chart) SetOptionTitleFontColor(fontColor Color) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.FontColor = fontColor\n}\n\nfunc (c *Chart) SetOptionTitleFontStyle(fontStyle string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.FontStyle = fontStyle\n}\n\nfunc (c *Chart) SetOptionTitlePadding(padding int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.Padding = padding\n}\n\nfunc (c *Chart) SetOptionTitleLineHeight(lineHeight int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.LineHeight = lineHeight\n}\n\nfunc (c *Chart) SetOptionTitleText(text string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Title == nil {\n\t\tc.JsContentOptions.Title = new(OptionTitle)\n\t}\n\tc.JsContentOptions.Title.Text = text\n}\n\nfunc (c *Chart) SetOptionTooltipsEnabled(enabled bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.Enabled = enabled\n}\n\nfunc (c *Chart) SetOptionTooltipsMode(mode string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.Mode = mode\n}\n\nfunc (c *Chart) SetOptionTooltipsIntersect(intersect bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.Intersect = intersect\n}\n\nfunc (c *Chart) SetOptionTooltipsPosition(position string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.Position = position\n}\n\nfunc (c *Chart) SetOptionTooltipsBackgroundColor(backgroundColor Color) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BackgroundColor = backgroundColor\n}\n\nfunc (c *Chart) SetOptionTooltipsTitleFontFamily(titleFontFamily string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.TitleFontFamily = titleFontFamily\n}\n\nfunc (c *Chart) SetOptionTooltipsTitleFontSize(titleFontSize int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.TitleFontSize = titleFontSize\n}\n\nfunc (c *Chart) SetOptionTooltipsTitleFontStyle(titleFontStyle string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.TitleFontStyle = titleFontStyle\n}\n\nfunc (c *Chart) SetOptionTooltipsTitleFontColor(titleFontColor Color) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.TitleFontColor = titleFontColor\n}\n\nfunc (c *Chart) SetOptionTooltipsTitleAlign(titleAlign string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.TitleAlign = titleAlign\n}\n\nfunc (c *Chart) SetOptionTooltipsTitleSpacing(titleSpacing int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.TitleSpacing = titleSpacing\n}\n\nfunc (c *Chart) SetOptionTooltipsTitleMarginBottom(titleMarginBottom int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.TitleMarginBottom = titleMarginBottom\n}\n\nfunc (c *Chart) SetOptionTooltipsBodyFontFamily(bodyFontFamily string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BodyFontFamily = bodyFontFamily\n}\n\nfunc (c *Chart) SetOptionTooltipsBodyFontSize(bodyFontSize int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BodyFontSize = bodyFontSize\n}\n\nfunc (c *Chart) SetOptionTooltipsBodyFontStyle(bodyFontStyle string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BodyFontStyle = bodyFontStyle\n}\n\nfunc (c *Chart) SetOptionTooltipsBodyFontColor(bodyFontColor Color) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BodyFontColor = bodyFontColor\n}\n\nfunc (c *Chart) SetOptionTooltipsBodyAlign(bodyAlign string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BodyAlign = bodyAlign\n}\n\nfunc (c *Chart) SetOptionTooltipsBodySpacing(bodySpacing int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BodySpacing = bodySpacing\n}\n\nfunc (c *Chart) SetOptionTooltipsFooterFontFamily(footerFontFamily string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.FooterFontFamily = footerFontFamily\n}\n\nfunc (c *Chart) SetOptionTooltipsFooterFontSize(footerFontSize int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.FooterFontSize = footerFontSize\n}\n\nfunc (c *Chart) SetOptionTooltipsFooterFontStyle(footerFontStyle string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.FooterFontStyle = footerFontStyle\n}\n\nfunc (c *Chart) SetOptionTooltipsFooterFontColor(footerFontColor Color) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.FooterFontColor = footerFontColor\n}\n\nfunc (c *Chart) SetOptionTooltipsFooterAlign(footerAlign string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.FooterAlign = footerAlign\n}\n\nfunc (c *Chart) SetOptionTooltipsFooterSpacing(footerSpacing int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.FooterSpacing = footerSpacing\n}\n\nfunc (c *Chart) SetOptionTooltipsFooterMarginTop(footerMarginTop int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.FooterMarginTop = footerMarginTop\n}\n\nfunc (c *Chart) SetOptionTooltipsXPadding(xPadding int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.XPadding = xPadding\n}\n\nfunc (c *Chart) SetOptionTooltipsYPadding(yPadding int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.YPadding = yPadding\n}\n\nfunc (c *Chart) SetOptionTooltipsCaretPadding(caretPadding int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.CaretPadding = caretPadding\n}\n\nfunc (c *Chart) SetOptionTooltipsCaretSize(caretSize int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.CaretSize = caretSize\n}\n\nfunc (c *Chart) SetOptionTooltipsCornerRadius(cornerRadius int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.CornerRadius = cornerRadius\n}\n\nfunc (c *Chart) SetOptionTooltipsMultiKeyBackground(multiKeyBackground Color) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.MultiKeyBackground = multiKeyBackground\n}\n\nfunc (c *Chart) SetOptionTooltipsDisplayColors(displayColors bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.DisplayColors = displayColors\n}\n\nfunc (c *Chart) SetOptionTooltipsBorderColor(borderColor Color) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BorderColor = borderColor\n}\n\nfunc (c *Chart) SetOptionTooltipsBorderWidth(borderWidth int) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.BorderWidth = borderWidth\n}\n\nfunc (c *Chart) SetOptionTooltipsRtl(rtl bool) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.Rtl = rtl\n}\n\nfunc (c *Chart) SetOptionTooltipsTextDirection(textDirection string) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Tooltips == nil {\n\t\tc.JsContentOptions.Tooltips = new(OptionTooltips)\n\t}\n\tc.JsContentOptions.Tooltips.TextDirection = textDirection\n}\n\nfunc (c *Chart) SetOptionElementPoint(point *OptionElementPoint) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Elements == nil {\n\t\tc.JsContentOptions.Elements = new(OptionElement)\n\t}\n\tc.JsContentOptions.Elements.Point = point\n}\n\nfunc (c *Chart) SetOptionElementLine(line *OptionElementLine) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Elements == nil {\n\t\tc.JsContentOptions.Elements = new(OptionElement)\n\t}\n\tc.JsContentOptions.Elements.Line = line\n}\n\nfunc (c *Chart) SetOptionElementArc(arc *OptionElementArc) {\n\tif c.JsContentOptions == nil {\n\t\tc.JsContentOptions = new(Options)\n\t}\n\tif c.JsContentOptions.Elements == nil {\n\t\tc.JsContentOptions.Elements = new(OptionElement)\n\t}\n\tc.JsContentOptions.Elements.Arc = arc\n}\n\nfunc (c *Chart) SetOptionElementRectangle(rectangle *OptionElementRectangle) {\n\tif c.JsContentOptions.Elements == nil {\n\t\tc.JsContentOptions.Elements = new(OptionElement)\n\t}\n\tc.JsContentOptions.Elements.Rectangle = rectangle\n}\n\ntype JsContent struct {\n\tType    string   `json:\"type,omitempty\"`\n\tOptions *Options `json:\"options,omitempty\"`\n}\n\ntype OptionAnimation struct {\n\tDuration int    `json:\"duration,omitempty\"`\n\tEasing   string `json:\"easing,omitempty\"`\n}\n\ntype OptionLayout struct {\n\tPadding struct {\n\t\tLeft   int `json:\"left,omitempty\"`\n\t\tRight  int `json:\"right,omitempty\"`\n\t\tTop    int `json:\"top,omitempty\"`\n\t\tBottom int `json:\"bottom,omitempty\"`\n\t} `json:\"padding,omitempty\"`\n}\n\ntype OptionLegend struct {\n\tDisplay       bool               `json:\"display,omitempty\"`\n\tPosition      string             `json:\"position,omitempty\"`\n\tAlign         string             `json:\"align,omitempty\"`\n\tFullWidth     bool               `json:\"full_width,omitempty\"`\n\tReverse       bool               `json:\"reverse,omitempty\"`\n\tRtl           bool               `json:\"rtl,omitempty\"`\n\tTextDirection string             `json:\"text_direction,omitempty\"`\n\tLabels        *OptionLegendLabel `json:\"labels,omitempty\"`\n}\n\ntype OptionLegendLabel struct {\n\tBoxWidth      int    `json:\"box_width,omitempty\"`\n\tFontSize      int    `json:\"fontSize,omitempty\"`\n\tFontStyle     string `json:\"fontStyle,omitempty\"`\n\tFontColor     Color  `json:\"fontColor,omitempty\"`\n\tFontFamily    string `json:\"fontFamily,omitempty\"`\n\tPadding       int    `json:\"padding,omitempty\"`\n\tUsePointStyle bool   `json:\"usePointStyle,omitempty\"`\n}\n\ntype OptionTitle struct {\n\tDisplay    bool   `json:\"display,omitempty\"`\n\tPosition   string `json:\"position,omitempty\"`\n\tFontSize   int    `json:\"fontSize,omitempty\"`\n\tFontFamily string `json:\"fontFamily,omitempty\"`\n\tFontColor  Color  `json:\"fontColor,omitempty\"`\n\tFontStyle  string `json:\"fontStyle,omitempty\"`\n\tPadding    int    `json:\"padding,omitempty\"`\n\tLineHeight int    `json:\"lineHeight,omitempty\"`\n\tText       string `json:\"text,omitempty\"`\n}\n\ntype OptionTooltips struct {\n\tEnabled            bool   `json:\"enabled,omitempty\"`\n\tMode               string `json:\"mode,omitempty\"`\n\tIntersect          bool   `json:\"intersect,omitempty\"`\n\tPosition           string `json:\"position,omitempty\"`\n\tBackgroundColor    Color  `json:\"backgroundColor,omitempty\"`\n\tTitleFontFamily    string `json:\"titleFontFamily,omitempty\"`\n\tTitleFontSize      int    `json:\"titleFontSize,omitempty\"`\n\tTitleFontStyle     string `json:\"titleFontStyle,omitempty\"`\n\tTitleFontColor     Color  `json:\"titleFontColor,omitempty\"`\n\tTitleAlign         string `json:\"titleAlign,omitempty\"`\n\tTitleSpacing       int    `json:\"titleSpacing,omitempty\"`\n\tTitleMarginBottom  int    `json:\"titleMarginBottom,omitempty\"`\n\tBodyFontFamily     string `json:\"bodyFontFamily,omitempty\"`\n\tBodyFontSize       int    `json:\"bodyFontSize,omitempty\"`\n\tBodyFontStyle      string `json:\"bodyFontStyle,omitempty\"`\n\tBodyFontColor      Color  `json:\"bodyFontColor,omitempty\"`\n\tBodyAlign          string `json:\"bodyAlign,omitempty\"`\n\tBodySpacing        int    `json:\"bodySpacing,omitempty\"`\n\tFooterFontFamily   string `json:\"footerFontFamily,omitempty\"`\n\tFooterFontSize     int    `json:\"footerFontSize,omitempty\"`\n\tFooterFontStyle    string `json:\"footerFontStyle,omitempty\"`\n\tFooterFontColor    Color  `json:\"footerFontColor,omitempty\"`\n\tFooterAlign        string `json:\"footerAlign,omitempty\"`\n\tFooterSpacing      int    `json:\"footerSpacing,omitempty\"`\n\tFooterMarginTop    int    `json:\"footerMarginTop,omitempty\"`\n\tXPadding           int    `json:\"xPadding,omitempty\"`\n\tYPadding           int    `json:\"yPadding,omitempty\"`\n\tCaretPadding       int    `json:\"caretPadding,omitempty\"`\n\tCaretSize          int    `json:\"caretSize,omitempty\"`\n\tCornerRadius       int    `json:\"cornerRadius,omitempty\"`\n\tMultiKeyBackground Color  `json:\"multiKeyBackground,omitempty\"`\n\tDisplayColors      bool   `json:\"displayColors,omitempty\"`\n\tBorderColor        Color  `json:\"borderColor,omitempty\"`\n\tBorderWidth        int    `json:\"borderWidth,omitempty\"`\n\tRtl                bool   `json:\"rtl,omitempty\"`\n\tTextDirection      string `json:\"textDirection,omitempty\"`\n}\n\ntype OptionElement struct {\n\tPoint     *OptionElementPoint     `json:\"point,omitempty\"`\n\tLine      *OptionElementLine      `json:\"line,omitempty\"`\n\tRectangle *OptionElementRectangle `json:\"rectangle,omitempty\"`\n\tArc       *OptionElementArc       `json:\"arc,omitempty\"`\n}\n\ntype OptionElementPoint struct {\n\tRadius           int    `json:\"radius,omitempty\"`\n\tPointStyle       string `json:\"pointStyle,omitempty\"`\n\tRotation         int    `json:\"rotation,omitempty\"`\n\tBackgroundColor  Color  `json:\"backgroundColor,omitempty\"`\n\tBorderWidth      int    `json:\"borderWidth,omitempty\"`\n\tBorderColor      Color  `json:\"borderColor,omitempty\"`\n\tHitRadius        int    `json:\"hitRadius,omitempty\"`\n\tHoverRadius      int    `json:\"hoverRadius,omitempty\"`\n\tHoverBorderWidth int    `json:\"hoverBorderWidth,omitempty\"`\n}\n\ntype OptionElementLine struct {\n\tTension                int    `json:\"tension,omitempty\"`\n\tBackgroundColor        Color  `json:\"background_color,omitempty\"`\n\tBorderWidth            int    `json:\"border_width,omitempty\"`\n\tBorderColor            Color  `json:\"border_color,omitempty\"`\n\tBorderCapStyle         string `json:\"border_cap_style,omitempty\"`\n\tBorderDash             int    `json:\"border_dash,omitempty\"`\n\tBorderDashOffset       int    `json:\"border_dash_offset,omitempty\"`\n\tBorderJoinStyle        string `json:\"border_join_style,omitempty\"`\n\tCapBezierPoints        bool   `json:\"cap_bezier_points,omitempty\"`\n\tCubicInterpolationMode string `json:\"cubic_interpolation_mode,omitempty\"`\n\tFill                   bool   `json:\"fill,omitempty\"`\n\tStepped                bool   `json:\"stepped,omitempty\"`\n}\n\ntype OptionElementRectangle struct {\n\tBackgroundColor Color  `json:\"backgroundColor,omitempty\"`\n\tBorderWidth     int    `json:\"borderWidth,omitempty\"`\n\tBorderColor     Color  `json:\"borderColor,omitempty\"`\n\tBorderSkipped   string `json:\"borderSkipped,omitempty\"`\n}\n\ntype OptionElementArc struct {\n\tAngle           int    `json:\"angle,omitempty\"`\n\tBackgroundColor Color  `json:\"backgroundColor,omitempty\"`\n\tBorderAlign     string `json:\"borderAlign,omitempty\"`\n\tBorderColor     Color  `json:\"borderColor,omitempty\"`\n\tBorderWidth     int    `json:\"borderWidth,omitempty\"`\n}\n\ntype Options struct {\n\tAnimation *OptionAnimation `json:\"animation,omitempty\"`\n\tLayout    *OptionLayout    `json:\"layout,omitempty\"`\n\tLegend    *OptionLegend    `json:\"legend,omitempty\"`\n\tTitle     *OptionTitle     `json:\"title,omitempty\"`\n\tTooltips  *OptionTooltips  `json:\"tooltips,omitempty\"`\n\tElements  *OptionElement   `json:\"elements,omitempty\"`\n}\n\ntype Attributes struct {\n\tLabels []string `json:\"labels,omitempty\"`\n}\n\ntype DataSets []DataSet\n\ntype DataSet struct {\n\tLabel string    `json:\"label,omitempty\"`\n\tData  []float64 `json:\"data,omitempty\"`\n\tType  string    `json:\"type,omitempty\"`\n}\n\ntype Color string\n\nfunc NewChart() *Chart {\n\treturn &Chart{\n\t\tBaseComponent: &template2.BaseComponent{\n\t\t\tName:     \"chartjs\",\n\t\t\tHTMLData: List[\"chartjs\"],\n\t\t},\n\t}\n}\n\nfunc (c *Chart) GetAssetList() []string               { return AssetsList }\nfunc (c *Chart) GetAsset(name string) ([]byte, error) { return Asset(name[1:]) }\nfunc (c *Chart) GetContent() template.HTML            { return c.GetContentWithData(c) }\n"
  },
  {
    "path": "template/chartjs/chartjs.tmpl",
    "content": "{{define \"chartjs\"}}\n    {{if ne .Title \"\"}}\n        <p class=\"text-center\">\n            <strong>{{langHtml .Title}}</strong>\n        </p>\n    {{end}}\n    <div class=\"chart\">\n        <canvas id=\"{{.ID}}\" style=\"height: {{.Height}}px;\"></canvas>\n    </div>\n    <script>\n        new Chart(document.getElementById('{{.ID}}'), {{.Js}});\n    </script>\n{{end}}"
  },
  {
    "path": "template/chartjs/line.go",
    "content": "package chartjs\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"html/template\"\n\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n)\n\ntype LineChart struct {\n\t*Chart\n\n\tJsContent LineJsContent\n}\n\ntype LineJsContent struct {\n\tJsContent\n\n\tData LineAttributes `json:\"data\"`\n}\n\ntype LineAttributes struct {\n\tAttributes\n\n\tDataSets LineDataSets `json:\"datasets\"`\n}\n\ntype LineDataSets []*LineDataSet\n\nfunc (l LineDataSets) Add(ds *LineDataSet) LineDataSets {\n\treturn append(l, ds)\n}\n\ntype LineDataSet struct {\n\tLabel                     string    `json:\"label\"`\n\tData                      []float64 `json:\"data\"`\n\tType                      string    `json:\"type,omitempty\"`\n\tBackgroundColor           Color     `json:\"backgroundColor,omitempty\"`\n\tBorderCapStyle            string    `json:\"borderCapStyle,omitempty\"`\n\tBorderColor               Color     `json:\"borderColor,omitempty\"`\n\tBorderDash                []int     `json:\"borderDash,omitempty\"`\n\tBorderDashOffset          float64   `json:\"borderDashOffset,omitempty\"`\n\tBorderJoinStyle           string    `json:\"borderJoinStyle,omitempty\"`\n\tBorderWidth               float64   `json:\"borderWidth,omitempty\"`\n\tCubicInterpolationMode    string    `json:\"cubicInterpolationMode,omitempty\"`\n\tFill                      bool      `json:\"fill\"`\n\tHoverBackgroundColor      Color     `json:\"hoverBackgroundColor,omitempty\"`\n\tHoverBorderCapStyle       string    `json:\"hoverBorderCapStyle,omitempty\"`\n\tHoverBorderColor          Color     `json:\"hoverBorderColor,omitempty\"`\n\tHoverBorderDash           float64   `json:\"hoverBorderDash,omitempty\"`\n\tHoverBorderDashOffset     float64   `json:\"hoverBorderDashOffset,omitempty\"`\n\tHoverBorderJoinStyle      string    `json:\"hoverBorderJoinStyle,omitempty\"`\n\tHoverBorderWidth          float64   `json:\"hoverBorderWidth,omitempty\"`\n\tLineTension               float64   `json:\"lineTension,omitempty\"`\n\tOrder                     float64   `json:\"order,omitempty\"`\n\tPointBackgroundColor      Color     `json:\"pointBackgroundColor,omitempty\"`\n\tPointBorderColor          Color     `json:\"pointBorderColor,omitempty\"`\n\tPointBorderWidth          float64   `json:\"pointBorderWidth,omitempty\"`\n\tPointHitRadius            float64   `json:\"pointHitRadius,omitempty\"`\n\tPointHoverBackgroundColor Color     `json:\"pointHoverBackgroundColor,omitempty\"`\n\tPointHoverBorderColor     Color     `json:\"pointHoverBorderColor,omitempty\"`\n\tPointHoverBorderWidth     float64   `json:\"pointHoverBorderWidth,omitempty\"`\n\tPointHoverRadius          float64   `json:\"pointHoverRadius,omitempty\"`\n\tPointRadius               float64   `json:\"pointRadius,omitempty\"`\n\tPointRotation             float64   `json:\"pointRotation,omitempty\"`\n\tPointStyle                string    `json:\"pointStyle,omitempty\"`\n\tShowLine                  bool      `json:\"showLine,omitempty\"`\n\tSpanGaps                  bool      `json:\"spanGaps,omitempty\"`\n\tSteppedLine               bool      `json:\"steppedLine,omitempty\"`\n\tXAxisID                   string    `json:\"xAxisID,omitempty\"`\n\tYAxisID                   string    `json:\"yAxisID,omitempty\"`\n}\n\nfunc (l *LineDataSet) SetLabel(label string) *LineDataSet {\n\tl.Label = label\n\treturn l\n}\n\nfunc (l *LineDataSet) SetData(data []float64) *LineDataSet {\n\tl.Data = data\n\treturn l\n}\n\nfunc (l *LineDataSet) SetType(t string) *LineDataSet {\n\tl.Type = t\n\treturn l\n}\n\nfunc (l *LineDataSet) SetBackgroundColor(backgroundColor Color) *LineDataSet {\n\tl.BackgroundColor = backgroundColor\n\treturn l\n}\n\nfunc (l *LineDataSet) SetBorderCapStyle(borderCapStyle string) *LineDataSet {\n\tl.BorderCapStyle = borderCapStyle\n\treturn l\n}\n\nfunc (l *LineDataSet) SetBorderColor(borderColor Color) *LineDataSet {\n\tl.BorderColor = borderColor\n\treturn l\n}\n\nfunc (l *LineDataSet) SetBorderDash(borderDash []int) *LineDataSet {\n\tl.BorderDash = borderDash\n\treturn l\n}\n\nfunc (l *LineDataSet) SetBorderDashOffset(borderDashOffset float64) *LineDataSet {\n\tl.BorderDashOffset = borderDashOffset\n\treturn l\n}\n\nfunc (l *LineDataSet) SetBorderJoinStyle(borderJoinStyle string) *LineDataSet {\n\tl.BorderJoinStyle = borderJoinStyle\n\treturn l\n}\n\nfunc (l *LineDataSet) SetBorderWidth(borderWidth float64) *LineDataSet {\n\tl.BorderWidth = borderWidth\n\treturn l\n}\n\nfunc (l *LineDataSet) SetCubicInterpolationMode(cubicInterpolationMode string) *LineDataSet {\n\tl.CubicInterpolationMode = cubicInterpolationMode\n\treturn l\n}\n\nfunc (l *LineDataSet) SetFill(fill bool) *LineDataSet {\n\tl.Fill = fill\n\treturn l\n}\n\nfunc (l *LineDataSet) SetHoverBackgroundColor(hoverBackgroundColor Color) *LineDataSet {\n\tl.HoverBackgroundColor = hoverBackgroundColor\n\treturn l\n}\n\nfunc (l *LineDataSet) SetHoverBorderCapStyle(hoverBorderCapStyle string) *LineDataSet {\n\tl.HoverBorderCapStyle = hoverBorderCapStyle\n\treturn l\n}\n\nfunc (l *LineDataSet) SetHoverBorderColor(hoverBorderColor Color) *LineDataSet {\n\tl.HoverBorderColor = hoverBorderColor\n\treturn l\n}\n\nfunc (l *LineDataSet) SetHoverBorderDash(hoverBorderDash float64) *LineDataSet {\n\tl.HoverBorderDash = hoverBorderDash\n\treturn l\n}\n\nfunc (l *LineDataSet) SetHoverBorderDashOffset(hoverBorderDashOffset float64) *LineDataSet {\n\tl.HoverBorderDashOffset = hoverBorderDashOffset\n\treturn l\n}\n\nfunc (l *LineDataSet) SetHoverBorderJoinStyle(hoverBorderJoinStyle string) *LineDataSet {\n\tl.HoverBorderJoinStyle = hoverBorderJoinStyle\n\treturn l\n}\n\nfunc (l *LineDataSet) SetHoverBorderWidth(hoverBorderWidth float64) *LineDataSet {\n\tl.HoverBorderWidth = hoverBorderWidth\n\treturn l\n}\n\nfunc (l *LineDataSet) SetLineTension(lineTension float64) *LineDataSet {\n\tl.LineTension = lineTension\n\treturn l\n}\n\nfunc (l *LineDataSet) SetOrder(order float64) *LineDataSet {\n\tl.Order = order\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointBackgroundColor(pointBackgroundColor Color) *LineDataSet {\n\tl.PointBackgroundColor = pointBackgroundColor\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointBorderColor(pointBorderColor Color) *LineDataSet {\n\tl.PointBorderColor = pointBorderColor\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointBorderWidth(pointBorderWidth float64) *LineDataSet {\n\tl.PointBorderWidth = pointBorderWidth\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointHitRadius(pointHitRadius float64) *LineDataSet {\n\tl.PointHitRadius = pointHitRadius\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointHoverBackgroundColor(pointHoverBackgroundColor Color) *LineDataSet {\n\tl.PointHoverBackgroundColor = pointHoverBackgroundColor\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointHoverBorderColor(pointHoverBorderColor Color) *LineDataSet {\n\tl.PointHoverBorderColor = pointHoverBorderColor\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointHoverBorderWidth(pointHoverBorderWidth float64) *LineDataSet {\n\tl.PointHoverBorderWidth = pointHoverBorderWidth\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointHoverRadius(pointHoverRadius float64) *LineDataSet {\n\tl.PointHoverRadius = pointHoverRadius\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointRadius(pointRadius float64) *LineDataSet {\n\tl.PointRadius = pointRadius\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointRotation(pointRotation float64) *LineDataSet {\n\tl.PointRotation = pointRotation\n\treturn l\n}\n\nfunc (l *LineDataSet) SetPointStyle(pointStyle string) *LineDataSet {\n\tl.PointStyle = pointStyle\n\treturn l\n}\n\nfunc (l *LineDataSet) SetShowLine(showLine bool) *LineDataSet {\n\tl.ShowLine = showLine\n\treturn l\n}\n\nfunc (l *LineDataSet) SetSpanGaps(spanGaps bool) *LineDataSet {\n\tl.SpanGaps = spanGaps\n\treturn l\n}\n\nfunc (l *LineDataSet) SetSteppedLine(steppedLine bool) *LineDataSet {\n\tl.SteppedLine = steppedLine\n\treturn l\n}\n\nfunc (l *LineDataSet) SetXAxisID(xAxisID string) *LineDataSet {\n\tl.XAxisID = xAxisID\n\treturn l\n}\n\nfunc (l *LineDataSet) SetYAxisID(yAxisID string) *LineDataSet {\n\tl.YAxisID = yAxisID\n\treturn l\n}\n\nfunc Line() *LineChart {\n\treturn &LineChart{\n\t\tChart: &Chart{\n\t\t\tBaseComponent: &template2.BaseComponent{\n\t\t\t\tName:     \"chartjs\",\n\t\t\t\tHTMLData: List[\"chartjs\"],\n\t\t\t},\n\t\t\tdataSetIndex: -1,\n\t\t},\n\t\tJsContent: LineJsContent{\n\t\t\tJsContent: JsContent{\n\t\t\t\tType: \"line\",\n\t\t\t},\n\t\t\tData: LineAttributes{\n\t\t\t\tAttributes: Attributes{\n\t\t\t\t\tLabels: make([]string, 0),\n\t\t\t\t},\n\t\t\t\tDataSets: make(LineDataSets, 0),\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc (l *LineChart) SetID(s string) *LineChart {\n\tl.ID = s\n\treturn l\n}\n\nfunc (l *LineChart) SetTitle(s template.HTML) *LineChart {\n\tl.Title = s\n\treturn l\n}\n\nfunc (l *LineChart) SetHeight(s int) *LineChart {\n\tl.Height = s\n\treturn l\n}\n\nfunc (l *LineChart) SetLabels(s []string) *LineChart {\n\tl.JsContent.Data.Labels = s\n\treturn l\n}\n\nfunc (l *LineChart) AddDataSet(s string) *LineChart {\n\tl.dataSetIndex++\n\tl.JsContent.Data.DataSets = l.JsContent.Data.DataSets.Add(&LineDataSet{\n\t\tType:  \"line\",\n\t\tLabel: s,\n\t})\n\treturn l\n}\n\nfunc (l *LineChart) DSLabel(s string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetLabel(s)\n\treturn l\n}\n\nfunc (l *LineChart) DSData(data []float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetData(data)\n\treturn l\n}\n\nfunc (l *LineChart) DSType(t string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetType(t)\n\treturn l\n}\n\nfunc (l *LineChart) DSBackgroundColor(backgroundColor Color) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBackgroundColor(backgroundColor)\n\treturn l\n}\n\nfunc (l *LineChart) DSBorderCapStyle(borderCapStyle string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderCapStyle(borderCapStyle)\n\treturn l\n}\n\nfunc (l *LineChart) DSBorderColor(borderColor Color) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderColor(borderColor)\n\treturn l\n}\n\nfunc (l *LineChart) DSBorderDash(borderDash []int) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderDash(borderDash)\n\treturn l\n}\n\nfunc (l *LineChart) DSBorderDashOffset(borderDashOffset float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderDashOffset(borderDashOffset)\n\treturn l\n}\n\nfunc (l *LineChart) DSBorderJoinStyle(borderJoinStyle string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderJoinStyle(borderJoinStyle)\n\treturn l\n}\n\nfunc (l *LineChart) DSBorderWidth(borderWidth float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderWidth(borderWidth)\n\treturn l\n}\n\nfunc (l *LineChart) DSCubicInterpolationMode(cubicInterpolationMode string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetCubicInterpolationMode(cubicInterpolationMode)\n\treturn l\n}\n\nfunc (l *LineChart) DSFill(fill bool) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetFill(fill)\n\treturn l\n}\n\nfunc (l *LineChart) DSHoverBackgroundColor(hoverBackgroundColor Color) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBackgroundColor(hoverBackgroundColor)\n\treturn l\n}\n\nfunc (l *LineChart) DSHoverBorderCapStyle(hoverBorderCapStyle string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderCapStyle(hoverBorderCapStyle)\n\treturn l\n}\n\nfunc (l *LineChart) DSHoverBorderColor(hoverBorderColor Color) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderColor(hoverBorderColor)\n\treturn l\n}\n\nfunc (l *LineChart) DSHoverBorderDash(hoverBorderDash float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderDash(hoverBorderDash)\n\treturn l\n}\n\nfunc (l *LineChart) DSHoverBorderDashOffset(hoverBorderDashOffset float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderDashOffset(hoverBorderDashOffset)\n\treturn l\n}\n\nfunc (l *LineChart) DSHoverBorderJoinStyle(hoverBorderJoinStyle string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderJoinStyle(hoverBorderJoinStyle)\n\treturn l\n}\n\nfunc (l *LineChart) DSHoverBorderWidth(hoverBorderWidth float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderWidth(hoverBorderWidth)\n\treturn l\n}\n\nfunc (l *LineChart) DSLineTension(lineTension float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetLineTension(lineTension)\n\treturn l\n}\n\nfunc (l *LineChart) DSOrder(order float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetOrder(order)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointBackgroundColor(pointBackgroundColor Color) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointBackgroundColor(pointBackgroundColor)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointBorderColor(pointBorderColor Color) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointBorderColor(pointBorderColor)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointBorderWidth(pointBorderWidth float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointBorderWidth(pointBorderWidth)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointHitRadius(pointHitRadius float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointHitRadius(pointHitRadius)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointHoverBackgroundColor(pointHoverBackgroundColor Color) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointHoverBackgroundColor(pointHoverBackgroundColor)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointHoverBorderColor(pointHoverBorderColor Color) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointHoverBorderColor(pointHoverBorderColor)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointHoverBorderWidth(pointHoverBorderWidth float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointHoverBorderWidth(pointHoverBorderWidth)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointHoverRadius(pointHoverRadius float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointHoverRadius(pointHoverRadius)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointRadius(pointRadius float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointRadius(pointRadius)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointRotation(pointRotation float64) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointRotation(pointRotation)\n\treturn l\n}\n\nfunc (l *LineChart) DSPointStyle(pointStyle string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetPointStyle(pointStyle)\n\treturn l\n}\n\nfunc (l *LineChart) DSShowLine(showLine bool) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetShowLine(showLine)\n\treturn l\n}\n\nfunc (l *LineChart) DSSpanGaps(spanGaps bool) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetSpanGaps(spanGaps)\n\treturn l\n}\n\nfunc (l *LineChart) DSSteppedLine(steppedLine bool) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetSteppedLine(steppedLine)\n\treturn l\n}\n\nfunc (l *LineChart) DSXAxisID(xAxisID string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetXAxisID(xAxisID)\n\treturn l\n}\n\nfunc (l *LineChart) DSYAxisID(yAxisID string) *LineChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetYAxisID(yAxisID)\n\treturn l\n}\n\nfunc (l *LineChart) GetContent() template.HTML {\n\tbuffer := new(bytes.Buffer)\n\ttmpl, defineName := l.GetTemplate()\n\n\tif l.JsContentOptions != nil {\n\t\tl.JsContent.Options = l.JsContentOptions\n\t}\n\n\tjsonByte, _ := json.Marshal(l.JsContent)\n\tl.Js = template.JS(string(jsonByte))\n\n\terr := tmpl.ExecuteTemplate(buffer, defineName, l)\n\tif err != nil {\n\t\tfmt.Println(\"ComposeHtml Error:\", err)\n\t}\n\treturn template.HTML(buffer.String())\n}\n"
  },
  {
    "path": "template/chartjs/pie.go",
    "content": "package chartjs\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"html/template\"\n\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n)\n\ntype PieChart struct {\n\t*Chart\n\n\tJsContent PieJsContent\n}\n\ntype PieJsContent struct {\n\tJsContent\n\n\tData PieAttributes `json:\"data\"`\n}\n\ntype PieAttributes struct {\n\tAttributes\n\n\tDataSets PieDataSets `json:\"datasets\"`\n}\n\ntype PieDataSets []*PieDataSet\n\nfunc (l PieDataSets) Add(ds *PieDataSet) PieDataSets {\n\treturn append(l, ds)\n}\n\ntype PieDataSet struct {\n\tLabel           string    `json:\"label\"`\n\tData            []float64 `json:\"data\"`\n\tType            string    `json:\"type,omitempty\"`\n\tBackgroundColor []Color   `json:\"backgroundColor,omitempty\"`\n\tBorderColor     Color     `json:\"borderColor,omitempty\"`\n\n\tBorderWidth float64 `json:\"borderWidth,omitempty\"`\n\tBorderAlign string  `json:\"borderAlign,omitempty\"`\n\n\tHoverBackgroundColor Color   `json:\"hoverBackgroundColor,omitempty\"`\n\tHoverBorderColor     Color   `json:\"hoverBorderColor,omitempty\"`\n\tHoverBorderWidth     float64 `json:\"hoverBorderWidth,omitempty\"`\n\n\tWeight int `json:\"weight,omitempty\"`\n}\n\nfunc (l *PieDataSet) SetLabel(label string) *PieDataSet {\n\tl.Label = label\n\treturn l\n}\n\nfunc (l *PieDataSet) SetData(data []float64) *PieDataSet {\n\tl.Data = data\n\treturn l\n}\n\nfunc (l *PieDataSet) SetType(t string) *PieDataSet {\n\tl.Type = t\n\treturn l\n}\n\nfunc (l *PieDataSet) SetBackgroundColor(backgroundColor []Color) *PieDataSet {\n\tl.BackgroundColor = backgroundColor\n\treturn l\n}\n\nfunc (l *PieDataSet) SetBorderAlign(align string) *PieDataSet {\n\tl.BorderAlign = align\n\treturn l\n}\n\nfunc (l *PieDataSet) SetBorderColor(borderColor Color) *PieDataSet {\n\tl.BorderColor = borderColor\n\treturn l\n}\n\nfunc (l *PieDataSet) SetBorderWidth(borderWidth float64) *PieDataSet {\n\tl.BorderWidth = borderWidth\n\treturn l\n}\n\nfunc (l *PieDataSet) SetWeight(weight int) *PieDataSet {\n\tl.Weight = weight\n\treturn l\n}\n\nfunc (l *PieDataSet) SetHoverBackgroundColor(hoverBackgroundColor Color) *PieDataSet {\n\tl.HoverBackgroundColor = hoverBackgroundColor\n\treturn l\n}\n\nfunc (l *PieDataSet) SetHoverBorderColor(hoverBorderColor Color) *PieDataSet {\n\tl.HoverBorderColor = hoverBorderColor\n\treturn l\n}\n\nfunc (l *PieDataSet) SetHoverBorderWidth(hoverBorderWidth float64) *PieDataSet {\n\tl.HoverBorderWidth = hoverBorderWidth\n\treturn l\n}\n\nfunc Pie() *PieChart {\n\treturn &PieChart{\n\t\tChart: &Chart{\n\t\t\tBaseComponent: &template2.BaseComponent{\n\t\t\t\tName:     \"chartjs\",\n\t\t\t\tHTMLData: List[\"chartjs\"],\n\t\t\t},\n\t\t\tdataSetIndex: -1,\n\t\t},\n\t\tJsContent: PieJsContent{\n\t\t\tJsContent: JsContent{\n\t\t\t\tType: \"pie\",\n\t\t\t},\n\t\t\tData: PieAttributes{\n\t\t\t\tAttributes: Attributes{\n\t\t\t\t\tLabels: make([]string, 0),\n\t\t\t\t},\n\t\t\t\tDataSets: make(PieDataSets, 0),\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc (l *PieChart) SetID(s string) *PieChart {\n\tl.ID = s\n\treturn l\n}\n\nfunc (l *PieChart) SetTitle(s template.HTML) *PieChart {\n\tl.Title = s\n\treturn l\n}\n\nfunc (l *PieChart) SetHeight(s int) *PieChart {\n\tl.Height = s\n\treturn l\n}\n\nfunc (l *PieChart) SetLabels(s []string) *PieChart {\n\tl.JsContent.Data.Labels = s\n\treturn l\n}\n\nfunc (l *PieChart) AddDataSet(s string) *PieChart {\n\tl.dataSetIndex++\n\tl.JsContent.Data.DataSets = l.JsContent.Data.DataSets.Add(&PieDataSet{\n\t\tType:  \"pie\",\n\t\tLabel: s,\n\t})\n\treturn l\n}\n\nfunc (l *PieChart) DSLabel(s string) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetLabel(s)\n\treturn l\n}\n\nfunc (l *PieChart) DSData(data []float64) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetData(data)\n\treturn l\n}\n\nfunc (l *PieChart) DSType(t string) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetType(t)\n\treturn l\n}\n\nfunc (l *PieChart) DSBackgroundColor(backgroundColor []Color) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBackgroundColor(backgroundColor)\n\treturn l\n}\n\nfunc (l *PieChart) DSBorderColor(borderColor Color) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderColor(borderColor)\n\treturn l\n}\n\nfunc (l *PieChart) DSBorderWidth(borderWidth float64) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetBorderWidth(borderWidth)\n\treturn l\n}\n\nfunc (l *PieChart) DSWeight(weight int) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetWeight(weight)\n\treturn l\n}\n\nfunc (l *PieChart) DSHoverBackgroundColor(hoverBackgroundColor Color) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBackgroundColor(hoverBackgroundColor)\n\treturn l\n}\n\nfunc (l *PieChart) DSHoverBorderColor(hoverBorderColor Color) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderColor(hoverBorderColor)\n\treturn l\n}\n\nfunc (l *PieChart) DSHoverBorderWidth(hoverBorderWidth float64) *PieChart {\n\tl.JsContent.Data.DataSets[l.dataSetIndex].SetHoverBorderWidth(hoverBorderWidth)\n\treturn l\n}\n\nfunc (l *PieChart) GetContent() template.HTML {\n\tbuffer := new(bytes.Buffer)\n\ttmpl, defineName := l.GetTemplate()\n\n\tif l.JsContentOptions != nil {\n\t\tl.JsContent.Options = l.JsContentOptions\n\t}\n\n\tjsonByte, _ := json.Marshal(l.JsContent)\n\tl.Js = template.JS(string(jsonByte))\n\n\terr := tmpl.ExecuteTemplate(buffer, defineName, l)\n\tif err != nil {\n\t\tfmt.Println(\"ComposeHtml Error:\", err)\n\t}\n\treturn template.HTML(buffer.String())\n}\n"
  },
  {
    "path": "template/chartjs/radar.go",
    "content": "package chartjs\n"
  },
  {
    "path": "template/chartjs/template.go",
    "content": "package chartjs\n\nvar List = map[string]string{\n\t\"chartjs\": `{{define \"chartjs\"}}\n    {{if ne .Title \"\"}}\n        <p class=\"text-center\">\n            <strong>{{langHtml .Title}}</strong>\n        </p>\n    {{end}}\n    <div class=\"chart\">\n        <canvas id=\"{{.ID}}\" style=\"height: {{.Height}}px;\"></canvas>\n    </div>\n    <script>\n        new Chart(document.getElementById('{{.ID}}'), {{.Js}});\n    </script>\n{{end}}`,\n}\n"
  },
  {
    "path": "template/color/color.go",
    "content": "package color\n\nconst (\n\tIndianRed   = \"#CD5C5C\"\n\tLightCoral  = \"#F08080\"\n\tSalmon      = \"#FA8072\"\n\tDarkSalmon  = \"#E9967A\"\n\tLightSalmon = \"#FFA07A\"\n\tCrimson     = \"#DC143C\"\n\tRed         = \"#FF0000\"\n\tFireBrick   = \"#B22222\"\n\tDarkRed     = \"#8B0000\"\n\n\tCornsilk       = \"#FFF8DC\"\n\tBlanchedAlmond = \"#FFEBCD\"\n\tBisque         = \"#FFE4C4\"\n\tNavajoWhite    = \"#FFDEAD\"\n\tWheat          = \"#F5DEB3\"\n\tBurlyWood      = \"#DEB887\"\n\tTan            = \"#D2B48C\"\n\tRosyBrown      = \"#BC8F8F\"\n\tSandyBrown     = \"#F4A460\"\n\tGoldenrod      = \"#DAA520\"\n\tDarkGoldenrod  = \"#B8860B\"\n\tPeru           = \"#CD853F\"\n\tChocolate      = \"#D2691E\"\n\tSaddleBrown    = \"#8B4513\"\n\tSienna         = \"#A0522D\"\n\tBrown          = \"#A52A2A\"\n\tMaroon         = \"#800000\"\n\n\tPink            = \"#FFC0CB\"\n\tLightPink       = \"#FFB6C1\"\n\tHotPink         = \"#FF69B4\"\n\tDeepPink        = \"#FF1493\"\n\tMediumVioletRed = \"#C71585\"\n\tPaleVioletRed   = \"#DB7093\"\n\n\tGreenYellow       = \"#ADFF2F\"\n\tChartreuse        = \"#7FFF00\"\n\tLawnGreen         = \"#7CFC00\"\n\tLime              = \"#00FF00\"\n\tLimeGreen         = \"#32CD32\"\n\tPaleGreen         = \"#98FB98\"\n\tLightGreen        = \"#90EE90\"\n\tMediumSpringGreen = \"#00FA9A\"\n\tSpringGreen       = \"#00FF7F\"\n\tMediumSeaGreen    = \"#3CB371\"\n\tSeaGreen          = \"#2E8B57\"\n\tForestGreen       = \"#228B22\"\n\tGreen             = \"#008000\"\n\tDarkGreen         = \"#006400\"\n\tYellowGreen       = \"#9ACD32\"\n\tOliveDrab         = \"#6B8E23\"\n\tOlive             = \"#808000\"\n\tDarkOliveGreen    = \"#556B2F\"\n\tMediumAquamarine  = \"#66CDAA\"\n\tDarkSeaGreen      = \"#8FBC8F\"\n\tLightSeaGreen     = \"#20B2AA\"\n\tDarkCyan          = \"#008B8B\"\n\tTeal              = \"#008080\"\n\n\tCoral      = \"#FF7F50\"\n\tTomato     = \"#FF6347\"\n\tOrangeRed  = \"#FF4500\"\n\tDarkOrange = \"#FF8C00\"\n\tOrange     = \"#FFA500\"\n\n\tWhite         = \"#FFFFFF\"\n\tSnow          = \"#FFFAFA\"\n\tHoneydew      = \"#F0FFF0\"\n\tMintCream     = \"#F5FFFA\"\n\tAzure         = \"#F0FFFF\"\n\tAliceBlue     = \"#F0F8FF\"\n\tGhostWhite    = \"#F8F8FF\"\n\tWhiteSmoke    = \"#F5F5F5\"\n\tSeashell      = \"#FFF5EE\"\n\tBeige         = \"#F5F5DC\"\n\tOldLace       = \"#FDF5E6\"\n\tFloralWhite   = \"#FFFAF0\"\n\tIvory         = \"#FFFFF0\"\n\tAntiqueWhite  = \"#FAEBD7\"\n\tLinen         = \"#FAF0E6\"\n\tLavenderBlush = \"#FFF0F5\"\n\tMistyRose     = \"#FFE4E1\"\n\n\tGold                 = \"#FFD700\"\n\tYellow               = \"#FFFF00\"\n\tLightYellow          = \"#FFFFE0\"\n\tLemonChiffon         = \"#FFFACD\"\n\tLightGoldenrodYellow = \"#FAFAD2\"\n\tPapayaWhip           = \"#FFEFD5\"\n\tMoccasin             = \"#FFE4B5\"\n\tPeachPuff            = \"#FFDAB9\"\n\tPaleGoldenrod        = \"#EEE8AA\"\n\tKhaki                = \"#F0E68C\"\n\tDarkKhaki            = \"#BDB76B\"\n\n\tGainsboro      = \"#DCDCDC\"\n\tLightGrey      = \"#D3D3D3\"\n\tSilver         = \"#C0C0C0\"\n\tDarkGray       = \"#A9A9A9\"\n\tGray           = \"#808080\"\n\tDimGray        = \"#696969\"\n\tLightSlateGray = \"#778899\"\n\tSlateGray      = \"#708090\"\n\tDarkSlateGray  = \"#2F4F4F\"\n\tBlack          = \"#000000\"\n\n\tAqua            = \"#00FFFF\"\n\tCyan            = \"#00FFFF\"\n\tLightCyan       = \"#E0FFFF\"\n\tPaleTurquoise   = \"#AFEEEE\"\n\tAquamarine      = \"#7FFFD4\"\n\tTurquoise       = \"#40E0D0\"\n\tMediumTurquoise = \"#48D1CC\"\n\tDarkTurquoise   = \"#00CED1\"\n\tCadetBlue       = \"#5F9EA0\"\n\tSteelBlue       = \"#4682B4\"\n\tLightSteelBlue  = \"#B0C4DE\"\n\tPowderBlue      = \"#B0E0E6\"\n\tLightBlue       = \"#ADD8E6\"\n\tSkyBlue         = \"#87CEEB\"\n\tLightSkyBlue    = \"#87CEFA\"\n\tDeepSkyBlue     = \"#00BFFF\"\n\tDodgerBlue      = \"#1E90FF\"\n\tCornflowerBlue  = \"#6495ED\"\n\tMediumSlateBlue = \"#7B68EE\"\n\tRoyalBlue       = \"#4169E1\"\n\tBlue            = \"#0000FF\"\n\tMediumBlue      = \"#0000CD\"\n\tDarkBlue        = \"#00008B\"\n\tNavy            = \"#000080\"\n\tMidnightBlue    = \"#191970\"\n\n\tLavender      = \"#E6E6FA\"\n\tThistle       = \"#D8BFD8\"\n\tPlum          = \"#DDA0DD\"\n\tViolet        = \"#EE82EE\"\n\tOrchid        = \"#DA70D6\"\n\tFuchsia       = \"#FF00FF\"\n\tMagenta       = \"#FF00FF\"\n\tMediumOrchid  = \"#BA55D3\"\n\tMediumPurple  = \"#9370DB\"\n\tAmethyst      = \"#9966CC\"\n\tBlueViolet    = \"#8A2BE2\"\n\tDarkViolet    = \"#9400D3\"\n\tDarkOrchid    = \"#9932CC\"\n\tDarkMagenta   = \"#8B008B\"\n\tPurple        = \"#800080\"\n\tIndigo        = \"#4B0082\"\n\tSlateBlue     = \"#6A5ACD\"\n\tDarkSlateBlue = \"#483D8B\"\n)\n"
  },
  {
    "path": "template/components/alert.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype AlertAttribute struct {\n\tName    string\n\tTheme   string\n\tTitle   template.HTML\n\tContent template.HTML\n\ttypes.Attribute\n}\n\nfunc (compo *AlertAttribute) SetTheme(value string) types.AlertAttribute {\n\tcompo.Theme = value\n\treturn compo\n}\n\nfunc (compo *AlertAttribute) SetTitle(value template.HTML) types.AlertAttribute {\n\tcompo.Title = value\n\treturn compo\n}\n\nfunc (compo *AlertAttribute) SetContent(value template.HTML) types.AlertAttribute {\n\tcompo.Content = value\n\treturn compo\n}\n\nfunc (compo *AlertAttribute) Warning(msg string) template.HTML {\n\treturn compo.SetTitle(errors.MsgWithIcon).\n\t\tSetTheme(\"warning\").\n\t\tSetContent(language.GetFromHtml(template.HTML(msg))).\n\t\tGetContent()\n}\n\nfunc (compo *AlertAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"alert\")\n}\n"
  },
  {
    "path": "template/components/base.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\ntype Base struct {\n\tAttribute types.Attribute\n}\n\nfunc (b Base) Box() types.BoxAttribute {\n\treturn &BoxAttribute{\n\t\tName:       \"box\",\n\t\tHeader:     template.HTML(\"\"),\n\t\tBody:       template.HTML(\"\"),\n\t\tFooter:     template.HTML(\"\"),\n\t\tTitle:      \"\",\n\t\tHeadBorder: \"\",\n\t\tAttribute:  b.Attribute,\n\t}\n}\n\nfunc (b Base) Col() types.ColAttribute {\n\treturn &ColAttribute{\n\t\tName:      \"col\",\n\t\tSize:      \"col-md-2\",\n\t\tContent:   \"\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Form() types.FormAttribute {\n\treturn &FormAttribute{\n\t\tName:         \"form\",\n\t\tContent:      []types.FormField{},\n\t\tUrl:          \"/\",\n\t\tMethod:       \"post\",\n\t\tHiddenFields: make(map[string]string),\n\t\tLayout:       form.LayoutDefault,\n\t\tTitle:        \"edit\",\n\t\tAttribute:    b.Attribute,\n\t\tCdnUrl:       config.GetAssetUrl(),\n\t\tHeadWidth:    2,\n\t\tInputWidth:   8,\n\t}\n}\n\nfunc (b Base) Image() types.ImgAttribute {\n\treturn &ImgAttribute{\n\t\tName:      \"image\",\n\t\tWidth:     \"50\",\n\t\tHeight:    \"50\",\n\t\tSrc:       \"\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Tabs() types.TabsAttribute {\n\treturn &TabsAttribute{\n\t\tName:      \"tabs\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Alert() types.AlertAttribute {\n\treturn &AlertAttribute{\n\t\tName:      \"alert\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Label() types.LabelAttribute {\n\treturn &LabelAttribute{\n\t\tName:      \"label\",\n\t\tType:      \"\",\n\t\tContent:   \"\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Link() types.LinkAttribute {\n\treturn &LinkAttribute{\n\t\tName:      \"link\",\n\t\tContent:   \"\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Popup() types.PopupAttribute {\n\treturn &PopupAttribute{\n\t\tName:      \"popup\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Paginator() types.PaginatorAttribute {\n\treturn &PaginatorAttribute{\n\t\tName:      \"paginator\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Row() types.RowAttribute {\n\treturn &RowAttribute{\n\t\tName:      \"row\",\n\t\tContent:   \"\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Button() types.ButtonAttribute {\n\treturn &ButtonAttribute{\n\t\tName:      \"button\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Table() types.TableAttribute {\n\treturn &TableAttribute{\n\t\tName:      \"table\",\n\t\tThead:     make(types.Thead, 0),\n\t\tInfoList:  make([]map[string]types.InfoItem, 0),\n\t\tType:      \"table\",\n\t\tStyle:     \"hover\",\n\t\tLayout:    \"auto\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) DataTable() types.DataTableAttribute {\n\treturn &DataTableAttribute{\n\t\tTableAttribute: *(b.Table().\n\t\t\tSetStyle(\"hover\").\n\t\t\tSetName(\"data-table\").\n\t\t\tSetType(\"data-table\").(*TableAttribute)),\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) Tree() types.TreeAttribute {\n\treturn &TreeAttribute{\n\t\tName:      \"tree\",\n\t\tTree:      make([]menu.Item, 0),\n\t\tAttribute: b.Attribute,\n\t}\n}\n\nfunc (b Base) TreeView() types.TreeViewAttribute {\n\treturn &TreeViewAttribute{\n\t\tName:      \"treeview\",\n\t\tAttribute: b.Attribute,\n\t}\n}\n"
  },
  {
    "path": "template/components/box.go",
    "content": "package components\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype BoxAttribute struct {\n\tName              string\n\tHeader            template.HTML\n\tBody              template.HTML\n\tFooter            template.HTML\n\tTitle             template.HTML\n\tTheme             string\n\tHeadBorder        string\n\tAttr              template.HTMLAttr\n\tHeadColor         string\n\tClass             string\n\tSecondHeaderClass string\n\tSecondHeader      template.HTML\n\tSecondHeadBorder  string\n\tSecondHeadColor   string\n\tStyle             template.HTMLAttr\n\tPadding           string\n\ttypes.Attribute\n}\n\nfunc (compo *BoxAttribute) SetTheme(value string) types.BoxAttribute {\n\tcompo.Theme = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetClass(value string) types.BoxAttribute {\n\tcompo.Class = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetHeader(value template.HTML) types.BoxAttribute {\n\tcompo.Header = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetBody(value template.HTML) types.BoxAttribute {\n\tcompo.Body = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetStyle(value template.HTMLAttr) types.BoxAttribute {\n\tcompo.Style = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetAttr(attr template.HTMLAttr) types.BoxAttribute {\n\tcompo.Attr = attr\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetIframeStyle(iframe bool) types.BoxAttribute {\n\tif iframe {\n\t\tcompo.Attr = `style=\"border-radius: 0px;box-shadow:none;border-top:none;margin-bottom: 0px;\"`\n\t}\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetFooter(value template.HTML) types.BoxAttribute {\n\tcompo.Footer = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetTitle(value template.HTML) types.BoxAttribute {\n\tcompo.Title = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetHeadColor(value string) types.BoxAttribute {\n\tcompo.HeadColor = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) WithHeadBorder() types.BoxAttribute {\n\tcompo.HeadBorder = \"with-border\"\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetSecondHeader(value template.HTML) types.BoxAttribute {\n\tcompo.SecondHeader = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetSecondHeadColor(value string) types.BoxAttribute {\n\tcompo.SecondHeadColor = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetSecondHeaderClass(value string) types.BoxAttribute {\n\tcompo.SecondHeaderClass = value\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) SetNoPadding() types.BoxAttribute {\n\tcompo.Padding = \"padding:0;\"\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) WithSecondHeadBorder() types.BoxAttribute {\n\tcompo.SecondHeadBorder = \"with-border\"\n\treturn compo\n}\n\nfunc (compo *BoxAttribute) GetContent() template.HTML {\n\n\tif compo.Style == \"\" {\n\t\tcompo.Style = template.HTMLAttr(fmt.Sprintf(`style=\"%s\"`, compo.Padding))\n\t} else {\n\t\tcompo.Style = template.HTMLAttr(fmt.Sprintf(`style=\"%s\"`, string(compo.Style)+compo.Padding))\n\t}\n\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"box\")\n}\n"
  },
  {
    "path": "template/components/button.go",
    "content": "package components\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype ButtonAttribute struct {\n\tName        string\n\tContent     template.HTML\n\tOrientation string\n\tLoadingText template.HTML\n\tTheme       string\n\tType        string\n\tSize        string\n\tHref        string\n\tClass       string\n\tID          string\n\tStyle       template.HTMLAttr\n\tMarginLeft  int\n\tMarginRight int\n\ttypes.Attribute\n}\n\nfunc (compo *ButtonAttribute) SetContent(value template.HTML) types.ButtonAttribute {\n\tcompo.Content = value\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetOrientationRight() types.ButtonAttribute {\n\tcompo.Orientation = \"pull-right\"\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetOrientationLeft() types.ButtonAttribute {\n\tcompo.Orientation = \"pull-left\"\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetMarginLeft(px int) types.ButtonAttribute {\n\tcompo.MarginLeft = px\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetSmallSize() types.ButtonAttribute {\n\tcompo.Size = \"btn-sm\"\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetMiddleSize() types.ButtonAttribute {\n\tcompo.Size = \"btn-md\"\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetMarginRight(px int) types.ButtonAttribute {\n\tcompo.MarginRight = px\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetLoadingText(value template.HTML) types.ButtonAttribute {\n\tcompo.LoadingText = value\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetThemePrimary() types.ButtonAttribute {\n\tcompo.Theme = \"primary\"\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetThemeDefault() types.ButtonAttribute {\n\tcompo.Theme = \"default\"\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetThemeWarning() types.ButtonAttribute {\n\tcompo.Theme = \"warning\"\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetHref(href string) types.ButtonAttribute {\n\tcompo.Href = href\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) AddClass(class string) types.ButtonAttribute {\n\tcompo.Class += \" \" + class\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetID(id string) types.ButtonAttribute {\n\tcompo.ID = id\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetTheme(value string) types.ButtonAttribute {\n\tcompo.Theme = value\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) SetType(value string) types.ButtonAttribute {\n\tcompo.Type = value\n\treturn compo\n}\n\nfunc (compo *ButtonAttribute) GetContent() template.HTML {\n\n\tif compo.MarginLeft != 0 {\n\t\tcompo.Style = template.HTMLAttr(fmt.Sprintf(`style=\"margin-left:%dpx;\"`, compo.MarginLeft))\n\t}\n\n\tif compo.MarginRight != 0 {\n\t\tcompo.Style = template.HTMLAttr(fmt.Sprintf(`style=\"margin-right:%dpx;\"`, compo.MarginRight))\n\t}\n\n\tif compo.LoadingText == \"\" {\n\t\tcompo.LoadingText = icon.Icon(icon.Spinner, 1) + language.GetFromHtml(`Save`)\n\t}\n\n\tif compo.ID == \"\" {\n\t\tcompo.ID = utils.Uuid(15) + \"_btn\"\n\t}\n\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"button\")\n}\n"
  },
  {
    "path": "template/components/col.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype ColAttribute struct {\n\tName    string\n\tContent template.HTML\n\tSize    string\n\ttypes.Attribute\n}\n\nfunc (compo *ColAttribute) SetContent(value template.HTML) types.ColAttribute {\n\tcompo.Content = value\n\treturn compo\n}\n\nfunc (compo *ColAttribute) AddContent(value template.HTML) types.ColAttribute {\n\tcompo.Content += value\n\treturn compo\n}\n\nfunc (compo *ColAttribute) SetSize(value types.S) types.ColAttribute {\n\tcompo.Size = \"\"\n\tfor key, size := range value {\n\t\tcompo.Size += \"col-\" + key + \"-\" + size + \" \"\n\t}\n\treturn compo\n}\n\nfunc (compo *ColAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"col\")\n}\n"
  },
  {
    "path": "template/components/composer.go",
    "content": "package components\n\nimport (\n\t\"bytes\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n)\n\nfunc ComposeHtml(temList map[string]string, separation bool, compo interface{}, templateName ...string) template.HTML {\n\n\ttmplName := \"\"\n\tif len(templateName) > 0 {\n\t\ttmplName = templateName[0] + \" \"\n\t}\n\n\tvar (\n\t\ttmpl *template.Template\n\t\terr  error\n\t)\n\n\tif separation {\n\t\tfiles := make([]string, 0)\n\t\troot := config.GetAssetRootPath() + \"pages/\"\n\t\tfor _, v := range templateName {\n\t\t\tfiles = append(files, root+temList[\"components/\"+v]+\".tmpl\")\n\t\t}\n\t\ttmpl, err = template.New(\"comp\").Funcs(template2.DefaultFuncMap).ParseFiles(files...)\n\t} else {\n\t\tvar text = \"\"\n\t\tfor _, v := range templateName {\n\t\t\ttext += temList[\"components/\"+v]\n\t\t}\n\t\ttmpl, err = template.New(\"comp\").Funcs(template2.DefaultFuncMap).Parse(text)\n\t}\n\n\tif err != nil {\n\t\tlogger.Panic(tmplName + \"ComposeHtml Error:\" + err.Error())\n\t\treturn \"\"\n\t}\n\tbuf := new(bytes.Buffer)\n\n\tdefineName := utils.ReplaceAll(templateName[0], \"table/\", \"\", \"form/\", \"\")\n\n\terr = tmpl.ExecuteTemplate(buf, defineName, compo)\n\tif err != nil {\n\t\tlogger.Error(tmplName+\" ComposeHtml Error:\", err)\n\t}\n\treturn template.HTML(buf.String())\n}\n"
  },
  {
    "path": "template/components/form.go",
    "content": "package components\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\tform2 \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\ntype FormAttribute struct {\n\tName            string\n\tId              string\n\tHeader          template.HTML\n\tContent         types.FormFields\n\tContentList     []types.FormFields\n\tLayout          form.Layout\n\tTabContents     []types.FormFields\n\tTabHeaders      []string\n\tFooter          template.HTML\n\tUrl             string\n\tFieldsHTML      template.HTML\n\tMethod          string\n\tPrimaryKey      string\n\tAjax            bool\n\tAjaxSuccessJS   template.JS\n\tAjaxErrorJS     template.JS\n\tHeadWidth       int\n\tInputWidth      int\n\tHiddenFields    map[string]string\n\tTitle           template.HTML\n\tOperationFooter template.HTML\n\tPrefix          string\n\tCdnUrl          string\n\tHorizontal      bool\n\ttypes.Attribute\n}\n\nfunc (compo *FormAttribute) SetHeader(value template.HTML) types.FormAttribute {\n\tcompo.Header = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetPrimaryKey(value string) types.FormAttribute {\n\tcompo.PrimaryKey = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetHorizontal(value bool) types.FormAttribute {\n\tcompo.Horizontal = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetContent(value types.FormFields) types.FormAttribute {\n\tcompo.Content = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetId(id string) types.FormAttribute {\n\tcompo.Id = id\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetAjax(successJS, errorJS template.JS) types.FormAttribute {\n\tif successJS != template.JS(\"\") && errorJS != template.JS(\"\") {\n\t\tcompo.Ajax = true\n\t\tcompo.AjaxErrorJS = errorJS\n\t\tcompo.AjaxSuccessJS = successJS\n\t}\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetTabContents(value []types.FormFields) types.FormAttribute {\n\tcompo.TabContents = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetTabHeaders(value []string) types.FormAttribute {\n\tcompo.TabHeaders = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetHeadWidth(width int) types.FormAttribute {\n\tif width > 0 {\n\t\tif width > 12 {\n\t\t\twidth = 12\n\t\t}\n\t\tcompo.HeadWidth = width\n\t}\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetInputWidth(width int) types.FormAttribute {\n\tif width > 0 {\n\t\tif width > 12 {\n\t\t\twidth = 12\n\t\t}\n\t\tcompo.InputWidth = width\n\t}\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetFieldsHTML(html template.HTML) types.FormAttribute {\n\tcompo.FieldsHTML = html\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetFooter(value template.HTML) types.FormAttribute {\n\tcompo.Footer = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetLayout(layout form.Layout) types.FormAttribute {\n\tcompo.Layout = layout\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetPrefix(value string) types.FormAttribute {\n\tcompo.Prefix = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetUrl(value string) types.FormAttribute {\n\tcompo.Url = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetHiddenFields(fields map[string]string) types.FormAttribute {\n\tcompo.HiddenFields = fields\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetMethod(value string) types.FormAttribute {\n\tcompo.Method = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) SetTitle(value template.HTML) types.FormAttribute {\n\tcompo.Title = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) GetDefaultBoxHeader(hideBack bool) template.HTML {\n\tif hideBack {\n\t\treturn template.HTML(fmt.Sprintf(`<h3 class=\"box-title\">%s</h3>`, language.GetFromHtml(compo.Title)))\n\t}\n\treturn template.HTML(fmt.Sprintf(`<h3 class=\"box-title\">%s</h3>\n            <div class=\"box-tools\">\n                <div class=\"btn-group pull-right\" style=\"margin-right: 10px\">\n                    <a href='%s' class=\"btn btn-sm btn-default form-history-back\"><i\n                                class=\"fa fa-arrow-left\"></i> %s</a>\n                </div>\n            </div>`, language.GetFromHtml(compo.Title), compo.HiddenFields[form2.PreviousKey], language.Get(\"Back\")))\n}\n\nfunc (compo *FormAttribute) GetDetailBoxHeader(editUrl, deleteUrl string) template.HTML {\n\n\tvar (\n\t\teditBtn   string\n\t\tdeleteBtn string\n\t)\n\n\tif editUrl != \"\" {\n\t\teditBtn = fmt.Sprintf(`\n                <div class=\"btn-group pull-right\" style=\"margin-right: 10px\">\n                    <a href='%s' class=\"btn btn-sm btn-primary\"><i\n                                class=\"fa fa-edit\"></i> %s</a>\n                </div>`, editUrl, language.Get(\"Edit\"))\n\t}\n\n\tif deleteUrl != \"\" {\n\t\tdeleteBtn = fmt.Sprintf(`\n                <div class=\"btn-group pull-right\" style=\"margin-right: 10px\">\n                    <a href='javascript:;' class=\"btn btn-sm btn-danger delete-btn\"><i\n                                class=\"fa fa-trash\"></i> %s</a>\n                </div>`, language.Get(\"Delete\"))\n\t}\n\n\treturn template.HTML(`<h3 class=\"box-title\">`) + language.GetFromHtml(compo.Title) + template.HTML(`</h3>\n            <div class=\"box-tools\">\n\t\t\t\t`+deleteBtn+editBtn+`\n                <div class=\"btn-group pull-right\" style=\"margin-right: 10px\">\n                    <a href='`+compo.HiddenFields[form2.PreviousKey]+`' class=\"btn btn-sm btn-default form-history-back\"><i\n                                class=\"fa fa-arrow-left\"></i> `+language.Get(\"Back\")+`</a>\n                </div>\n            </div>`)\n}\n\nfunc (compo *FormAttribute) GetBoxHeaderNoButton() template.HTML {\n\treturn template.HTML(fmt.Sprintf(`<h3 class=\"box-title\">%s</h3>`, language.GetFromHtml(compo.Title)))\n}\n\nfunc (compo *FormAttribute) SetOperationFooter(value template.HTML) types.FormAttribute {\n\tcompo.OperationFooter = value\n\treturn compo\n}\n\nfunc (compo *FormAttribute) GetContent() template.HTML {\n\tcompo.CdnUrl = config.GetAssetUrl()\n\tif compo.Id == \"\" {\n\t\tcompo.Id = utils.Uuid(10)\n\t}\n\n\tif col := compo.Layout.Col(); col > 0 {\n\t\tcompo.ContentList = make([]types.FormFields, col)\n\t\tindex := 0\n\t\tfor i := 0; i < len(compo.Content); i++ {\n\t\t\tii := index % col\n\t\t\tcompo.ContentList[ii] = append(compo.ContentList[ii], compo.Content[i])\n\t\t\tif i < len(compo.Content)-1 {\n\t\t\t\tif strings.Contains(compo.Content[i+1].Field, \"__goadmin_operator__\") {\n\t\t\t\t\tcompo.ContentList[ii] = append(compo.ContentList[ii], compo.Content[i+1])\n\t\t\t\t\ti++\n\t\t\t\t}\n\t\t\t}\n\t\t\tindex++\n\t\t}\n\t}\n\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"form\",\n\t\t\"form/default\", \"form/file\", \"form/multi_file\", \"form/textarea\", \"form/custom\", \"form/rate\", \"form/slider\",\n\t\t\"form/selectbox\", \"form/text\", \"form/table\", \"form/radio\", \"form/switch\", \"form/checkbox\", \"form/checkbox_single\",\n\t\t\"form/checkbox_stacked\", \"form/password\", \"form/code\", \"form/array\", \"form/select\", \"form/singleselect\",\n\t\t\"form/richtext\", \"form/iconpicker\", \"form/datetime\", \"form/number\", \"form/number_range\",\n\t\t\"form/email\", \"form/url\", \"form/ip\", \"form/color\", \"form/currency\", \"form_components\", \"form/datetime_range\",\n\t\t\"form_layout_default\", \"form_layout_two_col\", \"form_layout_tab\", \"form_components_layout\", \"form_layout_flow\", \"form_layout_filter\")\n}\n"
  },
  {
    "path": "template/components/image.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype ImgAttribute struct {\n\tName     string\n\tWidth    string\n\tHeight   string\n\tUuid     string\n\tHasModal bool\n\tSrc      template.URL\n\ttypes.Attribute\n}\n\nfunc (compo *ImgAttribute) SetWidth(value string) types.ImgAttribute {\n\tcompo.Width = value\n\treturn compo\n}\n\nfunc (compo *ImgAttribute) SetHeight(value string) types.ImgAttribute {\n\tcompo.Height = value\n\treturn compo\n}\n\nfunc (compo *ImgAttribute) WithModal() types.ImgAttribute {\n\tcompo.HasModal = true\n\tcompo.Uuid = modules.Uuid()\n\treturn compo\n}\n\nfunc (compo *ImgAttribute) SetSrc(value template.HTML) types.ImgAttribute {\n\tcompo.Src = template.URL(value)\n\treturn compo\n}\n\nfunc (compo *ImgAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"image\")\n}\n"
  },
  {
    "path": "template/components/label.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype LabelAttribute struct {\n\tName    string\n\tColor   template.HTML\n\tType    string\n\tContent template.HTML\n\ttypes.Attribute\n}\n\nfunc (compo *LabelAttribute) SetType(value string) types.LabelAttribute {\n\tcompo.Type = value\n\treturn compo\n}\n\nfunc (compo *LabelAttribute) SetColor(value template.HTML) types.LabelAttribute {\n\tcompo.Color = value\n\treturn compo\n}\n\nfunc (compo *LabelAttribute) SetContent(value template.HTML) types.LabelAttribute {\n\tcompo.Content = value\n\treturn compo\n}\n\nfunc (compo *LabelAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"label\")\n}\n"
  },
  {
    "path": "template/components/link.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype LinkAttribute struct {\n\tName       string\n\tURL        string\n\tClass      template.HTML\n\tTitle      template.HTML\n\tAttributes template.HTMLAttr\n\tContent    template.HTML\n\ttypes.Attribute\n}\n\nfunc (compo *LinkAttribute) OpenInNewTab() types.LinkAttribute {\n\tcompo.Class += \" new-tab-link\"\n\treturn compo\n}\n\nfunc (compo *LinkAttribute) SetURL(value string) types.LinkAttribute {\n\tcompo.URL = value\n\treturn compo\n}\n\nfunc (compo *LinkAttribute) SetClass(class template.HTML) types.LinkAttribute {\n\tcompo.Class = class\n\treturn compo\n}\n\nfunc (compo *LinkAttribute) SetAttributes(attr template.HTMLAttr) types.LinkAttribute {\n\tcompo.Attributes = attr\n\treturn compo\n}\n\nfunc (compo *LinkAttribute) NoPjax() types.LinkAttribute {\n\tcompo.Class += \" no-pjax\"\n\treturn compo\n}\n\nfunc (compo *LinkAttribute) SetTabTitle(value template.HTML) types.LinkAttribute {\n\tcompo.Title = value\n\treturn compo\n}\n\nfunc (compo *LinkAttribute) SetContent(value template.HTML) types.LinkAttribute {\n\tcompo.Content = value\n\treturn compo\n}\n\nfunc (compo *LinkAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"link\")\n}\n"
  },
  {
    "path": "template/components/paninator.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype PaginatorAttribute struct {\n\tName              string\n\tCurPageStartIndex string\n\tCurPageEndIndex   string\n\tTotal             string\n\tPreviousClass     string\n\tPreviousUrl       string\n\tPages             []map[string]string\n\tNextClass         string\n\tNextUrl           string\n\tPageSizeList      []string\n\tOption            map[string]template.HTML\n\tUrl               string\n\tExtraInfo         template.HTML\n\tEntriesInfo       template.HTML\n\ttypes.Attribute\n}\n\nfunc (compo *PaginatorAttribute) SetCurPageStartIndex(value string) types.PaginatorAttribute {\n\tcompo.CurPageStartIndex = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetCurPageEndIndex(value string) types.PaginatorAttribute {\n\tcompo.CurPageEndIndex = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetTotal(value string) types.PaginatorAttribute {\n\tcompo.Total = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetExtraInfo(value template.HTML) types.PaginatorAttribute {\n\tcompo.ExtraInfo = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetEntriesInfo(value template.HTML) types.PaginatorAttribute {\n\tcompo.EntriesInfo = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetPreviousClass(value string) types.PaginatorAttribute {\n\tcompo.PreviousClass = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetPreviousUrl(value string) types.PaginatorAttribute {\n\tcompo.PreviousUrl = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetPages(value []map[string]string) types.PaginatorAttribute {\n\tcompo.Pages = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetPageSizeList(value []string) types.PaginatorAttribute {\n\tcompo.PageSizeList = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetNextClass(value string) types.PaginatorAttribute {\n\tcompo.NextClass = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetNextUrl(value string) types.PaginatorAttribute {\n\tcompo.NextUrl = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetOption(value map[string]template.HTML) types.PaginatorAttribute {\n\tcompo.Option = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) SetUrl(value string) types.PaginatorAttribute {\n\tcompo.Url = value\n\treturn compo\n}\n\nfunc (compo *PaginatorAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"paginator\")\n}\n"
  },
  {
    "path": "template/components/popup.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype PopupAttribute struct {\n\tName       string\n\tID         string\n\tBody       template.HTML\n\tFooter     template.HTML\n\tFooterHTML template.HTML\n\tTitle      template.HTML\n\tSize       string\n\tHideFooter bool\n\tHeight     string\n\tWidth      string\n\tDraggable  bool\n\ttypes.Attribute\n}\n\nfunc (compo *PopupAttribute) SetID(value string) types.PopupAttribute {\n\tcompo.ID = value\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetTitle(value template.HTML) types.PopupAttribute {\n\tcompo.Title = value\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetFooter(value template.HTML) types.PopupAttribute {\n\tcompo.Footer = value\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetFooterHTML(value template.HTML) types.PopupAttribute {\n\tcompo.FooterHTML = value\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetWidth(width string) types.PopupAttribute {\n\tcompo.Width = width\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetHeight(height string) types.PopupAttribute {\n\tcompo.Height = height\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetDraggable() types.PopupAttribute {\n\tcompo.Draggable = true\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetHideFooter() types.PopupAttribute {\n\tcompo.HideFooter = true\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetBody(value template.HTML) types.PopupAttribute {\n\tcompo.Body = value\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) SetSize(value string) types.PopupAttribute {\n\tcompo.Size = value\n\treturn compo\n}\n\nfunc (compo *PopupAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"popup\")\n}\n"
  },
  {
    "path": "template/components/product.go",
    "content": "package components\n"
  },
  {
    "path": "template/components/row.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype RowAttribute struct {\n\tName    string\n\tContent template.HTML\n\ttypes.Attribute\n}\n\nfunc (compo *RowAttribute) SetContent(value template.HTML) types.RowAttribute {\n\tcompo.Content = value\n\treturn compo\n}\n\nfunc (compo *RowAttribute) AddContent(value template.HTML) types.RowAttribute {\n\tcompo.Content += value\n\treturn compo\n}\n\nfunc (compo *RowAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"row\")\n}\n"
  },
  {
    "path": "template/components/table.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype TableAttribute struct {\n\tName       string\n\tThead      types.Thead\n\tInfoList   []map[string]types.InfoItem\n\tType       string\n\tPrimaryKey string\n\tStyle      string\n\tClass      string\n\tHideThead  bool\n\tNoAction   bool\n\tAction     template.HTML\n\tEditUrl    string\n\tMinWidth   string\n\tDeleteUrl  string\n\tDetailUrl  string\n\tSortUrl    string\n\tUpdateUrl  string\n\tLayout     string\n\tIsTab      bool\n\tExportUrl  string\n\tActionFold bool\n\ttypes.Attribute\n}\n\nfunc (compo *TableAttribute) SetThead(value types.Thead) types.TableAttribute {\n\tcompo.Thead = value\n\treturn compo\n}\n\nfunc (compo *TableAttribute) SetInfoList(value []map[string]types.InfoItem) types.TableAttribute {\n\tcompo.InfoList = value\n\treturn compo\n}\n\nfunc (compo *TableAttribute) SetType(value string) types.TableAttribute {\n\tcompo.Type = value\n\treturn compo\n}\n\nfunc (compo *TableAttribute) SetName(name string) types.TableAttribute {\n\tcompo.Name = name\n\treturn compo\n}\n\nfunc (compo *TableAttribute) SetHideThead() types.TableAttribute {\n\tcompo.HideThead = true\n\treturn compo\n}\n\nfunc (compo *TableAttribute) SetStyle(style string) types.TableAttribute {\n\tcompo.Style = style\n\treturn compo\n}\n\nfunc (compo *TableAttribute) SetSticky(sticky bool) types.TableAttribute {\n\tif sticky {\n\t\tcompo.Class = \"sticky_table\"\n\t}\n\treturn compo\n}\n\nfunc (compo *TableAttribute) SetMinWidth(value string) types.TableAttribute {\n\tcompo.MinWidth = value\n\treturn compo\n}\n\nfunc (compo *TableAttribute) SetLayout(value string) types.TableAttribute {\n\tcompo.Layout = value\n\treturn compo\n}\n\nfunc (compo *TableAttribute) GetContent() template.HTML {\n\tif compo.MinWidth == \"\" {\n\t\tcompo.MinWidth = \"1000px\"\n\t}\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"table\")\n}\n\ntype DataTableAttribute struct {\n\tTableAttribute\n\tEditUrl           string\n\tNewUrl            string\n\tUpdateUrl         string\n\tClass             string\n\tHideThead         bool\n\tDetailUrl         string\n\tSortUrl           template.URL\n\tDeleteUrl         string\n\tPrimaryKey        string\n\tIsTab             bool\n\tExportUrl         string\n\tInfoUrl           string\n\tButtons           template.HTML\n\tActionJs          template.JS\n\tIsHideFilterArea  bool\n\tIsHideRowSelector bool\n\tNoAction          bool\n\tHasFilter         bool\n\tAction            template.HTML\n\tActionFold        bool\n\ttypes.Attribute\n}\n\nfunc (compo *DataTableAttribute) GetDataTableHeader() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"table/box-header\")\n}\n\nfunc (compo *DataTableAttribute) SetThead(value types.Thead) types.DataTableAttribute {\n\tcompo.Thead = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetSticky(sticky bool) types.DataTableAttribute {\n\tif sticky {\n\t\tcompo.Class = \"sticky_table\"\n\t}\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetLayout(value string) types.DataTableAttribute {\n\tcompo.Layout = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetIsTab(value bool) types.DataTableAttribute {\n\tcompo.IsTab = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetHideThead() types.DataTableAttribute {\n\tcompo.HideThead = true\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetButtons(btns template.HTML) types.DataTableAttribute {\n\tcompo.Buttons = btns\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetHideFilterArea(value bool) types.DataTableAttribute {\n\tcompo.IsHideFilterArea = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetActionJs(aj template.JS) types.DataTableAttribute {\n\tcompo.ActionJs = aj\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetActionFold(fold bool) types.DataTableAttribute {\n\tcompo.ActionFold = fold\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetHasFilter(hasFilter bool) types.DataTableAttribute {\n\tcompo.HasFilter = hasFilter\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetInfoUrl(value string) types.DataTableAttribute {\n\tcompo.InfoUrl = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetAction(action template.HTML) types.DataTableAttribute {\n\tcompo.Action = action\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetStyle(style string) types.DataTableAttribute {\n\tcompo.Style = style\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetExportUrl(value string) types.DataTableAttribute {\n\tcompo.ExportUrl = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetHideRowSelector(value bool) types.DataTableAttribute {\n\tcompo.IsHideRowSelector = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetUpdateUrl(value string) types.DataTableAttribute {\n\tcompo.UpdateUrl = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetDetailUrl(value string) types.DataTableAttribute {\n\tcompo.DetailUrl = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetSortUrl(value string) types.DataTableAttribute {\n\tcompo.SortUrl = template.URL(value)\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetPrimaryKey(value string) types.DataTableAttribute {\n\tcompo.PrimaryKey = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetInfoList(value []map[string]types.InfoItem) types.DataTableAttribute {\n\tcompo.InfoList = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetEditUrl(value string) types.DataTableAttribute {\n\tcompo.EditUrl = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetDeleteUrl(value string) types.DataTableAttribute {\n\tcompo.DeleteUrl = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetNewUrl(value string) types.DataTableAttribute {\n\tcompo.NewUrl = value\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) SetNoAction() types.DataTableAttribute {\n\tcompo.NoAction = true\n\treturn compo\n}\n\nfunc (compo *DataTableAttribute) GetContent() template.HTML {\n\tif compo.MinWidth == \"\" {\n\t\tcompo.MinWidth = \"1600px\"\n\t}\n\tif !compo.NoAction && compo.EditUrl == \"\" && compo.DeleteUrl == \"\" && compo.DetailUrl == \"\" && compo.Action == \"\" {\n\t\tcompo.NoAction = true\n\t}\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"table\")\n}\n"
  },
  {
    "path": "template/components/tabs.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype TabsAttribute struct {\n\tName string\n\tData []map[string]template.HTML\n\ttypes.Attribute\n}\n\nfunc (compo *TabsAttribute) SetData(value []map[string]template.HTML) types.TabsAttribute {\n\tcompo.Data = value\n\treturn compo\n}\n\nfunc (compo *TabsAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"tabs\")\n}\n"
  },
  {
    "path": "template/components/tree.go",
    "content": "package components\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype TreeAttribute struct {\n\tName      string\n\tTree      []menu.Item\n\tEditUrl   string\n\tDeleteUrl string\n\tUrlPrefix string\n\tOrderUrl  string\n\ttypes.Attribute\n}\n\nfunc (compo *TreeAttribute) SetTree(value []menu.Item) types.TreeAttribute {\n\tcompo.Tree = value\n\treturn compo\n}\n\nfunc (compo *TreeAttribute) SetEditUrl(value string) types.TreeAttribute {\n\tcompo.EditUrl = value\n\treturn compo\n}\n\nfunc (compo *TreeAttribute) SetUrlPrefix(value string) types.TreeAttribute {\n\tcompo.UrlPrefix = value\n\treturn compo\n}\n\nfunc (compo *TreeAttribute) SetDeleteUrl(value string) types.TreeAttribute {\n\tcompo.DeleteUrl = value\n\treturn compo\n}\n\nfunc (compo *TreeAttribute) SetOrderUrl(value string) types.TreeAttribute {\n\tcompo.OrderUrl = value\n\treturn compo\n}\n\nfunc (compo *TreeAttribute) GetContent() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"tree\")\n}\n\nfunc (compo *TreeAttribute) GetTreeHeader() template.HTML {\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"tree-header\")\n}\n"
  },
  {
    "path": "template/components/treeview.go",
    "content": "package components\n\nimport (\n\t\"encoding/json\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype TreeViewAttribute struct {\n\tName      string\n\tID        string\n\tTree      types.TreeViewData\n\tTreeJSON  template.JS\n\tUrlPrefix string\n\ttypes.Attribute\n}\n\nfunc (compo *TreeViewAttribute) SetID(id string) types.TreeViewAttribute {\n\tcompo.ID = id\n\treturn compo\n}\n\nfunc (compo *TreeViewAttribute) SetTree(value types.TreeViewData) types.TreeViewAttribute {\n\tcompo.Tree = value\n\treturn compo\n}\n\nfunc (compo *TreeViewAttribute) SetUrlPrefix(value string) types.TreeViewAttribute {\n\tcompo.UrlPrefix = value\n\treturn compo\n}\n\nfunc (compo *TreeViewAttribute) GetContent() template.HTML {\n\tif compo.ID == \"\" {\n\t\tcompo.ID = utils.Uuid(10)\n\t}\n\tb, _ := json.Marshal(compo.Tree)\n\tcompo.TreeJSON = template.JS(b)\n\treturn ComposeHtml(compo.TemplateList, compo.Separation, *compo, \"treeview\")\n}\n"
  },
  {
    "path": "template/icon/icon.go",
    "content": "package icon\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/html\"\n)\n\nfunc Icon(class string, num ...int) template.HTML {\n\tspace := template.HTML(\"\")\n\tif len(num) > 0 {\n\t\tfor i := 0; i < num[0]; i++ {\n\t\t\tspace += \"&nbsp;\"\n\t\t}\n\t}\n\treturn html.IEl().SetClass(\"icon fa\", class).Get() + space\n}\n\nfunc IconWithStyle(class string, style html.Style, num ...int) template.HTML {\n\tspace := template.HTML(\"\")\n\tif len(num) > 0 {\n\t\tfor i := 0; i < num[0]; i++ {\n\t\t\tspace += \"&nbsp;\"\n\t\t}\n\t}\n\n\ti := html.IEl().SetClass(\"icon fa\", class)\n\tfor k, s := range style {\n\t\ti.SetStyle(k, s)\n\t}\n\n\treturn i.Get() + space\n}\n\nconst (\n\tAdjust                           = \"fa-adjust\"                              // https://fontawesome.com/icons/adjust\n\tAdn                              = \"fa-adn\"                                 // https://fontawesome.com/icons/adn\n\tAlignCenter                      = \"fa-align-center\"                        // https://fontawesome.com/icons/align-center\n\tAlignJustify                     = \"fa-align-justify\"                       // https://fontawesome.com/icons/align-justify\n\tAlignLeft                        = \"fa-align-left\"                          // https://fontawesome.com/icons/align-left\n\tAlignRight                       = \"fa-align-right\"                         // https://fontawesome.com/icons/align-right\n\tAmazon                           = \"fa-amazon\"                              // https://fontawesome.com/icons/amazon\n\tAmbulance                        = \"fa-ambulance\"                           // https://fontawesome.com/icons/ambulance\n\tAmericanSignLanguageInterpreting = \"fa-american-sign-language-interpreting\" // https://fontawesome.com/icons/american-sign-language-interpreting\n\tAnchor                           = \"fa-anchor\"                              // https://fontawesome.com/icons/anchor\n\tAndroid                          = \"fa-android\"                             // https://fontawesome.com/icons/android\n\tAngellist                        = \"fa-angellist\"                           // https://fontawesome.com/icons/angellist\n\tAngleDoubleDown                  = \"fa-angle-double-down\"                   // https://fontawesome.com/icons/angle-double-down\n\tAngleDoubleLeft                  = \"fa-angle-double-left\"                   // https://fontawesome.com/icons/angle-double-left\n\tAngleDoubleRight                 = \"fa-angle-double-right\"                  // https://fontawesome.com/icons/angle-double-right\n\tAngleDoubleUp                    = \"fa-angle-double-up\"                     // https://fontawesome.com/icons/angle-double-up\n\tAngleDown                        = \"fa-angle-down\"                          // https://fontawesome.com/icons/angle-down\n\tAngleLeft                        = \"fa-angle-left\"                          // https://fontawesome.com/icons/angle-left\n\tAngleRight                       = \"fa-angle-right\"                         // https://fontawesome.com/icons/angle-right\n\tAngleUp                          = \"fa-angle-up\"                            // https://fontawesome.com/icons/angle-up\n\tApple                            = \"fa-apple\"                               // https://fontawesome.com/icons/apple\n\tArchive                          = \"fa-archive\"                             // https://fontawesome.com/icons/archive\n\tAreaChart                        = \"fa-area-chart\"                          // https://fontawesome.com/icons/area-chart\n\tArrowCircleDown                  = \"fa-arrow-circle-down\"                   // https://fontawesome.com/icons/arrow-circle-down\n\tArrowCircleLeft                  = \"fa-arrow-circle-left\"                   // https://fontawesome.com/icons/arrow-circle-left\n\tArrowCircleODown                 = \"fa-arrow-circle-o-down\"                 // https://fontawesome.com/icons/arrow-circle-o-down\n\tArrowCircleOLeft                 = \"fa-arrow-circle-o-left\"                 // https://fontawesome.com/icons/arrow-circle-o-left\n\tArrowCircleORight                = \"fa-arrow-circle-o-right\"                // https://fontawesome.com/icons/arrow-circle-o-right\n\tArrowCircleOUp                   = \"fa-arrow-circle-o-up\"                   // https://fontawesome.com/icons/arrow-circle-o-up\n\tArrowCircleRight                 = \"fa-arrow-circle-right\"                  // https://fontawesome.com/icons/arrow-circle-right\n\tArrowCircleUp                    = \"fa-arrow-circle-up\"                     // https://fontawesome.com/icons/arrow-circle-up\n\tArrowDown                        = \"fa-arrow-down\"                          // https://fontawesome.com/icons/arrow-down\n\tArrowLeft                        = \"fa-arrow-left\"                          // https://fontawesome.com/icons/arrow-left\n\tArrowRight                       = \"fa-arrow-right\"                         // https://fontawesome.com/icons/arrow-right\n\tArrowUp                          = \"fa-arrow-up\"                            // https://fontawesome.com/icons/arrow-up\n\tArrows                           = \"fa-arrows\"                              // https://fontawesome.com/icons/arrows\n\tArrowsAlt                        = \"fa-arrows-alt\"                          // https://fontawesome.com/icons/arrows-alt\n\tArrowsH                          = \"fa-arrows-h\"                            // https://fontawesome.com/icons/arrows-h\n\tArrowsV                          = \"fa-arrows-v\"                            // https://fontawesome.com/icons/arrows-v\n\tAslInterpreting                  = \"fa-asl-interpreting\"                    // https://fontawesome.com/icons/asl-interpreting\n\tAssistiveListeningSystems        = \"fa-assistive-listening-systems\"         // https://fontawesome.com/icons/assistive-listening-systems\n\tAsterisk                         = \"fa-asterisk\"                            // https://fontawesome.com/icons/asterisk\n\tAt                               = \"fa-at\"                                  // https://fontawesome.com/icons/at\n\tAudioDescription                 = \"fa-audio-description\"                   // https://fontawesome.com/icons/audio-description\n\tAutomobile                       = \"fa-automobile\"                          // https://fontawesome.com/icons/automobile\n\tBackward                         = \"fa-backward\"                            // https://fontawesome.com/icons/backward\n\tBalanceScale                     = \"fa-balance-scale\"                       // https://fontawesome.com/icons/balance-scale\n\tBan                              = \"fa-ban\"                                 // https://fontawesome.com/icons/ban\n\tBank                             = \"fa-bank\"                                // https://fontawesome.com/icons/bank\n\tBarChart                         = \"fa-bar-chart\"                           // https://fontawesome.com/icons/bar-chart\n\tBarChartO                        = \"fa-bar-chart-o\"                         // https://fontawesome.com/icons/bar-chart-o\n\tBarcode                          = \"fa-barcode\"                             // https://fontawesome.com/icons/barcode\n\tBars                             = \"fa-bars\"                                // https://fontawesome.com/icons/bars\n\tBattery0                         = \"fa-battery-0\"                           // https://fontawesome.com/icons/battery-0\n\tBattery1                         = \"fa-battery-1\"                           // https://fontawesome.com/icons/battery-1\n\tBattery2                         = \"fa-battery-2\"                           // https://fontawesome.com/icons/battery-2\n\tBattery3                         = \"fa-battery-3\"                           // https://fontawesome.com/icons/battery-3\n\tBattery4                         = \"fa-battery-4\"                           // https://fontawesome.com/icons/battery-4\n\tBatteryEmpty                     = \"fa-battery-empty\"                       // https://fontawesome.com/icons/battery-empty\n\tBatteryFull                      = \"fa-battery-full\"                        // https://fontawesome.com/icons/battery-full\n\tBatteryHalf                      = \"fa-battery-half\"                        // https://fontawesome.com/icons/battery-half\n\tBatteryQuarter                   = \"fa-battery-quarter\"                     // https://fontawesome.com/icons/battery-quarter\n\tBatteryThreeQuarters             = \"fa-battery-three-quarters\"              // https://fontawesome.com/icons/battery-three-quarters\n\tBed                              = \"fa-bed\"                                 // https://fontawesome.com/icons/bed\n\tBeer                             = \"fa-beer\"                                // https://fontawesome.com/icons/beer\n\tBehance                          = \"fa-behance\"                             // https://fontawesome.com/icons/behance\n\tBehanceSquare                    = \"fa-behance-square\"                      // https://fontawesome.com/icons/behance-square\n\tBell                             = \"fa-bell\"                                // https://fontawesome.com/icons/bell\n\tBellO                            = \"fa-bell-o\"                              // https://fontawesome.com/icons/bell-o\n\tBellSlash                        = \"fa-bell-slash\"                          // https://fontawesome.com/icons/bell-slash\n\tBellSlashO                       = \"fa-bell-slash-o\"                        // https://fontawesome.com/icons/bell-slash-o\n\tBicycle                          = \"fa-bicycle\"                             // https://fontawesome.com/icons/bicycle\n\tBinoculars                       = \"fa-binoculars\"                          // https://fontawesome.com/icons/binoculars\n\tBirthdayCake                     = \"fa-birthday-cake\"                       // https://fontawesome.com/icons/birthday-cake\n\tBitbucket                        = \"fa-bitbucket\"                           // https://fontawesome.com/icons/bitbucket\n\tBitbucketSquare                  = \"fa-bitbucket-square\"                    // https://fontawesome.com/icons/bitbucket-square\n\tBitcoin                          = \"fa-bitcoin\"                             // https://fontawesome.com/icons/bitcoin\n\tBlackTie                         = \"fa-black-tie\"                           // https://fontawesome.com/icons/black-tie\n\tBlind                            = \"fa-blind\"                               // https://fontawesome.com/icons/blind\n\tBluetooth                        = \"fa-bluetooth\"                           // https://fontawesome.com/icons/bluetooth\n\tBluetoothB                       = \"fa-bluetooth-b\"                         // https://fontawesome.com/icons/bluetooth-b\n\tBold                             = \"fa-bold\"                                // https://fontawesome.com/icons/bold\n\tBolt                             = \"fa-bolt\"                                // https://fontawesome.com/icons/bolt\n\tBomb                             = \"fa-bomb\"                                // https://fontawesome.com/icons/bomb\n\tBook                             = \"fa-book\"                                // https://fontawesome.com/icons/book\n\tBookmark                         = \"fa-bookmark\"                            // https://fontawesome.com/icons/bookmark\n\tBookmarkO                        = \"fa-bookmark-o\"                          // https://fontawesome.com/icons/bookmark-o\n\tBraille                          = \"fa-braille\"                             // https://fontawesome.com/icons/braille\n\tBriefcase                        = \"fa-briefcase\"                           // https://fontawesome.com/icons/briefcase\n\tBtc                              = \"fa-btc\"                                 // https://fontawesome.com/icons/btc\n\tBug                              = \"fa-bug\"                                 // https://fontawesome.com/icons/bug\n\tBuilding                         = \"fa-building\"                            // https://fontawesome.com/icons/building\n\tBuildingO                        = \"fa-building-o\"                          // https://fontawesome.com/icons/building-o\n\tBullhorn                         = \"fa-bullhorn\"                            // https://fontawesome.com/icons/bullhorn\n\tBullseye                         = \"fa-bullseye\"                            // https://fontawesome.com/icons/bullseye\n\tBus                              = \"fa-bus\"                                 // https://fontawesome.com/icons/bus\n\tBuysellads                       = \"fa-buysellads\"                          // https://fontawesome.com/icons/buysellads\n\tCab                              = \"fa-cab\"                                 // https://fontawesome.com/icons/cab\n\tCalculator                       = \"fa-calculator\"                          // https://fontawesome.com/icons/calculator\n\tCalendar                         = \"fa-calendar\"                            // https://fontawesome.com/icons/calendar\n\tCalendarCheckO                   = \"fa-calendar-check-o\"                    // https://fontawesome.com/icons/calendar-check-o\n\tCalendarMinusO                   = \"fa-calendar-minus-o\"                    // https://fontawesome.com/icons/calendar-minus-o\n\tCalendarO                        = \"fa-calendar-o\"                          // https://fontawesome.com/icons/calendar-o\n\tCalendarPlusO                    = \"fa-calendar-plus-o\"                     // https://fontawesome.com/icons/calendar-plus-o\n\tCalendarTimesO                   = \"fa-calendar-times-o\"                    // https://fontawesome.com/icons/calendar-times-o\n\tCamera                           = \"fa-camera\"                              // https://fontawesome.com/icons/camera\n\tCameraRetro                      = \"fa-camera-retro\"                        // https://fontawesome.com/icons/camera-retro\n\tCar                              = \"fa-car\"                                 // https://fontawesome.com/icons/car\n\tCaretDown                        = \"fa-caret-down\"                          // https://fontawesome.com/icons/caret-down\n\tCaretLeft                        = \"fa-caret-left\"                          // https://fontawesome.com/icons/caret-left\n\tCaretRight                       = \"fa-caret-right\"                         // https://fontawesome.com/icons/caret-right\n\tCaretSquareODown                 = \"fa-caret-square-o-down\"                 // https://fontawesome.com/icons/caret-square-o-down\n\tCaretSquareOLeft                 = \"fa-caret-square-o-left\"                 // https://fontawesome.com/icons/caret-square-o-left\n\tCaretSquareORight                = \"fa-caret-square-o-right\"                // https://fontawesome.com/icons/caret-square-o-right\n\tCaretSquareOUp                   = \"fa-caret-square-o-up\"                   // https://fontawesome.com/icons/caret-square-o-up\n\tCaretUp                          = \"fa-caret-up\"                            // https://fontawesome.com/icons/caret-up\n\tCartArrowDown                    = \"fa-cart-arrow-down\"                     // https://fontawesome.com/icons/cart-arrow-down\n\tCartPlus                         = \"fa-cart-plus\"                           // https://fontawesome.com/icons/cart-plus\n\tCc                               = \"fa-cc\"                                  // https://fontawesome.com/icons/cc\n\tCcAmex                           = \"fa-cc-amex\"                             // https://fontawesome.com/icons/cc-amex\n\tCcDinersClub                     = \"fa-cc-diners-club\"                      // https://fontawesome.com/icons/cc-diners-club\n\tCcDiscover                       = \"fa-cc-discover\"                         // https://fontawesome.com/icons/cc-discover\n\tCcJcb                            = \"fa-cc-jcb\"                              // https://fontawesome.com/icons/cc-jcb\n\tCcMastercard                     = \"fa-cc-mastercard\"                       // https://fontawesome.com/icons/cc-mastercard\n\tCcPaypal                         = \"fa-cc-paypal\"                           // https://fontawesome.com/icons/cc-paypal\n\tCcStripe                         = \"fa-cc-stripe\"                           // https://fontawesome.com/icons/cc-stripe\n\tCcVisa                           = \"fa-cc-visa\"                             // https://fontawesome.com/icons/cc-visa\n\tCertificate                      = \"fa-certificate\"                         // https://fontawesome.com/icons/certificate\n\tChain                            = \"fa-chain\"                               // https://fontawesome.com/icons/chain\n\tChainBroken                      = \"fa-chain-broken\"                        // https://fontawesome.com/icons/chain-broken\n\tCheck                            = \"fa-check\"                               // https://fontawesome.com/icons/check\n\tCheckCircle                      = \"fa-check-circle\"                        // https://fontawesome.com/icons/check-circle\n\tCheckCircleO                     = \"fa-check-circle-o\"                      // https://fontawesome.com/icons/check-circle-o\n\tCheckSquare                      = \"fa-check-square\"                        // https://fontawesome.com/icons/check-square\n\tCheckSquareO                     = \"fa-check-square-o\"                      // https://fontawesome.com/icons/check-square-o\n\tChevronCircleDown                = \"fa-chevron-circle-down\"                 // https://fontawesome.com/icons/chevron-circle-down\n\tChevronCircleLeft                = \"fa-chevron-circle-left\"                 // https://fontawesome.com/icons/chevron-circle-left\n\tChevronCircleRight               = \"fa-chevron-circle-right\"                // https://fontawesome.com/icons/chevron-circle-right\n\tChevronCircleUp                  = \"fa-chevron-circle-up\"                   // https://fontawesome.com/icons/chevron-circle-up\n\tChevronDown                      = \"fa-chevron-down\"                        // https://fontawesome.com/icons/chevron-down\n\tChevronLeft                      = \"fa-chevron-left\"                        // https://fontawesome.com/icons/chevron-left\n\tChevronRight                     = \"fa-chevron-right\"                       // https://fontawesome.com/icons/chevron-right\n\tChevronUp                        = \"fa-chevron-up\"                          // https://fontawesome.com/icons/chevron-up\n\tChild                            = \"fa-child\"                               // https://fontawesome.com/icons/child\n\tChrome                           = \"fa-chrome\"                              // https://fontawesome.com/icons/chrome\n\tCircle                           = \"fa-circle\"                              // https://fontawesome.com/icons/circle\n\tCircleO                          = \"fa-circle-o\"                            // https://fontawesome.com/icons/circle-o\n\tCircleONotch                     = \"fa-circle-o-notch\"                      // https://fontawesome.com/icons/circle-o-notch\n\tCircleThin                       = \"fa-circle-thin\"                         // https://fontawesome.com/icons/circle-thin\n\tClipboard                        = \"fa-clipboard\"                           // https://fontawesome.com/icons/clipboard\n\tClockO                           = \"fa-clock-o\"                             // https://fontawesome.com/icons/clock-o\n\tClone                            = \"fa-clone\"                               // https://fontawesome.com/icons/clone\n\tClose                            = \"fa-close\"                               // https://fontawesome.com/icons/close\n\tCloud                            = \"fa-cloud\"                               // https://fontawesome.com/icons/cloud\n\tCloudDownload                    = \"fa-cloud-download\"                      // https://fontawesome.com/icons/cloud-download\n\tCloudUpload                      = \"fa-cloud-upload\"                        // https://fontawesome.com/icons/cloud-upload\n\tCny                              = \"fa-cny\"                                 // https://fontawesome.com/icons/cny\n\tCode                             = \"fa-code\"                                // https://fontawesome.com/icons/code\n\tCodeFork                         = \"fa-code-fork\"                           // https://fontawesome.com/icons/code-fork\n\tCodepen                          = \"fa-codepen\"                             // https://fontawesome.com/icons/codepen\n\tCodiepie                         = \"fa-codiepie\"                            // https://fontawesome.com/icons/codiepie\n\tCoffee                           = \"fa-coffee\"                              // https://fontawesome.com/icons/coffee\n\tCog                              = \"fa-cog\"                                 // https://fontawesome.com/icons/cog\n\tCogs                             = \"fa-cogs\"                                // https://fontawesome.com/icons/cogs\n\tColumns                          = \"fa-columns\"                             // https://fontawesome.com/icons/columns\n\tComment                          = \"fa-comment\"                             // https://fontawesome.com/icons/comment\n\tCommentO                         = \"fa-comment-o\"                           // https://fontawesome.com/icons/comment-o\n\tCommenting                       = \"fa-commenting\"                          // https://fontawesome.com/icons/commenting\n\tCommentingO                      = \"fa-commenting-o\"                        // https://fontawesome.com/icons/commenting-o\n\tComments                         = \"fa-comments\"                            // https://fontawesome.com/icons/comments\n\tCommentsO                        = \"fa-comments-o\"                          // https://fontawesome.com/icons/comments-o\n\tCompass                          = \"fa-compass\"                             // https://fontawesome.com/icons/compass\n\tCompress                         = \"fa-compress\"                            // https://fontawesome.com/icons/compress\n\tConnectdevelop                   = \"fa-connectdevelop\"                      // https://fontawesome.com/icons/connectdevelop\n\tContao                           = \"fa-contao\"                              // https://fontawesome.com/icons/contao\n\tCopy                             = \"fa-copy\"                                // https://fontawesome.com/icons/copy\n\tCopyright                        = \"fa-copyright\"                           // https://fontawesome.com/icons/copyright\n\tCreativeCommons                  = \"fa-creative-commons\"                    // https://fontawesome.com/icons/creative-commons\n\tCreditCard                       = \"fa-credit-card\"                         // https://fontawesome.com/icons/credit-card\n\tCreditCardAlt                    = \"fa-credit-card-alt\"                     // https://fontawesome.com/icons/credit-card-alt\n\tCrop                             = \"fa-crop\"                                // https://fontawesome.com/icons/crop\n\tCrosshairs                       = \"fa-crosshairs\"                          // https://fontawesome.com/icons/crosshairs\n\tCss3                             = \"fa-css3\"                                // https://fontawesome.com/icons/css3\n\tCube                             = \"fa-cube\"                                // https://fontawesome.com/icons/cube\n\tCubes                            = \"fa-cubes\"                               // https://fontawesome.com/icons/cubes\n\tCut                              = \"fa-cut\"                                 // https://fontawesome.com/icons/cut\n\tCutlery                          = \"fa-cutlery\"                             // https://fontawesome.com/icons/cutlery\n\tDashboard                        = \"fa-dashboard\"                           // https://fontawesome.com/icons/dashboard\n\tDashcube                         = \"fa-dashcube\"                            // https://fontawesome.com/icons/dashcube\n\tDatabase                         = \"fa-database\"                            // https://fontawesome.com/icons/database\n\tDeaf                             = \"fa-deaf\"                                // https://fontawesome.com/icons/deaf\n\tDeafness                         = \"fa-deafness\"                            // https://fontawesome.com/icons/deafness\n\tDedent                           = \"fa-dedent\"                              // https://fontawesome.com/icons/dedent\n\tDelicious                        = \"fa-delicious\"                           // https://fontawesome.com/icons/delicious\n\tDesktop                          = \"fa-desktop\"                             // https://fontawesome.com/icons/desktop\n\tDeviantart                       = \"fa-deviantart\"                          // https://fontawesome.com/icons/deviantart\n\tDiamond                          = \"fa-diamond\"                             // https://fontawesome.com/icons/diamond\n\tDigg                             = \"fa-digg\"                                // https://fontawesome.com/icons/digg\n\tDollar                           = \"fa-dollar\"                              // https://fontawesome.com/icons/dollar\n\tDotCircleO                       = \"fa-dot-circle-o\"                        // https://fontawesome.com/icons/dot-circle-o\n\tDownload                         = \"fa-download\"                            // https://fontawesome.com/icons/download\n\tDribbble                         = \"fa-dribbble\"                            // https://fontawesome.com/icons/dribbble\n\tDropbox                          = \"fa-dropbox\"                             // https://fontawesome.com/icons/dropbox\n\tDrupal                           = \"fa-drupal\"                              // https://fontawesome.com/icons/drupal\n\tEdge                             = \"fa-edge\"                                // https://fontawesome.com/icons/edge\n\tEdit                             = \"fa-edit\"                                // https://fontawesome.com/icons/edit\n\tEject                            = \"fa-eject\"                               // https://fontawesome.com/icons/eject\n\tEllipsisH                        = \"fa-ellipsis-h\"                          // https://fontawesome.com/icons/ellipsis-h\n\tEllipsisV                        = \"fa-ellipsis-v\"                          // https://fontawesome.com/icons/ellipsis-v\n\tEmpire                           = \"fa-empire\"                              // https://fontawesome.com/icons/empire\n\tEnvelope                         = \"fa-envelope\"                            // https://fontawesome.com/icons/envelope\n\tEnvelopeO                        = \"fa-envelope-o\"                          // https://fontawesome.com/icons/envelope-o\n\tEnvelopeSquare                   = \"fa-envelope-square\"                     // https://fontawesome.com/icons/envelope-square\n\tEnvira                           = \"fa-envira\"                              // https://fontawesome.com/icons/envira\n\tEraser                           = \"fa-eraser\"                              // https://fontawesome.com/icons/eraser\n\tEur                              = \"fa-eur\"                                 // https://fontawesome.com/icons/eur\n\tEuro                             = \"fa-euro\"                                // https://fontawesome.com/icons/euro\n\tExchange                         = \"fa-exchange\"                            // https://fontawesome.com/icons/exchange\n\tExclamation                      = \"fa-exclamation\"                         // https://fontawesome.com/icons/exclamation\n\tExclamationCircle                = \"fa-exclamation-circle\"                  // https://fontawesome.com/icons/exclamation-circle\n\tExclamationTriangle              = \"fa-exclamation-triangle\"                // https://fontawesome.com/icons/exclamation-triangle\n\tExpand                           = \"fa-expand\"                              // https://fontawesome.com/icons/expand\n\tExpeditedssl                     = \"fa-expeditedssl\"                        // https://fontawesome.com/icons/expeditedssl\n\tExternalLink                     = \"fa-external-link\"                       // https://fontawesome.com/icons/external-link\n\tExternalLinkSquare               = \"fa-external-link-square\"                // https://fontawesome.com/icons/external-link-square\n\tEye                              = \"fa-eye\"                                 // https://fontawesome.com/icons/eye\n\tEyeSlash                         = \"fa-eye-slash\"                           // https://fontawesome.com/icons/eye-slash\n\tEyedropper                       = \"fa-eyedropper\"                          // https://fontawesome.com/icons/eyedropper\n\tFa                               = \"fa-fa\"                                  // https://fontawesome.com/icons/fa\n\tFacebook                         = \"fa-facebook\"                            // https://fontawesome.com/icons/facebook\n\tFacebookF                        = \"fa-facebook-f\"                          // https://fontawesome.com/icons/facebook-f\n\tFacebookOfficial                 = \"fa-facebook-official\"                   // https://fontawesome.com/icons/facebook-official\n\tFacebookSquare                   = \"fa-facebook-square\"                     // https://fontawesome.com/icons/facebook-square\n\tFastBackward                     = \"fa-fast-backward\"                       // https://fontawesome.com/icons/fast-backward\n\tFastForward                      = \"fa-fast-forward\"                        // https://fontawesome.com/icons/fast-forward\n\tFax                              = \"fa-fax\"                                 // https://fontawesome.com/icons/fax\n\tFeed                             = \"fa-feed\"                                // https://fontawesome.com/icons/feed\n\tFemale                           = \"fa-female\"                              // https://fontawesome.com/icons/female\n\tFighterJet                       = \"fa-fighter-jet\"                         // https://fontawesome.com/icons/fighter-jet\n\tFile                             = \"fa-file\"                                // https://fontawesome.com/icons/file\n\tFileArchiveO                     = \"fa-file-archive-o\"                      // https://fontawesome.com/icons/file-archive-o\n\tFileAudioO                       = \"fa-file-audio-o\"                        // https://fontawesome.com/icons/file-audio-o\n\tFileCodeO                        = \"fa-file-code-o\"                         // https://fontawesome.com/icons/file-code-o\n\tFileExcelO                       = \"fa-file-excel-o\"                        // https://fontawesome.com/icons/file-excel-o\n\tFileImageO                       = \"fa-file-image-o\"                        // https://fontawesome.com/icons/file-image-o\n\tFileMovieO                       = \"fa-file-movie-o\"                        // https://fontawesome.com/icons/file-movie-o\n\tFileO                            = \"fa-file-o\"                              // https://fontawesome.com/icons/file-o\n\tFilePdfO                         = \"fa-file-pdf-o\"                          // https://fontawesome.com/icons/file-pdf-o\n\tFilePhotoO                       = \"fa-file-photo-o\"                        // https://fontawesome.com/icons/file-photo-o\n\tFilePictureO                     = \"fa-file-picture-o\"                      // https://fontawesome.com/icons/file-picture-o\n\tFilePowerpointO                  = \"fa-file-powerpoint-o\"                   // https://fontawesome.com/icons/file-powerpoint-o\n\tFileSoundO                       = \"fa-file-sound-o\"                        // https://fontawesome.com/icons/file-sound-o\n\tFileText                         = \"fa-file-text\"                           // https://fontawesome.com/icons/file-text\n\tFileTextO                        = \"fa-file-text-o\"                         // https://fontawesome.com/icons/file-text-o\n\tFileVideoO                       = \"fa-file-video-o\"                        // https://fontawesome.com/icons/file-video-o\n\tFileWordO                        = \"fa-file-word-o\"                         // https://fontawesome.com/icons/file-word-o\n\tFileZipO                         = \"fa-file-zip-o\"                          // https://fontawesome.com/icons/file-zip-o\n\tFilesO                           = \"fa-files-o\"                             // https://fontawesome.com/icons/files-o\n\tFilm                             = \"fa-film\"                                // https://fontawesome.com/icons/film\n\tFilter                           = \"fa-filter\"                              // https://fontawesome.com/icons/filter\n\tFire                             = \"fa-fire\"                                // https://fontawesome.com/icons/fire\n\tFireExtinguisher                 = \"fa-fire-extinguisher\"                   // https://fontawesome.com/icons/fire-extinguisher\n\tFirefox                          = \"fa-firefox\"                             // https://fontawesome.com/icons/firefox\n\tFirstOrder                       = \"fa-first-order\"                         // https://fontawesome.com/icons/first-order\n\tFlag                             = \"fa-flag\"                                // https://fontawesome.com/icons/flag\n\tFlagCheckered                    = \"fa-flag-checkered\"                      // https://fontawesome.com/icons/flag-checkered\n\tFlagO                            = \"fa-flag-o\"                              // https://fontawesome.com/icons/flag-o\n\tFlash                            = \"fa-flash\"                               // https://fontawesome.com/icons/flash\n\tFlask                            = \"fa-flask\"                               // https://fontawesome.com/icons/flask\n\tFlickr                           = \"fa-flickr\"                              // https://fontawesome.com/icons/flickr\n\tFloppyO                          = \"fa-floppy-o\"                            // https://fontawesome.com/icons/floppy-o\n\tFolder                           = \"fa-folder\"                              // https://fontawesome.com/icons/folder\n\tFolderO                          = \"fa-folder-o\"                            // https://fontawesome.com/icons/folder-o\n\tFolderOpen                       = \"fa-folder-open\"                         // https://fontawesome.com/icons/folder-open\n\tFolderOpenO                      = \"fa-folder-open-o\"                       // https://fontawesome.com/icons/folder-open-o\n\tFont                             = \"fa-font\"                                // https://fontawesome.com/icons/font\n\tFontAwesome                      = \"fa-font-awesome\"                        // https://fontawesome.com/icons/font-awesome\n\tFonticons                        = \"fa-fonticons\"                           // https://fontawesome.com/icons/fonticons\n\tFortAwesome                      = \"fa-fort-awesome\"                        // https://fontawesome.com/icons/fort-awesome\n\tForumbee                         = \"fa-forumbee\"                            // https://fontawesome.com/icons/forumbee\n\tForward                          = \"fa-forward\"                             // https://fontawesome.com/icons/forward\n\tFoursquare                       = \"fa-foursquare\"                          // https://fontawesome.com/icons/foursquare\n\tFrownO                           = \"fa-frown-o\"                             // https://fontawesome.com/icons/frown-o\n\tFutbolO                          = \"fa-futbol-o\"                            // https://fontawesome.com/icons/futbol-o\n\tGamepad                          = \"fa-gamepad\"                             // https://fontawesome.com/icons/gamepad\n\tGavel                            = \"fa-gavel\"                               // https://fontawesome.com/icons/gavel\n\tGbp                              = \"fa-gbp\"                                 // https://fontawesome.com/icons/gbp\n\tGe                               = \"fa-ge\"                                  // https://fontawesome.com/icons/ge\n\tGear                             = \"fa-gear\"                                // https://fontawesome.com/icons/gear\n\tGears                            = \"fa-gears\"                               // https://fontawesome.com/icons/gears\n\tGenderless                       = \"fa-genderless\"                          // https://fontawesome.com/icons/genderless\n\tGetPocket                        = \"fa-get-pocket\"                          // https://fontawesome.com/icons/get-pocket\n\tGg                               = \"fa-gg\"                                  // https://fontawesome.com/icons/gg\n\tGgCircle                         = \"fa-gg-circle\"                           // https://fontawesome.com/icons/gg-circle\n\tGift                             = \"fa-gift\"                                // https://fontawesome.com/icons/gift\n\tGit                              = \"fa-git\"                                 // https://fontawesome.com/icons/git\n\tGitSquare                        = \"fa-git-square\"                          // https://fontawesome.com/icons/git-square\n\tGithub                           = \"fa-github\"                              // https://fontawesome.com/icons/github\n\tGithubAlt                        = \"fa-github-alt\"                          // https://fontawesome.com/icons/github-alt\n\tGithubSquare                     = \"fa-github-square\"                       // https://fontawesome.com/icons/github-square\n\tGitlab                           = \"fa-gitlab\"                              // https://fontawesome.com/icons/gitlab\n\tGittip                           = \"fa-gittip\"                              // https://fontawesome.com/icons/gittip\n\tGlass                            = \"fa-glass\"                               // https://fontawesome.com/icons/glass\n\tGlide                            = \"fa-glide\"                               // https://fontawesome.com/icons/glide\n\tGlideG                           = \"fa-glide-g\"                             // https://fontawesome.com/icons/glide-g\n\tGlobe                            = \"fa-globe\"                               // https://fontawesome.com/icons/globe\n\tGoogle                           = \"fa-google\"                              // https://fontawesome.com/icons/google\n\tGooglePlus                       = \"fa-google-plus\"                         // https://fontawesome.com/icons/google-plus\n\tGooglePlusCircle                 = \"fa-google-plus-circle\"                  // https://fontawesome.com/icons/google-plus-circle\n\tGooglePlusOfficial               = \"fa-google-plus-official\"                // https://fontawesome.com/icons/google-plus-official\n\tGooglePlusSquare                 = \"fa-google-plus-square\"                  // https://fontawesome.com/icons/google-plus-square\n\tGoogleWallet                     = \"fa-google-wallet\"                       // https://fontawesome.com/icons/google-wallet\n\tGraduationCap                    = \"fa-graduation-cap\"                      // https://fontawesome.com/icons/graduation-cap\n\tGratipay                         = \"fa-gratipay\"                            // https://fontawesome.com/icons/gratipay\n\tGroup                            = \"fa-group\"                               // https://fontawesome.com/icons/group\n\tHSquare                          = \"fa-h-square\"                            // https://fontawesome.com/icons/h-square\n\tHackerNews                       = \"fa-hacker-news\"                         // https://fontawesome.com/icons/hacker-news\n\tHandGrabO                        = \"fa-hand-grab-o\"                         // https://fontawesome.com/icons/hand-grab-o\n\tHandLizardO                      = \"fa-hand-lizard-o\"                       // https://fontawesome.com/icons/hand-lizard-o\n\tHandODown                        = \"fa-hand-o-down\"                         // https://fontawesome.com/icons/hand-o-down\n\tHandOLeft                        = \"fa-hand-o-left\"                         // https://fontawesome.com/icons/hand-o-left\n\tHandORight                       = \"fa-hand-o-right\"                        // https://fontawesome.com/icons/hand-o-right\n\tHandOUp                          = \"fa-hand-o-up\"                           // https://fontawesome.com/icons/hand-o-up\n\tHandPaperO                       = \"fa-hand-paper-o\"                        // https://fontawesome.com/icons/hand-paper-o\n\tHandPeaceO                       = \"fa-hand-peace-o\"                        // https://fontawesome.com/icons/hand-peace-o\n\tHandPointerO                     = \"fa-hand-pointer-o\"                      // https://fontawesome.com/icons/hand-pointer-o\n\tHandRockO                        = \"fa-hand-rock-o\"                         // https://fontawesome.com/icons/hand-rock-o\n\tHandScissorsO                    = \"fa-hand-scissors-o\"                     // https://fontawesome.com/icons/hand-scissors-o\n\tHandSpockO                       = \"fa-hand-spock-o\"                        // https://fontawesome.com/icons/hand-spock-o\n\tHandStopO                        = \"fa-hand-stop-o\"                         // https://fontawesome.com/icons/hand-stop-o\n\tHardOfHearing                    = \"fa-hard-of-hearing\"                     // https://fontawesome.com/icons/hard-of-hearing\n\tHashtag                          = \"fa-hashtag\"                             // https://fontawesome.com/icons/hashtag\n\tHddO                             = \"fa-hdd-o\"                               // https://fontawesome.com/icons/hdd-o\n\tHeader                           = \"fa-header\"                              // https://fontawesome.com/icons/header\n\tHeadphones                       = \"fa-headphones\"                          // https://fontawesome.com/icons/headphones\n\tHeart                            = \"fa-heart\"                               // https://fontawesome.com/icons/heart\n\tHeartO                           = \"fa-heart-o\"                             // https://fontawesome.com/icons/heart-o\n\tHeartbeat                        = \"fa-heartbeat\"                           // https://fontawesome.com/icons/heartbeat\n\tHistory                          = \"fa-history\"                             // https://fontawesome.com/icons/history\n\tHome                             = \"fa-home\"                                // https://fontawesome.com/icons/home\n\tHospitalO                        = \"fa-hospital-o\"                          // https://fontawesome.com/icons/hospital-o\n\tHotel                            = \"fa-hotel\"                               // https://fontawesome.com/icons/hotel\n\tHourglass                        = \"fa-hourglass\"                           // https://fontawesome.com/icons/hourglass\n\tHourglass1                       = \"fa-hourglass-1\"                         // https://fontawesome.com/icons/hourglass-1\n\tHourglass2                       = \"fa-hourglass-2\"                         // https://fontawesome.com/icons/hourglass-2\n\tHourglass3                       = \"fa-hourglass-3\"                         // https://fontawesome.com/icons/hourglass-3\n\tHourglassEnd                     = \"fa-hourglass-end\"                       // https://fontawesome.com/icons/hourglass-end\n\tHourglassHalf                    = \"fa-hourglass-half\"                      // https://fontawesome.com/icons/hourglass-half\n\tHourglassO                       = \"fa-hourglass-o\"                         // https://fontawesome.com/icons/hourglass-o\n\tHourglassStart                   = \"fa-hourglass-start\"                     // https://fontawesome.com/icons/hourglass-start\n\tHouzz                            = \"fa-houzz\"                               // https://fontawesome.com/icons/houzz\n\tHtml5                            = \"fa-html5\"                               // https://fontawesome.com/icons/html5\n\tICursor                          = \"fa-i-cursor\"                            // https://fontawesome.com/icons/i-cursor\n\tIls                              = \"fa-ils\"                                 // https://fontawesome.com/icons/ils\n\tImage                            = \"fa-image\"                               // https://fontawesome.com/icons/image\n\tInbox                            = \"fa-inbox\"                               // https://fontawesome.com/icons/inbox\n\tIndent                           = \"fa-indent\"                              // https://fontawesome.com/icons/indent\n\tIndustry                         = \"fa-industry\"                            // https://fontawesome.com/icons/industry\n\tInfo                             = \"fa-info\"                                // https://fontawesome.com/icons/info\n\tInfoCircle                       = \"fa-info-circle\"                         // https://fontawesome.com/icons/info-circle\n\tInr                              = \"fa-inr\"                                 // https://fontawesome.com/icons/inr\n\tInstagram                        = \"fa-instagram\"                           // https://fontawesome.com/icons/instagram\n\tInstitution                      = \"fa-institution\"                         // https://fontawesome.com/icons/institution\n\tInternetExplorer                 = \"fa-internet-explorer\"                   // https://fontawesome.com/icons/internet-explorer\n\tIntersex                         = \"fa-intersex\"                            // https://fontawesome.com/icons/intersex\n\tIoxhost                          = \"fa-ioxhost\"                             // https://fontawesome.com/icons/ioxhost\n\tItalic                           = \"fa-italic\"                              // https://fontawesome.com/icons/italic\n\tJoomla                           = \"fa-joomla\"                              // https://fontawesome.com/icons/joomla\n\tJpy                              = \"fa-jpy\"                                 // https://fontawesome.com/icons/jpy\n\tJsfiddle                         = \"fa-jsfiddle\"                            // https://fontawesome.com/icons/jsfiddle\n\tKey                              = \"fa-key\"                                 // https://fontawesome.com/icons/key\n\tKeyboardO                        = \"fa-keyboard-o\"                          // https://fontawesome.com/icons/keyboard-o\n\tKrw                              = \"fa-krw\"                                 // https://fontawesome.com/icons/krw\n\tLanguage                         = \"fa-language\"                            // https://fontawesome.com/icons/language\n\tLaptop                           = \"fa-laptop\"                              // https://fontawesome.com/icons/laptop\n\tLastfm                           = \"fa-lastfm\"                              // https://fontawesome.com/icons/lastfm\n\tLastfmSquare                     = \"fa-lastfm-square\"                       // https://fontawesome.com/icons/lastfm-square\n\tLeaf                             = \"fa-leaf\"                                // https://fontawesome.com/icons/leaf\n\tLeanpub                          = \"fa-leanpub\"                             // https://fontawesome.com/icons/leanpub\n\tLegal                            = \"fa-legal\"                               // https://fontawesome.com/icons/legal\n\tLemonO                           = \"fa-lemon-o\"                             // https://fontawesome.com/icons/lemon-o\n\tLevelDown                        = \"fa-level-down\"                          // https://fontawesome.com/icons/level-down\n\tLevelUp                          = \"fa-level-up\"                            // https://fontawesome.com/icons/level-up\n\tLifeBouy                         = \"fa-life-bouy\"                           // https://fontawesome.com/icons/life-bouy\n\tLifeBuoy                         = \"fa-life-buoy\"                           // https://fontawesome.com/icons/life-buoy\n\tLifeRing                         = \"fa-life-ring\"                           // https://fontawesome.com/icons/life-ring\n\tLifeSaver                        = \"fa-life-saver\"                          // https://fontawesome.com/icons/life-saver\n\tLightbulbO                       = \"fa-lightbulb-o\"                         // https://fontawesome.com/icons/lightbulb-o\n\tLineChart                        = \"fa-line-chart\"                          // https://fontawesome.com/icons/line-chart\n\tLink                             = \"fa-link\"                                // https://fontawesome.com/icons/link\n\tLinkedin                         = \"fa-linkedin\"                            // https://fontawesome.com/icons/linkedin\n\tLinkedinSquare                   = \"fa-linkedin-square\"                     // https://fontawesome.com/icons/linkedin-square\n\tLinux                            = \"fa-linux\"                               // https://fontawesome.com/icons/linux\n\tList                             = \"fa-list\"                                // https://fontawesome.com/icons/list\n\tListAlt                          = \"fa-list-alt\"                            // https://fontawesome.com/icons/list-alt\n\tListOl                           = \"fa-list-ol\"                             // https://fontawesome.com/icons/list-ol\n\tListUl                           = \"fa-list-ul\"                             // https://fontawesome.com/icons/list-ul\n\tLocationArrow                    = \"fa-location-arrow\"                      // https://fontawesome.com/icons/location-arrow\n\tLock                             = \"fa-lock\"                                // https://fontawesome.com/icons/lock\n\tLongArrowDown                    = \"fa-long-arrow-down\"                     // https://fontawesome.com/icons/long-arrow-down\n\tLongArrowLeft                    = \"fa-long-arrow-left\"                     // https://fontawesome.com/icons/long-arrow-left\n\tLongArrowRight                   = \"fa-long-arrow-right\"                    // https://fontawesome.com/icons/long-arrow-right\n\tLongArrowUp                      = \"fa-long-arrow-up\"                       // https://fontawesome.com/icons/long-arrow-up\n\tLowVision                        = \"fa-low-vision\"                          // https://fontawesome.com/icons/low-vision\n\tMagic                            = \"fa-magic\"                               // https://fontawesome.com/icons/magic\n\tMagnet                           = \"fa-magnet\"                              // https://fontawesome.com/icons/magnet\n\tMailForward                      = \"fa-mail-forward\"                        // https://fontawesome.com/icons/mail-forward\n\tMailReply                        = \"fa-mail-reply\"                          // https://fontawesome.com/icons/mail-reply\n\tMailReplyAll                     = \"fa-mail-reply-all\"                      // https://fontawesome.com/icons/mail-reply-all\n\tMale                             = \"fa-male\"                                // https://fontawesome.com/icons/male\n\tMap                              = \"fa-map\"                                 // https://fontawesome.com/icons/map\n\tMapMarker                        = \"fa-map-marker\"                          // https://fontawesome.com/icons/map-marker\n\tMapO                             = \"fa-map-o\"                               // https://fontawesome.com/icons/map-o\n\tMapPin                           = \"fa-map-pin\"                             // https://fontawesome.com/icons/map-pin\n\tMapSigns                         = \"fa-map-signs\"                           // https://fontawesome.com/icons/map-signs\n\tMars                             = \"fa-mars\"                                // https://fontawesome.com/icons/mars\n\tMarsDouble                       = \"fa-mars-double\"                         // https://fontawesome.com/icons/mars-double\n\tMarsStroke                       = \"fa-mars-stroke\"                         // https://fontawesome.com/icons/mars-stroke\n\tMarsStrokeH                      = \"fa-mars-stroke-h\"                       // https://fontawesome.com/icons/mars-stroke-h\n\tMarsStrokeV                      = \"fa-mars-stroke-v\"                       // https://fontawesome.com/icons/mars-stroke-v\n\tMaxcdn                           = \"fa-maxcdn\"                              // https://fontawesome.com/icons/maxcdn\n\tMeanpath                         = \"fa-meanpath\"                            // https://fontawesome.com/icons/meanpath\n\tMedium                           = \"fa-medium\"                              // https://fontawesome.com/icons/medium\n\tMedkit                           = \"fa-medkit\"                              // https://fontawesome.com/icons/medkit\n\tMehO                             = \"fa-meh-o\"                               // https://fontawesome.com/icons/meh-o\n\tMercury                          = \"fa-mercury\"                             // https://fontawesome.com/icons/mercury\n\tMicrophone                       = \"fa-microphone\"                          // https://fontawesome.com/icons/microphone\n\tMicrophoneSlash                  = \"fa-microphone-slash\"                    // https://fontawesome.com/icons/microphone-slash\n\tMinus                            = \"fa-minus\"                               // https://fontawesome.com/icons/minus\n\tMinusCircle                      = \"fa-minus-circle\"                        // https://fontawesome.com/icons/minus-circle\n\tMinusSquare                      = \"fa-minus-square\"                        // https://fontawesome.com/icons/minus-square\n\tMinusSquareO                     = \"fa-minus-square-o\"                      // https://fontawesome.com/icons/minus-square-o\n\tMixcloud                         = \"fa-mixcloud\"                            // https://fontawesome.com/icons/mixcloud\n\tMobile                           = \"fa-mobile\"                              // https://fontawesome.com/icons/mobile\n\tMobilePhone                      = \"fa-mobile-phone\"                        // https://fontawesome.com/icons/mobile-phone\n\tModx                             = \"fa-modx\"                                // https://fontawesome.com/icons/modx\n\tMoney                            = \"fa-money\"                               // https://fontawesome.com/icons/money\n\tMoonO                            = \"fa-moon-o\"                              // https://fontawesome.com/icons/moon-o\n\tMortarBoard                      = \"fa-mortar-board\"                        // https://fontawesome.com/icons/mortar-board\n\tMotorcycle                       = \"fa-motorcycle\"                          // https://fontawesome.com/icons/motorcycle\n\tMousePointer                     = \"fa-mouse-pointer\"                       // https://fontawesome.com/icons/mouse-pointer\n\tMusic                            = \"fa-music\"                               // https://fontawesome.com/icons/music\n\tNavicon                          = \"fa-navicon\"                             // https://fontawesome.com/icons/navicon\n\tNeuter                           = \"fa-neuter\"                              // https://fontawesome.com/icons/neuter\n\tNewspaperO                       = \"fa-newspaper-o\"                         // https://fontawesome.com/icons/newspaper-o\n\tObjectGroup                      = \"fa-object-group\"                        // https://fontawesome.com/icons/object-group\n\tObjectUngroup                    = \"fa-object-ungroup\"                      // https://fontawesome.com/icons/object-ungroup\n\tOdnoklassniki                    = \"fa-odnoklassniki\"                       // https://fontawesome.com/icons/odnoklassniki\n\tOdnoklassnikiSquare              = \"fa-odnoklassniki-square\"                // https://fontawesome.com/icons/odnoklassniki-square\n\tOpencart                         = \"fa-opencart\"                            // https://fontawesome.com/icons/opencart\n\tOpenid                           = \"fa-openid\"                              // https://fontawesome.com/icons/openid\n\tOpera                            = \"fa-opera\"                               // https://fontawesome.com/icons/opera\n\tOptinMonster                     = \"fa-optin-monster\"                       // https://fontawesome.com/icons/optin-monster\n\tOutdent                          = \"fa-outdent\"                             // https://fontawesome.com/icons/outdent\n\tPagelines                        = \"fa-pagelines\"                           // https://fontawesome.com/icons/pagelines\n\tPaintBrush                       = \"fa-paint-brush\"                         // https://fontawesome.com/icons/paint-brush\n\tPaperPlane                       = \"fa-paper-plane\"                         // https://fontawesome.com/icons/paper-plane\n\tPaperPlaneO                      = \"fa-paper-plane-o\"                       // https://fontawesome.com/icons/paper-plane-o\n\tPaperclip                        = \"fa-paperclip\"                           // https://fontawesome.com/icons/paperclip\n\tParagraph                        = \"fa-paragraph\"                           // https://fontawesome.com/icons/paragraph\n\tPaste                            = \"fa-paste\"                               // https://fontawesome.com/icons/paste\n\tPause                            = \"fa-pause\"                               // https://fontawesome.com/icons/pause\n\tPauseCircle                      = \"fa-pause-circle\"                        // https://fontawesome.com/icons/pause-circle\n\tPauseCircleO                     = \"fa-pause-circle-o\"                      // https://fontawesome.com/icons/pause-circle-o\n\tPaw                              = \"fa-paw\"                                 // https://fontawesome.com/icons/paw\n\tPaypal                           = \"fa-paypal\"                              // https://fontawesome.com/icons/paypal\n\tPencil                           = \"fa-pencil\"                              // https://fontawesome.com/icons/pencil\n\tPencilSquare                     = \"fa-pencil-square\"                       // https://fontawesome.com/icons/pencil-square\n\tPencilSquareO                    = \"fa-pencil-square-o\"                     // https://fontawesome.com/icons/pencil-square-o\n\tPercent                          = \"fa-percent\"                             // https://fontawesome.com/icons/percent\n\tPhone                            = \"fa-phone\"                               // https://fontawesome.com/icons/phone\n\tPhoneSquare                      = \"fa-phone-square\"                        // https://fontawesome.com/icons/phone-square\n\tPhoto                            = \"fa-photo\"                               // https://fontawesome.com/icons/photo\n\tPictureO                         = \"fa-picture-o\"                           // https://fontawesome.com/icons/picture-o\n\tPieChart                         = \"fa-pie-chart\"                           // https://fontawesome.com/icons/pie-chart\n\tPiedPiper                        = \"fa-pied-piper\"                          // https://fontawesome.com/icons/pied-piper\n\tPiedPiperAlt                     = \"fa-pied-piper-alt\"                      // https://fontawesome.com/icons/pied-piper-alt\n\tPiedPiperPp                      = \"fa-pied-piper-pp\"                       // https://fontawesome.com/icons/pied-piper-pp\n\tPinterest                        = \"fa-pinterest\"                           // https://fontawesome.com/icons/pinterest\n\tPinterestP                       = \"fa-pinterest-p\"                         // https://fontawesome.com/icons/pinterest-p\n\tPinterestSquare                  = \"fa-pinterest-square\"                    // https://fontawesome.com/icons/pinterest-square\n\tPlane                            = \"fa-plane\"                               // https://fontawesome.com/icons/plane\n\tPlay                             = \"fa-play\"                                // https://fontawesome.com/icons/play\n\tPlayCircle                       = \"fa-play-circle\"                         // https://fontawesome.com/icons/play-circle\n\tPlayCircleO                      = \"fa-play-circle-o\"                       // https://fontawesome.com/icons/play-circle-o\n\tPlug                             = \"fa-plug\"                                // https://fontawesome.com/icons/plug\n\tPlus                             = \"fa-plus\"                                // https://fontawesome.com/icons/plus\n\tPlusCircle                       = \"fa-plus-circle\"                         // https://fontawesome.com/icons/plus-circle\n\tPlusSquare                       = \"fa-plus-square\"                         // https://fontawesome.com/icons/plus-square\n\tPlusSquareO                      = \"fa-plus-square-o\"                       // https://fontawesome.com/icons/plus-square-o\n\tPowerOff                         = \"fa-power-off\"                           // https://fontawesome.com/icons/power-off\n\tPrint                            = \"fa-print\"                               // https://fontawesome.com/icons/print\n\tProductHunt                      = \"fa-product-hunt\"                        // https://fontawesome.com/icons/product-hunt\n\tPuzzlePiece                      = \"fa-puzzle-piece\"                        // https://fontawesome.com/icons/puzzle-piece\n\tQq                               = \"fa-qq\"                                  // https://fontawesome.com/icons/qq\n\tQrcode                           = \"fa-qrcode\"                              // https://fontawesome.com/icons/qrcode\n\tQuestion                         = \"fa-question\"                            // https://fontawesome.com/icons/question\n\tQuestionCircle                   = \"fa-question-circle\"                     // https://fontawesome.com/icons/question-circle\n\tQuestionCircleO                  = \"fa-question-circle-o\"                   // https://fontawesome.com/icons/question-circle-o\n\tQuoteLeft                        = \"fa-quote-left\"                          // https://fontawesome.com/icons/quote-left\n\tQuoteRight                       = \"fa-quote-right\"                         // https://fontawesome.com/icons/quote-right\n\tRa                               = \"fa-ra\"                                  // https://fontawesome.com/icons/ra\n\tRandom                           = \"fa-random\"                              // https://fontawesome.com/icons/random\n\tRebel                            = \"fa-rebel\"                               // https://fontawesome.com/icons/rebel\n\tRecycle                          = \"fa-recycle\"                             // https://fontawesome.com/icons/recycle\n\tReddit                           = \"fa-reddit\"                              // https://fontawesome.com/icons/reddit\n\tRedditAlien                      = \"fa-reddit-alien\"                        // https://fontawesome.com/icons/reddit-alien\n\tRedditSquare                     = \"fa-reddit-square\"                       // https://fontawesome.com/icons/reddit-square\n\tRefresh                          = \"fa-refresh\"                             // https://fontawesome.com/icons/refresh\n\tRegistered                       = \"fa-registered\"                          // https://fontawesome.com/icons/registered\n\tRemove                           = \"fa-remove\"                              // https://fontawesome.com/icons/remove\n\tRenren                           = \"fa-renren\"                              // https://fontawesome.com/icons/renren\n\tReorder                          = \"fa-reorder\"                             // https://fontawesome.com/icons/reorder\n\tRepeat                           = \"fa-repeat\"                              // https://fontawesome.com/icons/repeat\n\tReply                            = \"fa-reply\"                               // https://fontawesome.com/icons/reply\n\tReplyAll                         = \"fa-reply-all\"                           // https://fontawesome.com/icons/reply-all\n\tResistance                       = \"fa-resistance\"                          // https://fontawesome.com/icons/resistance\n\tRetweet                          = \"fa-retweet\"                             // https://fontawesome.com/icons/retweet\n\tRmb                              = \"fa-rmb\"                                 // https://fontawesome.com/icons/rmb\n\tRoad                             = \"fa-road\"                                // https://fontawesome.com/icons/road\n\tRocket                           = \"fa-rocket\"                              // https://fontawesome.com/icons/rocket\n\tRotateLeft                       = \"fa-rotate-left\"                         // https://fontawesome.com/icons/rotate-left\n\tRotateRight                      = \"fa-rotate-right\"                        // https://fontawesome.com/icons/rotate-right\n\tRouble                           = \"fa-rouble\"                              // https://fontawesome.com/icons/rouble\n\tRss                              = \"fa-rss\"                                 // https://fontawesome.com/icons/rss\n\tRssSquare                        = \"fa-rss-square\"                          // https://fontawesome.com/icons/rss-square\n\tRub                              = \"fa-rub\"                                 // https://fontawesome.com/icons/rub\n\tRuble                            = \"fa-ruble\"                               // https://fontawesome.com/icons/ruble\n\tRupee                            = \"fa-rupee\"                               // https://fontawesome.com/icons/rupee\n\tSafari                           = \"fa-safari\"                              // https://fontawesome.com/icons/safari\n\tSave                             = \"fa-save\"                                // https://fontawesome.com/icons/save\n\tScissors                         = \"fa-scissors\"                            // https://fontawesome.com/icons/scissors\n\tScribd                           = \"fa-scribd\"                              // https://fontawesome.com/icons/scribd\n\tSearch                           = \"fa-search\"                              // https://fontawesome.com/icons/search\n\tSearchMinus                      = \"fa-search-minus\"                        // https://fontawesome.com/icons/search-minus\n\tSearchPlus                       = \"fa-search-plus\"                         // https://fontawesome.com/icons/search-plus\n\tSellsy                           = \"fa-sellsy\"                              // https://fontawesome.com/icons/sellsy\n\tSend                             = \"fa-send\"                                // https://fontawesome.com/icons/send\n\tSendO                            = \"fa-send-o\"                              // https://fontawesome.com/icons/send-o\n\tServer                           = \"fa-server\"                              // https://fontawesome.com/icons/server\n\tShare                            = \"fa-share\"                               // https://fontawesome.com/icons/share\n\tShareAlt                         = \"fa-share-alt\"                           // https://fontawesome.com/icons/share-alt\n\tShareAltSquare                   = \"fa-share-alt-square\"                    // https://fontawesome.com/icons/share-alt-square\n\tShareSquare                      = \"fa-share-square\"                        // https://fontawesome.com/icons/share-square\n\tShareSquareO                     = \"fa-share-square-o\"                      // https://fontawesome.com/icons/share-square-o\n\tShekel                           = \"fa-shekel\"                              // https://fontawesome.com/icons/shekel\n\tSheqel                           = \"fa-sheqel\"                              // https://fontawesome.com/icons/sheqel\n\tShield                           = \"fa-shield\"                              // https://fontawesome.com/icons/shield\n\tShip                             = \"fa-ship\"                                // https://fontawesome.com/icons/ship\n\tShirtsinbulk                     = \"fa-shirtsinbulk\"                        // https://fontawesome.com/icons/shirtsinbulk\n\tShoppingBag                      = \"fa-shopping-bag\"                        // https://fontawesome.com/icons/shopping-bag\n\tShoppingBasket                   = \"fa-shopping-basket\"                     // https://fontawesome.com/icons/shopping-basket\n\tShoppingCart                     = \"fa-shopping-cart\"                       // https://fontawesome.com/icons/shopping-cart\n\tSignIn                           = \"fa-sign-in\"                             // https://fontawesome.com/icons/sign-in\n\tSignLanguage                     = \"fa-sign-language\"                       // https://fontawesome.com/icons/sign-language\n\tSignOut                          = \"fa-sign-out\"                            // https://fontawesome.com/icons/sign-out\n\tSignal                           = \"fa-signal\"                              // https://fontawesome.com/icons/signal\n\tSigning                          = \"fa-signing\"                             // https://fontawesome.com/icons/signing\n\tSimplybuilt                      = \"fa-simplybuilt\"                         // https://fontawesome.com/icons/simplybuilt\n\tSitemap                          = \"fa-sitemap\"                             // https://fontawesome.com/icons/sitemap\n\tSkyatlas                         = \"fa-skyatlas\"                            // https://fontawesome.com/icons/skyatlas\n\tSkype                            = \"fa-skype\"                               // https://fontawesome.com/icons/skype\n\tSlack                            = \"fa-slack\"                               // https://fontawesome.com/icons/slack\n\tSliders                          = \"fa-sliders\"                             // https://fontawesome.com/icons/sliders\n\tSlideshare                       = \"fa-slideshare\"                          // https://fontawesome.com/icons/slideshare\n\tSmileO                           = \"fa-smile-o\"                             // https://fontawesome.com/icons/smile-o\n\tSnapchat                         = \"fa-snapchat\"                            // https://fontawesome.com/icons/snapchat\n\tSnapchatGhost                    = \"fa-snapchat-ghost\"                      // https://fontawesome.com/icons/snapchat-ghost\n\tSnapchatSquare                   = \"fa-snapchat-square\"                     // https://fontawesome.com/icons/snapchat-square\n\tSoccerBallO                      = \"fa-soccer-ball-o\"                       // https://fontawesome.com/icons/soccer-ball-o\n\tSort                             = \"fa-sort\"                                // https://fontawesome.com/icons/sort\n\tSortAlphaAsc                     = \"fa-sort-alpha-asc\"                      // https://fontawesome.com/icons/sort-alpha-asc\n\tSortAlphaDesc                    = \"fa-sort-alpha-desc\"                     // https://fontawesome.com/icons/sort-alpha-desc\n\tSortAmountAsc                    = \"fa-sort-amount-asc\"                     // https://fontawesome.com/icons/sort-amount-asc\n\tSortAmountDesc                   = \"fa-sort-amount-desc\"                    // https://fontawesome.com/icons/sort-amount-desc\n\tSortAsc                          = \"fa-sort-asc\"                            // https://fontawesome.com/icons/sort-asc\n\tSortDesc                         = \"fa-sort-desc\"                           // https://fontawesome.com/icons/sort-desc\n\tSortDown                         = \"fa-sort-down\"                           // https://fontawesome.com/icons/sort-down\n\tSortNumericAsc                   = \"fa-sort-numeric-asc\"                    // https://fontawesome.com/icons/sort-numeric-asc\n\tSortNumericDesc                  = \"fa-sort-numeric-desc\"                   // https://fontawesome.com/icons/sort-numeric-desc\n\tSortUp                           = \"fa-sort-up\"                             // https://fontawesome.com/icons/sort-up\n\tSoundcloud                       = \"fa-soundcloud\"                          // https://fontawesome.com/icons/soundcloud\n\tSpaceShuttle                     = \"fa-space-shuttle\"                       // https://fontawesome.com/icons/space-shuttle\n\tSpinner                          = \"fa-spinner\"                             // https://fontawesome.com/icons/spinner\n\tSpoon                            = \"fa-spoon\"                               // https://fontawesome.com/icons/spoon\n\tSpotify                          = \"fa-spotify\"                             // https://fontawesome.com/icons/spotify\n\tSquare                           = \"fa-square\"                              // https://fontawesome.com/icons/square\n\tSquareO                          = \"fa-square-o\"                            // https://fontawesome.com/icons/square-o\n\tStackExchange                    = \"fa-stack-exchange\"                      // https://fontawesome.com/icons/stack-exchange\n\tStackOverflow                    = \"fa-stack-overflow\"                      // https://fontawesome.com/icons/stack-overflow\n\tStar                             = \"fa-star\"                                // https://fontawesome.com/icons/star\n\tStarHalf                         = \"fa-star-half\"                           // https://fontawesome.com/icons/star-half\n\tStarHalfEmpty                    = \"fa-star-half-empty\"                     // https://fontawesome.com/icons/star-half-empty\n\tStarHalfFull                     = \"fa-star-half-full\"                      // https://fontawesome.com/icons/star-half-full\n\tStarHalfO                        = \"fa-star-half-o\"                         // https://fontawesome.com/icons/star-half-o\n\tStarO                            = \"fa-star-o\"                              // https://fontawesome.com/icons/star-o\n\tSteam                            = \"fa-steam\"                               // https://fontawesome.com/icons/steam\n\tSteamSquare                      = \"fa-steam-square\"                        // https://fontawesome.com/icons/steam-square\n\tStepBackward                     = \"fa-step-backward\"                       // https://fontawesome.com/icons/step-backward\n\tStepForward                      = \"fa-step-forward\"                        // https://fontawesome.com/icons/step-forward\n\tStethoscope                      = \"fa-stethoscope\"                         // https://fontawesome.com/icons/stethoscope\n\tStickyNote                       = \"fa-sticky-note\"                         // https://fontawesome.com/icons/sticky-note\n\tStickyNoteO                      = \"fa-sticky-note-o\"                       // https://fontawesome.com/icons/sticky-note-o\n\tStop                             = \"fa-stop\"                                // https://fontawesome.com/icons/stop\n\tStopCircle                       = \"fa-stop-circle\"                         // https://fontawesome.com/icons/stop-circle\n\tStopCircleO                      = \"fa-stop-circle-o\"                       // https://fontawesome.com/icons/stop-circle-o\n\tStreetView                       = \"fa-street-view\"                         // https://fontawesome.com/icons/street-view\n\tStrikethrough                    = \"fa-strikethrough\"                       // https://fontawesome.com/icons/strikethrough\n\tStumbleupon                      = \"fa-stumbleupon\"                         // https://fontawesome.com/icons/stumbleupon\n\tStumbleuponCircle                = \"fa-stumbleupon-circle\"                  // https://fontawesome.com/icons/stumbleupon-circle\n\tSubscript                        = \"fa-subscript\"                           // https://fontawesome.com/icons/subscript\n\tSubway                           = \"fa-subway\"                              // https://fontawesome.com/icons/subway\n\tSuitcase                         = \"fa-suitcase\"                            // https://fontawesome.com/icons/suitcase\n\tSunO                             = \"fa-sun-o\"                               // https://fontawesome.com/icons/sun-o\n\tSuperscript                      = \"fa-superscript\"                         // https://fontawesome.com/icons/superscript\n\tSupport                          = \"fa-support\"                             // https://fontawesome.com/icons/support\n\tTable                            = \"fa-table\"                               // https://fontawesome.com/icons/table\n\tTablet                           = \"fa-tablet\"                              // https://fontawesome.com/icons/tablet\n\tTachometer                       = \"fa-tachometer\"                          // https://fontawesome.com/icons/tachometer\n\tTag                              = \"fa-tag\"                                 // https://fontawesome.com/icons/tag\n\tTags                             = \"fa-tags\"                                // https://fontawesome.com/icons/tags\n\tTasks                            = \"fa-tasks\"                               // https://fontawesome.com/icons/tasks\n\tTaxi                             = \"fa-taxi\"                                // https://fontawesome.com/icons/taxi\n\tTelevision                       = \"fa-television\"                          // https://fontawesome.com/icons/television\n\tTencentWeibo                     = \"fa-tencent-weibo\"                       // https://fontawesome.com/icons/tencent-weibo\n\tTerminal                         = \"fa-terminal\"                            // https://fontawesome.com/icons/terminal\n\tTextHeight                       = \"fa-text-height\"                         // https://fontawesome.com/icons/text-height\n\tTextWidth                        = \"fa-text-width\"                          // https://fontawesome.com/icons/text-width\n\tTh                               = \"fa-th\"                                  // https://fontawesome.com/icons/th\n\tThLarge                          = \"fa-th-large\"                            // https://fontawesome.com/icons/th-large\n\tThList                           = \"fa-th-list\"                             // https://fontawesome.com/icons/th-list\n\tThemeisle                        = \"fa-themeisle\"                           // https://fontawesome.com/icons/themeisle\n\tThumbTack                        = \"fa-thumb-tack\"                          // https://fontawesome.com/icons/thumb-tack\n\tThumbsDown                       = \"fa-thumbs-down\"                         // https://fontawesome.com/icons/thumbs-down\n\tThumbsODown                      = \"fa-thumbs-o-down\"                       // https://fontawesome.com/icons/thumbs-o-down\n\tThumbsOUp                        = \"fa-thumbs-o-up\"                         // https://fontawesome.com/icons/thumbs-o-up\n\tThumbsUp                         = \"fa-thumbs-up\"                           // https://fontawesome.com/icons/thumbs-up\n\tTicket                           = \"fa-ticket\"                              // https://fontawesome.com/icons/ticket\n\tTimes                            = \"fa-times\"                               // https://fontawesome.com/icons/times\n\tTimesCircle                      = \"fa-times-circle\"                        // https://fontawesome.com/icons/times-circle\n\tTimesCircleO                     = \"fa-times-circle-o\"                      // https://fontawesome.com/icons/times-circle-o\n\tTint                             = \"fa-tint\"                                // https://fontawesome.com/icons/tint\n\tToggleDown                       = \"fa-toggle-down\"                         // https://fontawesome.com/icons/toggle-down\n\tToggleLeft                       = \"fa-toggle-left\"                         // https://fontawesome.com/icons/toggle-left\n\tToggleOff                        = \"fa-toggle-off\"                          // https://fontawesome.com/icons/toggle-off\n\tToggleOn                         = \"fa-toggle-on\"                           // https://fontawesome.com/icons/toggle-on\n\tToggleRight                      = \"fa-toggle-right\"                        // https://fontawesome.com/icons/toggle-right\n\tToggleUp                         = \"fa-toggle-up\"                           // https://fontawesome.com/icons/toggle-up\n\tTrademark                        = \"fa-trademark\"                           // https://fontawesome.com/icons/trademark\n\tTrain                            = \"fa-train\"                               // https://fontawesome.com/icons/train\n\tTransgender                      = \"fa-transgender\"                         // https://fontawesome.com/icons/transgender\n\tTransgenderAlt                   = \"fa-transgender-alt\"                     // https://fontawesome.com/icons/transgender-alt\n\tTrash                            = \"fa-trash\"                               // https://fontawesome.com/icons/trash\n\tTrashO                           = \"fa-trash-o\"                             // https://fontawesome.com/icons/trash-o\n\tTree                             = \"fa-tree\"                                // https://fontawesome.com/icons/tree\n\tTrello                           = \"fa-trello\"                              // https://fontawesome.com/icons/trello\n\tTripadvisor                      = \"fa-tripadvisor\"                         // https://fontawesome.com/icons/tripadvisor\n\tTrophy                           = \"fa-trophy\"                              // https://fontawesome.com/icons/trophy\n\tTruck                            = \"fa-truck\"                               // https://fontawesome.com/icons/truck\n\tTry                              = \"fa-try\"                                 // https://fontawesome.com/icons/try\n\tTty                              = \"fa-tty\"                                 // https://fontawesome.com/icons/tty\n\tTumblr                           = \"fa-tumblr\"                              // https://fontawesome.com/icons/tumblr\n\tTumblrSquare                     = \"fa-tumblr-square\"                       // https://fontawesome.com/icons/tumblr-square\n\tTurkishLira                      = \"fa-turkish-lira\"                        // https://fontawesome.com/icons/turkish-lira\n\tTv                               = \"fa-tv\"                                  // https://fontawesome.com/icons/tv\n\tTwitch                           = \"fa-twitch\"                              // https://fontawesome.com/icons/twitch\n\tTwitter                          = \"fa-twitter\"                             // https://fontawesome.com/icons/twitter\n\tTwitterSquare                    = \"fa-twitter-square\"                      // https://fontawesome.com/icons/twitter-square\n\tUmbrella                         = \"fa-umbrella\"                            // https://fontawesome.com/icons/umbrella\n\tUnderline                        = \"fa-underline\"                           // https://fontawesome.com/icons/underline\n\tUndo                             = \"fa-undo\"                                // https://fontawesome.com/icons/undo\n\tUniversalAccess                  = \"fa-universal-access\"                    // https://fontawesome.com/icons/universal-access\n\tUniversity                       = \"fa-university\"                          // https://fontawesome.com/icons/university\n\tUnlink                           = \"fa-unlink\"                              // https://fontawesome.com/icons/unlink\n\tUnlock                           = \"fa-unlock\"                              // https://fontawesome.com/icons/unlock\n\tUnlockAlt                        = \"fa-unlock-alt\"                          // https://fontawesome.com/icons/unlock-alt\n\tUnsorted                         = \"fa-unsorted\"                            // https://fontawesome.com/icons/unsorted\n\tUpload                           = \"fa-upload\"                              // https://fontawesome.com/icons/upload\n\tUsb                              = \"fa-usb\"                                 // https://fontawesome.com/icons/usb\n\tUsd                              = \"fa-usd\"                                 // https://fontawesome.com/icons/usd\n\tUser                             = \"fa-user\"                                // https://fontawesome.com/icons/user\n\tUserMd                           = \"fa-user-md\"                             // https://fontawesome.com/icons/user-md\n\tUserPlus                         = \"fa-user-plus\"                           // https://fontawesome.com/icons/user-plus\n\tUserSecret                       = \"fa-user-secret\"                         // https://fontawesome.com/icons/user-secret\n\tUserTimes                        = \"fa-user-times\"                          // https://fontawesome.com/icons/user-times\n\tUsers                            = \"fa-users\"                               // https://fontawesome.com/icons/users\n\tVenus                            = \"fa-venus\"                               // https://fontawesome.com/icons/venus\n\tVenusDouble                      = \"fa-venus-double\"                        // https://fontawesome.com/icons/venus-double\n\tVenusMars                        = \"fa-venus-mars\"                          // https://fontawesome.com/icons/venus-mars\n\tViacoin                          = \"fa-viacoin\"                             // https://fontawesome.com/icons/viacoin\n\tViadeo                           = \"fa-viadeo\"                              // https://fontawesome.com/icons/viadeo\n\tViadeoSquare                     = \"fa-viadeo-square\"                       // https://fontawesome.com/icons/viadeo-square\n\tVideoCamera                      = \"fa-video-camera\"                        // https://fontawesome.com/icons/video-camera\n\tVimeo                            = \"fa-vimeo\"                               // https://fontawesome.com/icons/vimeo\n\tVimeoSquare                      = \"fa-vimeo-square\"                        // https://fontawesome.com/icons/vimeo-square\n\tVine                             = \"fa-vine\"                                // https://fontawesome.com/icons/vine\n\tVk                               = \"fa-vk\"                                  // https://fontawesome.com/icons/vk\n\tVolumeControlPhone               = \"fa-volume-control-phone\"                // https://fontawesome.com/icons/volume-control-phone\n\tVolumeDown                       = \"fa-volume-down\"                         // https://fontawesome.com/icons/volume-down\n\tVolumeOff                        = \"fa-volume-off\"                          // https://fontawesome.com/icons/volume-off\n\tVolumeUp                         = \"fa-volume-up\"                           // https://fontawesome.com/icons/volume-up\n\tWarning                          = \"fa-warning\"                             // https://fontawesome.com/icons/warning\n\tWechat                           = \"fa-wechat\"                              // https://fontawesome.com/icons/wechat\n\tWeibo                            = \"fa-weibo\"                               // https://fontawesome.com/icons/weibo\n\tWeixin                           = \"fa-weixin\"                              // https://fontawesome.com/icons/weixin\n\tWhatsapp                         = \"fa-whatsapp\"                            // https://fontawesome.com/icons/whatsapp\n\tWheelchair                       = \"fa-wheelchair\"                          // https://fontawesome.com/icons/wheelchair\n\tWheelchairAlt                    = \"fa-wheelchair-alt\"                      // https://fontawesome.com/icons/wheelchair-alt\n\tWifi                             = \"fa-wifi\"                                // https://fontawesome.com/icons/wifi\n\tWikipediaW                       = \"fa-wikipedia-w\"                         // https://fontawesome.com/icons/wikipedia-w\n\tWindows                          = \"fa-windows\"                             // https://fontawesome.com/icons/windows\n\tWon                              = \"fa-won\"                                 // https://fontawesome.com/icons/won\n\tWordpress                        = \"fa-wordpress\"                           // https://fontawesome.com/icons/wordpress\n\tWpbeginner                       = \"fa-wpbeginner\"                          // https://fontawesome.com/icons/wpbeginner\n\tWpforms                          = \"fa-wpforms\"                             // https://fontawesome.com/icons/wpforms\n\tWrench                           = \"fa-wrench\"                              // https://fontawesome.com/icons/wrench\n\tXing                             = \"fa-xing\"                                // https://fontawesome.com/icons/xing\n\tXingSquare                       = \"fa-xing-square\"                         // https://fontawesome.com/icons/xing-square\n\tYCombinator                      = \"fa-y-combinator\"                        // https://fontawesome.com/icons/y-combinator\n\tYCombinatorSquare                = \"fa-y-combinator-square\"                 // https://fontawesome.com/icons/y-combinator-square\n\tYahoo                            = \"fa-yahoo\"                               // https://fontawesome.com/icons/yahoo\n\tYc                               = \"fa-yc\"                                  // https://fontawesome.com/icons/yc\n\tYcSquare                         = \"fa-yc-square\"                           // https://fontawesome.com/icons/yc-square\n\tYelp                             = \"fa-yelp\"                                // https://fontawesome.com/icons/yelp\n\tYen                              = \"fa-yen\"                                 // https://fontawesome.com/icons/yen\n\tYoast                            = \"fa-yoast\"                               // https://fontawesome.com/icons/yoast\n\tYoutube                          = \"fa-youtube\"                             // https://fontawesome.com/icons/youtube\n\tYoutubePlay                      = \"fa-youtube-play\"                        // https://fontawesome.com/icons/youtube-play\n\tYoutubeSquare                    = \"fa-youtube-square\"                      // https://fontawesome.com/icons/youtube-square\n\tIonIosGearOutline                = \"ion-ios-gear-outline\"                   // https://fontawesome.com/icons/ion-ios-gear-outline\n\tIonIosCartOutline                = \"ion-ios-cart-outline\"                   // https://fontawesome.com/icons/ion-ios-cart-outline\n\tIonIosPeopleOutline              = \"ion-ios-people-outline\"                 // https://fontawesome.com/icons/ion-ios-people-outline\n)\n"
  },
  {
    "path": "template/installation/Makefile",
    "content": "all:\n\tfind ./ -name \".DS_Store\" -depth -exec rm {} \\;\n\tadm combine js --path=./assets/src/js/combine/ --out=./assets/login/dist/all.min.js\n\tadm combine css --path=./assets/src/css/ --out=./assets/login/dist/all.min.css\n\tadm compile asset --path=./assets/login/dist/ --out=./ --pa=login"
  },
  {
    "path": "template/installation/assets/src/css/main.css",
    "content": "@import url(font-awesome.min.css);\n@import url(\"https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,300i,400i\");\n/* Reset */\n\n\thtml, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tborder: 0;\n\t\tfont-size: 100%;\n\t\tfont: inherit;\n\t\tvertical-align: baseline;\n\t}\n\n\tarticle, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {\n\t\tdisplay: block;\n\t}\n\n\tbody {\n\t\tline-height: 1;\n\t}\n\n\tol, ul {\n\t\tlist-style: none;\n\t}\n\n\tblockquote, q {\n\t\tquotes: none;\n\t}\n\n\tblockquote:before, blockquote:after, q:before, q:after {\n\t\tcontent: '';\n\t\tcontent: none;\n\t}\n\n\ttable {\n\t\tborder-collapse: collapse;\n\t\tborder-spacing: 0;\n\t}\n\n\tbody {\n\t\t-webkit-text-size-adjust: none;\n\t}\n\t\n\t.copyrights{\n\ttext-indent:-9999px;\n\theight:0;\n\tline-height:0;\n\tfont-size:0;\n\toverflow:hidden;\n}\n\n/* Box Model */\n\n\t*, *:before, *:after {\n\t\t-moz-box-sizing: border-box;\n\t\t-webkit-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n/* Page */\n\n\t@-moz-keyframes load-spinner {\n\t\t0% {\n\t\t\t-moz-transform: rotate(0deg);\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t-ms-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\n\t\t100% {\n\t\t\t-moz-transform: rotate(360deg);\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\t-ms-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t@-webkit-keyframes load-spinner {\n\t\t0% {\n\t\t\t-moz-transform: rotate(0deg);\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t-ms-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\n\t\t100% {\n\t\t\t-moz-transform: rotate(360deg);\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\t-ms-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t@-ms-keyframes load-spinner {\n\t\t0% {\n\t\t\t-moz-transform: rotate(0deg);\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t-ms-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\n\t\t100% {\n\t\t\t-moz-transform: rotate(360deg);\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\t-ms-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t@keyframes load-spinner {\n\t\t0% {\n\t\t\t-moz-transform: rotate(0deg);\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t-ms-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\n\t\t100% {\n\t\t\t-moz-transform: rotate(360deg);\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\t-ms-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t@-ms-viewport {\n\t\twidth: device-width;\n\t}\n\n\thtml {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\n\tbody {\n\t\tdisplay: -moz-flex;\n\t\tdisplay: -webkit-flex;\n\t\tdisplay: -ms-flex;\n\t\tdisplay: flex;\n\t\t-moz-align-items: center;\n\t\t-webkit-align-items: center;\n\t\t-ms-align-items: center;\n\t\talign-items: center;\n\t\t-moz-justify-content: -moz-flex-start;\n\t\t-webkit-justify-content: -webkit-flex-start;\n\t\t-ms-justify-content: -ms-flex-start;\n\t\tjustify-content: flex-start;\n\t\t-ms-overflow-style: scrollbar;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmin-height: 30rem;\n\t\toverflow: hidden;\n\t}\n\n\t\tbody:before {\n\t\t\t-moz-animation: load-spinner 1s infinite linear;\n\t\t\t-webkit-animation: load-spinner 1s infinite linear;\n\t\t\t-ms-animation: load-spinner 1s infinite linear;\n\t\t\tanimation: load-spinner 1s infinite linear;\n\t\t\t-moz-transition: opacity 0.25s ease;\n\t\t\t-webkit-transition: opacity 0.25s ease;\n\t\t\t-ms-transition: opacity 0.25s ease;\n\t\t\ttransition: opacity 0.25s ease;\n\t\t\t-moz-transition-delay: 0s;\n\t\t\t-webkit-transition-delay: 0s;\n\t\t\t-ms-transition-delay: 0s;\n\t\t\ttransition-delay: 0s;\n\t\t\t-moz-pointer-events: none;\n\t\t\t-webkit-pointer-events: none;\n\t\t\t-ms-pointer-events: none;\n\t\t\tpointer-events: none;\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\twidth: 4rem;\n\t\t\theight: 4rem;\n\t\t\tmargin: -2rem 0 0 -2rem;\n\t\t\tbackground-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='96px' height='96px' viewBox='0 0 96 96' zoomAndPan='disable'%3E%3Cstyle%3Ecircle %7Bfill: transparent%3B stroke: %232e2b37%3B stroke-width: 1.5px%3B %7D%3C/style%3E%3Cdefs%3E%3CclipPath id='corner'%3E%3Cpolygon points='0,0 48,0 48,48 96,48 96,96 0,96' /%3E%3C/clipPath%3E%3C/defs%3E%3Cg clip-path='url(%23corner)'%3E%3Ccircle cx='48' cy='48' r='32'/%3E%3C/g%3E%3C/svg%3E\");\n\t\t\tbackground-position: center;\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-size: 4rem;\n\t\t\topacity: 0;\n\t\t}\n\n\t\tbody:after {\n\t\t\t-moz-pointer-events: none;\n\t\t\t-webkit-pointer-events: none;\n\t\t\t-ms-pointer-events: none;\n\t\t\tpointer-events: none;\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tz-index: -1;\n\t\t\tbackground-attachment: fixed;\n\t\t\tbackground-color: #e1e6e1;\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), url(\"../../images/bg.jpg\");\n\t\t\tbackground-repeat: repeat, repeat-x;\n\t\t\tbackground-size: 128px 128px, cover;\n\t\t}\n\n\t\tbody.is-loading *, body.is-loading *:before, body.is-loading *:after {\n\t\t\t-moz-animation: none !important;\n\t\t\t-webkit-animation: none !important;\n\t\t\t-ms-animation: none !important;\n\t\t\tanimation: none !important;\n\t\t\t-moz-transition: none !important;\n\t\t\t-webkit-transition: none !important;\n\t\t\t-ms-transition: none !important;\n\t\t\ttransition: none !important;\n\t\t}\n\n\t\tbody.is-loading:before {\n\t\t\t-moz-transition: opacity 1s ease;\n\t\t\t-webkit-transition: opacity 1s ease;\n\t\t\t-ms-transition: opacity 1s ease;\n\t\t\ttransition: opacity 1s ease;\n\t\t\t-moz-transition-delay: 0.75s;\n\t\t\t-webkit-transition-delay: 0.75s;\n\t\t\t-ms-transition-delay: 0.75s;\n\t\t\ttransition-delay: 0.75s;\n\t\t\topacity: 0.25;\n\t\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\thtml {\n\t\t\theight: auto;\n\t\t}\n\n\t\tbody {\n\t\t\theight: auto;\n\t\t\toverflow-x: hidden;\n\t\t\toverflow-y: auto;\n\t\t}\n\n\t}\n\n\t@media screen and (max-width: 480px) {\n\n\t\thtml, body {\n\t\t\tmin-width: 320px;\n\t\t}\n\n\t}\n\n/* Typography */\n\n\thtml {\n\t\tfont-size: 18pt;\n\t\tfont-size: 1vmax;\n\t}\n\n\t\t@media screen and (max-width: 1680px) {\n\n\t\t\thtml {\n\t\t\t\tfont-size: 12pt;\n\t\t\t\tfont-size: 1.1vmax;\n\t\t\t}\n\n\t\t}\n\n\t\t@media screen and (max-width: 1280px) {\n\n\t\t\thtml {\n\t\t\t\tfont-size: 11pt;\n\t\t\t\tfont-size: 1.5vmax;\n\t\t\t}\n\n\t\t}\n\n\tbody, input, select, textarea {\n\t\tcolor: rgba(255, 255, 255, 0.75);\n\t\tfont-family: \"Source Sans Pro\", Helvetica, sans-serif;\n\t\tfont-size: 1rem;\n\t\tfont-weight: 300;\n\t\tline-height: 1.65;\n\t}\n\n\ta {\n\t\t-moz-transition: color 0.2s ease-in-out, border-bottom-color 0.2s ease-in-out;\n\t\t-webkit-transition: color 0.2s ease-in-out, border-bottom-color 0.2s ease-in-out;\n\t\t-ms-transition: color 0.2s ease-in-out, border-bottom-color 0.2s ease-in-out;\n\t\ttransition: color 0.2s ease-in-out, border-bottom-color 0.2s ease-in-out;\n\t\tcolor: inherit;\n\t\tborder-bottom: dotted 1px;\n\t\ttext-decoration: none;\n\t}\n\n\t\ta:hover {\n\t\t\tborder-bottom-color: transparent;\n\t\t\tcolor: #ffe4b4;\n\t\t}\n\n\tstrong, b {\n\t\tcolor: rgba(255, 255, 255, 0.875);\n\t\tfont-weight: 400;\n\t}\n\n\tem, i {\n\t\tfont-style: italic;\n\t}\n\n\tp {\n\t\tmargin: 0 0 1.5rem 0;\n\t}\n\n\t\tbody.is-ie p {\n\t\t\twidth: 100%;\n\t\t}\n\n\th1, h2, h3, h4, h5, h6 {\n\t\tcolor: rgba(255, 255, 255, 0.875);\n\t\tfont-family: Arial, Helvetica, sans-serif;\n\t\tfont-weight: 700;\n\t\tline-height: 1.3;\n\t\tmargin: 0 0 0.75rem 0;\n\t\tletter-spacing: -0.05em;\n\t}\n\n\t\th1 a, h2 a, h3 a, h4 a, h5 a, h6 a {\n\t\t\tcolor: inherit;\n\t\t\ttext-decoration: none;\n\t\t}\n\n\th1.major, h2.major, h3.major {\n\t\tposition: relative;\n\t}\n\n\t\th1.major:after, h2.major:after, h3.major:after {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\twidth: 3.5rem;\n\t\t\theight: 0.1rem;\n\t\t\tbackground-color: rgba(255, 255, 255, 0.25);\n\t\t}\n\n\th1 {\n\t\tfont-size: 3rem;\n\t\tline-height: 1.2;\n\t}\n\n\t\th1.major {\n\t\t\tmargin: 0 0 2.625rem 0;\n\t\t}\n\n\t\t\th1.major:after {\n\t\t\t\tbottom: -1.325rem;\n\t\t\t}\n\n\th2 {\n\t\tfont-size: 1.75rem;\n\t\tline-height: 1.2;\n\t}\n\n\t\th2.major {\n\t\t\tmargin: 0 0 1.9875rem 0;\n\t\t}\n\n\t\t\th2.major:after {\n\t\t\t\tbottom: -1.2rem;\n\t\t\t}\n\n\th3 {\n\t\tfont-size: 1.325rem;\n\t}\n\n\t\th3.major {\n\t\t\tmargin: 0 0 1.875rem 0;\n\t\t}\n\n\t\t\th3.major:after {\n\t\t\t\tbottom: -0.75rem;\n\t\t\t}\n\n\th4 {\n\t\tfont-size: 1rem;\n\t}\n\n\th5 {\n\t\tfont-size: 0.9rem;\n\t}\n\n\th6 {\n\t\tfont-size: 0.7rem;\n\t}\n\n\tsub {\n\t\tfont-size: 0.8rem;\n\t\tposition: relative;\n\t\ttop: 0.5rem;\n\t}\n\n\tsup {\n\t\tfont-size: 0.8rem;\n\t\tposition: relative;\n\t\ttop: -0.5rem;\n\t}\n\n\tblockquote {\n\t\tborder-left: solid 0.25rem rgba(255, 255, 255, 0.25);\n\t\tfont-style: italic;\n\t\tmargin: 0 0 1.5rem 0;\n\t\tpadding: 0.375rem 0 0.375rem 1.5rem;\n\t}\n\n\tcode {\n\t\tbackground: rgba(255, 255, 255, 0.075);\n\t\tborder-radius: 0.25rem;\n\t\tfont-family: \"Courier New\", monospace;\n\t\tfont-size: 0.8rem;\n\t\tmargin: 0 0.25rem;\n\t\tpadding: 0.25rem 0.65rem;\n\t}\n\n\tpre {\n\t\t-webkit-overflow-scrolling: touch;\n\t\tfont-family: \"Courier New\", monospace;\n\t\tfont-size: 0.8rem;\n\t\tmargin: 0 0 1.5rem 0;\n\t\twhite-space: pre-wrap;\n\t}\n\n\t\tpre code {\n\t\t\tdisplay: block;\n\t\t\tline-height: 1.625;\n\t\t\tpadding: 1rem 1.5rem;\n\t\t\toverflow-x: auto;\n\t\t\tmargin: 0;\n\t\t}\n\n\thr {\n\t\tborder: 0;\n\t\tborder-bottom: solid 2px rgba(255, 255, 255, 0.25);\n\t\tmargin: 1.875rem 0;\n\t}\n\n\t.align-left {\n\t\ttext-align: left;\n\t}\n\n\t.align-center {\n\t\ttext-align: center;\n\t}\n\n\t.align-right {\n\t\ttext-align: right;\n\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\thtml {\n\t\t\tfont-size: 12pt;\n\t\t}\n\n\t\th1 {\n\t\t\tfont-size: 2.25rem;\n\t\t\tline-height: 1.2;\n\t\t}\n\n\t\t\th1.major {\n\t\t\t\tmargin: 0 0 2.625rem 0;\n\t\t\t}\n\n\t\t\t\th1.major:after {\n\t\t\t\t\tbottom: -1.325rem;\n\t\t\t\t}\n\n\t\th2 {\n\t\t\tfont-size: 1.5rem;\n\t\t\tline-height: 1.2;\n\t\t}\n\n\t\t\th2.major {\n\t\t\t\tmargin: 0 0 1.9875rem 0;\n\t\t\t}\n\n\t\t\t\th2.major:after {\n\t\t\t\t\tbottom: -1.2rem;\n\t\t\t\t}\n\n\t\th3 {\n\t\t\tfont-size: 1rem;\n\t\t}\n\n\t\t\th3.major {\n\t\t\t\tmargin: 0 0 1.875rem 0;\n\t\t\t}\n\n\t\t\t\th3.major:after {\n\t\t\t\t\tbottom: -0.75rem;\n\t\t\t\t}\n\n\t\th4 {\n\t\t\tfont-size: 1rem;\n\t\t}\n\n\t\th5 {\n\t\t\tfont-size: 0.9rem;\n\t\t}\n\n\t\th6 {\n\t\t\tfont-size: 0.7rem;\n\t\t}\n\n\t\th1 br, h2 br, h3 br, h4 br, h5 br, h6 br {\n\t\t\tdisplay: none;\n\t\t}\n\n\t}\n\n\t@media screen and (max-width: 360px) {\n\n\t\thtml {\n\t\t\tfont-size: 11pt;\n\t\t}\n\n\t}\n\n/* Form */\n\n\tform {\n\t\tdisplay: -moz-flex;\n\t\tdisplay: -webkit-flex;\n\t\tdisplay: -ms-flex;\n\t\tdisplay: flex;\n\t\t-moz-flex-wrap: wrap;\n\t\t-webkit-flex-wrap: wrap;\n\t\t-ms-flex-wrap: wrap;\n\t\tflex-wrap: wrap;\n\t\twidth: calc(100% + 3rem);\n\t\tmargin: -1.5rem 0 1.5rem -1.5rem;\n\t}\n\n\t\tform > .field {\n\t\t\t-moz-flex-grow: 0;\n\t\t\t-webkit-flex-grow: 0;\n\t\t\t-ms-flex-grow: 0;\n\t\t\tflex-grow: 0;\n\t\t\t-moz-flex-shrink: 0;\n\t\t\t-webkit-flex-shrink: 0;\n\t\t\t-ms-flex-shrink: 0;\n\t\t\tflex-shrink: 0;\n\t\t\tpadding: 1.5rem 0 0 1.5rem;\n\t\t\twidth: calc(100% - 1.5rem);\n\t\t}\n\n\t\t\tform > .field.half {\n\t\t\t\twidth: calc(50% - 0.75rem);\n\t\t\t}\n\n\t\t\tform > .field.third {\n\t\t\t\twidth: calc(100%/3 - 0.5rem);\n\t\t\t}\n\n\t\t\tform > .field.quarter {\n\t\t\t\twidth: calc(25% - 0.375rem);\n\t\t\t}\n\n\t\tform > .actions {\n\t\t\t-moz-flex-grow: 0;\n\t\t\t-webkit-flex-grow: 0;\n\t\t\t-ms-flex-grow: 0;\n\t\t\tflex-grow: 0;\n\t\t\t-moz-flex-shrink: 1;\n\t\t\t-webkit-flex-shrink: 1;\n\t\t\t-ms-flex-shrink: 1;\n\t\t\tflex-shrink: 1;\n\t\t\tmargin: 1.5rem 0 0 1.5rem;\n\t\t}\n\n\tlabel {\n\t\tcolor: rgba(255, 255, 255, 0.875);\n\t\tdisplay: block;\n\t\tfont-family: Arial, Helvetica, sans-serif;\n\t\tfont-size: 0.8rem;\n\t\tfont-weight: 700;\n\t\tmargin: 0 0 0.4875rem 0;\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"password\"],\n\tinput[type=\"email\"],\n\tinput[type=\"tel\"],\n\tselect,\n\ttextarea {\n\t\t-moz-appearance: none;\n\t\t-webkit-appearance: none;\n\t\t-ms-appearance: none;\n\t\tappearance: none;\n\t\tbackground: transparent;\n\t\tborder: solid 2px rgba(255, 255, 255, 0.25);\n\t\tborder-radius: 0.25rem;\n\t\tcolor: inherit;\n\t\tdisplay: block;\n\t\toutline: 0;\n\t\tpadding: 0 0.75rem;\n\t\ttext-decoration: none;\n\t\twidth: 100%;\n\t}\n\n\t\tinput[type=\"text\"]:invalid,\n\t\tinput[type=\"password\"]:invalid,\n\t\tinput[type=\"email\"]:invalid,\n\t\tinput[type=\"tel\"]:invalid,\n\t\tselect:invalid,\n\t\ttextarea:invalid {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\tinput[type=\"text\"]:focus,\n\t\tinput[type=\"password\"]:focus,\n\t\tinput[type=\"email\"]:focus,\n\t\tinput[type=\"tel\"]:focus,\n\t\tselect:focus,\n\t\ttextarea:focus {\n\t\t\tborder-color: #ffe4b4;\n\t\t}\n\n\toption {\n\t\tbackground-color: rgba(255, 255, 255, 0.875);\n\t\tcolor: #2e2b37;\n\t}\n\n\t.select-wrapper {\n\t\ttext-decoration: none;\n\t\tdisplay: block;\n\t\tposition: relative;\n\t}\n\n\t\t.select-wrapper:before {\n\t\t\t-moz-osx-font-smoothing: grayscale;\n\t\t\t-webkit-font-smoothing: antialiased;\n\t\t\tfont-family: FontAwesome;\n\t\t\tfont-style: normal;\n\t\t\tfont-weight: normal;\n\t\t\ttext-transform: none !important;\n\t\t}\n\n\t\t.select-wrapper:before {\n\t\t\tdisplay: block;\n\t\t\tcontent: '\\f107';\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tright: 0;\n\t\t\twidth: 2.5rem;\n\t\t\theight: 2.5rem;\n\t\t\tline-height: 2.5rem;\n\t\t\tcolor: rgba(255, 255, 255, 0.75);\n\t\t\tpointer-events: none;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t\tbody.is-ie .select-wrapper:before {\n\t\t\t\tline-height: 2.5;\n\t\t\t}\n\n\t\t.select-wrapper select::-ms-expand {\n\t\t\tdisplay: none;\n\t\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"password\"],\n\tinput[type=\"email\"],\n\tselect {\n\t\theight: 2.5rem;\n\t}\n\n\ttextarea {\n\t\tpadding: 0.75rem 1rem;\n\t}\n\n\tinput[type=\"checkbox\"],\n\tinput[type=\"radio\"] {\n\t\t-moz-appearance: none;\n\t\t-webkit-appearance: none;\n\t\t-ms-appearance: none;\n\t\tappearance: none;\n\t\tdisplay: block;\n\t\tfloat: left;\n\t\tmargin-right: -2rem;\n\t\topacity: 0;\n\t\twidth: 1rem;\n\t\tz-index: -1;\n\t}\n\n\t\tinput[type=\"checkbox\"] + label,\n\t\tinput[type=\"radio\"] + label {\n\t\t\ttext-decoration: none;\n\t\t\tposition: relative;\n\t\t\tcolor: rgba(255, 255, 255, 0.75);\n\t\t\tcursor: pointer;\n\t\t\tdisplay: inline-block;\n\t\t\tfont-size: 1rem;\n\t\t\tfont-weight: 300;\n\t\t\tmargin-bottom: 0;\n\t\t\tpadding-left: 2.5rem;\n\t\t\tpadding-right: 1rem;\n\t\t}\n\n\t\t\tinput[type=\"checkbox\"] + label:before,\n\t\t\tinput[type=\"radio\"] + label:before {\n\t\t\t\t-moz-osx-font-smoothing: grayscale;\n\t\t\t\t-webkit-font-smoothing: antialiased;\n\t\t\t\tfont-family: FontAwesome;\n\t\t\t\tfont-style: normal;\n\t\t\t\tfont-weight: normal;\n\t\t\t\ttext-transform: none !important;\n\t\t\t}\n\n\t\t\tinput[type=\"checkbox\"] + label:before,\n\t\t\tinput[type=\"radio\"] + label:before {\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 1.5rem;\n\t\t\t\theight: 1.5rem;\n\t\t\t\tline-height: 1.4375rem;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.075);\n\t\t\t\tborder: solid 1px rgba(255, 255, 255, 0.25);\n\t\t\t\tborder-radius: 0.25rem;\n\t\t\t\tcolor: #2e2b37;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\t\t\t\tbody.is-ie input[type=\"checkbox\"] + label:before, body.is-ie\n\t\t\t\tinput[type=\"radio\"] + label:before {\n\t\t\t\t\tline-height: 1.5;\n\t\t\t\t}\n\n\t\tinput[type=\"checkbox\"]:checked + label:before,\n\t\tinput[type=\"radio\"]:checked + label:before {\n\t\t\tcontent: '\\f00c';\n\t\t\tbackground: rgba(255, 255, 255, 0.875);\n\t\t\tborder-color: rgba(255, 255, 255, 0.875);\n\t\t}\n\n\t\tinput[type=\"checkbox\"]:focus + label:before,\n\t\tinput[type=\"radio\"]:focus + label:before {\n\t\t\tborder-color: #ffe4b4;\n\t\t\tbox-shadow: 0 0 0 1px #ffe4b4;\n\t\t}\n\n\t\tinput[type=\"checkbox\"]:focus:checked + label:before,\n\t\tinput[type=\"radio\"]:focus:checked + label:before {\n\t\t\tbackground: #ffe4b4;\n\t\t}\n\n\t\tinput[type=\"checkbox\"].color1 + label:before,\n\t\tinput[type=\"radio\"].color1 + label:before {\n\t\t\tcolor: #726193;\n\t\t}\n\n\t\tinput[type=\"checkbox\"].color2 + label:before,\n\t\tinput[type=\"radio\"].color2 + label:before {\n\t\t\tcolor: #e37b7c;\n\t\t}\n\n\t\tinput[type=\"checkbox\"].color3 + label:before,\n\t\tinput[type=\"radio\"].color3 + label:before {\n\t\t\tcolor: #ffe4b4;\n\t\t}\n\n\t\tinput[type=\"checkbox\"].color4 + label:before,\n\t\tinput[type=\"radio\"].color4 + label:before {\n\t\t\tcolor: #353865;\n\t\t}\n\n\tinput[type=\"checkbox\"] + label:before {\n\t\tborder-radius: 0.25rem;\n\t}\n\n\tinput[type=\"radio\"] + label:before {\n\t\tborder-radius: 100%;\n\t}\n\n\t::-webkit-input-placeholder {\n\t\tcolor: rgba(255, 255, 255, 0.5) !important;\n\t\topacity: 1.0;\n\t}\n\n\t:-moz-placeholder {\n\t\tcolor: rgba(255, 255, 255, 0.5) !important;\n\t\topacity: 1.0;\n\t}\n\n\t::-moz-placeholder {\n\t\tcolor: rgba(255, 255, 255, 0.5) !important;\n\t\topacity: 1.0;\n\t}\n\n\t:-ms-input-placeholder {\n\t\tcolor: rgba(255, 255, 255, 0.5) !important;\n\t\topacity: 1.0;\n\t}\n\n\t.formerize-placeholder {\n\t\tcolor: rgba(255, 255, 255, 0.5) !important;\n\t\topacity: 1.0;\n\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\tform {\n\t\t\tmargin: -1.5rem 0 1.5rem 0;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t\tform > .field {\n\t\t\t\tpadding: 1.5rem 0 0 0;\n\t\t\t\twidth: 100% !important;\n\t\t\t}\n\n\t\t\tform > .actions {\n\t\t\t\tmargin: 1.5rem 0 0 0;\n\t\t\t}\n\n\t}\n\n/* Icon */\n\n\t.icon {\n\t\ttext-decoration: none;\n\t\tposition: relative;\n\t\tborder-bottom: none;\n\t}\n\n\t\t.icon:before {\n\t\t\t-moz-osx-font-smoothing: grayscale;\n\t\t\t-webkit-font-smoothing: antialiased;\n\t\t\tfont-family: FontAwesome;\n\t\t\tfont-style: normal;\n\t\t\tfont-weight: normal;\n\t\t\ttext-transform: none !important;\n\t\t}\n\n\t\t.icon > .label {\n\t\t\tdisplay: none;\n\t\t}\n\n/* Image */\n\n\t.image {\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\tborder: 0;\n\t}\n\n\t\t.image.filtered:after {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t-moz-pointer-events: none;\n\t\t\t-webkit-pointer-events: none;\n\t\t\t-ms-pointer-events: none;\n\t\t\tpointer-events: none;\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\topacity: 1;\n\t\t\tz-index: 1;\n\t\t}\n\n\t\t.image.filtered.tinted:after {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25)), linear-gradient(0deg, rgba(0, 0, 0, 0.125), rgba(0, 0, 0, 0.125));\n\t\t\tbackground-size: 128px 128px, auto, auto;\n\t\t}\n\n\t\t.image[data-position] img {\n\t\t\t-moz-object-fit: cover;\n\t\t\t-webkit-object-fit: cover;\n\t\t\t-ms-object-fit: cover;\n\t\t\tobject-fit: cover;\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\n\t\t.image[data-position=\"top left\"] img {\n\t\t\t-moz-object-position: top left;\n\t\t\t-webkit-object-position: top left;\n\t\t\t-ms-object-position: top left;\n\t\t\tobject-position: top left;\n\t\t}\n\n\t\t.image[data-position=\"top\"] img {\n\t\t\t-moz-object-position: top;\n\t\t\t-webkit-object-position: top;\n\t\t\t-ms-object-position: top;\n\t\t\tobject-position: top;\n\t\t}\n\n\t\t.image[data-position=\"top right\"] img {\n\t\t\t-moz-object-position: top right;\n\t\t\t-webkit-object-position: top right;\n\t\t\t-ms-object-position: top right;\n\t\t\tobject-position: top right;\n\t\t}\n\n\t\t.image[data-position=\"right\"] img {\n\t\t\t-moz-object-position: right;\n\t\t\t-webkit-object-position: right;\n\t\t\t-ms-object-position: right;\n\t\t\tobject-position: right;\n\t\t}\n\n\t\t.image[data-position=\"bottom right\"] img {\n\t\t\t-moz-object-position: bottom right;\n\t\t\t-webkit-object-position: bottom right;\n\t\t\t-ms-object-position: bottom right;\n\t\t\tobject-position: bottom right;\n\t\t}\n\n\t\t.image[data-position=\"bottom\"] img {\n\t\t\t-moz-object-position: bottom;\n\t\t\t-webkit-object-position: bottom;\n\t\t\t-ms-object-position: bottom;\n\t\t\tobject-position: bottom;\n\t\t}\n\n\t\t.image[data-position=\"bottom left\"] img {\n\t\t\t-moz-object-position: bottom left;\n\t\t\t-webkit-object-position: bottom left;\n\t\t\t-ms-object-position: bottom left;\n\t\t\tobject-position: bottom left;\n\t\t}\n\n\t\t.image[data-position=\"left\"] img {\n\t\t\t-moz-object-position: left;\n\t\t\t-webkit-object-position: left;\n\t\t\t-ms-object-position: left;\n\t\t\tobject-position: left;\n\t\t}\n\n\t\t.image[data-position=\"center\"] img {\n\t\t\t-moz-object-position: center;\n\t\t\t-webkit-object-position: center;\n\t\t\t-ms-object-position: center;\n\t\t\tobject-position: center;\n\t\t}\n\n\t\t.image[data-position=\"25% 25%\"] img {\n\t\t\t-moz-object-position: 25% 25%;\n\t\t\t-webkit-object-position: 25% 25%;\n\t\t\t-ms-object-position: 25% 25%;\n\t\t\tobject-position: 25% 25%;\n\t\t}\n\n\t\t.image[data-position=\"75% 25%\"] img {\n\t\t\t-moz-object-position: 75% 25%;\n\t\t\t-webkit-object-position: 75% 25%;\n\t\t\t-ms-object-position: 75% 25%;\n\t\t\tobject-position: 75% 25%;\n\t\t}\n\n\t\t.image[data-position=\"75% 75%\"] img {\n\t\t\t-moz-object-position: 75% 75%;\n\t\t\t-webkit-object-position: 75% 75%;\n\t\t\t-ms-object-position: 75% 75%;\n\t\t\tobject-position: 75% 75%;\n\t\t}\n\n\t\t.image[data-position=\"25% 75%\"] img {\n\t\t\t-moz-object-position: 25% 75%;\n\t\t\t-webkit-object-position: 25% 75%;\n\t\t\t-ms-object-position: 25% 75%;\n\t\t\tobject-position: 25% 75%;\n\t\t}\n\n\t\t.image img {\n\t\t\tdisplay: block;\n\t\t}\n\n\t\t.image.left, .image.right {\n\t\t\tmax-width: 40%;\n\t\t}\n\n\t\t\t.image.left img, .image.right img {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t.image.left {\n\t\t\tfloat: left;\n\t\t\tpadding: 0 1.5rem 1rem 0;\n\t\t\ttop: 0.25rem;\n\t\t}\n\n\t\t.image.right {\n\t\t\tfloat: right;\n\t\t\tpadding: 0 0 1rem 1.5rem;\n\t\t\ttop: 0.25rem;\n\t\t}\n\n\t\t.image.fit {\n\t\t\tdisplay: block;\n\t\t\tmargin: 0 0 1.5rem 0;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t\t.image.fit img {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t.image.main {\n\t\t\tdisplay: block;\n\t\t\tmargin: 0 0 2.25rem 0;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t\t.image.main img {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n/* List */\n\n\tol {\n\t\tlist-style: decimal;\n\t\tmargin: 0 0 1.5rem 0;\n\t\tpadding-left: 1.25rem;\n\t}\n\n\t\tol li {\n\t\t\tpadding-left: 0.25rem;\n\t\t}\n\n\tul {\n\t\tlist-style: disc;\n\t\tmargin: 0 0 1.5rem 0;\n\t\tpadding-left: 1rem;\n\t}\n\n\t\tul li {\n\t\t\tpadding-left: 0.5rem;\n\t\t}\n\n\t\tul.alt {\n\t\t\tlist-style: none;\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t\tul.alt li {\n\t\t\t\tborder-top: solid 1px rgba(255, 255, 255, 0.25);\n\t\t\t\tpadding: 0.5rem 0;\n\t\t\t}\n\n\t\t\t\tul.alt li:first-child {\n\t\t\t\t\tborder-top: 0;\n\t\t\t\t\tpadding-top: 0;\n\t\t\t\t}\n\n\t\tul.icons {\n\t\t\tcursor: default;\n\t\t\tlist-style: none;\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t\tul.icons li {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 0 1rem 0 0;\n\t\t\t}\n\n\t\t\t\tul.icons li:last-child {\n\t\t\t\t\tpadding-right: 0;\n\t\t\t\t}\n\n\t\t\t\tul.icons li .icon:before {\n\t\t\t\t\tfont-size: 1.25em;\n\t\t\t\t}\n\n\t\tul.actions {\n\t\t\tcursor: default;\n\t\t\tlist-style: none;\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t\tul.actions li {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 0 0.75rem 0 0;\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\n\t\t\t\tul.actions li:last-child {\n\t\t\t\t\tpadding-right: 0;\n\t\t\t\t}\n\n\t\t\tul.actions.small li {\n\t\t\t\tpadding: 0 0.375rem 0 0;\n\t\t\t}\n\n\t\t\tul.actions.vertical li {\n\t\t\t\tdisplay: block;\n\t\t\t\tpadding: 0.75rem 0 0 0;\n\t\t\t}\n\n\t\t\t\tul.actions.vertical li:first-child {\n\t\t\t\t\tpadding-top: 0;\n\t\t\t\t}\n\n\t\t\t\tul.actions.vertical li > * {\n\t\t\t\t\tmargin-bottom: 0;\n\t\t\t\t}\n\n\t\t\tul.actions.vertical.small li {\n\t\t\t\tpadding: 0.375rem 0 0 0;\n\t\t\t}\n\n\t\t\t\tul.actions.vertical.small li:first-child {\n\t\t\t\t\tpadding-top: 0;\n\t\t\t\t}\n\n\t\t\tul.actions.fit {\n\t\t\t\tdisplay: table;\n\t\t\t\tmargin-left: -0.75rem;\n\t\t\t\tpadding: 0;\n\t\t\t\ttable-layout: fixed;\n\t\t\t\twidth: calc(100% + 0.75rem);\n\t\t\t}\n\n\t\t\t\tul.actions.fit li {\n\t\t\t\t\tdisplay: table-cell;\n\t\t\t\t\tpadding: 0 0 0 0.75rem;\n\t\t\t\t}\n\n\t\t\t\t\tul.actions.fit li > * {\n\t\t\t\t\t\tmargin-bottom: 0;\n\t\t\t\t\t}\n\n\t\t\t\tul.actions.fit.small {\n\t\t\t\t\tmargin-left: -0.375rem;\n\t\t\t\t\twidth: calc(100% + 0.375rem);\n\t\t\t\t}\n\n\t\t\t\t\tul.actions.fit.small li {\n\t\t\t\t\t\tpadding: 0 0 0 0.375rem;\n\t\t\t\t\t}\n\n\t\tul.contact-icons {\n\t\t\tlist-style: none;\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t\tul.contact-icons > li {\n\t\t\t\tmargin: 1.25rem 0 0 0;\n\t\t\t\tpadding-left: 0;\n\t\t\t}\n\n\t\t\t\tul.contact-icons > li:before {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\twidth: 2.25rem;\n\t\t\t\t\theight: 2.25rem;\n\t\t\t\t\tline-height: 2.25rem;\n\t\t\t\t\tborder-radius: 2.25rem;\n\t\t\t\t\tbackground-color: white;\n\t\t\t\t\tcolor: #2e2b37;\n\t\t\t\t\tcursor: default;\n\t\t\t\t\tfont-size: 1.125rem;\n\t\t\t\t\tmargin-right: 1rem;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t\tvertical-align: middle;\n\t\t\t\t}\n\n\t\t\t\t\tbody.is-ie ul.contact-icons > li:before {\n\t\t\t\t\t\tline-height: 2.125;\n\t\t\t\t\t}\n\n\t\t\t\tul.contact-icons > li a {\n\t\t\t\t\tborder-bottom: 0;\n\t\t\t\t}\n\n\t\t\tul.contact-icons.color1 > li:before {\n\t\t\t\tcolor: #726193;\n\t\t\t}\n\n\t\t\tul.contact-icons.color2 > li:before {\n\t\t\t\tcolor: #e37b7c;\n\t\t\t}\n\n\t\t\tul.contact-icons.color3 > li:before {\n\t\t\t\tcolor: #ffe4b4;\n\t\t\t}\n\n\t\t\tul.contact-icons.color4 > li:before {\n\t\t\t\tcolor: #353865;\n\t\t\t}\n\n\t\tul.grid-icons {\n\t\t\tdisplay: -moz-flex;\n\t\t\tdisplay: -webkit-flex;\n\t\t\tdisplay: -ms-flex;\n\t\t\tdisplay: flex;\n\t\t\t-moz-flex-wrap: wrap;\n\t\t\t-webkit-flex-wrap: wrap;\n\t\t\t-ms-flex-wrap: wrap;\n\t\t\tflex-wrap: wrap;\n\t\t\t-moz-justify-content: center;\n\t\t\t-webkit-justify-content: center;\n\t\t\t-ms-justify-content: center;\n\t\t\tjustify-content: center;\n\t\t\tlist-style: none;\n\t\t\tmargin: 0 0 1.5rem 0;\n\t\t\tpadding-left: 0;\n\t\t}\n\n\t\t\tul.grid-icons .icon {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: relative;\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\t\t\t\tul.grid-icons .icon:before {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\twidth: 6rem;\n\t\t\t\t\theight: 6rem;\n\t\t\t\t\tline-height: 6rem;\n\t\t\t\t\tborder-radius: 6rem;\n\t\t\t\t\tbox-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.25);\n\t\t\t\t\tfont-size: 2.5rem;\n\t\t\t\t\tmargin: 0 auto;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\n\t\t\t\t\tbody.is-ie ul.grid-icons .icon:before {\n\t\t\t\t\t\tline-height: 2.375;\n\t\t\t\t\t}\n\n\t\t\tul.grid-icons > li {\n\t\t\t\t-moz-flex-grow: 0;\n\t\t\t\t-webkit-flex-grow: 0;\n\t\t\t\t-ms-flex-grow: 0;\n\t\t\t\tflex-grow: 0;\n\t\t\t\t-moz-flex-shrink: 0;\n\t\t\t\t-webkit-flex-shrink: 0;\n\t\t\t\t-ms-flex-shrink: 0;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tposition: relative;\n\t\t\t\tmargin: 1.5rem 0 0 1.5rem;\n\t\t\t\tpadding-left: 0;\n\t\t\t}\n\n\t\t\tul.grid-icons.connected > li:before {\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: 1.5rem;\n\t\t\t\theight: 2px;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: -1.5rem;\n\t\t\t\tbackground-color: rgba(255, 255, 255, 0.25);\n\t\t\t}\n\n\t\t\tul.grid-icons.connected > li:after {\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: 2px;\n\t\t\t\theight: 1.5rem;\n\t\t\t\ttop: -1.5rem;\n\t\t\t\tleft: 50%;\n\t\t\t\tbackground-color: rgba(255, 255, 255, 0.25);\n\t\t\t}\n\n\t\t\tul.grid-icons.two {\n\t\t\t\twidth: 14rem;\n\t\t\t}\n\n\t\t\t\tul.grid-icons.two > li:nth-child(-n + 2) {\n\t\t\t\t\tmargin-top: 0;\n\t\t\t\t}\n\n\t\t\t\t\tul.grid-icons.two > li:nth-child(-n + 2):after {\n\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t}\n\n\t\t\t\tul.grid-icons.two > li:nth-child(2n - 1) {\n\t\t\t\t\tmargin-left: 0;\n\t\t\t\t}\n\n\t\t\t\t\tul.grid-icons.two > li:nth-child(2n - 1):before {\n\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t}\n\n\t\t\tul.grid-icons.three {\n\t\t\t\twidth: 21.5rem;\n\t\t\t}\n\n\t\t\t\tul.grid-icons.three > li:nth-child(-n + 3) {\n\t\t\t\t\tmargin-top: 0;\n\t\t\t\t}\n\n\t\t\t\t\tul.grid-icons.three > li:nth-child(-n + 3):after {\n\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t}\n\n\t\t\t\tul.grid-icons.three > li:nth-child(3n - 2) {\n\t\t\t\t\tmargin-left: 0;\n\t\t\t\t}\n\n\t\t\t\t\tul.grid-icons.three > li:nth-child(3n - 2):before {\n\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t}\n\n\t\t\tul.grid-icons.four {\n\t\t\t\twidth: 29rem;\n\t\t\t}\n\n\t\t\t\tul.grid-icons.four > li:nth-child(-n + 4) {\n\t\t\t\t\tmargin-top: 0;\n\t\t\t\t}\n\n\t\t\t\t\tul.grid-icons.four > li:nth-child(-n + 4):after {\n\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t}\n\n\t\t\t\tul.grid-icons.four > li:nth-child(4n - 3) {\n\t\t\t\t\tmargin-left: 0;\n\t\t\t\t}\n\n\t\t\t\t\tul.grid-icons.four > li:nth-child(4n - 3):before {\n\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t}\n\n\tdl {\n\t\tmargin: 0 0 1.5rem 0;\n\t}\n\n\t\tdl dt {\n\t\t\tdisplay: block;\n\t\t\tfont-weight: 400;\n\t\t\tmargin: 0 0 0.75rem 0;\n\t\t}\n\n\t\tdl dd {\n\t\t\tmargin-left: 1.5rem;\n\t\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\tul.grid-icons {\n\t\t\t-moz-justify-content: -moz-flex-start;\n\t\t\t-webkit-justify-content: -webkit-flex-start;\n\t\t\t-ms-justify-content: -ms-flex-start;\n\t\t\tjustify-content: flex-start;\n\t\t\twidth: 100% !important;\n\t\t\tmargin: -1rem 0 1.5rem -1rem;\n\t\t}\n\n\t\t\tul.grid-icons .icon:before {\n\t\t\t\twidth: 4.5rem;\n\t\t\t\theight: 4.5rem;\n\t\t\t\tline-height: 4.5rem;\n\t\t\t\tfont-size: 1.75rem;\n\t\t\t}\n\n\t\t\tul.grid-icons > li {\n\t\t\t\tmargin: 1rem 0 0 1rem !important;\n\t\t\t}\n\n\t\t\t\tul.grid-icons > li:before {\n\t\t\t\t\tdisplay: none !important;\n\t\t\t\t}\n\n\t\t\t\tul.grid-icons > li:after {\n\t\t\t\t\tdisplay: none !important;\n\t\t\t\t}\n\n\t}\n\n/* Table */\n\n\t.table-wrapper {\n\t\t-webkit-overflow-scrolling: touch;\n\t\toverflow-x: auto;\n\t}\n\n\ttable {\n\t\tmargin: 0 0 1.5rem 0;\n\t\twidth: 100%;\n\t}\n\n\t\ttable tbody tr {\n\t\t\tborder: solid 1px rgba(255, 255, 255, 0.25);\n\t\t\tborder-left: 0;\n\t\t\tborder-right: 0;\n\t\t}\n\n\t\t\ttable tbody tr:nth-child(2n + 1) {\n\t\t\t\tbackground-color: rgba(255, 255, 255, 0.075);\n\t\t\t}\n\n\t\ttable td {\n\t\t\tpadding: 0.75rem 0.75rem;\n\t\t}\n\n\t\ttable th {\n\t\t\tcolor: rgba(255, 255, 255, 0.875);\n\t\t\tfont-size: 0.9rem;\n\t\t\tfont-weight: 400;\n\t\t\tpadding: 0 0.75rem 0.75rem 0.75rem;\n\t\t\ttext-align: left;\n\t\t}\n\n\t\ttable thead {\n\t\t\tborder-bottom: solid 2px rgba(255, 255, 255, 0.25);\n\t\t}\n\n\t\ttable tfoot {\n\t\t\tborder-top: solid 2px rgba(255, 255, 255, 0.25);\n\t\t}\n\n\t\ttable.alt {\n\t\t\tborder-collapse: separate;\n\t\t}\n\n\t\t\ttable.alt tbody tr td {\n\t\t\t\tborder: solid 1px rgba(255, 255, 255, 0.25);\n\t\t\t\tborder-left-width: 0;\n\t\t\t\tborder-top-width: 0;\n\t\t\t}\n\n\t\t\t\ttable.alt tbody tr td:first-child {\n\t\t\t\t\tborder-left-width: 1px;\n\t\t\t\t}\n\n\t\t\ttable.alt tbody tr:first-child td {\n\t\t\t\tborder-top-width: 1px;\n\t\t\t}\n\n\t\t\ttable.alt thead {\n\t\t\t\tborder-bottom: 0;\n\t\t\t}\n\n\t\t\ttable.alt tfoot {\n\t\t\t\tborder-top: 0;\n\t\t\t}\n\n/* Button */\n\n\tinput[type=\"submit\"],\n\tinput[type=\"reset\"],\n\tinput[type=\"button\"],\n\tbutton,\n\t.button {\n\t\t-moz-appearance: none;\n\t\t-webkit-appearance: none;\n\t\t-ms-appearance: none;\n\t\tappearance: none;\n\t\t-moz-transition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, color 0.2s ease-in-out;\n\t\t-webkit-transition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, color 0.2s ease-in-out;\n\t\t-ms-transition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, color 0.2s ease-in-out;\n\t\ttransition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, color 0.2s ease-in-out;\n\t\tbackground-color: transparent;\n\t\tborder: 0;\n\t\tborder-radius: 0.25rem;\n\t\tbox-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.25);\n\t\tcolor: rgba(255, 255, 255, 0.875) !important;\n\t\tcursor: pointer;\n\t\tdisplay: inline-block;\n\t\tfont-family: Arial, Helvetica, sans-serif;\n\t\tfont-size: 0.6rem;\n\t\tfont-weight: 700;\n\t\theight: 2.75rem;\n\t\tletter-spacing: 0.15rem;\n\t\tline-height: 2.75rem;\n\t\tpadding: 0 1.5rem 0 1.65rem;\n\t\ttext-align: center;\n\t\ttext-decoration: none;\n\t\ttext-transform: uppercase;\n\t\twhite-space: nowrap;\n\t}\n\n\t\tinput[type=\"submit\"]:hover,\n\t\tinput[type=\"reset\"]:hover,\n\t\tinput[type=\"button\"]:hover,\n\t\tbutton:hover,\n\t\t.button:hover {\n\t\t\tbox-shadow: inset 0 0 0 2px #ffe4b4;\n\t\t\tcolor: #ffe4b4 !important;\n\t\t}\n\n\t\tinput[type=\"submit\"]:active,\n\t\tinput[type=\"reset\"]:active,\n\t\tinput[type=\"button\"]:active,\n\t\tbutton:active,\n\t\t.button:active {\n\t\t\tbackground-color: rgba(255, 228, 180, 0.125);\n\t\t}\n\n\t\tinput[type=\"submit\"].icon:before,\n\t\tinput[type=\"reset\"].icon:before,\n\t\tinput[type=\"button\"].icon:before,\n\t\tbutton.icon:before,\n\t\t.button.icon:before {\n\t\t\tdisplay: inline-block;\n\t\t\tposition: relative;\n\t\t\ttop: -0.075rem;\n\t\t\tvertical-align: middle;\n\t\t\tfont-size: 0.8rem;\n\t\t\tmargin: 0 0.375rem 0 -0.325rem;\n\t\t}\n\n\t\tinput[type=\"submit\"].icon.circle,\n\t\tinput[type=\"reset\"].icon.circle,\n\t\tinput[type=\"button\"].icon.circle,\n\t\tbutton.icon.circle,\n\t\t.button.icon.circle {\n\t\t\tposition: relative;\n\t\t\twidth: 3.125rem;\n\t\t\theight: 3.125rem;\n\t\t\tline-height: 3.125rem;\n\t\t\ttext-indent: 3.125rem;\n\t\t\tborder-radius: 100%;\n\t\t\toverflow: hidden;\n\t\t\tpadding: 0;\n\t\t\tletter-spacing: 0;\n\t\t}\n\n\t\t\tinput[type=\"submit\"].icon.circle:before,\n\t\t\tinput[type=\"reset\"].icon.circle:before,\n\t\t\tinput[type=\"button\"].icon.circle:before,\n\t\t\tbutton.icon.circle:before,\n\t\t\t.button.icon.circle:before {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: inherit;\n\t\t\t\theight: inherit;\n\t\t\t\tfont-size: 1.25rem;\n\t\t\t\tline-height: inherit;\n\t\t\t\tmargin: 0;\n\t\t\t\ttext-indent: 0;\n\t\t\t}\n\n\t\t\tinput[type=\"submit\"].icon.circle.fa-angle-left:before,\n\t\t\tinput[type=\"reset\"].icon.circle.fa-angle-left:before,\n\t\t\tinput[type=\"button\"].icon.circle.fa-angle-left:before,\n\t\t\tbutton.icon.circle.fa-angle-left:before,\n\t\t\t.button.icon.circle.fa-angle-left:before {\n\t\t\t\tposition: relative;\n\t\t\t\tleft: -0.1rem;\n\t\t\t\tfont-size: 1.75rem;\n\t\t\t}\n\n\t\t\tinput[type=\"submit\"].icon.circle.fa-angle-right:before,\n\t\t\tinput[type=\"reset\"].icon.circle.fa-angle-right:before,\n\t\t\tinput[type=\"button\"].icon.circle.fa-angle-right:before,\n\t\t\tbutton.icon.circle.fa-angle-right:before,\n\t\t\t.button.icon.circle.fa-angle-right:before {\n\t\t\t\tposition: relative;\n\t\t\t\tleft: 0.1rem;\n\t\t\t\tfont-size: 1.75rem;\n\t\t\t}\n\n\t\tinput[type=\"submit\"].fit,\n\t\tinput[type=\"reset\"].fit,\n\t\tinput[type=\"button\"].fit,\n\t\tbutton.fit,\n\t\t.button.fit {\n\t\t\tdisplay: block;\n\t\t\tmargin: 0 0 0.75rem 0;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\tinput[type=\"submit\"].small,\n\t\tinput[type=\"reset\"].small,\n\t\tinput[type=\"button\"].small,\n\t\tbutton.small,\n\t\t.button.small {\n\t\t\tfont-size: 0.4rem;\n\t\t\theight: 1.875rem;\n\t\t\tline-height: 1.875rem;\n\t\t\tpadding: 0 1.25rem 0 1.4rem;\n\t\t}\n\n\t\tinput[type=\"submit\"].large,\n\t\tinput[type=\"reset\"].large,\n\t\tinput[type=\"button\"].large,\n\t\tbutton.large,\n\t\t.button.large {\n\t\t\tfont-size: 0.8rem;\n\t\t\theight: 3.3125rem;\n\t\t\tline-height: 3.3125rem;\n\t\t\tpadding: 0 2rem 0 2.15rem;\n\t\t}\n\n\t\tinput[type=\"submit\"].special,\n\t\tinput[type=\"reset\"].special,\n\t\tinput[type=\"button\"].special,\n\t\tbutton.special,\n\t\t.button.special {\n\t\t\tbackground-color: white;\n\t\t\tbox-shadow: none;\n\t\t\tcolor: #2e2b37 !important;\n\t\t}\n\n\t\t\tinput[type=\"submit\"].special.color1,\n\t\t\tinput[type=\"reset\"].special.color1,\n\t\t\tinput[type=\"button\"].special.color1,\n\t\t\tbutton.special.color1,\n\t\t\t.button.special.color1 {\n\t\t\t\tcolor: #726193 !important;\n\t\t\t}\n\n\t\t\tinput[type=\"submit\"].special.color2,\n\t\t\tinput[type=\"reset\"].special.color2,\n\t\t\tinput[type=\"button\"].special.color2,\n\t\t\tbutton.special.color2,\n\t\t\t.button.special.color2 {\n\t\t\t\tcolor: #e37b7c !important;\n\t\t\t}\n\n\t\t\tinput[type=\"submit\"].special.color3,\n\t\t\tinput[type=\"reset\"].special.color3,\n\t\t\tinput[type=\"button\"].special.color3,\n\t\t\tbutton.special.color3,\n\t\t\t.button.special.color3 {\n\t\t\t\tcolor: #ffe4b4 !important;\n\t\t\t}\n\n\t\t\tinput[type=\"submit\"].special.color4,\n\t\t\tinput[type=\"reset\"].special.color4,\n\t\t\tinput[type=\"button\"].special.color4,\n\t\t\tbutton.special.color4,\n\t\t\t.button.special.color4 {\n\t\t\t\tcolor: #353865 !important;\n\t\t\t}\n\n\t\t\tinput[type=\"submit\"].special:hover,\n\t\t\tinput[type=\"reset\"].special:hover,\n\t\t\tinput[type=\"button\"].special:hover,\n\t\t\tbutton.special:hover,\n\t\t\t.button.special:hover {\n\t\t\t\tbackground-color: #ffe4b4;\n\t\t\t}\n\n\t\t\tinput[type=\"submit\"].special:active,\n\t\t\tinput[type=\"reset\"].special:active,\n\t\t\tinput[type=\"button\"].special:active,\n\t\t\tbutton.special:active,\n\t\t\t.button.special:active {\n\t\t\t\tbackground-color: #fdd997;\n\t\t\t}\n\n\t\tinput[type=\"submit\"].disabled, input[type=\"submit\"]:disabled,\n\t\tinput[type=\"reset\"].disabled,\n\t\tinput[type=\"reset\"]:disabled,\n\t\tinput[type=\"button\"].disabled,\n\t\tinput[type=\"button\"]:disabled,\n\t\tbutton.disabled,\n\t\tbutton:disabled,\n\t\t.button.disabled,\n\t\t.button:disabled {\n\t\t\t-moz-pointer-events: none;\n\t\t\t-webkit-pointer-events: none;\n\t\t\t-ms-pointer-events: none;\n\t\t\tpointer-events: none;\n\t\t\tcursor: default;\n\t\t\topacity: 0.5;\n\t\t}\n\n/* Gallery */\n\n\t@-moz-keyframes gallery-modal-spinner {\n\t\t0% {\n\t\t\t-moz-transform: rotate(0deg);\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t-ms-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\n\t\t100% {\n\t\t\t-moz-transform: rotate(360deg);\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\t-ms-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t@-webkit-keyframes gallery-modal-spinner {\n\t\t0% {\n\t\t\t-moz-transform: rotate(0deg);\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t-ms-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\n\t\t100% {\n\t\t\t-moz-transform: rotate(360deg);\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\t-ms-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t@-ms-keyframes gallery-modal-spinner {\n\t\t0% {\n\t\t\t-moz-transform: rotate(0deg);\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t-ms-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\n\t\t100% {\n\t\t\t-moz-transform: rotate(360deg);\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\t-ms-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t@keyframes gallery-modal-spinner {\n\t\t0% {\n\t\t\t-moz-transform: rotate(0deg);\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t-ms-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\n\t\t100% {\n\t\t\t-moz-transform: rotate(360deg);\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\t-ms-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t.gallery {\n\t\t-moz-align-items: stretch;\n\t\t-webkit-align-items: stretch;\n\t\t-ms-align-items: stretch;\n\t\talign-items: stretch;\n\t\tdisplay: -moz-flex;\n\t\tdisplay: -webkit-flex;\n\t\tdisplay: -ms-flex;\n\t\tdisplay: flex;\n\t\theight: 100%;\n\t}\n\n\t\t.gallery > * {\n\t\t\twidth: 20rem;\n\t\t\theight: 100%;\n\t\t}\n\n\t\t.gallery .image {\n\t\t\tdisplay: block;\n\t\t\tposition: relative;\n\t\t\tborder-bottom: 0;\n\t\t\toverflow: hidden;\n\t\t}\n\n\t\t\t.gallery .image img {\n\t\t\t\t-moz-transition: -moz-transform 0.2s ease-in-out;\n\t\t\t\t-webkit-transition: -webkit-transform 0.2s ease-in-out;\n\t\t\t\t-ms-transition: -ms-transform 0.2s ease-in-out;\n\t\t\t\ttransition: transform 0.2s ease-in-out;\n\t\t\t}\n\n\t\t\t.gallery .image:after {\n\t\t\t\t-moz-transition: opacity 0.2s ease-in-out;\n\t\t\t\t-webkit-transition: opacity 0.2s ease-in-out;\n\t\t\t\t-ms-transition: opacity 0.2s ease-in-out;\n\t\t\t\ttransition: opacity 0.2s ease-in-out;\n\t\t\t}\n\n\t\t\t.gallery .image:hover img {\n\t\t\t\t-moz-transform: scale(1.025);\n\t\t\t\t-webkit-transform: scale(1.025);\n\t\t\t\t-ms-transform: scale(1.025);\n\t\t\t\ttransform: scale(1.025);\n\t\t\t}\n\n\t\t\t.gallery .image:hover:after {\n\t\t\t\topacity: 0;\n\t\t\t}\n\n\t\t.gallery .group {\n\t\t\tdisplay: -moz-flex;\n\t\t\tdisplay: -webkit-flex;\n\t\t\tdisplay: -ms-flex;\n\t\t\tdisplay: flex;\n\t\t\t-moz-flex-wrap: wrap;\n\t\t\t-webkit-flex-wrap: wrap;\n\t\t\t-ms-flex-wrap: wrap;\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t\t.gallery .group > * {\n\t\t\t\theight: 50%;\n\t\t\t}\n\n\t\t.gallery .modal {\n\t\t\tdisplay: -moz-flex;\n\t\t\tdisplay: -webkit-flex;\n\t\t\tdisplay: -ms-flex;\n\t\t\tdisplay: flex;\n\t\t\t-moz-align-items: center;\n\t\t\t-webkit-align-items: center;\n\t\t\t-ms-align-items: center;\n\t\t\talign-items: center;\n\t\t\t-moz-justify-content: center;\n\t\t\t-webkit-justify-content: center;\n\t\t\t-ms-justify-content: center;\n\t\t\tjustify-content: center;\n\t\t\t-moz-pointer-events: none;\n\t\t\t-webkit-pointer-events: none;\n\t\t\t-ms-pointer-events: none;\n\t\t\tpointer-events: none;\n\t\t\t-moz-user-select: none;\n\t\t\t-webkit-user-select: none;\n\t\t\t-ms-user-select: none;\n\t\t\tuser-select: none;\n\t\t\t-moz-transition: opacity 0.5s ease, visibility 0.5s, z-index 0.5s;\n\t\t\t-webkit-transition: opacity 0.5s ease, visibility 0.5s, z-index 0.5s;\n\t\t\t-ms-transition: opacity 0.5s ease, visibility 0.5s, z-index 0.5s;\n\t\t\ttransition: opacity 0.5s ease, visibility 0.5s, z-index 0.5s;\n\t\t\t-webkit-tap-highlight-color: transparent;\n\t\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tbackground-color: rgba(46, 43, 55, 0.875);\n\t\t\topacity: 0;\n\t\t\toutline: 0;\n\t\t\tvisibility: none;\n\t\t\tz-index: 0;\n\t\t}\n\n\t\t\t.gallery .modal:before {\n\t\t\t\t-moz-animation: gallery-modal-spinner 1s infinite linear;\n\t\t\t\t-webkit-animation: gallery-modal-spinner 1s infinite linear;\n\t\t\t\t-ms-animation: gallery-modal-spinner 1s infinite linear;\n\t\t\t\tanimation: gallery-modal-spinner 1s infinite linear;\n\t\t\t\t-moz-transition: opacity 0.25s ease;\n\t\t\t\t-webkit-transition: opacity 0.25s ease;\n\t\t\t\t-ms-transition: opacity 0.25s ease;\n\t\t\t\ttransition: opacity 0.25s ease;\n\t\t\t\t-moz-transition-delay: 0.5s;\n\t\t\t\t-webkit-transition-delay: 0.5s;\n\t\t\t\t-ms-transition-delay: 0.5s;\n\t\t\t\ttransition-delay: 0.5s;\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: 50%;\n\t\t\t\twidth: 4rem;\n\t\t\t\theight: 4rem;\n\t\t\t\tmargin: -2rem 0 0 -2rem;\n\t\t\t\tbackground-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='96px' height='96px' viewBox='0 0 96 96' zoomAndPan='disable'%3E%3Cstyle%3Ecircle %7Bfill: transparent%3B stroke: rgba(255, 255, 255, 0.875)%3B stroke-width: 1.5px%3B %7D%3C/style%3E%3Cdefs%3E%3CclipPath id='corner'%3E%3Cpolygon points='0,0 48,0 48,48 96,48 96,96 0,96' /%3E%3C/clipPath%3E%3C/defs%3E%3Cg clip-path='url(%23corner)'%3E%3Ccircle cx='48' cy='48' r='32'/%3E%3C/g%3E%3C/svg%3E\");\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-size: 4rem;\n\t\t\t\topacity: 0;\n\t\t\t}\n\n\t\t\t.gallery .modal:after {\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0.5rem;\n\t\t\t\tright: 0.5rem;\n\t\t\t\twidth: 4rem;\n\t\t\t\theight: 4rem;\n\t\t\t\tbackground-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='64px' height='64px' viewBox='0 0 64 64' zoomAndPan='disable'%3E%3Cstyle%3Eline %7Bstroke: rgba(255, 255, 255, 0.875)%3Bstroke-width: 1.5px%3B%7D%3C/style%3E%3Cline x1='20' y1='20' x2='44' y2='44' /%3E%3Cline x1='20' y1='44' x2='44' y2='20' /%3E%3C/svg%3E\");\n\t\t\t\tbackground-position: center;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-size: 3rem;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\t.gallery .modal .inner {\n\t\t\t\t-moz-transform: translateY(0.75rem);\n\t\t\t\t-webkit-transform: translateY(0.75rem);\n\t\t\t\t-ms-transform: translateY(0.75rem);\n\t\t\t\ttransform: translateY(0.75rem);\n\t\t\t\t-moz-transition: opacity 0.25s ease, -moz-transform 0.25s ease;\n\t\t\t\t-webkit-transition: opacity 0.25s ease, -webkit-transform 0.25s ease;\n\t\t\t\t-ms-transition: opacity 0.25s ease, -ms-transform 0.25s ease;\n\t\t\t\ttransition: opacity 0.25s ease, transform 0.25s ease;\n\t\t\t\topacity: 0;\n\t\t\t}\n\n\t\t\t\t.gallery .modal .inner img {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\tmax-width: 90vw;\n\t\t\t\t\tmax-height: 85vh;\n\t\t\t\t\tbox-shadow: 0 1rem 3rem 0 rgba(0, 0, 0, 0.35);\n\t\t\t\t}\n\n\t\t\t.gallery .modal.visible {\n\t\t\t\t-moz-pointer-events: auto;\n\t\t\t\t-webkit-pointer-events: auto;\n\t\t\t\t-ms-pointer-events: auto;\n\t\t\t\tpointer-events: auto;\n\t\t\t\topacity: 1;\n\t\t\t\tvisibility: visible;\n\t\t\t\tz-index: 11000;\n\t\t\t}\n\n\t\t\t\t.gallery .modal.visible:before {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\n\t\t\t.gallery .modal.loaded .inner {\n\t\t\t\t-moz-transform: translateY(0);\n\t\t\t\t-webkit-transform: translateY(0);\n\t\t\t\t-ms-transform: translateY(0);\n\t\t\t\ttransform: translateY(0);\n\t\t\t\t-moz-transition: opacity 0.5s ease, -moz-transform 0.5s ease;\n\t\t\t\t-webkit-transition: opacity 0.5s ease, -webkit-transform 0.5s ease;\n\t\t\t\t-ms-transition: opacity 0.5s ease, -ms-transform 0.5s ease;\n\t\t\t\ttransition: opacity 0.5s ease, transform 0.5s ease;\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\t.gallery .modal.loaded:before {\n\t\t\t\t-moz-transition-delay: 0s;\n\t\t\t\t-webkit-transition-delay: 0s;\n\t\t\t\t-ms-transition-delay: 0s;\n\t\t\t\ttransition-delay: 0s;\n\t\t\t\topacity: 0;\n\t\t\t}\n\n\t@media screen and (max-width: 980px) {\n\n\t\t.gallery .modal .inner img {\n\t\t\tmax-width: 100vw;\n\t\t}\n\n\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\t.gallery {\n\t\t\t-moz-flex-direction: column;\n\t\t\t-webkit-flex-direction: column;\n\t\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n\t\t\theight: auto;\n\t\t}\n\n\t\t\t.gallery > * {\n\t\t\t\theight: auto;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.gallery .image {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 40rem;\n\t\t\t}\n\n\t\t\t.gallery .group .span-0-25 {\n\t\t\t\twidth: 8.33333%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-0-5 {\n\t\t\t\twidth: 16.66666%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-0-75 {\n\t\t\t\twidth: 25%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-1 {\n\t\t\t\twidth: 33.33333%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-1-25 {\n\t\t\t\twidth: 41.66666%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-1-5 {\n\t\t\t\twidth: 50%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-1-75 {\n\t\t\t\twidth: 58.33333%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-2 {\n\t\t\t\twidth: 66.66666%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-2-25 {\n\t\t\t\twidth: 74.99999%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-2-5 {\n\t\t\t\twidth: 83.33332%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-2-75 {\n\t\t\t\twidth: 91.66666%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-3 {\n\t\t\t\twidth: 99.99999%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-3-25 {\n\t\t\t\twidth: 108.33332%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-3-5 {\n\t\t\t\twidth: 116.66666%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-3-75 {\n\t\t\t\twidth: 124.99999%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-4 {\n\t\t\t\twidth: 133.33332%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-4-25 {\n\t\t\t\twidth: 141.66665%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-4-5 {\n\t\t\t\twidth: 149.99998%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-4-75 {\n\t\t\t\twidth: 158.33332%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-5 {\n\t\t\t\twidth: 166.66665%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-5-25 {\n\t\t\t\twidth: 174.99998%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-5-5 {\n\t\t\t\twidth: 183.33331%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-5-75 {\n\t\t\t\twidth: 191.66665%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-6 {\n\t\t\t\twidth: 199.99998%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-6-25 {\n\t\t\t\twidth: 208.33331%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-6-5 {\n\t\t\t\twidth: 216.66665%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-6-75 {\n\t\t\t\twidth: 224.99998%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-7 {\n\t\t\t\twidth: 233.33331%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-7-25 {\n\t\t\t\twidth: 241.66664%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-7-5 {\n\t\t\t\twidth: 249.99997%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-7-75 {\n\t\t\t\twidth: 258.33331%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-8 {\n\t\t\t\twidth: 266.66664%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-8-25 {\n\t\t\t\twidth: 274.99997%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-8-5 {\n\t\t\t\twidth: 283.33331%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-8-75 {\n\t\t\t\twidth: 291.66664%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-9 {\n\t\t\t\twidth: 299.99997%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-9-25 {\n\t\t\t\twidth: 308.3333%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-9-5 {\n\t\t\t\twidth: 316.66664%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-9-75 {\n\t\t\t\twidth: 324.99997%;\n\t\t\t}\n\n\t\t\t.gallery .group .span-10 {\n\t\t\t\twidth: 333.3333%;\n\t\t\t}\n\n\t\t\t.gallery .group .image {\n\t\t\t\theight: 20rem;\n\t\t\t}\n\n\t}\n\n\t@media screen and (max-width: 480px) {\n\n\t\t.gallery .image {\n\t\t\theight: 30rem;\n\t\t}\n\n\t\t.gallery .group .image {\n\t\t\theight: 12.5rem;\n\t\t}\n\n\t}\n\n/* Panel */\n\n\t.panel {\n\t\tdisplay: -moz-flex;\n\t\tdisplay: -webkit-flex;\n\t\tdisplay: -ms-flex;\n\t\tdisplay: flex;\n\t\t-moz-flex-grow: 0;\n\t\t-webkit-flex-grow: 0;\n\t\t-ms-flex-grow: 0;\n\t\tflex-grow: 0;\n\t\t-moz-flex-shrink: 0;\n\t\t-webkit-flex-shrink: 0;\n\t\t-ms-flex-shrink: 0;\n\t\tflex-shrink: 0;\n\t\t-moz-justify-content: center;\n\t\t-webkit-justify-content: center;\n\t\t-ms-justify-content: center;\n\t\tjustify-content: center;\n\t\t-moz-align-items: stretch;\n\t\t-webkit-align-items: stretch;\n\t\t-ms-align-items: stretch;\n\t\talign-items: stretch;\n\t\theight: 100%;\n\t\toverflow-x: hidden;\n\t\toverflow-y: auto;\n\t}\n\n\t\t.panel > * {\n\t\t\tposition: relative;\n\t\t\tmin-width: 10rem;\n\t\t}\n\n\t\t\t.panel > *.color0 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, #726193 20%, #e37b7c 60%, #ffe4b4);\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t}\n\n\t\t\t.panel > *.color1 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #726193;\n\t\t\t}\n\n\t\t\t.panel > *.color2 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #e37b7c;\n\t\t\t}\n\n\t\t\t.panel > *.color3 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #ffe4b4;\n\t\t\t}\n\n\t\t\t.panel > *.color4 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #353865;\n\t\t\t}\n\n\t\t\t.panel > *.color1-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #6c5e86;\n\t\t\t}\n\n\t\t\t.panel > *.color2-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #de7172;\n\t\t\t}\n\n\t\t\t.panel > *.color3-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #fedea6;\n\t\t\t}\n\n\t\t\t.panel > *.color4-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #323459;\n\t\t\t}\n\n\t\t.panel > .intro {\n\t\t\tpadding: 3.5rem 3.5rem 2rem 3.5rem ;\n\t\t\tdisplay: -moz-flex;\n\t\t\tdisplay: -webkit-flex;\n\t\t\tdisplay: -ms-flex;\n\t\t\tdisplay: flex;\n\t\t\t-moz-flex-grow: 0;\n\t\t\t-webkit-flex-grow: 0;\n\t\t\t-ms-flex-grow: 0;\n\t\t\tflex-grow: 0;\n\t\t\t-moz-flex-shrink: 0;\n\t\t\t-webkit-flex-shrink: 0;\n\t\t\t-ms-flex-shrink: 0;\n\t\t\tflex-shrink: 0;\n\t\t\t-moz-justify-content: center;\n\t\t\t-webkit-justify-content: center;\n\t\t\t-ms-justify-content: center;\n\t\t\tjustify-content: center;\n\t\t\t-moz-align-items: -moz-flex-start;\n\t\t\t-webkit-align-items: -webkit-flex-start;\n\t\t\t-ms-align-items: -ms-flex-start;\n\t\t\talign-items: flex-start;\n\t\t\t-moz-flex-direction: column;\n\t\t\t-webkit-flex-direction: column;\n\t\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n\t\t\twidth: 22rem;\n\t\t}\n\n\t\t\t.panel > .intro.joined {\n\t\t\t\twidth: 18.5rem;\n\t\t\t\tpadding-right: 0;\n\t\t\t}\n\n\t\t\t\t.panel > .intro.joined + .inner {\n\t\t\t\t\tpadding-left: 2.625rem;\n\t\t\t\t}\n\n\t\t.panel > .inner {\n\t\t\tpadding: 3.5rem 3.5rem 2rem 3.5rem ;\n\t\t\tdisplay: -moz-flex;\n\t\t\tdisplay: -webkit-flex;\n\t\t\tdisplay: -ms-flex;\n\t\t\tdisplay: flex;\n\t\t\t-moz-flex-grow: 1;\n\t\t\t-webkit-flex-grow: 1;\n\t\t\t-ms-flex-grow: 1;\n\t\t\tflex-grow: 1;\n\t\t\t-moz-flex-shrink: 1;\n\t\t\t-webkit-flex-shrink: 1;\n\t\t\t-ms-flex-shrink: 1;\n\t\t\tflex-shrink: 1;\n\t\t\t-moz-justify-content: center;\n\t\t\t-webkit-justify-content: center;\n\t\t\t-ms-justify-content: center;\n\t\t\tjustify-content: center;\n\t\t\t-moz-align-items: -moz-flex-start;\n\t\t\t-webkit-align-items: -webkit-flex-start;\n\t\t\t-ms-align-items: -ms-flex-start;\n\t\t\talign-items: flex-start;\n\t\t\t-moz-flex-direction: column;\n\t\t\t-webkit-flex-direction: column;\n\t\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n\t\t\tposition: relative;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t\t.panel > .inner.columns {\n\t\t\t\tdisplay: -moz-flex;\n\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\tdisplay: -ms-flex;\n\t\t\t\tdisplay: flex;\n\t\t\t\t-moz-justify-content: center;\n\t\t\t\t-webkit-justify-content: center;\n\t\t\t\t-ms-justify-content: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\t-moz-align-items: center;\n\t\t\t\t-webkit-align-items: center;\n\t\t\t\t-ms-align-items: center;\n\t\t\t\talign-items: center;\n\t\t\t\t-moz-flex-direction: row;\n\t\t\t\t-webkit-flex-direction: row;\n\t\t\t\t-ms-flex-direction: row;\n\t\t\t\tflex-direction: row;\n\t\t\t}\n\n\t\t\t\t.panel > .inner.columns > * {\n\t\t\t\t\t-moz-flex-grow: 0;\n\t\t\t\t\t-webkit-flex-grow: 0;\n\t\t\t\t\t-ms-flex-grow: 0;\n\t\t\t\t\tflex-grow: 0;\n\t\t\t\t\t-moz-flex-shrink: 0;\n\t\t\t\t\t-webkit-flex-shrink: 0;\n\t\t\t\t\t-ms-flex-shrink: 0;\n\t\t\t\t\tflex-shrink: 0;\n\t\t\t\t\tmargin-left: 3.5rem;\n\t\t\t\t}\n\n\t\t\t\t.panel > .inner.columns > :first-child {\n\t\t\t\t\tmargin-left: 0;\n\t\t\t\t}\n\n\t\t\t\t.panel > .inner.columns.divided > * {\n\t\t\t\t\tmargin-left: 7rem;\n\t\t\t\t}\n\n\t\t\t\t\t.panel > .inner.columns.divided > *:before {\n\t\t\t\t\t\tcontent: '';\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\ttop: 3.5rem;\n\t\t\t\t\t\twidth: 2px;\n\t\t\t\t\t\theight: calc(100% - 7rem);\n\t\t\t\t\t\tmargin-left: -3.5rem;\n\t\t\t\t\t\tbackground-color: rgba(255, 255, 255, 0.25);\n\t\t\t\t\t}\n\n\t\t\t\t.panel > .inner.columns.divided > :first-child {\n\t\t\t\t\tmargin-left: 0;\n\t\t\t\t}\n\n\t\t\t\t\t.panel > .inner.columns.divided > :first-child:before {\n\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t}\n\n\t\t\t\t.panel > .inner.columns.aligned {\n\t\t\t\t\t-moz-align-items: -moz-flex-start;\n\t\t\t\t\t-webkit-align-items: -webkit-flex-start;\n\t\t\t\t\t-ms-align-items: -ms-flex-start;\n\t\t\t\t\talign-items: flex-start;\n\t\t\t\t}\n\n\t\t.panel .span-0-25 {\n\t\t\twidth: 2.5rem;\n\t\t}\n\n\t\t.panel .span-0-5 {\n\t\t\twidth: 5rem;\n\t\t}\n\n\t\t.panel .span-0-75 {\n\t\t\twidth: 7.5rem;\n\t\t}\n\n\t\t.panel .span-1 {\n\t\t\twidth: 10rem;\n\t\t}\n\n\t\t.panel .span-1-25 {\n\t\t\twidth: 12.5rem;\n\t\t}\n\n\t\t.panel .span-1-5 {\n\t\t\twidth: 15rem;\n\t\t}\n\n\t\t.panel .span-1-75 {\n\t\t\twidth: 17.5rem;\n\t\t}\n\n\t\t.panel .span-2 {\n\t\t\twidth: 20rem;\n\t\t}\n\n\t\t.panel .span-2-25 {\n\t\t\twidth: 22.5rem;\n\t\t}\n\n\t\t.panel .span-2-5 {\n\t\t\twidth: 25rem;\n\t\t}\n\n\t\t.panel .span-2-75 {\n\t\t\twidth: 27.5rem;\n\t\t}\n\n\t\t.panel .span-3 {\n\t\t\twidth: 30rem;\n\t\t}\n\n\t\t.panel .span-3-25 {\n\t\t\twidth: 32.5rem;\n\t\t}\n\n\t\t.panel .span-3-5 {\n\t\t\twidth: 35rem;\n\t\t}\n\n\t\t.panel .span-3-75 {\n\t\t\twidth: 37.5rem;\n\t\t}\n\n\t\t.panel .span-4 {\n\t\t\twidth: 40rem;\n\t\t}\n\n\t\t.panel .span-4-25 {\n\t\t\twidth: 42.5rem;\n\t\t}\n\n\t\t.panel .span-4-5 {\n\t\t\twidth: 45rem;\n\t\t}\n\n\t\t.panel .span-4-75 {\n\t\t\twidth: 47.5rem;\n\t\t}\n\n\t\t.panel .span-5 {\n\t\t\twidth: 50rem;\n\t\t}\n\n\t\t.panel .span-5-25 {\n\t\t\twidth: 52.5rem;\n\t\t}\n\n\t\t.panel .span-5-5 {\n\t\t\twidth: 55rem;\n\t\t}\n\n\t\t.panel .span-5-75 {\n\t\t\twidth: 57.5rem;\n\t\t}\n\n\t\t.panel .span-6 {\n\t\t\twidth: 60rem;\n\t\t}\n\n\t\t.panel .span-6-25 {\n\t\t\twidth: 62.5rem;\n\t\t}\n\n\t\t.panel .span-6-5 {\n\t\t\twidth: 65rem;\n\t\t}\n\n\t\t.panel .span-6-75 {\n\t\t\twidth: 67.5rem;\n\t\t}\n\n\t\t.panel .span-7 {\n\t\t\twidth: 70rem;\n\t\t}\n\n\t\t.panel .span-7-25 {\n\t\t\twidth: 72.5rem;\n\t\t}\n\n\t\t.panel .span-7-5 {\n\t\t\twidth: 75rem;\n\t\t}\n\n\t\t.panel .span-7-75 {\n\t\t\twidth: 77.5rem;\n\t\t}\n\n\t\t.panel .span-8 {\n\t\t\twidth: 80rem;\n\t\t}\n\n\t\t.panel .span-8-25 {\n\t\t\twidth: 82.5rem;\n\t\t}\n\n\t\t.panel .span-8-5 {\n\t\t\twidth: 85rem;\n\t\t}\n\n\t\t.panel .span-8-75 {\n\t\t\twidth: 87.5rem;\n\t\t}\n\n\t\t.panel .span-9 {\n\t\t\twidth: 90rem;\n\t\t}\n\n\t\t.panel .span-9-25 {\n\t\t\twidth: 92.5rem;\n\t\t}\n\n\t\t.panel .span-9-5 {\n\t\t\twidth: 95rem;\n\t\t}\n\n\t\t.panel .span-9-75 {\n\t\t\twidth: 97.5rem;\n\t\t}\n\n\t\t.panel .span-10 {\n\t\t\twidth: 100rem;\n\t\t}\n\n\t\t.panel.small {\n\t\t\twidth: 35rem;\n\t\t}\n\n\t\t.panel.medium {\n\t\t\twidth: 50rem;\n\t\t}\n\n\t\t.panel.large {\n\t\t\twidth: 65rem;\n\t\t}\n\n\t\t.panel.small .span-0-25, .panel.medium .span-0-25, .panel.large .span-0-25 {\n\t\t\twidth: 2.5%;\n\t\t}\n\n\t\t.panel.small .span-0-5, .panel.medium .span-0-5, .panel.large .span-0-5 {\n\t\t\twidth: 5%;\n\t\t}\n\n\t\t.panel.small .span-0-75, .panel.medium .span-0-75, .panel.large .span-0-75 {\n\t\t\twidth: 7.5%;\n\t\t}\n\n\t\t.panel.small .span-1, .panel.medium .span-1, .panel.large .span-1 {\n\t\t\twidth: 10%;\n\t\t}\n\n\t\t.panel.small .span-1-25, .panel.medium .span-1-25, .panel.large .span-1-25 {\n\t\t\twidth: 12.5%;\n\t\t}\n\n\t\t.panel.small .span-1-5, .panel.medium .span-1-5, .panel.large .span-1-5 {\n\t\t\twidth: 15%;\n\t\t}\n\n\t\t.panel.small .span-1-75, .panel.medium .span-1-75, .panel.large .span-1-75 {\n\t\t\twidth: 17.5%;\n\t\t}\n\n\t\t.panel.small .span-2, .panel.medium .span-2, .panel.large .span-2 {\n\t\t\twidth: 20%;\n\t\t}\n\n\t\t.panel.small .span-2-25, .panel.medium .span-2-25, .panel.large .span-2-25 {\n\t\t\twidth: 22.5%;\n\t\t}\n\n\t\t.panel.small .span-2-5, .panel.medium .span-2-5, .panel.large .span-2-5 {\n\t\t\twidth: 25%;\n\t\t}\n\n\t\t.panel.small .span-2-75, .panel.medium .span-2-75, .panel.large .span-2-75 {\n\t\t\twidth: 27.5%;\n\t\t}\n\n\t\t.panel.small .span-3, .panel.medium .span-3, .panel.large .span-3 {\n\t\t\twidth: 30%;\n\t\t}\n\n\t\t.panel.small .span-3-25, .panel.medium .span-3-25, .panel.large .span-3-25 {\n\t\t\twidth: 32.5%;\n\t\t}\n\n\t\t.panel.small .span-3-5, .panel.medium .span-3-5, .panel.large .span-3-5 {\n\t\t\twidth: 35%;\n\t\t}\n\n\t\t.panel.small .span-3-75, .panel.medium .span-3-75, .panel.large .span-3-75 {\n\t\t\twidth: 37.5%;\n\t\t}\n\n\t\t.panel.small .span-4, .panel.medium .span-4, .panel.large .span-4 {\n\t\t\twidth: 40%;\n\t\t}\n\n\t\t.panel.small .span-4-25, .panel.medium .span-4-25, .panel.large .span-4-25 {\n\t\t\twidth: 42.5%;\n\t\t}\n\n\t\t.panel.small .span-4-5, .panel.medium .span-4-5, .panel.large .span-4-5 {\n\t\t\twidth: 45%;\n\t\t}\n\n\t\t.panel.small .span-4-75, .panel.medium .span-4-75, .panel.large .span-4-75 {\n\t\t\twidth: 47.5%;\n\t\t}\n\n\t\t.panel.small .span-5, .panel.medium .span-5, .panel.large .span-5 {\n\t\t\twidth: 50%;\n\t\t}\n\n\t\t.panel.small .span-5-25, .panel.medium .span-5-25, .panel.large .span-5-25 {\n\t\t\twidth: 52.5%;\n\t\t}\n\n\t\t.panel.small .span-5-5, .panel.medium .span-5-5, .panel.large .span-5-5 {\n\t\t\twidth: 55%;\n\t\t}\n\n\t\t.panel.small .span-5-75, .panel.medium .span-5-75, .panel.large .span-5-75 {\n\t\t\twidth: 57.5%;\n\t\t}\n\n\t\t.panel.small .span-6, .panel.medium .span-6, .panel.large .span-6 {\n\t\t\twidth: 60%;\n\t\t}\n\n\t\t.panel.small .span-6-25, .panel.medium .span-6-25, .panel.large .span-6-25 {\n\t\t\twidth: 62.5%;\n\t\t}\n\n\t\t.panel.small .span-6-5, .panel.medium .span-6-5, .panel.large .span-6-5 {\n\t\t\twidth: 65%;\n\t\t}\n\n\t\t.panel.small .span-6-75, .panel.medium .span-6-75, .panel.large .span-6-75 {\n\t\t\twidth: 67.5%;\n\t\t}\n\n\t\t.panel.small .span-7, .panel.medium .span-7, .panel.large .span-7 {\n\t\t\twidth: 70%;\n\t\t}\n\n\t\t.panel.small .span-7-25, .panel.medium .span-7-25, .panel.large .span-7-25 {\n\t\t\twidth: 72.5%;\n\t\t}\n\n\t\t.panel.small .span-7-5, .panel.medium .span-7-5, .panel.large .span-7-5 {\n\t\t\twidth: 75%;\n\t\t}\n\n\t\t.panel.small .span-7-75, .panel.medium .span-7-75, .panel.large .span-7-75 {\n\t\t\twidth: 77.5%;\n\t\t}\n\n\t\t.panel.small .span-8, .panel.medium .span-8, .panel.large .span-8 {\n\t\t\twidth: 80%;\n\t\t}\n\n\t\t.panel.small .span-8-25, .panel.medium .span-8-25, .panel.large .span-8-25 {\n\t\t\twidth: 82.5%;\n\t\t}\n\n\t\t.panel.small .span-8-5, .panel.medium .span-8-5, .panel.large .span-8-5 {\n\t\t\twidth: 85%;\n\t\t}\n\n\t\t.panel.small .span-8-75, .panel.medium .span-8-75, .panel.large .span-8-75 {\n\t\t\twidth: 87.5%;\n\t\t}\n\n\t\t.panel.small .span-9, .panel.medium .span-9, .panel.large .span-9 {\n\t\t\twidth: 90%;\n\t\t}\n\n\t\t.panel.small .span-9-25, .panel.medium .span-9-25, .panel.large .span-9-25 {\n\t\t\twidth: 92.5%;\n\t\t}\n\n\t\t.panel.small .span-9-5, .panel.medium .span-9-5, .panel.large .span-9-5 {\n\t\t\twidth: 95%;\n\t\t}\n\n\t\t.panel.small .span-9-75, .panel.medium .span-9-75, .panel.large .span-9-75 {\n\t\t\twidth: 97.5%;\n\t\t}\n\n\t\t.panel.small .span-10, .panel.medium .span-10, .panel.large .span-10 {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t.panel.color0 {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, #726193 20%, #e37b7c 60%, #ffe4b4);\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t}\n\n\t\t.panel.color1 {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\tbackground-color: #726193;\n\t\t}\n\n\t\t.panel.color2 {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\tbackground-color: #e37b7c;\n\t\t}\n\n\t\t.panel.color3 {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\tbackground-color: #ffe4b4;\n\t\t}\n\n\t\t.panel.color4 {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\tbackground-color: #353865;\n\t\t}\n\n\t\t.panel.color1-alt {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\tbackground-color: #6c5e86;\n\t\t}\n\n\t\t.panel.color2-alt {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\tbackground-color: #de7172;\n\t\t}\n\n\t\t.panel.color3-alt {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\tbackground-color: #fedea6;\n\t\t}\n\n\t\t.panel.color4-alt {\n\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(45deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\tbackground-size: 128px 128px, auto;\n\t\t\tbackground-color: #323459;\n\t\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\t.panel {\n\t\t\t-moz-flex-direction: column;\n\t\t\t-webkit-flex-direction: column;\n\t\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n\t\t\theight: auto;\n\t\t}\n\n\t\t\t.panel > *.color1 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #726193;\n\t\t\t}\n\n\t\t\t.panel > *.color2 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #e37b7c;\n\t\t\t}\n\n\t\t\t.panel > *.color3 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #ffe4b4;\n\t\t\t}\n\n\t\t\t.panel > *.color4 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #353865;\n\t\t\t}\n\n\t\t\t.panel > *.color1-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #6c5e86;\n\t\t\t}\n\n\t\t\t.panel > *.color2-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #de7172;\n\t\t\t}\n\n\t\t\t.panel > *.color3-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #fedea6;\n\t\t\t}\n\n\t\t\t.panel > *.color4-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #323459;\n\t\t\t}\n\n\t\t\t.panel > .intro {\n\t\t\t\tpadding: 2.8875rem 1.75rem 1.3875rem 1.75rem ;\n\t\t\t\twidth: 100% !important;\n\t\t\t}\n\n\t\t\t\t.panel > .intro.joined {\n\t\t\t\t\tpadding-bottom: 0;\n\t\t\t\t\tpadding-right: 1.75rem;\n\t\t\t\t}\n\n\t\t\t\t\t.panel > .intro.joined + .inner {\n\t\t\t\t\t\tpadding-top: 0;\n\t\t\t\t\t\tpadding-left: 1.75rem;\n\t\t\t\t\t}\n\n\t\t\t.panel > .inner {\n\t\t\t\tpadding: 2.8875rem 1.75rem 1.3875rem 1.75rem ;\n\t\t\t}\n\n\t\t\t\t.panel > .inner.columns {\n\t\t\t\t\t-moz-flex-direction: column;\n\t\t\t\t\t-webkit-flex-direction: column;\n\t\t\t\t\t-ms-flex-direction: column;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t}\n\n\t\t\t\t\t.panel > .inner.columns > * {\n\t\t\t\t\t\tmargin-left: 0;\n\t\t\t\t\t\tmargin-top: 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t.panel > .inner.columns > :first-child {\n\t\t\t\t\t\tmargin-top: 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t.panel > .inner.columns.divided > * {\n\t\t\t\t\t\tmargin-left: 0;\n\t\t\t\t\t\tmargin-top: 3.5rem;\n\t\t\t\t\t}\n\n\t\t\t\t\t\t.panel > .inner.columns.divided > *:before {\n\t\t\t\t\t\t\tcontent: '';\n\t\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\t\ttop: auto;\n\t\t\t\t\t\t\tleft: 1.75rem;\n\t\t\t\t\t\t\twidth: calc(100% - 3.5rem);\n\t\t\t\t\t\t\theight: 2px;\n\t\t\t\t\t\t\tmargin-left: 0;\n\t\t\t\t\t\t\tmargin-top: -1.75rem;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t.panel > .inner.columns.divided > :first-child {\n\t\t\t\t\t\tmargin-top: 0;\n\t\t\t\t\t}\n\n\t\t\t.panel .span-0-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-0-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-0-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-1 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-1-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-1-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-1-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-2 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-2-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-2-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-2-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-3 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-3-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-3-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-3-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-4 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-4-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-4-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-4-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-5-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-5-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-5-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-6 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-6-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-6-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-6-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-7 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-7-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-7-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-7-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-8 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-8-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-8-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-8-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-9 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-9-25 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-9-5 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-9-75 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel .span-10 {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.panel.small, .panel.medium, .panel.large {\n\t\t\t\twidth: 100% !important;\n\t\t\t}\n\n\t\t\t\t.panel.small .span-0-25, .panel.medium .span-0-25, .panel.large .span-0-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-0-5, .panel.medium .span-0-5, .panel.large .span-0-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-0-75, .panel.medium .span-0-75, .panel.large .span-0-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-1, .panel.medium .span-1, .panel.large .span-1 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-1-25, .panel.medium .span-1-25, .panel.large .span-1-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-1-5, .panel.medium .span-1-5, .panel.large .span-1-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-1-75, .panel.medium .span-1-75, .panel.large .span-1-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-2, .panel.medium .span-2, .panel.large .span-2 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-2-25, .panel.medium .span-2-25, .panel.large .span-2-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-2-5, .panel.medium .span-2-5, .panel.large .span-2-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-2-75, .panel.medium .span-2-75, .panel.large .span-2-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-3, .panel.medium .span-3, .panel.large .span-3 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-3-25, .panel.medium .span-3-25, .panel.large .span-3-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-3-5, .panel.medium .span-3-5, .panel.large .span-3-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-3-75, .panel.medium .span-3-75, .panel.large .span-3-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-4, .panel.medium .span-4, .panel.large .span-4 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-4-25, .panel.medium .span-4-25, .panel.large .span-4-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-4-5, .panel.medium .span-4-5, .panel.large .span-4-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-4-75, .panel.medium .span-4-75, .panel.large .span-4-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-5, .panel.medium .span-5, .panel.large .span-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-5-25, .panel.medium .span-5-25, .panel.large .span-5-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-5-5, .panel.medium .span-5-5, .panel.large .span-5-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-5-75, .panel.medium .span-5-75, .panel.large .span-5-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-6, .panel.medium .span-6, .panel.large .span-6 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-6-25, .panel.medium .span-6-25, .panel.large .span-6-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-6-5, .panel.medium .span-6-5, .panel.large .span-6-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-6-75, .panel.medium .span-6-75, .panel.large .span-6-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-7, .panel.medium .span-7, .panel.large .span-7 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-7-25, .panel.medium .span-7-25, .panel.large .span-7-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-7-5, .panel.medium .span-7-5, .panel.large .span-7-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-7-75, .panel.medium .span-7-75, .panel.large .span-7-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-8, .panel.medium .span-8, .panel.large .span-8 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-8-25, .panel.medium .span-8-25, .panel.large .span-8-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-8-5, .panel.medium .span-8-5, .panel.large .span-8-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-8-75, .panel.medium .span-8-75, .panel.large .span-8-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-9, .panel.medium .span-9, .panel.large .span-9 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-9-25, .panel.medium .span-9-25, .panel.large .span-9-25 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-9-5, .panel.medium .span-9-5, .panel.large .span-9-5 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-9-75, .panel.medium .span-9-75, .panel.large .span-9-75 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.panel.small .span-10, .panel.medium .span-10, .panel.large .span-10 {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t.panel.color1 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #726193;\n\t\t\t}\n\n\t\t\t.panel.color2 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #e37b7c;\n\t\t\t}\n\n\t\t\t.panel.color3 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #ffe4b4;\n\t\t\t}\n\n\t\t\t.panel.color4 {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.25) 25%, rgba(227, 123, 124, 0.25) 50%, rgba(255, 228, 180, 0.25));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #353865;\n\t\t\t}\n\n\t\t\t.panel.color1-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #6c5e86;\n\t\t\t}\n\n\t\t\t.panel.color2-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #de7172;\n\t\t\t}\n\n\t\t\t.panel.color3-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #fedea6;\n\t\t\t}\n\n\t\t\t.panel.color4-alt {\n\t\t\t\tbackground-image: url(\"../../images/overlay.png\"), linear-gradient(135deg, rgba(114, 97, 147, 0.175) 25%, rgba(227, 123, 124, 0.175) 50%, rgba(255, 228, 180, 0.175));\n\t\t\t\tbackground-size: 128px 128px, auto;\n\t\t\t\tbackground-color: #323459;\n\t\t\t}\n\n\t}\n\n/* Panel (Banner) */\n\n\t.panel.banner {\n\t\t-moz-align-items: stretch;\n\t\t-webkit-align-items: stretch;\n\t\t-ms-align-items: stretch;\n\t\talign-items: stretch;\n\t}\n\n\t\t.panel.banner .content {\n\t\t\tpadding: 3.5rem 3.5rem 2rem 3.5rem ;\n\t\t\tdisplay: -moz-flex;\n\t\t\tdisplay: -webkit-flex;\n\t\t\tdisplay: -ms-flex;\n\t\t\tdisplay: flex;\n\t\t\t-moz-flex-direction: column;\n\t\t\t-webkit-flex-direction: column;\n\t\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n\t\t\t-moz-justify-content: center;\n\t\t\t-webkit-justify-content: center;\n\t\t\t-ms-justify-content: center;\n\t\t\tjustify-content: center;\n\t\t\t-moz-flex-grow: 0;\n\t\t\t-webkit-flex-grow: 0;\n\t\t\t-ms-flex-grow: 0;\n\t\t\tflex-grow: 0;\n\t\t\t-moz-flex-shrink: 0;\n\t\t\t-webkit-flex-shrink: 0;\n\t\t\t-ms-flex-shrink: 0;\n\t\t\tflex-shrink: 0;\n\t\t}\n\n\t\t\t.panel.banner .content > .actions:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t.panel.banner .image {\n\t\t\t-moz-flex-grow: 0;\n\t\t\t-webkit-flex-grow: 0;\n\t\t\t-ms-flex-grow: 0;\n\t\t\tflex-grow: 0;\n\t\t\t-moz-flex-shrink: 0;\n\t\t\t-webkit-flex-shrink: 0;\n\t\t\t-ms-flex-shrink: 0;\n\t\t\tflex-shrink: 0;\n\t\t\tposition: relative;\n\t\t}\n\n\t\t\t.panel.banner .image img {\n\t\t\t\t-moz-object-fit: cover;\n\t\t\t\t-webkit-object-fit: cover;\n\t\t\t\t-ms-object-fit: cover;\n\t\t\t\tobject-fit: cover;\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\n\t\t.panel.banner.left {\n\t\t\t-moz-flex-direction: row;\n\t\t\t-webkit-flex-direction: row;\n\t\t\t-ms-flex-direction: row;\n\t\t\tflex-direction: row;\n\t\t}\n\n\t\t.panel.banner.right {\n\t\t\t-moz-flex-direction: row-reverse;\n\t\t\t-webkit-flex-direction: row-reverse;\n\t\t\t-ms-flex-direction: row-reverse;\n\t\t\tflex-direction: row-reverse;\n\t\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\t.panel.banner .content {\n\t\t\tpadding: 2.8875rem 1.75rem 1.3875rem 1.75rem ;\n\t\t\t-moz-flex-basis: 60%;\n\t\t\t-webkit-flex-basis: 60%;\n\t\t\t-ms-flex-basis: 60%;\n\t\t\tflex-basis: 60%;\n\t\t}\n\n\t\t\t.panel.banner .content > .actions:last-child {\n\t\t\t\tmargin-bottom: 1.5rem;\n\t\t\t}\n\n\t\t.panel.banner .image {\n\t\t\t-moz-flex-basis: 40%;\n\t\t\t-webkit-flex-basis: 40%;\n\t\t\t-ms-flex-basis: 40%;\n\t\t\tflex-basis: 40%;\n\t\t}\n\n\t}\n\n\t@media screen and (max-width: 736px) and (orientation: portrait) {\n\n\t\t.panel.banner .content {\n\t\t\t-moz-flex-basis: auto;\n\t\t\t-webkit-flex-basis: auto;\n\t\t\t-ms-flex-basis: auto;\n\t\t\tflex-basis: auto;\n\t\t}\n\n\t\t.panel.banner .image {\n\t\t\t-moz-flex-basis: auto;\n\t\t\t-webkit-flex-basis: auto;\n\t\t\t-ms-flex-basis: auto;\n\t\t\tflex-basis: auto;\n\t\t\theight: 18rem;\n\t\t}\n\n\t\t.panel.banner.left {\n\t\t\t-moz-flex-direction: column;\n\t\t\t-webkit-flex-direction: column;\n\t\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n\t\t}\n\n\t\t.panel.banner.right {\n\t\t\t-moz-flex-direction: column-reverse;\n\t\t\t-webkit-flex-direction: column-reverse;\n\t\t\t-ms-flex-direction: column-reverse;\n\t\t\tflex-direction: column-reverse;\n\t\t}\n\n\t}\n\n/* Panel (Spotlight) */\n\n\t.panel.spotlight {\n\t\t-moz-align-items: stretch;\n\t\t-webkit-align-items: stretch;\n\t\t-ms-align-items: stretch;\n\t\talign-items: stretch;\n\t\tposition: relative;\n\t}\n\n\t\t.panel.spotlight > * {\n\t\t\tz-index: 1;\n\t\t}\n\n\t\t.panel.spotlight .content {\n\t\t\tdisplay: -moz-flex;\n\t\t\tdisplay: -webkit-flex;\n\t\t\tdisplay: -ms-flex;\n\t\t\tdisplay: flex;\n\t\t\t-moz-flex-direction: column;\n\t\t\t-webkit-flex-direction: column;\n\t\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n\t\t\t-moz-justify-content: center;\n\t\t\t-webkit-justify-content: center;\n\t\t\t-ms-justify-content: center;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 3.5rem 3.5rem 2rem 3.5rem ;\n\t\t}\n\n\t\t.panel.spotlight .image {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tz-index: 0;\n\t\t}\n\n\t\t\t.panel.spotlight .image img {\n\t\t\t\t-moz-object-fit: cover;\n\t\t\t\t-webkit-object-fit: cover;\n\t\t\t\t-ms-object-fit: cover;\n\t\t\t\tobject-fit: cover;\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\n\t\t.panel.spotlight.left {\n\t\t\t-moz-justify-content: -moz-flex-start;\n\t\t\t-webkit-justify-content: -webkit-flex-start;\n\t\t\t-ms-justify-content: -ms-flex-start;\n\t\t\tjustify-content: flex-start;\n\t\t}\n\n\t\t\t.panel.spotlight.left .content {\n\t\t\t\tbackground-image: linear-gradient(-90deg, transparent 0%, rgba(0, 0, 0, 0.125) 30%, rgba(0, 0, 0, 0.175) 50%);\n\t\t\t}\n\n\t\t.panel.spotlight.right {\n\t\t\t-moz-justify-content: -moz-flex-end;\n\t\t\t-webkit-justify-content: -webkit-flex-end;\n\t\t\t-ms-justify-content: -ms-flex-end;\n\t\t\tjustify-content: flex-end;\n\t\t}\n\n\t\t\t.panel.spotlight.right .content {\n\t\t\t\tbackground-image: linear-gradient(90deg, transparent 0%, rgba(0, 0, 0, 0.125) 30%, rgba(0, 0, 0, 0.175) 50%);\n\t\t\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\t.panel.spotlight .content {\n\t\t\tpadding: 2.8875rem 1.75rem 1.3875rem 1.75rem ;\n\t\t\t-moz-flex-direction: column !important;\n\t\t\t-webkit-flex-direction: column !important;\n\t\t\t-ms-flex-direction: column !important;\n\t\t\tflex-direction: column !important;\n\t\t\tbackground-image: linear-gradient(0deg, rgba(0, 0, 0, 0.25) 70%, rgba(0, 0, 0, 0.175)) !important;\n\t\t\tmin-height: 25rem;\n\t\t}\n\n\t}\n\n\t@media screen and (max-width: 480px) {\n\n\t\t.panel.spotlight .content {\n\t\t\tmin-height: 30rem;\n\t\t}\n\n\t}\n\n/* Page Wrapper */\n\n\t.page-wrapper {\n\t\tdisplay: -moz-flex;\n\t\tdisplay: -webkit-flex;\n\t\tdisplay: -ms-flex;\n\t\tdisplay: flex;\n\t\t-moz-align-items: center;\n\t\t-webkit-align-items: center;\n\t\t-ms-align-items: center;\n\t\talign-items: center;\n\t\t-moz-justify-content: -moz-flex-start;\n\t\t-webkit-justify-content: -webkit-flex-start;\n\t\t-ms-justify-content: -ms-flex-start;\n\t\tjustify-content: flex-start;\n\t\t-moz-flex-grow: 1;\n\t\t-webkit-flex-grow: 1;\n\t\t-ms-flex-grow: 1;\n\t\tflex-grow: 1;\n\t\t-moz-flex-shrink: 1;\n\t\t-webkit-flex-shrink: 1;\n\t\t-ms-flex-shrink: 1;\n\t\tflex-shrink: 1;\n\t\theight: 100%;\n\t\tpadding: 5rem;\n\t}\n\n\t\t@media screen and (orientation: portrait) {\n\n\t\t\t.page-wrapper {\n\t\t\t\tpadding-left: 2rem;\n\t\t\t\tpadding-right: 2rem;\n\t\t\t}\n\n\t\t}\n\n\t\t@media screen and (min-aspect-ratio: 16 / 7) {\n\n\t\t\t.page-wrapper {\n\t\t\t\tpadding: 6vh;\n\t\t\t}\n\n\t\t}\n\n\t\t@media screen and (min-aspect-ratio: 16 / 6) {\n\n\t\t\t.page-wrapper {\n\t\t\t\tpadding: 0;\n\t\t\t}\n\n\t\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\t.page-wrapper {\n\t\t\theight: auto;\n\t\t\tpadding: 1rem;\n\t\t}\n\n\t}\n\n\t@media screen and (max-width: 480px) {\n\n\t\t.page-wrapper {\n\t\t\tpadding: 0;\n\t\t}\n\n\t}\n\n/* Wrapper */\n\n\t.wrapper {\n\t\tdisplay: -moz-flex;\n\t\tdisplay: -webkit-flex;\n\t\tdisplay: -ms-flex;\n\t\tdisplay: flex;\n\t\t-moz-flex-direction: row;\n\t\t-webkit-flex-direction: row;\n\t\t-ms-flex-direction: row;\n\t\tflex-direction: row;\n\t\t-moz-transition: opacity 1s ease-out, -moz-transform 0.75s ease-out;\n\t\t-webkit-transition: opacity 1s ease-out, -webkit-transform 0.75s ease-out;\n\t\t-ms-transition: opacity 1s ease-out, -ms-transform 0.75s ease-out;\n\t\ttransition: opacity 1s ease-out, transform 0.75s ease-out;\n\t\t-moz-transition-delay: 0.25s;\n\t\t-webkit-transition-delay: 0.25s;\n\t\t-ms-transition-delay: 0.25s;\n\t\ttransition-delay: 0.25s;\n\t\tcursor: default;\n\t\tposition: relative;\n\t\theight: 32rem;\n\t\tbox-shadow: 0 2rem 4rem 0.25rem rgba(46, 43, 55, 0.575);\n\t}\n\n\t\t.wrapper > .scrollZone {\n\t\t\tposition: fixed;\n\t\t\twidth: 6rem;\n\t\t\theight: inherit;\n\t\t\tcursor: -moz-grab;\n\t\t\tcursor: -webkit-grab;\n\t\t\tcursor: -ms-grab;\n\t\t\tcursor: grab;\n\t\t\tz-index: 10100;\n\t\t}\n\n\t\t\t.wrapper > .scrollZone.left {\n\t\t\t\tleft: 0;\n\t\t\t}\n\n\t\t\t.wrapper > .scrollZone.right {\n\t\t\t\tright: 0;\n\t\t\t}\n\n\t\t.wrapper > .copyright {\n\t\t\tposition: absolute;\n\t\t    bottom: -3rem;\n\t\t\tright: 31%;\n\t\t    font-size: 0.8rem;\n\t\t    color: rgba(0, 0, 0, 0.93);\n\t\t    margin-bottom: 0;\n\t\t}\n\n\t\t\t.wrapper > .copyright a:hover {\n\t\t\t\tcolor: inherit;\n\t\t\t}\n\n\t\t.wrapper.is-dragging {\n\t\t\t-moz-user-select: none;\n\t\t\t-webkit-user-select: none;\n\t\t\t-ms-user-select: none;\n\t\t\tuser-select: none;\n\t\t\tcursor: -moz-grab;\n\t\t\tcursor: -webkit-grab;\n\t\t\tcursor: -ms-grab;\n\t\t\tcursor: grab;\n\t\t}\n\n\t\t\t.wrapper.is-dragging * {\n\t\t\t\t-moz-user-select: none;\n\t\t\t\t-webkit-user-select: none;\n\t\t\t\t-ms-user-select: none;\n\t\t\t\tuser-select: none;\n\t\t\t}\n\n\t\t\t.wrapper.is-dragging *:not(a, .image) {\n\t\t\t\tcursor: -moz-grab;\n\t\t\t\tcursor: -webkit-grab;\n\t\t\t\tcursor: -ms-grab;\n\t\t\t\tcursor: grab;\n\t\t\t}\n\n\t\t.wrapper.is-dragged * {\n\t\t\t-moz-pointer-events: none;\n\t\t\t-webkit-pointer-events: none;\n\t\t\t-ms-pointer-events: none;\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\tbody.is-loading .wrapper {\n\t\t\t-moz-transform: translateX(2rem);\n\t\t\t-webkit-transform: translateX(2rem);\n\t\t\t-ms-transform: translateX(2rem);\n\t\t\ttransform: translateX(2rem);\n\t\t\topacity: 0;\n\t\t}\n\n\t@media screen and (max-width: 736px) {\n\n\t\t.wrapper {\n\t\t\t-moz-flex-direction: column;\n\t\t\t-webkit-flex-direction: column;\n\t\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n\t\t\theight: auto;\n\t\t\tmargin: 0 0 5rem 0;\n\t\t\tbox-shadow: 0 0.25rem 1.5rem 0.25rem rgba(46, 43, 55, 0.5);\n\t\t}\n\n\t\t\t.wrapper > .scrollZone {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t.wrapper > .copyright {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\t\t\tbody.is-loading .wrapper {\n\t\t\t\t-moz-transform: translateY(1rem);\n\t\t\t\t-webkit-transform: translateY(1rem);\n\t\t\t\t-ms-transform: translateY(1rem);\n\t\t\t\ttransform: translateY(1rem);\n\t\t\t}\n\n\t}\n\n\t@media screen and (max-width: 480px) {\n\n\t\t.wrapper {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t\tbody.is-loading .wrapper {\n\t\t\t\t-moz-transform: none;\n\t\t\t\t-webkit-transform: none;\n\t\t\t\t-ms-transform: none;\n\t\t\t\ttransform: none;\n\t\t\t}\n\n\t}"
  },
  {
    "path": "template/installation/assets/src/css/noscript.css",
    "content": "/*\n\tEthereal by HTML5 UP\n\thtml5up.net | @ajlkn\n\tFree for personal and commercial use under the CCA 3.0 license (html5up.net/license)\n*/\n\n/* Page */\n\n\tbody {\n\t\toverflow-x: scroll;\n\t}"
  },
  {
    "path": "template/installation/assets/src/js/main.js",
    "content": "/*\n\tEthereal by HTML5 UP\n\thtml5up.net | @ajlkn\n\tFree for personal and commercial use under the CCA 3.0 license (html5up.net/license)\n*/\n\n(function($) {\n\n\t// Settings.\n\t\tvar settings = {\n\n\t\t\t// Keyboard shortcuts.\n\t\t\t\tkeyboardShortcuts: {\n\n\t\t\t\t\t// If true, enables scrolling via keyboard shortcuts.\n\t\t\t\t\t\tenabled: true,\n\n\t\t\t\t\t// Sets the distance to scroll when using the left/right arrow keys.\n\t\t\t\t\t\tdistance: 50\n\n\t\t\t\t},\n\n\t\t\t// Scroll wheel.\n\t\t\t\tscrollWheel: {\n\n\t\t\t\t\t// If true, enables scrolling via the scroll wheel.\n\t\t\t\t\t\tenabled: true,\n\n\t\t\t\t\t// Sets the scroll wheel factor. (Ideally) a value between 0 and 1 (lower = slower scroll, higher = faster scroll).\n\t\t\t\t\t\tfactor: 1\n\n\t\t\t\t},\n\n\t\t\t// Scroll zones.\n\t\t\t\tscrollZones: {\n\n\t\t\t\t\t// If true, enables scrolling via scroll zones on the left/right edges of the scren.\n\t\t\t\t\t\tenabled: true,\n\n\t\t\t\t\t// Sets the speed at which the page scrolls when a scroll zone is active (higher = faster scroll, lower = slower scroll).\n\t\t\t\t\t\tspeed: 15\n\n\t\t\t\t},\n\n\t\t\t// Dragging.\n\t\t\t\tdragging: {\n\n\t\t\t\t\t// If true, enables scrolling by dragging the main wrapper with the mouse.\n\t\t\t\t\t\tenabled: true,\n\n\t\t\t\t\t// Sets the momentum factor. Must be a value between 0 and 1 (lower = less momentum, higher = more momentum, 0 = disable momentum scrolling).\n\t\t\t\t\t\tmomentum: 0.875,\n\n\t\t\t\t\t// Sets the drag threshold (in pixels).\n\t\t\t\t\t\tthreshold: 10\n\n\t\t\t\t},\n\n\t\t\t// If set to a valid selector , prevents key/mouse events from bubbling from these elements.\n\t\t\t\texcludeSelector: 'input:focus, select:focus, textarea:focus, audio, video, iframe',\n\n\t\t\t// Link scroll speed.\n\t\t\t\tlinkScrollSpeed: 1000\n\n\t\t};\n\n\t// Skel.\n\t\tskel.breakpoints({\n\t\t\txlarge: '(max-width: 1680px)',\n\t\t\tlarge: '(max-width: 1280px)',\n\t\t\tmedium: '(max-width: 980px)',\n\t\t\tsmall: '(max-width: 736px)',\n\t\t\txsmall: '(max-width: 480px)',\n\t\t\txxsmall: '(max-width: 360px)',\n\t\t\tshort: '(min-aspect-ratio: 16/7)',\n\t\t\txshort: '(min-aspect-ratio: 16/6)'\n\t\t});\n\n\t// Ready event.\n\t\t$(function() {\n\n\t\t\t// Vars.\n\t\t\t\tvar\t$window = $(window),\n\t\t\t\t\t$document = $(document),\n\t\t\t\t\t$body = $('body'),\n\t\t\t\t\t$html = $('html'),\n\t\t\t\t\t$bodyHtml = $('body,html'),\n\t\t\t\t\t$wrapper = $('#wrapper');\n\n\t\t\t// Disable animations/transitions until the page has loaded.\n\t\t\t\t$body.addClass('is-loading');\n\n\t\t\t\t$window.on('load', function() {\n\t\t\t\t\twindow.setTimeout(function() {\n\t\t\t\t\t\t$body.removeClass('is-loading');\n\t\t\t\t\t}, 100);\n\t\t\t\t});\n\n\t\t\t// Tweaks/fixes.\n\n\t\t\t\t// Mobile: Revert to native scrolling.\n\t\t\t\t\tif (skel.vars.mobile) {\n\n\t\t\t\t\t\t// Disable all scroll-assist features.\n\t\t\t\t\t\t\tsettings.keyboardShortcuts.enabled = false;\n\t\t\t\t\t\t\tsettings.scrollWheel.enabled = false;\n\t\t\t\t\t\t\tsettings.scrollZones.enabled = false;\n\t\t\t\t\t\t\tsettings.dragging.enabled = false;\n\n\t\t\t\t\t\t// Re-enable overflow on body.\n\t\t\t\t\t\t\t$body.css('overflow-x', 'auto');\n\n\t\t\t\t\t}\n\n\t\t\t\t// IE: Various fixes.\n\t\t\t\t\tif (skel.vars.browser == 'ie') {\n\n\t\t\t\t\t\t// Enable IE mode.\n\t\t\t\t\t\t\t$body.addClass('is-ie');\n\n\t\t\t\t\t\t// Page widths.\n\t\t\t\t\t\t\t$window\n\t\t\t\t\t\t\t\t.on('load resize', function() {\n\n\t\t\t\t\t\t\t\t\t// Calculate wrapper width.\n\t\t\t\t\t\t\t\t\t\tvar w = 0;\n\n\t\t\t\t\t\t\t\t\t\t$wrapper.children().each(function() {\n\t\t\t\t\t\t\t\t\t\t\tw += $(this).width();\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t// Apply to page.\n\t\t\t\t\t\t\t\t\t\t$html.css('width', w + 'px');\n\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t}\n\n\t\t\t\t// Polyfill: Object fit.\n\t\t\t\t\tif (!skel.canUse('object-fit')) {\n\n\t\t\t\t\t\t$('.image[data-position]').each(function() {\n\n\t\t\t\t\t\t\tvar $this = $(this),\n\t\t\t\t\t\t\t\t$img = $this.children('img');\n\n\t\t\t\t\t\t\t// Apply img as background.\n\t\t\t\t\t\t\t\t$this\n\t\t\t\t\t\t\t\t\t.css('background-image', 'url(\"' + $img.attr('src') + '\")')\n\t\t\t\t\t\t\t\t\t.css('background-position', $this.data('position'))\n\t\t\t\t\t\t\t\t\t.css('background-size', 'cover')\n\t\t\t\t\t\t\t\t\t.css('background-repeat', 'no-repeat');\n\n\t\t\t\t\t\t\t// Hide img.\n\t\t\t\t\t\t\t\t$img\n\t\t\t\t\t\t\t\t\t.css('opacity', '0');\n\n\t\t\t\t\t\t});\n\n\t\t\t\t\t}\n\n\t\t\t// Keyboard shortcuts.\n\t\t\t\tif (settings.keyboardShortcuts.enabled)\n\t\t\t\t\t(function() {\n\n\t\t\t\t\t\t$wrapper\n\n\t\t\t\t\t\t\t// Prevent keystrokes inside excluded elements from bubbling.\n\t\t\t\t\t\t\t\t.on('keypress keyup keydown', settings.excludeSelector, function(event) {\n\n\t\t\t\t\t\t\t\t\t// Stop propagation.\n\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t$window\n\n\t\t\t\t\t\t\t// Keypress event.\n\t\t\t\t\t\t\t\t.on('keydown', function(event) {\n\n\t\t\t\t\t\t\t\t\tvar scrolled = false;\n\n\t\t\t\t\t\t\t\t\tswitch (event.keyCode) {\n\n\t\t\t\t\t\t\t\t\t\t// Left arrow.\n\t\t\t\t\t\t\t\t\t\t\tcase 37:\n\t\t\t\t\t\t\t\t\t\t\t\t$document.scrollLeft($document.scrollLeft() - settings.keyboardShortcuts.distance);\n\t\t\t\t\t\t\t\t\t\t\t\tscrolled = true;\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t// Right arrow.\n\t\t\t\t\t\t\t\t\t\t\tcase 39:\n\t\t\t\t\t\t\t\t\t\t\t\t$document.scrollLeft($document.scrollLeft() + settings.keyboardShortcuts.distance);\n\t\t\t\t\t\t\t\t\t\t\t\tscrolled = true;\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t// Page Up.\n\t\t\t\t\t\t\t\t\t\t\tcase 33:\n\t\t\t\t\t\t\t\t\t\t\t\t$document.scrollLeft($document.scrollLeft() - $window.width() + 100);\n\t\t\t\t\t\t\t\t\t\t\t\tscrolled = true;\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t// Page Down, Space.\n\t\t\t\t\t\t\t\t\t\t\tcase 34:\n\t\t\t\t\t\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\t\t\t\t\t\t$document.scrollLeft($document.scrollLeft() + $window.width() - 100);\n\t\t\t\t\t\t\t\t\t\t\t\tscrolled = true;\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t// Home.\n\t\t\t\t\t\t\t\t\t\t\tcase 36:\n\t\t\t\t\t\t\t\t\t\t\t\t$document.scrollLeft(0);\n\t\t\t\t\t\t\t\t\t\t\t\tscrolled = true;\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t// End.\n\t\t\t\t\t\t\t\t\t\t\tcase 35:\n\t\t\t\t\t\t\t\t\t\t\t\t$document.scrollLeft($document.width());\n\t\t\t\t\t\t\t\t\t\t\t\tscrolled = true;\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Scrolled?\n\t\t\t\t\t\t\t\t\t\tif (scrolled) {\n\n\t\t\t\t\t\t\t\t\t\t\t// Prevent default.\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\t\t\t\t\t\t\t// Stop link scroll.\n\t\t\t\t\t\t\t\t\t\t\t\t$bodyHtml.stop();\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t})();\n\n            // Scroll wheel.\n\t\t\t// WARN: broke scroll so, comment it. 禁止了滚轮事件，于是注释它\n            if (false) // (settings.scrollWheel.enabled)\n                (function() {\n\n                    // Based on code by @miorel + @pieterv of Facebook (thanks guys :)\n                    // github.com/facebook/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js\n                    var normalizeWheel = function(event) {\n\n                        var\tpixelStep = 10,\n                            lineHeight = 40,\n                            pageHeight = 800,\n                            sX = 0,\n                            sY = 0,\n                            pX = 0,\n                            pY = 0;\n\n                        // Legacy.\n                        if ('detail' in event)\n                            sY = event.detail;\n                        else if ('wheelDelta' in event)\n                            sY = event.wheelDelta / -120;\n                        else if ('wheelDeltaY' in event)\n                            sY = event.wheelDeltaY / -120;\n\n                        if ('wheelDeltaX' in event)\n                            sX = event.wheelDeltaX / -120;\n\n                        // Side scrolling on FF with DOMMouseScroll.\n                        if ('axis' in event\n                            &&\tevent.axis === event.HORIZONTAL_AXIS) {\n                            sX = sY;\n                            sY = 0;\n                        }\n\n                        // Calculate.\n                        pX = sX * pixelStep;\n                        pY = sY * pixelStep;\n\n                        if ('deltaY' in event)\n                            pY = event.deltaY;\n\n                        if ('deltaX' in event)\n                            pX = event.deltaX;\n\n                        if ((pX || pY)\n                            &&\tevent.deltaMode) {\n\n                            if (event.deltaMode == 1) {\n                                pX *= lineHeight;\n                                pY *= lineHeight;\n                            }\n                            else {\n                                pX *= pageHeight;\n                                pY *= pageHeight;\n                            }\n\n                        }\n\n                        // Fallback if spin cannot be determined.\n                        if (pX && !sX)\n                            sX = (pX < 1) ? -1 : 1;\n\n                        if (pY && !sY)\n                            sY = (pY < 1) ? -1 : 1;\n\n                        // Return.\n                        return {\n                            spinX: sX,\n                            spinY: sY,\n                            pixelX: pX,\n                            pixelY: pY\n                        };\n\n                    };\n\n                    // Wheel event.\n                    $body.on('wheel', function(event) {\n\n                        // Disable on <=small.\n                        if (skel.breakpoint('small').active)\n                            return;\n\n                        // Prevent default.\n                        event.preventDefault();\n                        event.stopPropagation();\n\n                        // Stop link scroll.\n                        $bodyHtml.stop();\n\n                        // Calculate delta, direction.\n                        var\tn = normalizeWheel(event.originalEvent),\n                            x = (n.pixelX != 0 ? n.pixelX : n.pixelY),\n                            delta = Math.min(Math.abs(x), 150) * settings.scrollWheel.factor,\n                            direction = x > 0 ? 1 : -1;\n\n                        // Scroll page.\n                        $document.scrollLeft($document.scrollLeft() + (delta * direction));\n\n                    });\n\n                })();\n\n\n\t\t\t// Scroll zones.\n\t\t\t\tif (settings.scrollZones.enabled)\n\t\t\t\t\t(function() {\n\n\t\t\t\t\t\tvar\t$left = $('<div class=\"scrollZone left\"></div>'),\n\t\t\t\t\t\t\t$right = $('<div class=\"scrollZone right\"></div>'),\n\t\t\t\t\t\t\t$zones = $left.add($right),\n\t\t\t\t\t\t\tpaused = false,\n\t\t\t\t\t\t\tintervalId = null,\n\t\t\t\t\t\t\tdirection,\n\t\t\t\t\t\t\tactivate = function(d) {\n\n\t\t\t\t\t\t\t\t// Disable on <=small.\n\t\t\t\t\t\t\t\t\tif (skel.breakpoint('small').active)\n\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t// Paused? Bail.\n\t\t\t\t\t\t\t\t\tif (paused)\n\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t// Stop link scroll.\n\t\t\t\t\t\t\t\t\t$bodyHtml.stop();\n\n\t\t\t\t\t\t\t\t// Set direction.\n\t\t\t\t\t\t\t\t\tdirection = d;\n\n\t\t\t\t\t\t\t\t// Initialize interval.\n\t\t\t\t\t\t\t\t\tclearInterval(intervalId);\n\n\t\t\t\t\t\t\t\t\tintervalId = setInterval(function() {\n\t\t\t\t\t\t\t\t\t\t$document.scrollLeft($document.scrollLeft() + (settings.scrollZones.speed * direction));\n\t\t\t\t\t\t\t\t\t}, 25);\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdeactivate = function() {\n\n\t\t\t\t\t\t\t\t// Unpause.\n\t\t\t\t\t\t\t\t\tpaused = false;\n\n\t\t\t\t\t\t\t\t// Clear interval.\n\t\t\t\t\t\t\t\t\tclearInterval(intervalId);\n\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t$zones\n\t\t\t\t\t\t\t.appendTo($wrapper)\n\t\t\t\t\t\t\t.on('mouseleave mousedown', function(event) {\n\t\t\t\t\t\t\t\tdeactivate();\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t$left\n\t\t\t\t\t\t\t.css('left', '0')\n\t\t\t\t\t\t\t.on('mouseenter', function(event) {\n\t\t\t\t\t\t\t\tactivate(-1);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t$right\n\t\t\t\t\t\t\t.css('right', '0')\n\t\t\t\t\t\t\t.on('mouseenter', function(event) {\n\t\t\t\t\t\t\t\tactivate(1);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t$wrapper\n\t\t\t\t\t\t\t.on('---pauseScrollZone', function(event) {\n\n\t\t\t\t\t\t\t\t// Pause.\n\t\t\t\t\t\t\t\t\tpaused = true;\n\n\t\t\t\t\t\t\t\t// Unpause after delay.\n\t\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\t\tpaused = false;\n\t\t\t\t\t\t\t\t\t}, 500);\n\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t})();\n\n\t\t\t// Dragging.\n\t\t\t\tif (settings.dragging.enabled)\n\t\t\t\t\t(function() {\n\n\t\t\t\t\t\tvar dragging = false,\n\t\t\t\t\t\t\tdragged = false,\n\t\t\t\t\t\t\tdistance = 0,\n\t\t\t\t\t\t\tstartScroll,\n\t\t\t\t\t\t\tmomentumIntervalId, velocityIntervalId,\n\t\t\t\t\t\t\tstartX, currentX, previousX,\n\t\t\t\t\t\t\tvelocity, direction;\n\n\t\t\t\t\t\t$wrapper\n\n\t\t\t\t\t\t\t// Prevent image drag and drop.\n\t\t\t\t\t\t\t\t.on('mouseup mousemove mousedown', '.image, img', function(event) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t// Prevent mouse events inside excluded elements from bubbling.\n\t\t\t\t\t\t\t\t.on('mouseup mousemove mousedown', settings.excludeSelector, function(event) {\n\n\t\t\t\t\t\t\t\t\t// Prevent event from bubbling.\n\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\t\t\t\t\t// End drag.\n\t\t\t\t\t\t\t\t\t\tdragging = false;\n\t\t\t\t\t\t\t\t\t\t$wrapper.removeClass('is-dragging');\n\t\t\t\t\t\t\t\t\t\tclearInterval(velocityIntervalId);\n\t\t\t\t\t\t\t\t\t\tclearInterval(momentumIntervalId);\n\n\t\t\t\t\t\t\t\t\t// Pause scroll zone.\n\t\t\t\t\t\t\t\t\t\t$wrapper.triggerHandler('---pauseScrollZone');\n\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t// Mousedown event.\n\t\t\t\t\t\t\t\t.on('mousedown', function(event) {\n\n\t\t\t\t\t\t\t\t\t// Disable on <=small.\n\t\t\t\t\t\t\t\t\t\tif (skel.breakpoint('small').active)\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t\t// Clear momentum interval.\n\t\t\t\t\t\t\t\t\t\tclearInterval(momentumIntervalId);\n\n\t\t\t\t\t\t\t\t\t// Stop link scroll.\n\t\t\t\t\t\t\t\t\t\t$bodyHtml.stop();\n\n\t\t\t\t\t\t\t\t\t// Start drag.\n\t\t\t\t\t\t\t\t\t\tdragging = true;\n\t\t\t\t\t\t\t\t\t\t$wrapper.addClass('is-dragging');\n\n\t\t\t\t\t\t\t\t\t// Initialize and reset vars.\n\t\t\t\t\t\t\t\t\t\tstartScroll = $document.scrollLeft();\n\t\t\t\t\t\t\t\t\t\tstartX = event.clientX;\n\t\t\t\t\t\t\t\t\t\tpreviousX = startX;\n\t\t\t\t\t\t\t\t\t\tcurrentX = startX;\n\t\t\t\t\t\t\t\t\t\tdistance = 0;\n\t\t\t\t\t\t\t\t\t\tdirection = 0;\n\n\t\t\t\t\t\t\t\t\t// Initialize velocity interval.\n\t\t\t\t\t\t\t\t\t\tclearInterval(velocityIntervalId);\n\n\t\t\t\t\t\t\t\t\t\tvelocityIntervalId = setInterval(function() {\n\n\t\t\t\t\t\t\t\t\t\t\t// Calculate velocity, direction.\n\t\t\t\t\t\t\t\t\t\t\t\tvelocity = Math.abs(currentX - previousX);\n\t\t\t\t\t\t\t\t\t\t\t\tdirection = (currentX > previousX ? -1 : 1);\n\n\t\t\t\t\t\t\t\t\t\t\t// Update previous X.\n\t\t\t\t\t\t\t\t\t\t\t\tpreviousX = currentX;\n\n\t\t\t\t\t\t\t\t\t\t}, 50);\n\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t// Mousemove event.\n\t\t\t\t\t\t\t\t.on('mousemove', function(event) {\n\n\t\t\t\t\t\t\t\t\t// Not dragging? Bail.\n\t\t\t\t\t\t\t\t\t\tif (!dragging)\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t\t// Velocity.\n\t\t\t\t\t\t\t\t\t\tcurrentX = event.clientX;\n\n\t\t\t\t\t\t\t\t\t// Scroll page.\n\t\t\t\t\t\t\t\t\t\t$document.scrollLeft(startScroll + (startX - currentX));\n\n\t\t\t\t\t\t\t\t\t// Update distance.\n\t\t\t\t\t\t\t\t\t\tdistance = Math.abs(startScroll - $document.scrollLeft());\n\n\t\t\t\t\t\t\t\t\t// Distance exceeds threshold? Disable pointer events on all descendents.\n\t\t\t\t\t\t\t\t\t\tif (!dragged\n\t\t\t\t\t\t\t\t\t\t&&\tdistance > settings.dragging.threshold) {\n\n\t\t\t\t\t\t\t\t\t\t\t$wrapper.addClass('is-dragged');\n\n\t\t\t\t\t\t\t\t\t\t\tdragged = true;\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t// Mouseup/mouseleave event.\n\t\t\t\t\t\t\t\t.on('mouseup mouseleave', function(event) {\n\n\t\t\t\t\t\t\t\t\tvar m;\n\n\t\t\t\t\t\t\t\t\t// Not dragging? Bail.\n\t\t\t\t\t\t\t\t\t\tif (!dragging)\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t\t// Dragged? Re-enable pointer events on all descendents.\n\t\t\t\t\t\t\t\t\t\tif (dragged) {\n\n\t\t\t\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\t\t\t\t$wrapper.removeClass('is-dragged');\n\t\t\t\t\t\t\t\t\t\t\t}, 100);\n\n\t\t\t\t\t\t\t\t\t\t\tdragged = false;\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Distance exceeds threshold? Prevent default.\n\t\t\t\t\t\t\t\t\t\tif (distance > settings.dragging.threshold)\n\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t\t\t\t// End drag.\n\t\t\t\t\t\t\t\t\t\tdragging = false;\n\t\t\t\t\t\t\t\t\t\t$wrapper.removeClass('is-dragging');\n\t\t\t\t\t\t\t\t\t\tclearInterval(velocityIntervalId);\n\t\t\t\t\t\t\t\t\t\tclearInterval(momentumIntervalId);\n\n\t\t\t\t\t\t\t\t\t// Pause scroll zone.\n\t\t\t\t\t\t\t\t\t\t$wrapper.triggerHandler('---pauseScrollZone');\n\n\t\t\t\t\t\t\t\t\t// Initialize momentum interval.\n\t\t\t\t\t\t\t\t\t\tif (settings.dragging.momentum > 0) {\n\n\t\t\t\t\t\t\t\t\t\t\tm = velocity;\n\n\t\t\t\t\t\t\t\t\t\t\tmomentumIntervalId = setInterval(function() {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Scroll page.\n\t\t\t\t\t\t\t\t\t\t\t\t\t$document.scrollLeft($document.scrollLeft() + (m * direction));\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Decrease momentum.\n\t\t\t\t\t\t\t\t\t\t\t\t\tm = m * settings.dragging.momentum;\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Negligible momentum? Clear interval and end.\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (Math.abs(m) < 1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclearInterval(momentumIntervalId);\n\n\t\t\t\t\t\t\t\t\t\t\t}, 15);\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t})();\n\n\t\t\t// Link scroll.\n\t\t\t\t$wrapper\n\t\t\t\t\t.on('mousedown mouseup', 'a[href^=\"#\"]', function(event) {\n\n\t\t\t\t\t\t// Stop propagation.\n\t\t\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\t})\n\t\t\t\t\t.on('click', 'a[href^=\"#\"]', function(event) {\n\n\t\t\t\t\t\tvar\t$this = $(this),\n\t\t\t\t\t\t\thref = $this.attr('href'),\n\t\t\t\t\t\t\t$target, x, y;\n\n\t\t\t\t\t\t// Get target.\n\t\t\t\t\t\t\tif (href == '#'\n\t\t\t\t\t\t\t||\t($target = $(href)).length == 0)\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Prevent default.\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\t\t// Calculate x, y.\n\t\t\t\t\t\t\tif (skel.breakpoint('small').active) {\n\n\t\t\t\t\t\t\t\tx = $target.offset().top - (Math.max(0, $window.height() - $target.outerHeight()) / 2);\n\t\t\t\t\t\t\t\ty = { scrollTop: x };\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\n\t\t\t\t\t\t\t\tx = $target.offset().left - (Math.max(0, $window.width() - $target.outerWidth()) / 2);\n\t\t\t\t\t\t\t\ty = { scrollLeft: x };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Scroll.\n\t\t\t\t\t\t\t$bodyHtml\n\t\t\t\t\t\t\t\t.stop()\n\t\t\t\t\t\t\t\t.animate(\n\t\t\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\t\t\tsettings.linkScrollSpeed,\n\t\t\t\t\t\t\t\t\t'swing'\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t});\n\n\t\t\t// Gallery.\n\t\t\t\t$('.gallery')\n\t\t\t\t\t.on('click', 'a', function(event) {\n\n\t\t\t\t\t\tvar $a = $(this),\n\t\t\t\t\t\t\t$gallery = $a.parents('.gallery'),\n\t\t\t\t\t\t\t$modal = $gallery.children('.modal'),\n\t\t\t\t\t\t\t$modalImg = $modal.find('img'),\n\t\t\t\t\t\t\thref = $a.attr('href');\n\n\t\t\t\t\t\t// Not an image? Bail.\n\t\t\t\t\t\t\tif (!href.match(/\\.(jpg|gif|png|mp4)$/))\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Prevent default.\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\t\t// Locked? Bail.\n\t\t\t\t\t\t\tif ($modal[0]._locked)\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Lock.\n\t\t\t\t\t\t\t$modal[0]._locked = true;\n\n\t\t\t\t\t\t// Set src.\n\t\t\t\t\t\t\t$modalImg.attr('src', href);\n\n\t\t\t\t\t\t// Set visible.\n\t\t\t\t\t\t\t$modal.addClass('visible');\n\n\t\t\t\t\t\t// Focus.\n\t\t\t\t\t\t\t$modal.focus();\n\n\t\t\t\t\t\t// Delay.\n\t\t\t\t\t\t\tsetTimeout(function() {\n\n\t\t\t\t\t\t\t\t// Unlock.\n\t\t\t\t\t\t\t\t\t$modal[0]._locked = false;\n\n\t\t\t\t\t\t\t}, 600);\n\n\t\t\t\t\t})\n\t\t\t\t\t.on('click', '.modal', function(event) {\n\n\t\t\t\t\t\tvar $modal = $(this),\n\t\t\t\t\t\t\t$modalImg = $modal.find('img');\n\n\t\t\t\t\t\t// Locked? Bail.\n\t\t\t\t\t\t\tif ($modal[0]._locked)\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Already hidden? Bail.\n\t\t\t\t\t\t\tif (!$modal.hasClass('visible'))\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Stop propagation.\n\t\t\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\t\t// Lock.\n\t\t\t\t\t\t\t$modal[0]._locked = true;\n\n\t\t\t\t\t\t// Clear visible, loaded.\n\t\t\t\t\t\t\t$modal\n\t\t\t\t\t\t\t\t.removeClass('loaded')\n\n\t\t\t\t\t\t// Delay.\n\t\t\t\t\t\t\tsetTimeout(function() {\n\n\t\t\t\t\t\t\t\t$modal\n\t\t\t\t\t\t\t\t\t.removeClass('visible')\n\n\t\t\t\t\t\t\t\t// Pause scroll zone.\n\t\t\t\t\t\t\t\t\t$wrapper.triggerHandler('---pauseScrollZone');\n\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\n\t\t\t\t\t\t\t\t\t// Clear src.\n\t\t\t\t\t\t\t\t\t\t$modalImg.attr('src', '');\n\n\t\t\t\t\t\t\t\t\t// Unlock.\n\t\t\t\t\t\t\t\t\t\t$modal[0]._locked = false;\n\n\t\t\t\t\t\t\t\t\t// Focus.\n\t\t\t\t\t\t\t\t\t\t$body.focus();\n\n\t\t\t\t\t\t\t\t}, 475);\n\n\t\t\t\t\t\t\t}, 125);\n\n\t\t\t\t\t})\n\t\t\t\t\t.on('keypress', '.modal', function(event) {\n\n\t\t\t\t\t\tvar $modal = $(this);\n\n\t\t\t\t\t\t// Escape? Hide modal.\n\t\t\t\t\t\t\tif (event.keyCode == 27)\n\t\t\t\t\t\t\t\t$modal.trigger('click');\n\n\t\t\t\t\t})\n\t\t\t\t\t.on('mouseup mousedown mousemove', '.modal', function(event) {\n\n\t\t\t\t\t\t// Stop propagation.\n\t\t\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\t})\n\t\t\t\t\t.prepend('<div class=\"modal\" tabIndex=\"-1\"><div class=\"inner\"><img src=\"\" /></div></div>')\n\t\t\t\t\t\t.find('img')\n\t\t\t\t\t\t\t.on('load', function(event) {\n\n\t\t\t\t\t\t\t\tvar $modalImg = $(this),\n\t\t\t\t\t\t\t\t\t$modal = $modalImg.parents('.modal');\n\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\n\t\t\t\t\t\t\t\t\t// No longer visible? Bail.\n\t\t\t\t\t\t\t\t\t\tif (!$modal.hasClass('visible'))\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t\t// Set loaded.\n\t\t\t\t\t\t\t\t\t\t$modal.addClass('loaded');\n\n\t\t\t\t\t\t\t\t}, 275);\n\n\t\t\t\t\t\t\t});\n\n\t\t});\n\n})(jQuery);"
  },
  {
    "path": "template/installation/assets.go",
    "content": "// Code generated by go-bindata. DO NOT EDIT.\n// sources:\n// assets/login/dist/all.min.css\n// assets/login/dist/all.min.js\n// assets/login/dist/respond.min.js\npackage login\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc bindataRead(data []byte, name string) ([]byte, error) {\n\tgz, err := gzip.NewReader(bytes.NewBuffer(data))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\n\tvar buf bytes.Buffer\n\t_, err = io.Copy(&buf, gz)\n\tclErr := gz.Close()\n\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\tif clErr != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\ntype asset struct {\n\tbytes []byte\n\tinfo  os.FileInfo\n}\n\ntype bindataFileInfo struct {\n\tname    string\n\tsize    int64\n\tmode    os.FileMode\n\tmodTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n\treturn fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n\treturn fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n\treturn fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n\treturn fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n\treturn false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n\treturn nil\n}\n\nvar _assetsLoginDistAllMinCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xbd\\x6b\\xb7\\xe3\\xb6\\xb1\\x20\\xfa\\xfd\\xfc\\x0a\\xc6\\x5e\\xbd\\xdc\\xed\\x16\\xd9\\x24\\xf5\\xda\\x92\\x56\\xfa\\xc6\\x76\\xe2\\x19\\xdf\\x39\\x19\\xdf\\x35\\x27\\x9e\\x49\\xc6\\xf1\\x9d\\x05\\x91\\x90\\x44\\x37\\x45\\x32\\x24\\xb5\\x1f\\xd6\\x68\\x7e\\xfb\\x2c\\xe2\\x41\\xe2\\x51\\x00\\x49\\xed\\xdd\\xaf\\x64\\x9f\\x3e\\x49\\xb4\\x51\\x85\\x42\\xa1\\xaa\\x50\\x05\\x14\\xf1\\xf8\\xc3\\x2e\\xcf\\x6a\\x77\\x87\\x22\\x7c\\x66\\xbf\\x8e\\x49\\xfa\\xb0\\xce\\x0b\\x9c\\x39\\x15\\xca\\xaa\\x0d\\x29\\xad\\xea\\x87\\x14\\xaf\\xb3\\xbc\\x3c\\xa2\\x94\\x96\\xdc\\xe1\\x64\\x7f\\xa8\\xd7\\x53\\xdf\\xdf\\x54\\x65\\xb4\\x4e\\xf3\\x08\\xa5\\x2f\\xbf\\xfa\\xb1\\xa9\\xf6\\x1f\\x28\\xab\\x9c\\x7f\\x6f\\xc0\\x5f\\xbd\\x9a\\x08\\x80\\xa6\\xdc\\xe5\\xe5\\xa7\\x32\\x7d\\x79\\xa8\\xeb\\xa2\\x5a\\xbf\\x79\\xd3\\x10\\xac\\xbc\\x7d\\x55\\xa3\\x3a\\x89\\xbc\\x28\\x3f\\xbe\\xa9\\xde\\x34\\x0c\\x34\\xed\\xbf\\xb9\\x0d\\x96\\x6f\\x8e\\xf8\\x38\\xff\\x1b\\xfa\\x4f\\x55\\x10\\x2e\\xfe\\x9c\\xfc\\xcf\\xe2\\xdb\\x6f\\xdc\\x9f\\xfe\\xeb\\xff\\x2a\\x6f\\x7e\\xfc\\xab\\x7b\\x28\\xfe\\xcb\\x7f\\xf9\\x8f\\xbf\\xfc\\x3a\\xff\\xff\\xfe\\x87\\x77\\x97\\xef\\x76\\xe1\\xab\\x5d\\xc3\\x63\\xfd\\xf2\\x2b\\xf2\\xd7\\x57\\xaf\\x36\\xa7\\x2c\\x89\\xf2\\x18\\xbb\\x25\\xca\\xf6\\x78\\xfd\\xd3\\x6b\\x7f\\xb6\\xf0\\x5d\\x7f\\x1e\\x7e\\x3f\\xf9\\xe9\\x75\\xf0\\xdd\\x8d\\xef\\x06\\xdf\\xdd\\xdc\\x4c\\x7e\\x7a\\x1d\\xfa\\xdf\\xce\\x9a\\xff\\xf9\\xe3\\x9f\\x7c\\x37\\xfc\\xe3\\xf7\\x0d\\xf8\\x9b\\xc5\\xcc\\x77\\xbf\\x59\\xac\\x9a\\xdf\\xdf\\xff\\x29\\xfc\\x93\\xfb\\xfd\\x9f\\xc2\\xef\\x2f\\x9f\\xb5\\xc0\\xfe\\xfb\\xe9\\x0a\\x81\\xf9\\xbe\\xeb\\xcf\\xe6\\x8d\\x14\\xfc\\xd9\\xaa\\xf9\\xbd\\x0a\\xc8\\xef\\x6f\\x9b\\xdf\\xdf\\x36\\xbf\\xc3\\x20\\x58\\x7c\\xde\\x82\\xf9\\xeb\\x78\\xc1\\x04\\xdf\\xfb\\xbe\\x1b\\x7c\\xff\\xfd\\x67\\x6e\\x12\\x3f\\xe1\\xf1\\x26\\x31\\x5d\\xfa\\xae\\x3f\\xfd\\xdc\\x7b\\xfe\\xd7\\x2b\\x7a\\x1e\\xf8\\xa1\\xeb\\x07\\xfe\\xb4\\x19\\x00\\x41\\xe0\\xbb\\x7e\\x10\\x34\\x03\\x20\\xf8\\xd3\\x37\\xbe\\x1b\\xfc\\xe9\\xfb\\x15\\xf1\\x24\\xdf\\x7c\\xfb\\x99\\x0b\\xe6\\xc7\\x6b\\x04\\xe3\\xbb\\x7e\\x38\\x23\\x5e\\x22\\x9c\\xaf\\x88\\x4c\\x7c\\x22\\x93\\xef\\x89\\x4c\\x42\\x9f\\x8a\\xc6\\x77\\x1b\\xf9\\xd0\\xdf\\x7f\\x74\\x43\\xff\\xbb\\xef\\xa9\\xff\\x68\\x24\\x1a\\x7e\\xb7\\xf0\\xdd\\xf0\\xbb\\x25\\x71\\xbe\\xcb\\xd0\\x77\\xbf\\x59\\x7e\\xee\\x36\\xf6\\x13\\xf7\\x2b\\x77\\x43\\x05\\xe9\\x37\\x82\\xf4\\x89\\xd4\\xfc\\x60\\x4a\\x3c\\x6d\\x30\\x6f\\x8c\\x6e\\x4e\\x8c\\x2e\\xfc\\xf6\\x5b\\xd7\\x0f\\xbf\\xfd\\x8e\\xfc\\xfe\\x6e\\x41\\xfe\\xe7\\x8f\\xdf\\xd0\\xff\\xf9\\x8e\\x88\\xd5\\x6f\\x44\\xbc\\xa0\\x52\\x5f\\xce\\xa8\\xa4\\x09\\x24\\x08\\x43\\xf2\\x3f\\x2b\\xea\\xb2\\x57\\x44\\xe4\\x61\\x10\\xd2\\xff\\x99\\x93\\x28\\x47\\xda\\xfd\\xfe\\xfb\\xef\\xff\\xf8\\x58\\xb1\\xcf\\x4c\\x62\\xff\\x6f\\x78\\x7f\\x4a\\x51\\x09\\x08\\xbe\\x83\\x8c\\x15\\xfd\\x8d\\x22\\xfa\\xef\\xff\\xc7\\xff\\xeb\\x6f\\x77\\x37\\xc5\\xbb\\x6f\\x8a\\x05\\xfa\\x4c\\x26\\x06\\x1f\\x57\\x60\\x3f\\xfd\\xcf\\x2b\\x04\\xf6\\x61\\x26\\x06\\x1f\\xd9\\x92\\xc6\\x0b\\xe6\\xc9\\x26\\x06\\x1f\\xb7\\xe7\\xff\\xbd\\x18\\x6f\\x12\\x4f\\x35\\x31\\xf8\\xc8\\x3a\\xbf\\xa2\\xe7\\x1f\\x68\\x62\\xf0\\x91\\x05\\x33\\xbf\\x46\\x30\\x9f\\xe8\\xc4\\xe0\\x23\\x8f\\x2e\\xee\\x57\\xf6\\xff\\x62\\x13\\x83\\xa5\\x49\\xec\\xdf\\xe6\\x69\\x0c\\xc8\\x9c\\x15\\x3f\\x7a\\x36\\xb6\\x2c\\xf7\\x9f\\x63\\xbe\\xe0\\x63\\x8a\\xeb\\x13\\xce\\x16\\x7c\\x54\\x2b\\xfa\\x88\\xb9\\x82\\x8f\\xd9\\xef\\x8f\\x99\\x29\\xf8\\xa8\\xfa\\xfe\\x74\\xf3\\x04\\x1f\\x55\\x2c\\xff\\x4c\\x59\\x82\\x8f\\x3a\\xae\\x3e\\xdb\\x1c\\xc1\\x9b\\xaf\\x7f\\xf7\\xb5\\xf3\\x6d\\x9e\\xd7\\x55\\x5d\\xa2\\xc2\\xb9\\x9d\\x7a\\x53\\x6f\\xe9\\x10\\x89\\xac\\xdf\\xbc\\xd9\\xe3\\x7a\\xcb\\x61\\x8d\\x3c\\x5e\\xfd\\xdb\\xd7\\xce\\x77\\x79\\xf1\\x50\\x36\\x12\\x77\\x42\\x3f\\x08\\xdc\\xd0\\x0f\\x16\\xce\\x5f\\xee\\x92\\xba\\xc6\\xe5\\xc4\\xf9\\x21\\x8b\\xbc\\x7f\\xfb\\xda\\xf9\\xf7\\x24\\xc2\\x59\\x85\\x63\\xe7\\x94\\xc5\\xb8\\x74\\xfe\\xfc\\xc3\\x5f\\x9c\\x56\\xc8\\xfb\\xa4\\x3e\\x9c\\xb6\\x44\\xba\\xf5\\xdd\\xb6\\x7a\\xd3\\x36\\xf0\\x66\\x9b\\xe6\\xdb\\x37\\x47\\x54\\xd5\\xb8\\x7c\\xf3\\xef\\x3f\\x7c\\xf7\\xa7\\xff\\xfa\\x1f\\x7f\\x7a\\xf5\\xf5\\x9b\\x37\\x5f\\xff\\x8e\\x6a\\x3b\\xf9\\x0d\\x7b\\x51\\x55\\x35\\x3c\\xfa\\xde\\xd4\\xf9\\xdf\\x84\\x2c\\x6b\\xc9\\xf9\\xdf\\x8e\\x40\\x37\\xc3\\x51\\x9e\\xa2\\xea\\x8d\\x54\\xef\\xeb\\x37\\x87\\xfa\\x98\\x4a\\xa6\\xd5\\xe8\\xd5\\xad\\x70\\x99\\xec\\x36\\xee\\x1d\\xde\\xbe\\x4b\\x6a\\xb7\\xc6\\xf7\\xb5\\x5b\\x25\\xbf\\x61\\x17\\xc5\\xbf\\x9e\\xaa\\x7a\\x1d\\xf8\\xfe\\x8b\\x8d\\x7b\\xac\\x60\\xc8\\x65\\x9b\\xc7\\x0f\\xe7\\x23\\x2a\\xf7\\x49\\xb6\\xf6\\x2f\\xa8\\xac\\x93\\x28\\xc5\\x13\\x54\\x25\\x31\\x9e\\xc4\\xb8\\x46\\x49\\x5a\\x4d\\x76\\xc9\\x3e\\x42\\x45\\x9d\\xe4\\x59\\xf3\\xf3\\x54\\xe2\\xc9\\x2e\\xcf\\x1b\\x71\\x1d\\x30\\x8a\\x9b\\xff\\xd9\\x97\\xf9\\xa9\\x98\\x1c\\x51\\x92\\x4d\\x8e\\x38\\x3b\\x4d\\x32\\x74\\x3b\\xa9\\x70\\x44\\x6a\\x54\\xa7\\xe3\\x11\\x95\\x0f\\xe7\\x38\\xa9\\x8a\\x14\\x3d\\xac\\xb7\\x69\\x1e\\xbd\\xbb\\xa0\\x53\\x9c\\xe4\\x93\\x08\\x65\\xb7\\xa8\\x9a\\x14\\x65\\xbe\\x2f\\x71\\x55\\x4d\\x6e\\x93\\x18\\xe7\\x2d\\x66\\x92\\xa5\\x49\\x86\\x5d\\x52\\x61\\x73\\x8b\\x1b\\xd6\\x50\\xea\\xa2\\x34\\xd9\\x67\\xeb\\x2d\\xaa\\x70\\x03\\xa5\\x84\\xd6\\x59\\x5e\\xbf\\xfc\\x39\\xca\\xb3\\xba\\xcc\\xd3\\xea\\x97\\x57\\x2d\\x89\\x2c\\xcf\\xf0\\xe6\\x40\\xc7\\x97\\x7f\\xf9\\xf9\\x90\\xc4\\x31\\xce\\x7e\\x99\\xd4\\xf8\\x58\\xa4\\xa8\\xc6\\x12\\xde\\x05\\x9d\\xb7\\x28\\x7a\\xd7\\xf4\\x25\\x8b\\xdd\\x28\\x4f\\xf3\\x72\\x5d\\x97\\x28\\xab\\x0a\\x54\\xe2\\xac\\xbe\\xa0\\x35\\x8a\\xea\\xe4\\x16\\x4f\\xd0\\xfa\\x90\\xdf\\xe2\\xf2\\x9c\\x9f\\xea\\x86\\x85\\x46\\x6c\\xdb\\x6d\\xf9\\x73\\x9d\\xd4\\x29\\xfe\\xe5\\xbc\\xcd\\xcb\\x18\\x97\\xee\\x36\\xaf\\xeb\\xfc\\xb8\\x0e\\x8a\\x7b\\x27\\xce\\xeb\\x1a\\xc7\\x97\\xed\\xa4\\xaa\\xcb\\x3c\\xdb\\x9f\\x95\\x41\\x7f\\x89\\x77\\xd9\\x59\\x70\\x0d\\x49\\x8d\\xd2\\x24\\xba\\x1c\\x02\\xae\\x16\\x6f\\xb1\\xc4\\x47\\xc7\\x67\\xee\\x23\\xf9\\x0d\\xaf\\x43\\x7c\\xbc\\x1c\\x51\\xf9\\xee\\x4c\\xb9\\xfc\\xd2\\xf7\\xfd\\x4d\\xc7\\xfb\\xfa\\xcb\\xdd\\xce\\xbf\\x54\\x47\\x94\\x32\\x6b\\x21\\x75\\x6e\\xfc\\x17\\x97\\xea\\xb4\\x9d\\x54\\xa7\\xe2\\x5c\\xe4\\x55\\xd2\\x28\\x67\\x5d\\xe2\\x14\\x35\\x7d\\x12\\x68\\x2f\\xe7\\x2f\\x36\\x44\\xee\\x5c\\x6c\\x46\\xd1\\x37\\x94\\xea\\xbc\\x58\\xbb\\xde\\x1c\\x1f\\x1b\\xda\\x67\\xd6\\x69\\xd7\\x0b\\x9b\\x92\\xe4\\xb8\\x67\\xd2\\x58\\xfb\\x97\\xea\\x76\\x4f\\xb4\\xb4\\x2e\\xf3\\xbc\\x7e\\x75\\x6e\\x04\\xb8\\x4b\\xf3\\xbb\\x35\\x55\\xc9\\x85\\xda\\x15\\xef\\x71\\x80\\x8f\\xce\\xcc\\x2f\\xee\\x2f\\x87\\xf2\\xdc\\xb2\\xc1\\x2d\\x7c\\x9b\\xdf\\x37\\x9c\\x26\\xd9\\x7e\\xdd\\x68\\x1c\\x67\\xa4\\x68\\xe3\\x1e\\xf3\\xdf\\x4c\\x30\\xb8\\xf8\\x52\\x94\\xb8\\x63\\x04\\x9d\\xea\\xfc\\xd2\\xf8\\xb8\\xc9\\xbb\\x6d\\x3c\\x29\\x4a\\x3c\\xa9\\xd0\\xb1\\x90\\x86\\xdb\\x31\\xcf\\xf2\\xaa\\x40\\x11\\x9e\\xb4\\xbf\\x04\\xc1\\x05\\xf8\\x78\\xd9\\x9e\\xea\\x3a\\xcf\\x26\\x49\\x56\\x9c\\xea\\x49\\x5e\\xd4\\x74\\x60\\x54\\x38\\xc5\\x51\\x3d\\x69\\x06\\x20\\x2a\\x31\\x6a\\x87\\x1b\\xa9\\xbc\\x4e\\xb2\\x03\\x2e\\x93\\x7a\\x43\\x75\\xc9\\xfe\\x62\\x94\\x3a\\xf6\\x6e\\x93\\x2a\\xd9\\xa6\\x98\\xb7\\x40\\x49\\x9e\\xc9\\x98\\x26\\x46\\xda\\x38\\x6c\\x6a\\xc6\\x0c\\xa3\\x71\\x16\\x0e\\x61\\xe4\\xe7\\xfa\\xa1\\xc0\\xbf\\xa7\\xc5\\xbf\\x4c\\x84\\xa2\\x12\\x57\\xb8\\x96\\x4a\\xaa\\xd3\\xf6\\x98\\xd4\\xbf\\x9c\\xb9\\xac\\x51\\x51\\x60\\x54\\xa2\\x2c\\xc2\\x6b\\x5a\\x7f\\x13\\x9d\\xca\\x2a\\x2f\\xd7\\x45\\x9e\\x64\\x35\\x2e\\x59\\x63\\x3f\\xc7\\x49\\x85\\xb6\\x29\\x8e\\x7f\\x11\\x9b\\x6d\\x0b\\xcf\\xac\\x52\\x8c\\x77\\xe8\\x94\\xf2\\xbe\\xad\\xd7\\x44\\x65\\xbb\\x3c\\x3a\\x55\\x6e\\x92\\x65\\xb8\\xa4\\x9c\\xe8\\xe5\\xe7\\x02\\xc5\\x71\\xa3\\x3c\\x7f\\xd3\\xda\\x13\\x41\\x3d\\x8b\\x86\\x4a\\x9d\\xe5\\x45\\xe8\\x4d\\x74\\xc0\\xd1\\xbb\\x6d\\x7e\\x2f\\x77\\x1a\\xc5\\x49\\xde\\xf5\\x50\\x30\\x8d\\x76\\xe4\\xea\\xc6\\x24\\x80\\xe0\\xd2\\x96\\x43\\xb1\\xfd\\xec\\x74\\xdc\\xe2\\xf2\\x97\\xf5\\x9a\\x37\\x46\\x7a\\xe3\\x56\\x45\\x92\\xb9\\xa2\\xa5\\x18\\xb0\\xf3\\x53\\x2d\\x63\\xf3\\xb1\\x40\\x4c\\x55\\xd4\\x1a\\x46\\x65\\x74\\x00\\xfb\\xf4\\xb8\\x11\\xb2\\x01\\xec\\xa0\\x31\\xb9\\x5d\\x82\\xd3\\x18\\xe0\\xa0\\xe3\\x9d\\x16\\xb8\\x51\\x53\\x25\\x05\\x3a\\x6b\\xaa\\x10\\xe3\\x28\\x2f\\x51\\xe3\\x9b\\x20\\x1b\\x24\\xf6\\x4d\\x1a\\xaf\\x70\\xdd\\x5a\\x85\\x37\\x9d\\xe3\\xa3\\xe3\\x2d\\x42\\xf2\\x3f\\xcb\\x39\\x3e\\x6e\\xf8\\x08\\x73\\xc2\\xe2\\x9e\\xdb\\x4c\\xe3\\x8a\\xab\\x3c\\x4d\\x62\\xa7\\x4a\\xd2\\x5b\\x5c\\x5e\\x52\\xbc\\xc7\\x59\\x0c\\x19\\x57\\x3b\\x52\\x65\\xef\\xc0\\x07\\xb4\\xe6\\xc1\\xeb\\xc6\\xce\\xb9\\xe7\\x6f\\xfc\\x82\\x48\\xaf\\x09\\x25\\x29\\x2a\\x2a\\xbc\\xe6\\x3f\\x2e\\x75\\x3c\\xa9\\x0f\\x5d\\xc3\\xcd\\x24\\xe6\\x3f\\xf2\\x53\\x19\\xe1\\xb5\\x03\\xcc\\x32\\x0e\\xf3\\x6d\\x41\\x62\\xff\\xdc\\xdd\\xe6\\x49\\x8a\\x4b\\x12\\xbb\\xa4\\xd9\\x46\\x55\\x46\\x6f\\xa2\\xaa\\x7a\\xd3\\x84\\x60\\x3a\\x57\\xf8\\xc3\\x11\\xc7\\x09\\x72\\x8a\\x32\\xc9\\xea\\xf3\\xd7\\x93\\x35\\xda\\x35\\x01\\x7b\\xbd\\xc5\\xbb\\xbc\\xc4\\x42\\xdc\\xf8\\x5d\\x72\\x2c\\xf2\\xb2\\x46\\x59\\xbd\\xa1\\x13\\x84\\x03\\x8a\\xf3\\x3b\\x22\\x69\\x01\\x24\\x04\\x17\\xdf\\x11\\xeb\\x48\\x26\\x07\\x57\\x35\\x41\\x2e\\x68\\x82\\x88\\x5b\\xab\\x71\\x4c\\x1d\\x59\\xa7\\xfc\\x35\\x99\\x77\\xd1\\x00\\xff\\xf3\\xa1\\xc4\\xbb\\x5f\\x68\\x07\\xce\\xcc\\x38\\xd7\\x5f\\x38\\x2f\\xbf\\x70\\x50\\x5d\\x97\\x2f\\x1b\\xe8\\xab\\x2f\\x5e\\x7d\\x21\\x06\\x61\\x23\\x32\\x01\\x53\\x6c\\x42\\xf6\\xff\\xff\\xfd\\x17\\xbf\\xa2\\x5b\\x54\\x45\\x65\\x52\\xd4\\xeb\\x2f\\x58\\xc5\\x49\\x0b\\xfc\\xf2\\x0b\\x8d\\xd6\\x17\\x17\\x32\\x21\\xf9\\xc7\\x29\\xaf\\x71\\x13\\x26\\xce\\x9a\\x79\\x7d\\xb9\\x5a\\xad\\x36\\x05\\xda\\x63\\x77\\x5b\\x62\\xf4\\xce\\x4d\\xb2\\x66\\x36\\xb5\\x46\\xb7\\x79\\x12\\x5f\\xea\\x66\\xce\\xd4\\xce\\x3b\\x88\\xe1\\xb8\\x74\\x1a\\xe5\\x12\\xdb\\x6a\\xa2\\xe6\\xa4\\x6e\\x5c\\x1e\\x5c\\xbf\\x09\\xaa\\x47\\x74\\xef\\xde\\x25\\x71\\x7d\\x20\\x53\\x38\\x41\\xa2\\x87\\x70\\x72\\x98\\x4e\\x8a\\x73\\x5e\\x16\\x07\\x94\\x55\\xeb\\xe9\\xe6\\x2e\\x89\\xf3\\xbb\\x6a\\x3d\\xa5\\x20\\x91\\x2a\\xe9\\x16\\x23\\xea\\x65\\xe8\\x76\\x8b\\x4a\\x79\\x3a\\xe4\\x6d\\xeb\\xec\\xad\\x17\\xa1\\x12\\xd7\\x13\\x2f\\x2e\\xf3\\xe2\\x54\\xbc\\x15\\xca\\xb8\\xb9\\xd7\\x79\\xe1\\x42\\xe6\\x74\\xf1\\x52\\xb4\\xc5\\x29\\x20\\x1e\\xdf\\xf7\\x2f\\x9e\\x34\\x64\\xb4\\x11\\x22\\x92\\x21\\x98\\x4e\\x1d\\x4f\\xf8\\xaf\\x83\\x3e\\x4f\\xfb\\x72\\xb7\\xdb\\x69\\x75\\x5c\\x4a\\x1d\\xc7\\x5d\\x65\\xa1\\xe8\\x00\\x70\\x16\\xc7\\xb1\\x40\\xc5\\xb4\\xa0\\xdb\\xa7\\x0f\\xc5\\x21\\x89\\xf2\\xac\\x72\\x0e\\x28\\xdd\\xa5\\x49\\xb6\\xaf\\xc8\\xca\\x8d\\x2f\\xc5\\xd6\\x6f\\xde\\x3c\\xa0\\xac\\x3a\\x24\\x5e\\x75\\x8a\\x50\\x72\\x38\\xe5\\x64\\x1c\\x1f\\xf3\\x18\\xa5\\xd5\\x9b\\x70\\xf1\\x26\\x5c\\x2c\\x67\\x6f\\x62\\x7c\\xcc\\xe9\\x8a\\xed\\x4d\\x47\\xd1\\x6d\\x29\\xba\\x25\\xcd\\xf4\\x7a\\x38\\xaf\\x5f\\xbd\\x5f\\xf2\\xff\\x4f\\xbb\\xdc\\xc3\\xc7\\x2d\\x8e\\x63\\x1c\\xbb\\xcd\\xaa\\xb1\\x71\\xd4\\xc2\\x02\\xf3\\x69\\x9b\\x05\\x97\\x99\\xef\\xb1\\x2d\\xa9\\xa9\\xf7\\xd6\\x52\\x5d\\x77\\x0d\\xd5\\xe5\\x09\\xbf\\x57\\x11\\x56\\xb7\\xfb\\xb6\\xb1\\xea\\x76\\xff\\xd5\\xab\\x8b\\xd7\\xe2\\x03\\x53\\xfc\\x66\\xaa\\x1e\\x14\\xf7\\x1b\\x70\\x79\\xd5\\x6b\\xdf\\xfd\\x1f\\x32\\xc4\\xb9\\x58\\xd0\\x06\\x06\\x5a\\xef\\x98\\xe7\\xf5\\xa1\\x89\\x75\\x28\\xab\\x13\\x94\\x26\\xa8\\xc2\\x31\\x9d\\x8f\\xe4\\xd5\\xbd\\x8a\\xb3\\x2f\\xd1\\x43\\x15\\xa1\\x14\\x0b\\xfd\\x71\\x49\\x9c\\x4b\\xaa\\x77\\x5d\\x04\\x63\\xfe\\xf8\\xef\\xbe\\x1f\\xa2\\x2f\\x44\\xd4\\x22\\x3d\\x55\\x20\\xda\\x56\\x42\\xc3\\xa7\\x92\\x61\\x4d\\xe4\\xd2\\x5c\\xaf\\x1c\\xfa\\x28\\x92\\x2a\\x1f\\x93\\x0c\\x6a\\x24\\x0c\\x83\\x50\\xc2\\x8b\\xd2\\xfc\\x14\\x03\\x78\\x0b\\x3f\\x90\\x99\\xc9\\x6e\\x71\\x9a\\x17\\x18\\x40\\x5d\\xfa\\x2b\\xb9\\x7b\\x38\\x8b\\x92\\x14\\x44\\xdc\\x49\\x88\\xfb\\x14\\x55\\x00\\x8f\\xd8\\x57\\xda\\x3e\\x9e\\xaa\\x24\\x02\\xf1\\xe4\\xbe\\xd0\\x29\\x1a\\x88\\x38\\x95\\x10\\x0f\\x18\\x95\\x35\\x88\\x37\\x97\\x09\\xd6\\xa8\\x04\\xd1\\x16\\x1a\\x9a\\x8b\\x8f\\x45\\xfd\\x00\\x22\\x2f\\x25\\xe4\\x53\\x85\\x61\\x9a\\x37\\x12\\xda\\x2e\\x49\\x8f\\x20\\x9a\\x2c\\xeb\\xfa\\xe0\\xa6\\xa8\\xdc\\x03\\x6a\\xc1\\x7e\\xe0\\x2b\\xa8\\x20\\x52\\xa0\\xd1\\x4b\\x2a\\x50\\x36\\x8a\\xe1\\xe4\\x80\\xa5\\x63\\x3f\\x90\\x05\\x5d\\xe2\\x63\\x7e\\x0b\\x33\\x37\\x93\\x10\\x7f\\xcb\\xf3\\xa3\\x9b\\x64\\x20\\xe6\\x5c\\xc7\\xcc\\x4f\\x30\\x8b\\xb2\\x5e\\xf2\\xdd\\x0e\\xc4\\x92\\x15\\x52\\x25\\xfb\\x0c\\x01\\xe6\\x8a\\xfd\\x40\\x56\\x49\\x94\\xef\\x41\\x2c\\x45\\x23\\x25\\xaa\\x40\\x49\\x87\\xb2\\x3a\\x0e\\xf9\\x11\\x14\\x4c\\x18\\xa8\\x76\\x00\\xa3\\xc9\\xda\\xa8\\x13\\x03\\x35\\x45\\x1f\\x39\\x02\\x06\\x3b\\xf6\\x43\\x59\\x1b\\x71\\x7e\\x97\\xa5\\x39\\x8a\\x5d\\x94\\x82\\x72\\x0e\\xe7\\x20\\x3a\\x88\\x2a\\xab\\xe4\\x54\\x18\\x11\\x65\\xad\\x24\\xd9\\x36\\xbf\\x07\\xf1\\x6e\\x14\\x5f\\x8a\\x1e\\xdc\\x28\\x29\\x23\\x83\\x98\\x56\\x8a\\x3d\\x16\\x18\\x81\\x5d\\x9a\\xfa\\x0a\\xe2\\xae\\xc4\\xb0\\x1e\\xa7\\xb2\\x82\\x9a\\xe1\\x62\\x92\\xd3\\x54\\x56\\x52\\x13\\xc8\\x40\\x34\\x59\\x49\\xbb\\x14\\x81\\x86\\x36\\x9d\\xa9\\x4e\\x2c\\x2e\\x0e\\x79\\x86\\x41\\x17\\x3a\\x95\\x55\\x74\\x9b\\xa7\\xa7\\x23\\x36\\x8d\\x88\\xe9\\x02\\x42\\x6e\\xd4\\x0a\\x62\\x2f\\x21\\xec\\x53\\x01\\xe2\\xca\\xda\\xfa\\x47\\x19\\xe5\\x31\\xa8\\xa8\\xa9\\xac\\xa8\\x2d\\x32\\x62\\xce\\x14\\xb7\\x06\\x0b\\x6b\\x16\\xa8\\x58\\xa0\\x98\\x66\\xb2\\x86\\xb6\\x39\\xec\\xd6\\x66\\x53\\x0d\\xed\\x88\\x4a\\x18\\x55\\xd6\\x12\\x59\\xdf\\x82\\x78\\xb2\\x82\\x22\\x74\\xc4\\x25\\x02\\x11\\x65\\xe5\\x90\\x94\\x1c\\x84\\xb6\\x54\\x58\\x4c\\xc1\\x61\\x36\\x93\\x15\\x42\\x73\\xb9\\x20\\xa2\\xe2\\xd6\\x9a\\xf5\\x2f\\x9b\\x3c\\x01\\xd8\\x73\\x5f\\xc7\\xa6\\x2b\\x40\\x08\\x59\\xd6\\x0d\\xc9\\xda\\xba\\x29\\xde\\xc1\\x94\\x43\\x00\\x39\\xc2\\x59\\x0d\\x87\\xd1\\xf9\\x14\\x40\\x2f\\x8d\\x6c\\xcf\\x00\\xec\\x5f\\x4f\\x55\\x9d\\xec\\xc0\\x58\\x3e\\x9f\\x6b\\x63\\x1f\\x44\\x5b\\x28\\xbe\\x2c\\xc6\\x59\\x6d\\xee\\xa1\\xea\\xf9\\x08\\xb6\\x99\\x67\\x65\\xa2\\x80\\x22\\xdc\\x78\\x7f\\x97\\x7c\\x9b\\x00\\x2b\\x28\\xd3\\xb3\\x24\\xaa\\x4f\\x25\\x38\\xb4\\x16\\xb2\\x16\\x8f\\xa8\\x70\\x1b\\x33\\x87\\x25\\xbd\\x50\\x14\\x43\\xbf\\xd9\\x40\\x88\\x53\\x25\\x54\\xc1\\x06\\xbc\\x90\\x75\\x81\\xe3\\x04\\x46\\x53\\xa6\\x68\\x07\\x64\\xe8\\x8b\\xac\\x03\\x92\\x6a\\x05\\xf1\\x64\\xe9\\x9b\\xe6\\x2b\\x8b\\x1b\\x65\\xca\\x87\\x0b\\xb7\\x59\\xe5\\xdf\\xa1\\x12\\x1c\\x67\\x8b\\x95\\xa2\\xa5\\xaa\\xb6\\xe2\\x2f\\x7d\\xc5\\xff\\x59\\x50\\x03\\x2d\\x02\\x82\\x68\\xb2\\x7e\\x0a\\x74\\xaa\\xc0\\x9e\\x2d\\xa7\\x4a\\xcf\\x72\\xd0\\x93\\x2f\\x67\\x8a\\x1b\\x2a\\x8d\\xfc\\xcd\\xf5\\xae\\xdb\\xd0\\xd5\\xc9\\x34\\x2e\\xac\\xe8\\xb2\\xbe\\xf0\\xaf\\x38\\x02\\xed\\x64\\x79\\xa3\\xea\\xff\\xb6\\xcc\\xcd\\x6e\\x66\\xb9\\x02\\xd1\\x8d\\xa3\\xf0\\xc6\\xd7\\x96\\x74\\x64\\x26\\x09\\xe2\\x06\\xfa\\xd2\\xcc\\x8c\\x1c\\x02\\x33\\x68\\x33\\xf6\\x54\\x99\\x94\\x9b\\x31\\x65\\xfd\\xfd\\xe3\\x84\\xab\\x66\\xf9\\x6d\\xc6\\x9f\\x2b\\x5e\\x69\\x97\\x9b\\x71\\x15\\x15\\x46\\x25\\xc6\\x59\\x75\\xc8\\x61\\xc9\\x2d\\xa1\\x0e\\x9a\\xa7\\x70\\x37\\x37\\x6a\\x17\\x2d\\xb8\\xea\\x2c\\x22\\xb3\\x20\\xaf\\x64\\x15\\xa2\\xb2\\xcc\\xef\\x8c\\xf6\\xb1\\x0a\\x00\\x64\\xa3\\x75\\xac\\x42\\x00\\x1b\\x9e\\x21\\xad\\xa6\\x00\\xaa\\x69\\xea\\xb5\\x9a\\xe9\\xce\\xcf\\x34\\xf9\\x5c\\xcd\\x15\\x39\\x93\\x4f\\xeb\\xbb\\x53\\x0a\\xae\\x75\\x56\\x0b\\x08\\x9b\\x7c\\xa3\\x05\\xd1\\x95\\x51\\x78\\x1f\\xa5\\xe8\\x88\\x6c\\x06\\x15\\x28\\x8b\\xfa\\x7d\\x02\\x0a\\x3a\\x50\\xd6\\xf4\\x29\\x46\\xd0\\x94\\x35\\x50\\x56\\xf4\\xbb\\x04\\x8c\\x02\\x81\\xaf\\x04\\x95\\x07\\x4c\\x32\\x87\\x20\\xea\\x5c\\x43\\x8d\\xd2\\x1c\\xf4\\x99\\x81\\x92\\x00\\xb8\\x43\\x65\\x96\\x64\\x7b\\x73\\xd7\\x97\\xaa\\xc7\\xce\\x60\\xb2\\x8a\\xcf\\x42\\x29\\xce\\x62\\x30\\x05\\x11\\x28\\x79\\x80\\x12\\x65\\x71\\x0e\\x25\\x0c\\x02\\x25\\x0b\\x10\\xe5\\xc7\\x23\\x06\\x03\\x70\\xa0\\xa4\\x02\\x8e\\x68\\x9f\\x61\\x18\\x31\\x04\\x7d\\x25\\x68\\xdf\\x81\\x92\\x11\\xe0\\xc8\\x06\\x0b\\x0f\\x94\\xbc\\x40\\x89\\xeb\\x3b\\x6c\\xe0\\x42\\x9d\\x08\\xe4\\x45\\xd1\\x28\\x21\\x82\\x73\\x3b\\x41\\xa0\\xce\\xa3\\x53\\x92\\xd9\\x37\\xa9\\x58\\xc9\\x12\\x30\\x74\\x93\\xf1\\x28\\xa9\\x02\\x36\\x7c\\xf8\\xc6\\x04\\xb0\\x86\\xba\\x32\\x25\\x35\\x0e\\x79\\x99\\xfc\\x96\\x67\\x35\\x5c\\x47\\x4d\\x21\\xc4\\x50\\x84\\x0c\\x94\\x0c\\xc2\\xf6\\x94\\xa6\\x87\\xbc\\x04\\xd9\\x56\\xb2\\x08\\x5b\\x0c\\x8e\\xf6\\x40\\xc9\\x22\\x44\\x4d\\xb7\\x76\\x49\\x84\\x6a\\x50\\x72\\x4a\\x32\\xa1\\x3e\\x9c\\x8e\\xdb\\xca\\x60\\x1d\\x4a\\x26\\x81\\xe1\\x9a\\x8c\\x43\\x49\\x26\\x1c\\x50\\x16\\x1b\\x7d\\x70\\xa0\\x24\\x14\\x08\\xb2\\xc1\\xbb\\x07\\x4a\\x52\\x81\\xe0\\x1a\\x18\\x5e\\xe9\\x98\\x26\\x76\\x95\\x9c\\x02\\x8d\\x44\\x3d\\xa1\\x23\\x50\\xd2\\x0b\\x52\\x25\\x13\\xfb\\x4a\\x9e\\x41\\xaa\\x03\\x77\\x43\\x49\\x39\\x48\\x35\\x8c\\xdd\\x91\\xf5\\xba\\x4f\\xf3\\x2d\\xa8\\x7f\\x25\\xf5\\x70\\x57\\xe2\\x0c\\xcc\\xca\\x06\\x4a\\xda\\xa1\\x46\\xd5\\x3b\\x68\\x91\\x1e\\x28\\x09\\x87\\x5d\\x92\\xc2\\x8b\\xbf\\x40\\xc9\\x36\\x6c\\xcb\\x04\\xef\\x22\\x04\\x8f\\x6f\\x25\\xe1\\xd0\\xc4\\x45\\x3a\\x6f\\x81\\x90\\x95\\x9c\\x43\\x8c\\xaa\\xc3\\x36\\x87\\x27\\xa8\\x81\\x92\\x79\\x28\\x50\\x81\\xcb\\x28\\x4d\\x40\\x35\\x28\\xe9\\x07\\x92\\x97\\x36\\x66\\x92\\x03\\x25\\x0b\\x91\\x26\\x19\\xb4\\xa2\\x09\\xd4\\x0c\\xc4\\x21\\x87\\xa3\\x8d\\x92\\x81\\x28\\x4e\\xd5\\xa1\\x00\\x53\\xb0\\x81\\x92\\x82\\x38\\x55\\x70\\xc7\\x65\\xe9\\xef\\xb7\\x70\\x97\\x65\\xb9\\x57\\x39\\xec\\xad\\x95\\x84\\x42\\x83\\xe6\\x6e\\x1f\\x5c\\x94\\x16\\x07\\xb4\\x85\\x03\\x82\\x92\\x56\\x50\\xab\\x18\\xe6\\x49\\x81\\x92\\x60\\xe0\\xd5\\xe8\\xb7\\x57\\x08\\x7f\\x6a\\xc6\\x37\\xb6\\x31\\x83\\x59\\xab\\xeb\\x32\\xd9\\x9e\\x6a\\x30\\x85\\x17\\x28\\xc9\\x06\\xbd\\x92\\xb1\\x35\\x45\\x5d\\x19\\x59\\xfc\\x62\\x50\\x69\\x73\\x75\\x22\\x57\\xa0\\x0c\\x46\\x54\\x93\\xe1\\xf4\\x43\\xb8\\xd1\\x5b\\x28\\x59\\x87\\x16\\x1f\\xf6\\x47\\x4a\\xe6\\x21\\xcd\\xf7\\xf0\\xd7\\x80\\x60\\x11\\xa8\\xb9\\x52\\x30\\x4b\\x1b\\x2c\\xd4\\xd4\\xeb\\xde\\xf0\\xd1\\x20\\x50\\xd2\\x13\\x19\\xbe\\x73\\xef\\x92\\x2c\\xce\\xef\\x40\\x64\\x75\\x7a\\x12\\xe5\\xb0\\x17\\x50\\xd3\\x14\\x08\\x4c\\x2b\\x04\\x4a\\x96\\xc2\\x34\\xbd\\x50\\x92\\x14\\x0d\\x35\\xb8\\x55\\x25\\xbb\\x47\\xb6\\x0a\\x80\\x88\\x2b\\x55\\xed\\x06\\x44\\x25\\x2f\\x51\\x61\\xd8\\x3a\\x96\\xaa\\x5a\\xf2\\xa2\\x78\\x70\\x63\\xf0\\x7b\\x28\\x0e\\x94\\xd4\\x04\\xc3\\x36\\xf6\\x6a\\xa9\\xe6\\xc7\\x09\\xba\\xf1\\xdb\\x52\\xa0\\xa6\\x2a\\x3a\\xf2\\x20\\xf6\\x1c\\xc2\\x36\\x69\\x42\\xc9\\x56\\x44\\x25\\x8e\\x93\\xba\\x99\\x73\\xc2\\x9c\\xcb\\x7a\\xa3\\x1b\\x21\\x61\\xb7\\xa2\\xe6\\x2b\\x4e\\x75\\x8a\\x4b\\x30\\x0c\\x28\\xa9\\x0a\\xba\\x39\\x07\\x42\\xbc\\xd1\\xa6\\xfe\\x45\\x89\\xab\\x0a\\x16\\xb2\\x92\\xa4\\xc0\\xa8\\x34\\x06\\x0e\\x25\\x45\\x41\\xf0\\x4c\\xbe\\x48\\x49\\x50\\xd4\\xf9\\x9d\\x81\\x57\\xc5\\x43\\xd6\\xa8\\x06\\x9d\\xa2\\x92\\x96\\xa8\\x62\\x63\\xde\\x33\\x50\\xb2\\x12\\x07\\x1b\\xaa\\x32\\xbe\\x4e\\x5b\\xb2\\x11\\x0b\\xe6\\x40\\xc9\\x04\\x92\\x5d\\x3e\\x55\\x8d\\x4b\\x03\\x69\\x35\\xde\\x9d\\xc8\\x8c\\x31\\xdd\\x82\\xba\\x5d\\xa9\\x61\\xaf\\xc1\\x9e\\xbb\\x01\\x88\\xab\\xc6\\xbb\\x06\\x77\\x61\\xc0\\x55\\x83\\x5c\\x83\\xbb\\x34\\xe0\\x2a\\x73\\x43\\x7e\\x1c\\xc1\\x35\\x7c\\xf2\\x08\\x56\\xaa\\x53\\xdc\\x27\\x55\\x4d\\xf7\\xc9\\x99\\xeb\\x28\\x9f\\x3f\\xd2\\xfc\\x14\\xdb\\x3e\\x24\\x06\\x4a\\xc6\\x81\\x56\\x30\\x7e\\x4e\\x0c\\x56\\x37\\xca\\xc8\\xc3\\xd8\\x8d\\xf2\\x2c\\x31\\x8c\\xbe\\x95\\xfa\\x11\\x17\\x63\\x37\\xc6\\x51\\x12\\x9f\\x72\\x68\\x1b\\x05\\x0e\\x7d\\x65\\x6c\\x41\\x4c\\x84\\x4a\\xca\\xa3\\xf1\\x40\\xa6\\x0f\\xba\\xa1\\x92\\xf7\\x68\\xfc\\x8f\\x19\\x57\\x99\\x08\\xe2\\x5b\\x9c\\xc2\\x81\\x35\\x54\\x12\\x20\\x8d\\x32\\x41\\x34\\x65\\x2e\\x88\\x2a\\x70\\x6d\\x17\\x2a\\x89\\x0f\\x94\\x62\\x30\\x6c\\x84\\x4a\\x7a\\x02\\xff\\xe3\\x44\\x8e\\x89\\x40\\xb2\\x0f\\x95\\x0c\\xc5\\x3b\\xb2\\x73\\x19\\x40\\x0b\\xd4\\x04\\x26\\xe8\\xa1\\xd5\\x0d\\x2e\\x05\\x02\\xe7\\x27\\xa1\\x92\\x97\\xd8\\x26\\xd5\\x01\\x4c\\x7c\\x87\\x4a\\x46\\xe2\\x5d\\x66\\x58\\xb9\\x85\\x4a\\x42\\x62\\x8b\\xb6\\x0f\\xee\\x2e\\x2f\\x8f\\xa7\\x14\\xfa\\xae\\x17\\x2a\\xf9\\x88\\x1a\\xcc\\xca\\x84\\x8b\\x9d\\xbc\\x77\\x68\\x9b\\xa2\\xe8\\x9d\\x69\\xed\\x11\\x2a\\x69\\x88\\x2d\\xe8\\xea\\x43\\x25\\xf5\\x80\\x8a\\x02\\x32\\xb3\\xdd\\xcd\\x4e\\xde\\xae\\x83\\x4b\\x78\\x29\\x15\\x2a\\x09\\x87\\x43\\x7e\\x2a\\x0d\\x5b\\x7b\\xc2\\x69\\x20\\xef\\x71\\x4a\\xd1\\x11\\x14\\xba\\x92\\x71\\x88\\x4f\\x45\\x6a\\xca\\x37\\x84\\x4a\\xbe\\xa1\\x48\\xf6\\xfb\\x07\\x77\\x8b\\xc0\\xc5\\x51\\xa8\\x24\\x1c\\xaa\\x28\\xa9\\xaa\\xbc\\x04\\x87\\xb8\\x92\\x6d\\xd8\\x26\\x75\\x94\\x83\\x93\\xd2\\x50\\x49\\x35\\x6c\\x6b\\xe8\\x8b\\xaa\\x8a\\x75\\xbf\\x05\\xad\\x48\\xc1\\x7a\\x80\\x8c\\xdc\\xf7\\x91\\xdc\\x8d\\x5f\\xa1\\x51\\xad\\x61\\x95\\xa7\\x2d\\xa4\\xe8\\xd0\\xdf\\xc6\\x2a\\xde\\x00\\x2c\\xb2\\x03\\x0e\\xea\\x81\\x92\\xf6\\x48\\x22\\xec\\xa6\\x79\\x9a\\x82\\x7e\\x47\\xc9\\x76\\xb4\\xb8\\x6e\\xdd\\x78\\x20\\xd0\\x7a\\x95\\x64\\x07\\x8e\\x4f\\x11\\xdd\\x92\\x0d\\xe1\\x2a\\x9f\\x47\\xc8\\x19\\x31\\x7b\\x92\\x2d\\x54\\xd2\\x1c\\xac\\x8e\\x25\\x95\\x17\\x2a\\x09\\x8f\\x23\\xce\\x4e\\xee\\x01\\x1d\\xb7\\xa7\\x72\\x0f\\x7b\\x3c\\x25\\xf1\\x41\\xb6\\x57\\x9a\\x17\\x1d\\xa1\\x92\\xff\\xc8\\xa1\\xcd\\x75\\x38\\x54\\x92\\x1f\\xfb\\x12\\xc1\\xc6\\xaa\\x24\\x3e\\xaa\\x53\\x46\\x06\\x2b\\x38\\xd9\\x09\\xd5\\xcd\\x16\\xfc\\x88\\x1e\\x88\\x1b\\xe8\\xb8\\x74\\xf7\\x33\\x84\\x1c\\xea\\xc8\\xc2\\x26\\x7e\\xa8\\x86\\xa2\\xcb\\xed\\xaf\\x38\\xaa\\xd9\\x27\\x7b\\xf8\\x9b\\x65\\xa8\\x64\\x42\\xa4\\x2a\\xec\\x28\\x18\\x54\\x6b\\x6e\\xae\\x65\\x37\\x1d\\x25\\x4f\\x22\\xd5\\x34\\xe4\\xee\\x42\\x65\\xdf\\x86\\x54\\xc7\\x66\\x74\\x4a\\xb6\\x45\\xaa\\x67\\x4a\\x2e\\x86\\xea\\xa6\\x8e\\x32\\x41\\xd9\\x3e\\xc5\\xe6\\x0a\\xea\\xbe\\x0e\\x5e\\xc1\\xd4\\x1b\\x25\\x07\\xd3\\xe2\\x9b\\xa5\\xad\\xa4\\x5f\\xda\\x1a\\x06\\x95\\xce\\xd5\\xc9\\x69\\x56\\xe5\\xb0\\x1b\\x52\\x73\\x2e\\xa7\\x02\\x97\\xec\\x1c\\x05\\x84\\x3d\\x57\\x57\\x00\\x16\\xdc\\x85\\x3e\\xde\\x8d\\x02\\x59\\xea\\xb8\\x66\\x69\\xdf\\xe8\\xc8\\x86\\xfc\\x4a\\xa8\\xe4\\x57\\x08\\x2e\\x3c\\x05\\x5c\\xf8\\x5f\\x5c\\xbe\\x7e\\xe2\\xf3\\x64\\x17\\xe5\\xbc\\xce\\x13\\x53\\xef\\x0e\\x12\\xd3\\x93\\x8b\\x7e\\xd1\\x1d\\xf5\\xaa\\x51\\xe1\\x1e\\x92\\xfd\\x21\\x25\\x6b\\x12\\xfd\\x18\\x2c\\x39\\x30\\x2c\\x6e\\x17\\x3f\\xe0\\xf4\\x16\\x37\\xe3\\xc8\\xc9\\xf0\\x09\\x4f\\xfe\\x33\\xff\\x73\\xf2\\x4d\\x99\\xa0\\x74\\x22\\x9c\\x51\\x16\\x5a\\x9c\\x15\\xf7\\xf2\\x86\\x71\\x6f\\x16\\xde\\xcc\\x97\\xc1\\x6c\\xca\\xce\\x41\\x7e\\x39\\x9d\\x4e\\x37\\xe0\\x39\\x0f\\xf9\\x90\\xa5\\x7a\\xb6\\x52\\xe4\\x8c\\x9f\\xac\\xec\\xda\\xe5\\x25\\x62\\xd3\\xfc\\xc4\\x25\\x3a\\xb7\\x2d\\x2f\\xd1\\x76\\xb9\\x51\\x8f\\x24\\xd1\\x33\\xc2\\x6b\\x72\\x2e\\xb1\\x3d\\x03\\xcc\\xaa\\x84\\xd3\\x79\\xb8\\x8c\\xb4\\x2a\\xc2\\x29\\x26\\x5a\\xaf\\x3d\\x33\\x3c\\x2f\\xee\\x1d\\x74\\xaa\\x73\\xa7\\xdb\\x27\\x1f\\x9d\\x2a\\xb7\\x24\\x5f\\xd8\\x1a\\x9a\\x1b\\x86\\xe9\\xe6\\xbb\\x5d\\x85\\xeb\\xb5\\x1b\\x16\\xf7\\xca\\x29\\x59\\x9f\\x1c\\x06\\x52\\x4e\\xe7\\x1e\\x93\\x38\\x4e\\xf1\\xc5\\x8b\\x50\\x99\\x9f\\x2a\\x9c\\xd2\\x33\\x87\\x6f\\xbd\\xa4\\xc6\\xc7\\xb7\\xe8\\x6d\\x72\\xdc\\x4f\\x60\\x18\\x81\\x24\\xc7\\xbd\\x5b\\xe2\\xaa\\xc8\\xb3\\x2a\\xb9\\xc5\\x13\\x8f\\x7c\\x30\\xca\\x50\\x92\\x3a\\xac\\x6a\\x5b\\xd0\\xfc\\x29\\x9f\\xe9\\xde\\xc8\\xc7\\x92\\x36\\xe2\\x61\\x45\\x4a\\xb8\\x51\\x24\\x8e\\xf9\\xa1\\x9f\\x12\\xc5\\xc9\\xa9\\x5a\\x2f\\x8a\\x7b\\x0a\\x6e\\x49\\xc3\\x07\\xc0\\xcd\\xd4\\xdb\\xc3\\x97\\x16\\xa3\\x02\\x2d\\x49\\x3f\\x19\\xf8\\x65\\x1c\\xc7\\x1b\\x99\\xbf\\x99\\x38\\x36\\x9a\\x71\\x40\\x8f\\x55\\xa0\\x34\\x75\\xbc\\xb0\\x72\\x30\\xaa\\xb0\\x9b\\x64\\x6e\\x7e\\xaa\\x37\\x6e\\xde\\x87\\x61\\x07\\x53\\x39\\xd0\\x8f\\x45\\x8a\\x94\\xe6\\xfe\\x8b\\xcb\\xa1\\x64\\x9a\\x27\\xce\\x3b\\x6c\\x06\\x2d\\xfb\\x9b\\xb9\\x7f\\x52\\xc4\\x0f\\x31\\x6e\\xba\\xf3\\x59\\x62\\x07\\x31\\xc6\\x17\\xaf\\x2a\\xdd\\x3c\\x4b\\x1f\\xba\\x43\\x22\\x68\\x5b\\xe5\\xe9\\xa9\\xc6\\x1b\\x26\\xe1\\xe2\\x9e\\x0b\\xb8\\xf9\\xd9\\x9d\\x90\\x64\\x96\\xe7\\x36\\xa5\\xca\\x11\\xee\\x0d\\xf9\\x08\\x53\\xe2\\xa8\\x7e\\xe9\\x4f\\xc8\\xbf\\x57\\xdd\\x81\\x4a\\xde\\x22\\x35\\x73\\xd4\\xcc\\x93\\xd9\\x61\\x7a\\x00\\x42\\x47\\x4a\\xcb\\x1b\\xbd\\xcd\\x82\\x71\\x46\\xf4\\x2d\\xea\\xbe\\x3d\\x4b\\xad\\x9e\\x94\\xa6\\xfc\\x10\\xeb\\xfb\\xb9\\xcc\\xd3\\xf6\\x00\\xf4\\x59\\x39\\xc1\\xec\\x1d\\x82\\x89\\x77\\x08\\x27\\xde\\x61\\x3a\\xf1\\x0e\\xb3\\x89\\x77\\x98\\x4f\\xbc\\xc3\\x62\\x72\\x08\\x26\\xf4\\x38\\xdd\\x61\\x36\\x39\\xcc\\x27\\x87\\x85\\xd9\\xb5\\xb0\\x43\\x30\\x73\\xf5\\x10\\x8c\\x17\\x28\\x87\\xba\\xbd\\x43\\xe0\\x78\\x64\\xd3\\xc7\\xa4\\xf9\\xc9\\x7f\\x85\\x5d\\x61\\xd8\\x16\\x4e\\xbb\\xc2\\x69\\x5b\\x38\\xeb\\x0a\\x67\\x6d\\xe1\\xbc\\x2b\\x9c\\xb7\\x85\\x8b\\xae\\x70\\xc1\\x0a\\xbb\\xc6\\xdb\\xb6\\xbb\\xa6\\xdb\\x96\\xbb\\x86\\xdb\\x76\\xbb\\x66\\xdb\\x56\\xbb\\x46\\xdb\\x36\\xbb\\x26\\x79\\x8b\\x67\\xfb\\x11\\x21\\x36\\x10\\x97\\xcb\\xa5\\xa4\\x04\\x2e\\xf8\\x1e\\x63\\x6f\\x82\\xd6\\x63\\x05\\x7a\\xad\\x44\\x84\\xd8\\xb9\\x98\\xbf\\xb8\\x48\\x66\\xc3\\xad\\x45\\xe0\\x3e\\x30\\x72\\xff\\x38\\x7d\\x3e\\x4a\\x2d\\xfc\\xb2\\x07\\x22\\xfb\\x43\\x20\\x14\\x4e\\x89\\x4b\\x6e\\x74\\x10\\x8a\\xa5\\x94\\xe3\\x69\\xa3\\x19\\xe1\\x26\\x8a\\x19\\xed\\xc7\\xe4\\x30\\x13\\x27\\x14\\x37\\xa4\\x74\\x3e\\x39\\xcc\\xcf\\x72\\xd0\\xbf\\x10\\x19\\x2d\\xc4\\xd2\\x26\\xb0\\x15\\x6d\\x4c\\x73\\x7c\\x87\\xca\\x26\\xc5\\x28\\x3e\\x03\\xfe\\x4d\\xa8\\xb9\\xe0\\x7f\\x0a\\xf7\\xec\\x2a\\xfe\\xff\\x42\\xcf\\x41\\xbf\\x3c\\x26\\x19\\x8b\\x1e\\xcb\\xc5\\x4d\\x71\\xff\\xea\\x4c\\xe9\\x0b\\x1d\\x09\\x8a\\xfb\\xcb\\x85\\x49\\x4a\\xbb\\x3b\\xa3\\x11\\xd3\\x11\\x95\\xef\\x26\\xe4\\xd6\\x8d\\xf6\\xe0\\x79\\x88\\x8f\\x50\\x64\\x89\\x76\\x37\\x78\\x7a\\xf1\\xc8\\x6c\\xa0\\x99\\xb8\\xd2\\xd3\\xcd\\x34\\x3e\\x37\\x7f\\x33\\x10\\x99\\xa7\\x8a\\x30\\x52\\xc0\\x80\\x74\\x0b\\xb6\\x08\\xa5\\x25\\x0c\\xcc\\x36\\x51\\x8b\\x70\\x56\\xc4\\x10\\xb2\\xfc\\xae\\x44\\xc5\\xf9\\xee\\x90\\xd4\\x98\\x1c\\x49\\xc7\\x6b\\x5a\\xc4\\xf9\\xca\\xef\\x70\\x19\\xa1\\x0a\\xab\\x77\\x48\\xb4\\x00\\x86\\x78\\x2a\\x0a\\x18\\xb1\\x05\\x70\\x8e\\x51\\x41\\xb6\\xbb\\xff\\xa6\\x61\\x76\\x10\\x86\\x7a\\x3c\\xd5\\x38\\x3e\\x8b\\xe3\\x9f\\x14\\x17\\x65\\x42\\xae\\x8a\\x91\\xe6\\x61\\x17\\x24\\x01\\xf9\\xfc\\x4b\\x2e\\x94\\x27\\x63\\x37\\x0b\\x7f\\xe5\\x33\\x9a\\xd5\\x29\\x8a\\x70\\x55\\xb5\\x34\\xa3\\xe5\\x62\\x1a\\x73\\x9a\\x0c\\x28\\xd3\\xe4\\x85\\x32\\xcd\\xed\\x7c\\x16\\x46\\x8c\\x66\\x92\\xed\\xf2\\x96\\x60\\xb0\\xf4\\x6f\\x76\\x9c\\x60\\x03\\x91\\xa9\\x91\\x12\\x99\\xd4\\x6c\\x1e\\x2e\\x56\\x8c\\x14\\xdb\\xda\\xc6\\x61\\x37\\x68\\x11\\x4f\\xb7\\x9c\\x1a\\x03\\xca\\x04\\x79\\xa1\\x44\\x73\\xb1\\x98\\x07\\x2d\\x7b\\x31\\xca\\xf6\\x1d\\x08\\xad\\x66\\xb3\\x59\\xc8\\x49\\x52\\x98\\x4c\\x91\\x95\\x49\\x04\\x6f\\x66\\xd3\\xf9\\x74\\x76\\xf1\\xb6\\x7b\\x55\\x2b\\x64\\xde\\xa4\\xd9\\x7c\\xab\\xab\\xae\\x42\\xdb\\x88\\x50\\x44\\xdb\\xd0\\xab\\x73\\x95\\x6d\\xf7\\xad\\xc2\\x74\\xa4\\x78\\xb7\\xf3\\xe3\\x1b\\xda\\x86\\xaa\\x39\\xa1\\xc8\\xd4\\x46\\x14\\xe0\\x70\\x3b\\x25\\x6d\\x10\\x05\\x02\\x0d\\xac\\x70\\xbc\\x63\\x9d\\x90\\x34\\xc9\\xff\\x36\\x91\\x46\\xbb\\x78\\xd5\\xcc\\xab\\xb6\\xfb\\x56\\xa1\\x46\\xb7\\x80\\x04\\x2c\\xb1\\x01\\x59\\xaf\\x40\\xf5\\x25\\x8e\\xb6\\x73\\xd2\\x06\\x53\\x30\\x80\\x13\\xc6\\x38\\xc6\\xb4\\x09\\x45\\xd3\\x5d\\x89\\xa9\\x01\\x3c\\xdb\\xae\\xb6\\xab\\x8b\\x47\\xee\\x08\\xa0\\x5f\\x3d\\xb9\\xa7\\xe3\\x0e\\x78\\xd5\\xc6\\xb1\\xf5\\xcc\\x2f\\xee\\x1d\\xdf\\x11\\xa6\\x9c\\xe2\\x95\\x47\\xc2\\x64\\x33\\x4f\\x27\\xa7\\x54\\x8c\\x86\\x3e\\x14\\x0a\\xf3\\xd4\\xc9\\xd3\\x49\\x9e\\x3a\\xa7\\x06\\xdd\\x21\\x95\\x9c\\xae\\x1e\\x43\\xf5\\x2f\\x1e\\x39\\x0f\\x76\\xca\\xc8\\x49\\xe4\\xf6\\xee\\x0e\\x9a\\x1e\\x68\\x9c\\x7f\\xd5\\x1d\\x52\\xce\\x30\\xc3\\xa6\\xcb\\x08\\x15\\x97\\x51\\x26\\x7f\\xb9\\x73\\xb2\\x72\\x30\\x57\\x7e\\x9b\\x26\\xf0\\xaa\\x84\\x13\\xa5\\x39\\x87\\x79\\x37\\x59\\xa6\\x84\\xe7\\xc5\\xfd\\x25\\xb6\\xf6\\xbe\\x11\\xe0\\x25\\x8e\\x27\\xb1\\x7c\\x99\\x4d\\xb7\\x74\\xb9\\xc4\\xb5\\x7e\\x63\\x54\\x1b\\x19\\x69\\x67\\xcc\\x51\\x2e\\x4e\\x85\\x9c\\x9a\\xd3\\x90\\x4a\\x73\\x54\\x93\\x28\\xc4\\xe7\\xfa\\x0b\\x1f\\x9c\\xcc\\x63\\x54\\x52\\x34\\x35\\x40\\xd1\\x82\\xb6\\x02\\x4e\\xd3\\xa4\\xa8\\x92\\x6a\\x03\\x85\\x1a\\xa5\\x79\\x99\\xed\\xe0\\xa6\\xe9\\x3b\\xbd\\xb7\\x23\\x46\\x35\\x72\\xf3\\x32\\xd9\\x27\\x19\\x4a\\x5d\\x7a\\x8b\\xc7\\x44\\xbc\\x56\\x8b\\xcd\\xda\\x0f\\x38\\x2d\\x00\\x7b\\xa3\\x57\\x6c\\x39\\x34\\x96\\x24\\x59\\x42\\x0e\\x99\\x57\\x47\\x21\\x84\\xaf\\xfc\\x17\\x1b\\x63\\x00\\xeb\\x6e\\xf4\\x68\\x63\\x7b\\x63\\x95\\x8e\\x30\\xed\\x24\\x33\\x13\\x75\\x02\\xb2\\xf4\\xe6\\x9d\\xf9\\x73\\x85\\x8b\\xc6\\xdf\\x11\\x76\\xf2\\x74\\x9d\\xa2\\xaa\\x76\\xa3\\x43\\x92\\xc6\\x13\\x01\\x50\\x18\\xca\\x4f\\x62\\x05\\x6d\\x20\\x08\\x88\\x6c\\xd2\\x22\\x94\\xb0\\xeb\\xd9\\x84\\x12\\x3a\\xa3\\x91\\xd7\\xeb\\xd2\\xdd\\x60\\x3d\\xd9\\x98\\x46\\xb0\\x5a\\x93\\x2c\\x3b\\xa5\\xb7\\x0c\\x00\\xc0\\xad\\xee\\x5f\\xfd\\x3d\\xf4\\x83\\x99\\xf3\\x77\\xdf\\xff\\xc6\\xff\\xea\\xe2\\x75\\xe8\\x6e\\x89\\x6f\\x71\\x59\\x89\\x14\\xbc\\xe2\\x94\\xa6\\x6c\\xce\\x24\\x8f\\xba\\x40\\x1b\\x76\\xbe\\x6e\\xb4\\x7c\\x39\\xcd\\xc7\\xa9\\xa0\\x25\\x49\\x81\\x3e\\xc4\\x86\\xd2\\x5f\\x08\\x43\\xee\\x38\\x84\\x61\\x10\\x99\\xd0\\x2f\\xa3\\x58\\x45\\x1c\\x93\\x84\\x45\\x1c\\x58\\xd8\\xa0\\x84\\x79\\x9b\\x34\\xdf\\x68\\xe9\\x99\\x19\\x41\\x24\\x60\\xed\\x97\\x0d\\x45\\x6a\\xc5\\xd6\\x2b\\xf9\\x3a\\x9e\\xaf\\x88\\xed\\x38\\xc4\\x8e\\xbe\\xba\\xa0\\x38\\x2e\\x9b\\xb9\\x83\\x71\\xd9\\x20\\xde\\x5f\\x61\\x70\\xb7\\xf6\\x2b\\xe0\\xfe\\x8c\\xb3\\x34\\x9f\\xfc\\x39\\xcf\\x50\\x94\\x4f\\xbe\\x23\\xd9\\x71\\x54\\x4d\\xa2\\xfc\\x54\\x26\\xb8\\x74\\x32\\x7c\\xd7\\x5d\\x0d\\x47\\x28\\xb5\\xfe\\x24\\x2c\\xee\\x9d\\x99\\xe4\\x3d\\x1a\\x8f\\xc4\\xa7\\x26\\xcb\\x70\\x3e\\xc3\\xd0\\x52\\x62\\xb5\\x0b\\x77\\x33\\x3d\\x23\\x75\\x79\\xb7\\x8d\\x87\\x91\\x36\\x4d\\xd7\\xa6\\x0a\\xd1\\xa9\\x90\\xe6\\x12\\xae\\x6c\\x4a\\xb2\\x0a\\xd7\\x8e\\xef\\xb8\\x01\\x09\\xf7\\xe5\\x7e\\x8b\\x58\\x7a\\xc7\\x0b\\xe7\\xaf\\x36\\x83\\x31\\x1b\\x86\\x1d\\x91\\x69\\xf1\\x3a\\x43\\x92\\xd0\\x53\\xaf\\x42\\x35\\xdc\\x2c\\xa5\\xde\\x27\\x45\\x2e\\xf1\\x93\\xfd\\x1a\\x6f\\x62\\x45\\xbc\\xb3\\xb2\\xb0\\x14\\x9b\\x9d\\x0e\\x4a\\x42\\xdf\\xe5\\x65\\x4c\\xef\\x4c\\x5a\\xb3\\x9b\\x93\\xd2\\x94\\x16\\x36\\x31\\x8e\\x95\\x35\\x7f\\x43\\xfa\\x9b\\x37\\xff\\x80\\x3c\\x63\\x14\\x45\\x80\\x56\\x8b\\x12\\x3b\\x92\\xd5\\xf8\\x40\\xee\\x5a\\x4a\\x29\\x49\\x51\\xb7\\x28\\x31\\xe1\\x49\\x67\\x44\\x48\\xe0\\x2b\\xcd\\xfa\\x17\\xaf\\xa9\\x56\\x45\\x65\\x9e\\xa6\\xe4\\x4e\\xa6\\x23\\xba\\xe7\\x02\\x99\\xce\\xc4\\xb9\\x81\\xfb\\xb0\\xa6\\x68\\x17\\xaf\\x19\\x7e\\x28\\x11\\xae\\xe6\\x33\\xba\\xe2\\xa0\\xd3\\x01\\xc3\\x11\\xd2\\x76\\x14\\x85\\xe4\\xe8\\x8c\\x33\\x98\\xae\\x29\\x56\\x3e\\x27\\xb3\\x06\\x0d\\x7f\\xb5\\x0a\\x41\\xfc\\xd5\\x12\\xc6\\x0f\\x42\\xdf\\x07\\x2b\\x04\\x01\\xad\\xd1\\x01\\xdc\\x5d\\x7a\\x4a\\xe2\\x27\\xeb\\xaa\\x57\\xe6\\x77\\x67\\x09\\xcf\\x15\\xab\\xd2\\x19\\x69\\x53\\xd2\\xb0\\x90\\xba\\xe9\\xde\\x0d\\x26\\xed\\x2f\\xbf\\xfb\\x29\\x94\\x86\\xed\\xcf\\xee\\xd7\\xb4\\xfd\\x35\\x6b\\x7f\\xcd\\xdb\\x5f\\x8b\\xf6\\xd7\\xb2\\xfd\\x75\\xd3\\xfe\\x5a\\xd1\\x5f\\xc7\\x98\\x37\\xdd\\xfc\\xf2\\xbb\\x9f\\x42\\x69\\xd8\\xfe\\xec\\x7e\\x4d\\xdb\\x5f\\xb3\\xf6\\xd7\\xbc\\xfd\\xb5\\x68\\x7f\\x2d\\xdb\\x5f\\x37\\xed\\x2f\\xd6\\x74\\x75\\xe4\\x4d\\x37\\xbf\\xfc\\xee\\xa7\\x50\\x1a\\xb6\\x3f\\xbb\\x5f\\xd3\\xf6\\xd7\\xac\\xfd\\x35\\x6f\\x7f\\x2d\\xda\\x5f\\xcb\\xf6\\xd7\\x4d\\xfb\\x8b\\x35\\x7d\\x5f\\xf1\\xa6\\x9b\\x5f\\x7e\\xf7\\x53\\x28\\x0d\\xdb\\x9f\\xdd\\xaf\\x69\\xfb\\x6b\\xd6\\xfe\\x9a\\xb7\\xbf\\x16\\xed\\xaf\\x65\\xfb\\xeb\\xa6\\xfd\\xb5\\x02\\x2e\\x6c\\x6a\\x6c\\x55\\xcf\\xc2\\x5b\\xcd\\xef\\xf2\\x11\\x3b\\xd0\\xad\\x2c\\x3a\\x2e\\xc2\\x73\\xf7\\xc9\\xa6\\x2b\\x0d\\xf8\\xd0\\x0c\\xbc\\x05\\xfd\\xbf\\xa5\\x00\\xf5\\x19\\xf4\\x66\\xea\\x4d\\xd9\\xff\\x75\\xd0\\x55\\xeb\\x05\\xba\\xb2\\x1b\\x56\\xb6\\x58\\x00\\xe4\\x96\\x0c\\x38\\xbf\\x01\\xa8\\x2d\\x38\\x50\\xe0\\x6e\\xce\\xca\\x66\\x10\\x73\\x33\\x06\\x9c\\x42\\xbc\\x4d\\x19\\x30\\x14\\x78\\x6b\\x05\\x00\\xf1\\xc6\\xe5\\x00\\xb1\\x46\\xe6\\x3d\\x41\\x78\\x66\\xda\\x16\\xe5\\x47\\x41\\x01\\x03\\x81\\x42\\xa4\\x28\\x3e\\x43\\x01\\x25\\x49\\x50\\x56\\x0c\\x43\\x14\\x27\\x01\\xdc\\x30\\x00\\x28\\x53\\x82\\xb1\\x64\\x18\\xa0\\x60\\x09\\xc6\\x82\\x63\\xa8\\xbc\\xcf\\x19\\x00\\x14\\x31\\xc1\\x98\\x31\\x0c\\x50\\xce\\x04\\x63\\xca\\x30\\x42\\x95\\xf3\\x56\\x64\\x46\\xce\\xb9\\xe4\\x8c\\x8c\\x73\\xb9\\x51\\x6f\\xdd\\x42\\xaa\\x43\\xa3\\x10\\x3a\\xd6\\x64\\x7d\\x34\\x90\\x80\\x42\\x0c\\xea\\x68\\x30\\x7c\\x8a\\x61\\xd0\\x46\\x75\\x70\\x57\\x14\\x41\\x56\\x46\\x75\\x70\\x6f\\x68\\xb9\\x41\\x17\\xd5\\xc1\\x5d\\x52\\x04\\x83\\x2a\\xaa\\x83\\xbb\\x60\\x08\\x2a\\xd7\\x73\\x5a\\x6e\\x50\\x44\\x75\\x70\\x67\\x14\\xc1\\xa0\\x87\\xea\\xe0\\x4e\\x29\\x42\\xa8\\xf2\\xcc\\x05\\x65\\xe4\\x99\\xc9\\xcb\\xc8\\x32\\x93\\x96\\xa4\\x03\\xfa\\x2d\\xbc\\xd1\\x82\\x94\\x47\\x10\\x95\\xc1\\x51\\x02\\x09\\x05\\xd4\\x0a\\x47\\xf5\\x25\\x54\\x50\\x3d\\x0c\\x75\\x25\\x61\\x8a\\x7a\\x62\\x08\\x37\\x12\\x02\\xa8\\x30\\x86\\xb9\\x94\\x30\\x41\\xcd\\x31\\xcc\\x85\\x8c\\xa9\\xf7\\x75\\x2e\\x21\\x80\\xba\\x64\\x98\\x33\\x09\\x13\\x54\\x2a\\xc3\\x9c\\x4a\\x98\\xa1\\xde\\x53\\x45\\x05\\x96\\x9e\\xca\\x9a\\xb0\\x74\\xd4\\x1f\\x9a\\xd4\\xfa\\x68\\xf3\\x03\\x2d\\xc6\\x91\\x56\\xb4\\x18\\x47\\xd8\\x30\\xc6\\x38\\xc2\\xaf\\x31\\xc6\\x91\\x66\\x94\\x18\\xd7\\x30\\x61\\x8c\\x71\\x0d\\xaf\\xc6\\x18\\xd7\\x74\\x49\\x8d\\x71\\x4d\\x87\\x8d\\x31\\xae\\x91\\x8b\\x31\\xc6\\x35\\xe2\\x53\\x63\\x5c\\x23\\x5c\\x63\\x8c\\x6b\\xba\\x6a\\x8a\\x71\\xd5\\xd1\\x18\\xe3\\x5a\\x90\\x39\\xc6\\xb5\\x28\\xe6\\x18\\xc7\\x51\\xb4\\x18\\xc7\\x01\\xe6\\x18\\xc7\\x31\\xcc\\x31\\x8e\\x63\\x68\\x31\\x8e\\x03\\xcc\\x31\\x8e\\x63\\x98\\x63\\x1c\\xc7\\xd0\\x62\\x1c\\x07\\x98\\x63\\x5c\\x2b\\x17\\x53\\x8c\\xe3\\x08\\x7a\\x8c\\x23\\x10\\x30\\xc6\\xb5\\x10\\x63\\x8c\\x6b\\x31\\x8c\\x31\\x8e\\x63\\xa8\\x31\\x8e\\x97\\x1b\\x63\\x1c\\x47\\x30\\xc6\\x38\\x8e\\xa0\\xc6\\x38\\x5e\\x6e\\x8c\\x71\\x1c\\xc1\\x18\\xe3\\x38\\x82\\x1a\\xe3\\x78\\xb9\\x31\\xc6\\xb5\\xe2\\x30\\xc4\\x38\\x0e\\xd7\\x62\\x5c\\x75\\xec\\x8d\\x71\\x02\\x4a\\x5f\\x8c\\x13\\x50\\xfb\\x62\\x5c\\x87\\x6a\\x88\\x71\\x1d\\x42\\x5f\\x8c\\xeb\\x30\\xfb\\x62\\x5c\\x87\\x69\\x88\\x71\\x1d\\x42\\x5f\\x8c\\xeb\\x30\\xfb\\x62\\x5c\\x87\\x69\\x88\\x71\\x1d\\x42\\x5f\\x8c\\x13\\xe4\\x6b\\x8f\\x71\\x1d\\xa2\\x1a\\xe3\\x6c\\x79\\x8c\\x8f\\xb4\\xfe\\xd6\\x82\\x1c\\x69\\x45\\x0b\\x72\\x84\\x0d\\x63\\x90\\x23\\xfc\\x1a\\x83\\x1c\\x69\\x46\\x09\\x72\\x0d\\x13\\xc6\\x20\\xd7\\xf0\\x6a\\x0c\\x72\\x4d\\x97\\xd4\\x20\\xd7\\x74\\xd8\\x18\\xe4\\x1a\\xb9\\x18\\x83\\x5c\\x23\\x3e\\x35\\xc8\\x35\\xc2\\x35\\x06\\xb9\\xa6\\xab\\xa6\\x20\\x77\\x8c\\x8d\\x41\\xae\\x05\\x99\\x83\\x5c\\x8b\\x62\\x0e\\x72\\x1c\\x45\\x0b\\x72\\x1c\\x60\\x0e\\x72\\x1c\\xc3\\x1c\\xe4\\x38\\x86\\x16\\xe4\\x38\\xc0\\x1c\\xe4\\x38\\x86\\x39\\xc8\\x71\\x0c\\x2d\\xc8\\x71\\x80\\x39\\xc8\\xb5\\x72\\x31\\x05\\x39\\x8e\\xa0\\x07\\x39\\x02\\x01\\x83\\x5c\\x0b\\x31\\x06\\xb9\\x16\\xc3\\x18\\xe4\\x38\\x86\\x1a\\xe4\\x78\\xb9\\x31\\xc8\\x71\\x04\\x63\\x90\\xe3\\x08\\x6a\\x90\\xe3\\xe5\\xc6\\x20\\xc7\\x11\\x8c\\x41\\x8e\\x23\\xa8\\x41\\x8e\\x97\\x1b\\x83\\x5c\\x2b\\x0e\\x43\\x90\\xe3\\x70\\x2d\\xc8\\x1d\\xe3\\xde\\x20\\x27\\xa0\\xf4\\x05\\x39\\x01\\xb5\\x2f\\xc8\\x75\\xa8\\x86\\x20\\xd7\\x21\\xf4\\x05\\xb9\\x0e\\xb3\\x2f\\xc8\\x75\\x98\\x86\\x20\\xd7\\x21\\xf4\\x05\\xb9\\x0e\\xb3\\x2f\\xc8\\x75\\x98\\x86\\x20\\xd7\\x21\\xf4\\x05\\x39\\x41\\xbe\\xf6\\x20\\xd7\\x21\\xf6\\x07\\x39\\x21\\xf9\\xfe\\x91\\x12\\xdc\\x5a\\x94\\x23\\xad\\x68\\x51\\x8e\\xb0\\x61\\x8c\\x72\\x84\\x5f\\x63\\x94\\x23\\xcd\\x28\\x51\\xae\\x61\\xc2\\x18\\xe5\\x1a\\x5e\\x8d\\x51\\xae\\xe9\\x92\\x1a\\xe5\\x9a\\x0e\\x1b\\xa3\\x5c\\x23\\x17\\x63\\x94\\x6b\\xc4\\xa7\\x46\\xb9\\x46\\xb8\\xc6\\x28\\xd7\\x74\\xd5\\x14\\xe5\\xd2\\xbd\\x31\\xca\\xb5\\x20\\x73\\x94\\x6b\\x51\\xcc\\x51\\x8e\\xa3\\x68\\x51\\x8e\\x03\\xcc\\x51\\x8e\\x63\\x98\\xa3\\x1c\\xc7\\xd0\\xa2\\x1c\\x07\\x98\\xa3\\x1c\\xc7\\x30\\x47\\x39\\x8e\\xa1\\x45\\x39\\x0e\\x30\\x47\\xb9\\x56\\x2e\\xa6\\x28\\xc7\\x11\\xf4\\x28\\x47\\x20\\x60\\x94\\x6b\\x21\\xc6\\x28\\xd7\\x62\\x18\\xa3\\x1c\\xc7\\x50\\xa3\\x1c\\x2f\\x37\\x46\\x39\\x8e\\x60\\x8c\\x72\\x1c\\x41\\x8d\\x72\\xbc\\xdc\\x18\\xe5\\x38\\x82\\x31\\xca\\x71\\x04\\x35\\xca\\xf1\\x72\\x63\\x94\\x6b\\xc5\\x61\\x88\\x72\\x1c\\xae\\x45\\xb9\\x74\\xdf\\x1b\\xe5\\x04\\x94\\xbe\\x28\\x27\\xa0\\xf6\\x45\\xb9\\x0e\\xd5\\x10\\xe5\\x3a\\x84\\xbe\\x28\\xd7\\x61\\xf6\\x45\\xb9\\x0e\\xd3\\x10\\xe5\\x3a\\x84\\xbe\\x28\\xd7\\x61\\xf6\\x45\\xb9\\x0e\\xd3\\x10\\xe5\\x3a\\x84\\xbe\\x28\\x27\\xc8\\xd7\\x1e\\xe5\\x3a\\x44\\x2d\\xca\\xb1\\x27\\x8d\\x6c\\x6f\\x48\\xb2\\x67\\x34\\xdb\\x4f\\xc9\\x75\\x5e\\xac\\x6f\\x84\\x0f\\x79\\x6c\\xc7\\x4a\\x53\\xd4\\x6d\\xbc\\xda\\xa8\\xdb\\xc7\\xeb\\x03\\xb0\\xa3\\x9c\\x34\\x2e\\x1c\\x90\\x52\\xce\\x4b\\x01\\xbb\\x0e\\x69\\x9d\\xb7\\xf5\\x36\\x8f\\x1f\\xde\\xd6\\xe5\\xdb\\xf6\\x95\\x24\\xa1\\xe8\\xd0\\x16\\xed\\xf2\\xbc\\x56\\xb0\\xda\\xa2\\x0e\\xeb\\x80\\x51\\xac\\x60\\xb5\\x45\\xdd\\x8b\\x67\\x37\\xe6\\x8d\\x17\\xca\\x71\\xb6\\x3a\\x2f\\x0c\\x07\\x99\\xe2\\x38\\xbe\\x00\\x4d\\xa8\\x8f\\x55\\x92\\xfe\\x2a\\x3b\\x06\\x43\\x90\\x0a\\xd3\\xcd\\x6b\\x4e\\x6d\\xbd\\x4b\\x4a\\xbe\\xfd\\x4e\\xe8\\x8f\\x1d\\xad\\x95\\x44\\x94\\xa7\\xe4\\x3d\\xaf\\x5e\\x72\\x76\\x3c\\x59\\xb2\\x32\\xcc\\x44\\xb2\\x1f\\xf5\\x20\\x3c\\xde\\xb5\\xf6\\x25\\x43\\x78\\x4d\\xfe\\x5b\\x84\\x83\\xd2\\x72\\x3c\\x83\\xb5\\x93\\x13\\x9a\\xec\\xb1\\xad\\x28\\xcf\\x62\\xf2\\x8c\\x2e\\x60\\x63\\x20\\xf0\\x00\\x00\\x35\\xbb\\x03\\x81\\x50\\x4d\\xcd\\x16\\x41\\x60\\x67\\x95\\xf3\\x76\\x4c\\xb4\\xcf\\x84\\xc1\\x6f\\x84\\xa9\\x58\\x50\\xf7\\x00\\xd8\\x41\\x87\\xe9\\x9d\\x03\\x60\\x40\\x3d\\xbd\\x6b\\x00\\xcc\\xf0\\xc2\\x99\\xce\\xfd\\x28\\x6a\\x6c\\x10\\x31\\xdf\\x12\\x76\\x32\\xab\\xea\\x32\\x29\\x84\\x0e\\xaf\\xb3\\xfa\\xe0\\xe6\\x3b\\xb7\\x7e\\x28\\xf0\\xcb\\x3c\\x8e\\x5f\\x41\\xc6\\xb2\\x6a\\xfe\\x71\\x0a\\x64\\x67\\x7a\\x57\\xdf\\xb8\\x13\\x9e\\x6c\\xaa\\xa2\\xee\\xd6\\x89\\xf2\\xf4\\xe7\\x28\\x45\\x55\\xf5\\xf5\\xef\\x1b\\xf7\\xfc\\x8b\\x76\\x6e\\x50\\x7e\\x6a\\x2f\\xca\\xd3\\xd3\\x31\\xdb\\xd0\\xc9\\x3f\\xd9\\x3f\\xc6\\x9f\\x97\\x93\\xa8\\x4c\\xf8\\x53\\x73\\xa3\\x68\\xe3\\x34\\x15\\x29\\x2b\\xce\\xd4\\xa3\\x27\\x1e\\x01\\x37\\xdb\\x42\\x0e\\xba\\x03\\x8e\\x3d\\x7e\\x50\\x52\\x73\\xcd\\x2a\\x84\\x19\\x0c\\xd0\\x8e\\x0a\\x81\\xbc\\xba\\x81\\x1a\\xd0\\x0e\\x33\\x09\\xa0\\x1d\\x15\\x02\\xc5\\x05\\x03\\xb5\\xae\\x1d\\xb3\\xc6\\x41\\x33\\x61\\xb5\\xd6\\xac\\xb4\\x35\\x61\\x2b\\xd6\\x01\\xc6\\x62\\x60\\x99\\x45\\x05\\xa7\\xeb\\x02\\xc5\\x36\\x61\\x1d\\x24\\x2c\\xe8\\xbc\\xc5\\x4d\\xf3\\x4f\\xb3\\x12\\x76\\x8c\\x05\\x32\\x93\\x16\\x04\\xda\\x09\\x83\\x42\\x86\\xa2\\x82\\xb8\\x3d\\x00\\x6d\\x69\\x20\\xd0\\x56\\x0c\\x04\\xa1\\xb6\\xb8\\x4d\\x00\\x6d\\x69\\x20\\xd0\\x5e\\x0c\\x04\\x85\\xb6\\xcc\\x67\\x85\\x60\\x5b\\x90\\x4e\\x0a\\x99\\x4d\\x46\\x41\\xeb\\xb1\\x19\\x99\\x4d\\xc0\\x68\\x24\\x72\\x66\\xab\\xe9\\x3b\\xc6\\x14\\xfb\\x78\\x15\\x2d\\x34\\xb3\\x49\\xb2\\x5d\\x0e\\xd9\\x0c\\x2d\\x07\\x0d\\xa6\\x01\\x41\\xd6\\x22\\x95\\x73\\x7b\\x50\\xe9\\xcb\\xe5\\xa0\\x91\\x40\\x74\\x34\\xfa\\xdc\\x06\\x54\\xfa\\x72\\x39\\x68\\x18\\x10\\x1d\\x4e\\xdf\\x7c\\xba\\x0b\\xd6\\x75\\x77\\xbc\\xcb\\x6c\\x0f\\x22\\x4e\\x8f\\x31\\x08\\xac\\x01\\x96\\xd0\\x11\\x32\\x9b\\x81\\xf5\\xbc\\x59\\x34\\xc3\\xd3\\xdd\\x54\\xb3\\x01\\x76\\x84\\x0c\\x32\\x83\\x16\\x04\\x5a\\x02\\x83\\x42\\xc6\\xa0\\x82\\xb8\\xde\\x81\\xb6\\x34\\x10\\x68\\x15\\x06\\x82\\x50\\x5b\\xdc\\x06\\x80\\xb6\\x34\\x10\\x68\\x21\\x06\\x82\\x42\\x5b\\xe6\\x73\\x7a\\xb0\\x0d\\x48\\xa7\\xf4\\xcc\\xa6\\xa2\\xa0\\xf5\\x58\\x8b\\xcc\\x26\\x60\\x30\\x12\\x39\\xb3\\xcd\\xf4\\x1e\\x21\\x44\\xbb\\x30\\x8a\\x34\\xb3\\xa1\\xe7\\x02\\x21\\xab\\xe1\\x10\\xd0\\x68\\x28\\x10\\xb2\\x19\\x05\\xc2\\xed\\x42\\x6f\\x47\\x85\\x80\\x06\\x03\\x53\\x03\\xda\\xe1\\x36\\xa1\\xb7\\xa3\\x42\\x40\\x63\\x81\\xa9\\x75\\xed\\x98\\xcf\\x5b\\xc2\\x36\\x20\\x1e\\xb7\\x34\\x5b\\x8a\\x8c\\xd5\\x63\\x28\\x12\\x8b\\x80\\x9d\\x88\\xc4\\xcc\\x66\\xd2\\x77\\x0e\\x74\\x1b\\x45\\xad\\x95\\x08\\xb7\\xc1\\x9c\\x85\\xfd\\xc8\\x9e\\x1f\\xbc\\xe8\\xce\\x05\\xdc\\x8b\\x5b\\xf8\\x1d\\x7a\\xcd\\xbb\\x83\\xb2\\xd8\\x79\\xd9\\x25\\x21\\x96\\x8b\\x25\\x49\\xf8\\x6b\\x54\\x8d\\x39\\x0a\\xb2\\xc3\\x59\\x38\\x7b\\xc0\\x4e\\x26\\xba\\xc7\\xaa\\x3d\\x7c\\xc8\\x0e\\xf4\\x34\\x45\\x0d\\x07\\x87\\x84\\x24\\x51\\xe8\\x21\\x85\\x2d\\x2a\\xe1\\xfb\\x5d\\xf4\\x9e\\xbd\\x65\\x8b\\x59\\xed\\xb0\\xa9\\x01\\x11\\x5a\\xef\\xd9\\x90\\x0e\\x16\\x24\\x7d\\x05\\x68\\x43\\xb2\\x51\\xd2\\x57\\x71\\x36\\xa4\\x03\\x7c\\x35\\x00\\x5c\\x4f\\x5b\\x0f\\x9b\\x65\\x03\\x2e\\x8a\\xc5\\xec\\x83\\x91\\x39\\x70\\xc9\\x3c\\xb6\\x66\\x27\\xce\\xab\\x6b\\x8e\\x6e\\xb3\\x13\\xfc\\xd5\\x35\\xa5\\x36\\xcf\\xca\\x79\\xc4\\x51\\x92\\x16\\xce\\x92\\x8e\\x13\\xf4\\xb8\\x8a\\x82\\x9c\\xaf\\xac\\x38\\xb6\\x45\\x41\\xca\\x57\\x56\\x14\\x5b\\x3c\\x4b\\xe7\\x41\\xc7\\x08\\x59\\x20\\x62\\x1b\\x6a\\x3d\\x15\\xcd\\x03\\x59\\x97\\xd5\\xf8\\x16\\xa1\\x8a\\x4a\\xfe\\x66\\xed\\x5f\\x2e\\xbb\\x04\\xa7\\x71\\x85\\xeb\\x73\\xf7\\x61\\xd6\\xd7\\x2f\\x7b\\xf2\\xbb\\x6b\\x9c\\x52\\xbc\\xc7\\x59\\xac\\x1c\\xb7\\x13\\x1c\\xb8\\x5a\\xd7\\x70\\x71\\x4b\\x18\\x28\\xf9\\x5f\\xf9\\x68\\x9b\\x70\\x3a\\xb1\\xbb\\xc6\\x0a\\xb8\\x5c\\x60\\xde\\xfc\\xbb\\xa4\\x68\\x8b\\x87\\x5d\\x19\\x26\\xf3\\x34\\x57\\x2e\\x8f\\x59\\xfa\\xfe\\x85\\x5c\\x29\\xf7\\x73\\xfd\\x50\\xe0\\xdf\\xd3\\xc7\\xae\\x7f\\x79\\xea\\x9b\\xf7\\x84\\x16\\xc8\\xab\\x11\\xdb\\xfc\\xfe\\x97\\x89\\x50\\x58\\xa2\\x38\\xc9\\x7f\\xe1\\xb7\\xe1\\xcc\\xc8\\x51\\xca\\x56\\x9a\\x2c\\x03\\xfe\\xf7\\x95\\x24\\x3c\\x7a\\x9c\\x55\\xa4\\xbc\\x4b\\x52\\xfc\\x8b\\xac\\xa5\\x8b\\xd4\\x46\\xb6\\x57\\xe1\\x82\\x16\\x2f\\xf4\\x4a\\xbd\\x9f\\x8f\\xa7\\xb4\\x4e\\x8a\\x14\\xff\\xc2\\xee\\xd8\\xfb\\xb9\\xd1\\xdd\\x2f\\x67\\xf1\\x5a\\x37\\xb5\\x4d\\x76\\xdb\\x04\\xd4\\x49\\x1d\\x44\\xbb\\xfa\\x24\\xf7\\xe2\\xe5\\xa7\\xba\\x38\\xd5\\xf0\\x31\\x50\\x22\\xb5\\xa5\\x7c\\xf0\\xb3\\xff\\xf6\\xc1\\xf9\\x7c\\x7e\\xf1\\x76\\x79\\x79\\x74\\xa3\\x3c\\xab\\xcb\\x5c\\x3d\\x3b\\xaf\\xdf\\x44\\x37\\x9d\\x09\\x37\\xa5\\x2d\\x8a\\x7b\\x27\\x08\\xaf\\x68\\xd4\\x74\\x51\\x5d\\x57\\x9a\\x1c\\xd1\\x1e\\xf3\\xa3\\xb0\\x83\\x8e\\x95\\xda\\xce\\xf5\\x36\\x75\\x9b\\xff\\x88\\xc7\\x75\\xfd\\x25\\x7c\\xb2\\xd7\\x88\\x0b\\x5c\\x8f\\xc7\\x98\\x20\\x5d\\x10\\xaf\\xb8\\x73\\xbc\\x60\\x5e\\x4d\\x74\\x86\\x34\\x1c\\xe5\\x32\\x3d\\x3b\\x3d\\x1b\\x9d\\xa7\\x20\\x22\\x9b\\x02\\x33\\x59\\x91\\xda\\xfa\\xcb\\xc5\\x02\\xed\\xf0\\x8a\\x5b\\xe7\\x1a\\x3c\\xbf\\xdc\\x27\\xc8\\x89\\xef\\xf8\\xce\\x0d\\x07\\x04\\x7e\\x38\\x09\\x96\\xf3\\x49\\x38\\x9d\\x4e\\xbc\\xc5\\x28\\x8d\\x58\\x09\\x29\\x9d\\x59\\x13\\x1f\\x56\\xa4\\x28\\xc2\\x07\\xf2\\x08\\x1b\\xbf\\xe8\\x67\\xb5\\x5a\\x6d\\xf2\\x02\\x45\\x49\\xfd\\xb0\\x0e\\x94\\x4a\\xcd\\x8c\\x9b\\x0c\\x65\\x43\\x45\\xad\\x0d\\x26\\x8c\\x51\\x75\\x8e\\x15\\x7b\\x2f\\xc7\\xfa\\x4d\\x55\\xb8\\x64\\x50\\xac\\xff\\x73\\x9c\\x90\\xdb\\x04\\xe3\\x5f\\x26\\x72\\x79\\x89\\x51\\x9c\\x67\\xe9\\xc3\\x2f\\x13\\x1e\\xfe\\x3a\\x54\\x47\\x1e\\xf2\\xc0\\xda\\x08\\x63\\x93\\x4c\\x84\\x06\\x7b\\x09\\xb3\\xcb\\x4c\\xb2\\xbc\\x76\\x51\\x9a\\xe6\\x77\\x38\\xbe\\xf0\\x0b\\x4c\\x65\\x44\\x83\\xb3\\x55\\x83\\x13\\x2a\\x0a\\x8c\\x4a\\x94\\x45\\xec\\xea\\x1a\\x60\\x25\\xc6\\x51\\x9b\\x50\\x1f\\xe3\\xdb\\x24\\xc2\\x6e\\x91\\xdc\\xe3\\xd4\\x25\\x57\\x95\\xae\\xfd\\x57\\x67\\x81\\x7e\\x8c\\x6a\\xfc\\x8b\\xc4\\x89\\xe8\\xb8\\xeb\\xe4\\x68\\x81\\x36\\x75\\xc9\\x83\\xc9\\x69\\x1e\\xa1\\xd4\\x8c\\x77\\xcc\\xb3\\xfa\\x20\\x83\\xa5\\x1b\\x70\\xa6\\xe4\\xb6\\x38\\x6a\\x30\\xe4\\x0b\\xa9\\x5b\\x1d\\x1d\\x95\\xc7\\x89\\x05\\x81\\xb0\\x69\\x43\\x50\\x38\\xb5\\xa1\\x52\\x66\\xd5\\x6e\\xfe\\xc2\\x6a\\x54\\x47\\x5d\\x3c\\x10\\x44\\x15\\x0d\\x84\\xc3\\xc4\\xc2\\x41\\xb2\\x48\\x7c\\x55\\x24\\xe9\\xbe\\x47\\x24\\x32\\x02\\x20\\x12\\x9d\\x82\\x51\\x24\\x32\\xaa\\x5d\\x24\\xe9\\xde\\x24\\x12\\x19\\x02\\x8b\\x44\\xc6\\x91\\x44\\x92\\xee\\x25\\x91\\xcc\\x16\\xe4\\xa8\\x3e\\xb1\\x22\\xc2\\xe5\\x59\\x4f\\x22\\x5c\\x3c\\x3e\\x0b\\x99\\x78\\x64\\xd2\\x01\\x9c\\xb5\\x56\\x6f\\xb2\\xed\\xbf\\xbb\\x91\\xd3\\x74\\xc8\\x04\\x94\\x51\\xa6\\x7f\\x88\\x99\\x12\\x32\\xf5\\x95\\xce\\x69\\x03\\x77\\x59\\xfa\\x1b\\xf5\\xa6\\x4c\\xf5\\x92\\xd2\\xb6\\x35\\x70\\x02\\xd9\\x82\\xd9\\x75\\x55\\x06\\x2c\\xca\\xa2\\x36\\x05\\x63\\x00\\xa0\\x2e\\x9b\\x8d\\xea\\xd7\\xc4\\x0a\\x02\\x9a\\x91\\x09\\xa9\\x74\\x77\\x41\\x28\\x09\\xe8\\xb5\\x2a\\xfe\\xd7\\x4c\\x0b\\x02\\x11\\x57\\x52\\x13\\xe3\\x44\\xe6\\xcb\\xa2\\x34\\xf0\\x46\\xae\\xe1\\xb2\\x06\\x6f\\x50\\x36\\x6a\\x80\\xb1\\xf3\\xda\\xce\\xed\\x6b\\x99\\x77\\xe8\\x02\\x30\\xb6\\x19\\x8c\\x5c\\xeb\\xac\\xc5\\x0b\\x50\\x81\\x76\\x3c\\xa6\\x4c\\xa8\\xa6\\xc7\\x2b\\x80\\x50\\x21\\x72\\x69\\xe4\\xc0\\x9a\\x14\\xd4\\x55\\x83\\xe2\\x99\\x2a\\x9e\\x8e\\x90\\x24\\x99\\xae\\x18\\x0a\\x9a\\xaa\\x88\\x21\\x1c\\x49\\xce\\x36\\x46\\xda\\xa6\\xa4\\x11\\xab\\x96\\xda\\xd8\\xb0\\xa0\\x88\\xa3\\x1f\\x62\\x42\\x0c\\x73\\x2e\\xdd\\x3d\\x20\\x7a\\x09\\x71\\xf1\\xd0\\x2e\\x58\\x94\\x4d\\x61\\x4b\\xdd\\x94\\x41\\xba\\x9d\\x0f\\xb5\\x40\\xab\\xa3\\x72\\x9d\\x89\\xaf\\xdc\\xa0\\x75\\xe9\\x10\\x85\\xe8\\xb3\\x11\\xf6\\xca\\x68\\xd7\\xe9\\x84\\xda\\x02\\x67\\xae\\x5f\\x32\\xc4\\x56\\x97\\x30\\x75\\x2d\\xd8\\xa9\\x4b\\xd1\\x2e\\x64\\xb6\\xf3\\x25\\x95\\x10\\xdd\\x81\\xd9\\x05\\x84\\x26\\x92\\x83\\x93\\xaa\\x27\\xea\\x8f\\xd2\\x14\\xeb\\x9e\\xb1\\x41\\x3d\\x9e\\x43\\xf5\\x85\\x1e\\x4b\\xf3\\x27\\x05\\xb9\\x7f\\xd2\\x68\\x13\\x04\\xb7\\x43\\x91\\x3d\\xd1\\x26\\x43\\x75\\x41\\xdb\\x2f\\x9f\\x4b\\x17\\xa5\\x85\\x00\\xbd\\x91\\x2e\\xd5\\xeb\\xae\\xed\\x6d\\xef\\x0a\\x56\\xc8\\xb0\\x1d\\x97\\x1b\\xfd\\xa2\\x78\\xc9\\x78\\x94\\x46\\xb4\\x69\\x81\\xc1\\x78\\xd2\\xbd\\x6a\\x3c\\x1d\\x21\\x4d\\x66\\xe9\\x1e\\x36\\x9e\\xa7\\xed\\x96\\xd2\\xa2\\xc5\\x86\\xe0\\x9e\\x82\\xf5\\x87\\xd8\\x50\\xba\\x1f\\x69\\x43\\xaa\\x3c\\x14\\x1b\\x22\\xec\\x89\\x36\\x74\\x23\\x8a\\x29\\x18\\x23\\xa6\\x8b\\x77\\x40\\x95\\xbb\\xc3\\x38\\x6e\\x96\\x61\\x7a\\xf4\\x97\\xe1\\x8a\\x96\\x64\\xdf\\x36\\x0b\\xbd\\x79\\x2b\\x25\\xce\\xb8\\x4e\\xb9\\x9d\\xdd\\xd0\\x30\\xcd\\xfd\\xe2\\x6f\\x6e\\x92\\xc5\\xf8\\x7e\\x1d\\x6e\\xa0\\x14\\x10\\xf1\\xdc\\xa2\\x17\\x57\\xd7\\x30\\x1b\\xed\\x0a\\xe7\\x0d\\x9b\\x53\\xb8\\xf8\\x16\\x67\\x75\\xc5\\x36\\x8b\\x59\\x84\\xfc\\x1a\\xe6\\x5c\\x9d\\x9d\\xf7\\xa0\\x19\\x11\\xf8\\x09\\x92\\x45\\xd7\\x93\\x7e\\x33\\x53\\x9d\\xc9\\x20\\x1e\\xab\\x63\\x0f\\x9a\\x11\\x81\\x1f\\x64\\xf1\\x05\\x69\\xc3\\xee\\xb4\\xb1\\x0a\\xb6\\x87\\xc6\\x11\\x66\\x9e\\x60\\x71\\x3b\\x75\\x93\\xa1\\xac\\x6d\\x36\\x4d\\x90\\x60\\x07\\x9c\\x16\\x74\\xa2\\xa9\\x00\\xc8\\x04\\x00\\x2a\\x83\\xda\\xd0\\x16\\x0f\\x10\\x8c\\xcf\\xc7\\x01\\x14\\x61\\xb6\\x01\\x00\\xa4\\x8a\\xca\\xc5\\xd7\\x32\\x83\\x72\\xb6\\x43\\xca\\x67\\x51\\xfc\\xf7\\x9d\\x3a\\xb4\\xf0\\x03\\x66\\xd9\\xe8\\x35\\xdc\\x57\\xe7\\xd6\\x9a\\x28\\xf6\\xe5\\x62\\xb9\\x0d\\x16\\x37\\xa3\\xd3\\x69\\x42\\x5d\\x85\\x6b\\xd1\\xc2\\x51\\x1c\\xe7\\x99\\x2c\\x73\\x20\\xa5\\x4b\\x77\\xa7\\x6d\\x20\\x89\\x5b\\x24\\xd2\\x0d\\x06\\xa0\\x06\\xdb\\xfb\\xa1\\x9a\\xbc\\x56\\x2c\\x99\\x63\\x07\\xd5\\x4d\\xbe\\x85\\xa9\\x26\\xdf\\x02\\x04\\x93\\x97\\xcb\\xa0\\x36\\x40\\x93\\x57\\x61\\x80\\xc9\\x73\\x14\\xcd\\xe4\\x25\\x00\\x68\\xf2\\xec\\x32\\x75\\x99\\x41\\x8b\\xc9\\x53\\xfc\\x0f\\x63\\xf2\\x20\\x3f\\x86\\xc4\\xf2\\x3c\\x78\\xac\\xc9\\x47\\x3e\\x0a\\x16\\xdb\\xeb\\x4c\\x9e\\xd6\\x55\\xb8\\x36\\x9a\\x3c\\x93\\xa1\\x69\\x57\\xd5\\x06\\x92\\xb8\\x45\\x22\\x9a\\xc9\\x8b\\x35\\x70\\x59\\xe6\\xa5\\x6a\\xf0\\x4a\\xa1\\x64\\x8a\\x1c\\xa6\\x1b\\x3b\\x83\\xa8\\xa6\\xce\\x8a\\x05\\x43\\x17\\x4b\\x74\\xda\\xa0\\x91\\xcb\\x10\\xc0\\xc4\\x29\\x82\\x66\\xe0\\x42\\x31\\x68\\xde\\xec\\x62\\x7f\\x91\\x2d\\x8b\\x71\\x53\\xec\\x0f\\x63\\xdc\\x00\\x37\\xa0\\x69\\xd3\\x47\\x06\\x1e\\x69\\xda\\xf8\\x66\\x76\\x33\\xbd\\xd2\\xb4\\x49\\x5d\\x89\\x67\\xa3\\x61\\x33\\xf9\\x99\\xf6\\x80\\x6d\\x20\\x69\\x1b\\xa5\\xa1\\x99\\xb5\\x88\\xdf\\x4e\\x69\\x89\\xb6\\xff\\x8f\\xa1\\x22\\x39\\x99\\x33\\xe7\\x13\\x1e\\xb9\\x0e\\x7f\\x53\\xc9\\x56\\xd7\\xbf\\x08\\xd6\\xae\\x3d\\xe4\\xd5\\x66\\xab\\xe6\\x60\\xf6\\xb3\\x3d\\x9c\\x36\\x6d\\xfe\\x99\\x2f\\xea\\x22\\xcd\\x33\\xdb\\x15\\x73\\xb4\\x86\\xaf\\xf5\\x72\\x9a\\xce\\xf0\\xb0\\x99\\x4e\\x53\\xfd\\x42\\x2b\\x51\\x15\\x9e\\x8d\\x1a\\x4b\\x90\\xaf\\x6d\\x20\\xba\\x4a\\x35\\xc1\\x6c\\x54\\x74\\xb2\\x37\\x63\\x50\\xdb\\x02\\x11\\x07\\x5a\\xb2\\x81\\x78\\x9a\\xc1\\x0e\\x45\\xde\\xd6\\xd9\\xb9\\x13\\x8e\\x99\\x95\\xb7\\xb2\\x90\\xc5\\x03\\xf2\\x52\\x15\\xc9\\xab\\xaa\\x5b\\xe9\\x06\\xf5\\xbf\\x73\\xe4\\x52\\x31\\x4d\\x16\\xdb\\x4c\\x06\\x7a\\x57\\x61\\x5c\\x93\\xdc\\xef\\xea\\x0d\\x33\\x9f\\xab\\x26\\xc7\\x60\\x2a\\x70\\xda\\x1d\\x20\\x6a\\xc9\\xb1\\x77\\xd7\\xbf\\x4a\\xa7\\x4b\\x65\\x2a\\xe6\\xa5\\xaf\\x3a\\xca\\x59\\x45\\xe1\\x15\\x06\\x55\\xce\\x10\\xa8\\x0d\\x6d\\x1a\\x06\\x8b\\x85\\x70\\xb9\\xfa\\xd4\\x06\\xcf\\x64\\xda\\xf4\\x34\\x8e\\x41\\xf6\\xe5\\x40\\xf8\\xbe\\xb2\\x6c\\x17\\xa6\\x22\\x9e\\xfe\\x41\\xc8\\x7e\\xd3\\xb2\\xdd\\x85\\x49\\xcc\\x49\\x76\\x6e\\xe8\\x69\\x6b\\x84\\xda\\xeb\\x4e\\x00\\xaf\\x43\\x94\\xd9\\x5d\\xfa\\x3b\\x82\\x55\\x25\\xa5\\x60\\xe6\\x3c\\x08\\xb4\\xa4\\x0c\\x70\\x69\\xc7\\x90\\x76\\xaa\\xa3\\xad\\x9d\\x85\\x96\\x40\\xbc\\x5c\\xbc\\xc6\\x11\\xd9\\xbe\\xe4\\x74\\x9b\\x69\\xc0\\x0f\\x39\\xdd\\xe6\\x1a\\xeb\\x6b\\x73\\xdd\\x66\\x1b\\x3d\\x1f\\xa3\\xef\\x84\\x35\\x7c\\x13\\x72\\x8f\\x95\\x5b\\xe7\\xa7\\xe8\\xe0\\xa2\\x88\\x0c\\xd6\\x23\\xca\\x92\\xe2\\x94\\x92\\xd7\\x3e\\x37\\x66\\x88\\xfc\\x2d\\xa9\\x9d\\xf0\\x9c\\x2a\\x5c\\xba\\x34\\x59\\x47\\x37\\xf4\\x90\\xad\\x18\\x40\\x69\\xa5\\x17\\x6a\\x05\\x03\\xb7\\x08\\x99\\x6f\\x82\\x27\\xdf\\xdb\\xb7\\x75\\xc6\\xce\\xad\\x79\\x74\\xc3\\x96\\x50\\xb2\\x16\\x4a\\xba\\x9f\\x6b\\x0d\\x7d\\xad\\xa1\\x3f\\xc9\\x26\\x2f\\xb5\\x5d\\xe1\\xa7\\xf4\\x74\\xd5\\x74\\x3a\\x85\\xdf\\x6e\\x15\\xba\\x22\\xf2\\x79\\x86\\x25\\x37\\x68\\x27\\xcf\\xb4\\xb8\\x77\\xe6\\xca\\x1c\\x33\\x30\\x3c\\x8c\\x60\\xc2\\xa5\\x7c\\x75\\x9f\\xc7\\xb6\\x75\\xd6\\xb3\\x97\\xa4\\x19\\x31\\xfa\\x47\\xa6\\xcd\\x2e\\x49\\xc9\\x13\\x1a\\x69\\x71\\x40\\x2f\\xd9\\x2e\\x95\\xdf\\x2f\\x84\\xfd\\x59\\x3d\\x4f\\x29\\xb4\\x3b\\x5b\\xbc\\xc5\\xfc\\x82\\x64\\xae\\x00\\x36\\x08\\xc6\\x19\\xcc\\x65\\x6e\\xeb\\xcc\\x8d\\xf1\\x0e\\x9d\\xd2\\xfa\\xdc\\xf7\\x9c\\xaf\\x32\\x73\\x26\\x47\\x0f\\x84\\xfa\\x82\\xc6\\x79\\x11\\xb3\\x26\\x2b\\x61\\xbc\\x68\\xfe\\xa9\\xcb\\xcd\\xa8\\xf9\\x27\\x91\\xd7\\x4d\\x67\\x20\\x2d\\x14\\x37\\xff\\x64\\x56\\x05\\xdb\\x6a\\xe9\\xf3\\xb2\\xbc\\xc0\\xd9\\x5b\\x2f\\x2e\\xf3\\x22\\xce\\xef\\x9a\\x50\\xb8\\xdf\\xa7\\x78\\xb8\\xa0\\x46\\xf2\\x00\\x48\\x4d\\x1f\\xc4\\x2a\\x84\\x1d\\x1b\\xd1\\xb9\\x87\\x74\\x60\\xa4\\xb6\\x96\\xa9\\xf5\\xf6\\x9b\\x13\\xef\\x45\\x5c\\x0f\\x46\\x1c\\xa0\\xd3\\x78\\xd6\\xfc\\xeb\\xb7\\x8f\\x47\\xea\\x14\\x74\\x2d\\x72\\x03\\x7c\\x40\\x41\\x2a\\xe3\\x30\\x48\\x69\\x2d\\x4c\\x57\\x5b\\x37\\x48\\x01\\xa2\\x1d\\x10\\xa0\\x2a\\x00\\x29\\x59\\x83\\xfb\\x51\\x94\\xd7\\x83\\xb5\\x1e\\x86\\x65\\x3c\\xb6\\xd6\\xeb\\x24\\x1c\\x6f\\x8b\\xe2\\x3d\\xee\\x7b\\xa2\\x70\\x4a\\x2b\\x8d\\x78\\xd0\\x50\\x69\\x37\\xc4\\x8b\\x18\\xcd\\x24\\x2a\\xa2\\x84\\xa5\\x87\\x0f\\xed\\xe4\\xe9\\x83\\x87\\x0a\\xf9\\x20\\x0c\\xb7\\x33\\x5f\\x22\\x2f\\xdb\\xf2\\x08\\x5a\\xa1\\x3f\\x8b\\x97\\x0a\\xab\\xa2\\x2d\\x73\\xfa\\xfd\\xb6\\x3c\\x48\\x5c\\x23\\x79\\x00\\xa4\\x06\\xf8\\x27\\x05\\x22\\x18\\xba\\xcc\\x3d\\xa4\\x03\\x23\\xb5\\xc1\\xfe\\x49\\x51\\x70\\x2f\\x62\\xbf\\x7f\\x1a\\xa3\\x53\\x22\\xba\\x7e\\xfb\\x78\\xa4\\x4e\\x2d\\xfe\\x89\\x37\\x00\\xf9\\x27\\x15\\x06\\x29\\x0d\\xf2\\x4f\\x0c\\x06\\xfb\\x27\\x0d\\x08\\x50\\x1d\\xec\\x9f\\x64\\xe5\\xf5\\x60\\xf5\\xf8\\xa7\\xbe\\xc7\\x4b\\x87\\xba\\x0a\\xc5\\x4b\\xf1\\x6a\\xf0\\x0d\\x3a\\x4d\\x3d\\xe5\\xed\\x5a\\xd8\\x52\\xe6\\xd1\\xf6\\x66\\x1e\\x29\\xad\\xcf\\x22\\x84\\x67\\x91\\x44\\x45\\x14\\xb5\\xf4\\x7a\\xaa\\x9d\\xfc\\x6c\\xb6\\x8a\\x67\\xaa\\x21\\x86\\xf3\\xf9\\x22\\x9c\\x4b\\xe4\\x87\\x18\\x35\\x48\\x6b\\xba\\xba\\x99\\x4d\\x57\\x32\\xab\\xa2\\x51\\x73\\xfa\\xfd\\x46\\x3d\\x48\\x5c\\x23\\x79\\x00\\xa4\\x06\\x38\\x2a\\x05\\x22\\x58\\xbc\\xcc\\x3d\\xa4\\x03\\x23\\xb5\\xc1\\x8e\\x4a\\x51\\x70\\x2f\\x62\\xbf\\xa3\\x1a\\xa1\\x53\\x2a\\xba\\x7e\\xfb\\x78\\xa4\\x4e\\x2d\\x8e\\x8a\\x37\\x00\\x39\\x2a\\x15\\x06\\x29\\x0d\\x72\\x54\\x0c\\x06\\x3b\\x2a\\x0d\\x08\\x50\\x1d\\xec\\xa8\\x64\\xe5\\xf5\\x60\\xf5\\x38\\xaa\\xbe\\xab\\x43\\x86\\xba\\x0a\\xc5\\x51\\xf1\\x6a\\x66\\x47\\x25\\x3e\\x88\\x6d\\xf0\\x52\\xdb\\xc8\\xd7\\xbe\\x92\\xcc\\x16\\xdb\\x9b\\x18\\x75\\x24\\x44\\x21\\x77\\xef\\x2f\\xf7\\xd8\\x5f\\xb0\\xf5\\xe3\\xb9\\x1a\\x28\\xb7\\x8b\\xf8\\x66\\xde\\x11\\x1e\\x64\\xc8\\x10\\xa1\\x70\\xb1\\x42\\xdb\\x48\\xe0\\x50\\xb4\\x62\\x42\\xb9\\xdf\\x84\\xfb\\x85\\x33\\xa6\\x69\\x55\\x46\\x80\\x37\\x12\\x8b\\x05\\x9b\\x16\\xd8\\xd5\\x04\\x0d\\x13\\x19\\xec\\x81\\x44\\xe5\\xd9\\xb1\\xfa\\x7d\\xcf\\x50\\x7d\\x51\\xf9\\xf4\\x28\\xfe\\x6a\\x7d\\x59\\xfc\\x0d\\xa1\\x0b\\x39\\x1b\\x09\\xa0\\x29\\x04\\x72\\x33\\x0d\\x00\\xf6\\x31\\x32\\x44\\x25\\x36\\xd8\\xbb\\x08\\x8a\\xb1\\xa1\\xf4\\xf8\\x15\\xeb\\x5d\\x34\\x83\\x46\\xb6\\xea\\x51\\x58\\x1d\\xb3\\x47\\x51\\xde\\xc5\\x87\\x4d\\x60\\xe7\\xa3\\x78\\xa6\\x36\\x8d\\x31\\x0a\\xa7\\x0b\\x89\\x8a\\x28\\x58\\xe9\\xe5\\x75\\x3b\\x79\\x1c\\xad\\x96\\x81\\xba\\xf4\\x5c\\xdd\\xcc\\x77\\x7e\\x2c\\x91\\x1f\\x62\\xad\\x20\\xad\\x78\\x7e\\x33\\x0f\\x42\\x99\\x55\\xd1\\x60\\x39\\xfd\\x7e\\x9b\\x1d\\x24\\xae\\x91\\x3c\\x00\\x52\\x03\\x9c\\x8d\\x02\\x11\\x8c\\x5b\\xe6\\x1e\\xd2\\x81\\x91\\xda\\x60\\xc7\\xa3\\x28\\xb8\\x17\\xb1\\xdf\\xfd\\x8c\\xd0\\x29\\x15\\x5d\\xbf\\x7d\\x3c\\x52\\xa7\\x16\\x57\\xc4\\x1b\\x80\\xbc\\x91\\x0a\\x83\\x94\\x06\\xf9\\x24\\x06\\x83\\xdd\\x92\\x06\\x04\\xa8\\x0e\\x76\\x4e\\xb2\\xf2\\x7a\\xb0\\x7a\\x5c\\x54\\xef\\xd5\\x47\\x03\\x5d\\x85\\x9a\\x49\\x62\\xd5\\xcc\\x8e\\x8a\\xdd\\x0d\\x64\\x37\\x94\\xd5\\x7c\\x3a\\xd3\\x06\\xde\\x6c\\xba\\x9b\\x22\\x91\\x88\\x94\\xac\\xa3\\x77\\xf4\\x0c\\xf0\\x52\\xd1\\x6a\\xea\\x87\\x6a\\x1c\\x5c\\x2e\\x82\\x28\\x58\\x89\\xc4\\x87\\x18\\x34\\x48\\x0a\\x45\\xe1\\x8a\\xcf\\xe5\\x19\\x9f\\x52\\x4e\\x94\\x52\\x1f\\x90\\x12\\x1d\\x20\\xa8\\x71\\x0c\\xe8\\xf2\\x82\\x72\\xdc\\x12\\x40\\xcc\\x95\\x8a\\x8c\\x03\\xa2\\x37\\x91\\x1a\\x9e\\xdf\\x96\\x94\\xda\\x87\\x37\\x20\\xbb\\x3d\\x58\\x8f\\x54\\x62\\xbd\\x26\\xf1\\x28\\x3d\\xda\\x32\\xdb\\x94\\x3a\\x98\\xd8\\x96\\x41\\x80\\xa2\\xc0\\xb4\\x36\\x01\\x19\\xb2\\xda\\x0a\\x4c\\x27\\x39\\x3c\\xa7\\x2d\\x2a\\xcc\\x8e\\xd4\\x97\\xd1\\xb6\\xdf\\xb0\\x35\\xd0\\x1f\\x28\\xbe\\x88\\xd7\\x32\\xfb\\xa2\\x34\\xc9\\xde\\x9d\\xb5\\x93\\xa4\\x50\\x92\\xaa\\x7b\\xfc\\x9b\\xd7\\x9b\\xb4\\xbf\\x24\\xb3\\x68\\x0a\\xd6\\x6a\\x41\\xff\\xe7\\x49\\xca\\x8a\\xf5\\xd8\\xfe\\xd0\\xf7\\xdd\\x01\\x0e\\x35\\x86\\x44\\xa5\\x93\\xbf\\x99\\xe4\\x45\\x01\\x8b\\xd7\\xb0\\xf7\\x55\\xe4\\x4b\\x8c\\xe9\\x3c\\x5c\\x46\\xda\\xc7\\xe4\\x53\\x16\\xe3\\x32\\x4d\\x32\\x20\\x2e\\x80\\x8d\\xc0\\xc6\\xa9\\x40\\xec\\xa6\\x29\\xf0\\x6a\\x45\\x91\\xd8\\x6f\\xaf\\x8e\\x87\\x3e\\x84\\xb7\\xfb\\x42\\xde\\x36\\x7f\\x31\\x96\\xf6\\xe7\\xa7\\x3b\\xd2\\xd4\\xb5\\x51\\x1d\\x85\\x36\\xba\\x83\\x87\\x8f\\x39\\x73\\xd7\\x11\\xbf\\xaf\\x04\\xe2\\xf7\\x55\\xd7\\x01\\xfa\\xb5\\xfd\\x4a\\xda\\xd0\\xae\\x48\\x71\\xe7\\x5b\\x8b\\xf3\\x5a\\x40\\x97\\xb7\\x4d\\x8a\\xf7\\x35\\x6c\\x4f\\x75\\x9d\\x67\\xbf\\x74\\xb8\\xd2\\x69\\x5a\\x5c\\xe1\\xda\\x00\\xab\\x4e\\xdb\\x63\\x22\\x02\\xe5\\xfd\\x77\\x28\\xc6\\x67\\xfe\\xd1\\xde\\x87\\xae\\x61\\x61\\x40\\x72\\x89\\x89\\xd3\\xf4\\x1d\\x95\\xca\\xc5\\x2a\\x10\\x86\\x1d\\x4c\\xdb\\xf5\\x92\\xec\\x2c\\xdc\\x84\\x11\\xe5\\x69\\x8a\\x8a\\x0a\\xb7\\x32\\xa3\\x86\\xc6\\x8b\\x1b\\x6c\\xf9\\x3e\\xa2\\xba\\x04\\x81\\xec\\x6e\\xab\\xfc\\xee\\x42\\xae\\xcd\\xb2\\xe3\\x50\\x13\\x68\\x5b\\x69\\x26\\xcb\\xfa\\x36\\x3a\\xa6\\x6c\\xbf\\xbd\\x4a\\xb0\\xbd\\x48\\x50\\x13\\x97\\x5b\\x27\\xc7\\x24\\xdb\\xbb\\xbb\\x53\\x46\\x37\\xf1\\x60\\x54\\x61\\x59\\x5e\\x30\\x4a\\x2f\\x09\\xbd\\xa9\\xf8\\xc4\\x46\\xa4\\x37\\x55\\x2f\\xbb\\x51\\x60\\xe6\\x4a\\x3a\\xd5\\xa2\\xcc\\x0b\\x5c\\xd6\\x0f\\x6b\\xda\\xeb\\xc9\\x6d\\x52\\x25\\xdb\\x24\\x4d\\xea\\x07\\xa5\\x09\\x0b\\xe2\\x20\\xac\\x8b\\x17\\xa1\\x12\\xd7\\xb6\\x3d\\xb7\\x7e\\x27\\x7a\\xe9\\x71\\x8e\\xe2\\xde\\xb0\\xbb\\x4a\\x78\\x73\\x60\\x56\\xdc\\x3b\\x31\\xaa\\x0e\\x38\\x56\\x4b\\xc9\\x2e\\xa6\\xbf\\xb7\\x09\\x67\\x76\\xc0\\xcf\\xb6\\xbd\\x89\\x3e\\x33\\x02\\x61\\x5c\\xda\\x09\\xce\\x84\\xfc\\x3a\\x15\\xd0\\x31\\x43\\x65\\x12\\xa4\\xec\\x65\\xf2\\x05\\x84\\x23\\xce\\x4e\\x86\\xe3\\x84\\xe4\\xa6\\x28\\xba\\x95\\xb3\\x3d\\x50\\x18\\xf8\\xbe\\xbf\\x11\\xc7\\xcb\\xa6\\x7b\\x93\\x6a\\x23\\xbc\\x95\\xb5\\x50\\x0f\\x2a\\xb7\\x57\\xb3\\x85\\xec\\x7e\\x30\\x65\\x23\\x9c\\xf2\\x38\\xc8\\x26\\x4d\\xaa\\x9a\\x5d\\x95\\xa9\\x6e\\x15\\x13\\xe6\\x91\\x6d\\x40\\x16\\xa0\\x69\\x52\\xac\\xbb\\x63\\xe8\\xf7\\x1b\\x2b\\xcc\\x72\\x1b\\x95\\x50\\x2a\\x6d\\x7f\\x22\\x3b\\xa5\\x06\\x5c\\x57\\x45\\x37\\xec\\x37\\x1e\\x5c\\xae\\xaf\\x1c\\x4f\\xb0\\xa0\\x29\\x6a\\xf2\\xc8\\xcb\\x49\\xc4\\x7a\\xce\\xfc\\xa0\\xa7\\xf0\\x80\\x8f\\x84\\xeb\\x78\\x71\\x72\\x9b\\xc4\\xb8\\xe4\\xa7\\x5c\\x83\\x76\\x2f\\xe2\\x7a\\x45\\xd4\\xa1\\xba\\x16\\x20\\xf7\\x42\\x2f\\xab\\x93\\x09\\xbf\\x4d\\x93\\xb7\\x08\\xbe\\xb5\\xac\\x09\\x45\\x0e\\xb9\\xbd\\x22\\x4a\\x31\\x2a\\xd7\\xdb\\xbc\\x3e\\x0c\\xdd\\xe0\\x28\\x6c\\x7c\\x81\\xee\\xf8\\xd4\\x59\\xe0\\xd3\\x12\\x00\\x22\\xcf\\x87\\x16\\xcd\\x3f\\x70\\x4e\\x01\\xd9\\x14\\xbb\\xb4\\x5f\\xa6\\xca\\xdf\\x06\\x40\\x6a\\x73\\x2d\\x00\\xe6\\xa6\\x03\\x6b\\x0b\\xa0\\x81\\xfc\\xb0\\x19\\xb0\\x69\\xe0\\xbe\\x6d\\x97\\x1e\\x00\\x6f\\x1d\\xc8\\xc0\\x9d\\x80\\xa0\\xce\\xc1\\x2c\\xed\\x0c\\x25\\x06\\xf6\\x10\\xd8\\x01\\x68\\xbf\\x27\\x0b\\xdc\\xe6\\xc8\\x36\\x0d\\x16\\x65\\xbe\\x4f\\xe2\\xf5\\x1f\\xff\\xfa\\x43\\x03\\xfa\\x4b\\x53\\x6d\\x97\\x97\\x47\\xef\\xcf\\x49\\x54\\xe6\\x55\\xbe\\xab\\xbd\\x7d\\x33\\x42\\x71\\x56\\xbf\\xc4\\x19\\x61\\xee\\xf7\\x3b\\x94\\x56\\xf8\\xd5\\x45\\x5d\\x2a\\x12\\x27\\x28\\xc7\\x7a\\x8a\\x82\\x8c\\x3e\\x73\\xe0\\x38\\x24\\x9e\\x5c\\x78\\xeb\\x6c\\xc3\\xb7\\xc6\\xb7\\x58\\x07\\x8c\\x9a\\x61\\xda\\x33\\xa2\\xac\\x53\\x42\\x75\\x14\\x35\\x93\\x68\\xeb\\x28\\x6a\\xc4\\xda\\xfc\\xd1\\x39\\xfe\\x5d\\x72\\x8f\\x63\\xe5\\x10\\x79\\xbb\\x67\\x59\\x89\\x01\\xab\\x95\\x7f\\x11\\x7c\\x91\\x2a\\x47\\x83\\x48\\x4e\\x85\\x43\\xe3\\xef\\xc4\\xcb\\xd0\\xed\\x16\\x95\\x2e\\x69\\x93\\xed\\x8c\\x76\\x5a\\x22\\x0c\\xeb\\x1c\\xe5\\x59\\x8d\\xb3\\x7a\\xfd\\xc5\\x17\\x62\\x38\\x55\\xef\\xd6\\xd4\\x83\\xae\\x00\\x60\\x71\\xb7\\x6b\\x5f\\x62\\xb4\\x97\\x0f\\xb9\\x5b\\x4d\\xeb\\x44\\x83\\xed\\x99\\x22\\xfd\\x85\\x2a\\xdb\\x4e\\x77\\xd6\\x18\\x91\\x8e\\x4a\\x1b\\x10\\x99\\x05\\xdd\\x64\\x53\\xc2\\x12\\x63\\x22\\xac\\x36\\xf8\\xc4\\x65\\xe8\\x65\\x44\\x86\\x33\\x28\\x3a\\x41\\x61\\x11\\xc3\\x4e\\xdd\\xd0\\xcd\\xb5\\x6a\\x2b\\xe2\\xab\\x95\\x06\\x2a\\xd2\\xfa\\x1d\\x80\\xaf\\xfb\\xe0\\xc2\\x22\\x15\\x02\\x0b\\x89\\x99\\x8e\\x55\\xbd\\x51\\x43\\x5b\\x70\\x13\\x02\\xe5\\x73\\x7b\\xdf\\x82\\xd0\\x43\\xb2\\xc4\\x7d\\xad\\xc8\\xa8\\x2b\\xd4\\x14\\xe5\\x74\\x3f\\xc1\\x5a\\x02\\x48\\x3e\\x25\\xc2\\x8e\\x84\\xf0\\x75\\x60\\x9d\\xe7\\xe9\\x16\\x95\\x32\\x74\\xae\\x40\\x9d\\xae\\x05\\xb1\\x44\\x64\\xaa\\x2d\\x17\\x0f\\x8a\\xa9\\xba\\x64\\x48\\x6f\\x35\\x72\\x6f\\x0d\\xe4\\xde\\x4a\\xe4\\xa4\\x67\\xf7\\xa4\\x45\\x32\\x95\\x6e\\x96\\xd7\\x2f\\xc5\\x6b\\xa6\\x5f\\xd1\\x92\\xee\\x8e\\x60\\x5a\\xa0\\xce\\x77\\x5f\\x9d\\xc1\\x9c\\x91\\xa8\\x4c\\xe1\\xea\\x6a\\xe5\\xd0\\x92\\x19\\x73\\x64\\xe3\\x75\\x5e\\xd0\\xf1\\xdb\\xb2\\x21\\xfb\\x28\\x05\\xa8\\xb5\\xdc\\x35\\xa4\\xcb\\x41\\xb2\\x43\\x75\\xb6\\xaf\\x61\\x8b\\x1c\\x35\\xdd\\x34\\x31\\x24\\xc1\\x54\\x7e\\x0c\\x16\\xa0\\x22\\x0c\\xd0\\x19\\x75\\x14\\x3d\\x2a\\x62\\xd4\\x6c\\xe2\\x57\\xc5\\xa4\\x0e\\xce\\x41\\x24\\x14\\xe1\\x3d\\x91\\xf2\\x58\\xd3\\x36\\x15\\xea\\x86\\xf8\\x48\\x2d\\x39\\x9a\\x21\\x68\\x9e\\x8c\\xcc\\x6a\\x34\\x3c\\x71\\x92\\x23\\x77\\xe3\\xb5\\x86\\x2a\\xdf\\x52\\x73\\xa3\\x5e\\x14\\x78\\xa3\\x0f\\x62\\x72\\x89\\x8b\\x9d\\x4c\\x10\\xaa\\x74\\x82\\x50\\x22\\x64\\xe0\\xfb\\x43\\x9c\\x72\\xb1\\x31\\xd0\\xa5\\x8d\\xc7\\x64\\x86\\xf9\\x0c\\x07\\xf0\\x3b\\xe4\\xc8\\x1b\\x01\\x32\\x95\\xb3\\xc7\\x93\\x19\\x83\\xaa\\x25\\xb0\\xa4\\x45\\x37\\xc1\\xb1\\xd0\\xf0\\x1d\\x46\\x65\\x48\\x28\\x97\\x01\\xe6\\x39\\xc5\\x5b\\x35\\xfa\\xcb\\xd3\\xd8\\xee\\x61\\xb9\\x8d\\xf1\\x95\\x4f\\x23\\x3b\\x22\\x59\\xf1\\x85\\x3a\\x03\\xba\\x1a\\x33\\x01\\xe8\\xa0\\x7e\\xd8\\xe9\\x18\\x83\\x30\\xb9\\x11\\x32\\x50\\xce\\x69\\xfa\\x46\\x6e\\x07\\x78\\x49\\x8b\\x83\\x54\\x27\\x3f\\x16\\x07\\x67\\x72\\x2a\\xb3\\xe2\\x7e\\x63\\x72\\x75\\x02\\x0c\\x74\\x76\\x03\\xfd\\x91\\xc2\\xa5\\xcd\\x17\\xf6\\xba\\xbe\\x71\\xee\\x58\\xef\\x80\\xd2\\xf5\\x1e\\xa3\\x7b\\x82\\x18\\x06\\x92\\xbd\\x32\\x98\\x5d\\x41\\xcb\\x10\\xd5\\x9e\\x4e\\x9d\\xef\\x25\\xc0\\xe9\\x5a\\x16\\xdb\\xff\\xf5\\x54\\xd5\\xc9\\x2e\\xc1\\xb1\\x9c\\x55\\x17\\x5d\\x0b\\x4d\\xb3\\xa7\\xe8\\x21\\x3f\\xd5\\x6c\\x4d\\xdb\\x7d\\x50\\x23\\x49\\xf9\\x75\\x85\\x0b\\x54\\xa2\\x1a\\x83\\x94\\x35\\x3f\\x28\\x43\\x94\\xdb\\x12\\x68\\x6b\\xca\\x13\\x9a\\x9c\\x9d\\x17\\xe6\\x06\\x84\\x49\\xfd\\x19\\x76\\x84\\x30\\xbe\\xbc\\x68\\xec\\x16\\x8b\\x3f\\xc7\\xa8\\x46\\x4c\\xd3\\xec\\xbb\\x4d\\xf5\\x0b\\xa9\\x09\\x9f\\xee\\x1f\\x86\\xcf\\xee\\x66\\x35\\x23\\x0b\\x0e\\x7a\\x6c\\x3b\\x86\\xaa\\xc6\\xbb\\x7b\\x49\\xe2\\xb6\\xc4\\x51\\xcd\\xc2\\xb3\\xff\\x0a\\xbe\\x90\\x4e\\x5c\\x5b\\x98\\x97\\xbb\\xd4\\x6c\\xcc\\x86\\x21\\x50\\x91\\xdf\\x52\\x15\\xb4\\x3c\\xec\\x26\\xd2\\xbd\\x7e\\x31\\x06\\xc0\\x57\\x77\\x5b\\x9f\\x90\\x4c\\x37\\x3e\\x02\\x62\\x23\\xce\\x12\\xfd\\x9c\\xe0\\x54\\xbd\\x79\\xfb\\xad\\x72\\x47\\x87\\x0a\\x05\\x6e\\xe6\\xb0\\xa1\\x6c\\xeb\\x8c\\xfa\\xc1\\xf7\\x7f\\x71\\xa6\\xa1\\x07\\x06\\x1c\\xbd\\x1f\\x03\\x10\\xc1\\xde\\x0c\\xbd\\xa1\\xd3\\xca\\x9f\\x05\\xdb\\xc4\\xe9\\xc0\\x2a\\x9c\\x67\\xf5\\x7a\\x50\\x03\\x3b\\x46\\x2c\\x9d\\x8d\\x41\\xa8\\xaa\\xc8\\x68\\xee\\x4a\\xbe\\x3e\\xd1\\x66\\x73\\x0d\\xb4\\xc7\\xe6\\x54\\x14\\xb5\\xc9\\xf7\\x71\\xc5\\xaf\\x81\\x75\\x03\\xce\\x20\\x63\\x1b\\xd4\\x8d\\xa1\\x77\\x09\\x5b\\xf9\\xb3\\x60\\x8f\\x34\\x36\\x13\\xcf\\xb0\\x6d\\x68\\xec\\x18\\xb1\\x06\\x1a\\x5b\\x9f\\xc8\\x34\\x63\\x53\\x6f\\x20\\xea\\xb1\\x2c\\x71\\xbd\\xd2\\x85\\x72\\x9b\\x77\\xed\\x9f\\x16\\x02\\x8d\\x8e\\xae\\x75\\xed\\xf2\\x60\\x40\\x77\\xf9\\xdc\\x64\\xf0\\xf5\\x21\\x00\\xd5\\x73\\xdf\\x83\\x41\\xd6\\x4f\\x7e\\xe2\\xbb\\x41\\xfa\\xad\\x26\\xf0\\xeb\\x25\\x03\\xdf\\x0c\\x02\\x78\\xd5\\x6e\\x0e\\x37\\x7a\\x08\\x60\\x53\\x8d\\x89\\xda\\x90\\x2d\\x47\\xc0\\xe6\\x22\\x8d\\x9c\\xe1\\xea\\x25\\x2b\\x9e\\xf4\\xd6\\x96\\xcb\\x2e\\x45\\xb3\\x4c\\x07\\xc4\\xb7\\xfd\\x74\\xcb\\x34\\x82\\x95\\x89\\x3b\\x9b\\x16\\xf7\\x61\\x08\\xb3\\xba\\x1e\\x64\\x65\\x79\\xa2\\x63\\x0b\\xaf\\xc0\\xa9\\xcb\\x32\\x75\\xcd\\xd4\\x5b\\xf9\\x7d\\xa7\\x6d\\xad\\x72\\xd5\\x1e\\xed\\x33\\x2b\\x4b\\x5c\\xfb\\xe9\\x34\\x4d\\x50\\xb3\\x22\\x0c\\x2b\\xb2\\xfe\\xea\\x50\\xba\\xb9\\x47\\xc6\\x03\\x35\\x38\\x00\\xd7\\x92\\x8f\\x1d\\x91\\x14\\xb5\\xc9\\x4f\\x7d\\xab\\x52\\x75\\x92\\xc0\\x17\\xac\\x76\\x70\\xfb\\xe0\\x87\\x55\\x30\\x4a\\x01\\xdb\\x72\\x20\\x3c\\x92\\x4b\\x02\\x3e\\xe5\\x40\\xb8\\x6d\\x42\\x17\\x04\\xb2\\x0f\\x54\\x20\\x4c\\xfb\\x4c\\xf5\\x54\\xa3\\x5d\\xbd\\xaa\\x0c\\x60\\xfd\\x4a\\x5b\\xe9\\xb8\\xdd\\xe8\\xd2\\xc9\\xd0\\xad\\x72\\xbf\\x9d\\x76\\xd3\\x96\\xb2\\x83\\x88\\xd4\\x79\\x9b\\x26\\x7d\\x0f\\xe9\\x70\\xbc\\xb7\\xa8\\xf7\\xc9\\x1d\\x39\\x0a\\xcc\\x19\\x5f\\xd2\\xf6\\x94\\xf6\\x6f\\xcb\\xa6\\x08\\x30\\xe8\\x71\\x52\\xc2\\xc6\\x0a\\x69\\x7f\\x86\\x06\\x95\\x5b\\xb4\\x6d\\xee\\x80\\x37\\x9f\\x8c\\xdc\\x9a\\x41\\x38\\x70\\xd8\\x2e\\x89\\x89\\xf8\\x87\\xc0\\x48\\x5b\\x64\\x7c\\xb7\\x19\\xab\\xe7\\x5b\\xe8\\x8e\\x17\\x46\\x3d\\x43\\xb7\\xee\\xd3\\xed\\x63\\xe2\\xba\\x78\\x9b\\x1c\\xf7\\xe7\\x2e\\x09\\xdd\\x1a\\x87\\x5b\\xa3\\x6d\\x75\\x36\\xbe\\xdd\\x49\\x9e\\x61\\xe6\\x68\\x8d\\x21\\x89\\x3b\\xdf\\x24\\xdb\\x6b\\x4d\\x94\\xa3\\xbe\\x45\\xf2\\x30\\xb1\\x6c\\xe1\\x18\\x77\\xf9\\x99\\xc3\\x5e\\xdb\\x54\\x5a\\x83\\xf6\\x92\\x37\\xb2\\x76\\xe8\\x7f\\xa9\\x3d\\x11\\xf6\\x37\\x41\\xa5\\x82\\x42\\x75\\x98\\x64\\x5c\\xcd\\xa4\\x8e\\xd9\\x11\\xbb\\xe5\\xc6\\x7a\\x7f\\x96\\x22\\x5d\\xc5\\xa3\\xc3\\x26\\x47\\x38\\x20\\x3f\\xba\\x74\\xa0\\x90\\x2a\\x91\\xb5\\xe7\\x9b\\xaa\\x74\\xea\\x93\\xb5\\xaf\\x61\\x75\\x9a\\x13\\x9e\\x60\\xd5\\xe6\\xad\\x46\\x02\\xfd\\xbb\\x49\\xba\\x2c\\x9e\\x6d\\xe7\\x88\\xa1\\x0b\\x40\\x22\\xb2\\xcb\\x3e\\x0e\\xef\\x93\\x7f\\x19\\x84\\xdd\\xed\\x0b\\xd2\\x26\\xde\\xa6\\xee\\xeb\\x86\\x65\\xc2\\x50\\x8d\\xcc\\x88\\x27\\x9a\\xb6\\x3a\\x3c\\xc7\\x8b\\xf0\\x2d\\xb2\\x0e\\xf8\\x21\\x23\\xee\\x03\\xf7\\x59\\x1e\\x1e\\xe4\\x20\\x0d\\xe5\\xa5\\x48\\xd2\\x54\\xf1\\x4b\\x32\\xa0\\xeb\\xab\\xaa\\x3a\\x8e\\xf1\\x3a\\x4d\\xce\\xca\\xbe\\x67\\x19\\x41\\xe9\\x9c\\x56\\x2c\\xf6\\x48\\x07\\x0e\\xb9\\xd1\\xa0\\x73\\xff\\x6e\\x55\\xa3\\xe8\\x1d\\x3c\\x56\\x3b\\x90\\xc0\\x32\\xb9\\x5e\\x5a\\xff\\x02\\x67\\xf2\\x15\\x97\\x7e\\x97\\x70\\xad\\x27\\x78\\x0f\\x0e\\x60\\xdc\\xb8\\x1f\\x3c\\xdc\\x05\\xc9\\x18\\x5d\\xe7\\xf5\\xee\\xc0\\x3e\\x2c\\x86\\x0c\\x89\\xa7\\x77\\x01\\x4f\\x3d\\xfc\\x3f\\x40\\x1f\\xc1\\x21\\x5f\\xa3\\xad\\xcb\\xf6\\x48\\x92\\xc7\\xd4\\xdd\\x02\\x65\\xea\\x51\\x16\\x09\\x87\\xdd\\x1c\\xaa\\x4f\\x76\\x09\\x13\\xaa\\x7d\\xaa\\x9f\\xb5\\xaf\\xf9\\x74\\x47\\xf7\\x30\\x42\\xd7\\x44\\x77\\x77\\x21\\xcf\\xf5\\xd7\\x0e\\xc9\\x86\\x57\\xdb\\x3c\\xa8\\x6f\\x93\\x25\\xe0\\xe6\\x7a\\xf7\\x65\\xb2\\x6d\\xb8\\x82\\xef\\x6c\\xf7\\x60\\xb6\\xe7\\x84\\x94\\x4d\\x2b\\x73\\x6d\\xd3\\x4a\\x53\\xc2\\xe7\\xa3\\xee\\xfd\\x9a\\x1c\\x3d\\x49\\xbb\\xa3\\x34\\x2d\\xa8\\x8a\\xca\\x3c\\x4d\\x9b\\xa5\\x03\\xb9\\x7f\\x57\\xdc\\xe0\\x0a\\x4f\\xfc\\x7a\\x9e\\x1b\\xf0\\xe9\\xd6\\x95\\x70\\x3e\\x9f\\xf0\\xff\\x78\\x81\\xf1\\x11\\x04\\x18\\x5b\\xeb\\x2e\\x39\\x2d\\xc5\\x39\\x7e\\xe8\\x77\\x51\\x92\\xa8\\x84\\x2b\\xec\\xa5\\xdd\\xbb\\x83\\xf7\\xc9\\xa8\\xcc\\x68\\x87\\xb5\\x88\\xfd\\xfe\\x2e\\x39\\x16\\x79\\x59\\xa3\\xac\\xde\\x08\\x49\\x61\\xa1\\x54\\x79\\x8f\\x50\\x58\\x2e\\x30\\xe5\\x74\\xb8\\x7d\\x02\\x60\\x15\\x2e\\xf0\\xb6\\x61\\xa5\\xae\\xb2\\xb9\\xb8\\xce\\x0b\\x33\\x0a\\xbd\\xb2\\x1f\\xc4\\xe9\\x7b\\xf0\\xf0\\xc9\\x98\\x21\\xeb\\xa1\\xf6\\x05\\x30\\x5f\\xd8\\xc8\\x8c\\xee\\xf9\\xdb\\xcb\\xec\\xc9\\xad\\x1b\\xbf\\xb8\\x7f\\x45\\x1f\\x68\\xce\\xcb\\x04\\x67\\x35\\x5d\\x44\\xa6\\x28\\x8b\\xab\\x08\\x15\\xb8\\xb3\\x86\\xa7\\x64\\x2a\\xf4\\x7d\\x72\\xf3\\x76\\xe3\\xce\\x50\\x92\\xe1\\xd2\\xdd\\xa5\\xa7\\x24\\x7e\\xab\\x93\\x35\\x61\\xd0\\x11\\x2e\\xc0\\x6d\\x75\\x95\\x5a\\x8f\\xbc\\x90\\xfd\\x53\\x60\\xda\\x57\\xe6\\x45\\x17\\xdd\\xfc\\xce\\xd2\\x29\\x2f\\x65\\xf7\\x18\\xf1\\x1d\\xbd\\x0e\\x40\\x20\\xa6\\x7e\\x9f\\x00\\x6d\\x55\\xb7\\x02\\xf5\\x4c\\x82\\xb4\\x37\\x5e\\x3c\\x88\\x36\\xf5\\x7b\\xb9\\xe9\\x69\\xa9\\x87\\xc3\\x06\\x45\\x3a\\x73\\x20\\x8b\\x02\\x6a\\xe4\\xdc\\xfa\\x19\\x35\\x1b\\x25\\x91\\x08\\x84\\x49\\x44\\x43\\x62\\x5b\\xa2\\x2c\\x16\\xf3\\x09\\x62\\x70\\x6c\\xb3\\x4c\\x73\\xfb\\xa7\\x74\\xfa\\x82\\xb1\\x48\\x51\\x98\\x68\\x74\\x65\\xe6\\x44\\x94\\x5c\\x99\\x64\\x49\\xe4\\xc9\\x42\\x8f\\xb8\\xdf\\x76\\x96\\xe8\\x48\\xa4\\x26\\x3a\\x02\\x35\\x73\\x19\\xed\\xac\\x8f\\xa8\\x96\\x25\\xbe\\x6d\\xd4\\x70\\xb8\\x80\\x18\\x49\\x2b\\xa9\\x15\\xff\\xc6\\x23\\x4c\\x62\\x6e\\xba\\x3f\\x85\\xf0\\x2d\\x6b\\x89\\x7c\\xb8\\x19\\x7f\\x1c\\x69\\xec\\x7d\\xf5\\x52\\x97\\xf4\\xa3\\x99\\x12\\xd8\\xf1\\x92\\x28\\xcf\\xdc\\x66\\x52\\x03\\x9d\\xec\\x0e\\xc3\\xee\\x6d\\x41\\xfd\\x2b\\x56\\xa0\\xb5\\xd6\\x91\\x7b\\xdd\\x11\\x96\\x1f\\xc6\\xee\\x1d\\x54\\x4c\\x15\\xd2\\x4c\\xb3\\x6d\\x26\\x43\\xb7\\x8c\\xde\\x7a\\xe9\\xcd\\x8b\\x7b\\xc7\\x6d\\xf3\\xa2\\x0c\\xcc\\x52\\xab\\xe2\\x4b\\x0e\\xbe\\xfe\\x70\\x70\\xa0\\x7e\\x0e\\x0f\\x95\\x98\\xc4\\x59\\x5b\\x8a\\xac\\xb5\\x29\\x47\\x75\\x36\\xdb\\xda\\x0d\\xf5\\x4f\\xfa\\x76\\x2d\\x32\\x53\\x91\\x9e\\xfc\\xb0\\x1b\\x02\\x55\\xf9\\xf8\\xf9\\x8c\\x89\\x43\\x47\\x3d\\x10\\x36\\xe9\\xab\\x21\\xc9\\x91\\x7e\\xd6\\xe4\\xdb\\x84\\x43\\x45\\xe4\\x96\\xfa\\x46\\x07\\x62\\xad\\xa6\\x38\\x16\\x3b\\xae\\x96\\xfb\\x15\\xee\\x5e\\xe9\\x35\\xb6\\xc6\\x9e\\xb4\\x3c\\xab\\x30\\x4a\\x58\\x4e\\x5f\\x49\\x79\\x98\\x4d\\x6d\\x0e\\x98\\x9a\\xe4\\x68\\x76\\x79\\x79\\x3c\\x6b\\x89\\x7d\\xab\\x27\\x71\\x0d\\xae\\x44\\x73\\x67\\xfd\\xf3\\x7c\\xd3\\x62\\xf4\\xd1\\x6b\\x81\\xc9\\xd3\\x2d\\x14\\xac\\xa4\\xfa\\x43\\x72\\x5e\\x1e\\x9f\\xec\\x5d\\x2d\\x9d\\xe6\\x23\\xdf\\xd5\\x32\\x12\\xb4\\xbf\\xab\\x25\\x55\\xbb\\xf6\\x5d\\x2d\\x13\\x11\\x75\\x57\\x8b\\x19\\x0f\\xd8\\x00\\x32\\x0c\\x59\\x7d\\x57\\xcb\\x54\\xcb\\xf2\\xae\\x96\\x54\\xe5\\xaa\\x77\\xb5\\x64\\x0a\\xed\\x73\\x4a\\x52\\xf1\\x13\\xbf\\xab\\x05\\x36\\xc9\\xdf\\xd5\\xd2\\x1b\\x36\\xbc\\xab\\x05\\x53\\x81\\x37\\x77\\x00\\x44\\xaf\\x78\\x57\\x4b\\xa2\\x32\\xe2\\x5d\\xad\\xbe\\xf8\\xa9\\x0d\\x4e\\x2d\\xe3\\x09\\x0d\\x11\\x75\\x27\\xb8\\x9e\\x6e\\x1c\\xe2\\x14\\xc4\\x94\\x81\\xe8\\xb2\\x7d\\x7d\\x0d\\x6f\\x5b\\xd7\\x8c\\x0f\\xcd\\x6a\\xc4\\x30\\x27\\xc2\\xfc\\x47\\x64\\xc1\\xe0\\xc5\\xb0\\xb5\\x49\\x75\\xed\\xf0\\xe1\\x8e\\x70\\xf0\\x59\\x79\\xb7\\x31\\x41\\x09\\x7c\\x5d\\x94\\x13\\x91\\x3d\\x76\\x59\\x92\\x50\\x27\\xd0\\xd3\\x7b\\x81\\x0f\\xd4\\xba\\xaf\\xa4\\x5a\\x33\\xbd\\x96\\x34\\x75\\xc6\\xf7\\xb5\\x84\\x0f\\x3c\\xf9\\x68\\x5d\\x90\\x8b\\x74\\xf4\\xcf\\xb8\\xfa\\x02\\xa1\\x4d\\xef\\xf5\\xdb\\x32\\x39\\x9c\\xdd\\xd1\\x04\\xf2\\x4b\\xf4\\xe6\\x00\\x61\\xe1\\x22\\xe4\\xab\\xf4\\x89\\x85\\x5c\\xed\\xff\\xc8\\x44\\xe4\\x91\\xd0\\x99\\x32\\xf0\\x96\\x0b\\x4f\\x1e\\xdf\\x34\\xff\\xd4\\x4b\\x25\\x97\\xcd\\x3f\\xb5\\xb6\\xb2\\x3a\\x53\\x76\\x1f\\x18\\x11\\x95\\xc9\\x21\\x8c\\x23\\x7f\\x36\\x26\\x5f\\xe8\\xfb\\xb7\\x1b\\x40\\xe4\\x88\\x0a\\x07\\xb0\\xd6\\x4e\\x07\\x47\\xe0\\xf6\\xf4\\x44\\xd9\\xdb\\x21\\x5c\\x61\\x72\\x55\\x4f\\x1a\\x72\\xf2\\x17\\x84\\x5e\\xac\\x01\\x0c\\x5a\\xbe\\xd4\\x03\\x3b\\x25\\xec\\x76\\x40\\xe8\\x89\\x37\\x8e\\x0c\\xc3\\x1b\\xc2\\xa5\\x69\\xbb\\x0a\\xd9\\xe8\\x79\\x95\\x5d\\x48\\xbb\\xc7\\xf8\\x75\\x84\\x6c\\xe3\\x83\\xb9\\x42\\x0f\\xaf\\x0c\\xc9\\x78\\x49\\x62\\x2f\\x7d\\x61\\x3d\\xaf\\x57\\xbf\\xb9\\xb9\\x31\\x56\\xd7\\xd2\\xa6\\x2a\\x02\\x89\\xa1\\xa3\\x86\\x35\\x11\\xbc\\xb0\\x81\\xa7\\x07\\x67\\x88\\x1a\\xa5\\xed\\x3e\\x43\\x4c\\xad\\x6f\\x46\\x02\\xb4\\x62\\x59\\xcd\\x0e\\x1b\\xdb\\x83\\xd7\\xb5\\xe3\\xea\\x3e\\x99\\x17\\x80\\xdb\\x18\\xe4\\x1a\\x7a\\xaa\\x5e\\xdb\\xbf\\x27\\x76\\x22\\x86\\x46\\x86\\x79\\x96\\xde\\xca\\x57\\x77\\xf2\\x6a\\x1f\\x64\\xec\\x2b\\x39\\x1a\\x3e\\xc0\\x28\\xf5\\x7b\\x30\\xc9\\xc3\\x5f\\x2a\\x76\\x7b\\xda\\xdc\\x46\\x52\\xbd\\x26\\xd4\\x08\\x1f\\xde\\x9e\\x7e\\x19\\xe8\\x00\\x4c\\xf3\\xe5\\xa0\\x3d\\x1c\\x8f\\xaa\\xa2\\x2a\\xaa\\xed\\x44\\x92\\xdd\\xe2\\xb2\\xc2\\x80\\x97\\x0d\\x43\\xf5\\xfe\\x73\\xff\\xa6\\xf9\\xa7\\x56\\x85\\xa7\\x3f\\xab\\xb8\\xf9\\x67\\xc7\\x55\\xa4\\x04\\xe3\\xf4\\x6f\\x86\\x81\\xdc\\x85\\x4a\\x4b\\x9c\\xfe\\xf4\\xb0\\xa6\\xce\\x80\\x06\\xa2\\xf7\\x74\\x06\\x9e\\x04\\x5d\\xdd\\x1f\\x78\\x12\\x64\\xc5\\x1a\\xc0\\xe0\\xa8\\x2d\\x48\\x3d\\xd6\\x60\\x9a\\x04\\xf5\\xe0\\x0d\\xe1\\xd2\\xe4\\x80\\x66\\xb3\\xd9\\x95\\xd6\\x01\\x4d\\x82\\xc4\\xa1\\x0e\\x57\\xe8\\xe1\\xb5\\x67\\x12\\xd4\\x4f\\xdf\\x3a\\x09\\x22\\x37\\x43\\x1b\\xaa\\x6b\\x93\\x20\\x15\\x01\\x98\\x04\\x05\\x7e\\xf3\\xcf\\xae\\x4e\\x65\\x12\\x64\\xc1\\x19\\xa2\\x46\\x68\\x12\\x64\\x35\\xb5\\xbe\\x49\\x10\\xd0\\x8a\\x29\\x84\\x29\\xb7\\xca\\x8d\\xf2\\x73\\x96\\x6f\\x13\\x6c\\x0f\\xf6\\x35\\x83\\xa5\\x7f\\xba\\xd6\\xef\\x88\\x06\\xcf\\xd8\\xc6\\xd5\\x7d\\x32\\x97\\x35\\x74\\xc6\\x36\\xbe\\xea\\xb5\\xfd\\x7b\\x62\\x8f\\x37\\x7c\\xc6\\x76\\x4d\\xe5\\xab\\x3b\\x79\\xb5\\xc3\\x34\\xf6\\x55\\x9c\\x5e\\xf5\\xd8\\xa5\\x3e\\xff\\x00\\x5d\\x97\\x3a\\x69\\x33\\x51\\x35\\xcc\\xdb\\x74\\xf8\\xf0\\x26\\x8d\\xf3\\x36\\x1b\\x66\\xef\\xbc\\xcd\\xc4\\xf1\\xa8\\x2a\\xaa\\xba\\x2e\\xde\\xb6\\xc4\\x28\\x8e\\xca\\xd3\\x71\\xdb\\x7e\\x7e\\xbb\\x51\\xbe\\xbe\\x89\\xfb\\x03\\x07\\xdc\\x0f\\x4c\\xee\\x72\\x05\\x1f\\x8c\\x6f\\x9b\\x12\\x37\\xd3\\xca\\x9f\\x74\\x24\\x9c\\xd7\\x69\\xb2\\xde\\xe2\\x5d\\x5e\\xb6\\x1b\\xb2\\xe8\\x75\\x4a\\x1b\\x61\\x85\\xd0\\xde\\x57\\xf9\\xe6\\xef\\xbe\\x8f\\xfc\\x2f\\x24\\x12\\x7c\\xf3\\xa5\\x38\\x71\\x2f\\xd0\\x3e\\xc9\\xc8\\xee\\x0b\\xf8\\x83\\x06\\x78\\xbc\\x89\\x74\\xde\\x01\\x37\\xdd\\x76\\xf4\\xf4\\x5e\\x29\\xd0\\x66\\xbc\\xca\\x05\\x55\\x81\\xec\\x57\\x37\\x6e\\xb4\\x53\\xbf\\xea\\xa1\\xac\\xde\\xab\\x7d\\xc9\\x55\\xb6\\x43\\x2f\\xe2\\x35\\x1d\\x12\\x51\\x7a\\x22\\x9d\\x4a\\x53\\x7b\\x25\\x01\\x49\\x0f\\xa1\\x4f\\x05\\xb6\\xbc\\xba\\xe9\\xf6\\x20\\xb9\\x19\\xe1\\xf8\\x9a\\xc6\\x82\\x00\\x23\\x1c\\x5c\\x99\\xb0\\xd7\\x5b\\xed\\xdc\\xa6\\x5a\\xcc\\x2e\\xbb\\xd4\\x15\\x0c\\x57\\x20\\x10\\xe5\\x7c\\xe0\\x46\\x7e\\x4d\\x62\\xc8\\xc1\\x2d\\x55\\x37\\x42\\xf4\\x83\\x4a\\x01\\x5e\\x94\\x98\\x05\\xc2\\x1a\\x66\\x8d\\x00\\x0b\\x4d\\xa0\\x93\\xad\\x65\\x36\\xb6\\xd6\\x7b\\x6a\\x09\\x7c\\x30\\x97\\x9f\\x56\\x10\\x1b\\x14\\x63\\x22\\x5c\\x0e\\xb1\\xa9\\x46\\x32\\x03\\x54\\xef\\xbe\\x04\\xb2\\x52\\x16\\x44\\x20\\x9c\\x05\\x1c\\x72\\xec\\x0f\\x78\\xcd\\x5c\\xd1\\xb6\\x9b\\xee\\x35\\xb7\\xc2\\xca\\xa8\\x67\\xb9\\xea\\x4e\\x18\\xbd\\x05\\xf3\\x70\\x07\\xe0\\xea\\x78\\x13\\x47\\xf1\\xc2\\x3a\\xc6\\x17\\xf2\\x68\\x63\\xb4\\x4d\\xc3\\x5c\\x07\\x5b\\x47\\xba\\xde\\xb4\\x0a\\x96\\xda\\xae\\x8e\\xba\\x64\\x69\\x99\\x24\\xd9\\x81\\x37\\x9f\\xe8\\xa4\\x2d\\x22\\xd5\\xe1\\x36\\x91\\x4e\\xad\\x22\\x9d\\x42\\xdd\\x32\\x8b\\x54\\x03\\x5b\\x45\\xaa\\x37\\xad\\x82\\x49\\xdb\\xb8\\x84\\xcf\\x0c\\xf3\\xa0\\xaa\\xdf\\x47\\xa1\\x9d\\x21\\x26\\x54\\x1c\\x38\\xbe\\x12\\x00\\xeb\\x07\\xfd\\x4d\\x98\\xb6\\x05\\x77\\xaa\\xb6\\x19\\xb4\\xef\\xb0\\xff\\x9c\\x24\\xdf\\xe5\\x37\\x6f\\xbb\\xe7\\x28\\x61\\x81\\x97\\x8c\\x3f\\x7c\\x4c\\x2b\\x7b\\x19\\xbe\\xaf\\xbb\\x1e\\xd1\\x3f\\x49\\xa7\\x84\\xaf\\x97\\x2d\\x72\\x51\\xe2\\xdb\\x24\\x3f\\x55\\x42\\x85\\xb6\\x48\\xa8\\x44\\x77\\x69\\x31\\x04\\xc5\\x5b\\xca\\x45\\x72\\x4f\\x60\\x1f\\x29\\x01\\x48\\x2b\\x57\\x38\\xb7\\x8b\\x47\\x77\\x76\\xc8\\xaa\\x6a\\x95\\xe4\\x85\\xf8\\xe8\\x78\\x8b\\xe6\\xbf\\xa6\\xf8\\x28\\x8c\\xb0\\xe5\\xfc\\x85\\x74\\xdb\\xc9\\xd2\\x74\\xdb\\x49\\x7b\\xe5\\xbf\\x64\\x5d\\xfd\\x97\\xb0\\x6c\\x51\\x85\\xe9\\xab\\x4d\\x92\\xca\\xbd\\x70\\x8e\\x8f\\x17\\x44\\xb9\\x66\\x52\\xe2\\x7f\\x0d\\x7b\\x6a\\x80\\x49\\x86\\x5d\\xa2\\xc6\\xfa\\xbf\\xc6\\xc7\\xa2\\x7e\\x50\\xce\\x10\\x91\\x0b\\x4b\\xd9\\xc6\\x17\\x6d\\x7e\\xc8\\x8f\\x07\\x31\\x02\\x96\\xef\\xce\\x64\\xca\\x2b\\x21\\xfd\\x7c\\x28\\xf1\\xae\\x5d\\x99\\x40\\x20\\xe3\\xf3\\xad\\xe4\\x7b\\x31\\x27\\xc7\\x5e\\xaa\\x37\\x3e\\x72\\xaf\\xe0\\x41\\xcd\\xca\\x20\\x53\\xb3\\xe1\\xcd\\xc2\\x5f\\xf9\\x9c\\x1c\\xf0\\xca\\x37\\x67\\x8f\\xbc\\x3d\\xad\\xe0\\x41\\xcd\\xca\\x20\\x53\\xb3\\xf4\\xf5\\x77\\x4e\\x4e\\x7d\\xe9\\x97\\xb7\\x49\\x5e\\xa7\\x15\\x91\\xa0\\x06\\x85\\x72\\x63\\xf6\\x8e\\xbc\\xeb\\xcc\\x09\\x01\\xef\\x79\\x72\\xcb\\x22\\xaf\\x4c\\x2a\\x78\\x50\\x9b\\x32\\xc8\\x78\\x11\\x00\\x79\\xe7\\xb5\\xb5\\x10\\xed\\xbd\\x3e\\x3e\\xed\\x20\\xef\\xc9\\xc9\\x68\\xa0\\x1d\\x89\\x10\\x53\\x9b\\xf4\\xe5\\xc6\\x0b\\x7b\\xb1\\x0e\\xde\\x54\\xd6\\xbd\\x68\\x23\\x6e\\xc5\\x9f\\x16\\xf7\\xce\\x52\\x8f\\xb5\\xef\\xd5\\x15\\xf0\\x07\\x87\\xa0\\x91\\xa5\\x46\\x04\\xb2\\xc3\\x86\\x74\\xcb\\x3c\\xa4\\x69\\xaf\\x6d\\x43\\x5a\\x7b\\xb0\\x8c\\x55\\xe2\\xef\\x96\\x71\\x1a\\xd2\\x2e\\x2d\\xfe\\x88\\xd9\\x05\\x31\\x06\\xb8\\x77\\xa2\\x7f\\x5d\\xe9\\x9d\\x9a\\x30\\x4c\\x59\\x49\\x6a\\x7c\\xe4\\x93\\x7a\\xce\\x4e\\x77\\xda\\xb8\\x5d\\x42\\xbc\\x95\\xdf\\x21\\xe4\\xb3\\x77\\x83\\xf3\\x97\\xc9\\xf3\\xba\\x52\\x8c\\x83\\x71\\x5e\\x33\\x54\\x69\\x1f\\xce\\x5c\\x3d\\x35\\xdd\\xb1\\x23\\xae\\x3f\\xc9\\xac\\xe4\\xd7\\xd3\\x71\\x9b\\xd7\\x65\\x77\\xab\\x16\\xd9\\xcf\\x34\\x05\\x76\\xc4\\x4f\\xf5\\x9d\\x54\\xa4\\x88\\x76\\x24\\xc9\\x0e\\xb8\\x4c\\xa0\\x85\\x0b\\x09\\xe7\\x6d\\x33\\x8e\\x77\\x08\\x26\\xc2\\x9f\\x87\\xe0\\x2c\\x11\\x10\\x51\\xd5\\xed\\x7f\\xca\\x01\\x94\\x30\\x50\\x4c\\x3e\\xf4\\x7d\\xa1\\xfa\\xdb\\x43\\x29\\xce\\xd7\\xf8\\x00\\x9e\\x37\\xff\\x2e\\xe2\\x49\\x91\\xb6\\x86\\x76\\x0a\\xca\\x01\\xc4\\x63\\x3d\\x7b\\x09\\xdc\\xba\\x25\\xf4\\xbc\\xa5\\x7e\\x56\\x6e\\xa0\\xa6\\xf9\\x77\\xa7\\x8a\\x4a\\x8c\\x33\\x7a\\xb2\\x4d\\xdf\\xde\\x05\\x6b\\x6a\\x76\\xa3\\x6b\\x6a\\x46\\xb6\\xc5\\x3d\\xb2\\x87\\xe2\\x03\\x5a\\xb4\\x87\\x0b\\x5f\\xe9\\x8f\\xa6\\xc9\\x4e\\x37\\x8b\\x29\\xd9\\xd3\\x5e\\x1f\\x4e\\xc7\\x6d\\x86\\x92\\xd4\\xf0\\xbc\\x8c\\xbe\\xcd\\x2e\\x54\\xcf\\x5d\\x88\\x57\\x93\\x5c\\x3d\\x45\\x15\\x5f\\xc8\\x12\\x1e\\xea\\xa3\\x48\\x8e\\x17\\x56\\x0e\\x46\\x15\\x76\\x93\\xcc\\xcd\\x4f\\xb5\\xf2\\xd8\\x9f\\x01\\xa9\\x17\\x43\\xe8\\xbd\\x43\\xae\\x7c\\x99\\x74\\x05\\xec\\x06\\x18\\x61\\xcc\\x8a\\xe7\\x3f\\xba\\x13\\xf9\\xa8\\xab\\xc2\\x1f\\x0b\\x11\\x8a\\x5a\\xd7\\xd6\\x95\\x40\\xf7\\xae\\xf0\\x59\\x48\\xc7\\x8e\\x17\\xa1\\x82\\xe4\\xfd\\x84\\x03\\x4b\\x1b\\xf1\\xeb\\x19\\x4a\\x71\\x59\\x9f\\xa5\\x83\\x5f\\x23\\x8f\\x48\\x43\\x09\\x42\\x42\\xd5\\x39\\xcc\\xe4\\x2d\\xad\\xca\\xf0\\xa7\\x48\\xf4\\x7f\\xf4\\xc7\\x59\\x97\\xcd\\x10\\x27\\xb0\\xb7\\xc5\\x84\\xfd\\x38\\x69\\x3b\\xbc\\x5b\\x94\\xd7\\x85\\xfa\\xc0\\x24\\x23\\x1c\\x27\\xd5\\x31\\xa9\\xc8\\xac\\x7d\\x22\\x17\\x25\\x5b\\xed\\x75\\x80\\x29\\x5c\\xd1\\xf1\\xa2\\x34\\xaf\\xa0\\xfa\\x0c\\x62\\x0a\\x6e\\x4d\\xa8\\x66\\x1b\\x2c\\x89\\x0f\\x83\\x24\\xd0\\x4e\\xef\\xb8\\x5a\\xa2\\xe5\\x62\\x0a\\xad\\x1e\\xe2\\xdd\\xce\\x8f\\xd5\\xfd\\x94\\xf1\\x02\\xaf\\xa2\\x85\\x42\\xca\\x01\\x1d\\x62\\xb4\\xc2\\xe1\\x76\\xaa\\xa2\\x8a\\xf2\\xe7\\xb3\\xcf\\xed\\x7c\\xd6\\xcc\\x56\\x28\\x84\\x4c\\x03\\xdb\\x29\\xdb\\xd2\\xbf\\x81\\xdf\\xf0\\xc6\\xf1\\x4e\\xcd\\x59\\x6d\\x23\\x7c\\xb3\\x0b\\x44\\x3a\\x30\\x63\\x68\\x81\\x03\\x2c\\xb5\\x07\\x72\\x35\\x9b\\x87\\x8b\\x15\\xc7\\x52\\x9e\\xf4\\xbf\\x41\\x8b\\x78\\xba\\x85\\xfc\\x46\\xb4\\xbb\\xc1\\x53\\x85\\xb1\\x1d\\xc2\\xdb\\x28\\x52\\x48\\xc1\\xbc\\xed\\x96\\x38\\xd8\\xce\\x55\\x54\\x80\\xbd\\xc5\\x62\\x1e\\x74\\x42\\x93\\x9f\\xf3\\x46\\xab\\xd9\\x6c\\x16\\x42\\xdc\\x85\\x31\\x8e\\xb5\\x77\\xd7\\xb7\\x51\\x14\\x07\\x32\\x25\\x98\\x39\\x3c\\xdb\\xae\\x22\\x5f\\xc1\\x04\\x78\\xbb\\x99\\x4d\\xe7\\xd3\\xd9\\xe5\\x0f\\xdc\\x31\\xbe\\xc3\\x0f\\xbb\\x12\\x1d\\x71\\xe5\\x14\\x65\\xbe\\x2f\\x71\\x55\\xb9\\x5b\\x72\\xa2\\xb6\\x4c\\x0a\\x5c\\x9d\\x77\\x65\\x7e\\x14\\x27\\xb1\\xad\\x71\\xcf\\x48\\xf2\\xe2\\x52\\xe7\\x20\\xd4\\x77\\xfc\\xcb\\xe5\\x0f\\x6e\\xfe\\x5e\\xc9\\xbf\\x47\\xda\\x1e\\xa7\\x78\\x16\\x4e\\xa9\\x41\\xde\\xb0\\xff\\x1e\\x30\\xd3\\x07\\xa1\\xbe\\x13\\x55\\xda\\xd3\\x8c\\xc6\\x03\\x53\\x3a\\x66\\xc7\\x3f\\xd9\\xee\\xa0\\xdd\\xef\\xdd\\x3e\\x38\\x4a\\x6e\\xaf\\xb2\\xe4\\xee\\xc2\\x6e\\xae\\x67\\x58\\x42\\x18\\x73\\xd6\\x96\\xee\\xb9\\xc2\\x49\\x2e\\xe9\\x7d\\xcb\\xa1\\x98\\x40\\x54\\x27\\x1d\\x73\\xbc\\x05\\x8d\\xc6\\x4a\\x34\\x57\\x80\\x46\\x88\\x2c\\x37\\x66\\x49\\xf1\\xa4\\x2b\\x65\\x25\\x8e\\x2c\\x5f\\xed\\x94\\x21\\xe7\\x8f\\x3e\\x03\\xec\\xb6\\x0f\\x02\\xce\\xe6\\x31\\xde\\x4f\\x80\\x13\\x6c\\xf3\\x57\\x4e\\x38\\x7f\\x31\\x11\\x42\\xa9\\xf6\\xf7\\xdc\\x7f\\x61\\xa8\\x69\\x86\\x2c\\x15\\x1a\\xca\\xdf\\xaf\\xf4\\xa3\\xc5\\x6e\\xfe\\x19\\x32\\xfd\\xc9\\x73\\x0c\\x3c\\x18\\x4b\\xc6\\x1b\\xf1\\x44\\x33\\x5f\\x4e\\xc4\\xca\\x10\\xd9\\x24\\xdb\\xc7\\xe3\\x78\\x21\\x2b\\x50\\x0c\\x92\\xb7\\x87\\xb2\\xe4\\x48\\x17\\xb8\\x90\\x87\\x74\\x42\\xfe\\x50\\xb5\\x93\\x64\\xbb\\x24\\x4b\\x6a\\x32\\x6e\\xc6\\x57\\x1a\\x5d\\x43\\x1d\\x67\\xbd\\x49\\x2d\\xfb\\x00\\x84\\x08\\x3c\\x0f\\xc4\\xe7\\x81\\xa8\\x71\\xac\\xd8\\x5d\\x4f\\x56\\xb3\\xc7\\xe8\\xd4\\xda\\xcf\\x16\\xf7\\x6c\\x71\\x7d\\x16\\xd7\\x9f\\xd9\\xee\\x31\\x3a\\x80\\xc0\\xb3\\xdd\\x3d\\xdb\\x5d\\x9f\\xdd\\xf5\\x7e\\xda\\xe8\\x31\\x3b\\xbd\\xfe\\xb3\\xd5\\x3d\\x5b\\x1d\\x60\\x75\\x24\\xa7\\xad\\x1e\\x92\\x66\\xc5\\xd0\\xf3\\xb7\\xec\\x2d\\x09\\x02\\x9f\\xd0\\xff\\x71\\xb7\\x79\\xfc\\x70\\x56\\x17\\xd6\\xbf\\xe5\\xf9\\x71\\x1d\\x5c\\x44\\x14\\x96\\x4b\\xc7\\xb3\\xb6\\x05\\x37\\xdf\\xfe\\x8a\\xa3\\x5a\\xbd\\x6d\\x52\\x84\\x79\\xc9\\x71\\xef\\x76\\x19\\x6a\\xf5\\x42\\x6e\\x8a\\x4a\\xf2\\x74\\x8c\\x9d\\xb7\\xc2\\xa3\\xe3\\xf2\\x46\\x0e\\xfa\\xc1\\x8b\\xd6\\x68\\x0a\\xe4\\x0a\\xe4\\x44\\xb6\\xf2\\xfd\\x40\\xa8\\xd0\\xf4\\x60\\xa2\\x57\\x66\\xed\\x00\\x57\\xad\\x2a\\x1f\\xe6\\xea\\xbc\\xe0\\xa4\\xe8\\x37\\xba\\xb3\\xe1\\xb6\\x09\\xde\\x1c\\xb9\\x28\\x4c\\xfd\\xd0\\x4f\\x4a\\x39\\xce\\x01\\xa3\\x86\\xd9\\xb3\\xe5\\x4e\\x8b\\xb9\\xd0\\xe3\\xa4\\xaa\\xd5\\x8d\\x2d\\xda\\xc6\\x95\\xee\\xfb\\x95\\xfd\\xde\\x7c\\x7a\\x09\\x90\\xf2\\xb5\\x6b\\xfc\\x4d\\xf8\\xc0\\x8d\\xe8\\xe3\\x76\\x79\\x2a\\x1c\\x0c\\x79\\x46\\xb0\\xe7\\x3e\\x04\\x9d\\xa6\\xf9\\xca\\x8a\\xc7\\x3d\\x2e\\x89\\xd4\\x96\\x26\\xf4\\xf1\\x3b\\x4d\\xac\\xdd\\x39\\x4a\\xbd\\x8e\\xa3\\x16\\x70\\xab\\x30\\x10\\x33\\xe2\\x8b\\x47\\xfc\\xb4\\x56\\xba\\xcd\\x23\\x4a\\x39\\xdd\\x61\\x03\\x37\\xc5\\x2a\\x19\\x80\\xda\\x11\\xd1\\xa1\\x5b\\x7e\\x49\\x7a\\xee\\x62\\x10\\x95\\xf8\\xc8\\x63\\x97\\xfa\\xa2\\x7b\\x89\\xd4\\xcf\\xc3\\x7c\\x3f\\xd0\\xc4\\x08\\x69\\x77\\x0b\\x98\\xe0\\xd7\\xed\\x93\\x24\\xdf\\x5a\\x4d\\x34\\xcd\\x0a\\xed\\x61\\xf3\\x9a\\x8a\\x84\\xff\\x3e\\x93\\x68\\x3f\\x79\\x0c\\x67\\xb9\\x91\\xfd\\x78\\x7e\\x7b\\x6a\\x19\\x98\\xd5\\xae\\x76\\x80\\xb7\\x01\\xe8\\x84\\x69\\xb9\\x49\\xc7\\x0c\\x6a\\xd8\\xf1\\x6c\\xbb\\x96\\xdc\\xb0\\xfb\\x17\\x6e\\x60\\x84\\xd6\\x7a\\x2a\\xbc\\xf5\\xaa\\x23\\x4a\\xd3\\xf1\\xf5\\xac\\xd5\\x46\\xdb\\xd6\\xa0\\x6a\\x3d\\xbc\\xf6\\xd5\\xb6\\x57\\xb6\\x1b\\xf5\\x95\\xd5\\xfa\\x38\\xee\\xa9\\x4d\\x2a\\xf7\\x8d\\x27\\x93\\xa2\\xe0\\x71\\x61\\x17\\x95\\xb5\\xce\\x80\\x91\\x14\\x2d\\xe3\\x18\\xeb\\x9b\\x5e\\x46\\x7e\\xf0\\xd4\\x23\\x09\\x27\\x60\\x08\\x0b\\x30\\x7d\\x33\\x99\\xb1\\xe1\\xaf\\xb7\\x9e\\xa2\\x23\\x63\\xc3\\xa6\\x88\\xd8\\xc2\\x6d\\x91\\x51\\x21\\xd2\\x83\\x24\\x9f\\xc0\\x37\\x0a\\xdc\\x27\\x1f\\x93\\x8d\\x0c\\x75\\x3b\\x13\\xec\\x08\\x7d\\x1d\\x93\\x6c\\xa8\\x87\\x75\\xde\\xe6\\x20\\xac\\x41\\xc2\\x90\\xdd\\xb2\\xdd\\x19\\x33\\x49\\xc9\\xce\\x98\\xda\\x93\\x46\\x7e\\xc4\\x87\\x72\\x40\\xc4\\x4d\\x6d\\x13\\xe3\\x3a\\x65\\x03\\x81\\xd1\\xa6\\x6c\\xad\\xd4\\x6b\\xc7\\x4d\\x6d\\xa3\\xae\\x09\\xd0\\xaa\\x61\\xa1\\xba\\x0d\\x43\\xb6\\x5d\\x93\\x60\\xa3\\x19\\x9e\\xee\\x80\\x69\\x27\\xa1\\x61\\x36\\x5c\\x01\\x6a\\xed\\xc9\\x20\\x93\\x15\\x9b\\xea\\x47\\xe9\\xef\\xfa\\x18\\x4b\\x65\\x72\\x91\\x2d\\x95\\xda\\x8a\\x46\\x7b\\xdc\\xe6\\x09\\x40\\xa6\\x8c\\x80\\x89\\x77\\x90\\xbe\\x99\\xcc\\x68\\xab\\xed\\xab\\xd7\\x6b\\xb8\\x8c\\x80\\x51\\xe3\\x1c\\x6e\\xd5\\xb6\\x4c\\xa4\\x07\\x49\\x52\\xa1\\x59\\xe0\\x68\\x17\\x46\\x91\\x99\\x61\\xb3\\x1d\\xcb\\x08\\x7d\\x1d\\x1b\\x64\\xcd\\x4a\\x9b\\x83\\xb0\\x06\\x09\\x63\\x84\\x59\\x73\\x49\\x49\\x66\\xcd\\xec\\x49\\x23\\x3f\\x6a\\xd3\\x0d\\x20\\x64\\x5a\\xdf\\xc4\\x3c\\x44\\xdd\\x48\\x64\\xb4\\x49\\xf7\\x54\\xeb\\xb5\\x68\\x5a\\xdf\\xa8\\x77\\x06\\xb6\\xea\\x5b\\x22\\x61\\xc7\\x91\\x34\\x67\\x14\\x34\\xde\\x46\\x11\\x68\\xcd\\x94\\x8a\\xd9\\x98\\x25\\x78\\x4f\\x9f\\x06\\x99\\xb2\\xdc\\xe0\\x10\\xa4\\x21\\x62\\x18\\x61\\xc7\\x5c\\x46\\x92\\x1d\\x33\\x1b\\x32\\xea\\xbc\\x2f\\x27\\x07\\xce\\xbd\\xf5\\xb7\\x29\\xa5\\xe3\\x8e\\x17\\xaf\\x40\\x99\\x76\\x53\\x6e\\xe8\\x0f\\x4f\\x9a\\x59\\xb7\\x7e\\x42\\x3b\\x80\\xe8\\x86\\xa5\\x40\\xd9\\xb0\\xe4\\xcb\\x9b\\x7f\\x8c\\x48\\x8c\\x61\\x9a\\xfd\\x15\\xf7\\xa9\\x72\\x00\\x97\\x96\\x9e\\x18\\x1c\\x72\\xc5\\x75\\xff\\x09\\x43\\xe8\\x08\\xa0\\xd2\\x36\\xf8\\xf6\\x16\\xbb\\x11\\x47\\x59\\xaf\\xd1\\x7a\\x75\\x52\\xa7\\xd8\\xa6\\x5f\\x5f\\xdc\\xa0\\xb5\\xd0\\x77\\x8e\\x0a\\x64\\xda\\x55\\xa5\\x5e\\x46\\x8f\\xba\\x75\\xa5\\xca\\x9f\\x40\\x3d\\x56\\x0d\\xe6\\x7a\\x97\\xe7\\x75\\x77\\xb0\\x51\\x14\\x74\\xcf\\x06\\x38\\xf9\\x16\\x72\\xe0\\x01\\xc6\\x9e\\x23\\x96\\xc0\\xe9\\xce\\x0c\\xa7\\x6f\\x85\\x01\\x30\\xe1\\x45\\x94\\x53\\x7e\\x7b\\x8f\\x88\\xa2\\x6f\\x1d\\xd6\\xa8\\x68\\xee\\x77\\x00\\x59\\xad\\xce\\x59\\x7f\\x7f\\x63\\xa3\\x3d\\xa0\\xae\\x35\\x2d\\x66\\x9d\\x35\\x92\\xf2\\xeb\\xd9\\xbd\\x2c\\x0d\\xa6\\x75\\x96\\x1e\\x4c\\x7a\\xd4\\x50\\x90\\xda\\xef\\xb2\\xdd\\x7a\\xf3\\xe2\\xe3\\xd2\\xfd\\x3d\\x19\\x46\\x49\\x7d\\x50\\xee\\x69\\xac\\x4b\\x1a\\xe2\\xaf\\xc7\\x98\\xc0\\x90\\x4f\\x08\\xd6\\x8b\\x9c\\x95\\xa6\\xaf\\x68\\x8a\\xed\\xf9\\x14\\x83\\xc4\\x6b\\x79\\x18\\x43\\xc8\\x06\\x85\\xd4\\x74\\xf7\\x3c\\x83\\x02\\x7f\\xb9\\x25\\xae\\x8a\\x3c\\xab\\xc8\\x51\\x29\\x52\\x62\\x1c\\x6d\\x20\\x6d\\x87\\x1d\\x53\\x90\\xa9\\xc2\\xa5\\x7a\\x5b\\x8e\\x72\\xc8\\xc1\\x7a\\x72\\xe7\\x62\\x22\\x26\\xbf\\x3a\\x4d\\xa0\\xe0\\xb8\\xd3\\x20\\x03\\x4e\\xa9\\x5b\\x07\\xce\\x48\\x46\\xde\\xd6\\x4d\\x28\\x94\\x4b\\x4a\\x33\\xa7\\x63\\x08\\x37\\x06\\x37\\x98\\xf0\\x23\\x78\\x1a\\xd5\\xea\\xa7\\x26\\x5e\\xa7\\x8e\\x9f\\x46\\xda\\xbd\\xed\\x1c\\x3e\\x88\\x56\\x9f\\xac\\x3f\\xbd\\xed\\x58\\xfa\\xf3\\x74\\x1a\\x78\\x3a\\x19\\x3f\\x9d\\x14\\x1f\\x23\\x27\\x8b\\xf9\\xbf\\x57\\x13\\x07\\xe2\\xf4\\xfb\\xb0\\xf0\\xa7\\x68\\x66\\x80\\x6a\\x3e\\x48\\x33\\xe6\\xde\\x3c\\x99\\xf4\\x9f\\x4c\\xbe\\x4f\\x26\\xc1\\x47\\xc8\\xc8\\x76\\xc9\\x8a\\xd9\\xb6\\x85\\x9b\\x5a\\x18\\x07\\x46\\xd6\\x4c\\x33\\xc4\\x6b\\x67\\x84\\xa3\\x78\\x61\\xea\\x11\\x0b\\xca\\x41\\x76\\x68\\x27\\xda\\xcc\\xde\\x06\\x12\\xbd\\x96\\x99\\xe1\\xed\\x7d\\x7a\\x62\\x1d\\x1c\\xcd\\x1e\\xd5\\xc6\\xc0\\xc8\\xfc\\x08\\x4d\\x3e\\x51\\x3f\\x7a\\xda\\xb0\\x45\\xbf\\xa7\\x11\\xf9\\x13\\x49\\xf5\\x89\\x04\\x77\\xb5\\x6c\\xce\\x1f\\xc7\\x92\\x1f\\xef\\x2e\\x7a\\x45\\xfe\\x9e\\x3d\\xd2\\xd3\\xf4\\xa2\\x57\\x55\\x8f\\x77\\x81\\xd6\\x18\\xf7\\x24\\x12\\x7d\\x1a\\xa1\\x5d\\x2b\\x97\\x1e\\x57\\xad\\xac\\xcf\\x9b\\x4e\\xbe\\x56\\x56\\xfa\\x1a\\x44\\xd0\\x9f\\xcc\\xe3\\x6b\\x01\\xd7\\xa8\\x72\\x11\\xe9\\x6c\\x4c\\x14\\xca\\x43\\x6b\\xc8\\xdc\\x69\\x32\\xb6\\xc6\\x41\\x4a\\x83\\x29\\x63\\x99\\x82\\xb0\\xd9\\x72\\x55\\xc4\\x33\\x7f\\x15\\xcc\\x40\\x88\\x32\\xf4\\xb6\\x2e\\xdf\\x5a\\x3d\\x3c\\x80\\x6e\\x0b\\x3a\\x1d\\x7a\\x63\\x12\\x23\\xa8\\xb7\\xe8\\xc3\\xa8\\x37\\xf3\\xbb\\x11\\xd4\\x5b\\xf4\\x61\\x01\\xf3\\x4a\\x59\\x0d\\x22\\x70\\x2d\\x07\\x83\\xe4\\x39\\x88\\xc0\\xb5\\x1c\\x0c\\x92\\xf9\\x20\\x02\\x60\\x48\\xe3\\x2f\\xfd\\xf5\\x5b\\xab\\xd1\\x8f\\x83\\xe2\\x1e\\x80\\x2d\\xc8\\x76\\x0c\\xf6\\x20\\xda\\x82\\xd4\\xc6\\x60\\x0f\\x0a\\x88\\xd7\\x49\\x69\\xa0\\x99\\x5e\\x55\\x7f\\x88\\x24\\x07\\x1a\\xe9\\x55\\xf5\\x87\\x48\\x7b\\xa0\\x89\\xea\\x21\\x8b\\xbf\\x39\\xd7\\x63\\x74\\xb2\\x93\\xef\\xb5\\x51\\x65\\xe1\\xda\\x67\\x1a\\x43\\xa9\\x83\\xe8\\x2a\\xf5\\x01\\xa6\\x60\\x6f\\x6f\\x34\\x81\\x31\\x1c\\x0c\\xea\\xf1\\x68\\x02\\x07\\xf5\\x2b\\x4d\\xaf\\x3e\\xc5\\x89\\x4d\\xbf\\x3a\\x45\\x6c\\xb3\\x36\\x99\\xa1\\x0f\\xa4\\x0d\\x61\\x5f\\xa3\\x4b\\x5b\\x6b\\x63\\xeb\\x8f\\x69\\x7f\\x48\\x6f\\xc7\\xd6\\xef\\xd3\\x63\\x47\\xcf\\x70\\xd4\\xa5\\xfb\\xc0\\x05\\x7d\\x97\\xa5\\xa7\\x82\\x04\\xb8\\x43\\xff\\x30\\x9d\\x9b\\x91\\x6f\\x2d\\x57\\x6b\\xbd\\x96\\x2b\\xb7\\x77\\x43\\xe9\\x98\\xed\\x3e\\x02\\xb8\\x77\\x20\\xae\\xed\\xa3\\xe0\\x64\\x54\\xbd\\x11\\x53\\x61\\x99\\xa2\\xf6\\x31\\xcf\\xc0\\x31\\xc5\\x53\\x1b\\x76\\x80\\x86\\xb5\\xed\\x12\\x62\\xdb\\xed\\xad\\xab\\xf2\\x25\\x54\\x1a\\x82\\xf2\\xf5\\xd4\\xfa\\x56\\x9d\\xb2\\x59\\x60\\x28\\xcd\\x81\\x42\\x1c\\x4c\\xcf\\x91\\xef\\x71\\xe4\\x4c\\xc1\\x8f\\x0e\\x81\\x84\\x60\\x19\\x43\\x7c\\xb1\\x45\\x98\\xce\\x5a\\x7b\\xc3\\x2c\\x78\\xfc\\x43\\xc2\\x31\\x88\\xf8\\x8a\\x53\\x25\\x36\\xb2\\x23\\xa5\\x3c\\x84\\xa4\\x33\\xe6\\xc2\\x4c\\x90\\xd0\\xb5\\x82\\x96\\xb9\\x6b\\x2f\\x10\\x01\\x2f\\x54\\x93\\x70\\x4c\\xe6\\x7c\\xd5\\x55\\x6d\\x36\\xca\\x63\\x8d\\x7a\\x00\\x49\\x45\\xdc\\x9c\\x35\\xc3\\x5e\\x77\\x03\\xad\\xab\\x4d\\x5b\\x62\\x90\\xde\\x9e\\x01\\xde\\x11\\xd7\\x21\\x98\\x64\\x7d\\xd5\\xd5\\x73\\x46\\xb2\\x23\\x05\\xdd\\x4b\\x4f\\x95\\x32\\x63\\xca\\xb0\\x4f\\x1b\\x22\\x74\\xad\\x88\\x65\\xd6\\xda\\xbb\\x22\\xc0\\x0b\\xef\\x24\\x1c\\x83\\xa0\\xaf\\xbb\\x4a\\xcf\\x46\\x79\\xa4\\xac\\x87\\x90\\x54\\x9d\\x35\\x63\\xcd\\xb0\\x7f\\xd8\\x40\\xeb\\x5a\\x89\\xcb\\x0c\\xf2\\x6b\\x12\\xc0\\x3b\\xfc\\x44\\x14\\x83\\xbc\\xaf\\xbb\\x1c\\xd0\\x42\\x78\\xa4\\xb8\\x07\\x50\\x54\\xa5\\xcd\\x18\\x33\\xec\\x72\\x85\\x49\\x5d\\x2b\\x6c\\xce\\x1e\\x3e\\x6e\\x71\\x2c\\x4e\\x2e\\xfb\\x0e\\x8a\\xb3\\x3d\\xaf\\xdd\\x75\\xd1\\xbe\\x7a\\x71\\x9f\\x4e\\xd4\\xd1\\x4a\\xd8\\x36\\x40\\x0d\\x91\\x14\\x00\\xe5\\x09\\xb9\\x9d\\x10\\x00\\xd0\\x9b\\x08\\x00\\xc0\\x6d\\x12\\xe3\\xbc\\xeb\\x0d\\xda\\x56\\x79\\x7a\\xaa\\xe9\\x05\\xa2\\xcd\\x2c\\x97\\xef\\xe3\\xa5\\x47\\xe8\\x85\\xc3\\xc9\\xe2\\x75\\x7e\\xdd\\xcc\\x5a\\xeb\\x40\\xb0\\xd8\\x3e\\xac\\xce\\xca\\xc5\\xc1\\xf3\\x85\\x17\\xce\\x5f\\x00\\xd8\\xb3\\xed\\xc3\\x54\\x45\\x5e\\x36\\x98\\x77\\x38\\x4d\\xcf\\xc7\\x24\\x93\\x6e\\x09\\x6c\\xb7\\x82\\xae\\x0c\\xf7\\xc6\\xda\\xe7\\x7a\\xe2\\x24\\x13\\x4f\\x9b\\x7f\\xe3\\xaf\\x4c\\xec\\xd9\\x57\\xdc\\x83\\x4a\\xfb\\xe5\\x10\\x8b\\xf9\\xc7\\x29\\xaf\\x81\\x67\\xbc\\xe5\\x01\\xa8\\xdc\\x4a\\x48\\xeb\\xbb\\x69\\xb7\\xfd\\x38\\x9c\\xc1\\xb7\\x43\\x13\\xbc\\xea\\x28\\x5d\\xc4\\x2b\\xa3\\x91\\x2c\\x3c\\xbd\\x4e\\x56\\xb8\\x0f\\xdc\\x76\\x0d\\xb6\\xf1\\xe6\\x77\\xdf\\x67\\x4f\\x8c\\x48\\xbb\\xab\\x7d\\x87\\xcc\\x0e\\x77\\x49\\x5a\\xe3\\x72\\x8d\\xd2\\xe2\\x80\\x5e\\xe6\\x05\\x8a\\x92\\xfa\\xe1\\xf7\\xa1\\xff\\x6a\\xc3\\x7e\\xaf\\xbd\\x90\\xf1\\xc1\\xcf\\x35\\xd3\\x3f\\xa4\\x6d\\xee\\x6d\\x0b\\xf6\\x0b\\xd5\\xe1\\xc6\\xe6\\x62\\x63\\xed\\x39\\x7c\\xda\\xf5\\xf6\\x1a\\xbb\\xa2\\xc0\\xa8\\x44\\x59\\xc4\\x5e\\x5d\\xeb\\x46\\xb1\\xd2\\x42\\x67\\x63\\x6b\\xdf\\x11\\xd7\\x98\\xc7\\x3c\\x46\\xa9\\x9b\\x17\\x38\\x53\\x2f\\x16\\x61\\xb0\\x6e\\xd0\\xed\\x92\\x7b\\x1c\\xb3\\x11\\xc7\\xb2\\x4d\\xda\\xc8\\xe3\\xe7\\xb7\\x03\\x7f\\xee\\x6f\\xc4\\x5b\\xee\\xb5\\xfb\\x40\\x79\\x17\\x78\\xb9\\x5b\\x45\\x65\\x9e\\xa6\\x0d\\xf7\\x75\\x7e\\x8a\\x0e\\x9b\\xfc\\x54\\x37\\x6a\\x6b\\x99\\xf4\\x76\\x28\\xc6\\x0e\\x63\\x38\\x4e\\x50\\x9a\\xef\\xcf\\xc0\\x75\\x97\\x52\\xd1\\x2e\\x2f\\x8f\\x8e\\x37\\x65\\x17\\x51\\xeb\\x97\\x59\\xf3\\xbf\\x74\\x3c\\x01\\xc9\\x44\\x49\\x6d\\x88\\x22\\xa6\\xa8\\xc6\\x2f\\xfd\\x89\\x1b\\xce\\x5f\\xbc\\xda\\xb8\\xc7\\xca\\x0e\\xcf\\xad\\x60\\x0b\\x8c\\x0b\\x25\\xc9\\x6c\\x22\\xd1\\xea\\xfa\\x36\\x9e\\x7c\\x0b\\x43\\xbe\\x89\\x1b\\xff\\x95\\x68\\x44\\x8c\\x99\\xd6\\x96\\xdc\\x7b\\xae\\xef\\xb6\\xe4\\x81\\xde\\xe5\\x2d\\x73\\xad\\xc7\\x29\\xea\\xc3\\x85\\x7b\\xc0\\xf9\\x25\\x31\\xa4\\x1a\\x7b\\xdd\\x0f\\xa8\\x07\\x1f\\xd0\\x00\\xee\\x99\\x8c\\xd2\\xa4\\x58\\x77\\x4e\\x5c\\xf6\\xc3\\x1a\\x4c\\x73\\xc5\\xab\\xd5\\x4a\\x2f\\x15\\x1d\\x5f\\xf8\\x4a\\xf7\\x70\\x9d\\x51\\xc3\\x67\\x40\\xa6\\xc5\\xbd\\xb3\\x52\\x1c\\xb0\\x7a\\x04\\x04\\xc6\\xe1\\x82\\x69\\x3a\\x11\\x97\\x79\\x71\\xed\\xb0\\x9d\\xf9\\xd0\\x83\\xa4\\xbe\\xaf\\xd2\\x27\\xa3\\xf1\\x0c\\x3a\\x2e\\xc1\\x6f\\xe9\\xd5\\x92\\x0c\\xae\\xa4\\x78\\x3b\\x56\\x8d\\x3d\\x9b\\x2b\\xdd\\xbc\\x6e\\xcc\\xc0\\x90\\x57\\x68\\x94\\xaa\\xfc\\xea\\x71\\x21\\xb5\\xe5\\x86\\x9d\\x19\\x89\\x47\\x4c\\xb4\\x63\\x40\\xfc\\xa2\\xfd\\xb6\\x0f\\xe4\\x70\\x8d\\x66\\x70\\xf2\\x71\\x1b\\x8a\\xaa\\x1e\\x02\\x69\\xf8\\x16\\xae\\x49\\xa1\\x31\\x0b\\xce\\x61\\xc9\\xbd\\xa0\\x84\\xc8\\x43\\x9d\\xaf\\x9b\\xff\\xd2\\x12\\x7c\\xe2\\x1d\\xf9\\x1a\\x03\\x4e\\xf7\\x66\\x88\\x4e\\xa2\\x7d\\x28\\x12\\xaa\\x43\\x62\\xfd\\xeb\\xee\\xa7\\xfc\\x52\\x23\\xaf\\x41\\x5d\\xf6\\x16\\x95\\xee\\x11\\xa3\\xea\\x54\\x62\\xc3\\x0c\\xcd\\x5d\\xad\\x56\\x4d\\x28\\xa7\\x63\\x7a\\xde\\x4c\\x7a\\x98\\x94\\xe7\\xd2\\x55\\xd1\\x94\\x5e\\xfb\\xfe\\xb2\\xf6\\xe6\\x83\\xe4\\x32\\x28\\x68\\xe1\\x77\\xf7\\x4f\\x93\\x07\\x38\\x1c\\xd1\\xbb\\x70\\x37\\x01\\x0e\\xb6\\x39\\x3b\\x99\\x63\\x1d\\x6d\\x06\\xa4\\x56\\x02\\xfc\\x26\\x9c\\x69\\xc3\\xc7\\x45\\x67\\x7d\\xb5\\x0a\\x05\\xd6\\x53\\xce\\xf6\\x8a\\xa2\\x7b\\x75\\x9e\\xa7\\x75\\x52\\x00\\x72\\xeb\\x86\\xe4\\xd2\\x57\\x26\\xed\\x64\\x76\\xb3\\x43\\xc7\\x24\\x7d\\x58\\x1f\\x70\\x7a\\x8b\\xeb\\x24\\x42\\x4e\\x86\\x4f\\x78\\xf2\\x9f\\xf9\\x9f\\x93\\x6f\\xca\\x04\\xa5\\x93\\x0a\\x65\\x95\\x5b\\xe1\\x32\\xd9\\x81\\x8f\\xe3\\xf0\\x1b\\xa9\\xca\\x23\\x4a\\xa5\\x49\\xd3\\x4c\\x9d\\x34\\x75\\xcf\\x4e\\x28\\xd7\\xfd\\x88\\x7f\\x57\\x35\\x2a\\x6b\\x78\\xc6\\x23\\x4e\\xb4\\xba\\x82\\x2e\\xa4\\x90\\xb2\\x14\\xd7\\x35\\x2e\\xc9\\xb3\\x3b\\xcd\\xb0\\x61\\x7c\\xdd\\xe5\\x65\\xec\\x6e\\x4b\\x8c\\xde\\x49\\x25\\x10\\xd6\\x5d\\x89\\x8a\\xb6\\x40\\x7a\\xc2\\x87\\xf6\\xb0\\xcf\\x5d\\xd1\\x3e\\xd3\\xb6\\xa8\\x1d\\x31\\x05\\x19\\xfd\\xd6\\x4a\\xf4\\x5b\\xab\\x0e\\xbf\\xce\\x0b\\xe9\\x2d\\xc0\\x76\\xa4\\x92\\xf1\\x40\\x66\\xb1\\x1c\\x55\\xba\\x40\\x8d\\x3d\\x64\\xab\\x3d\\x4c\\xc3\\x91\\xd9\\x75\\x65\\x46\\xd2\\x12\\xb2\\x78\\xd3\\x1a\\x40\\x58\\x62\\xc3\\x4d\\x32\\xf9\\x29\\x96\\xd0\\x57\\x9f\\x58\\xba\\x19\\x7f\\xe5\\x79\\x33\\x03\\x06\\xbe\\x41\\xf0\\x36\\x51\\x59\\xe6\\x77\\x80\\xf1\\x2b\\x97\\xb1\\xfb\\xf2\\xf2\\x02\\x38\\x9a\\x48\\x0d\\x99\\xb8\\x50\\x49\\x07\\x8e\\xd2\\x94\\x1c\\xf8\\xe6\\xfe\\x0b\\x59\\x20\\x42\\x7c\\x61\\xbe\\x8a\\xbe\\x9e\\xe4\\x48\\x07\\x91\\xc4\\xa8\\x28\\xb4\\x45\\x68\\xa8\\x0d\\xb6\\x4f\\x10\\x6d\\x54\\x97\\xcd\\xaf\\x62\\x7b\\x5c\\x9b\\x84\\x7e\\x4f\\x2f\\xf5\\xeb\\xdf\\xae\\x6f\\x13\\x6c\\x8f\\x7c\\x31\\xf2\\x5f\\x6c\\xe4\\x1b\\xec\\x88\\xa5\\x1b\\x5b\\x92\\x5a\\xa3\\x1b\\xad\\xa0\\xf6\\x20\\x99\\xf2\\xe6\\xf8\\x6c\\xa6\\xb7\\x3d\\x9f\\xb7\\xb8\\x11\\xb6\\x73\\x80\\xcd\\x51\\x01\\x41\\x0d\\x0e\\x36\\x19\\xad\\x31\\x39\\x55\\x03\\x34\\x07\\x1a\\x8e\\x38\\x61\\x13\\x34\\x08\\x77\\xf2\\x8a\\x36\\x8d\\x8a\\xd4\\xad\\xe6\\xfa\\x36\\x8b\\xbc\\x20\\xeb\\x61\\x53\\xe2\\x46\\x9b\\x7e\\x2e\\x94\\x55\\xa3\\xe0\\x8e\\x96\\x0b\\x31\\x97\\xc2\\x23\\xd8\\x63\\xc2\\xe0\\xec\\x5f\\x34\\x0c\\x7e\\xa8\\x25\\x52\\x14\\x45\\x57\\x2c\\x91\\xcc\\x73\\x35\\x5f\\x99\\x86\\x85\\xd0\\x5c\\x0d\\x40\\xd2\\x82\\x3a\\x33\\x4b\\x12\\xa4\\x45\\x1b\\xa7\\x2b\\x4c\\x0e\\xa5\\x71\\x59\\x1c\\xec\\x32\\x9c\\x85\\x62\\xf1\\x4a\\x57\\x09\\x4e\\xa2\\xaf\\x3c\\xd9\\x16\\xe1\\x6c\\xf1\\x21\\x3d\\xae\\xdf\\x3d\\x00\\x26\\x1f\\x6e\\x37\\xbc\\x48\\xbb\\x6c\\xfe\\x59\\x16\\x44\\xdb\\xe6\\x9f\\x22\\xe2\\xd6\\xf7\\x3a\\xdd\\xf8\\xec\\x96\\xd3\\x5d\\xde\\x8d\\x30\\xd3\\x62\\xbc\\xf5\\x88\\x83\\x98\\x28\\x7f\\xaf\\xd1\\xae\\x06\\x87\\xb7\\x3c\\x61\\x7d\\x5c\\x38\\x97\\x9b\\x54\\x4e\\x8e\\x07\\x3a\\x93\\x8c\\x29\\xd6\\xa7\\xf5\\x17\\x5f\\xc8\\x7e\\x4b\\x56\\x52\\x9d\\x17\\x1d\\x61\\x76\\x37\\x2a\\x79\\x3c\\x1f\\x74\\xf6\\x04\\xa4\\x47\\xc8\\x2e\\x17\\x20\\x94\\x4a\\x46\\x38\\x7f\\xa5\\x78\\xc9\\xee\\x34\\xb1\\xc6\\x08\\xe3\\xbf\\xd3\\xe7\\x46\\x33\\xa2\\x4d\\xdb\\x39\\xe7\\x0b\\x80\\x1f\\xe1\\x7d\\x70\\x53\\x73\\xc4\\xb8\\x79\\xcf\\xa5\\xf8\\x4d\\x3b\\x29\\x0d\\x0b\\xa1\\xd7\\x52\\xa4\\x16\\xfa\\x2d\\x96\\x1b\\x7a\\x4e\\x82\\xae\\x95\\x11\\xb9\\xe7\\xb4\\xa7\\x74\\xe0\\xc1\\x5d\\x96\\x98\\x11\\x3a\\x0d\\xb7\\x44\\xc9\\x8a\\x7d\\x1e\\xa3\\x6a\\x6e\\xc3\\x60\\xb0\\x13\\x04\\x21\\x01\\x14\\x49\\x18\\x78\\x61\\xdd\\x66\\x89\\x80\\xe1\\xda\\xb6\\xb2\\x44\\x37\\x06\\x08\\xae\\x48\\x55\\x36\\x7b\\x72\\x6d\\x80\\xb6\\x95\\x76\\xc4\\xc9\\x93\\xd0\\x71\\xa1\\xd8\\xd8\\x6d\\x81\\x0f\\xd6\\x69\\x76\\x0a\\xbd\\x9b\\x1f\\x1b\\x7b\\xdc\\xcb\\x0b\\xe9\\x71\\x84\\xca\\xfc\\x54\\x41\\x8f\\x23\\x77\\x30\\xb6\\xd4\\x31\\xe5\\x1c\\xc9\\xb7\\x22\\x2d\\x19\\x2e\\x57\\x7e\\xeb\\x25\\xf6\\x7b\\x98\\x49\\x20\\x07\\xd2\\xd3\\xfc\\x41\\x25\\xf6\\x2a\\xa2\\x43\\xe6\\x0e\\x72\\x52\\x1a\\x44\\xe9\\x81\\xc3\\xfc\\xbd\\x65\\x0f\\x2d\\x82\\xb0\\xe4\\xb8\\x3f\\x4b\\x73\\x1b\\xfe\\xee\\x26\\x4a\\x53\\xfa\\xe8\\x66\\x3b\\x2d\\x71\\xa7\\xf1\\xab\\xc9\\x4b\\x2d\\xb3\\xdc\\x14\\x9f\\x61\\xc1\\x0c\\x4b\\xcc\\x2f\\x6c\\x0f\\x4d\\xca\\xb9\\xf9\\x85\\xf1\\xb9\\x49\\x0b\\x3d\\x61\\x46\\xb3\\x43\\x11\\x76\\x6f\\x93\\x2a\\xd9\\x26\\x69\\xb3\\x56\\x17\\x5e\\x25\\x33\\x80\\x78\\xed\\x02\\x97\\x55\\x81\\xe9\\x25\\x46\\x01\\x9e\\x36\\x93\\x50\\xb5\\x04\\x96\\x3e\\xbb\\xf9\\xc8\\x63\\x77\\xa6\\x83\\x28\\x19\\xbe\\xaf\\xcf\\x6c\\x16\\x6c\\xc9\\xdc\\x4f\\xe3\\x97\\x8d\\x55\\x4e\\x4c\\x79\\x78\\x11\\x6e\\x67\\x86\\xde\\xa8\\x0e\\x62\\x14\\x25\\xbe\\x1d\\xc6\\x8b\\xdb\\xc7\\x8c\\x3b\\x8c\\x1b\\x8b\\x50\\xfa\\x18\\x65\\xb3\\xb3\\x41\\xec\\xfa\\x36\\x56\\x29\\xf0\\xa2\\xf3\\x69\\x62\\x31\\x23\\x17\\xbe\\xaa\\xa5\\x44\\x78\\xca\\xed\\xfa\\x30\\xc5\\x33\\xcf\\xa1\\x8e\\x20\\x6c\\x5a\\x3f\\x09\\x8f\\xe6\\x82\\xe4\\xce\\x6c\\xda\\x0a\\xc1\\x3b\\x75\\xbb\\x66\\x02\\x06\\x35\\x68\\x1a\\x30\\x75\\x96\\x4e\\x82\\x6d\\xad\\x88\\x83\\x04\\x64\\xb7\\x09\\x05\\x65\\x9e\\x8e\\xfd\\xf8\\x3f\\x17\\x9f\\xef\\xeb\\x7f\\xad\\x4f\\xff\\x10\\xac\\x3e\\x1e\\xb8\\x78\\xa5\\x4f\\xc1\\xc5\\xa9\\xeb\\xa0\\xcf\\x1a\\x6a\\xaf\\xa8\\x7c\\x06\\xbf\\x1e\\x42\\xb4\\x21\\x67\\xa2\\x1d\\x5f\\x2a\\xf0\\x7d\\x3f\\x78\\xe5\\x34\\x22\\x1c\\xf6\\xb4\\xc7\\x63\\x29\\x32\\x46\\x3b\\x7a\\x84\\xfe\\x84\\x64\\x34\\xea\\xbc\\x98\\xd0\\x34\\x43\\xf3\\x6b\\x57\\xe6\\xc7\\x97\\x72\\x4b\\xaf\\x26\\x75\\xfe\\x52\\x6b\\xeb\\xd5\\x80\\xf7\\x3d\\xea\\xdc\\xa1\\x6e\\x75\\x30\\xeb\\x4c\\x3d\\x45\\x99\\xef\\x93\\x78\\xfd\\xc7\\xbf\\xfe\\xd0\\xd0\\xfd\\x0b\\x77\\x09\\xde\\x9f\\x93\\xa8\\xcc\\xab\\x7c\\x57\\x7b\\x6d\\x1b\\x64\\x19\\xff\\x5d\\xa3\\xe7\\xaa\\x2e\\x7f\\xff\\xd5\\x97\\x37\\x3e\\xfd\\xbf\\xaf\\x26\\x38\\x8b\\x85\\x72\\xbf\\x2d\\xff\\x4f\\xac\\xea\\x5f\\x1e\\x0a\\xfc\\xfb\\x40\\xea\\x46\\x89\\x0b\\x8c\\xea\\x35\\xfd\\x1f\\xf7\\x1e\\xb0\\x04\\x3a\\x02\\x78\\x4e\\xab\\x7d\\xf4\\xd8\\x2c\\xf3\\x5e\\x55\\xd2\\xee\\xfb\\xaa\\x8c\\x1e\\x61\\x1c\\x23\\x29\\x3e\\xc2\\x38\\xa8\\x25\\xa8\\xf6\\x31\\xbf\\xde\\x38\\xac\\xac\\x3f\\xde\\x38\\x7c\\x83\\x71\\xdc\\x3c\\x89\\x71\\xb4\\x7b\\x4c\\xd4\\xf2\\x61\\xef\\xf7\\x9b\\xbf\\x5c\\xb4\\x9f\\xa3\\xc5\\x6f\\x18\\x6a\\x2b\\x8e\\xb7\\x4f\\x1f\\x8a\\x43\\x12\\xe5\\x99\\x1b\\x1d\\xf0\\x6d\\x99\\x67\\xae\\x12\\x17\\x2c\\x98\\xea\\xf4\\xa7\\x45\\x25\\x58\\x4a\\xd0\\x93\\x81\\x96\\xd8\\xd7\\xac\\x60\\x78\\xda\\x70\\xde\\xce\\xba\\x93\\x8c\\xe6\\x7a\\x48\\xd6\\x41\\xcf\\xec\\x3c\\xa6\\x63\\x1d\\x43\\x86\\xf5\\xe2\\xe0\\x16\\xfa\\x05\\xc2\\xbf\\x1a\\x74\\x6d\\xf0\\xc5\\x9a\\xa1\\x91\\x81\\xa2\\xe4\\x1f\\x76\\xba\\xef\\xaf\\xe4\\xb7\\x98\\x48\\xa5\\x49\\x52\\x79\\x5d\\x60\\xa3\\xb9\\xde\\xe2\\x5d\\x5e\\xe2\\x36\\xdb\\xf2\\xd5\\xdf\\x43\\x7f\\xba\\xfa\\xca\\xca\\x24\\x58\\x07\\x7d\\x25\\xcd\\x0d\\xe2\\x24\\x42\\x75\\x5e\\x56\\x80\\xfa\\x79\\x62\\xc4\\x17\\xd7\\xee\\x6d\\x0a\\x79\\xbe\\xe1\\x1f\\x86\\x5f\\x6c\\xe0\\x97\\x75\\xd8\\xb7\\x2f\\xf9\\xe5\\x12\\x36\\x0d\\x20\\x47\\x53\\xc4\\x77\\x7a\\x00\\x96\\x9c\\x34\\x39\\x83\\x06\\xd7\\xe5\\x97\\xba\\x6d\\x87\\x5d\\x42\\x2f\\xe0\\x7b\\x00\\x1a\\x46\\xb3\\x9a\\x7c\\x14\\x6f\\x66\\x25\\xa6\\x8d\\x5a\\x42\\x22\\xfd\\xef\\x2b\\xfb\\xd4\\x43\\x4f\\xbd\\x0a\\xc9\\x10\\x96\\xf7\\x53\\x4c\\x47\\xe8\\x0e\\x9f\\x97\\x32\\xf6\\x43\\x81\\xfd\\x50\\xcc\\x47\\x1a\\x0e\\x1f\\x74\\x8a\\xe6\\x17\\xcc\\x69\\x1a\\xe3\\x57\\xcd\\xbd\\xd8\\x88\\xfb\\x1e\\xd9\\x6d\\x73\\x82\\xee\\xda\\x6d\\xa8\\x64\\xd0\\x8a\\x9b\\x27\\xa5\\x0d\\x93\\x8f\\x9e\\xc8\\xe9\\x4c\\x93\\x5d\\x0f\\x67\\x35\\x3b\\xcf\\x57\\xc4\\x55\\x54\\x62\\x9c\\xd1\\x45\\xb1\\xbe\\x2b\\xe1\\xd3\\x72\\x97\\x7c\\x3b\\x42\\xa7\\xc5\\xa9\\xaf\\x66\\x78\\xda\\x41\\x4f\\x26\\xc7\\xd3\\x27\\xf4\\x8d\\xef\\xcf\\x25\\xda\\x1d\\x21\\x33\\xbd\\x92\\x39\\x35\\x96\\xca\\x0c\\x05\\x1f\\xc0\\x0c\\x68\\x6a\\x1a\\x06\\x67\\xf1\\x68\\xdd\\xa5\\xdb\\x38\\xe3\\xf2\\x97\\xc1\\xde\\x76\\x65\\x34\\x77\\x35\\xe9\\x41\\xa2\\x5e\\x8e\\x62\\xd5\\x79\\x9e\\x6e\\x51\\x29\\x56\\xe4\\x45\\x1c\\x2d\\x4a\\x31\\x2a\\x77\\xc9\\x3d\\xc7\\x69\\xff\\x6e\\x11\\xf2\\xac\\x46\\x49\\x86\\x4b\\x77\\x97\\x9e\\x92\\xb8\\xc5\\x53\\x8a\\x35\\x74\\x0d\\xb1\\x45\\x89\\x53\\xf7\\x90\\x97\\xc9\\x6f\\x0d\\x20\\x75\\xe2\\x96\\xa4\\x56\\xce\\x2b\\x90\\xac\\x8f\\x00\\xa2\\x05\\x92\\x4c\\x6c\\x28\\x9c\\x8c\\xb8\\xdf\\x88\\xd7\\x93\\xca\\x64\\x44\\xba\\x95\\x4b\\x46\\x64\\x65\\x1c\\x31\\x43\\xb7\\x1c\\xde\\xfc\\x14\\x8a\\xb7\\xa8\\x6c\\x37\\xd2\\x0b\\x28\\x52\\xb1\\x82\\x2e\\xb7\\x27\\x17\\xca\\xa8\\x32\\x4e\\x0b\\x2c\\xd0\\xbe\\xab\\x4f\\xff\\xe8\\x40\\x7c\\x27\\x7f\\x07\\x6f\\x4b\\x38\\x52\\x9b\\x1e\\xa5\\x3f\\x59\\xb8\\x94\\x9e\\xbe\\x13\\x33\\xa4\\x23\\xac\\x55\\xb1\\x43\\xcd\\xe6\\x7a\\x4c\\xcc\\x68\\x20\\x03\\x94\\x0f\\xe9\\x19\\x52\\xa9\\xa0\\x46\\x83\\xba\\x40\\xc5\\xc8\\x9a\\x90\\x64\\xaf\\x0b\\x5a\\x10\\x2e\\xfb\\x58\\xd4\\x08\\x62\\xbd\\xcd\\xeb\\xc3\\xc5\\xa3\\x81\\x84\\xed\\x7b\\x93\\x3f\\x64\\x49\\x4e\\x48\\xd8\\x9b\\xea\\xb6\\xcb\\xb5\\x8b\\xf8\\x28\\xa2\\xb0\\x43\\xfd\\x77\\xc9\\xb1\\xc8\\xcb\\x1a\\x65\\xf5\\x45\\x78\\x05\\x91\\x22\\x34\\x3f\\x45\\xf8\\x21\\x89\\x3b\\x6d\\x37\\x71\\x48\\x04\\x56\\x87\\xfc\\x4e\\xe6\\x4a\\x84\\x26\\x19\\x49\\x64\\xa6\\xf8\\xac\\x25\\x34\\x2f\\x1e\\x09\\x6f\\x84\\x78\\xe3\\xfc\\xd7\\xfe\\x1b\\xdf\\x41\\x1b\\x7d\\x36\\xa1\\x7d\\xa3\\x1e\\x32\\xf7\\xf0\\x09\\xdb\\x31\\xce\\x8c\\x8c\\xa3\\xdd\\x2e\\xb9\\x57\\xb6\\xa5\\x5e\\xfe\\xe0\\x1e\\x2b\\xf7\\x36\\xc1\\x77\\x0d\\x1a\\x8b\\x5d\\x31\\xbe\\x4d\\x22\\x4c\\x83\\xec\\xc5\\x63\\xfd\\x71\\xd3\\xfd\\xa4\\xfd\\x7d\\x8c\\xbb\\xdf\\xd5\\xb1\\xfb\\x7d\\x5f\\x19\\x5b\\xef\\xc8\\x50\\xc5\\x4e\\xc4\\x12\\x3a\\x8b\\x03\\x8a\\x54\\xdc\\x63\\x0c\\x94\\xa8\\xb5\\xdb\\x22\\x15\\xb7\\x3a\\x02\\x25\\x6a\\xed\\xb6\\x48\\xc5\\xbd\\xaf\\x80\\x12\\xb5\\x76\\x5b\\xa4\\x98\\xaf\\x22\\x0e\\xbe\\x4d\\xb1\\xdd\\x5d\\xb1\\x5c\\x2c\\xc9\\x5c\\x06\\x90\\xa4\\x6a\\x63\\xc4\\xfd\\x40\\x88\\x04\\x20\\x22\\x96\\x46\\x2c\\xb7\\xcc\\xef\\x44\\xcc\\x58\\xc0\\x9c\\xd4\\x07\\x73\\xbd\\x08\\xa7\\xa9\\x50\\x71\\x48\\x47\\xa0\\x81\\x3c\\x96\\x04\\x95\\xa9\\x32\\xeb\\xbf\\x8e\\x88\\xc2\\x8e\\x58\\x08\\x11\\x54\\x66\\x9b\\x6c\\x0e\\xda\\x36\\xb3\\x5a\\x05\\x52\\x33\\xd5\\x71\\xa0\\xde\\x04\\x44\\x8b\\xde\\x54\\x2c\\xb3\\xde\\xaa\\xa3\\xa8\\x37\\xad\\x9e\\x49\\x6f\\xa3\\xbb\\x37\\x54\\x9b\\xe3\\x09\\x0f\\xd6\\xf1\\xb5\\xa4\\xaf\\xd5\\x3c\\xdd\\x42\\xac\\x36\\x13\\x04\\xcd\\xf2\\x51\\x68\\xe7\\x18\\x0f\\x54\\xbd\\x80\\x68\\x51\\xbd\\x8a\\x65\\x56\\xfd\\x31\\x16\\x55\\xaf\\xd5\\xeb\\x55\\xfd\\xe0\\xfe\\x8d\\xd6\\xfd\\x70\\xca\\xe3\\x95\\x3f\\x96\\xf6\\xb5\\xda\\x0f\\xc8\\x3e\\x5c\\x81\\x62\\xba\\x1f\\xa8\\x67\\x01\\xd1\\xa2\\x67\\x15\\xcb\\xac\\xe7\\x74\\x2f\\xea\\x59\\xab\\xd7\\xab\\x67\\xa0\\x27\\xa3\\x35\\x0a\\xd1\\x18\\xaf\\x3b\\x33\\x95\\x91\\x5a\\xd2\\xdc\\x3d\\x9d\\x03\\x59\\x26\\x22\\x63\\xbd\\x08\\x23\\x28\\x38\\xd4\\x5e\\x82\\x3d\\x96\\xc9\\x28\\x0a\\xe3\\xb4\\x97\\x62\\x2b\\x2f\\x56\\x57\\xd0\\xbd\\x5a\\xb7\\x15\\x69\\x51\\x26\\x59\\x6d\\x9f\\x7f\\x38\\x14\\xc7\\x50\\xc5\\x6e\\xdc\\x32\\xae\\xc5\\xbe\\x01\\x44\\xb3\\x89\\x13\\x64\\xd1\\xca\\xa1\\xda\\xaa\\xa1\\xcb\\xc8\\x43\\x26\\x5e\\x60\\xc7\\xfb\\xc6\\x82\\x82\\xad\\x58\\xfd\\x88\\x76\\x7a\\xc7\\x0b\\x88\\x7f\\x7d\\xbf\\xae\\x18\\x59\\x9c\\x10\\xb3\\x37\\xab\\x2d\\x5d\\xfe\\x10\\x1d\\x50\\x59\\xe1\\xda\\xf9\\xe2\\xa7\\xbf\\x7c\\xef\\xde\\x7c\\xb1\\x79\\xf3\\xf5\\xef\\xbe\\xc9\\x92\\x23\\xaa\\xb1\\x17\\x55\\x95\\xe3\\x3a\\x87\\xba\\x2e\\xd6\\x6f\\xde\\xc4\\x28\\xc3\\x31\\xce\\xbc\\x23\\x7e\\x83\\x28\\xfc\\xdf\\xfe\\x3d\\x89\\x70\\x56\\xe1\\xd8\\x39\\x65\\x31\\x2e\\x9d\\xfa\\x80\\x9d\\x3f\\xff\\xf0\\x17\\x27\\xa5\\xc5\\x5d\\xd5\\xbc\\xc0\\x59\\x95\\x9f\\xca\\x08\\x7b\\x79\\xb9\\x7f\\xc3\\xe0\\xd5\\x9b\\x3f\\xff\\xf0\\x97\\x7f\\xfb\\x2e\\x2f\\x1e\\xe8\\x97\\xac\\x97\\xd1\\x2b\\x27\\xf4\\x83\\xb9\\xf3\\x47\\x94\\x25\\x38\\x75\\xfe\\x14\\xe3\\xec\\xeb\\x37\\x1e\\x6b\\x2c\\xee\\x8e\\xed\\x92\\x82\\x24\\xcf\\xdc\\xf8\\xc4\\xbe\\xd3\\x04\\xd5\\x06\\x2e\\xd5\\xeb\\xec\\x92\\x34\\x75\\x8f\\x79\\x8c\\xc9\\x7a\\x75\\x63\\x02\\x5c\\xda\\x76\\xdd\\x1d\\xaa\\x6a\\x5b\\xe3\\xde\\x1c\\x6c\\xbd\\x29\\x7e\\x82\\xe6\\xbd\\x24\\xdb\\x25\\x59\\x52\\x63\\x80\\x85\\xa4\\xc6\\xb4\\x31\\x37\\xca\\x4f\\x59\\xbd\\xe6\\xa8\\x9b\\x7e\\x14\\xa1\\x81\\x43\\x92\\xed\\x21\\xea\\x6d\\x4f\\x42\\xb0\\x7f\\x61\\x25\\xd0\\xd8\\xe6\\xa7\\x2c\\xc2\\x3f\\x64\\x13\\xb5\\xe8\\xc7\\x93\\x5d\\x76\\x4b\\x83\\xf0\\x96\\x73\\x91\\xfc\\x2e\\x4d\\x8a\\x1f\\x4f\\xf5\\x5f\\x27\\x5a\\xd1\\xdf\\xae\\xa6\\xfe\\x07\\x5e\\xf1\\x1d\\x7e\\x20\\x37\\x2a\\x54\\x0e\\x65\\xf9\\xbc\\x2b\\xf3\\xe3\\x24\\xf4\\x5f\\x4c\\xe6\\xd3\\x17\\x93\\x1b\\xff\\xc5\\xa4\\xce\\x81\\x56\\xea\\xe4\\x98\\x64\\x7b\\x77\\x77\\xca\\x22\\x42\\x34\\x3a\\x6d\\x93\\xc8\\xdd\\xe2\\xdf\\x12\\x5c\\xbe\\xf4\\xbd\\x30\\x98\\x4f\\x7c\\x6f\\x11\\xf8\\x13\\xdf\\x9b\\xce\\xe7\\x93\\xc0\\xf3\\x7d\\xff\\xd5\\xe6\\xb1\\xf5\\x1f\\xbf\\x57\\x67\\xe6\\xbf\\x98\\xcc\\xa6\\x2f\\xc6\\xf7\\x68\\x39\\x6f\\x38\\xf2\\xe7\\x0d\\x47\\x37\\xf4\\xf7\\x62\\x4c\\x8f\\x0c\\xf5\\xfb\\x7a\\xe4\\x4e\\xfd\\xe2\\xde\\xd6\\x2b\\x8e\\x70\\x59\\xfa\\x9f\\x51\\xaf\\x82\\x79\\x4f\\xaf\\x18\\xc2\\x65\\x25\\xf4\\xca\\x88\\x3c\\xeb\\x21\\x46\\xe1\\x97\\xcb\\x1f\\x9e\\x8d\\xfd\\xd3\\x36\\x8b\\x67\\x63\\x7f\\x3a\\x63\\x67\\x21\\x08\\x10\\x53\\x86\\x8e\\x4d\\x9c\\x6d\\xa0\\x1b\\xb8\\x54\\xdf\\xae\\x9b\\x97\\xc9\\x3e\\xe1\\x1f\\x4a\\x1d\\xfa\\xbd\\x6b\\x63\\x07\\x43\\x31\\x66\\x97\\xa2\\xea\\x40\\x47\\xdd\\x9c\\x8e\\x36\\xbe\\x79\\x24\\xb8\\x84\\xf3\\x17\\x93\\xe5\\xfc\\xc5\\xb9\\xbb\\x00\\x40\\x1c\\xb0\\x23\\x6b\\x7a\\x14\\xdf\\xd0\\x79\\x02\\x54\\xfb\\x4e\\x0a\\x21\\xa6\\x8b\\x53\\x5a\\x51\\x57\\x01\\x68\\xa7\\x8a\\x50\\x4a\\xf6\\xd0\\x4e\\x82\\x49\\x20\\xaa\\x45\\x06\\x5c\\xe6\\xa0\\x6e\\x5b\\x24\\xcf\\x27\\xe3\\x9e\\xfe\\x17\\x48\\x46\\xc6\\xb8\\x08\\x8e\\x6a\\x3c\\x33\\xa2\\x60\\xff\\x09\\x7b\\xe7\\xd1\\x3e\\x19\\x94\\x4f\\x80\\xaa\\xf2\\x49\\x21\\xa4\\xfc\\xf2\\xb4\\xdd\\xe2\\xf2\\x5b\\x94\\xc5\\x8f\\x95\\xd1\\xb4\\x47\\x46\\x61\\xe3\\x51\\x96\\x73\\x03\\x0d\\x01\\xdc\\xf8\\x75\\x0b\\x25\\x8a\\xd5\\xe0\\x83\\x94\\x44\\x70\\xaf\\xde\\x48\\x64\\xba\\x31\\xf2\\xd4\\x81\\x2f\\x8b\\xb9\\x8d\\x92\\xb7\\xe2\\xea\\x85\\x08\\x09\\xd0\\xcb\\xd2\\x4a\\x87\\x60\\x11\\x74\\xa3\\x15\\x51\\xe8\\xd3\\x8d\\x8f\\x67\\x03\\xf8\\x57\\x34\\x00\\x4f\\x50\\xbb\\xc1\\x8f\\x74\\x18\\xaa\\x33\\xe9\\x20\\x90\\x47\\xa9\\x0e\\xe8\\x1d\\x9b\\x79\\x82\\x3c\\x8e\\x9d\\xe5\\x05\\xfe\\x8b\\xc9\\xb4\\x99\\xc2\\xfa\\x2f\\x26\\x4b\\xff\\xc5\\xa4\\x7f\\x16\\x41\\xb6\\xc0\\xf4\\x9c\\xc1\\x60\\x08\\x97\\x66\\x72\\xdc\\xcc\\x23\\x17\\x3e\\x99\\x20\\xf7\\x50\\xee\\x23\\xdc\\xd1\\x15\\x87\\xd8\\xb3\\x44\\xe8\\x8c\\x8d\\xca\\xc1\\x60\\x6e\\x04\\xa8\\x5a\\x1a\\x29\\x04\\x8d\\xec\\x2e\\xc9\\xf6\\xe7\\x10\\x64\\xaf\\xcc\\xeb\\x4e\\x5c\\xc1\\x24\\x98\\xc7\\x78\\x2f\\xb2\\x07\\xc2\\x0d\\x3e\\x47\\xc1\\x75\\x03\\xdf\\x4e\\x8c\\x21\\x5c\\x16\\x43\\xa8\\xf5\\x30\\x46\\xf9\\x82\\x55\\xa0\\x36\\xdb\\x43\\x8a\\xc2\\x61\\x9f\\xa1\\xa0\\xf6\\x74\\x90\\x76\\x4f\\xb2\\xee\\x67\\x55\\x7c\\x54\\x55\\x78\\x54\\x01\\xc6\\x35\\x4d\\x9d\\x17\\x0e\\xdf\\x00\\x6a\\x81\\x99\\x86\\x65\\x43\\x5c\\x1b\\x96\\x4d\\x21\\x34\\x2c\\x6b\\x14\\xa3\\xc7\\x4e\\x23\\x1a\\xef\\x06\\x5b\\x53\\x17\\x4e\\x27\\xe4\\xff\\x5f\\xa9\\xa2\\x9d\\x2a\\x02\\x1b\\x56\\xe1\\xd2\\xef\\x4b\\x85\\x19\\xc1\\x84\\xfd\\x47\\xa5\\x65\\x6a\\xbb\\xaf\\xca\\xc5\\xee\\x6b\\x07\\x90\\x31\\x76\\xbb\\xb7\\xce\\xd3\\xcd\\x22\\x9f\\x15\\xff\\xaf\\xa4\\x78\\x8f\\xa8\\xdb\\xe0\\x31\\x1a\\x98\\xea\\x30\\x9a\\x32\\xc8\\x5f\\xdc\\xe5\\xdb\\x6d\\x6a\\x5c\\x9d\\xd3\\x5b\\x60\\xa4\\x3f\\x2f\\x01\\x38\\x7d\\x96\\xa6\\x32\\xe1\\x9c\\x9e\\xaf\\xed\\x73\\xcc\\xc3\\x2b\\x19\\x96\\x36\\x22\\x81\\xd0\\x07\\xeb\\xab\\x1a\\x1a\\x5a\\xe5\\x32\\xeb\\xef\\x67\\x60\\x60\\xd9\\xd6\\xa6\\xbd\\x92\\x21\\x56\\xca\\xf3\\x39\\xb0\\x7e\\x68\\x69\\xd3\\x56\\xc5\\xb0\\x1c\\x92\\x58\\x36\\x70\\x1c\\xd8\\xba\\x69\\xab\\x03\\x1b\\x3f\\x64\\x6c\\xa2\\x87\\x7b\\x36\\xd5\\x67\\x53\\xfd\\x94\\x4d\\xd5\\x63\\x06\\x6a\\xf0\\xca\\x14\\xaa\\xfa\\x65\\x5a\\x0a\\x79\\xe6\\x5f\\x71\\x9a\\xe6\\x74\\xcd\\x1a\\x04\\x5e\\xf0\\x02\\x5e\\xb9\\x42\\x9c\\x84\\xa1\\x17\\x82\\x01\\xed\\x1d\\xbe\\xfb\\xeb\\x4b\\x37\\x08\\x3d\\x62\\xa8\\xcd\\x9f\\x7f\\xeb\\xfe\\xdc\\x0c\\x45\\xbc\\x4c\\xa7\\xde\\xd4\\x4c\\x7f\\xe1\\x85\\x42\\x2d\\xfe\\x97\\x46\\x1d\\x46\\xbb\\xcc\\x66\\xde\\xcc\\xc2\\xfb\\xd4\\x0b\\xc4\\x6a\\xdd\\xdf\\x3a\\xf7\\x46\\xd4\\xcb\\x7c\\xee\\xc1\\x29\\x20\\x52\\x31\\xf0\\xe6\\x0b\\xb1\\x62\\xf7\\xb7\\xd6\\x86\\x19\\xf5\\xb2\\x58\\x78\\x0b\\x4b\\x3f\\x7c\\x6f\\x79\\x23\\xb3\\x27\\x94\\xe8\\x7d\\xb1\\xa2\\x5f\\x96\\x4b\\x6f\\x69\\x6e\\xcb\\xf7\\xa6\\x2b\\x5f\\x62\\x53\\x2c\\xd1\\xda\\xb2\\xa3\\x5f\\x6e\\x6e\\xbc\\x1b\\x6b\\xbf\\x82\\xd5\\x7c\\xaa\\xb2\\x2a\\x94\\x41\\x7d\\xeb\\xa9\\x22\\x05\\x81\\xe7\\x51\\xf1\\x3c\\x2a\\x9e\\x47\\x05\\x4d\\x3b\\xd0\\xb1\\x60\\x08\\x37\\x04\\xa8\\x46\\x1b\\x5a\\xd8\\xf3\\xf1\\xd5\\xf4\\xd5\\xd5\\xbc\\xa5\\xe7\\x87\\xac\\xdb\\xe7\\x20\\xac\\xa9\\x3e\\xa1\\xbd\\x0e\\x17\\x5f\\xf8\\x78\\x0b\\x7c\\x50\\x6f\\x97\\xab\\xd3\\x09\\xf9\\x7f\\x70\\x29\\xcb\\x61\\x17\\xfb\\x1a\\x59\\x5c\\xfb\\xf5\\x2c\\x0d\\x7b\\xbe\\xb3\\xb4\\x8b\\x67\\xdb\\xc2\\x9a\\xcc\\xc3\\xda\\x4f\\xd5\\x96\\xbe\\x05\\x9e\\x3f\\x9d\\xb4\\xff\\x65\\xf8\\xba\\x21\\x62\\x18\\xd2\\x6d\\x1d\\x07\\xcb\\x09\\xfb\\x0f\\xcc\\x60\\x07\\xbe\\x88\\x5f\\xd3\\x6d\\x2c\\x8e\\x48\\x78\\x3c\\x9b\\xde\\xb3\\xe9\\x7d\\x48\\xd3\\x6b\\x37\\x61\\xda\\x37\\xbc\\xfc\\x90\\xc1\\x5b\\x5e\\x7e\\xc8\\x6c\\xfe\\xf3\\x8f\\xf9\\x1d\\x33\\xe4\\xc6\\x80\\x97\\x73\\x92\\x0d\\xfb\\x8c\\x8c\\x58\\x5c\\x4f\\x91\\x5d\\x54\\x7e\\xff\\x46\\x2b\\x86\\xd2\\x6b\\x44\\x72\\xc5\\xb0\\x67\\xaf\\x13\\x83\\x0f\\x58\\x2b\\xfa\\x13\\xf6\\xcd\\xcd\\xb6\\x71\\xca\\x1f\\xbe\\x71\\xaa\\x87\\x31\\xc6\\xd7\\x55\\xa9\\x8f\\x67\\x33\\x79\\x36\\x13\\x63\\xda\\x41\\x32\\x8e\\x1e\\xdf\\xd4\\xe0\\x98\\xfc\\x53\\x03\\xb3\\xf9\\xa8\\x7f\\x27\\x87\\xc2\\xff\\x39\\x8c\\xaf\\xb5\\x2b\\xcb\\x07\\x79\\x01\\x65\\x94\\xf1\\x51\\xd3\\x32\\x13\\x6e\\xe1\\x43\\xf2\\x59\\x23\\xb6\\x0d\\xf4\\x1b\\x5f\\x0f\\x63\\x2d\\x5f\\x8f\\xf2\\x51\\xcf\\x66\\xf2\\x6c\\x26\\x46\\x1f\\x45\\x8c\\xa3\\xc7\\x47\\x35\\x38\\x26\\x1f\\xd5\\xc0\\x6c\\x3e\\xea\\xbf\\xd1\\xab\\x2d\\x3e\\x61\\xeb\\x23\\x9f\\x2f\\x86\\xda\\x5f\\xbf\\xf9\\x5d\\x6b\\x7d\\x6e\\x9f\\xf9\\xb9\\x63\\xec\\x6f\\xf8\\x1e\\xa4\\x01\\x3b\\xa5\\xfa\\x18\\x7b\\x1a\\x37\\xf5\\x6c\\x29\\xcf\\x96\\x62\\xf3\\x54\\xd4\\x3e\\x7a\\x5c\\x15\\x41\\x32\\xf9\\x2a\\x02\\xb4\\x39\\xab\\x9f\\x8a\\x7f\\x1e\\xfb\\xf3\\x27\\xfd\\x93\\xf9\\x6b\\xe7\\xf2\\x6e\\xd8\\x37\\xff\\x0e\\xfd\\xe1\\xb3\\xf9\\xbe\\xc9\\xfc\\x98\\xb9\\xbc\\xdb\\x77\\xf0\\xc6\\x36\\x9b\\x97\\x51\\x07\\xdc\\x02\\x0e\\x78\\xb1\\x67\\x13\\x7a\\x36\\xa1\\x51\\x17\\xc9\\x0b\\x86\\xd3\\xe3\\xdb\\x7e\\x2a\\x4c\\x8e\\xed\\xa7\\xc2\\xec\\xd5\\x7e\\x3c\\xd5\\x86\\x9d\\xa8\\xe3\\x32\\x8b\\x73\\xff\\xc5\\x64\\x3e\\x1f\\x9a\\x5d\\x1c\\x9e\\xf5\\x14\\xb2\\x81\\x8f\\x4f\\xc6\\xea\\x23\\xf2\\x5f\\xab\\xfb\\xd6\\x43\\xe8\\x82\\xc9\\xfc\\x78\\x32\\x04\\xc9\\x1f\\x4f\\x96\\x00\\xf9\\xe3\\xa9\\x26\\x29\\x0d\\x58\\x9e\\xd7\\x8d\\x48\\x72\\x60\\xb5\\x47\\xae\\xd7\\x7a\\x8e\\x1e\\xd9\\xca\\xb5\\xc2\\x5e\\x57\\xd7\\x62\\xc0\\x66\\xf6\\x2c\\x1a\\xd1\\xa1\\x71\\x81\\xf4\\x99\\xa1\\x39\\xff\\xc5\\x80\\x56\\x73\\x24\\xab\\xd7\\x70\\xcc\\x1a\\xbf\\x67\\xb6\\xdb\\xc2\\xc7\\x48\\xc8\\x0d\\xfb\\x93\\x12\\x02\\x0a\\x6c\\x3e\\x9f\\x69\\x57\\x3c\\xb9\\x03\\x7d\\xea\\x36\\xa7\\x12\\x18\\xd0\\xaa\\x6e\\xba\\x04\\x18\\x23\\x24\\xb7\\x4f\\x4a\\xee\\x55\\x62\\xea\\x97\\x52\\xaf\\xbe\\x3f\\xd7\\xbe\\x78\\x4a\\x0f\\xfa\\x34\\x6e\\x59\\x91\\x71\\xa8\\x55\\xe7\\x3f\\x15\\x83\\x9c\\xea\\xf0\\x4f\\x02\\xe3\\xdd\\x6a\\x9f\\x57\\xbd\\xca\\xa9\\xba\\xfd\\x5e\\xd5\\xed\\x89\\x38\\xcf\\xa2\\x51\\x2c\\xb2\\x6f\\x0e\\x4d\\x50\\x8c\\xb6\\x08\\xcf\\xa2\\x77\\x28\\xe6\\x7b\\x1a\\xc4\\x2e\\x1c\\x2b\\x75\\x96\\xf6\\xd2\\xf7\\x56\\x73\\xe8\\x6e\\x08\\x11\\x0a\\x96\\x2a\\x5f\\xc4\\x01\\xd2\\x81\\x07\\xde\\x3a\\x21\\x00\\xa1\\x42\\xf9\\x36\\x85\\xcf\\xb9\\x1f\\x1e\\xe3\\xde\\xa0\\x5d\\x0a\\xd5\\x6e\\x77\\x20\\xa5\\x66\\x9d\\xb6\\xdf\\x6e\\xc7\\x98\\xe6\\xbc\\xcf\\x30\\xe7\\xba\\xc5\\x43\\xc3\\xa8\\x2f\\x2b\\xfa\\xa9\\xb2\\xe8\\x09\\x8c\\x59\\xb5\\x01\\x4d\\xec\\x3a\\x88\\x5d\\x2b\\xdf\\x26\\xfb\\xd1\\xbd\\x1e\\xe5\\x33\\x9e\\x4c\\x39\\x9f\\x24\\xa7\\x9e\\xcc\\x5f\\xaf\\x9a\\xbe\\x4d\\xb4\\xe3\\x8c\\x12\\xd0\\xac\\xac\\xf6\\xd3\\xe2\\xf0\\x09\\xe6\\xbc\\x6f\\x12\\x33\\x87\\x26\\x31\\xd7\\x6b\\xe9\\xd3\\x63\\xd1\\x13\\x18\\xb3\\xea\\x06\\x9a\\x2c\\x77\\x10\\xbb\\x56\\x46\\x1b\\xe6\\xd8\\x99\\xff\\x93\\x29\\xe7\\x93\\xe4\\xd4\\x93\\xf9\\xeb\\x55\\x93\\x71\\x08\\x31\\xa0\\x59\\x59\\xdd\\x67\\xaf\\xc1\\x02\\xe8\\xb3\\xcf\\x27\\x1e\\x41\\x9f\\x1c\\x87\\x9e\\xc8\\x97\\x55\\x35\\xe0\\xe2\\x43\\x00\\xf5\\xa8\\x65\\xb4\\x69\\x8e\\x5b\\x4b\\x3d\\x9d\\x76\\x3e\\x41\\x46\\x3d\\x85\\xbd\\x7e\\x3d\\x19\\xc7\\x10\\x87\\x9a\\xb5\\xc5\\xbe\\xba\\x08\\xdd\\x37\\xbf\\xd0\\x6b\\x0a\\xba\\xb3\\x9e\\xa0\\x3c\\x7b\\xca\\xb9\\xc3\\x07\\x66\\x58\\x20\\xce\\x6e\\xdb\\xdd\\x5c\\xab\\x50\\xf3\\x1a\\x8b\\xc3\\x61\\x25\\xda\\x56\\x57\\x3f\\x15\\x7f\\xc6\\xd9\\xe9\\xf1\\x12\\xb9\\x62\\x35\\x1a\\x6c\\x00\\xd9\\x5c\\xaf\\xd5\\x0f\\xde\\x8f\\x27\\xd5\\x2c\\xe1\\xbe\\x47\\xbb\\x0d\\x8e\\x49\\xc3\\x0d\\xcc\\xa6\\xe5\\x2b\\x66\\xcb\\x63\\x72\\xcf\\x4f\\x34\\x32\\x3f\\x41\\x2e\\x3d\\x91\\xb7\\x1e\\x05\\x19\\xdd\\x28\\x01\\x99\\xd4\\xf3\\xe3\\x49\\x09\\xf1\\x81\\x94\\xb3\\xd1\\x04\\xd5\\x8b\\xef\\x71\\x2c\\x0b\\xbb\\xc0\\x67\\x28\\x56\\x6c\\x61\\x53\\x5f\\x13\\x07\\xe3\\xd2\\x4b\\x43\\xfd\\x26\\xd0\\xe5\\x0f\\xd7\\xb6\\x27\\xb6\\x68\\x17\\xa1\\x69\\xa5\\x6d\\xf9\\x80\\x22\\x80\\x35\\x6b\\x1f\\xd9\\xa3\\x6b\\xbf\\x9b\\x7d\\x2c\\x16\\x3c\\xa5\\xe1\\x7e\\xd9\\x1a\\x06\\x54\\x07\\xb5\\x48\\x58\\x5f\\x7d\\x8e\\xea\\xdb\\x98\\xa7\\xf3\\x01\\xe1\\x7e\\xc8\\xd6\\x3d\\xb1\\x4d\\xbb\\x50\\x4d\\xeb\\x5a\\xcb\\x27\\x20\\x01\\xfc\\x38\\x6b\\x79\\xcc\\xb7\\xba\\x8f\\xc7\\x84\\xa7\\x34\\xdd\\x2f\\x5f\\xb3\\xd1\\xf6\\xac\\x48\\xdb\\x0f\\x3b\\xd7\\x77\\xaf\\xcf\\x6c\\xac\\x36\\xfb\\x01\\x1b\\xf7\\xa4\\x26\\xed\\x32\\x35\\xae\\x24\\x6d\\x1f\\xb1\\x44\\xf8\\xe3\\x2c\\xe6\\xfa\\x0f\\x8e\\x1f\\x8d\\x07\\x4f\\x6d\\x79\\x80\\x80\\xcd\\x56\\xdb\\xb7\\x06\\xa4\\x5f\\x7f\\x1e\\x13\\x45\\x98\\x33\\xb3\\x7e\\x26\\x23\\x08\\x90\\x78\\x3f\\x5c\\xdb\\x5e\\xd7\\xa2\\x5d\\xa0\\xf0\\x42\\xcc\\xfa\\x9d\\x8b\\x00\\x1f\\x1b\\x8d\\xaf\\xff\\xb0\\xf9\\xb1\\x58\\xf0\\xa4\\x86\\xfb\\xa4\\x6a\\xb6\\x51\\xf3\\x04\\x3b\\x4d\\x0a\\xd3\\x35\\x49\\x05\\x2e\\xab\\x02\\x93\\x37\\xb5\\x5f\\xce\\xc8\\xc3\\x49\\xc2\\xb5\\x37\\xc1\\xc4\\x9f\\xb8\\xd3\\x85\\x7a\\xeb\\xe1\\xf0\\x3a\\x7a\\x67\\xd4\\x7d\\xa3\\x18\\x55\\xd8\\xcd\\xa5\\x89\\xb8\\x09\\xc5\\x70\\x42\\x59\\xe7\\x46\\x16\\xb5\\x3f\\x09\\xe6\\x10\\x8f\\xc1\\xaa\\xbf\\x5f\\xe3\\x28\\x3d\\x6d\\x6f\\xe1\\x8b\\x92\\xaf\\xe6\\x71\\xf9\\x64\\xbd\\x5d\\x8e\\xea\\x6d\\x92\\xf5\\x75\\x36\\xc9\\x0c\\xa7\\xbb\\x75\\x0e\\xc5\\xeb\\x9b\\xd9\\x7f\\xec\\x5d\\x02\\x2b\\x3c\\x25\\xe7\\xe0\\x36\\x5c\\x9d\\x0f\\x2b\\x93\\x4f\\xca\\x90\\xfc\\x84\\xc1\\xf3\\xc0\\x7f\\x1e\\xf8\\xcf\\x03\\xff\\x5f\\x63\\xe0\\xcb\\x8f\\x75\\xb5\\xdc\\x6d\\x51\\xf4\\x6e\\x87\\x22\\xec\\x02\\xb9\\x5a\\x1b\\xcc\\x34\\x11\\x49\\x13\\x7d\\x66\\x97\\x26\\xf0\\xa4\\x2e\\x4d\\x8a\\x1f\\xb2\\xbf\\x5e\\xe1\\x82\\x1a\\x83\\xf3\\x27\\x03\\x06\\x2a\\x5c\\xe3\\x09\\xe5\\xba\\xe9\\x92\\x8a\\x43\\xdd\\x90\\xc2\\x93\\x1b\\x8e\\xee\\x06\\xaf\\xf2\\x94\\xf6\\x01\\x5f\\xcf\\xd8\\xcb\\x8a\\x76\\xa9\\xf7\\xd0\\x1a\\xdd\\xe4\\x79\\xe8\\x20\\x57\\x85\\xa0\\x5e\\x85\\x35\\xb0\\xc6\\x93\\x0c\\x4d\\x2d\\x8e\\x3e\\xdb\\xf1\\xb3\\x1d\\x7f\\x96\\x76\\xec\\x71\\xeb\\x1d\\x10\\x10\\xba\\x97\\x4a\\x6d\\xa1\\x41\\xc0\\xb2\\x04\\x89\\x1f\\xb2\\xbf\\x42\\x71\\xe2\\x87\\xec\\xaf\\xe6\\x50\\xf1\\xb7\\xab\\x67\\xab\\x63\\x86\\x98\\x54\\xe3\\x13\\x19\\x62\\x6c\\x8e\\x35\\x66\\x88\\xc9\\x55\\x3e\\xea\\x10\\xa3\\xac\\x8c\\x19\\x62\\x52\\x8d\\x47\\x0c\\x31\\x26\\x84\\x11\\x43\\x4c\\xac\\xf1\\xbe\\x42\\xc5\\xb3\\x1d\\x3f\\xdb\\xf1\\x67\\x68\\xc7\\x1e\\xb7\\xde\\x0f\\x1e\\x2a\\xfe\\x06\\x87\\x8a\\xbf\\x99\\x42\\xc5\\x8f\\xa7\\x7a\\xc4\\x74\\xcc\\xde\\x6d\\xf8\\x7e\\xf6\\xf7\\x39\\x1d\\x92\\xf2\\xca\\x1f\\x72\\x3e\\x69\\xd8\\x50\\xf1\\x2c\\xd0\\x27\\x10\\x68\\xfb\\x6a\\xb6\\x31\\x85\\xcf\\xe0\\x90\\xa9\\x93\\xf2\\xf7\\x30\\xea\\x2c\\xe3\\x67\\x44\\x8c\\x7a\\x62\\x75\\xf3\\x7c\\xd2\\x78\\x67\\xc7\\xaa\\x5c\\xaf\\xee\\x47\\x06\\x59\\xeb\\xf8\\x79\\x16\\xe8\\xa3\\x04\\xaa\\x3f\\x31\\xff\\x81\\xa2\\x4f\\xd3\\xa6\\x61\\x4c\\x82\\xf1\\x27\\x4d\\xf6\\x87\\xfa\\x3f\\x0a\\x8c\\x63\\x7e\\xa0\\x6d\\xe0\\x96\\x00\\x7e\\xe5\\xba\\x2a\\xac\\x01\\xc8\\x9d\\x9c\\xe0\\x39\\x0d\\xc5\\xd6\\x1c\\xa8\\x54\\xdc\\x37\\x3b\\x61\\x2d\\x1a\\x2e\\x20\\x1f\\x64\\x28\\xc0\\xee\\x41\\xa1\\x8a\\x38\\x66\\x9e\\x85\\x78\\xad\\x10\\x3d\\x49\\x74\\x06\\xbb\\x16\\x71\\x54\\xdb\\x96\\x60\\x4f\\xfb\\xe9\\xc2\\x3a\\x5a\\xe0\\x3d\\x9b\\xa3\\xd4\\x3e\\x46\\xeb\\x9a\\xd2\\x61\\xf3\\xfb\\xe8\\x5c\\x79\\x32\\x2f\\xbd\\x0a\\x05\\x76\\xad\\xca\\xc0\\xa7\\x5c\\x41\\x41\\xef\\x53\\x13\\x47\\x6e\\x1c\\xb5\\xc3\\xde\\x0e\\x00\\xf6\\x50\\xa8\\xcf\\xed\\x84\\x7e\\xdf\\x73\\x92\\x1c\\xa3\\x13\\x26\\xa4\\xb9\\xab\\x19\\x1a\\xee\\xcc\\x9e\\x45\\xc2\\x5c\\x53\\x2b\\x08\\x83\\x15\\x73\\xb8\\xf6\\x7e\\x31\\x2b\\xb7\\xd9\\xdb\\x1f\\xf3\\x3b\\xe1\\x34\\xa5\\xb1\\x4f\\x29\\xde\\xd5\\xce\\x36\\xaf\\xeb\\xfc\\xa8\\x77\\x4c\\x04\\xf6\\x8b\\x7b\\xd6\\xf7\\x70\\xe8\\x6c\\x3e\\x42\\xd8\\x8f\\x60\\x6c\\xbc\\x25\\x3e\\x0b\\xab\\xd7\\x46\\x5b\\x11\\xf5\\xd8\\x2a\\xc7\\x33\\xd9\\x2c\\x87\\xf7\\xd9\\xae\\xb0\\xb3\\xd4\\xd8\\xed\\xb2\\xc1\\x31\\xf6\\x5b\\x82\\xf6\\x6a\\xa4\\x4f\\x21\\xa3\\xf4\\xf1\\x28\\xc6\\xae\\x33\\xdf\\x67\\x79\\x0d\\xb1\\x60\\xeb\\xe6\\x61\\x0d\\xd1\\x66\\xc3\\xc6\\x6d\\xc4\\x1c\\xe9\\xa7\\xe2\\x83\\x7a\\x94\\x27\\xd5\\xc7\\x07\\x75\\xbe\\xcf\\x82\\xb2\\x9a\\x2d\\x13\\x4f\\x8f\\xcd\\x52\\x2c\\x93\\xc1\\x52\\xa8\\xdd\\x5a\\x3f\\xb4\\x03\\x71\\xb5\\x2c\\x88\\x01\\xe1\\xe3\\xbb\\x10\\xd0\\x68\\x9f\\xe5\\x35\\xc4\\x76\\x07\\x39\\x5c\\x86\\x66\\xb6\\xde\\x1e\\x67\\xdb\\x2e\\x4a\\xaf\\x9d\\xba\\xdb\\x17\\xb3\\x4f\\xb5\\x20\\xe9\\x5d\\x8f\\xe8\\xcb\\x11\\xdd\\xf4\\xfe\\x89\\xfb\\xea\\x75\\x3d\\xb4\\x1a\\x0c\\xb0\\xa4\\x6f\\x01\\x56\\x23\\x79\\xea\\x69\\xfe\\x30\\x51\\x7e\\xc4\\xd0\\x05\\x9a\\xcf\\xbf\\x9e\\x14\\x3c\\xbd\\xef\\x7d\\x06\\x66\\x5f\\xc6\\x08\\x08\\xbd\\x06\\xf7\\xc4\\x71\\x62\\x98\\xb4\\x9f\\x34\\xf0\\x8c\\x5f\\xab\\x1a\\xed\\xee\\x5f\\x52\\x18\\x1e\\x20\\x82\\x21\\xf6\\x67\\x09\\x8a\\x22\\x86\\xd5\\x02\\x9f\\x76\\x72\\xfd\\xa1\\x87\\xfa\\x53\\x99\\xde\\xbf\\x9e\\x14\\x3c\\xb5\\xef\\x7d\\x06\\x67\\x5b\\x40\\xb4\\xe0\\x1e\\x53\\xfb\\xec\\x47\\x77\\xdf\\x14\\xdb\\xfa\\x5d\\xfb\\x5f\\x5b\\x10\\x9e\\xd6\\xfd\\x7e\\x8b\\xb3\\x3b\\x38\\xcb\\xb4\\xff\\x90\\x64\\x7b\\x7c\\x86\\xbe\\x28\\xf2\\xee\\xd6\\x79\\xe1\\x34\\x83\\x4c\\x17\\x44\\x0b\\x19\\xfc\\xe1\\x67\\xc8\\xe7\\x3c\\x8a\\x75\\x09\\xe9\\x1b\\xba\\xc0\\x07\\x31\\x45\\x80\\x37\\x3d\\x02\\xbe\\x91\\xb7\\xf7\\x7d\\x2a\\xfd\\x9b\\xd1\\xf7\\x81\\xfb\\xfb\\xa7\\x1d\\x86\\x83\\xe1\\x9f\\x58\\xff\\xfa\\xbe\\x35\\x93\\x5f\\xed\\xc9\\xaf\\x65\\xdf\\xb1\\xe5\\x16\\x01\\x76\\x18\\xcf\\x56\\xfc\\x6c\\xc5\\x9f\\xa9\\x15\\x7b\\xd4\\x76\\x0d\\x2e\\x9e\\x00\\x55\\xbf\\x4e\\x0a\\xe1\\x09\\x44\\x9a\\x02\\x77\\x5d\\x5b\\xd9\\xee\\xee\\xb2\\x51\\xa7\\x42\\x81\\xb6\\x21\\x65\\x54\\xbd\\xc7\\x5e\\x4b\\xf6\\xf9\\x77\\xc6\\x63\\x5d\\x30\\x86\\xef\\x06\\xaa\\x07\\xed\\xa6\\xd4\\xa4\\xdd\\x9e\\xeb\\xc7\\x86\\xde\\x11\\xa3\\xf4\\xd2\\x2e\\x9c\\x9e\\x5a\\x9a\\xd2\\x3e\\x49\\x1e\\x3d\\xce\\x99\\x45\\x19\\x60\\x36\\x8c\\x14\\x43\\xea\\xf8\\x2d\\xcf\\x8f\\x43\\xec\\x73\\xdc\\x53\\x46\\x73\\xf1\\x61\\x0c\\x49\\xb4\\x1f\\xa4\\x3d\\x8f\\xb5\\x62\\x90\\x12\\x85\\xaa\\x42\\xa2\\xa5\\x66\\x19\\x0d\\xbb\\xcd\\xbd\\xe5\\x2d\\x98\\x90\\xff\\x57\\x0e\\x87\\x37\\x43\\x54\\x73\\xaf\\xc3\\xeb\\xf4\\x07\\x07\\xe5\\x21\\xb9\\xf9\\xdc\\x9f\\xf8\\x9e\\x3f\\x27\\xcf\\xc9\\x2d\\x9b\\xff\\x0e\\x56\\x63\\x1e\\xa2\\x83\\xeb\\xf7\\xbe\\x16\\xd7\\xf6\\x68\\xb6\\x9c\\x4f\\xda\\xff\\x52\\xfa\\xb5\\x30\\x0b\\x62\\x48\\xb5\\xd1\\xb2\\x08\\x08\\xff\\x37\\x37\\xcd\\x7f\\x4f\\x43\\x7f\\x12\\x8c\\x90\\x83\\x5e\\x17\\xb0\\xea\\x67\\x0b\\x79\\xb6\\x10\\xc9\\x42\\x3c\\xc1\\x2e\\xac\\xbe\\x08\\xba\\x04\\xb2\\x83\\x98\\x7d\\xd2\\xb0\\xeb\\xf1\\xad\\xd6\\xd3\\xda\\xce\\x08\\x8b\\x93\\xea\\xfc\\x13\\x59\\x1c\\xf4\\x9a\\xee\\xa8\\x6a\\x1f\\xdd\\xe2\\x34\\x9f\\xf4\\x6c\\x21\\xcf\\x16\\x02\\xf9\\x24\\x5b\\x0e\\xb8\\xc3\\x80\\x7d\\x92\\x29\\xf3\\x4b\\xa1\\x03\\x1f\\x1c\\xb0\\x9a\\xcf\\x15\\x16\\xf7\\x4f\\x6a\\x70\\xee\\x95\\x16\\xe7\\x7e\\x42\\x26\\xa7\\x39\\xa5\\x67\\x13\\x79\\x36\\x11\\xd0\\x2b\\x59\\x3f\\x14\\x08\\x28\\xb0\\x5f\\x32\\x7e\\x1e\\xa0\\x60\\xfd\\xd5\\x86\\xd1\\x93\\xf3\\x2b\\xe6\\xe6\\xff\\xa4\\x53\\x73\\xf7\\xca\\xb9\\xb9\\xfb\\xc9\\x4c\\xce\\x35\\xaf\\xf4\\x6c\\x1f\\xcf\\xf6\\xa1\\xbb\\x24\\xf3\\x4d\\xbd\\x1c\\x0e\\x3b\\x23\\xf8\\x9e\\xde\\x06\\x06\\x64\\x16\\xc5\\xfc\\xd5\\xe3\\xb3\\x61\\xc6\\xa7\\x1f\\x3e\\x42\\xeb\\x1e\\x6f\\xd3\\x22\\x44\\x20\\x63\\xc9\\x8a\\x2d\\x22\\x24\\x8b\\xea\\xd9\\xe7\\x69\\xaa\\xef\\x69\\xe0\\x0e\\x7d\\x8d\\x1e\\x76\\x44\\xd0\\xad\\xcb\\x83\\xab\\xf4\\xec\\x1b\\x35\\xee\\x42\\x90\\xc1\\x1f\\x7d\\xcc\\xeb\\x63\\xe5\\xd9\\xcc\\x9e\\xcd\\xec\\xfd\\x84\\x96\\x9e\\xe7\\x61\\x04\\x14\\x83\\x73\\xb4\\xa5\\x06\\xf9\\x53\\x1e\\x4f\\x60\\xb9\\xb3\\xf0\\xaa\\xd5\\x45\\x5b\\x6d\\x90\\xbd\\xbc\\x54\\xf3\\x47\\xf0\\x73\\x05\\xfd\\xb8\\xf6\\xed\\x77\\xa6\\x5d\\xec\\x02\\x10\\x72\\x02\\xcf\\xa2\\xbc\\x52\\x94\\x9e\\x28\\x40\\xbb\\xa1\\x9b\\xd2\\x4d\\x96\\x67\\x65\\x18\\x98\\x2e\\x1a\\x9f\\x40\\x3d\\xee\\x95\\xfa\\x71\\x1f\\xa7\\xa0\\x11\\xfa\\x19\\xa4\\x1e\\xba\\xb3\\xcf\\xa4\\x1f\\x11\\x0a\\xd9\\xfa\\xb3\\x34\\xaf\\x97\\xa6\\x27\\xc9\\xd0\\x6e\\xef\\xc6\\x3c\\x86\\xed\\x49\\x1a\\x06\\xff\\xa9\\x78\\x9a\\x29\\xc9\\x87\\xfe\\xbe\\xf6\\x49\\x4e\\x48\\xc0\\xe7\\x46\\x86\\xd7\\xf9\\x27\\x99\\x92\\xe8\\x8e\\xe0\\xd9\\xc8\\x9e\\x8d\\xec\\x3d\\xcd\\x7b\\xed\\x39\\x15\\xf0\\xf5\\xa3\\x16\\x00\\xb9\\xc5\\x2a\\x4d\\xf8\\x83\\xf7\\x43\\x2e\\xc3\\x1a\\xf1\\x62\\x13\\xf0\\xbe\\xec\\x90\\x3d\\x94\\x96\\x57\\xb6\\x7c\\xfd\\x91\\xaf\\xcf\\x91\\x7d\\x4f\\x64\\xda\\xa0\\x4c\\x01\\x45\\x55\\xa7\\x00\\xb2\\x28\\xd4\\x72\\x48\\xe7\\xda\\xa7\\x0e\\x3f\\xa4\\x42\\x3f\\x2b\\xf6\\x3d\\x91\\x69\\xbb\\x42\\xa1\\xa9\\xba\\x00\\xb2\\x28\\xd4\\x76\\x0e\\xe6\\xba\\x77\\x00\\x3f\\xa4\\x3e\\x3f\\x27\\xee\\x3d\\x89\\x67\\xbb\\x3e\\xc1\\xa9\\xa8\\x08\\xb3\\x68\\xf4\\x27\\xe3\\x0b\\x49\\x32\\x57\\x7d\\x1e\\xeb\\x23\\xf8\\xdb\\xcf\\x86\\x75\\xaf\\x63\\xd8\\xae\\x48\\x3d\\x6c\\xb6\\x00\\xa3\\x0a\\xa5\\x77\\x91\\x1f\\xcf\\xac\\xfc\\xa8\\xf9\\xc0\\x17\\xd3\\x07\\x4a\\x58\\x57\\xe2\\x67\\xc5\\xbc\\x27\\xb1\\x6c\\xd3\\xa4\\x21\\xef\\x27\\xc2\\x6c\\xfa\\x1c\\x1a\\x77\\xde\\x93\\x48\\xae\\x7d\\xf6\\xf8\\x73\\x64\\xdf\\x93\\x98\\xee\\xd1\\xa9\\x31\\x6e\\x5a\\x72\\x5c\\x1c\\x3e\\x38\\xf6\\xbc\\x27\\xa9\\x5c\\xf7\\x2a\\xf0\\x67\\xc8\\xbd\\x27\\xf3\\xdc\\xa3\\x52\\x73\\xe8\\xb4\\xa5\\x71\\x38\\xc2\\xd0\\x08\\xf4\\x9e\\x3c\\xd7\\x75\\x6f\\xe6\\x7e\\x7e\\xcc\\x7b\\x02\\xcb\\x3d\\xfa\\x34\\x44\\x50\\xba\\xf2\\xdc\\xe6\\xf1\\xc3\\x79\\x97\\x67\\xb5\\xbb\\x43\\xc7\\x24\\x7d\\x58\\xe7\\x05\\xce\\x9c\\x0a\\x65\\xd5\\xe4\\x9b\\x32\\x41\\xe9\\xa4\\xf9\\xe9\\x56\\xb8\\x4c\\x76\\x9b\\x34\\xc9\\xb0\\x7b\\xc0\\x8d\\x05\\xac\\x03\\x6f\\xbe\\x21\\xd5\\xaa\\xe4\\x37\\xbc\\x0e\\x16\\xc5\\xfd\\x26\\xca\\xd3\\xbc\\x5c\\x7f\\x79\\x33\\x6b\\xfe\\x91\\x3b\\xb8\\xf7\\x65\\x7e\\xca\\x62\\x97\\x01\\x76\\x7e\\xf3\\x8f\\xb4\\xe8\\x55\\xf5\\x43\\x8a\\xdd\\xf0\\x0c\\x60\\xed\\x76\\x62\\x5d\\x42\\x3e\\xca\\x6f\\x71\\x29\\x96\\x16\\x79\\x95\\x90\\x05\\xba\\x3b\\xf5\\x5f\\x88\\x80\\x12\\x17\\x18\\xd5\\xeb\\x2c\\x67\\xbf\\x44\\x58\\x72\\x44\\x7b\\xbc\\x3e\\x95\\xe9\\x4b\\xcf\\x7b\\x43\\xfe\\xa8\\xde\\x6c\\xf7\\xff\\x2b\\xf4\\x7e\\x2d\\xf6\\xaf\\x36\\xbc\\x5f\\xbe\\xff\\x42\\x64\\x71\\x2a\\xb0\\x48\\x98\\x73\\x64\\x02\\x7b\\x9c\\x1f\\x71\\x5d\\x3e\\x84\\x5e\\x91\\xed\\x5f\\xd1\\x46\\x2f\\xe8\\xcc\\x3a\\x33\\x8d\\xa2\\x8d\\x7b\\xcc\\x7f\\xa3\\x1a\\xa7\\x2c\\xa3\\x34\\x75\\xbc\\x69\\xe5\\x60\\x54\\xe1\\x8d\\x9b\\x9b\\x41\\xa2\\xb1\\x40\\xf0\\x63\\x65\\x84\\x19\\xca\\x2f\\x68\\x7d\\x68\\x44\\xc9\\xd9\\x0b\\x57\\x68\\x8a\\xa6\\x17\\xef\\x88\\xb3\\xd3\\xb9\\x40\\x71\\x9c\\x64\\xfb\\xb5\\xbf\\x39\\xa2\\x72\\x9f\\x64\\xeb\\xa9\\x5f\\xdc\\x3b\\xbe\\xe3\\x53\\xb8\\x93\\x26\\xe7\\x34\\xa9\\x6a\\x97\\xc8\\x85\\x1e\\xab\\xa3\\x88\\x2e\\x4d\\xc5\\xac\\x03\\xbf\\xb8\\xdf\\xc4\\x49\\x55\\xa4\\xe8\\x61\\x4d\\x7a\\x9d\\x64\\xc4\\x64\\xaa\\x1a\\x45\\xef\\x5a\\x08\\x2b\\xdc\\xa6\\x79\\xf4\\x6e\\xf3\\x5b\\xde\\x54\\xdc\\x7c\\x2d\\x03\\xdb\\x16\\x1d\\xd4\\xb2\\x35\\x2f\\xee\\xdb\\x62\\x0f\\x91\\x6b\\xe4\\x9d\\x56\\xce\\xdb\\x69\\xf3\\xef\\xe2\\xed\\x0e\\xf3\\x28\\x77\\x9b\\x81\\xd3\\xd6\\x6b\\x7a\\xc1\\x19\\xad\\xf3\\x62\\x3d\\xc3\\x5d\\xd2\\x68\\x9b\\xdf\\xbb\\xd5\\x01\\xc5\\xf9\\xdd\\xda\\x9d\\x15\\xf7\\xce\\xb2\\xb8\\x77\\x66\\x8b\\xe2\\xde\\x09\\x8b\\x7b\\xa7\\xdc\\x6f\\x11\\x1d\\xcd\\x13\\x2f\\x78\\x45\\xd5\\x38\\xaa\\x42\\x3e\\x0a\\x7d\\x14\\xae\\x6c\\x92\\x17\\x3e\\x9c\\x1c\\x51\\x00\\x9f\\x79\\x27\\x2f\\x7f\\x38\\xe2\\x38\\x41\\x4e\\x15\\x95\\x18\\x67\\x0e\\xca\\x62\\xe7\\xe5\\x11\\xdd\\xbb\\x77\\x49\\x5c\\x1f\\xd6\\xcb\\xc5\\x4d\\x71\\xff\\xea\\x0c\\x29\\x3c\\x68\\x2c\\x45\\x34\\x05\\xe7\\x10\\x9e\\x6b\\x7c\\x2f\\xba\\xdd\\x53\\x51\\xe0\\x32\\x6a\\x46\\x4a\\x8a\\xeb\\x1a\\x97\\x6e\\x55\\xa0\\xa8\\xa9\\x1c\\x16\\xf7\\x82\\x5b\\x0b\\x3b\\xdb\\x59\\xfb\\x8e\\xef\\x10\\x5b\\x62\\x26\\xe7\\xfb\\xbe\\xd4\\x88\\x47\\x72\\x94\\x8d\\x56\\x8a\\xb3\\x3c\\x2e\\x9a\\x5a\\x26\\x54\\xa7\\x38\\x0b\\x5e\\x74\\xd6\\x91\\x5f\\xed\\x9a\\x7f\\x94\\x97\\x3b\\xea\\x9a\\xa6\\xe6\\x16\\x9d\\xa2\\x1b\\x0b\\x2a\\x63\\x29\\xda\\xe2\\xf4\\xac\\x10\\xda\\x28\\xad\\xf6\\xb7\\x13\\xe5\\x59\\x5d\\xe6\\xe9\\x59\\x71\\xfa\\x2a\\x5d\\xe6\\x46\\xe7\\x8d\\xa4\\x98\\x46\\xdc\\x14\\xef\\xea\\xb5\\xdf\\xfe\\x49\\xbe\\x2f\\xad\\xfd\\xcd\\x36\\x2f\\x63\\x5c\\x52\\x4f\\x42\\x7f\\xb7\\x9e\\xa4\\xb8\\x77\\xaa\\x3c\\x4d\\x62\\xcd\\xdc\\x74\\x9b\\x26\\xd5\\x55\\xbb\\xa5\\x85\\xb9\\x56\\xa4\\xa1\\xb4\\xf4\\x48\\xf3\\x25\\x8a\\x93\\x53\\xb5\\xf6\\x39\\x3d\\xb5\\xb0\\xd2\\xca\\xc0\\x8a\\x9f\\x88\\xb3\\x37\\xea\\x70\\xbd\\xe6\\xcd\\x25\\x59\\x71\\xaa\\xdd\\x22\\x45\\x11\\x3e\\xe4\\x69\\xdc\\x46\\x06\\x51\\xec\\xd3\\x57\\x1b\\xd3\\xe8\\xb1\\x36\\xd1\\x48\\xe2\\x7d\\x50\\x6e\\x44\\xf1\\x68\\xbe\\xa3\\xbc\\x78\\x20\\x76\\x58\\x51\\xd7\\x90\\x64\\x31\\xce\\xea\\xb5\\xbb\\x5a\\xad\\x56\\xc5\\x3d\\xb7\\x62\\x5f\\x9a\\xf2\\x88\\x83\\xc6\\xdf\\x34\\x71\\x74\\x97\\xe6\\x77\\x6c\\x6e\\x67\\x65\\xf8\\x3d\\x49\\x62\\x97\\x47\\xa7\\x6a\\x62\\x86\\xd3\\x28\\x79\\x1e\\x32\\xb6\\x66\\xaf\\x2e\\xde\\xb6\\xce\\xdc\\xa2\\x4c\\x8e\\xa8\\x7c\\x38\\x43\\xc3\\x98\\x8e\\xdb\\x50\\x1b\\xd9\\xa4\\x44\\x1a\\xcc\\x42\\x78\\x6a\\x66\\x40\\xc2\\xcc\\x0e\\x0a\\x4a\\x8d\\xef\\x6f\\xe6\\x0e\\x4e\\x43\\xc8\\x71\\x03\\x1e\\x0a\\xe6\\xc1\\x24\\xf4\\x67\\xe4\\x3f\\xde\\x0c\\x88\\x4d\\x43\\xeb\\xe5\\xd7\\xd4\\x1a\\x5f\\x45\\x12\\x20\\x9d\\x67\\x4d\\xa4\\x22\\xa6\\x2e\\xb1\\x88\\x69\\x08\\x9c\\xfa\\xae\\xbf\\x9c\\x2d\\xe3\\x20\\x0e\\x84\\x17\\x6b\\xf2\\x53\\xdd\\x18\\x24\\xbd\\xc4\\x80\\x8c\\x81\\x49\\x63\\x36\\xa8\\xc4\\xb2\\xf7\\xd7\\x8d\\xed\\x4b\\x84\\xd0\\xc5\\xfb\\xb5\\x72\\xf8\\x8b\\xd0\\x8d\\x4c\\x84\\x3d\\xad\\x5f\\x16\\xa8\\xac\\x93\\x28\\xc5\\x95\\xfb\\x6b\\x75\\x6e\\xa7\\xd7\\x68\\x5b\\xe5\\xe9\\xa9\\xc6\\x1b\\x1a\\x75\\x9b\\xc9\\xb1\\x38\\x51\\x36\\x4c\\xd4\\x9b\\x69\\x96\\xbf\\x61\\x5e\\xff\\x37\\x32\\xb6\\xee\\xd7\\x6e\\x40\\xd7\\x1a\\x5d\\x5f\\x95\\x07\\x7b\\xe4\\x65\\x40\\x18\\x34\\xff\\x84\\x57\\xab\\xfe\\x6f\\x00\\x00\\x00\\xff\\xff\\x71\\x15\\x71\\x5b\\x22\\xdb\\x02\\x00\")\n\nfunc assetsLoginDistAllMinCssBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_assetsLoginDistAllMinCss,\n\t\t\"assets/login/dist/all.min.css\",\n\t)\n}\n\nfunc assetsLoginDistAllMinCss() (*asset, error) {\n\tbytes, err := assetsLoginDistAllMinCssBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"assets/login/dist/all.min.css\", size: 187170, mode: os.FileMode(420), modTime: time.Unix(1570965576, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _assetsLoginDistAllMinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xcc\\xfd\\x0b\\x97\\xa3\\x36\\xb6\\x30\\x0c\\xff\\x95\\x32\\xd3\\x87\\xa0\\xf6\\xb6\\xcb\\xee\\x24\\xf3\\x3d\\x83\\x5b\\xc5\\xca\\x75\\x92\\x49\\xe7\\x72\\xd2\\x3d\\x93\\xcc\\xc1\\xf4\\x2c\\x01\\x02\\x53\\x85\\xc1\\x85\\xa9\\xae\\xea\\x18\\xe6\\xb7\\x7f\\x4b\\x5b\\x12\\x08\\x8c\\x3b\\x99\\xf3\\xbc\\xef\\x5a\\xef\\xea\\xd5\\x65\\x10\\xba\\x6b\\x6b\\xdf\\xb4\\xf7\\xd6\\xf5\\xf3\\xd9\\xed\\x7f\\x3f\\xf0\\xea\\xfd\\xd5\\xbb\\x17\\xcb\\xf5\\xf2\\x93\\xab\\xe6\\xca\\x89\\xc8\\xd5\\x8b\\xd5\\xea\\x53\\xb8\\x7a\\xb1\\x5a\\x7f\\x7a\\xa5\\x3e\\x7f\\x5d\\x3e\\x14\\x31\\xab\\xb3\\xb2\\x80\\xab\\x6f\\x8b\\x68\\x79\\xd5\\x5c\\xdd\\xde\\x8b\\x2f\\xcb\\xb2\\x4a\\xaf\\xf3\\x2c\\xe2\\xc5\\x91\\x3f\\xbf\\x9e\\x25\\x0f\\x45\\x24\\x72\\x39\\x0c\\x42\\x72\\xb2\\xca\\xf0\\x96\\x47\\xb5\\x45\\x69\\xfd\\xfe\\xc0\\xcb\\xe4\\x6a\\x5f\\xc6\\x0f\\x39\\xb7\\xed\\x0b\\x1f\\x96\\xfc\\xe9\\x50\\x56\\xf5\\xd1\\x1b\\xbe\\x52\\xb6\\x8c\\xcb\\xe8\\x61\\xcf\\x8b\\xda\\x0b\\x1d\\x06\\xb3\\x15\\x71\\xfb\\x86\\xc8\\x29\\x4b\\x9c\\x59\\x9f\\x85\\xd4\\xbb\\xaa\\x7c\\xbc\\x2a\\xf8\\xe3\\xd5\\x57\\x55\\x55\\x56\\x8e\\xa5\\xc6\\x50\\xf1\\xfb\\x87\\xac\\xe2\\xc7\\x2b\\x76\\xf5\\x98\\x15\\x71\\xf9\\x78\\xf5\\x98\\xd5\\xbb\\x2b\\x76\\xa5\\x4b\\x5a\\x64\\x53\\xf1\\xfa\\xa1\\x2a\\xae\\x42\\x87\\x91\\xd6\\xc5\\xbf\\x8e\\xf5\\x50\\xc4\\x3c\\xc9\\x0a\\x1e\\x5b\\x33\\xdd\\x5d\\x59\\xde\\x93\\x3f\\x6e\\xbd\\xcb\\x8e\\x30\\x1c\\xf9\\x3b\\x56\\x5d\\x45\\xd4\\x0f\\x20\\xa6\\xd1\\xf2\\x28\\xe6\\x07\\x38\\x8d\\x96\\x51\\x59\\x44\\xac\\x86\\x84\\x46\\xcb\\xc3\\xc3\\x71\\x07\\x29\\x8d\\x96\\x59\\x11\\xf3\\xa7\\x1f\\x13\\xd8\\xd1\\x53\\x0b\\x19\\xdd\\x2d\\xeb\\xf2\\x75\\x5d\\x65\\x45\\x0a\\xb7\\x74\\xb7\\xdc\\xb1\\xe3\\x8f\\x8f\\xc5\\x4f\\x55\\x79\\xe0\\x55\\xfd\\x1e\\xee\\x44\\xa6\\xdc\\x98\\x10\\xd8\\x53\\x0b\\x97\\xce\\x82\\x82\\x0e\\xfb\\xa0\\xc6\\x22\\x26\\xa2\\x58\\x26\\xc5\\x32\\x2b\\xb2\\x1a\\xbf\\xb4\\x50\\xd2\\xeb\\xb7\\xfe\\xf6\\xb8\\x7d\\xf8\\xfa\\xab\\xaf\\xbf\\xde\\x3e\\x7d\\xb6\\x0a\\xe6\\xcd\\xe8\\xfd\\xd9\\x75\\x0a\\x07\\x7a\\xfd\\x76\\xb1\\x3f\\x2e\\xae\\xe1\\x9e\\x5e\\x2f\\x1c\\x7f\\x1b\\xb3\\xc5\\x6f\\x01\\xb9\\x4e\\x33\\xa8\\xa6\\x1b\\x0b\\x97\\x75\\xf9\\xf7\\xc3\\x81\\x57\\x5f\\xb0\\x23\\x77\\x48\\xbb\\x11\\x2d\\xd3\\x62\\x79\\xa8\\xca\\xba\\x14\\x93\\x47\\x4f\\x12\\x6e\\xdc\\x3d\\x44\\x65\\x71\\xac\\xab\\x87\\xa8\\x2e\\x2b\\xb7\\x80\\x23\\xcf\\x39\\x3e\\x5a\\x16\\xe4\\xbc\\x48\\xeb\\x9d\\xbb\\x82\\xba\\xfc\\xac\\xaa\\xd8\\xfb\\x7e\\xb5\\xbb\\x86\\xe2\\x65\\xc4\\xf2\\xdc\\x11\\x53\\x4f\\x5a\\x48\\x79\\x3d\\x80\\x08\\x3d\\xf4\\x87\\x3c\\x9f\\x51\\xe6\\xad\\x6e\\x98\\x27\\x72\\xfa\\x6c\\x2e\\x7e\\x96\\xb2\\xfe\\xc0\\x95\\x69\\x81\\x3b\\xac\\x4c\\xac\\xcc\\xeb\\x9a\\x45\\x77\\x83\\x2a\\xc5\\x8a\\x86\\xb4\\x58\\xee\\x79\\x95\\x72\\xcc\\xba\\x34\\x06\\xe0\\x10\\x60\\x3d\\xf4\\x2c\\x0f\\x15\\x7f\\xf7\\x23\\x82\\x38\\x45\\xe0\\x08\\x45\\xde\\x9a\\x3f\\xc9\\x57\\xfd\\x02\\x61\\x0b\\x9c\\x45\\x3b\\x77\\x7a\\xdd\\x96\\xe2\\x1b\\xb6\\x04\\x72\\xd5\\xf6\\xec\\x30\\x35\\x4a\\xac\\xb2\\xeb\\xb4\\x53\\x2c\\xf7\\xec\\xe0\\x0c\\x61\\x32\\x84\\xa8\\xcb\\xce\\xe4\\x60\\x43\\x88\\x44\\xa5\\x84\\xb4\\x80\\xf0\\x39\\x31\\xc7\\xa3\\x8a\\xe3\\x25\\x3b\\x1c\\xf2\\xf7\\xaa\\x47\\x55\\x8a\\xf0\\x77\\x14\\x15\\x24\\x59\\x75\\xac\\x2f\\x55\\xc0\\xef\\x9d\\x15\\x69\\x21\\x67\\x1f\\xcc\\xb2\\x58\\x93\\x16\\xf8\\xfd\\xc4\\x94\\x1b\\x2b\\x06\\x11\\x9d\\xb3\\xb9\\x23\\x96\\x33\\x74\\x57\\xdd\\x7c\\x8f\\xfa\\x19\\xdd\\xd0\\x95\\x6d\\x87\\x37\\x91\\xe7\\xe3\\x02\\x47\\x41\\xe0\\xfa\\x81\\xa8\\xbe\\x88\\x2f\\x8e\\xb2\\x5b\\xb0\\xa6\\x39\\x5b\\x5b\\x01\\x46\\x0a\\x2e\\xdc\\x04\\x8e\\x65\\x55\\xbb\\xd1\\x52\\xfc\\xc0\\xf1\\x80\\x53\\x17\\x2d\\xe5\\x43\\x0b\\xc5\\x92\\x3f\\xd5\\xbc\\x88\\x29\\xee\\x38\\xf5\\x6c\\xb4\\x29\\x86\\xc4\\x40\\xcc\\x7d\\x0c\\x1c\\x12\\x48\\x69\\x37\\x91\\xfe\\x2a\\x68\\x9a\\x53\\x0b\\x3b\\xba\\x86\\xac\\x4f\\xd6\\x43\\xbf\\xa5\\xb3\\xf5\\x26\\x11\\xe8\\x2c\\x2c\\xcb\\x9c\\xb3\\xa2\\x47\\x9e\\xa9\\x6d\\x3b\\xb7\\x34\\x1d\\x54\\xb6\\x53\\x95\\xcd\\xe7\\x04\\xce\\xb0\\x6d\\xda\\x34\\xc5\\x32\\x3b\\x7e\\xad\\xfb\\x95\\x92\\xa6\\x71\\x52\\x7a\\x6a\\x09\\xec\\x28\\xa5\\x99\\x6d\\x3b\\xa9\\x04\\xdc\\xdd\\x62\\x41\\x36\\xd9\\xcd\\x6e\\x23\\x2a\\xca\\x12\\x47\\xee\\x28\\x87\\x0d\\x5a\\x22\\x44\\xf4\\x2b\\xbc\\xca\\x8a\\x2b\\x46\\x22\\x9a\\xfa\\xa1\\xc0\\x7b\\x4c\\xfc\\xa4\\x33\\x4a\\x63\\xd1\\x3d\\xdb\\x16\\x3f\\xa2\\xd5\\x9f\\x72\\x96\\x15\\x72\\xae\\x9d\\x58\\x34\\xcc\\xa9\\x48\\xc6\\x8d\\xee\\xc4\\x84\\x10\\xcf\\xe1\\x9e\\xc3\\xe9\\x6c\\x2d\\xf0\\xa4\\x6d\\xf7\\x1f\\x23\\xe2\\x45\\x62\\x25\\xdd\\x2e\\xdd\\xac\\x0b\\xbf\\x9e\\x5a\\x10\\xcd\\x53\\x3d\\xf7\\xce\\x2d\\x24\\x10\\x13\\xe2\\xbe\\x2b\\xb3\\xf8\\x6a\\xa5\\x7a\\x83\\x59\\x62\\xd2\\x01\\x50\\xda\\x2f\\x9c\\x73\\xe2\\x4f\\x07\\x56\\xc4\\xa5\\xab\\xc8\\x86\\x35\\x77\\xf6\\xf3\\xef\\x59\\xbd\\x5b\\x56\\x22\\x79\\xef\\x10\\xb2\\xac\\xf8\\x21\\x67\\x11\\x77\\xae\\xb7\\x5f\\x5e\\xa7\\x60\\x59\\x04\\xb2\\xe3\\xcf\\x9c\\xc5\\xef\\xdd\\xd9\\x0a\\xb8\\x20\\x3a\\x03\\x38\\x1e\\x13\\x24\\x46\\x5a\\x28\\xca\\xf2\\x60\\x02\\x63\\x0b\\xfd\\x7a\\x4c\\x6c\\x72\\x4b\\x27\\x59\\x94\\xd2\\x62\\x29\\xd6\\x11\\xab\\x51\\x53\\xe3\\xe2\\x5f\\x3d\\x51\\x90\\x1d\\x7f\\x91\\x94\\xe9\\x32\\x4e\\xb4\\x6d\\x46\\x29\\x65\\x4b\\x49\\xc2\\x44\\x45\\x3f\\x3c\\xec\\x79\\x95\\x45\\x13\\x65\\x66\\xfd\\x12\\x30\\x62\\xdb\\x6c\\x71\\x60\\xd5\\x91\\x7f\\x9d\\x97\\xac\\x76\\x18\\x99\\xaf\\x6f\\xe8\\x4a\\x54\\x60\\x2c\\xc6\\xd4\\x08\\x14\\x10\\xce\\x8c\\xfe\\x37\\x0d\\x5b\\x16\\x65\\xcc\\xdf\\xbc\\x3f\\x70\\x09\\x92\\xb2\\xdf\\x0e\\x23\\xde\\x6c\\xed\\x32\\x73\\x17\\xda\\xf6\\xec\\x56\\x62\\xae\\x41\\x72\\x4f\\x59\\xc0\\xca\\x8e\\x3f\\xe9\\x97\\x1f\\x13\\x0b\\xab\\x98\\x61\\xcf\\xbe\\xda\\x1f\\xea\\xf7\\x13\\x3d\\x43\\x04\\xb3\\x31\\x80\\x57\\x8d\\x77\\xad\\x00\\x43\\x94\\x16\\xb5\\x5d\\x9a\\x47\\x4a\\x99\\xc7\\xe6\\x96\\xe5\\x9e\\xed\\x30\\xd6\\x34\\xe6\\x92\\xe9\\x54\\x6f\\xe7\\x67\\x6a\\x10\\x24\\x68\\x1a\\x5d\\xcc\\xd5\\xdf\\x5b\\x48\\xf3\\x32\\x64\\xf9\\x57\\xef\\x58\\x7e\\xde\\x53\\x88\\x28\\x7f\\xc7\\xf2\\x0d\\x13\\x33\\x58\\x65\\x7b\\x87\\x11\\x60\\xb6\\xed\\xac\\x71\\x25\\x15\\x1f\\xe1\\x58\\x0f\\x47\\x7e\\x75\\xac\\xab\\x2c\\xaa\\x2d\\xe2\\x39\\x21\\xcd\\x97\\x51\\xc5\\x59\\xcd\\xbf\\xca\\xb9\\xd8\\xb1\\x8e\\x75\\x8c\\xaa\\xec\\x50\\x5b\\x04\\xc2\\x25\\xd2\\x24\\x06\\xf9\\x72\\xc7\\x19\\xe2\\x77\\x5e\\xc4\\x5f\\xec\\xb2\\x3c\\x76\\x42\\xb2\\x3c\\xb0\\x8a\\x17\\xf5\\x0f\\x65\\xcc\\x97\\x15\\xdf\\x97\\xef\\xb8\\xfe\\x42\\xdc\\xc8\\x61\\x02\\xf1\\x47\\x6c\\xcf\\x73\\x41\\xea\\xa7\\x66\\x88\\x75\\xfb\\xe4\\x00\\xd6\\xfe\\xb8\\xb0\\xfa\\x8d\\x73\\x0f\\x15\\xee\\x81\\x98\\xff\\xc0\\xf6\\x7c\\x9a\\xfe\\x49\\xd0\\x10\\xdf\\x6d\\xbb\\x7f\\x5e\\xd6\\xe5\\xab\\xf2\\x51\\xf3\\x17\\x94\\xd2\\x70\\x98\\x32\\x41\\x51\\x05\\xed\\x13\\xf3\\x17\\x03\\xa7\\x2b\\x48\\x28\\xd3\\x28\\x35\\xa5\\x47\\x87\\x91\\x4d\\x96\\x38\\x11\\x32\\x91\\x29\\x39\\x09\\x58\\xd8\\x24\\x37\\x7c\\xc3\\x25\\xbe\\x8b\\x69\\xa8\\xa8\\x1e\\xf3\\x79\\x00\\x11\\x81\\x98\\x52\\x3a\\x5b\\x93\\xb0\\xe2\\xec\\xae\\xe5\\xf9\\x91\\x5f\\x89\\x32\\x5c\\xc2\\xcf\\x1f\\x2c\\x71\\xb9\\x2d\\x09\\x1b\\xa2\\x20\\x07\\xf1\\xf3\\xc7\\xda\\xfb\\x70\\x29\\x8d\\xe5\\x58\\x0b\\x02\\x6a\\x3e\\x04\\xcc\\x96\\xe5\\x3a\\x02\\xa0\\xfb\\x95\\x2a\\x05\\x7a\\x13\\xac\\xc7\\x1d\\x1f\\xb1\\x62\\x06\\x9f\\x1b\\x36\\x8d\\x1f\\x6c\\xc6\\x08\\xc6\\x39\\x3a\\x0a\\x35\\x33\\x42\\x3c\\xcd\\x39\\x45\\x60\\x1d\\x91\\xbd\\x35\\xb7\\x85\\x60\\xc2\\x18\\x71\\x13\\x39\\x92\\x08\\x18\\x21\\x10\\xb5\\x90\\x15\\xe7\\x6d\\x1a\\x9c\\x8c\\xec\\x75\\xe8\\x2d\\xd6\\x6e\\xaa\\x99\\x1a\\x06\\x91\\xe8\\xae\\x68\\x6a\\xd4\\x55\\x31\\x6d\\xb2\\xbb\\xf3\\x50\\x43\\x40\\x4c\\x57\\xc0\\x3b\\x80\\xd8\\x44\\x37\\xf1\\x26\\x9e\\xcf\\x09\\xf3\\xf9\\x7c\\x1e\\xd0\\xd0\\x8f\\xbb\\x51\\xe9\\x3c\\x94\\x83\\xd8\\xa5\\x15\\x3f\\x9c\\xf5\\x4a\\x37\\x20\\xe0\\xcc\\x0f\\x20\\xa1\\x2b\\x41\\x91\\x75\\x53\\x3b\\x3a\\x8b\\x36\\xe9\\x4d\\xb2\\x49\\xe6\\x73\\x12\\xd3\\x59\\xe8\\x30\\x3f\\x09\\x20\\x21\\x10\\xcf\\x28\\xdd\\xd9\\x36\\x47\\x16\\x06\\x53\\x3b\\xc2\\xc4\\xc7\\x4c\\x9f\\x09\\xcd\\x67\\x0d\\x08\\x68\\x86\\x8c\\xfa\\x81\\x00\\xe9\\x1d\\x12\\x65\\xa3\\x45\\xdd\\xa0\\x00\\x49\\xb9\\x46\\xb1\\x6d\\x67\\xb2\\xd1\\x98\\x6c\\x3a\\xd0\\x4a\\x24\\x68\\xfd\\x6e\\x01\\xdd\\x45\\x05\\xed\\x7e\\x00\\x99\\xe0\\xc4\\x1f\\xb2\\xd8\\x5d\\xc3\\xa1\\x2a\\x9f\\x26\\x61\\x45\\x70\\x3d\\xaa\\xe8\\x19\\x1c\\x84\\xb6\\xed\\x44\\x92\\x6f\\x08\\x29\\x03\\x46\\x45\\xc3\\x26\\x9f\\xc2\\x04\\x6f\\x40\\x15\\xb7\\xde\\x71\\x20\\xf0\\x82\\x40\\x42\\xcf\\x19\\x3b\\xa6\\x7a\\x16\\x4a\\x96\\x0e\\xb8\\x12\\xbf\\x9c\\x71\\x05\\x04\\x79\\xd8\\xa5\\xe8\\x3a\\x65\\xe6\\x8f\\xa0\\x49\\xe2\\x77\\x3e\\x87\\x44\\xb3\\x10\\x02\\x6d\\x3d\\xba\\x5f\\xb2\\x9a\\x2f\\x8b\\xf2\\x11\\x8e\\x0f\\x07\\x21\\xa3\\xba\\x77\\xad\\xe8\\x2b\\x72\\xec\\xd6\\xe7\\x92\\x41\\xbb\\xfa\\xe1\\x61\\x1f\\xf2\\xea\\x4a\\x4a\\x73\\x57\\x7a\\x14\\x57\\x08\\xd3\\x57\\xa2\\x86\\xab\\x9f\\x79\\xfa\\xd5\\xd3\\xe1\\x4a\\x6e\\x13\\xc9\\x1d\\x58\\xc8\\x4b\\xd6\\x8e\\x75\\x65\\x91\\x91\\x50\\xb9\\xf3\\x2d\\x5f\\x52\\x8c\\x2b\\x6b\\x1e\\xce\\xad\\xc0\\x0a\\xce\\xd0\\x1f\\xd9\\xe8\\x32\\x57\\xc7\\x9e\\x87\\xb6\\x24\\x8c\\x58\\x62\\x65\\x05\\x36\\xed\\xd8\\xe9\\x8e\\x14\\x6f\\x26\\xf8\\x8c\\x68\\x82\\x26\\x4b\\x5a\\xa3\\x89\\xb6\\x6d\\x87\\xde\\x6c\\xe5\\x5a\\x4c\\x0c\\x49\\x15\\x59\\x09\\xa4\\xdc\\x34\\x56\\x81\\xa3\\x1f\\xac\\x6e\\x78\\x23\\x18\\xf3\\xc5\\x1a\\x21\\xac\\x15\\x5d\\xab\\xe9\\x04\\x95\\xd3\\xbc\\x31\\xec\\x20\\x83\\x5b\\xb8\\x83\\x1c\\xf6\\x50\\x40\\x09\\x07\\xb8\\x87\\x0a\\x8e\\x50\\xc3\\x03\\xb5\\x8e\\xd9\\x6f\\xbf\\xe5\\xdc\\x9a\\xaf\\x9f\\x0b\\xce\\x4a\\x4c\\x27\\xbc\\x33\\x05\\xe3\\x47\\xba\\x82\\x27\\xba\\x82\\xf7\\x74\\xc7\\x1c\\x02\\xbf\\xc9\\x9f\\xcf\\xe4\\xcf\\xe7\\xd3\\xe2\\xab\\xe0\\x89\\x04\\x14\\xe6\\x74\\xb6\\x22\\xb0\\x6a\\xe1\\x0b\\xba\\x7e\\xf9\\xf2\\xe3\\x35\\x7c\\x49\\x4f\\xed\\x58\\x16\\xff\\x4a\\xec\\xf2\\xaf\\xe9\\x57\\xcb\\x43\\x79\\x80\\xbf\\x8a\\x5f\\x21\\xd2\\x7f\\xa3\\x1f\\xbe\\xa5\\x5f\\x29\\xc9\\xff\\x6f\\xf4\\x12\\x26\\x5a\\x09\\x3e\\x59\\x63\\x9f\\xf8\\x26\\xda\\x44\\x92\\x14\\x30\\x3f\\x0a\\x44\\x57\\x14\\x43\\x72\\x15\\xa9\\xe5\\x59\\xac\\x5b\\xf8\\x8e\\x5a\\xd1\\x8e\\x47\\x77\\x3c\\x6e\\xa4\\xcc\\xcc\\xe3\\x86\\x1d\\xdf\\x17\\x51\\xc3\\x1e\\xea\\x32\\x29\\xa3\\x87\\x23\\x3e\\x1d\\x72\\xf6\\xbe\\x11\\x92\\x66\\x55\\xe6\\xc7\\x26\\xe6\\x09\\xaf\\x9a\\x38\\x3b\\xb2\\x30\\xe7\\x71\\xb3\\xcb\\xe2\\x98\\x17\\x4d\\x76\\xdc\\xb3\\x43\\x93\\x97\\xe5\\xa1\\xd9\\x3f\\xe4\\x75\\x76\\xc8\\x79\\x53\\x1e\\x78\\xd1\\x54\\x9c\\xc5\\x65\\x91\\xbf\\x6f\\x94\\xd2\\x24\\x6e\\x8e\\x51\\x79\\xe0\\xb1\\x05\\xaf\\xa8\\xe5\\x6f\\xb7\\x4f\\x2f\\x56\\xdb\\x6d\\xbd\\xdd\\x56\\xdb\\x6d\\xb1\\xdd\\x26\\x81\\x05\\xdf\\x53\\xcb\\xf1\\xdc\\xed\\x76\\xbb\\x5d\\x36\\xfe\\x76\\xfb\\xb8\\x08\\x1a\\xff\\xed\\x76\\xfb\\xb4\\x5a\\x2d\\xb6\\xdb\\x27\\xb6\\x0a\\xc8\\xdc\\x82\\x1f\\xe8\\xf7\\x1d\\x65\\xb1\\x1e\\x2d\\xb0\\x1e\\xff\\x64\\x11\\xf8\\x91\\x5a\\xdb\\xad\\x6f\\xcd\\x5f\\xcd\\xad\\xe7\\x8e\\x35\\xff\\x7e\\x6e\\x11\\xc7\\x73\\xd5\\xbb\\xff\\xfc\\xed\\xb3\\x66\\xf6\\xef\\xc0\\xa3\\x44\\xa5\\x78\\xee\\x47\\x4e\\xdf\\xd4\\x5b\\xf1\\xfb\\x51\\x40\\x9e\\x93\\x8f\\x9a\\xad\\x35\\xfe\\xb0\\xb5\\xc4\\x97\\xad\\xd5\\x38\\xd6\\xfc\\x87\\xb9\\x45\\x48\\xa3\\x6a\\xd9\\x6e\\x03\\x0b\\x7e\\xa2\\x96\\xdb\\x37\\xb8\\xdd\\x3a\\x8e\\xf3\\x9f\\x57\\x4d\\x9a\\xf1\\x17\\x87\\xf8\\xdb\\x6d\\x10\\x34\\xd6\\xfc\\xc7\\xb9\\x45\\x9e\\x93\\x66\\xf9\\x9c\\x6c\\xb7\\xa2\\x69\\xf8\\x6f\\x2a\\x80\\x55\\x6e\\x7b\\xe7\\xd5\\xdc\\x9a\\x5b\\x60\\xa5\\x16\\x81\\x9f\\xcd\\x74\\xeb\\x2d\\xf6\\x71\\x8e\\x15\\xbf\\x55\\x95\\x06\\x44\\xb7\\x42\\x9e\\xcb\\x31\\xcc\\x9f\\xa9\\xc2\\xaf\\x27\\x0a\\x3f\\x07\\xf9\\x63\\x11\\x78\\x33\\xf5\\xd9\\xf1\\x6f\\xe6\\xff\\x16\\x5d\\x7c\\x35\\xb7\\x48\\x97\\xf5\\xef\\x83\\xac\\x54\\x67\\x7d\\xbb\\xdd\\x06\\x1f\\x6d\\xad\\xe0\\xb9\\x67\\xce\\x1e\\xb6\\xfd\\x0f\\xb3\\xc4\\x4f\\x04\\x7e\\x19\\x37\\xf6\\xc3\\xdc\\x7a\\x66\\x11\\xf8\\x95\\x9e\\xbe\\xfd\\xd2\\x1d\\x7c\\xfb\\x93\\x9a\\x7a\\x8b\\xc0\\x17\\xaf\\x3e\\x7b\\xfd\\x7a\\xf8\\x75\\xbb\\x5d\\xf6\\xdf\\xdf\\x7c\\xf6\\xd7\\xe1\\x57\\xf1\\x69\\x04\\x49\\xcf\\x2d\\x22\\x33\\x7f\\xf6\\xe6\\xcd\\xcf\\xee\\xa8\\x17\\x3f\\x12\\xf8\\xe9\\xf5\\x57\\x7f\\xff\\xf2\\xc7\\xf1\\x87\\x9f\\x08\\x7c\\xf1\\xcd\\xb7\\xaf\\x46\\x5d\\x73\\x1d\\x04\\x7e\\xd4\\x6b\\x34\\x39\\x3b\\xd6\\x4d\\x51\\xef\\xc4\\xff\\x85\\x78\\x21\\x0b\\x27\\x12\\x9c\\x70\\x53\\x26\\x0b\\x81\\xdc\\x14\\xf0\\xa8\\xd9\\xe2\\xef\\x78\\xd1\\x94\\x71\\xdc\\x38\\x8e\\x3f\\x5f\\x04\\x0d\\x71\\xb6\\xdb\\xf8\\x39\\x29\\x9a\\x1e\\x7e\\xd5\\x07\\xf5\\xbe\\xdd\\xc6\\x73\\xd2\\x90\\x6e\\x6a\\x11\\x50\\xac\\x4c\\xf0\\xe7\\x65\\x99\\x8f\\xc6\\x2d\\xf6\\xc5\\x77\\x73\\x8b\\x3c\\x53\\x59\\x0a\\xce\\xe3\\xe3\\x17\\x52\\x9f\\x34\\x1e\\x9b\\xa8\\x4e\\x2e\\xb3\\xdb\\xf7\\x8a\\xdf\\x37\\x69\\xdd\\xe4\\x72\\x44\\xfd\\x00\\x87\\x63\\x70\\x3c\\x77\\xb1\\xdd\\xc6\\xc4\\xc3\\xae\\x1b\\x1d\\x73\\x3c\\xea\\xbf\\x5d\\x04\\xcd\\x33\\xd5\\xc5\\x16\\xfe\\x49\\xaf\\x45\\xaf\\xb2\\xe2\\xf0\\x50\\x2b\\x84\\xd4\\x88\\xce\\xb0\\x8a\\xb3\\x26\\x7c\\xa8\\xeb\\xb2\\x20\\xcf\\xae\\x33\\xf8\\x1f\\x7a\\xfd\\x76\\xb7\\x8d\\xc5\\xe3\\x33\\x7a\\xfd\\xd6\\x7f\\x7b\\x0a\\xe6\\xdb\\xd3\\xf6\\xf8\\x7c\\xeb\\x17\\xac\\xce\\xde\\xf1\\xab\\xed\\xe3\\x35\\xfc\\x4b\\xd6\\xf6\\x27\\xc7\\x17\\x18\\x64\\x4e\\x1a\\x67\\xfb\\x38\\x27\\xcd\\x76\\xa9\\x13\\xc8\\xb3\\x6b\\x60\\x8c\\x5e\\xfb\\xf3\\x7f\\x07\\xd7\\x10\\x32\\x7a\\xfd\\x51\\xb3\\xdd\\x5e\\xa7\\x10\\xb1\\x01\\xe4\\xe1\\x3e\\xf4\\xb7\\xdb\\x98\\x2d\\x92\\xe0\\xb4\\x86\\x3f\\xb7\\x38\\x0a\\xaf\\x91\\x43\\x24\\xcd\\x12\\x47\\x20\\x40\\x38\\x66\\x74\\x92\\xc1\\xa2\\xd6\\xea\\xc9\\x9a\\x87\\x8b\\x3f\\x7f\\xfa\\xe9\\xc7\\x7f\\xd6\\xec\\x8e\\x60\\xd6\\xe2\\xa6\\x89\\xbc\\xd0\\x5d\\xdd\\xc4\\x9e\\xa4\\xed\\xcb\\xa4\\x2a\\xf7\\x5f\\xec\\x58\\xf5\\x45\\x19\\x73\\x27\\x9e\\x63\\x09\\xe2\\x4e\\x7e\\xbc\\xb9\\x59\\xaf\\x9a\\x4f\\x3f\\x7d\\xf1\\x97\\x3f\\xc3\\x7a\\xf5\\xe2\\x63\\x3b\\x6e\\x3e\\xfd\\xf3\\xc7\\x2f\\x56\\x28\\xb8\\x98\\x4c\\xcc\\xde\\x21\\xed\\xa6\\xae\\xde\\x9f\\xbe\\x51\\x6c\\xcc\\x57\\xf4\\x5b\\xc9\\xb7\\xbc\\x5b\\x22\\xf4\\x09\\xb9\\xec\\x48\\x60\\xf8\\xf6\\x95\\x6f\\xbe\\x6b\\x45\\x67\\x47\\xaf\\xdb\\x88\\xd5\\xd1\\xce\\x49\\x18\\x39\\x7d\\x43\\x4f\\x58\\xaf\\xfb\\x95\\xca\\xe5\\x0d\\x89\\xd4\\x5f\\xb5\\x14\\x03\\xaa\\xd9\\x90\\x90\\x76\\x92\\xfb\\x67\\x06\\x37\\xbd\\x79\\xdc\\x65\\x39\\x17\\xf4\\x4b\\x31\\xd0\\xf3\\x79\\x40\\x36\\x1d\\xf3\\x1c\\x2d\\xd6\\x6d\\xdb\\x76\\x1c\\x4a\\xca\\x70\\xc2\\x63\\xe0\\xb2\\xae\\x04\\x76\\x8a\\xde\\x97\\x48\\xe7\\x1f\\xe1\\x49\\xb0\\xb2\\x4e\\xe8\\x85\\xcb\\xf2\\xb1\\xe0\\xd5\\x97\\x8a\\xb8\\x37\\x4d\\xe8\\xbe\\x23\\x33\\x4a\\x0b\\xdb\\xde\\x3b\\x21\\x81\\x50\\xb0\\x1c\\x05\\xc4\\x62\\x6d\\xfc\\x00\\xee\\x68\\xd8\\x8d\\xb9\\x93\\x37\\x66\\x86\\x70\\x3e\\x63\\x4d\\xb3\\x9e\\x51\\x7a\\x67\\xdb\\x7f\\x91\\x3f\\x6b\\x7c\\xd5\\x04\\x37\\x16\\xed\\xce\\xb8\\x6d\\x1f\\x50\\x32\\x5c\\xab\\xbc\\x4e\\x42\\xff\\xb5\\xe4\\x4f\\x1c\\xc5\\x5f\\x41\\xa8\\x6f\\x69\\xe2\\xaf\\x03\\xcc\\xf3\\x17\\x2a\\xca\\x8b\\xa7\\x1d\\x0d\\x97\\x29\\xaf\\x95\\xbc\\xfd\\xf9\\xfb\\x6f\\x63\\xe7\\x96\\xc0\\x6c\\xd7\\x34\\xb3\\x9d\\x21\\x54\\x0f\\xda\\xda\\x2d\\x33\\x21\\xb3\\xdd\\x76\\x89\\x92\\xcf\\xde\\x11\\x88\\x3b\\x99\\x71\\x34\\x09\\xb6\\x8d\\x2d\\x0d\\xd2\\xce\\xdb\\x25\\xb6\\x5d\\x3b\\x21\\xec\\x88\\x6d\\xff\\x5e\\x1b\\xa2\\xef\\x89\\xff\\x22\\xd0\\xdf\\x35\\xe4\\xc5\\x60\\x8e\\xe7\\xf8\\xf9\\xfb\\x37\\x2c\\x15\\xb2\\xb8\\x98\\x04\\xc0\\xde\\xe3\\x3c\\x7c\\x1c\\x10\\xdb\\x8e\\x86\\x39\\xbf\\xc8\\xd9\\xf1\\x28\\xf2\\xfe\\x6e\\x9d\\x5d\\x4e\\xd1\\x67\\x88\\x5b\\x21\\x95\\x2f\\xef\\x8f\\x42\\x8e\\x9c\\xdd\\x37\\xcd\\xec\\x7e\\x59\\xf3\\x23\\x8a\\x92\\x38\\xc7\\x47\\x5a\\xd1\\x07\\x78\\xa4\\x21\\x3c\\x51\\xb5\\x38\\x0c\\x04\\x73\\x7a\\xd7\\x9f\\x2e\\xcd\\xa8\\x02\\x83\\x73\\xc5\\x01\\x39\\x95\\x34\\x15\\xe2\\x92\\x53\\xc9\\xc5\\xfa\\xac\\xae\\xab\\x2c\\x7c\\xa8\\xb9\\x63\\x65\\xb1\\x45\\x88\\x77\\xa4\\x55\\x47\\x60\\x42\\x06\\xd6\\x76\\xfb\\xcc\\xb6\\x88\\x1b\\x2e\\x8f\\xe3\\xcc\\x70\\x24\\x70\\xa4\\x96\\x9f\\xc5\\xf4\\x23\\x6b\\x7e\\x9c\\x5b\\x1f\\x05\\x57\\x16\\xe4\\xb4\\xd4\\x8c\\x9d\\xdc\\x13\\xf9\\x62\\x41\\x4a\\x3f\\x0f\\xe8\\x71\\x5e\\x31\\x47\\x3c\\x91\\xcd\\x23\\x65\\x4c\\x8f\\xcb\\xb6\\x0f\\xcc\\x09\\x4d\\xf8\\x68\\x1a\\x31\\xba\\x72\\x79\\x5b\\x66\\x85\\x63\\x81\\x45\\xc4\\xa4\\x3c\\x11\\x81\\x14\\xce\\x66\\xf3\\x71\\x89\\xc7\\x2a\\xaf\\xd5\\x29\\xca\\x67\\x79\\xee\\x3c\\xe1\\x3c\\xca\\x1d\\xff\\x9e\\x9c\\xda\\x24\\x2b\\x58\\x9e\\xbf\\x3f\\x55\\x4d\\x13\\x2a\\x85\\xce\\x68\\xd4\\x6d\\xdb\\xaa\\x8a\\x33\\xa7\\xd7\\xde\\xfc\\x0c\\xd6\\xb3\\xb5\\xa0\\x46\\xb8\\x51\\xfb\\xdd\\x2b\\x18\\x69\\xa9\\xd0\\x16\\x22\\x67\\x97\\x1c\\x3a\\x91\\xd8\\xcf\\x9d\\x10\\x86\\x30\\x16\\xcd\\x85\\x3c\\x73\\x23\\x24\\xaf\\x68\\xc7\\x5f\\xe1\\xbc\\xd8\\x76\\xcc\\x73\\x5e\\xf3\\xab\\xd0\\x67\\xcb\\xe3\\x2e\\x4b\\x6a\\x87\\x04\\x10\\xfa\\x98\\x37\\xa0\\x5c\\xf7\\x25\\xec\\x9b\\xcc\\x98\\xa9\\x5f\\xf2\\x1f\\x02\\x3a\\x5b\\x01\\xeb\\xbf\\xdf\\x32\\xf3\\xa8\\x66\\xa4\\xf6\\x8a\\xb3\\x77\\x16\\xd9\\xf4\\xb3\\x37\\x9b\\x31\\x27\\x24\\x6a\\x82\\x3a\\xad\\xc2\\x6c\\xdd\\x4d\\x94\\xb9\\x18\\xb6\\x1d\\x5e\\xd6\\x87\\x41\\x48\\x85\\x80\\x6c\\x60\\xb6\\x3b\\x36\\xc4\\x90\\x4a\\xa6\\x6b\\x2c\\x62\\xea\\x1b\\x24\\x60\\xf0\\xc5\\x82\\xc4\\x4b\\x56\\xd7\\xd5\\x37\\xac\\x88\\x73\\xee\\x47\\x3e\\x0f\\x02\\x6a\\x0c\\x3b\\x1f\\xd4\\x16\\x0a\\x50\\x8f\\x69\\x64\\xdb\\x63\\x61\\x6c\\x4d\\xa9\\x81\\xf8\\x6c\\xdb\\xf9\\x77\\xb8\\x3c\\x96\\x0f\\x55\\xc4\\xbf\\x2d\\x62\\xfe\\xd4\\x34\\x5f\\x90\\x85\\xf3\\x6f\\x36\\x4e\\x13\\x3b\\x38\\x1e\\x60\\xa3\\x88\\xc8\\xae\\x45\\x34\\x5a\\x16\\xfc\\xa9\\x7e\\x9d\\x85\\x79\\x56\\xa4\\x02\\xe3\\x45\\x86\\x5c\\xb2\\x58\\x77\\xea\\x11\\x6f\\xed\\x2e\\xd6\\x7d\\x8f\\xf7\\xe6\\x42\\xf5\\xc7\\x50\\xdd\\x10\\x2e\\x6c\\x4b\\x2d\\x85\\x22\\x37\\x81\\xf2\\xa4\\x98\\x77\\x3c\\x37\\xa4\\x94\\x19\\xf3\\x5b\\xfc\\x5f\\xd5\\xef\\x18\\x0d\\x34\\x8d\\x25\\xb9\\x14\\x7c\\x23\\x17\\xda\\x2b\\xcd\\xf6\\x32\\xe6\\x98\\x4d\\x6a\\x30\\xa5\\xf3\\x10\\xcc\\x4f\\x11\\xc4\\xb2\\x3f\\x1c\\x12\\xca\\x1c\\x3f\\x80\\x48\\x53\\xca\\x90\\x40\\x4a\\x93\\x21\\x18\\xa4\\x8b\\x05\\x89\\x7c\\x4e\\x13\\x3f\\x0d\\x02\\xdb\\x76\\x04\\x14\\xd0\\x99\\x13\\x8b\\x1f\\xf1\\x4c\\x48\\x2b\\xfe\\x75\\x5d\\x3a\\x0c\\xf6\\x82\\x6d\\x4f\\x9d\\x53\\xb3\\x49\\xbc\\x6d\\xdb\\xac\\x8d\\x68\\xca\\x96\\x4a\\x79\\x41\\x4f\\x2d\\x24\\xe2\\x3d\\x3b\\xfe\\xfa\\xfd\\xab\\x73\\x89\\x1c\\x95\\x79\\x6c\\x4c\\x81\\x19\\xe9\\x64\\x6d\\xd5\\x42\\x77\\xfe\\xe9\\x59\\xdf\\xbc\\xf9\\xfe\\xd5\\x10\\xff\\xba\\xb3\\x75\\x0b\\x7b\\x6c\\x95\\xd7\\xba\\x96\\x09\\xe9\\x9f\\x43\\x4a\\x99\\x77\\xde\\x9a\\xfb\\xae\\x3b\\xad\\x91\\x74\\x5f\\xd0\\xdb\\xd4\\x00\\xf6\\x74\\xdc\\x1d\\xcf\\x29\\x68\\x0a\\x25\\x3d\\xfb\\x00\\x5c\\xa4\\xf1\\x84\\x3d\\xe4\\xf5\\x3f\\x32\\xfe\\x08\\xdc\\xb6\\xf9\\x8c\\x52\\x01\\x2c\\x07\\xdb\\x76\\xf8\\x92\\xc5\\xf1\\x57\\xef\\x78\\x51\\xbf\\xca\\x8e\\x35\\x2f\\x78\\xe5\\x9d\\x27\\x39\\xd6\\x43\\x91\\x97\\x2c\\xb6\\x80\\x33\\x98\\xad\\x89\\xcb\\xc5\\x16\\x66\\xd1\\x0e\\x73\\xd9\\xf6\\xe0\\xd5\\xb1\\xca\\xa2\\xcf\\x4e\\x08\\x1c\\xe8\\x2c\\x71\\x52\\x02\\x11\\xee\\x7b\\x44\\xc1\\x47\\x7a\\x6b\\x00\\x8f\\xa9\\x46\\x8f\\x34\\x69\\xa4\\x56\\x66\\xc1\\x8c\\x8d\\xe8\\x55\\xf7\\xd9\\x22\\xad\\xa8\\x71\\x6a\\xc9\\x2f\\xd6\\x6d\\xaa\\xfc\\x53\\x85\\x31\\xbf\\x28\\xf7\\x12\\x63\\x5a\\x84\\xa8\\xe6\\xce\\x69\\xbf\\x90\\x17\\x15\\x00\\x9f\\xb7\\xda\\x11\\x73\\xfa\\x4c\\x92\\xb7\\xf4\\x12\\x5b\\x20\\x4b\\x0a\\x5e\\xe5\\x42\\x17\\xcb\\x41\\x17\\x19\\x11\\x3c\\xcc\\x03\\xcc\\x46\\x15\\x8a\\xba\\x9a\\x66\\x2a\\xd5\\x79\\x18\\x77\\x53\\x34\\xe6\\x39\\xf1\\x32\\xc9\\x8a\\x78\\xf9\\xed\\x97\\x23\\xe5\\x4c\\x96\\x4c\\x5a\\x7c\\x8c\\x39\\x3a\\xe4\\x0c\\x35\\xb2\\x19\\x31\\x5d\\xbd\\x25\\x40\\x24\\x18\\xa2\\x9e\\x6c\\x78\\x7e\\x14\\xb8\\x7e\\xd0\\xb6\\x20\\x5a\\xcf\\x6b\\x5e\\x0d\\xdb\\xef\\xf6\\x5b\\x47\\x7b\\x23\\x06\\x71\\x5f\\xdd\\xe4\\x0a\\x9e\\x33\\x2f\\x02\\x43\\xb7\\x2d\\x71\\x1d\\x45\\x5f\\xbb\\xa1\\xfe\\x3f\\xd0\\xac\\x1c\\xf2\\x45\\x5c\\xd3\\xf5\\x44\\xd2\\xcc\\xf3\\x34\\xd9\\xc3\\xc1\\xfc\\xbc\\x63\\xf9\\x03\\x57\\x7d\\x06\\xd5\\xd7\\x37\\x9f\\xfd\\x95\\x4e\\x43\\xb2\\x37\\xa5\\xb8\\xfb\\xbd\\x15\\x33\\x8a\\x5f\\x64\\x65\\x5d\\x64\\x37\\xbd\\xf0\\x9c\\x91\\x62\\x9d\\xee\\x77\\x52\\xa3\\x1d\\x53\\x3f\\x50\\x47\\x4b\\x17\\x2b\\x17\\x44\\xd5\\x7a\\x2e\\x48\\x0c\\x23\\x27\\x4d\\x5b\\x13\\x3c\\x66\\x20\\x82\\x6a\\x47\\x06\\x22\\x53\\x6c\\x79\\xd4\\xcd\\x52\\xac\\x39\\xa1\\xa4\\xd5\\xf3\\x83\\x0a\\x93\\xf1\\x0c\\x75\\xbb\\xca\\xb6\\x27\\xb5\\x9b\\x87\\xf1\\xe0\\x7b\\x9e\\xbb\\x1f\\x22\\x54\\x62\\x38\\xf7\\xe2\\x8f\\x64\\xc0\\xfb\\x2d\\x3c\\x9e\\x18\\x21\\x5b\\x38\\xa3\\x5d\\x7b\\xbe\\x5d\\x8b\\x82\\x57\\x82\\x1c\\x50\\xeb\\x25\\xbb\\x92\\x3c\\xf2\\xc3\\xdc\\xfa\\xe8\\xe6\\xe5\\x35\\xbb\\x79\\x29\\x15\\x06\\x7d\\xf2\\x62\\x9b\\x04\\x1f\\x5d\\xed\\x8f\\x2c\\xcf\\xcb\\xc7\\x88\\x1d\\xea\\x87\\x8a\\xd3\\x8f\\x3e\\xba\\x79\\x59\\x1e\\xa4\\x4e\\x5b\\x69\\x3c\\x31\\xed\\x5a\\x26\\xde\\xbc\\xbc\\x96\\xc9\\x37\\x16\\xb0\\xf3\\xd5\\xb3\\xfc\\x61\\x75\\x6f\\xe9\\x47\\x1f\\x05\\x1d\\xee\\xb2\\xed\\x7b\\x39\\xdd\\x96\\xff\\xfc\\xed\\xb3\\x80\\xf6\\x3a\\xc6\\x8f\\x9a\\xad\\xb5\\x45\\x85\\xd2\\x64\\xa5\\xba\\x27\\x7d\\x55\\x4d\\xa3\\xab\\xea\\xb5\\x99\\x9e\\x8b\\xd0\\xdd\\x48\\xa5\\xcd\\xa5\\xba\\xb2\\xf8\\xdf\\x54\\x0e\\x7f\\xaa\\xb6\\x7f\\xd3\\x0b\\xe5\\x5c\\xa5\\x07\\x9e\\x28\\xd3\\x7f\\x9a\\x2c\\xc9\\xfe\\x84\\xcd\\xcd\\x9f\\x4f\\x14\\x5d\\xfe\\x69\\x39\\xf7\\xe7\\xff\\x0e\\x90\\x9a\\x8c\\x56\\x57\\xe2\\x89\\x74\\xcc\\x59\\x4b\\x6e\\x8a\\x6c\\xc6\\xc2\\x91\\xd8\\x89\\x16\\x58\\x52\\xd9\\x8c\\x5d\\x19\\x9d\\x30\\x0f\\xb3\\x17\\x82\\x86\\x81\\xf5\\xe5\\xa5\\x69\\x12\\xdf\\x69\\x3c\\xb5\\x76\\x58\\x52\\xea\\xbb\\x3a\\x75\\xf1\\xa5\\x49\\xe3\\x05\\xaa\\xc0\\xa7\\x26\\x4d\\x7f\\x02\\xcb\\xd5\\x9a\\xf2\\x0b\\xb5\\x3c\\x07\\xf7\\xc9\\x22\\xa0\\x4b\\xc2\\xf2\\xb9\\x2b\\xe6\\x8b\\x88\\x3d\\xb3\\x17\\x02\\x05\\x3f\\xea\\xfc\\x7a\\xff\\x1c\\x69\\xa9\\x3f\\x35\\x4d\\xb9\\x7c\\xe4\\xe1\\x5d\\x56\\x7f\\x3f\\xcc\\x2b\\x3e\\xec\\xcb\\xdf\\x26\\x52\\xcb\\xa9\\x9c\\xc7\\x51\\xa2\\xd8\\x90\\xa3\\x15\\x8b\\x96\\x71\\x76\\x8c\\xca\\xa2\\x40\\x60\\xc5\\xfc\\xf4\\xa8\\xce\\xbf\\x40\\x8a\\x44\\xd0\\xbf\\xfb\\xc7\\x99\\xd8\\x1d\\x38\\xb6\\x4a\\x8d\\x6d\\x46\\x2d\\xf8\\x49\\xc0\\xc2\\x3d\\xbd\\xef\\x26\\xde\\x50\\xb5\\xdd\\x2b\\xf9\\xb4\\x11\\xdc\\x42\\x45\\xab\\xa9\\x3c\\x95\\x99\\x27\\xd4\\x33\\x52\\x2e\\xa3\\x72\\x2f\\xa8\\xa3\\x66\\xf3\\x7e\\x2a\\x8f\\x99\\xe8\\x38\\x81\\x9a\\x86\\x4d\\x63\\x64\\x2b\\x6a\\x96\\x15\\x47\\xe2\\x4d\\xe9\\x9f\\xfe\\x32\\x90\\x82\\x3c\\x36\\x66\\xf7\\x5c\\x21\\x2d\\x85\\x43\\x01\\x6e\\x63\\x1c\\xf8\\xc4\\x4d\\x33\\x73\\x66\\xb1\\x54\\x08\\xc5\\x86\\x41\\xca\\xcc\\x89\\xba\\xa6\\xbd\\xfe\\xd1\\x89\\x09\\x9a\\xa6\\x4c\\x76\\xdd\\xb6\\xd7\\x7f\\xb6\\x2f\\x7e\\x45\\xfb\\xa6\\x31\\x15\\xc9\\x12\\x27\\x54\\xf2\\x56\\x48\\x07\\x0a\\x00\\xf1\\x05\\x49\\x86\\x36\\x47\\xd9\\x74\\x32\\x2a\\x7c\\x4e\\x43\\xef\\xac\\x1e\\x66\\x1e\\x1a\\xe5\\x42\\x38\\x5e\\x6d\\xa4\\x2e\\x73\\x76\\xb1\\x4f\\x8b\\x59\\x78\\xe9\\x53\\x47\\x80\\xbc\\xd8\\x75\\x62\\x3a\\x25\\x03\\x50\\x4a\\xc7\\x7a\\xa9\\xa6\\x09\\x89\\x77\\x79\\x0a\\x42\\xe2\\xae\\x61\\x6d\\x8b\\x59\\x97\\x56\\x74\\x5f\\x72\\xc1\\x27\\xf3\\x58\\xac\\xd0\\xa5\\x42\\xd8\\x50\\xec\\x89\\xf1\\xa5\\x4d\\x33\\xea\\x07\\xa5\\xf4\\x9d\\x6d\\xd7\\xce\\x3b\\x60\\xc4\\x5b\\xac\\xdd\\x50\\xe6\\x0a\\x2f\\xe5\\x0a\\x89\\xb7\\x76\\xef\\xbc\\xbf\\x39\\x77\\xc0\\xc8\\x42\\xfc\\x84\\xc4\\x5d\\xb9\\x9f\\xd8\\xb1\\x28\\xbd\\x9e\\x5a\\xa0\\x4b\\x13\\x1b\\x75\\x26\\x04\\xfd\\xb2\\x21\\x1f\\x60\\xbc\\xee\\xa8\\xcf\\x02\\xc8\\xa8\\x1f\\x06\\x52\\xab\\xd8\\x34\\xb3\\x84\\x18\\x00\\x98\\x76\\x9d\\xf6\\xd6\\x2e\\x17\\x2f\\xc9\\x54\\x07\\x45\\x61\\xc1\\x27\\x75\\x65\\x95\\x5a\\x60\\x13\\x51\\xb6\\xe9\\xe5\\x75\\x03\\x7e\\x76\\xcb\\x87\\x42\\x2a\\x56\\x22\\x91\\x2b\\x9c\\xce\\x95\\x99\\xb9\\x64\\x8e\\x9d\\x1f\\x07\\x94\\xd2\\xcc\\x8f\\x03\\x12\\xcf\\xe7\\x3d\\x1c\\xe4\\x0c\\xbf\\x01\\x7e\\x71\\x55\\xb6\\x77\\xa2\\xcb\\x99\\x7e\\x5e\\xbb\\xab\\x16\\x52\\xe2\\x16\\x2d\\xa4\\x4c\\x63\\xbc\\xe9\\xe3\\x56\\xd4\\xff\\x16\\x0f\\x79\\x2e\\xff\\x84\\xc4\\x2c\\xd2\\xe1\\xcf\\xb3\\xc5\\x98\\x82\\x43\\xad\\x0b\\x66\\xa8\\x0b\\xee\\x18\\xd9\\xbf\\x83\\x45\\x3f\\x7a\\xb6\\x16\\x04\\x1f\\x66\\xce\\xec\\x0c\\x39\\x37\\xcd\\xec\\xd0\\x34\\x95\\x6d\\x57\\x12\\xd7\\x84\\xa4\\x69\\xee\\x05\\x5d\\x51\\x6f\\x04\\xb5\\x6d\\x72\\x0b\\x75\\x68\\x32\\x94\\x1a\\x93\\xa6\\x99\\x40\\xae\\x02\\x38\\xe3\\x4e\\x41\\x8b\\x7a\\xe3\\x3e\\xa1\\xc3\\x2d\\x9d\\xb2\\x45\\x69\\x9f\\x38\\x39\\xb5\\xfd\\x9c\\x84\\x50\\xc8\\x09\\xf1\\x59\\xa0\\xa9\\xd4\\xcd\\x0a\\xe7\\x46\\xe3\\xa0\\xc9\\xf9\\xfc\\x9d\\x79\\xd1\\xc6\\xdf\\x29\\x43\\xa1\\x73\\x54\\xc5\\x87\\x0b\\x23\\xb0\\x73\\x3a\\x50\\x53\\x8d\\x4c\\x0f\\x02\\x48\\x28\\xb7\\xed\\x2f\\xe5\\x2c\\x99\\x39\\x61\\x94\\x93\\x78\\x1c\\xf5\\xfe\\xb3\\x83\\xe6\\x3a\\x35\\x80\\x75\\x56\\x9a\\x89\\x97\\xb8\\xa6\\x6c\\x2c\\xd6\\xc9\\x1b\\xc9\\x3a\\x21\\x71\\x9d\\x84\\x4e\\x88\\x18\\xa1\\xa0\\x83\\xc9\\xf2\\x78\\xe0\\x51\\x96\\x64\\x3c\\xf6\\x12\\x29\\x63\\xb8\\xa8\\xa4\\x13\\xe3\\x47\\x1b\\x4d\\xfa\\x21\\x1b\\x4d\\xeb\\xf5\\xfb\\xa2\\x66\\x4f\\x57\\x98\\x13\\xae\\x1e\\x8a\\x8a\\x47\\x65\\x5a\\x64\\xbf\\xf1\\xf8\\x8a\\x3f\\x1d\\x2a\\x7e\\x3c\\x66\\x65\\xe1\\x5e\\x59\\x73\\x26\\xa7\\xf4\\xa1\\xc8\\xee\\x1f\\xf8\\xeb\\xb2\\x9a\\x52\\x6a\\x18\\x22\\x02\\x6e\\xe3\\x9c\\xce\\xa2\\x65\\xcc\\x6b\\x1e\\xd5\\x5f\\x3e\\x1c\\xf2\\x2c\\x62\\x35\\x3f\\xc2\\x1d\\x55\\x18\\xf1\\x75\\x2d\\x78\\x0f\\x21\\x3e\\xa1\\x01\\x81\\xb3\\x12\\x4c\\x88\\xf8\\xe0\\x7c\\x4e\\x20\\xd7\\x02\\x44\\x48\\x99\\x9f\\x08\\x01\\x02\\x69\\x84\\x9f\\x04\\xb6\\x8d\\xd6\\x31\\x48\\xb6\\x13\\x42\\x0c\\xf5\\x22\\x53\\x06\\xca\\xa8\\x4d\\x82\\x35\\xd1\\xc0\\x76\\x87\\x7a\\x4b\\x60\\x2d\\x70\\x9a\\xe2\\x4c\\xbe\\xe1\\x4f\\x93\\x36\\x19\\xd4\\xb2\\x10\\xd5\\x25\\x06\\xa9\\x15\\x23\\x49\\xe4\\xf9\\x88\\x40\\x4b\\x4d\\xf3\\x17\\xf9\\xb3\\xc6\\x57\\x29\\x4a\\x9f\\xd9\\x7a\\xa1\\xc9\\x21\\x1e\\x58\\x16\\x75\\x87\\x04\\xcd\\x44\\xb4\\xc7\\x64\\x94\\x2d\\xf1\\x70\\x12\\x59\\xc5\\x0d\\xdb\\x88\\x04\\x53\\x13\\x19\\xcd\\x29\\x5a\\xc0\\xea\\xb3\\x91\\x8f\\x65\\xd3\\x9f\\x98\\xf8\\x51\\xf6\\xf4\\x1f\\x62\\xe9\\x65\\xbe\\x7e\\xde\\xf0\\x5c\\x0a\\xeb\\x08\\x7b\\x61\\xb4\\x85\\x58\\xea\\xa7\\x24\\x6e\\x38\\xd2\\x93\\xa1\\xad\\x76\\x3f\\x5d\\x81\\x64\\x7b\\x7f\\x3a\\xf2\\x87\\xb8\\x74\\x33\\x06\\x88\\x4c\\xdc\\x5f\\xa1\\x07\\x75\\xf7\\xd4\\x82\\x10\\xd0\\xc4\\x6f\\xc5\\x73\\x3c\\xd8\\x74\\x4f\\xd6\\x8d\\xe5\\x9e\\xe2\\xac\\x72\\xad\\x1e\\xed\\x5a\\xca\\x6a\\x7e\\xb6\\x6a\\xc1\\xba\\x9a\\xf8\\xde\\x82\\x35\\xef\\x92\\x2b\\xfe\\x2e\\x2b\\x1f\\x8e\\x6a\\xf4\\x83\\xb2\\xff\\xbe\\x94\\xa9\\x6d\\xe1\\x50\\xf1\\xaf\\x51\\xe0\\x77\\x4f\\x78\\x2a\\x3e\\xa5\\x40\\xf0\\xd7\\x01\\x15\\x7f\\x46\\xc2\\x3f\\x30\\xff\\xe3\\x80\\x3a\\xe2\\x6f\\xd3\\x30\\xff\\x13\\xfc\\xfb\\x69\\xd0\\x34\\xa6\\x75\\xa0\\xca\\x2a\\x44\\x14\\x84\\xc1\\x17\\x02\\x06\\xb1\\xa0\\x25\\x76\\x86\\xff\\x71\\x80\\x7a\\x7f\\xe8\\x00\\x19\\x3e\\x21\\xad\\x3a\\x70\\xff\\x60\\x5f\\x06\\xf8\\x02\\xac\\xa2\\xde\\xc9\\x06\\xd6\\x41\\x57\\xd3\\xc7\\xc4\\x53\\xbd\\xd3\\x1b\\xda\\x61\\xfe\\x2a\\x10\\x1d\\xff\\x24\\xa0\\x73\\x47\\xfc\\x78\\xa2\\xcb\\xe2\\xf1\\xcf\\x41\\xd3\\xac\\x89\\xfb\\xe2\\xb9\\x63\\xf1\\x77\\xbc\\x90\\x95\\x7d\\x8c\\x26\\xb8\\x71\\xac\\xdf\\x88\\x28\\xfb\\xa9\\x2c\\xfb\\xff\\x0b\\xe6\\xcc\\xff\\x3f\\x67\\x19\\x5c\\xf1\\x63\\xdb\\xe3\\x16\\x5b\\x6d\\x5d\\x30\\xb5\\x73\\x66\\xa2\\x79\\xdb\\x16\\xb3\\xa3\\x41\\xed\\xd7\\x25\\xce\\x81\\x3a\\xfa\\x11\\x75\\x78\\x62\\x23\\xba\\x38\\x20\\x4f\\xe4\\xa4\\xc3\\x29\\x77\\x23\\xdb\\xfe\\x87\\xcc\\x1e\\x09\\xa9\\x3b\\xa4\\xa9\\x13\\xc1\\x6c\\x45\\xe4\\x4b\\xd4\\x5b\\xff\\x12\\xab\\x53\\x33\\x2f\\x42\\xb2\\xd0\\xcf\\x04\\x17\\x66\\x25\\xea\\x5d\\xf5\\x73\\x18\\x8a\\x11\\xbf\\x08\\xb4\\x8f\\x12\\xa6\\x98\\xab\\xf5\\x31\\x21\\xad\\x00\\x68\\x09\\x42\\x6f\\x3e\\xfb\\xeb\\x84\\x7f\\xc6\\x58\\x6b\\x34\\xad\\xd1\\x97\\xba\\x0f\\xef\\xcc\\x4a\\x6f\\x36\\x50\\xaa\\xfc\\xc7\\xc6\\xbf\\x6d\\xab\\x6c\\x47\\xce\\xfb\\xf5\\xde\\x67\\x78\\x90\\xd4\\x69\\xa5\\x9b\\xc6\\x09\\x07\\x36\\x02\\xce\\xdb\\xce\\xfe\\x85\\xcd\\x2d\\x69\\x18\\xd0\\x3c\\x23\\x96\\x98\\xd4\\xf7\\x0e\\x83\\x89\\x7e\\x85\\x72\\x0d\\x26\\xd0\\x5a\\xd4\\x2b\\x5f\\x8c\\x97\\xa6\\xf9\\x7d\\x55\\xd9\\x58\\x4d\\xa6\\x34\\xba\\x16\\xc1\\xbd\\xd6\\x92\\x16\\x46\\x7b\\x77\\x60\\x04\\xdb\\x25\\xeb\\xc3\\x06\\xaa\\xe8\\xbb\\x13\\x1b\\x2e\\x49\\xd2\\x54\\x96\\x7b\\x42\\x9a\\x13\\xf3\\xe6\\x86\\x9e\\xc3\\xe7\\x02\\xa9\\x5b\\x32\\xc1\\x13\\x9c\\x65\\xe4\\xea\\xef\\x1e\\x9f\\xe1\\xeb\\x5b\\xf5\\x1a\\xd9\\xf6\\x8a\\x52\\xca\\x3b\\x38\\x8b\\x88\\x6b\\x3d\\xef\\x3f\\x9a\\x1f\\x6e\\x16\\x6b\\xd7\\x7a\\x66\\x7e\\x93\\xe0\\xd4\\xc3\\xa2\\x6c\\xea\\xdf\\x2a\\x8b\\x23\\x70\\x05\\xef\\xa0\\xe8\\xbf\\x05\\x3a\\x24\\x88\\x37\\xc6\\x95\\x36\\x66\\x5f\\x9b\\x86\\x77\\x70\\xaa\\x6b\\x9e\\xaf\\xb1\\xee\\xb9\\xb5\\xb0\\xdc\\xd9\\x9a\\x08\\x04\\x79\\x8e\\x6e\\xb4\\xfb\\x8d\\xb2\\x39\\xa0\\x88\\x5d\\x90\\x4f\\xeb\\xc1\\x1e\\x52\\x6a\\xe5\\xec\\x58\\x9b\\xe9\\x8b\\x4f\\x08\\xec\\xa8\\xa5\\x8c\\x7e\\xb0\\x27\\x7a\\x7a\\x05\\xc1\\x8b\\xd5\\x14\\x79\\x13\\x0e\\x14\\x33\\x53\\x3e\\x30\\x00\\x5e\\xf4\\x24\\x93\\xfd\\x18\\xd8\\x39\\xd2\\x64\\x26\\xa4\\x01\\xcb\\xa0\\x78\\xd6\\x04\\x15\\xb8\\x1f\\x0a\\x1a\\x15\\xdd\\x09\\x19\\x6a\\x7a\\xb7\\xc0\\x91\\xce\\x32\\xdb\\x9e\\xed\\x04\\xd5\\xbe\\x47\\xe2\\x9c\\x68\\x4e\\xe2\\x40\\x4e\\x79\\x27\\x1d\\xe4\\x34\\xf7\\x0f\\x81\\x90\\x3d\\x77\\x5e\\x7e\\x79\\xeb\\x55\\x68\\x0a\\x9a\\x8f\\x59\\xda\\xd9\\x7a\\x53\\xd2\\x03\\xb5\\xca\\x22\\x47\\x83\\x50\\x66\\xdb\\xb3\\xd2\\xb6\\x07\\x23\\x69\\xbb\\xad\\x9f\\x25\\x4e\\x49\\xfd\\xd4\\xbb\\x37\\x88\\xbd\\x7b\\xbf\\x14\\x33\\x8f\\xcf\\x01\\xa4\\xb6\\x7d\\x24\\xa7\\x3b\\x7a\\xef\\x3f\\x04\\x4d\\xe3\\x88\\x1f\\xf4\\x53\\xba\\xa5\\x77\\x3e\\x0b\\xd0\\xd8\\xa3\\xa0\\xb7\\x02\\xb1\\x51\\xfa\\x68\\xdb\\xb7\\xfe\\x3a\\x80\\xfd\\x20\\xe1\\x45\\x00\\xb9\\x60\\x63\\xef\\x0d\\xc3\\x18\\xbf\\x08\\xba\\xd1\\xce\\xe7\\x85\\x6d\\xe7\\xb6\\x2d\\x46\\xdd\\x34\\xce\\x9e\\x16\\x74\\x45\\x9a\\xa6\\x5c\\x1e\\xca\\x83\\x83\\x46\\x1e\\xc3\\x81\\xda\\xf6\\x7c\\xbe\\xb7\\xed\\x1c\\x25\\xc2\\x93\\xe8\\x05\\xf5\\x1f\\xa1\\x80\\x7d\\xb0\\x91\\x46\\xfa\\x1d\\x4f\\x72\\x44\\xbf\\x2c\\x27\\x94\\x5d\\x0f\\x55\\xd7\\x89\\xe0\\xea\\x45\\xc7\\x64\\x17\\x89\\xe8\\xed\\x3a\\xd8\\x18\\x0c\\xca\\x1f\\xe9\\xd3\\x7f\\xb8\\x38\\xaa\\xd3\\xd8\\x25\\x27\\x97\\x1d\\xca\\x8d\\x0e\\x89\\x21\\xec\\x03\\x02\\x72\\x54\\x43\\xbf\\x81\\xfd\\x82\\x72\\xd8\\x4b\\x45\\xc9\\xfe\\xbf\\x62\\x4a\\xe9\\xca\\xb6\\xf7\\xd7\\xf1\\x0d\\x5d\\xb5\\xed\\x04\\xe5\\x33\\x6c\\xbd\\x05\\x37\\x8a\\xdc\\xd2\\x11\\x17\\x2b\\x5e\\x1e\\x79\\x2d\\x19\\x92\\xa3\\xcf\\x46\\xe2\\x83\\x41\\xc7\\xad\\x87\\x42\\x1d\\x4d\\xf2\\xf8\\x4a\\x56\\x20\\x39\\xed\\xce\\xe8\\xdc\\x7f\\x08\\x3c\\x94\\x00\\xb8\\x96\\x8f\\xd6\\x9e\\x13\\x51\\x9f\\x01\\x03\\xcb\\x82\\x30\\x00\\xb3\\xad\\x91\\xe5\\xae\\xc3\\xc6\\xf2\\x88\\x79\\x6c\\xcb\\x4c\\x0b\\x7b\\x14\\x54\\x2e\\x1c\\xd6\\xc6\\xf4\\x6f\\x82\\x48\\xf8\\x29\\xf2\\x1c\\x71\\x40\\x67\\x4e\\x24\\x7e\\x30\\xa5\\x25\\x53\\x64\\x4d\\x54\\xb7\\x82\\x48\\x7c\\xe5\\x82\\x3d\\x93\\x73\\xe3\\x9e\\x8a\\xb2\\x76\\xb3\\x29\\x55\\xab\\x1f\\x80\\x72\\x23\\xde\\x9d\\x5b\\x64\\xf4\\x07\\x04\\x62\\x3a\\x86\\x63\\x10\\x98\\xa5\\xb3\\xaa\\x4a\\x69\\xac\\x05\\x6d\\x0e\\x7e\\x20\\xd0\\xd8\\xc8\\x06\\x61\\xb7\\x58\\x10\\x27\\xa1\\xa9\\xbf\\x0b\\x24\\xa7\\xb0\\x13\\xc3\\x09\\xc5\\x4f\\x42\\x86\\x83\\x01\\x0e\\x49\\x4f\\x0f\\x91\\xa5\\x80\\x58\\xc8\\xac\\xa2\\x7a\\x74\\x16\\xc0\\x44\\x7c\\x9d\\x45\\x12\\x62\\xdb\\x96\\xc0\\x8e\\x1d\\xc7\\x63\\x9c\\x38\\xbf\\x37\\x35\\x03\\xa1\\x21\\xfc\\xb6\\x04\\xb4\\xec\\x7b\\xa1\\x16\\x76\\xc6\\x89\\xc0\\x79\\xc5\\x4e\\x68\\x8a\\x1a\\x4d\\x13\\xca\\xf3\\x09\\x21\\xf5\\x34\\x0d\\x4a\\x8e\\x1d\\xcd\\x61\\x82\\xe6\\x88\\x76\\x73\\x56\\xa4\\x17\\xda\\xfc\\x45\\x71\\x70\\x48\\xa9\\x2f\\x01\\x30\\x96\\x47\\xf0\\x85\\xf3\\x3e\\x8e\\x90\\xf4\\x99\\x29\\xc3\\x26\\x2e\\xaf\\xd0\\xea\\xe2\\xe0\\x85\\x4b\\xac\\x69\\x6c\\xae\\xf4\\xb4\\xcf\\x5d\\xf1\\x41\\x74\\x60\\xfc\\x4d\\xa6\\x77\\x56\\xe4\\x34\\x1a\\x35\\x17\\x09\\x0c\\x2d\\x4d\\xf6\\x7b\\x16\\x92\\x09\\xf2\\xa9\\xa5\\xc7\\xb1\\x4a\\x72\\x6c\\x64\\x42\\x7a\\x95\\x64\\x4b\\xa0\\x66\\xd5\\xc0\\x15\\xdb\\xb4\\x11\\x2c\\x23\\x26\\x15\\xa4\\xfd\\xb3\\xd8\\x97\\xbb\\xc1\\x59\\xa0\\xa4\\xb4\\x6b\\xe9\\xd8\\x95\\xc5\\x2d\\x54\\x65\\x39\\xe9\\xda\\xcd\\x28\\xa5\\x65\\x0b\\x68\\xee\\x7e\\xe9\\x7b\\xb1\\x64\\x91\\x10\\xc0\\x94\\x1e\\xd8\\xb6\\x9d\\x19\\x36\\xf9\\x35\\xda\\xc8\\x37\\xfd\\xb3\\x23\\x38\\xbe\\xd9\\x4c\\xe0\\x05\\x54\\xfc\\xb2\\xe5\\xae\\xe2\\x49\\xd3\\xfc\\x9b\\x2d\\x6b\\x16\\xa2\\x9d\\x0c\\xba\\x0f\\xe3\\x89\\xc0\\x34\\xbb\\xaa\\xcf\\x0b\\xd0\\xef\\xaa\\x05\\xfd\\xfa\\xfb\\x99\\x57\\x2d\\xa8\\xb3\\x9a\\x49\\xde\\xfa\\x0f\\xda\\xc9\\x84\\xa2\\xff\\x6c\\xa9\\x1d\\x03\\x1a\\x4b\\x1e\\x8d\\x19\\x9f\\xf4\\x79\\x55\\x0b\\xfa\\x69\\xba\\x6f\\xa6\\xc9\\x93\\xf9\\xd6\\x55\\x80\\xd3\\x01\\x7d\\x85\\x6a\\x10\\x7c\\x7f\\xa8\\xdf\\x0f\\xaa\\xfc\\x43\\x72\\x7c\\x96\\x38\\xbd\\x42\\xe1\\xe5\\x9f\\xa7\\x3c\\x30\\x65\\x1f\\xa6\\xfc\\x52\\x3b\\xea\\xb2\\xc4\\xd6\\xd1\\x23\\x76\\xc7\\x59\\xcc\\xab\\xa9\\xb1\\xfd\\x8f\\xda\\xac\\xdd\\x9c\\x92\\x16\\x70\\x02\\xa7\\x32\\xff\\x73\\x22\\xb3\\xb4\\x13\\xfa\\xbf\\x5c\\x26\\xc3\\xda\\x48\\x83\\x9b\\x91\\x14\\xb6\\x80\\x96\\xdc\\xe7\\x5e\\xaa\\xe3\\xaa\\x2e\\xb5\\x69\\xdb\\x96\\xa8\\xa1\\xaf\\xdf\\xb6\\x1d\\xc9\\xfd\\x3b\\x21\\x1d\\x0b\\x1a\\xc8\\xc8\\x12\\x21\\x68\\xe8\\x32\\x63\\x55\\x9d\\x76\\xee\\x2f\\x0d\\xfc\\xa7\\x27\\xc9\\x5f\\x05\\x88\\x1e\\x47\\x9f\\x0d\\x8d\\xa4\\x1f\\x2e\\xd6\\x22\\x0f\\xbf\\x1f\\xe7\\xe8\\x25\\x18\\x7f\\x75\\x13\\x79\\xd1\\x3c\\x74\\x23\\xcc\\xf9\\x8e\\x17\\xe7\\xb5\\x19\\x1e\\x33\\x9b\\x10\\xdd\\x64\\xe8\\x0b\\xc2\\xc6\\xe7\\xe4\\xac\\x25\\x50\\xc6\\xf1\\x87\\x8a\\xaf\\x7f\\xa7\\x78\\x7e\\x36\\x94\\x81\\x67\\x1f\\xed\\xfa\\xba\\x59\\x2c\\x04\\x03\\xb4\\xd1\\xd5\\xc4\\x83\\x6a\\xd2\\x3f\\x5c\\xcd\\x7c\\x1e\\xbf\\x0c\\xa7\\x6b\\x41\\x33\\x11\\x0d\\xe0\\x45\\xbd\\xa3\\x06\\xb8\\xdf\\x77\\x5e\\xcb\\xa7\\x8a\\xc5\\x59\\xe9\\xce\\x56\\x12\\x8d\\x84\\xe5\\x93\\x78\\x4e\\xb2\\x9c\\x8b\\xdf\\x03\\x3b\\x1e\\x1f\\xcb\\x2a\\x16\\xcf\\xd9\\x9e\\xa5\\x22\\xb1\\x25\\x3d\\x57\\x16\\x06\\x74\\xcf\\x9c\\x90\\xf4\\xd5\\x1d\\x1f\\xc2\\x7d\\x56\\x8b\\xfc\\x15\\x3f\\xf2\\xfa\\x3c\\x7f\\x21\\xf3\\x6b\\x33\\xb4\\x7b\\xe6\\x90\\x53\\x7b\\xcf\\x8c\\x10\\x1f\\xda\\xca\\xe4\\xd8\\xf7\\x78\\xc0\\x8e\\xa1\\x10\\x7e\\xcf\\x20\\x15\\xa2\\x6a\\x5d\\xde\\xf1\\x22\\xfb\\x8d\\xd3\\x0b\\xce\\x82\\xbd\\x1b\\x18\\xfd\\x4d\\x4b\\xf4\\x59\\xe2\\x74\\x96\\xda\\xa1\\xb7\\x72\\xef\\x3a\\x3d\\xe9\\x66\\x47\\x19\\xba\\x40\\xc2\\xad\\x68\\x5c\\xab\\xbf\\x34\\x97\\x43\\x4e\\xce\\x2c\\xc2\\x90\\x03\\xaf\\xa5\\x19\\xf7\\x8e\\xa0\\x06\\x85\\xa3\\x2d\\xf5\\x4e\\x55\\xc3\\xfd\\x55\\xa0\\x45\\xd5\\xa6\\xd9\\x11\\x50\\x4e\\x8f\\x09\\xf5\\x03\\x22\\x88\\xe6\\x6c\\x0d\\x0e\\xa7\\x6f\\xba\\x2a\\xd0\\x6f\\x91\\x6b\\x1b\\x56\\x48\\x64\\xf6\\x93\\x54\\x3a\\x47\\xd2\\x85\\x1c\\x2b\\x35\\x18\\xb8\\x2b\\x3c\\x5f\\xef\\x1b\\xed\\x84\\x63\\xb9\\x16\\xe9\\x55\\x56\\x5c\\xe9\\x89\\x24\\x33\\x87\\xd3\\x5f\\xfd\\x34\\xe8\\x5a\\x6c\\x9a\\x5b\\x3f\\x0d\\x6c\\x5b\\x7c\\x10\\x4f\\x0e\\x17\\x69\\xbf\\xdf\\x8b\\x14\\xd4\\x01\\x88\\xcb\\x2f\\xb5\\x9e\\x25\\xce\\x2c\\x52\\xfe\\xc6\\xdd\\x1c\\xef\\xd4\\x77\\x77\\xe7\\xf5\\xba\\x2f\\xe2\\xfe\\xe6\\x30\\xc8\\x48\\x37\\xfb\\x6d\\x0f\\x16\\x15\\xd3\\x24\\x40\\xa2\\xc8\\x15\\x0c\\x1c\\x05\\x2c\\x6b\\x13\\xdd\\x84\\x9b\\x70\\x3e\\x27\\xf1\\x1c\\x5d\\x3e\\xa5\\x8a\\xbe\\x37\\x79\\xe9\\xdd\\x18\\xd9\\xd0\\x2b\\x23\\x5c\\xc6\\x59\\x05\\x9c\\x46\\xb6\\x6d\\xaa\\x4b\\x85\\x7c\\x02\\x09\\x7d\\xea\\x4f\\xab\\x42\\x49\\x79\\xbc\\x81\\xb4\\x9d\\xf4\\xda\\xf3\\xd0\\x8f\\x03\\x2d\\xde\\x85\\xc6\\xb1\\x6f\\x77\\x3a\\xc3\\x54\\x89\\x91\\xc0\\x9e\\xca\\x9e\\x20\\x54\\x0a\\xb9\\x29\\x41\\x80\\x4c\\xcf\\x2b\\x9e\\xa8\\xd9\\xb6\\x99\\xaa\\xa3\\x3b\\xd3\\x1d\\xaa\\xa6\\x2f\\x77\\x4a\\x48\\xec\\x19\\x1d\\x09\\x93\\xe0\\xec\\xe4\\x29\\x9d\\x6d\\xef\\x3a\\x99\\x77\\xe7\\xaf\\x03\\x53\\x0f\\x2e\\x64\\x60\\xba\\xf3\\x5f\\x60\\x3f\\xf1\\x9c\\xee\\x16\\x30\\xed\\xbc\\x2f\\x86\\xc9\\x6b\\x3d\\xb0\\x2f\\xed\\xc5\\xac\\xc1\\x5c\\x74\\x4a\\xa7\\x09\\x9b\\x66\\x0c\\xcb\\xe4\\xf3\\x40\\x65\\x9c\\x20\\xed\\x2e\\x13\\x24\\xa4\\x6b\\xf1\\x81\\x4d\\x60\\x4a\\xe0\\x54\\xbb\\x6b\\x6f\\xb8\\xf2\\xcf\\x96\\xd2\\x81\\x1f\\x07\\x10\\x19\\xda\\xfb\\xae\\x9e\\x77\\xcc\\x54\\xf2\\xe8\\xba\\x84\\x18\\xe4\\x07\\xb0\\xa3\\x2b\\xc8\\x7a\\x50\\xbc\\xa5\\xd2\\xb5\\x39\\xec\\xa2\\x9c\\x38\\x09\\x65\\x4a\\x0c\\x12\\xb8\\x22\\x72\\x12\\xac\\x47\\xbc\\xa7\\xfa\\x6c\\x05\\x6e\\xd1\\x9c\\x40\\x7a\\x4f\\x18\\x61\\x44\\xba\\x2e\\x3c\\x1a\\x5d\\x30\\xc4\\xa5\\xd8\\xb6\\x67\\x42\\x58\\xb3\\x6d\\x27\\xa6\\x8f\\xcc\\x89\\x09\\x01\\x6e\\xdb\\x33\\x2e\\xd3\\xb8\\x48\\x13\\xf9\\xc9\\xc0\\x90\\x58\\xe1\\xc0\\x81\\x9e\\x88\\xa2\\xe2\\xc3\\x0f\\xd0\\xbe\\x55\\x8d\\xe5\\x40\\x93\\xa6\\x79\\x60\\x4e\\xd8\\x34\\xd6\\x73\\x0b\\x76\\xbd\\x4d\\x84\\xbf\\x0b\\xdc\\x1d\\x4a\\x7e\\xf7\\x74\\xc6\\x9a\\x66\\x96\\xd8\\x76\\xe8\\x1d\\xdc\\x77\\xcc\\x39\\xc0\\x1e\\x18\\x56\\x0f\\x15\\x8d\\x3c\\xde\\x34\\x4e\\xe2\\x31\\xb7\\x6c\\x9a\\x98\\x78\\x7e\\xe0\\xa6\\xee\\x3d\\x5a\\x84\\xdb\\x76\\xe4\\xdc\\x43\\x25\\x73\\xc6\\xe4\\x74\\x4b\\xdf\\x31\\xa7\\x82\\x82\\x40\\xec\\xdc\\x82\\x98\\x58\\xf1\\xe1\\x8e\\xde\\x0e\\x01\\xe1\\x4e\\x08\\x96\\x39\\xbd\\xf5\\xef\\x70\\x46\\x2b\\xbf\\xf0\\xef\\x02\\x21\\x5b\\xde\\xab\\xa7\\x9c\\xa0\\x5b\\x83\\x3c\\x2e\\x12\\xbc\\xb7\\x7c\\x10\\x0d\\xa0\\x23\\x4f\\x35\\x59\\x5f\\x25\\xeb\\xbb\\x95\\x6b\\x70\\xef\\xdf\\x89\\x8a\\x36\\x1c\\x39\\x1d\\x69\\xc1\\x76\\x0b\\x19\\x69\\x7f\\xa7\\xb8\\x73\\x4b\\xb9\\xf7\\x37\\x27\\x81\\x9c\\xb8\\x7b\\x91\\x74\\xb3\\x58\\xdb\\xb6\\x93\\xf8\\xb7\\xa2\\x87\\xa9\\xf8\\x11\\xdd\\x93\\x3b\\xb4\\xc2\\x01\\xe3\\x29\\x7d\\xa5\\x8f\\xd3\\x4a\\xd0\\xf5\\x13\\xb7\\x22\\xc0\\x3d\\xd5\\x83\\x14\\x2a\\xc8\\x88\\xab\\xdd\\x33\\x52\\xa8\\x06\\xa6\\xdb\\x4f\\x43\\xe4\\x08\\x48\\xe8\\xcc\\xb8\\x14\\xf1\\x52\\x1f\\x1e\\xf9\\xa8\\xaf\\x17\\xb8\\x5b\\x80\\x6e\\xda\\x34\\xc6\\x27\\x41\\x0b\\x21\\x43\\xab\\x81\\x15\\xdc\\xd1\\xe3\\x05\\xb1\\x18\\xb9\\xca\\x1d\\xcc\\x56\\x04\\xf2\\x0b\\x99\\xfe\\xe6\\x84\\x20\\xe5\\x5d\\x95\\x71\\x4f\\x7d\\x53\\x21\\xd2\\xef\\xf3\\x59\\x2a\\x60\\xb7\\x69\\xa2\\x19\\xa5\\xb7\\x82\\xe4\\x38\\x21\\x8d\\x48\\x0f\\x69\\x77\\x2a\\xbb\\x9b\\xab\\x87\\x3e\\x2a\\x96\\x54\\x09\\xf0\\x36\\xd8\\x24\\x37\\xd9\\x26\\x93\\x9e\\xce\\xd1\\x70\\xac\\x99\\x1a\\x2b\\xd9\\x53\\xff\\xc8\\x9c\\x9a\\x39\\x7b\\x02\\x11\\x91\\xea\\xb1\\x93\\xca\\x2f\\x89\\xa2\\x91\\x5b\\x4d\\xb3\\x3c\\xcb\\x14\\xa9\\x8a\\xc8\\x11\\x88\\xfc\\x87\\x40\\xce\\x34\\xa7\\xf3\\x79\\x36\\x08\\xb7\\x61\\xb6\\xcb\\x75\\xbb\\x03\\xcd\\xd7\\x23\\x73\\xb2\\x9b\\xb5\\x6d\\xcb\\x6e\\xe0\\xa3\\xa0\\x6b\\x9d\\x9e\\x38\\x5b\\xac\\x89\\x0e\\x2a\\xa0\\xe8\\xac\\x75\\x25\\x0f\\x8b\\xb2\\xc5\\x0b\\x59\\xa5\\x67\\x3d\\xb7\\x5c\\xcb\\x6a\\x8d\\xb0\\x41\\xda\\xa1\\x26\\x02\\x7e\\x93\\xd9\\xf6\\x53\\x5f\\x65\\x26\\x10\\x0d\\x24\\x37\\x5c\\xa6\\x76\\xaa\\xe7\\x2e\\x15\\xc9\\x2a\\x69\\xf7\\x9a\\x77\\xd5\\x14\\x1a\\x7b\\xd8\\x03\\xd8\\xfb\\xa1\\xc3\\x48\\xa7\\x46\\x31\\x9c\\x4f\\x6e\\x56\\x66\\xd0\\x04\\xcd\\x66\\xdd\\xc9\\x32\\x39\\xec\\x51\\x0d\\xbd\\x82\\x7b\\x6a\\xad\\x2c\\xa8\\x68\\x62\\xdb\\x7e\\x00\\x47\\xb1\\xb3\\x6a\\x7a\\x0b\\x0f\\x02\\xd5\\xa0\\xad\\xaa\\x36\\xd7\\x75\\x04\\xca\\xb9\\x23\\xf0\\x8e\\x3e\\xce\\xa9\\x14\\x38\\x6a\\x6f\\xed\\x0e\\x22\\x27\\x35\\xcd\\x72\\x0d\\x4f\\xf4\\x41\\xef\\x49\\xb1\\x2e\\x77\\x32\\x78\\x95\\x34\\x35\\x48\\xc9\\xe6\\x7e\\x46\\xe9\\x93\\x6d\\xab\\x40\\x53\\x39\\x7d\\xf0\\xef\\x03\\xb2\\xb9\\x9f\\xcf\\x25\\x5e\\xb0\\xed\\x9c\\x9c\\xf6\\x9d\\xa3\\x61\\x49\\x99\\xbf\\x9f\\xcf\\x91\\x64\\x96\\x8e\\xd8\\x78\\x3b\\x42\\x4e\\x8a\\x5f\\xcb\\x89\\xd2\\xc8\\x8a\\x36\\x1e\\xe9\\x3b\\xd2\\x46\\xa8\\xfe\\xa4\\xb3\\x52\\x54\\x63\\xdb\\x87\\xc5\\x02\\x12\\xdb\\xae\\x74\\x76\\xc4\\x44\\x87\\x39\\xbd\\x87\\xc8\\xb6\\x45\\x47\\x0e\\xc3\\xb6\\x42\\xd9\\x56\\xe9\\x54\\x70\\xc4\\xa6\\xfa\\x13\\xf0\\xc3\\xcd\\x4a\\xd9\\x70\\xdd\\x2f\\x16\\xa4\\xf2\\xef\\x83\\xa6\\x39\\xe2\\x5f\\x47\\xfc\\xd0\\xaf\\xa5\\x59\\x44\\x46\\xc8\\xe6\\x28\\x10\\xc9\\x91\\xb4\\x1a\\x3b\\x64\\x70\\x24\\x70\\x67\\xdb\\x02\\x29\\x1f\\xbb\\xd5\\xb1\\xed\\x43\\x17\\xa7\\x44\\x00\\xde\\xc0\\xc4\\xc0\\xc9\\xfa\\x23\\x7c\\x39\\x36\\xb8\\xa5\\x35\\x81\\xaa\\xed\\xc8\\x21\\xea\\x03\\x89\\x9b\\xe8\\x7c\\x3b\\x9a\\x4a\\x9b\\xac\\x2c\\x9f\\xe6\\xb5\\x95\\x8d\\x02\\x46\\x2e\\xf9\\xcc\\xe0\\xb4\\x67\\x09\\x39\\xc9\\xb3\\xb3\\x14\\x1d\\xfe\\x7a\\x78\\xd2\\xe6\\x44\\x8b\\x05\\x49\\xe8\\x13\\x73\\x42\\x3f\\x0a\\x08\\x24\\xfe\\x43\\xe0\\x75\\x56\\x08\\x2e\\xd7\\x4f\\x9b\\x84\\x7e\\xe6\\x30\\x78\\x2f\\x28\\x9c\\xa0\\x7b\\x49\\x77\\xd0\\x4e\\x99\\x61\\xe0\\x9c\\xf5\\x47\\xf0\\x43\\xb7\\x5c\\xa4\\xa3\\xa2\\xab\\x46\\x4c\\x08\\x3a\\x15\\x64\\xc9\\xb6\\x19\\x94\\x54\\xcc\\x66\\xea\\x30\\x5a\\x74\\xcd\\x08\\xda\\x22\\x6d\\xa8\\x38\\x9e\\x1b\\x08\\x16\\x4b\\xfb\\xe8\\xe1\\x1a\\xde\\xd2\\x52\\xf0\\x50\\xa5\\x71\\x42\\x4a\\x40\\xd3\\xb3\\x9b\\x17\\xb6\\x6d\\x7d\\xfb\\xa5\\xd8\\xdd\\xce\\x1d\\x1e\\x30\\x10\\x25\\x5e\\x77\\x4e\\x05\\xd2\\x27\\xc5\\x74\\xc0\\x3a\\x88\\x1d\\xd2\\xa1\\x99\\x5b\\x3c\\xd9\\x46\\x34\\x83\\x46\\x7f\\xb4\\x77\\x42\\x70\\xee\\x34\\xce\\x32\\xc5\\x04\\xa5\\xc6\\x0c\\x89\\xe8\\x2f\\xf1\\x57\\x01\\xcc\\x3a\\x23\\x34\\xbe\\x29\\xf0\\xe8\\x77\\xa0\\x9d\\x83\\x1e\\x65\\xdc\\x6a\\x41\\x40\\x32\\xd6\\x7a\\x9c\\x6d\\x46\\x7f\\x5d\\x9a\\x4e\\xe3\\xda\\xfd\\xd0\\x5b\\xb9\\x23\\xd2\\x9d\\x2d\\x16\\xd8\\x4f\\x31\\xda\\x2c\\x00\\x63\\x20\\x39\\xbd\\x1b\\xa0\\x4b\\xc1\\xeb\\xee\\xa9\\x1c\\x8c\\x9f\\x23\\x65\\x4d\\xe8\\xfe\\x83\\x63\\xd2\\x7e\\x8f\\xb7\\x9a\\xbc\\x4d\\xfb\\x3f\\x2a\\x6f\\xcf\\x5b\\x4d\\x70\\x33\\x58\\x8b\\x41\\x26\\x9d\\x91\\x69\\xc5\\xd0\\xb7\\x96\\x8d\\xfd\\x4b\\x05\\xb4\\x00\\xd7\\x27\\x32\\x0a\\xbe\\x9c\\xa2\\x69\\x76\\x0e\\x83\\x92\\x10\\x27\\x41\\x03\\x24\\xe0\\xf0\\x3b\\x1e\\x98\\x04\\x78\\x0b\\xa6\\x59\\x0e\\x7d\\xd0\\xde\\x7c\\x16\\xd1\\x46\\x39\\xca\\xbc\\x15\\x5d\\x2f\\x1e\\xe0\\xdc\\xb4\\x87\\xce\\x66\\x39\\xec\\x1d\\x02\\x43\\x8b\\xc7\\x0b\\x2e\\x2f\\xeb\\x0f\\x18\\x90\\x4e\\x7b\\x35\\x4e\\x98\\x6a\\x77\\x8c\\xfb\\xd0\\x00\\x7f\\x57\\xf1\\x84\\x7e\\xf4\\x27\\x69\\x7e\\x6f\\x81\\xf5\\x27\\xa9\\x28\\xea\\x75\\x74\\x23\\x0d\\x91\\xc8\\x2f\\x24\\xd5\\xa6\\xb9\\x63\\x52\\x5f\\xd4\\xa0\\x6e\\x74\\xc7\\xb3\\x74\\x57\\x37\\x8f\\x59\\x5c\\xef\\x2c\\xb8\\x70\\x36\\x1d\\x79\\xd2\\xa0\\xcb\\x1d\\x5b\\x6e\\x81\\xd5\\x1d\\xa1\\x0e\\xf5\\x4d\\xde\\xda\\x7d\\x21\\xbd\\x98\\x7a\\xdb\\xaf\\x33\\x9b\\xe6\\xc9\\xa1\\xa1\\x62\\xec\\x1a\\x5d\\x00\\x8c\\xc1\\x0c\\x0d\\xcc\\x71\\x27\\x58\\x18\\xb0\\xcf\\xfa\\x9d\\x71\\xcb\\xac\\xdd\\xc0\\x55\\xc9\\x4b\\xe3\\x6c\\x1a\\xa5\\x98\\x9b\\x5d\\x56\\xcc\\xf5\\x73\\xa1\\x5d\\xcf\\xd0\\x30\\xe9\\xd2\\xc2\\xa9\\x90\\x5c\\xa3\\x6e\\xf5\\x66\\xe9\\xaa\\x67\\xdf\\x9d\\xf5\\x09\\xe5\\xa6\\xcd\\xd9\\x0a\\xf8\\x61\\x80\\x9a\\x5a\\x6f\\x34\\xe3\\xae\\x13\\x5f\\xb4\\xa1\\x8b\\x0d\\x1b\\xba\\xd8\\xb4\\xa1\\x23\\x90\\xb2\\xd6\\x61\\x64\\x53\\xe0\\x9e\\xa7\\x35\\xc6\\x4f\\x3c\\x54\\xb4\\xee\\xad\\xa7\\x54\\x92\\x6f\\xb9\\x96\\x8c\\xc7\\x78\\xa8\\x3a\\x6d\\x50\\xa1\\x68\\x19\\xad\\x0d\\xa2\\x06\\x85\\x0c\\x47\\x57\\x6b\\x3b\\x34\\x0c\\xfe\\xf4\\xeb\\xf7\\xaf\\xbe\\x2c\\x23\\x5a\\xcb\\x47\\x28\\x7a\\x13\\xc8\\xba\\x7b\\x44\\xeb\\xc4\\x07\\xdd\\x08\\x22\\x9d\\x01\\x8e\\x83\\x77\\xf4\\xfa\\xed\\x4b\\x0c\\x25\\xb1\\x3d\\x3e\\xdf\\x5e\\x7b\\x37\\x8e\\xe7\\xbe\\xdc\\x5e\\x6f\\xd7\\x37\\x0d\\x79\\x76\\x0d\\x8f\\xf4\\xfa\\xed\\xd2\\x7f\\xeb\\xfe\\x69\\xeb\\x6f\\x97\\x10\\x3c\\x7f\\x76\\xdd\\x2b\\x32\\x9e\\xf4\\xbc\\x66\\x89\\x33\\x08\\x46\\x15\\x76\\xe7\\x2a\\xc5\\x32\\xad\\xf8\\x61\\x60\\x30\\x22\\x18\\x66\\x7d\\xf6\\xaf\\xe3\\xb3\\x41\\x0c\\x68\\x52\\x19\\xb5\\x48\\x86\\xc2\\x33\\x6b\\xd0\\x89\\x7a\\x86\\x6c\\x7c\\x5f\\xf8\\x3c\\x76\\x16\\x76\\xf0\\xb1\\xb3\\x5b\\xed\\xaa\\x94\\xcc\\xb2\\x8a\\x8c\\xb6\\x09\\xa9\\x99\\xd2\\x31\\x11\\x1f\\x6a\\xb9\\x0f\\xad\\x46\\x6e\\xe8\\x4a\\x76\\xa1\\xd5\\xb5\\x5c\\x88\\x9c\\x11\\xfa\\xab\\xc0\\x38\\xd7\\x71\\x18\\xb5\\xdc\\xa2\\xac\\x1d\\x34\\xb4\\x21\\x16\\x01\\xa9\\xde\\xd0\\x48\\x1c\\xcd\\x27\\x7a\\x19\\x42\\x02\\xd5\\xd8\\x54\\x17\\xed\\x59\\x3c\\x3f\\x0e\\x5c\\x3f\\x70\\x87\\x59\\x1c\\x06\\x6a\\x04\\xe1\\xd4\\x08\\x86\\x6e\\xd2\\x18\\xf2\\xd6\\x08\\xcf\\xea\\x9c\\xd0\\x60\\x6f\\xca\\x72\\xcb\\x0c\\x3d\\xab\\xd8\\x23\\x91\\x64\\x2e\\x40\\x6f\\xd3\\xa3\\xa7\\x7c\\x1c\\x8e\\xd7\\x61\\x44\\x4f\\xb9\\xa1\\x41\\x47\\x7d\\x2b\\x5d\\x75\\x5a\\x30\\x84\\xae\\xce\\xc3\\x80\\xfb\\x61\\x00\\x18\\x8e\\xb8\\x57\\xcd\\x28\\xc5\\xa0\\x59\\x48\\xce\\x82\\xc3\\x00\\xf3\\xf7\\xca\\xe3\\x98\\x9e\\x85\\xc4\\x5d\\x7b\\x7a\\xcf\\x39\\x31\\x71\\x63\\x82\\x0a\\x59\\xc5\\x7e\\x61\\x66\\xfd\\xe6\\x0d\\xde\\xe6\\x68\\xc7\\xe7\\x32\\x88\\x3b\\x33\\xb0\\x89\\x09\\x1e\\xb5\\xf6\\xa4\\x42\\x04\\x23\\x97\\x35\\x5b\\xe3\\x7c\\x4f\\x9f\\xe2\\x7d\\xb0\\xe0\\x8a\\x60\\x80\\xd3\\xa9\\x83\\x9f\\x99\\xca\\x79\\x6e\\x87\\x65\\xdb\\x0f\\x1d\\x47\\x23\\x4a\\xb8\\x5d\\x2f\\xb4\\x17\\x68\\x2b\\x8d\\x99\\xdf\\xc3\\x6f\\x32\\xd6\\xcc\\xf6\\xf8\\xdc\\x79\\xe9\\x6f\\x1f\\xb7\\xbf\\x04\\xf3\\x1b\\xe2\\xbf\\xbd\\x09\\x9e\\x37\\x2a\\xfe\\xcc\\x73\\x0c\\x37\\xf3\\x19\\xed\\xc2\\x67\\x4f\\x33\\xce\\xc8\\x25\\x0f\\xd6\\x7f\\x72\\x8b\\x4a\\xcd\\x46\\x44\\xad\\x97\\x52\\x44\\x5c\\x05\\xb6\\x6d\\xdd\\xc8\\x67\\x2d\\x95\\x2d\\xd6\\x41\\x1f\\x9f\\xed\\x86\\x7e\\xec\\xf9\\x52\\xa8\\xc5\\xd3\\xf5\\xc0\\xfd\\x4d\\x07\\x1f\\x81\\x59\\xd4\\x34\\xb3\\xc8\\x17\\xd9\\x35\\x4b\\x38\\x0b\\x9b\\x26\\x5c\\xca\\xf0\\xda\\x9e\\x13\\x36\\xcd\\x7b\\xa2\\xe0\\x83\\xb8\\x67\\x31\\x8d\\xc3\\xee\\x1b\\x6a\\x77\\x74\\x10\\x93\\x90\\x86\\x57\\x59\\x71\\xac\\x59\\x11\\x89\\x2e\\x17\\x9e\\xd8\\xc9\\x6e\\x08\\x66\\xdc\\x6b\\x28\\x96\\x18\\x00\\x56\\x10\\x5e\\x2c\\x09\\xa1\\x36\\x3b\\xc2\\xed\\x3b\\x11\\xab\\x25\\xc7\\xd5\\x84\\x77\\xca\\x82\\x51\\xb4\\x76\\x1e\\xc0\\x37\\x94\\x71\\x84\\xa3\\xab\\xac\\xb8\\x0a\\xc9\\x00\\xd7\\xaa\\x38\\xce\\xc4\\x53\\x0f\\x52\\xd4\\x90\\xa3\\x42\\x5b\\xb7\\x08\\x30\\xc5\\x8c\\x08\\xdd\\x76\\x9b\\x21\\x1f\\x3b\\xe8\\x46\\xfe\\x8b\\x80\\x40\\x8c\\xae\\x96\\xc6\\x71\\xa7\\x63\\xec\\x77\\xba\\xc6\\xfd\\x27\\xe4\\x81\\x98\\x80\\x19\\xb5\\x9b\\xe6\\x30\\xd8\\x22\\x94\\x81\\xd9\\x9c\\xe1\\x89\\xe4\\x0c\\x8a\\xe9\\xea\\x64\\xf6\\x61\\x33\\xc4\\x1d\\xc7\\x39\\x9c\\x32\\x1b\\x7c\\xbf\\xac\\x38\\x8b\\xdf\\x7b\\xea\\x17\\xa1\\xdb\\x29\\x88\\xeb\\x74\\x66\\xf3\\xbd\\xf1\\xb2\\x1e\\x4d\\xdf\\xcb\\xee\\x71\\x38\\x1a\\xa6\\x9f\\x88\\x58\\x64\\x1d\\xe6\\xd3\\x61\\x0a\\xfd\\xb4\\x9b\\xcf\\x8c\\x93\\x1d\\xb1\\x11\\xe0\\x3d\\x2d\\x84\\x68\\x2d\\x80\\xff\\x73\\xb9\\x85\\xe4\\x24\\x1e\\x9b\\x43\\xc5\\xdf\\x39\\x9e\\xfb\\xf7\\xa2\\xce\\xf2\\x06\\x1d\\x44\\xaf\\xe1\\x0b\\x7a\\x42\\xbb\\xab\\x8a\\x17\\x78\\x48\\x25\\x2d\\x2f\\x8e\\xe2\\xb9\\xe0\\x4f\\x78\\xd0\\x24\\x8a\\xb9\\xb3\\x55\\xbb\\xe9\\x51\\x72\\x9c\\x55\\xd3\\x51\\x2f\\x25\\x16\\xee\\x06\\x1c\\x69\\x33\\x05\\x86\\x87\\x08\\x44\\x86\\xf3\\xe9\\xd7\\x40\\xab\\xd2\\x8d\\x14\\xa5\\x46\\x40\\xbc\\x9c\\x1d\\x9d\\x48\\x5b\\x3b\\x29\\x91\\xb5\\x27\\x8a\\x71\\x0b\\x47\\x79\\x4a\\x7d\\x31\\x92\\xa8\\x1f\\x4c\\x1c\\x69\\x8f\\xa3\\x72\\xb0\\x19\\x1e\\xfc\\x46\\xba\\xfe\\x5e\\x63\\x8d\\x31\\x23\\x0d\\x42\\xb4\\x63\\xc7\\xa9\\x98\\xf3\\x7a\\x31\\x4c\\xd1\\xdb\\x44\\xa0\\xd3\\xd4\\x45\\x46\\x66\\x11\\xc4\\x82\\x6d\\xd8\\x19\\x85\\x91\\x61\\xe9\\x7d\\x16\\x98\\x14\\xa6\\x85\\x28\\x2f\\x8f\\xdc\\x0c\\xd4\\x3e\\x1c\\xb0\\xf2\\x76\\x32\\xe9\\x62\\x22\\x56\\x24\\xa5\\x1d\\xd6\\x6d\\x9a\\x73\\xd2\\xe8\\x61\\x3d\\x7d\\x64\\x75\\x04\\x37\\x77\\xd5\\xe9\\xf3\\x71\\xdb\\xcb\\x0d\\x12\\x07\\x9b\\xc8\\xb6\\x23\\x31\\x65\\x9b\\xb1\\x9f\\x52\\xe2\\xf4\\x6e\\xd2\\x2f\\xd7\\x6b\\xdb\\x76\\x52\\x2f\\x95\\x66\\x2b\\xca\\x42\\x74\\xec\\x4a\\x7d\\x81\\x93\\xc0\\x00\\xb3\\xe4\\x94\\x74\\x27\\xc0\\x83\\xd3\\xae\\x11\\x51\\x4a\\xfa\\xa3\\x8f\\x8e\\x84\\x26\\xc4\\x4d\\xd0\\x7a\\x20\\xe6\\x4f\\x93\\x66\\x14\\xde\\x44\\x90\\x5b\\xc5\\x48\\x15\\xe8\\x8b\\x23\\x91\\x01\\xd1\\x81\\x6b\\x25\\xdd\\xd3\\xc8\\x5b\\xd0\\x06\\x57\\x61\\x6d\\x24\\x13\\xea\\xc1\\x0c\\x25\\xa0\\x56\\xbe\\x3a\\x0a\\x11\\x5f\\xec\\xa0\\xcf\\xf2\\xdc\\xd1\\x44\\xce\\x5d\\xac\\x5b\\x60\\x71\\x3c\\x1d\\x59\\xf9\\xec\\xc2\\x00\\x35\\xaa\\xc1\\xe5\\x06\\x29\\xaf\\x1d\\x02\\xb2\\x20\\x06\\x48\\x65\\x71\\xfc\\xf9\\xf8\\x52\\x04\\xb3\\x42\\x16\\xc7\\x8e\\x8e\\x23\\x3c\\x8a\\xa9\\xef\\x8e\\xde\\x35\\xc4\\x32\\x42\\x5a\\x33\\x62\\xe9\\x97\\xb2\\x9b\\xe3\\x2d\\xbd\\x1e\\x6e\\xe9\\xfe\\x88\\x5c\\x05\\x5c\\x3d\\x4d\\x58\\x88\\x68\\xc3\\x8c\\x73\\x97\\xcf\\x50\\xb9\\x65\\x99\\x14\\x4b\\x79\\x06\\x29\\x3c\\x36\\x19\\x21\\x79\\x19\\x67\\x95\\xc3\\xc0\\x3c\\x72\\x24\\x5d\\x09\\xc4\\x78\\x17\\xc3\\x14\\x4f\\x14\\xc5\\x28\\xc5\\xc5\\xd8\\xd2\\x43\\x15\\x10\\xd3\\x30\\x30\\x98\\x25\\xad\\xc4\\x91\\x97\\xf2\\x8e\\x0d\\x83\\x55\\xdd\\x9f\\xe5\\xf9\\x07\\x87\\x32\\xd1\\xc4\\xef\\x15\\xb9\\xd0\\xd2\\x1f\\x1b\\xbf\\xd9\\x1e\\x4e\\x80\\xa8\\xed\\x0f\\x4e\\xdd\\xd8\\xf4\\x59\\x14\\x57\\xd8\\xf9\\xc2\\x7a\\xa9\\xaf\\x8e\\x63\\x02\\x41\\xd3\\x9c\\x5a\\x62\\x48\\xfd\\x42\\x06\\x82\\x8e\\x3e\\x7d\\xb0\\x1e\\x53\\x59\\x20\\x0a\\x69\\x42\\x36\\xa9\\x99\\x50\\x5f\\x7b\\x1e\\x48\\xef\\x2d\\x3f\\x00\\x66\\x46\\xec\\x6b\\xdb\\x51\\x90\\x5f\\x41\\x10\\x7c\\x16\\xf4\\x9c\\xa6\\x71\\xf8\\x62\\x5c\\xed\\x11\\xf6\\x47\\x9f\\x16\\x4e\\xe1\\xc0\\x52\\xfd\\x53\\x82\\x27\\x8c\\x11\\x32\\x39\\x67\\xa8\\x28\\xc6\\xa3\\xc6\\x4e\\x10\\xc4\\xd3\\x4d\\x93\\x29\\xb9\\x11\\xa8\\xf5\\x0b\\xb4\\xd8\\xed\\x70\\x03\\x27\\xf0\\x79\\xaf\\x27\\xe3\\xcb\\x8a\\xbf\\xe3\\x15\\x5a\\x08\\xc1\\x08\\x9d\\x70\\xa2\\x59\\xec\\xaf\\xe8\\xf5\\xf6\\xf5\\xfc\\x3a\\x85\\xaf\\xe9\\xc9\\x30\\x0d\\xf8\\x6b\\xbf\\x3f\\xbf\\x16\\x23\\x3d\\x75\\x4a\\x6b\\xb5\\x9f\\x95\\x0b\\xa8\\xf3\\x15\\xea\\x3d\\x61\\x68\\x99\\x2b\\xf8\\x3c\\x2a\\x88\\x15\\x84\\x6d\\xb1\\xfc\\x82\\xe5\\x79\\xc8\\xa2\\xbb\\xe3\\xc0\\x67\\x8d\\xd1\\x09\\xf4\\xfb\\x35\\x0e\\x48\\x34\\xee\\xf6\\x14\\xb7\\x05\\xe5\\xdb\\x38\\x08\\x3b\\x2c\\x48\\x5a\\x46\\x67\\x6c\\x59\\x16\\x11\\xc7\\x83\\x8f\\xdb\\xbe\\xfe\\x5c\\x0b\\x6f\\x6c\\xb9\\xe7\\xfb\\xb2\\x7a\\x6f\\xdb\\x39\\x44\\x74\\xb6\\x82\\x94\\xf2\\xa6\\x59\\x29\\x3f\\xbf\\x5d\\x2f\\x38\\xce\\x56\\x9b\\x9d\\x6d\\x27\\x37\\xe9\\x26\\x95\\x74\\x78\\xe7\\xa7\\xfa\\xcc\\x2a\\xf7\\x57\\x01\\xe4\\x82\\x21\\x46\\xcb\\x41\\xf4\\xf9\\xab\\xcb\\xc3\\x8f\\xc5\\xd7\\x2c\\x3f\\x72\\x72\\x0a\\xe9\\x6c\\xad\\xc8\\x53\\x4c\\x67\\x6b\\xd8\\xd9\\xb6\\x93\\x79\\x59\\x27\\x3a\\xdf\\x3a\\x99\\x56\\xf4\\x12\\x37\\xf4\\x44\\xd7\\xdd\\x3b\\x6d\\x60\\x88\\xf6\\x5b\\x77\\xf4\\x34\\xa0\\x04\\x32\\x44\\xa1\\x3e\\x1b\\xd2\\xdd\\xdc\\x74\\x57\\x37\\x5d\\xa5\\x0e\\x82\\x21\\x2e\\x45\\x38\\xba\\x43\\x46\\xf2\\x60\\x2a\\x6a\\x74\\x44\\x36\\x83\\x78\\xd1\\xb1\\xa7\\xcf\\x28\\x6c\\xfb\\x6e\\xb9\\x63\\x82\\xb9\\x6a\\x9a\\x9d\\xa6\\xb2\\x2e\\x5a\\x78\\xea\\x8e\\xf7\\x5c\\x02\\x8d\\x6d\\x3b\\x75\\x22\\xd2\\x92\\xd6\\x88\\xc9\\x0d\\xb1\\xd7\\x4f\\xa2\\x1b\\x22\\xc8\\x46\\x70\\x8b\\x61\\x28\\x4d\\x2e\\x1f\\x64\\x28\\xb6\\x89\\x8b\\x5d\\x76\\x82\\xfe\\x4b\\x80\\xea\\x42\\x85\\x4f\\xc8\\x6f\\x9a\\x83\\x8c\\xa8\\x90\\xf1\\x24\\xf7\\x1b\\xc2\\x0e\\x22\\x22\\x58\\x0a\\xb2\\xd3\\xaa\\xe7\\x08\\xd6\\xb8\\x9d\\x9c\\xe4\\x86\\x46\\xb6\\x9d\\x2c\\x16\\x90\\xe2\\x53\\xba\\x58\\x90\\x56\\x6e\\x83\\x16\\xc6\\x2c\\x5c\\xc7\\x10\\xf4\\x95\\x33\\xd8\\x21\\xb3\\x32\\x73\\x54\\x48\\x48\\xad\\x9a\\x1f\\xdb\\x50\\xf6\\x23\\xd1\\xf1\\xe4\\x65\\x1b\\x6a\\x75\\x27\\x33\\x66\\x34\\x54\\xdc\\xf1\\x30\\xf3\\xc4\\xcd\\x37\\xb3\\x5d\\x0b\\x79\\x69\\x52\\xf4\\x3e\\xc2\\x99\\xae\\x23\\x6c\\x1a\\x03\\x9a\\x54\\x95\\xa2\\xd0\\x64\\x85\\x19\\x5a\\x0b\\xf2\\x5f\\xb2\\x7a\\xfa\\x4e\\x23\\x31\\xde\\xc8\\xb6\\x67\\x19\\x1e\\x27\\xe1\\xad\\x01\\x10\\x52\\x9f\\x41\\x28\\x11\\x97\\xa7\\x7e\\x1d\\xe2\\x86\\x01\\xc4\\x9e\\x3a\\xc7\\x0b\\x89\\x8b\\xeb\\xae\\x9a\\x17\\x4d\\x4c\\xf4\\xf9\\x6e\\xa9\\xdb\\x1e\\xdf\\x50\\x64\\x94\\x9b\\xea\\xf5\\x2c\\x6a\\x3b\\x0c\\x74\\x67\\xde\\x04\\xf3\\x25\\x4f\\x78\\x55\\x4d\\x1a\\xe6\\xfa\\xbe\\x55\\xf1\\x63\\x99\\xbf\\xe3\\x16\\x58\\x71\\x59\\x70\\x0b\\x0c\\x64\\xe4\\x58\\x02\\x71\\x5c\\x49\\xf4\\x60\\x11\\xd0\\x79\\x63\\x2b\\x00\\x51\\x10\\xa3\\x53\\x82\\x95\\xb0\\x2c\\xff\\xbd\\x72\\xb7\\x68\\x63\\x8b\\xe5\\x8a\\xb2\\xce\\x92\\xf7\\x96\\x20\\x86\\x65\\x5a\\xf1\\xe3\\x71\\x54\\x56\\x17\\x0b\\x02\\x88\\xa8\\x75\\xe0\\x45\\x8c\\x94\\x32\\xa6\\xa7\\x63\\xcd\\xea\\xa9\\x29\\x8b\\x5a\\x60\\xf9\\x23\\x7b\\x7f\\x9c\\xf8\\xc6\\x97\\x62\\x58\\xc6\\x86\\x5c\\x8a\\xee\\x3a\\x67\\xb3\\x5a\\xef\\x4c\\xc2\\xa9\\x03\\x42\\x76\\xd9\\x7a\\xd4\\xae\\x67\\xd3\\x08\\x90\\x37\\x8d\\x66\\xd4\\x31\\x5f\\x4a\\x87\\x32\\xb1\\xe4\\x05\\xc5\\xcf\\x86\\xfb\\x89\\xbf\\x0e\\x02\\xe7\\xac\\xd9\\xd4\\xb6\\xd3\\xe9\\x5b\\xaa\\x36\\x4c\\x2a\\x1c\\xfa\\xfa\\x84\\x58\\xbb\\xcf\\x8e\\x9c\\x78\\xdd\\xa3\\x43\\xe4\\xa0\\xa3\\xa5\\x5a\\x30\\x35\\x68\\xf1\\x2e\\x16\\x42\\x30\\xda\\x72\\xea\\x51\\x12\\x11\\xcb\\x41\\xdc\\xc8\\x4f\\xfc\\x55\\x30\\xb7\\x04\\xe4\\x59\\x01\\xb6\\x8b\\xb8\\x30\\xea\\x6b\\x95\\x37\\xc4\\xa5\\xf2\\x9a\\x8b\\xae\\x4b\\xad\\xc0\\x1a\\x4c\\x46\\x8e\\x24\\x7d\\x66\\xc1\\x16\\xe1\\xe3\\x87\\x6e\\x34\\xeb\\x80\\x94\\x41\\x4c\\xdc\\xb8\\x6d\\x81\\x1b\\x74\\x34\\x5e\\x1e\\x32\\xb4\\xc3\\x14\\x8b\\x03\\xe7\\x73\\xcc\\xfa\\x39\\x4e\\xfc\\x17\\x01\\xec\\x30\\x7a\\xeb\\x26\\x96\\xd3\\x4a\\x53\\xc1\\xcb\\x0b\\x4a\\x83\\x0f\\xe6\\x2c\\x47\\x74\\xd7\\x42\\xe8\\xaf\\xdf\\xb2\\xc0\\x7f\\x11\\x68\\xc4\\x00\\xa1\\xff\\x02\\xdf\\x05\\x62\\x20\\xc0\\x71\\x42\\x82\\x89\\x1b\\x19\\xf8\\xe4\\x54\\x71\\x2f\\x76\\xa7\\x77\\xec\\x30\\x3f\\x4d\\xbb\\x1d\\x8e\\x81\\xc2\\xf4\\x8c\\x71\\xbc\\x05\\x47\\x5d\\x6b\\xc6\\x81\\xe3\\x89\\xdd\\xe3\\x8e\\x4f\\x59\\x6a\\xaf\\x20\\x3a\\xbb\\x3f\\x82\\xe0\\xd5\\x7c\\x9d\\x38\\x2b\\x64\\x03\\xde\\x34\\x1f\\x80\\x17\\xee\\x0a\\x5a\\x8f\\x4e\\xee\\x1e\\x73\\x0d\\xc8\\x26\\x62\\x26\\xa7\\x39\\xd9\\x2e\\x59\\xd0\\x74\\xc1\\xf5\\xe0\\x88\\x23\\xf1\\x34\\xbe\\xea\\xeb\\x66\\xed\\x9d\\x75\\xd1\\xe5\\xe8\\xab\\x91\\x79\\xa9\\x82\\x3b\\xc4\\x73\\xa2\\x01\\x77\\xb1\\x48\\x9a\\x26\\xd5\\x10\\xdb\\xa5\\xb7\\xad\\xb4\\x9a\\xc5\\x13\\xef\\x9b\\x35\\xca\\xd8\\x19\\x5a\\xde\\x4a\\x2a\\xc4\\x09\\xdc\\x0e\\x5f\\xef\\x06\\xaf\\x1b\\xae\\x94\\xcc\\x91\\x1f\\x06\\xa3\\xb9\\x10\\x49\\xfd\\x74\\x98\\x6f\\x7a\\x07\\x89\\x3e\\xdc\\x09\\x12\\x2a\\x37\\x50\\x7a\\xbe\\x81\\x44\\x8e\\x5b\\xc8\\x08\\x0e\\xa0\\x8b\\x34\\x37\\x1e\\x89\\xa8\\x03\\x52\\x63\\x73\\x28\\xd6\\xf2\\x1b\\xbc\\x58\\x50\\xea\\xc1\\xe8\\x24\\xdb\\x8e\\x9f\\xc6\\xdd\\x62\\x1a\\xb2\\x7a\\x24\\xdf\\xdd\\xdc\\xb5\\x06\\x2c\\xf2\\x0b\\xcb\\x6a\\x77\\x0d\\xbb\\x32\\x8f\\xe5\\x87\\x01\\x63\\xe9\\xa9\\x8a\\x45\\xae\\xf9\\xdc\\x55\\x6f\\xce\\x6c\\x45\\x5a\\x59\\x7c\\x90\\x1d\\xc3\\xc6\\xcc\\x56\\xde\\x62\\x61\\x14\\x43\\x55\\x1f\\x56\\x4d\\x9a\\xc6\\xe9\\x5e\\x30\\x92\\xed\\x4c\\x64\\xb7\\xed\\x41\\xfe\\x9b\\x55\\xd3\\x38\\xdf\\x0c\\x66\\x25\\x07\\xbf\\x08\\x94\\xee\\xa8\\xae\\xb2\\x34\\xe5\\x2a\\xfc\\x40\\x65\\xdb\\x8e\\xe0\\x50\\x47\\xa9\\x8e\\x85\\xb5\\x59\\x42\\x9e\\xcf\\xc9\\xb2\\x4c\\x92\\x2e\\x85\\x8c\\x44\\xf0\\x6f\\x1d\\x72\\xca\\x55\\x78\\xdb\\x51\\xbc\\xcb\\x2f\\x7f\\xfc\\x5e\\xf9\\x4d\\xbd\\x2a\\x59\\xcc\\x63\\x0b\\xbe\\x85\\xd9\\x9a\\x00\\x9b\\xce\\x2e\\xa3\\x5d\\xca\\x2c\\x7a\\x9e\\x48\\x3b\\x5a\\x18\\x3a\\xe1\\xfb\\xf5\\x8d\\x18\\x2f\\x1d\\x6c\\x2b\\x2b\\x2a\\xf7\\x87\\x9c\\xd7\\x78\\x64\\x9c\\xcb\\x2a\\x5e\\x0b\\xa2\\xe6\\x1d\\x79\\xfd\\x26\\xdb\\xf3\\xf2\\xa1\\x76\\x54\\xd5\\xc4\\x75\\xf2\\x89\\x68\\x9d\\x97\\x7b\\x7f\\x9e\\xd7\\xe8\\x3a\\x21\\xf0\\x4d\\x07\\x45\\x21\\x9e\\x1c\\x8d\\x20\\x0b\\xe1\\xf1\\x6f\\xe8\\x6c\\x14\\xf1\\xe3\\x71\\x84\\x00\\xb4\\x50\\xa1\\x6c\\x86\\xa7\\x8c\\x4f\\x29\\x8d\\xf0\\xbc\\xa0\\xbb\\x43\\xac\\xe7\\xaf\\xc9\\x89\\x0b\\xe9\\x41\\xec\\xdd\\xdd\\x55\\x56\\x5c\\x45\\x44\\x37\\x83\\xb5\\xef\\x20\\xf2\\x77\\x01\\xcc\\x56\\xd8\\x42\\xe7\\x77\\x3a\\xb8\\xeb\\x4e\\x54\\x30\\xbc\\x45\\x27\\x96\\xb7\\xfd\\xcd\\x56\\x68\\xc6\\xea\\xa4\\x9e\\xd3\\x9f\\x50\\xea\\x50\\xc6\\xc4\\x75\\x6e\\x69\\x08\\xe1\\x25\\x74\\x76\\x6b\\xe8\\xb2\\x22\\x0c\\x7c\\xa6\\xb4\\xf7\\x9d\\x19\\x6d\\x88\\x4e\\x84\\x10\\x41\\xea\\xc5\\xfa\\x82\\x4d\\x4c\\xd9\\x81\\xfe\\x44\\x7a\\xe3\\x40\\xee\\x31\\xf7\\xd6\\xd3\\xfd\\x20\\x6e\\xe6\\x85\\x18\\xae\\x40\\x20\\xb8\\xa4\\xdd\\xc8\\x51\\x1f\\xea\\x2f\\x59\\xcd\\xa6\\xb6\\xfb\\x50\\xe5\\x2a\\x03\\x91\\x98\\xef\\xb3\\xb9\\x71\\xfe\\xd7\\x03\\xfb\\x77\\x0e\\x39\\x29\\x8d\\x94\\x54\\xb6\\x77\\x1e\\xa2\\x52\\x53\\xc9\\xa2\\x9d\\x20\\xab\\xb0\\x82\\xd3\\xc0\\xad\\x4d\\xb7\\x7b\\x6a\\x5b\\xc5\\xf8\\x2f\\xd5\\xad\\x81\\xf2\\x0c\\x5a\\x3c\\xcd\\xbf\\x5b\\xe2\\xcd\\x41\\x2d\\xfe\\xd2\\x35\\x7c\\xa7\\xc6\\x70\\xa4\\xe6\\x68\\xe0\\x3b\\xf3\\x6e\\xd4\\x3b\\xfe\\xfe\\xec\\x66\\xdb\\xae\\x9c\\xc3\\xba\\x63\\x5d\\x19\\x7c\\x2a\\x14\\x7d\\x8b\\x28\\xf3\\xcd\\x1e\\x04\\xca\\x80\\xff\\x14\\x51\\xd5\\x03\\x0c\\x79\\x1d\\x0e\\x33\\x51\\xed\\x16\\xd0\\xc2\\xd4\\x04\\x64\\x78\\xa6\\xda\\x05\\xc7\\x8e\\xc9\\x59\\xf9\\x08\\x0c\\x16\\x24\\x24\\xed\\x40\\x79\\x8a\\x13\\xe7\\x47\\x41\\xd3\\x38\\x83\\x77\\xb4\\x58\\x8f\\x5a\\x38\\xf2\\xfa\\xe2\\x0d\\x6d\\x58\\xe0\\x8e\\xbf\\x17\\x90\\x95\\x50\\xa3\\x38\\x0f\\x2e\\x1c\\x7c\\x27\\x7e\\x18\\xd0\\x68\\xa3\\xa1\\x5f\\xc0\\xba\\x71\\xe1\\x9f\\x93\\x10\\xd2\\x75\\x75\\x50\\x1d\\x84\\xc6\\xad\\x57\\xb1\\x3c\\x75\\x4a\\xfc\\x78\\x78\\xef\\x57\\x32\\xbe\\x5c\\xb6\\x37\\xab\\x34\\x2a\\x33\\x3a\\x1d\\x0c\\x63\\x19\\xc9\\x20\\x08\\xae\\xa0\\x91\\x2d\\xc8\\xad\\x3b\\x3d\\xf4\\xf3\\x62\\x4d\\x13\\x4e\\x28\\x6f\\x42\\xdb\\xee\\xb2\\x44\\x9e\\xa3\\x8e\\x7a\\x53\\x2e\\xa3\\x3b\\x41\\xbf\\xf7\\x15\\x57\\xa5\\x3e\\x15\\xcb\\xee\\xae\\x3e\\x0c\\x6b\\xe5\\xea\\xe3\\xa1\\x5a\\xf5\\xa2\\x2f\\x19\\x79\\x91\\x1b\\x92\\x73\\xc1\\xda\\x3c\\xf2\\x44\\x83\\x65\\x73\\xa9\\x52\\x73\\x3a\\xa4\\x47\\x44\\x3f\\x12\\x32\\xf8\\x26\\x18\\x55\\x34\\xe7\\xed\\xaf\\x95\\x0c\\x89\\x87\\xf7\\xd8\\x49\\x53\\xda\\x10\\xd5\\x5c\\x46\\x8f\\x45\\x77\\x39\\x1d\\x0e\\x01\\xf0\\xca\\xc6\\xd4\\x8b\\xa9\\x1f\\x02\\x0f\\x5c\\x27\\xa6\\x1c\\x62\\x1a\\xcb\\x54\\x3f\\x0e\\xdc\\x78\\xa0\\x46\\x42\\xcb\\xc5\\xf8\\xdc\\x72\\x51\\xc5\\xc8\\x4d\\xfd\\xd8\\x8f\\x82\\xa0\\x45\\x09\\x5e\\x6c\\xcc\\x4b\\xf7\\x60\\x9a\\xa0\\x65\\x0c\\x6b\\xb4\\x09\\xf1\\xf6\\x55\\x82\\xd2\\x77\\xc4\\xaa\\xa1\\x04\\x39\\xca\\xda\\x85\\xc1\\xff\\x40\\x6d\\x6d\\x8b\\x1b\\xfe\\x15\\x72\\x68\\xdf\\xc1\\xf7\\xea\\xf7\\x07\\x75\\x82\\x7d\\x92\\xc7\\xd7\\xcf\\xb7\\x6d\\xb3\\xf5\\xf5\\x73\\x40\\x9e\\x5d\\xc3\\x8f\\xf4\\xda\\xf1\\x3f\\x5b\\xfc\\x4f\\x40\\xae\\xd3\\x1e\\xef\\xfd\\x34\\x84\\x3c\\x73\\xad\\xce\\xa2\\xca\\xcb\\x3b\\x06\\xad\\x98\\xd5\\x6c\\x61\\xcd\\xfb\\xc8\\x6a\\x3f\\x82\\xb5\\x78\\xb6\\xb6\\xc6\\x0e\\xcc\\xd1\\xd8\\x64\\x29\\x26\\xe7\\xa7\\xf4\\x11\\x39\\x09\\x9c\\x14\\x51\\xab\\xae\\x1e\\x90\\xa6\\x47\\x78\\x8d\\x58\\xc2\\xf2\\xa3\\x7e\\x5d\\xbb\\x96\\x20\\x44\\xf2\\x0d\\x83\\xe3\\xcc\\xa3\\xb9\\x25\\x5f\\xe7\\x91\\xfb\\x83\\x0e\\x86\\xe3\\xa9\\xd3\\xe8\\xbf\\xbd\\xfe\\xf1\\x07\\x54\\x32\\x19\\x21\\xd5\\xbe\\x37\\xe0\\x5b\\x52\\xc7\\x88\\x0e\\x03\\x8e\\x45\\xed\\xe0\\xf4\\xed\\xc2\\xc2\\x5f\\x7d\\xbf\\x54\\x1f\\xf1\\x80\\xeb\\x95\\xf1\\xd6\\x42\\x3c\\x2c\\x33\\x20\\x93\\xdf\\x9b\\xd4\\x3a\\xea\\xf6\\xd4\\x97\\xe3\\x22\\xe4\\xf4\\xbd\\x62\\xa2\\x54\\x8c\\xb6\\x7f\\x7d\\xa8\\xd6\\x57\\xe3\\x5a\\xff\\x75\\xb1\\xda\\x57\\x83\\x6a\\xc7\\xe7\\x8d\\x67\\x8d\\x9c\\xef\\x6f\\x41\\x83\\x53\\x9a\\xd8\\x76\\x62\\x58\\xe4\\x0d\\x20\\x46\\x92\\x29\\x43\\x7d\\x8c\\x4c\\xc7\\xf7\\x88\\x77\\x12\\x69\\xe9\\x93\\x18\\x47\\x72\\xb3\\x57\\xf2\\x0b\\x58\\x6a\\x12\\x05\\xa8\\x1c\\x05\\x23\\x7a\\x8a\\x3a\\x57\\x16\\x63\\x7f\\xa6\\x7e\\x24\\xdd\\x65\\xc4\\xc3\\xb2\\x60\\x7b\\x0e\\x2b\\x34\\x17\\xea\\x22\\x1e\\x49\\xd0\\x94\\x1a\\x6f\\x13\\x47\\xc4\\x4a\\x99\\xf4\\x29\\x21\\xf0\\x93\\xf4\\xe2\\xf1\\xe3\\x40\\x30\\x1d\\xaf\\x10\\x2e\\xc6\\x5d\\x00\\xc1\\xc5\\x6b\\x7e\\x44\\x3d\\x9c\\x5f\\xec\\x2a\\xcf\\xb6\\x50\\xa2\\x36\\xf8\\x01\\x09\\x69\\x52\\x8a\\x25\\x2d\\x71\\xff\\x36\\xbe\\x80\\xbb\\xb7\\xb2\\x36\\xbb\\x28\\xad\\x2f\\x12\\x03\\xa5\\x87\\xca\\x48\\x44\\xcd\\x1f\\x30\\x13\\x31\\xf7\\xd7\\xc1\\x0d\\xf2\\xc4\\x1f\\xc8\\x23\\x07\\x2e\\x3f\\x4f\\x66\\x93\\xfb\\x62\\x72\\x50\\x92\\xcc\\xc9\\x56\\x70\\x38\\x31\\xd9\\x18\\x03\\x8d\\x05\\xbd\\x59\\xc8\\xc3\\xb9\\x6e\\x31\\x70\\x21\\xfa\\x66\\x6c\\xdb\\x9c\\x19\\xbc\\x70\\xbc\\x55\\xc1\\x1e\\xe1\\x5c\\xee\\x95\\x5f\\x94\\x30\\x35\\x01\\xd1\\xa3\\x5b\\xc3\\xcf\\xd6\\x40\\xc1\\x7a\\xb7\\x0c\\x12\\xe0\\x35\\xb4\\xdf\\x3f\\xf0\\x07\\xfe\\x61\\xe2\\xcb\\x3c\\x27\\xa4\\xe8\\x3f\\x95\\x3c\\x59\\x64\\x6e\\x61\\x11\\x0b\\x62\\xfa\\xaa\\xa7\\xb0\\x91\\x6d\\x63\\xb4\\xd8\\xc1\\xbd\\xd4\\x22\\x87\\xb1\\x29\\x4d\\x4b\\x8a\\x88\\x10\\xb7\\x0b\\xe9\\x4d\\x00\\x2f\\x28\\xea\\xa3\\x6d\\xc7\\xfc\\xbc\\x5b\\xe4\\x84\\xca\\x51\\xd1\\x07\\x19\\x64\\x94\\x16\\x4b\\xcc\\x25\\x3b\\x10\\xf7\\xda\\x0a\\x4e\\xa3\\xde\\xdf\\x93\\x16\\xcb\\x7f\\x61\\xb6\\x6f\\xca\\xf2\\xee\\xd8\\x05\\x2e\\xe9\\x27\\xa8\\x58\\xaa\\xd6\\x24\\x36\\xd8\\x58\\x59\\xd1\\xa9\\x12\\x29\\xa5\\x5c\\xea\\xd8\\xbb\\x0a\\xe3\\xc5\\x02\\xbd\\xd3\\x1c\\xd1\\x11\\xaa\\x6c\\x18\\x74\\xa8\\x50\\xb3\\x2c\\x01\\x45\\xc1\\x12\\x3c\\xbb\\x00\\xae\\xc5\\x89\\x14\\x5d\\xd9\\x66\\xb1\\x6d\\x23\\x02\\x41\\xf5\\x36\\xea\\x70\\x1c\\x81\\xb4\\xfa\\xbe\\x4e\\x5f\\x2a\\xab\\xa6\\x1f\\x73\\x58\\x9b\\x0e\\xf7\\xc9\\x85\\x88\\x10\\x0f\\x77\\x53\\x1e\\xc1\\x49\\x2a\\xcf\\x2f\\x6b\\x53\\xc7\\xba\\x2c\\x03\\x35\\xfa\\x61\\xb7\\xd4\\x51\\x20\\xaf\\xd9\\x18\\xa3\\xca\\xa9\\x55\\x92\\xfd\\x7c\\x31\\xba\\xce\\x74\\x66\\xd8\\xa2\\x39\\xf2\\x1e\\x53\\x31\\x81\\x20\\x90\\xd9\\x19\\xcc\\xbf\\x8c\\x3c\\xbd\\xb6\\x1a\\xdb\\x76\\xa1\\xd8\\x91\\x75\\x14\\xa9\\xee\\x07\\x76\\xa7\\x59\\x1a\\x37\\xd8\\x66\\x08\\x05\\x6a\\x2f\\x80\\x5a\\x43\\x66\\xdb\\xe6\\xca\\x89\\x2d\\x8a\\x06\\x06\\x3d\\x68\\xf4\\x9b\\x67\\x02\\x36\\x3f\\xbc\\x01\\x27\\x2b\\x89\\x72\\xce\\xaa\\xff\\xfe\\x60\\x3d\\x0a\\x26\\x25\\xc4\\x03\\x5e\\xd5\\x7f\\xae\\x02\\x35\\x1d\\x55\\xd6\\xc0\\x87\\xfa\\x01\\x49\\xab\\x34\\x13\\xda\\x5d\\x88\\x6b\\xf4\\x6d\\xb1\\x88\\x9b\\x86\\x0f\\xb4\\x28\\x09\\xf8\\x49\\x20\\xb6\\xc1\\xe5\\x85\\xd3\\x78\\x93\\x51\\xd5\\x3b\\xf3\\xae\\x16\\x85\\x14\\x12\\x3f\\x0d\\x80\\x0d\\x80\\x15\\x91\\x44\\x24\\xe1\\x5d\\x90\\xa5\\xf9\\x1c\\xd4\\x1b\\x02\\xa1\\xe1\\x32\\xba\\x73\\x08\\x70\\x53\\xbf\\xa0\\xf4\\x5b\\xff\\x4d\\xaf\\xfd\\xf9\\x22\\xf0\\x04\\x77\\x17\\x3f\\xdf\\x2e\\x1b\\xb2\\x8d\\xe7\\x8e\\xe7\\xfa\\xfc\\xab\\x00\\x3f\\x6c\\xe3\\x79\\x43\\xae\\xd5\\x4d\\x3e\\xf0\\x33\\xf5\\xad\\x37\\xe5\\xc1\\x02\\xeb\\xe7\\x2c\\xdd\\xd5\\x16\\x58\\x9f\\x97\\x75\\x5d\\xee\\x2d\\xb0\\x5e\\xf1\\xa4\\xb6\\x02\\x78\\x7d\\xe9\\xc2\\xd3\\xb0\\x69\\x18\\x58\\x45\\x59\\x70\\xa9\\x79\\x88\\x70\\x3f\\x59\\x71\\x76\\x3c\\xe4\\xec\\xbd\\x45\\x9a\\x66\\x66\\x98\\x0d\\x8d\\x82\\xc4\\xe2\\xf1\\xf9\\x1b\\xc9\\x85\\xea\\xf0\\x03\\x0d\\x06\\x24\\x20\\xcf\\xae\\xb3\\xfe\\x4c\\xb1\\x53\\xd0\\xeb\\xbb\\xc8\\x75\\x05\\x5f\\x57\\x2c\\x45\\x3f\\x06\\x02\\x21\\x1d\\x86\\x87\\x3f\\xbb\\xb6\\x5c\\x7a\\x3a\\x40\\x74\\x7e\\xa1\\xb9\\x8e\\x3f\\x1f\\x4d\\xc7\\x9f\\xc7\\x0e\\x59\\xe8\\x7c\\x31\\x0c\\xb3\\xa7\\x62\\xe4\\x83\\xd5\\x47\\xcb\\x1f\\xe7\\x51\\x31\\xe9\\xe5\\x6d\\xe9\\x66\\xf7\\x22\\x02\\x77\\x32\\xde\\xca\\x17\\x79\\x59\\x70\\x21\\xbd\\x88\\x5f\\x34\\x9e\\x9f\\xad\\xc8\\xe8\\xad\\x8b\\x68\\xa6\\x43\\xb4\\x40\\x38\\xf0\\x5e\\xd0\\x37\\x26\\xde\\x3c\\xbd\\xbc\\xee\\x9e\\x2d\\xb8\\x5b\\x16\\x25\\x56\\xff\\x85\\x2c\\x45\\xd1\\x9a\\xfc\\x42\\xcd\\x03\\xb7\\x02\\xa5\\x97\\xfa\\xbb\\x79\\x55\\xc7\\xe6\\x6e\\x89\\xf1\\x72\\xb2\\xe2\\xf3\\x87\\x30\\xcc\\xf9\\x91\\x5a\\x65\\xa1\\x52\\xf0\\x6a\\x60\\x2c\\xf2\\x0f\\x7a\\xfd\\xf6\\x8e\\xbf\\xbf\\x86\\x5f\\xe4\\xba\\xee\\xcb\\x87\\x23\\x6f\\x0e\\x65\\x56\\xd4\\xbc\\x6a\\x94\\xf5\\xd6\\x9e\\x17\\x0f\\xa4\\x89\\xf2\\x2c\\xba\\xbb\\x86\\x5f\\x65\\x46\\x55\\x93\\xbc\\x81\\x16\\xff\\x96\\x0f\\x75\\x98\\x3f\\x54\\x42\\x10\\xc1\\x6b\\x22\\xfd\\xb7\\xcb\\xe0\\x39\\xde\\x34\\xb9\\x74\\x96\\x73\\xd2\\x10\\xd3\\xd0\\xfe\\x7f\\xcc\\x98\\x90\\x5d\\xea\\x33\\xc7\\xbc\\x98\\x4b\\xa7\\xfe\\xcb\\x91\\x12\\x84\\x82\\xe2\\x7c\\x18\\xe8\\x47\\x49\\x00\\x8c\\x9c\\x5a\\xc1\\xde\\xbf\\xe3\\x45\\x4d\\x4f\\xf2\\x62\\x7d\\xf7\\x74\\x6e\\x17\\x35\\x88\\x06\\x38\\xba\\x75\\x58\\xdd\\x39\\xac\\xe9\\x3f\\xb2\\x6b\\x15\\x39\\x45\\xcb\\x5d\\xa7\\x6f\\x4d\\x68\\x04\\x11\\x4d\\x74\\x0a\\x70\\xda\\x7b\\xb6\\xe1\\x8d\\x33\\x78\\x91\\xb4\\x23\\x1f\\xa8\\xbe\\x50\\x9a\\x80\\x93\\xd1\\x4a\\x76\\xee\\x48\\x9a\\xc6\\x78\\x93\\x7e\\xfd\\x29\\xad\\x54\\x95\\x52\\x5d\\xa7\\xdf\\xa6\\x34\\xa6\\x0a\\x6f\\x15\\x33\\x4a\\xff\\x8e\\x87\\xde\\xa2\\x1e\\xad\\x03\\xe6\\x31\\x1a\\x3b\\xd5\\xd2\\xb2\\x5e\\x7e\\x12\\xbb\\x1b\\xbd\\x24\\xf4\\x1d\\x8f\\xc6\\x49\\x83\\xe2\\x4c\\xc4\\x86\\x44\\x4e\\xc8\\x22\\xa6\\x1c\\x6d\\x59\\x01\\xdc\\x8e\\x3d\\x00\\x6f\\x17\\x0b\\xb2\\xa3\\xff\\x94\\xc6\\xc9\\xa1\\x7f\\x1b\\x48\\xc3\\x8d\\x92\\xde\\xd3\\x9d\\xbf\\x0e\\xe0\\x40\\x9d\\x9d\\xff\\x42\\xc5\\x8e\\x55\\xce\\x53\\x4b\\xed\\x3d\\x45\\xa0\\xc4\\x1b\\x97\\x75\\xdf\\xd0\\xe5\\x84\\xe5\\x7e\\x89\\x32\\x34\\x94\\xd4\\xe1\\x5e\\xbe\\x14\\x1c\\x46\\xca\\x6a\\x14\\x22\\xdc\\x7c\\x19\\x66\\x45\\x8c\\xd2\\x69\\xd3\\x94\\x70\\xb1\\xec\\x1d\\xed\\x09\\x38\\x86\\xbf\\x28\\xa1\\xac\\xb2\\x14\\xeb\\xb8\\x97\\x82\\x5b\\x0c\\x6a\\xdd\\xdc\\x48\\xde\\x5d\\x2e\\xd7\\x09\\xf4\\x0a\\xba\\x7c\\x78\\xc5\\x2a\\x1a\\x15\\x5e\\x70\\x33\\x91\\x22\\x29\\x27\\x20\\x90\\xc6\\xf1\\xc0\\x22\\xee\\x1e\\x94\\x67\\xd8\\xd2\\x22\\x2d\\x24\\x04\\x9c\\x3d\\xcd\\xfc\\x52\\xcc\\x8f\\x7a\\xa2\\x7e\\x00\\xfb\\x6e\\x74\\x5f\\x94\\x0f\\x45\\x4d\\x57\\x90\\x0b\\x2c\\xf4\\x70\\xb0\\x6d\\xf5\\xd0\\x7b\\x90\\x1c\\x20\\x25\\x33\\x4a\\x67\\xeb\\xa6\\x39\\xd7\\x5c\\xdb\\xf6\\x84\\x36\\xbb\\x84\\x14\\x15\\xd9\\x80\\x5a\\x71\\x31\\xd5\\xe2\\x57\\xd7\\x78\\x27\\xd0\\x98\\x9a\\x02\\x0d\\xaa\\xc3\\x04\\x2a\\x67\\x84\\x10\\xe0\\xde\\x5e\\x1b\\x43\\x8c\\xba\\x3c\\x9f\\xc3\\x0a\\xee\\x88\\xab\\xfc\\x92\\xef\\x90\\xed\\xc6\\x15\\x91\\xdb\\x4e\\x0c\\x54\\xb0\\xf5\\x93\\x4a\\xa5\\x3f\\xb6\\xff\\x7a\\x91\\xdb\\xb6\\x07\\xbb\\xd1\\xb6\\xcd\\x9d\\x24\\x78\\xe7\\xff\\x04\\x6c\\xf1\\xba\\xce\\xff\\x3d\\xe4\\x92\\xd3\\x87\\x00\\x37\\xfe\\x1d\\xc0\\x95\\x20\\x80\\x2d\\xee\\x30\\x40\\xc7\\xe0\\xd2\\x0c\\xcb\\x79\\xdb\\x6c\\xb7\\x4b\\x62\\xcd\\x35\\x14\\x6d\\xb7\\x4b\\xc7\\x73\\x97\\xcf\\xb7\\x82\\x21\\x10\\xf2\\x89\\x23\\x9e\\x9e\\x11\\x0b\\x19\\x7d\\xba\\x1f\\x0e\\x2f\\x59\\x2c\\xc8\\x1d\\xdd\\xfb\\x49\\x00\\x33\\x2e\\xfd\\x99\\xef\\x96\\x1a\\xfe\\xd1\\x10\\x43\\xae\\x2c\\xa6\\xcb\\xa5\\xdf\\xd9\\xf6\\x6c\\x27\\xc1\\xf8\\x6e\\xd9\\x41\\x31\\x69\\x9a\\xd8\\xb6\\x65\\x3e\\xc3\\xbe\\xdc\\x7a\\xfe\\xdc\\x92\\xb7\\xe1\\xce\\xfa\\x74\\x84\\x6c\\x0d\\x25\\x09\\xac\\x05\\x78\\xf5\\x65\\x46\\x60\\xb3\\x58\\x80\\x3e\\x6b\\x12\\xa0\\x2e\\x9f\\x7a\\xc8\\x24\\x9b\\xd4\\xb6\\x67\\xfb\\x5e\\xad\\x90\\x2f\\x6b\\xce\\xaa\\xb8\\x7c\\x2c\\x44\\x76\\xfd\\xac\\x0b\\x1c\\xa0\\xc3\\x98\\x6a\\x87\\x14\\xe6\\xc9\\x94\\xc3\\xa0\\xec\\x73\\x68\\x91\\x05\\x77\\x63\\xdb\\xa9\\x81\\xcb\\xab\\xac\\xb8\\xca\\x88\\x5e\\xd2\\x4e\\x42\\x28\\xe7\\x02\\x38\\x10\\x52\\x67\\x2b\\xc1\\x63\\x0f\\x15\\x81\\x19\\x6a\\x1f\\x64\\x8d\\xba\\x09\\x30\\x04\\x0c\\x4b\\x42\\xa7\\x85\\xe1\\x94\\x15\\x5e\\x1e\\x06\\x95\\x39\\xdb\\x01\\x77\\xca\\x05\\xdf\\x8f\\x9b\\x26\\x0f\\xe0\\x9e\\xde\\x6a\\x3f\\x2c\\x15\\xb5\\xcb\\x93\\x38\\xdd\\x0d\\xa1\\x32\\xbe\\x75\\x8b\\x86\\x19\\xba\\x37\\x03\\x76\\x5d\\x5f\\xc6\\xab\\xa1\\x3b\\x8a\\xd7\\xe5\\xe6\\xf0\\xf1\\xe0\\xde\\x13\\xdb\\xfe\\x3f\\xa3\\xf7\\xd9\\xaf\\x12\\x24\\xee\\xe7\\x67\\xa4\\x45\\x8c\\xfb\\xbe\\x97\\xfe\\x97\\x16\\xb9\\xa1\\x2b\\xdb\\x76\\x2a\\x7a\\x6f\\x34\\x09\\xf7\\xb4\\xea\\xc4\\xca\\x4a\\x6d\\x1e\\x02\\x77\\xd4\\x28\\xea\\x5a\\xe4\\xe5\\xca\\xb6\\xad\\xb2\\xb0\\xe6\\xf7\\x10\\xd2\\xd0\\xef\\x8e\\x52\\x02\\x2f\\xc4\\xab\\xad\\x8b\\xa5\\x5c\\xc8\\x7b\\x38\\x53\\xcb\\x84\\xb6\\x1d\\x0a\\x0e\\x2d\\x3b\\xbe\\x91\\x5d\\xa3\\xdc\\x7b\\xe1\\x7e\\x0c\\xc6\\x14\\xd0\\xaa\\xc7\\xc5\\x66\\xfa\\xbf\\x2a\\xc1\\xbc\\x75\\xaf\\xde\\xe4\\x0e\\xac\\x7e\\x77\\x07\\xba\\x52\\xab\\x21\\x24\\x8c\\x87\\xbc\\xee\\xec\\xa7\\x96\\x32\\x24\\x62\\xd3\\x38\\xfa\\x91\\xc6\\x82\\x87\\x55\\x07\\x7f\\x9e\\x1f\\x06\\xee\\x40\\x5b\\x00\\x7e\\x18\\x10\\x28\\xcf\\xb0\\xca\\xbd\\xc4\\x2a\\xbc\\x69\\x66\\xa5\\x9e\\xff\\xa6\\xe9\\x1e\\xbb\\x8b\\x60\\x23\\x09\\xfc\\xd2\\x6f\\x5a\\xec\\xfb\\x59\\xb9\\x2c\\x4a\\xc9\\xf0\\xd9\\x36\\xaa\\xb0\\x7f\\xc9\\x8a\\xb8\\x7c\\x74\\x62\\x22\\x2d\\x19\\x33\\x5a\\x0e\\xb0\\x54\\xd3\\xdc\\x83\\x5a\\xf1\\x6c\\x7e\\x2f\\xb9\\x8f\\xd4\\x34\\xc4\\xdf\\xa4\\x9b\\x51\\xca\\x41\\xe2\\xfd\\x94\\xc0\\x8e\\xa6\\x9b\\x1d\\xa5\\xd4\\x89\\xc7\\x5e\\x40\\x18\\x70\\x41\\xc5\\xcc\\x31\\x6f\\x5f\\x44\\x0b\\x41\\xac\\x4a\\xf6\\xab\\x69\\x18\\x69\\x93\\x2e\\xea\\x82\\x93\\xd2\\x83\\xbc\\xe6\\xc0\\xb6\\x67\\x62\\x81\\x7f\\xaa\\xca\\x03\\x4b\\x31\\x7e\\xe4\\xeb\\xba\\x3c\\x1c\\x84\\x00\\x48\\xd4\\xa5\\x9d\\xc9\\xcd\\xda\\xcb\\xdc\\xb2\\xc3\\xb2\\x62\\x28\\x7b\\xea\\x48\\x7a\\x91\\xf6\\xdb\\x10\\xb5\\xf3\\xbe\\x2c\\x14\\x68\\x7a\\x92\\x82\\x25\\x77\\xae\\x45\\x60\\x2f\\x70\\x95\\x0e\\xde\\x12\\x11\\xd8\\xd3\\x3b\\xdb\\x4e\\xfd\\xbb\\xc0\\xf8\\x22\\x38\\x81\\xfe\\x20\\xcf\\x49\\x31\\x14\\xbb\\x5e\\xff\\x41\\xe9\\x2e\\x55\\x9a\\x78\\x86\\x68\\x0a\\xcf\\x8b\\xfa\\x4b\\x39\\x0b\\x8e\\x11\\x24\\x45\\x8e\\xe3\\x5e\\xac\\xb3\\x18\\xac\\xca\\xf1\\x93\\xcc\\x2f\\x86\\x2a\\xd6\\xfc\\x5f\\x6a\\xfa\\x6c\\xbb\\x7f\\x56\\xed\\x1d\\x64\\xc0\\x55\\x0d\\x06\\x28\\xbd\\x19\\x9d\\x8c\\x49\\xd3\\xdc\\x8d\\xac\\x39\\x62\\xff\\x1e\\x27\\x77\\x00\\x1a\\x18\\x10\\x2d\\x16\\x03\\x16\\x88\\x57\\x3c\\xc8\\x73\\x61\\x38\\x43\\x01\\xf4\\x1e\\x44\\x0d\\xce\\xd4\\x27\\xb5\\x0b\\xba\\x2a\\x76\\xa4\\x9f\\x8c\\x16\\x4f\\x47\\x90\\x0d\\x1d\\x1e\\x8f\\x74\\xa0\\x9f\\x64\\x4f\\x8e\\x61\\x9e\\x3b\\x30\\xce\\x3d\\x37\\xe2\\xb9\\xd5\\xeb\\x2c\\x3d\\x03\\x87\\x4b\\x2d\\x43\\x21\\x06\\xea\\x72\\xf0\\xf1\\xde\\xea\\xbe\\x9e\\x5a\\x19\\x22\\x0b\\xdd\\xb4\\x58\\xbf\\x2b\\xe4\\xc6\\xc5\\x8a\\x67\\x77\\x62\\xf5\\xbe\\x54\\x3d\\x6f\\x9a\\xc1\\xab\\xe9\\xcc\\xa1\\xf6\\xe1\\x69\\xd7\\x35\\xa7\\xb8\\xaa\\xa3\\x99\\x0b\\x6e\\x05\\xa3\\xdd\\x01\\x7b\\x42\\x77\\x7e\\xa8\\x80\\x9d\\x5d\\x02\\xf6\\x13\\x5b\\x46\\x0f\\x95\\xd8\\x31\\xaa\\x63\\xc9\\x92\\xe7\\x7c\\x0f\\x91\\xb9\\x69\\x3a\\x81\\xe4\\x88\\x77\\xb1\\xeb\\x0a\\xbf\\xdd\\xef\\x79\\x9c\\xb1\\x9a\\x4f\\xd6\\xec\\xcc\\xd8\\x00\\x31\\x0a\\x26\\xd3\\x7c\\xd7\\x37\\x01\\xf6\\xac\\x01\\x46\\x0b\\x56\\x4d\\xfd\\x18\\xde\\xd2\\x54\\x4c\\x1b\\xab\\x19\\x4d\\xf1\\x07\\x38\\x75\\x9c\\xf1\\x74\\xa7\\x1d\\x17\\x22\\x8f\\xc9\\x54\\xf1\\xa6\\x49\\x75\\x9f\\x89\\x82\\x66\\x35\\xb0\\xcc\\xd0\\x5c\\x73\\x6c\\x50\\xed\\x27\\xae\\xad\\xa6\\xd1\\x3c\\x6b\\xb8\\xa7\\x40\\x5a\\x52\\x1b\\xe3\\x74\\x48\\x6f\\x3b\\x7c\\xb7\\x3c\\x94\\xc7\\x5a\\xaf\\x9b\\x6d\\x0f\\xdf\\x07\\xeb\\x08\\xac\\x87\\x58\\x3d\\xa7\\x97\\x4f\\x4d\\x74\\x94\\xb1\\x70\\xc8\\xea\\xa0\\xd9\\x87\\x24\\x00\\x78\\xdd\\xbb\\x6d\\x67\\xe6\\x45\\xcd\\x33\\xb6\\x94\\x41\\x40\\x9b\\xc6\\x42\\xa9\\x5a\\x9a\\xf3\\x63\\x60\\x0c\\x65\\x57\\x31\\xa3\\xca\\xf9\\x98\\x66\\x03\\x87\\x06\\x74\\x0d\\x13\\x50\\xdb\\x85\\x95\\x45\\x2b\\xa2\\x89\\x8a\\x10\\xdb\\xc7\\x32\\xa6\\xf4\\x6a\\xb3\\xc3\\x40\\x98\\x73\\x92\\xd0\\xd0\\x8f\\x82\\x81\\xd8\\x3a\\xb7\\xae\\x2c\\xe8\\x94\\x90\\xb1\\xcf\\xf1\\x04\\xc6\\xe7\\x01\\x4d\\x06\\x02\\x8f\\x57\\x38\\x5c\\xba\\xa6\\x29\\x2f\\xac\\x4c\\x90\\x7f\\xe5\\x9c\\xad\\x3e\\xa9\\x9b\\x8c\\xb2\\xee\\x26\\x23\\x02\\xb2\\xc2\\x2e\\x44\\xcc\\x26\\xee\\x38\\x3c\\x15\\x60\\xed\\x24\\x56\\xdd\\xcd\\xfa\\xd9\\x8e\\xdb\\x6e\\xe1\\x76\\x2f\\xc3\\xe9\\xec\\xd8\\x58\\x57\\x42\\x5b\\x12\\xef\\x48\\x4b\\x20\\x45\\x85\\xe2\\xe1\\xe8\\x5a\\x2c\\xaf\\xbf\\xe3\\xef\\xaf\\x42\\xa9\\xff\\xb8\\x8a\\x58\\x11\\xf1\\x5c\\x4c\\xda\\x55\\x54\\x57\\xb9\\xf8\\x34\\xd8\\x59\\x57\\x08\\x52\\x3f\\xed\\xd8\\x91\\x5f\\xed\\x79\\xcd\\x44\\x06\\x8c\\x82\\xc2\\x63\\x95\\x01\\xb9\\x1a\\x91\\x2c\\xd7\\xf6\\xaa\\xce\\xf6\\xfc\\x75\\xcd\\xf6\\x87\\xab\\x77\\x19\\x7f\\xbc\\x7a\\xdc\\x65\\xd1\\xce\\xd2\\xac\\xd0\\x95\\x45\\x20\\xc9\\x9e\\xa4\\xce\\x5b\\xc8\\xa7\\xfc\\xbd\\x7a\\x56\\xdd\\x8b\\x76\\x02\\x90\\x76\\xac\\xfa\\xa2\\x8c\\xf9\\xd5\\x1d\\x7f\\x2f\\xfe\\x8b\\xe7\\x51\\x15\\x23\\x47\\x6c\\x43\\xa1\\xa7\\xc3\\x46\\x60\\xc3\\xb8\\x2f\\xf0\\x49\\x47\\xb9\\x5b\\xea\\xca\\xbd\\xfe\\xd1\\x0d\\x97\\xaa\\x15\\x02\\xac\\x6d\\x01\\x15\\x3e\\xc3\\x7e\\x49\\xd8\\xbc\\x92\\x3f\\xc7\\xab\\x28\\xcf\\x78\\x51\\xff\\xaa\\x7e\\xff\\x79\\x55\\x26\\xc9\\x91\\xd7\\xbf\\xaa\\xdf\\x7f\\x5e\\x1d\\x58\\xca\\x7f\\xc5\\xbf\\xff\\xbc\\x3a\\x46\\x15\\xe7\\xc5\\xaf\\xea\\xf7\\x9f\\x57\\x75\\xa9\\xb4\\x34\\xbf\\x3f\\x24\\xf3\\x2c\\x32\\x54\\xfb\\x63\\x33\\x1a\\x27\\x36\\xa5\\xc3\\x45\\x85\\x4b\\xd5\\x33\\x0c\\xc8\\xa9\\xf7\\xdb\\x19\\x23\\x82\\x27\\x28\\xe7\\x77\\x42\\x47\\xcb\\xb0\\x8c\\xdf\\x83\\xaa\\xb3\\xaf\\x6c\\xee\\xa0\\xa7\\xf0\\x31\\xaa\\xca\\x3c\\x7f\\xc5\\x93\\x1a\\x23\\x5f\\xf1\\x41\\xc2\\x8a\\x2c\\x64\\x2e\\x59\\xc6\\xc8\\x65\\x26\\xe0\\x3d\\x4e\\x38\\x2d\\x5d\\xed\\xff\\x1c\\xd4\\xfe\\xa6\\x3c\\x0c\\x2a\\xc7\\xf7\\x51\\xdd\\x7d\\x1e\\xe3\\x7d\\x85\\xd7\\xb6\\xe0\\x52\\x37\\x4d\\xb7\\x73\\x93\\xa6\\xe9\\x00\\x60\\x6d\\x27\\xde\\xda\\x7d\\x61\\x27\\xde\\xc7\\xee\\x27\\x76\\xe2\\xbd\\x70\\x57\\x72\\xb9\\x93\\xec\\x69\\x6c\\x73\\xc4\\x0c\\xde\\xbb\\x0b\\x86\\x69\\xba\\xc9\\x28\\x8c\\x02\\x09\\x65\\x5a\\xe9\\xae\\xe1\\xda\\xe7\\xc1\\x26\\xd5\\x86\\x3f\\x46\\x22\\x4d\\xe9\\x2f\\x5a\\x41\\x22\\xcf\\x50\\x0d\\x38\\xfb\\xc7\\xf0\\x4b\\xbf\\x2f\\x5a\\x02\\x31\\x45\\xfb\\xcf\\xc3\\x51\\x7b\\x15\\x96\\x87\\xa3\\xb6\\x14\\x51\\x5f\\x88\\xdb\\x7f\\x02\\x46\\x4d\\x59\\x21\\x11\\xe4\\x75\\x64\\xf6\\x11\\xa2\\xf6\\x3e\\xf6\\xc3\\x00\\x98\\x1f\\x05\\x34\\xf1\\xa3\\xce\\x6a\\x87\\xf5\\x0c\\xbb\\x7e\\xa4\\x39\\x81\\x8f\\x65\\x38\\x65\\x09\\x4f\\x06\\xde\\xee\\xf2\\x74\\x1f\\xcd\\x68\\x4c\\xa9\\x72\\xb1\\xf2\\xd2\\xce\\xe3\\x11\\x12\\xe2\\xb2\\x16\\x14\\x29\\x74\\x4f\\x79\\xc9\\x62\\xf7\\xa4\\x19\\x74\\xbc\\xd1\\x49\\xc6\\x34\\x3f\\x9d\\x89\\x89\\x83\\x43\\x93\\x19\\xa5\\xff\\x72\\x88\\xf4\\x0c\\x95\\x5a\\x5d\\xe5\\x6e\\x9e\\xc8\\x80\\xe6\\x78\\x25\\x79\\x7f\\xc8\\x68\\xe8\\x20\\x2c\\xad\\xf1\\x6d\\x21\\xcc\\x1f\\xaa\\xdf\\x6b\\x88\\x9a\\x0d\\x89\\x02\\xaa\\x1d\\xf1\\xf8\\xfb\\xcd\\x94\\x0f\\xb5\\xd5\\x02\\x12\\xa2\\x0f\\x34\\x64\\xe9\\xb3\\x03\\x8b\\x4a\\x22\\xa7\\x22\\x6b\\x49\\x8b\\x18\\x51\\x58\\xb0\\xac\\x3a\\xac\\x8e\\x62\\xf0\\x94\\xd2\\x5f\\x7b\\xd9\\x8b\\x5c\\xa3\\xfe\\x68\\xd6\\x78\\xda\\xaf\\xaf\\xab\\x4e\\x2f\\x1d\\x58\\xcc\\x12\\xf2\\x79\\xc8\\x93\\xb2\\xe2\\xf2\\xba\\x76\\xf7\\x64\\xb2\\x05\\x43\\x83\\xf2\\xde\\xe9\\x5e\\xb2\\x07\\xb6\\xcd\\x90\\xb1\\xc9\\x0a\\x96\\xab\\x4b\\xe0\\x9d\\x51\\xca\\x52\\xb6\\x8e\\x2a\\xfa\\xae\\x1c\\x69\\xdb\\x16\\x8e\\xd9\\xfe\\x21\\x1f\\x78\\x69\\x28\\xcd\\x58\\xef\\xfb\\xa7\\x34\\x99\\x06\\x74\\x43\\x04\\x52\\xaf\\xc9\\x20\\x3b\\xbe\\x56\\x35\\x60\\xac\\xe7\\x41\\xab\\xee\\xa9\\x6d\\xc9\\x26\\xf6\\x46\\xfc\\xb9\\xc3\\xf5\\xb5\\x8b\\xee\\x99\\x5e\\x58\\xa9\\x13\\x38\\x01\\x3e\\x29\\x85\\xa0\\x3b\\xfb\\x88\\xe1\\x6a\\xa5\\x71\\x6c\\xa7\\x70\\x39\\xb3\\x1d\\x9d\\x34\\x14\\x16\\xb3\\x36\\x65\\x3f\\x2c\\x06\\x3f\\x5b\\xa3\\xc1\\xed\\x79\\x6d\\x03\\x08\\x1d\\x04\\xac\\x90\\x99\\x3d\\x07\\x3d\\x02\\xea\\x3e\\x0a\\xc3\\x60\\x42\\x74\\x0c\\x06\\x94\\xb5\\x14\\x2a\\xc3\\x84\\xf3\\xa1\\xd2\\x2e\\x5c\\x53\\x97\\x64\\x20\\xd8\\xf3\\x8f\\x72\\x38\\xfd\\x22\\x0b\\xf6\\xd4\\xfb\\x1f\\xf7\\x99\\x42\\x51\\xb2\\x45\\x08\\xa5\\x16\\xb9\\xb3\\x49\\x84\\x50\\x99\\x91\\x76\\xec\\x03\\x95\\x03\\xd0\\xaf\\x4d\\x23\\x00\\xf6\\xd1\\x91\\x8c\\xb0\\x3c\\x2b\\xee\\x71\\x34\\x9d\\xad\\x08\\x19\\xa8\\x48\\xa4\\x15\\x91\\x7a\\x33\\x2d\\x4c\\xcf\\x47\\xe8\\x3e\\x83\\x29\\x39\\x03\\x93\\x3f\\x20\\x2d\\xb8\\xcf\\x60\\x08\\x00\\xe7\\x4e\\x40\\xe7\\x13\\xbf\\xb9\\x34\\xcb\\xff\\x23\\x5d\\x38\\x86\\x35\\x9e\\xa7\\x38\\xa4\\x85\\x11\\x53\\xff\\x9f\\x34\\x7b\\x3e\\x0a\\xdd\\xf0\\xa8\\xd2\\x89\\x24\\xdd\\xf4\\xd4\\x94\\xfc\\x27\\x7d\\xf8\\xc0\\x94\\x9a\\x9d\\x99\\xca\\xf6\\xa1\\x6f\\xca\\x39\\x6f\\xa2\\xd7\\xad\\x76\\x00\\x3a\\x21\\xc1\\x15\\xf3\\x5d\\xb9\\x16\\x3e\\x97\\xef\\x78\\x65\\x49\\x7e\\x2f\\xe7\\xec\\x1d\\xd7\\xc9\\x0f\\xb5\\x05\\xea\\xc0\\x4f\\x65\\x57\\x6f\\xb2\\x80\\x7a\\x51\\x45\\xf4\\x27\\xc4\\xf4\\x63\\x5f\\xe6\\x91\\x9c\\x1d\\xd0\\xd3\\x80\\x48\\x84\\xa0\\x35\\x35\\x6e\\xa8\\x78\\xf7\\x33\\xa7\\x9d\\x08\\xa4\\x8d\\x2b\\x48\\x8c\\x69\\x30\\xdf\\x18\\x33\\xb7\\x13\\x3d\\x15\\x05\\xc7\\xfb\\x75\\xb9\\x34\\x7e\\x37\\x4f\\xae\\x75\\x0c\\x67\\xa6\\x34\\x45\\x9d\\x0c\\x6a\\x1e\\xde\\x4d\\xfb\\x8e\\x81\\x2a\\x13\\x12\\x88\\xd0\\xe2\\x7b\\x7c\\x8e\\x2a\\x76\\xa7\\x9c\\x62\\x49\\xbb\\x3b\\x12\\x2b\\x29\\xac\\x49\\x0a\\xa7\\x2c\\x48\\xcc\\x11\\x77\\x53\\xa6\\xb0\\xb9\\x13\\x42\\x47\\x9f\\x86\\x7a\\x11\\xb4\\x93\\xda\\x8c\\xa7\\x38\\x0c\\xe8\\x09\\x8f\\x8c\\xc6\\x30\\xa9\\x0c\\x85\\x47\\xbc\\xb0\\x9a\\xd8\\xce\\x92\\x26\\x46\\xa3\\xe8\\xa6\\x89\\xcf\\xcf\\x91\\x18\\xe0\\x85\\x83\\x60\\xe6\\x05\\x87\\x0b\\xde\\x73\\x2e\\xf0\\xb4\\x56\\xc7\\xff\\xef\\x1b\\x5e\\xac\\x37\\xdc\\x1b\\x54\\xcf\\x89\\x8b\\x71\\x7a\\xcf\\xc9\\x43\\xdf\\x1b\\xa5\\x64\\x17\\x15\\x90\\xf6\\xcc\\x6e\\x67\\x70\\x5f\\xc7\\xd9\\x59\\xd3\\xd0\\xef\\xa2\\x8f\\xd3\\x74\\x66\\x12\\x12\\xa2\\x44\\x11\\x35\\x4d\\x08\\xda\\xbf\\xd6\\x88\\xd3\\xcf\\xa4\\x81\\x73\\x59\\x38\\x29\\x36\\xc1\\xfc\\x34\\x00\\x3e\\x8c\\x46\\x94\\x25\\x2a\\x3a\\x46\\x24\\xa5\\x15\\x4a\\x63\\xcf\\x89\\x69\\x08\\x51\\xe7\\xb1\\x2b\\x75\\xc8\\xd2\\x6d\\xe3\\xdc\\xee\\x5b\\xe4\\x8e\\x20\\xea\\xf2\\xaa\\x57\\xa3\\x43\\x82\\x57\\x46\\x9d\\x53\\x4c\\x9f\\x75\\xe6\\xf0\\xb3\\x78\\x10\\x98\\xca\\x70\\x98\\xe0\\x78\\x78\\x1d\\x43\\x3c\\xe9\\x40\\xe5\\x48\\x3f\\x21\\x46\\x20\\x99\\xde\\x15\\x2d\\xc4\\xf2\\x7c\\x30\\xd1\\xe7\\x86\\xc9\\xe8\\x88\\x5b\\xbb\\x46\\x9c\\x99\\x09\\x49\\x90\\x65\\x71\\xac\\x95\\x60\\x31\\x44\\xca\\x36\\xb0\\x2c\\xa6\\x58\\x20\\xd3\\x5a\\xc8\\x58\\x48\\x01\\x76\\x65\\x92\\x5c\\xf2\\x25\\x10\\xab\\x7b\\x81\\xac\\x74\\x58\\xa3\\xbb\\x89\\xd9\\x44\\x25\\x50\\x38\\x63\\xe5\\x9f\\x9c\\x8d\\xd8\\x38\\x27\\x88\\x3b\\x0c\\x32\\xb7\\x96\\xd6\\xdc\\xf8\\xe4\\xf6\\x9f\\x8c\\x30\\x6b\\x10\\x77\\xda\\x2d\\xa8\\x75\\x8c\\xb0\\x09\\xd8\\xc3\\x60\\xd5\\x26\\x54\\x25\\x89\\xc3\\x21\\x04\\xe6\\xf3\\xc9\\x00\\x57\\x78\\x45\\xfc\\x6c\\xdd\\x34\\x13\\xb1\\x70\\x43\\x79\\x35\\x85\\x01\\x23\\xe8\\x46\\x88\\x1a\\xb3\\x88\\x3e\\xfb\\x9d\\x05\\x1a\\x98\\x53\\x76\\x2b\\x74\\xc6\\xc5\\x9f\\x85\\x96\\xb9\\x54\\x9f\\xe6\\x3b\\xc5\\x2a\\xa1\\xd6\\xc8\\xa8\\x4e\\x79\\xaa\\x5d\\x74\\xb4\\x30\\x03\\x0a\\x9e\\x31\\xb2\\x12\\x1e\\x66\\xab\\x8e\\xf5\\x57\\x56\\x54\\x8c\\xd1\\xeb\\x97\\x8e\\x37\\x63\\x15\\x67\\x4d\\x58\\x35\\x51\\x99\\x37\\x7c\\x1f\\xf2\\xb8\\xd9\\x55\\x4d\\xb6\\x4f\\x1b\\x94\\x21\\x9a\\x3c\\x2b\\xee\\x9a\\x3d\\xaf\\x59\\x73\\x60\\x15\\xdb\\x13\\xc7\\xf1\\xb7\\x8f\\x6e\\x30\\x97\\xc1\\xe0\\xc8\\xf6\\xfa\\xe6\\x3a\\xcd\\x20\\xc4\\xca\\xd4\\x97\\x6b\\x88\\xc4\\x6b\\x63\\xff\\xc9\\xdb\\x3e\\xce\\x37\\xd7\\x10\\xcb\\xa6\\xdc\\x63\\x54\\x65\\x87\\xba\\x39\\xd6\\xef\\x73\\x8e\\x15\\x93\\xeb\\x0c\\x38\\xa3\\xd7\\xca\\xee\\x67\\x7b\\x7c\\xee\\x78\\xae\\xff\\x96\\x06\\x0d\\xdd\\x1e\\x9f\\x6b\\x73\\xa0\\xa5\\xc8\\x96\\x30\\x7a\\xfd\\xf6\\x59\\xb3\\xbd\\x76\\x3c\\xf7\\x96\\xbd\\x63\\x0d\\x8f\\xf6\\x8c\\xc8\\x1a\\xaf\\x33\\x48\\xc5\\xe7\\xba\\x7a\\xe0\\xdb\\x6b\\x67\\xf9\\x9c\\x5c\\xc3\\x4e\\x24\\x6c\\x8f\\xcf\\x5f\\xce\\x1c\\xcf\\xdd\\xfa\\x5f\\x7c\\xf9\\xd9\\x9b\\xcf\\xb6\\x7e\\xb3\\x58\\x90\\x46\\x24\\x04\\xdb\\x40\\x3c\\xdf\\x6c\\x8f\\xcf\\x9f\\x5d\\xa7\\x90\\x31\\x7a\\x92\\xb7\\x42\\xb9\\xfe\\x1a\\xac\\x97\\x12\\x2e\\xaf\\xf6\\x0f\\x79\\x9d\\x1d\\x72\\x4e\\x3f\\xd2\\x4f\\x1f\\xdd\\x58\\x60\\xbd\\xbc\\x96\\xdf\\x6f\\xac\\x00\\xea\\x1d\\x67\\xb1\\x2c\\x84\\x11\\x70\\xe5\\x77\\xf5\\x18\\x40\\x54\\xe6\\xae\\xff\\xa2\\xfb\\xf8\\x32\\x2a\\xf3\\xb4\\x2a\\x1f\\x0e\\x32\\x5b\\xf7\\x66\\x94\\xa8\\xab\\x41\\x81\\x3a\\x2c\\xe3\\xf7\\xaa\\x52\\x7c\\x34\\xb3\\xc6\\xae\\xff\\xf1\\x38\\xeb\\xcb\\xba\\x52\\xd9\\xab\\x9b\\x89\\x32\\x9d\\xdc\\xe7\\xaf\\xc0\\xb2\\xc0\\xb2\\x82\\x76\\x93\\xb1\\x65\\x79\\xa8\\xb1\\x27\\x54\\x3e\\x67\\x65\\x01\\x19\\x5b\\x62\\x69\\x91\\x54\\x27\\x65\\x59\\x8b\\x07\\xdd\\x63\\x7c\\x66\\x98\\x11\\xbf\\x8b\\x59\\xc0\\x12\\x3b\\x7c\\x8d\\x7b\\xd3\\xa5\\x5b\\x36\\xd4\\xc1\\x19\\xb2\\x25\\x58\\xd8\\x2d\\x8b\\x0c\\x24\\xd8\\xf3\\x00\\x44\\xa1\\x19\\x94\\xc6\\xaa\\x2b\\x8b\\xc8\\xeb\\xce\\x95\\x7a\\xea\\xf8\\xf9\\xfb\\x37\\x2c\\xc5\\xb2\\x16\\xf6\\xd8\\x22\\xfe\\x2a\\x40\\x1b\\x10\\xc3\\x26\\x6d\\x64\\x9d\\x37\\x36\\x93\\x53\\x05\\x89\\xcb\\x7a\\x4b\\xaa\\xbb\\xe1\\x2d\\x1f\\xc8\\xe7\\x38\\x52\\x9b\\x76\\xe9\\xb6\\xa8\\xb9\\x75\\x6d\\xcd\\x95\\xd4\\x64\\xd4\\x94\\xb3\\xde\\xcd\\x3a\\x65\\x2a\\x50\\xa1\\x54\\x3c\\x77\\xa7\\x5b\\x9e\\xe6\\xa4\\xfc\\x75\\xe0\\x6a\\xb9\\xef\\xac\\x05\\xb3\\xd6\\x3d\\x3b\\xbb\\x01\\x0a\\xe2\\xfe\\xb6\\x91\\x58\\x29\\xb1\\xa5\\x45\\x3f\\xf3\\xa3\\x00\\x2c\\x69\\x72\\xf2\\xd5\\x3b\\x96\\x5b\\x30\\x0b\\x9b\\x46\\x9e\\x0a\\x85\\xe3\\x6f\\xc4\\x88\\x97\\x5f\\xb0\\x09\\x3d\\xbe\\x34\\x44\\xd9\\x9c\\x5d\\xc6\\x82\\x2a\\xb2\\xa1\\x41\\x8a\\x93\\x18\\xf6\\xdf\\x04\\x52\\x2a\\xfb\\x13\\x42\\x42\\xe0\\x96\\x26\\xbd\\x71\\x8a\\xf6\\x36\\xd2\\x36\\x02\\x69\\x6f\\xf3\\xb5\\xe9\\x10\\xff\\xad\\x0a\\x88\\x26\\x46\\x7a\\xeb\\xf3\\x60\\x3c\\x58\\x93\\x80\\x86\\xc0\\x41\\xe4\\xf1\\xa3\\x80\\xb4\\xdf\\x0f\\x3b\\xb5\\xa3\\xdf\\x1b\\x9d\\xca\\xa8\\x19\\xf6\\x66\\x47\\xe0\\x7b\\xd5\\xc7\\x4c\\xf0\\x4d\\xdd\\x54\\x94\\x83\\xab\\x03\\xa6\\x61\\xf0\\x12\\x68\\xca\\x8b\\x47\\x88\\xcb\\x96\\x18\\xc7\\x4c\\xc7\\x5b\\xfb\\x2c\\xcf\\xbd\\xf3\\xa4\\x2e\\xb7\\x3f\\xe1\\x32\\x87\\xbe\\x6f\\x83\\x7d\\x14\\x12\\xaf\\x8b\\xa1\\xc4\\xd0\\x2f\\xd4\\xb8\\xf1\\xe5\\x30\\xba\\xef\\xe0\\xc2\\x75\\x6c\\xfd\\xed\\x69\\x91\\x6d\\xbf\\xd1\\x37\\xbc\\x21\\x88\\xa2\\x3e\\x5c\\xda\\x58\\x76\\xd7\\xe8\\xb9\\x8e\\x51\\x40\\xdd\\x91\\x26\\x48\\x09\\xbe\\xcb\\xd3\\x5e\\xd3\\xe6\\x92\\x0e\\x23\\x3b\\x13\\xc3\\xb5\\x08\\x4d\\x36\\x2f\\xb1\\x29\\xea\\x58\\x93\\x0d\\x0d\\x3b\\x71\\xbd\\x3e\\x60\\x77\\x8b\\x6e\\x9e\\xce\\xd8\\x40\\xb4\\x69\\x86\\xc1\\xd2\\x54\\xac\\x33\\xd3\\x17\\xb6\\x0f\\xaa\\xec\\x30\\x22\\x0f\\x97\\x52\\x5a\\x32\\x67\\x47\\x20\\x11\\xbf\\x8c\\xa8\\x28\\x7f\\xc9\\xf8\\xda\\x9d\\x03\\x73\\x12\\x3f\\x0e\\x20\\xf5\\xe3\\x40\\x86\\x30\\xc6\\x98\\x7c\\x58\\x45\\x42\\x93\\xa6\\x91\\xa5\\x53\\x9a\\xe2\\xe3\\xee\\x62\\x45\\xc5\\xa0\\x22\\xe4\\x54\\x71\\x07\\xee\\xfa\\xab\\x74\\xb0\\x47\\x60\\x49\\xe2\\x67\\x11\\x48\\x8d\\x8b\\x11\\xf6\\xcc\\x49\\x61\\x96\\xd9\\x36\\xc2\\x6a\\x97\\x87\\xc0\\xae\\x85\\xf0\\x21\\xcb\\x63\\x6d\\x55\\x3c\\xc1\\x49\\x6a\\x3c\\x32\\xbc\\x59\\x2c\\xbc\\x6c\\x96\\x9c\\xa3\\x85\\x1e\\x5d\\x41\\xd9\\x63\\x9d\\xf2\\x66\\xbf\\xd9\\xcb\\x50\\x4e\\x9c\\x32\\x7f\\x1f\\x00\\x97\\x97\\x68\\xa2\\xb7\\xdc\\xb9\\x23\\x37\\x27\\x44\\xc3\\x6e\\x0e\\xdc\\xb8\\x96\\x87\\x07\\x2e\\x27\\x1d\\xab\\x1e\\x31\\xad\\x06\\x27\\x27\\x9c\\xcf\\xbb\\x01\\x76\\x0f\\x2f\\x18\\x44\\xa7\\xd4\\x09\\x15\\xbe\\xe5\\xd2\\xd6\\x4d\\x90\\x3c\\x72\\x7e\\x8d\\xbe\\xa0\\x5b\\x7e\\x1a\\x34\\x4d\\xc6\\x3a\\xb3\\x01\\x48\\x0c\\x3b\\xe4\\x9d\\xbf\\x0e\\x8c\\x9b\\xb8\\x19\\x03\\xeb\\xe5\\xb3\\xf5\\xcd\\xcb\\xeb\\x67\\x2f\\x6e\\x2c\\x32\\xdf\\xf9\\x2f\\x02\\xb8\\xa5\\x3b\\xc1\\x8b\\xf5\\x16\\x74\\x89\\x58\\x5f\\x6d\\x84\\xbc\\xe9\\xc7\\x99\\x98\\x61\\xce\\x20\\xa1\\x77\\x26\\x85\\x4b\\xcc\\x6b\\x58\\xa9\\x65\\x49\\x0b\\xac\\x5c\\xc5\\xfb\\x51\\x03\\x7d\\xc3\\x9f\\x50\\x91\\x2e\\x26\\x64\\x73\\x37\\x2a\\x01\\xfd\\xc5\\x1c\\x9c\\xe6\\xdd\\x25\\x20\\xe8\\x9a\\xb3\\x58\\xe3\\xdc\\xeb\\x80\\x4b\\x78\\xdf\\x04\\x9a\\x09\\x9a\\x21\\x96\\x47\\x3b\\x8a\\x2b\\xf0\\x1f\\xce\\x39\\x27\\x06\\x0c\\x66\\x08\\x7a\\x09\\x81\\x88\\x90\\xd3\\xad\\xd1\\x7c\\xe2\\xdf\\x8a\\xe6\\x13\\xbd\\x7e\\xfa\\x5e\\x47\\x8b\\x74\\x61\\x3f\\x79\\x7f\\xf2\\x2c\\x7d\\x22\\x8a\\x33\\xdf\\x26\\xf3\\x3e\\x20\\x79\\xe8\\x35\\x12\\xee\\x21\\xa5\\xab\\x4d\\xa7\\x76\\x76\\x22\\x2a\\x56\\x93\\x60\\x50\\x31\\x19\\x9d\\xdc\\x30\\xf4\\x40\\xfc\\xc4\\x69\\xe4\\xbf\\xea\\xb4\\x84\\xe8\\xcb\\x13\\xd2\\x57\\x9d\\x03\\xb4\\xba\\x5c\\x21\\xd4\\xe4\\xa9\\xf7\\x83\\xee\\x52\\xfc\\x38\\xf0\\x46\\xe2\\x00\\xde\\xee\\x33\\xb4\\xac\\x13\\xfd\\x0d\\xb5\\x65\\xdd\\xa6\\x6f\\xa0\\x73\\x6d\\xed\\x93\\x5a\\x95\\xf2\\xbd\\x76\\x0a\\xf7\\xbf\\x37\\xdd\\x5c\\xc7\\xe2\\xfb\\xd9\\x65\\x98\\x6a\\x12\\xc7\\xfe\\x75\\xfd\\x97\\x5e\\x37\\xeb\\xc9\\x78\\xf2\\x98\\x53\\xa9\\x5f\\xe5\\x35\\xa1\\xe4\\x4c\\x42\\x41\\x0a\\x8f\\x39\\x7a\\x3c\\xb9\\x9e\\x48\\xfb\\xcb\\x38\\x89\\xe8\\x38\\xbb\\x26\\x70\\xb2\\xde\\xcb\\x8d\\x9d\\x79\\xfc\\x90\\x16\\x24\\x80\\x5d\\x38\\x6f\\x59\\xc6\\xe5\\xfe\\x7b\\x56\\x64\\x87\\xc9\\xa8\\x65\\xb8\\x60\\xff\\xeb\\xce\\x2a\\xee\\xec\\x96\\x69\\xd3\\x86\\xcd\\xd0\\xa7\\x81\\x91\\xb6\\x95\\x61\\x19\\xff\\x3f\\xd4\\xc1\\xac\\x38\\xf2\\xaa\\xfe\\x1c\\x0f\\x65\\x04\\x1e\\x1f\\x84\\x61\\x14\\xdd\\x95\\xe7\\x35\\xff\\xcb\\xde\\xca\\x83\\x43\\x23\\x08\\xf4\\x28\\x61\\xdc\\x7c\\x27\\xb7\\xb2\\xa4\\xbe\\x78\\x66\\xf6\\xff\\x46\\xa3\\x83\\x10\\xc3\\xed\\x25\\xf7\\x7c\\x33\\x52\\x2f\\xf3\\x8a\\xfe\\xd8\\xb1\\xdf\\x04\\xc0\\xe9\\x6a\\xa3\\xae\\x57\\x8a\\xd0\\xb8\\x83\\xe0\\x95\\x58\\xa1\\xe4\\x1d\\xa2\\x01\\xab\\xd0\\x61\\x2a\\xa7\\x64\\xe8\\xbe\\x18\\x0d\\x23\\x66\\x23\\x97\\xd6\\xe1\\xd4\\x68\\x84\\x53\\x05\\x12\\xda\\xcb\\xa2\\x26\\x99\\x36\\xeb\\x50\\x78\\x44\\xfb\\xd4\\x0c\\x15\\x1c\\xe7\\x01\\xf1\\xba\\xc0\\xc6\\x68\\x34\\xa5\\x46\\x21\\xd5\\xed\\x7e\\x18\\x10\\x0c\\x58\\x34\\x8e\\xbf\\xec\\x8c\\x86\\xc1\\xa4\\x39\\x3c\\x1b\\x11\\x94\\x51\\xd3\\xe7\\x2c\\x9b\\xe1\\x34\\xa5\\xe3\\xdc\\xce\\xd6\\x2e\\x53\\x11\\x53\\x28\\x0d\\x3d\\xe6\\x4a\\xc5\\x06\\xc6\\x2f\\x38\\x07\\x8d\\x42\\x72\\x78\\x43\\x67\\xd8\\x5d\\xbd\\x9f\\x0c\\xb9\\x3a\\x81\\xe1\\xe4\\xe6\\x50\\xda\\x10\\xb4\\x06\\x95\\x32\\x82\\xe1\\xf4\\x36\\xf4\\xcc\\x3e\\xbb\\xac\\xbb\\xb3\\x32\\xec\\x68\\xfe\\x74\\xa4\\x7a\\xdb\\x9e\\xc5\\xc6\\xb5\\x38\\xb3\\x8c\\xf9\\x1d\\x8f\\xc1\\x3e\\xc4\\x63\\x04\\xe4\\x64\\xde\\x71\\x3e\\xe2\\x20\\x30\\x12\\x09\\x5a\\x33\\x69\\x51\\x46\\x0d\\x27\\x92\\xc3\\x59\\x8f\\xae\\x4f\\x1a\\xaf\\x5c\\x28\\x57\\xce\\x74\\x9d\\x12\\x28\\x82\\xae\\x0c\\x9f\\xff\\x36\\x54\\xdb\\x49\\xe3\\x7a\\x89\\xe0\\xd0\\x55\\xff\\x32\\x4a\\x56\\x1d\\x1e\\x46\\x2e\\x3c\\x0b\\x66\\x67\\x28\\xa1\\x7e\\x77\\x9b\\x87\\x62\\x26\\x46\\xfb\\x1a\\x46\\xe3\\xc1\\x4d\\xa9\\xa2\\x97\\xa9\\x1e\\x28\\x56\\x4f\\xe3\\x19\\xf1\\xcd\\xd1\\x7c\\x27\\x5a\\xe3\\xe9\\xa5\\x34\\x3c\\x43\\x15\\x61\\x46\\x8f\\xcd\\x9a\\x8d\\x8e\\xa9\\xcd\\xfe\\x76\\xf6\\xe8\\xe8\\x62\\xad\\x7b\\x3f\\x02\\x72\\x46\\xb9\\x52\\xf8\\xfa\\x81\\x8e\\x8e\\x2a\\x08\\x7c\\xc7\\x2f\\xd3\\x15\\xe4\\x03\\x47\\xcb\\xbd\\x3c\\x9f\\x29\\x69\\xbe\\x58\\xc3\\x01\\x6f\\x36\\x80\\xfb\\x61\\xf4\\xbe\\x03\\xca\\x0b\\xf7\\x4d\\x93\\xdf\\xac\\x27\\x82\\x9a\\x1c\\x6c\\x7b\\x66\\x7a\\xd3\\xd9\\x36\\x57\\xe0\\x77\\x20\\xe4\\xb2\\x6a\\xb1\\x0b\\x48\\xba\\x5f\\xf2\\x7b\\x27\\x22\\x9b\\x7b\\x31\\x5b\\xfe\\x2a\\xa0\\x07\\xc3\\x82\\x2f\\x82\\x78\\x29\\x76\\x99\\x43\\x08\\x81\\xd8\\x58\\x34\\xdc\\x81\\xa2\\x5f\\x39\\xaa\\x43\\x8b\\xe5\\x40\\x78\\x50\\x48\\xd3\\x5f\\x05\\x23\\xac\\x36\\x53\\x31\\xfb\\xd1\\x8c\\xc8\\xe0\\x69\\x65\\xf0\\xf1\\x9e\\xe9\\xed\\xfd\\x16\\x22\\x1a\\x13\\xd0\\xe6\\xd6\\x89\\x0a\\xe3\\x3b\\xc4\\x8a\\x70\\x87\\x92\\x53\\x27\\x2a\\xe5\\x37\\xb7\\x9b\\xdb\\xf9\\x9c\\xec\\x68\\x04\\xb7\\x33\\x4a\\x4b\\x94\\xe7\\x35\\x06\\xd9\\xc1\\x6c\\x85\\xc7\\x1f\\xa9\\xc0\\xbf\\x92\\xe3\\x4e\\x60\\x28\\x32\\xe1\\x46\\xe9\\x66\\xc1\\xbf\\x0d\\x60\\x07\\xb7\\x44\\x5e\\x55\\x2b\\xcd\\xbe\\x13\\x3f\\xe9\\xaf\\x9d\\x18\\x0d\\x52\\xf6\\x31\\x81\\x9c\\x11\\xb1\\xe2\\x9b\\xb4\\xeb\\x4f\\x22\\xaa\\xd2\\xac\\xee\\xce\\x64\\x75\\x67\\x9d\\x0e\\x64\\x37\\xd4\\xb4\\x0c\\x88\\x44\\x06\\x3b\\x54\\x4e\\x2c\\x8f\\x55\\xe4\\x15\\xcb\\x7f\\xf1\\x77\\x2c\\xff\\x7b\\x95\\x8b\\x3c\\xfa\\x59\\x7e\\x14\\x5c\\x66\\x5f\\x8b\\x68\\xaa\\xc7\\xd7\\x1d\\x86\\xd9\\x31\\xb0\\x2c\\x32\\x8a\\x09\\x2b\\xdd\\xfe\\xf1\\x40\\x4e\\xee\\xfe\\x37\\xa5\\x6b\\xc9\\x27\\x4b\\x73\\x37\\x22\\x49\\x3d\\x5a\\x60\\xd2\\x5b\\xd7\\x92\\x0c\\x85\\x4e\\xfd\\x0c\\x09\\xbd\\x85\\xf4\\xde\\xd2\\x88\\xe2\\xb3\\x3c\\x77\\x2d\\x03\\x69\\x4c\\x1c\\x7d\\x8e\\xc2\\x38\\xb3\\x21\\x71\\xc6\\x6b\\x0c\\x0a\\x29\\x2e\\xf3\\x6e\\x15\\x60\\x87\\x53\\x4d\\x65\\x08\\xad\\x88\\xee\\xf0\\xba\\xd1\\x7e\\xa7\\xcb\\xd5\\x17\\x0b\\x5f\\x38\\xdc\\xdf\\x05\\xc4\\x0f\\x03\\x27\\xea\\x8f\\x68\\x62\\x88\\x64\\xe0\\xf6\\x01\\x31\\x33\\x82\\x33\\xc7\\x9d\\x87\\xf1\\x3d\\x83\\x8a\\x0d\\xe2\\x32\\x1f\\x99\\x33\\x88\\xc4\\x54\\x38\\xd1\\x48\\xe2\\x0c\\x89\\x46\\xa7\\x6f\\x4a\\x47\\x9a\\xcb\\x11\\x3c\\x84\\x4d\\xb9\\x3e\\x5c\\xf9\\xa2\\xdc\\x1f\\x1e\\x6a\\x1e\\xbf\\xae\\xdf\\xe7\\x1c\\x43\\x72\\x5c\\xfc\\x8a\\xf7\\x6c\\x13\\xe2\\xc5\\x4b\\xe5\\x6c\\xec\\x4a\\xef\\x63\\x91\\x6c\\x38\\x20\\x6f\\xfa\\x80\\xa4\\x88\\xdd\\x1c\\x02\\xc9\\xf8\\x96\\x62\\x49\\x19\\x73\\x88\\x68\\xc5\\x7c\\xd6\\x9f\\x14\\xe0\\x95\\xd8\\xf2\\x02\\x69\\xa2\\x9c\\x9c\\x65\\x54\\x0a\\xf1\\xe5\\x9e\\x51\\xe7\\x9e\\x35\\x4d\\xe1\\x58\\x2f\\xb3\\xa4\\x62\\x7b\\x7e\\x85\\x7f\\xc3\\xb2\\x8a\\x79\\x45\\x3f\\x5a\\x7d\\x74\\x85\\xd7\\x9b\\xe1\\x93\\xbc\\xef\\x4c\\x3c\\x5e\\xdf\\x58\\xe6\\x34\\x84\\x63\\x4b\\x42\\x02\\x21\\xbd\\xc7\\x5b\\x5b\\x47\\x41\\xc0\\x21\\x5c\\x3e\\x56\\x59\\x2d\\x24\\x71\\x74\\xe2\\x55\\xf1\\x72\\x74\\xf7\\xee\\x59\\x37\\x40\\x02\\x38\\x0c\\x1a\\x11\\x88\\x5a\\xbc\\xdb\\x8a\\xd1\\xeb\\xb7\\x7b\\x56\\xa5\\x59\\x71\\x0d\\xef\\xa4\\x85\\x9b\\xf6\\x51\\x79\\xeb\\x58\\xf3\\xff\\x9e\\x5b\\xc4\\xf1\\x66\\x87\\x27\\xe2\\xb3\\xc5\\x6f\\xff\\x15\\xcc\\x9f\\x59\\x60\\x65\\x16\\x81\\x47\\x36\\xe5\\x2f\\x3a\\xba\\xa1\\xc5\\xf4\\xc6\\x58\\x96\\x07\\x5e\\xf0\\x6a\\x7c\\x89\\xcb\\x20\\x4b\\xca\\x47\\x0b\\x19\\x82\\x8c\\x19\\xc7\\x2e\\x7e\\x32\\xc0\\xec\\x89\\x5d\\xd2\\x7f\\xe1\\xa1\\x49\\xb7\\x76\\x34\\x6a\\x9a\\x47\\x54\\x28\\x45\\xb6\\xed\\xa4\\x14\\x21\\x5b\\x07\\x68\\x43\\x0d\\x9b\\x13\\x92\\xa6\\x89\\xd0\\x5f\\x46\\x64\\xb1\\xc4\\xda\\xa6\\xc8\\xb5\\x5e\\x56\\x9b\\xa1\\x37\\x4b\\x21\\x9b\\x92\\x77\\x1b\\xc0\\x3b\\x85\\xcb\\x52\\x62\\xdb\\x0f\\x4c\\xdf\\xa0\\x85\\xb0\\xbb\\x5b\\x22\\x04\\x00\\xa7\\xbb\\xe5\\x3e\\x2b\\x7e\\xc1\\x97\\x44\\xbc\\xb0\\x27\\xf9\\xd2\\xa7\\x1b\\xa9\\xba\\x1c\\x4d\\x41\\xf4\\xfb\\x51\\xe5\\x94\\x69\\xb1\\x59\\x86\\x83\\x51\\x2a\\x21\\x86\\x9d\\x7b\\xea\\xa5\\x73\\xcb\\x72\\xd3\\xf3\\x4b\\x5d\\x55\\xec\\xb9\\xc9\\x88\\x74\\x57\\x4c\\x5f\\x34\\x67\\x06\\x95\\x12\\x59\\xbb\\x5b\\x1d\\x68\\x48\\x2e\\x1c\\xe8\\xb6\\xed\\xd8\\x61\\x1f\\x55\\x11\\x34\\x9f\\x30\\x96\\x9d\\xf6\\xce\\x87\\xe4\\xc2\\x07\\x0c\\x73\\x23\\x67\\x9d\\x9c\\xd4\\xc3\\x32\\x64\\xd1\\x5d\\x5a\\x95\\x0f\\x45\\xfc\\x45\\x9e\\x1d\\xa8\\xa5\\xf6\\xcb\\x22\\x2c\\x9f\\x2c\\x48\\x46\\x7e\\xee\\xd3\\x45\\x2c\\xb8\\x43\\x96\\xaa\\x42\\xb6\\x01\\x41\\x6e\\x58\\x0f\\x46\\x1f\\x9a\\x2a\\x0b\\x5c\\x25\\x47\\xc7\\xe3\\x1b\\xfe\\x54\\x53\\x4b\\xee\\x7b\\x77\\xb5\\xc1\\x75\\x72\\x57\\x1b\\xb9\\xe7\\xdd\\xd5\\xa6\\x2e\\x0f\\xee\\x6a\\x93\\xf3\\xa4\\x76\\x17\\x7f\\xf9\\xcb\\x5f\\xfe\\x72\\x78\\xda\\xc8\\xcd\\xb8\\x10\\x5f\\xd6\\x87\\xa7\\xcd\\x41\\xdd\\xcf\\xe8\\xb2\\xf0\\x58\\xe6\\x0f\\x35\\xb7\\x80\\x0f\\x44\\xeb\\xc4\\x88\\xb1\\x99\\x3a\\xfd\\x1c\\x74\\xad\\x2f\\x1e\\x79\\x78\\x97\\x61\\xa7\\x17\\xc7\\xec\\xb7\\xac\\x48\\x5d\\xd9\\x21\\x91\\xb2\\x59\\xec\\xcb\\xdf\\x2e\\x7c\\x9a\\x4e\\xd5\\x28\\x35\\xcc\\xcb\\xe8\\x6e\\xd0\\xdb\\xff\\xda\\xa8\\x1f\\x35\\x5e\\xec\\x3e\\x8b\\x63\\x51\\x81\\x78\\x96\\xa3\\xff\\x64\\x7a\\x50\\xa6\\xb6\\xd0\\xb2\\x20\\x1e\\x29\\xcb\\x36\\x32\\xa8\\xf0\\x04\\x1e\\x48\\x24\\x1e\\xd8\\x84\\xd4\\x5a\\xff\\x17\\x6e\\xd4\\x65\\x5d\\x1e\\x20\\xa2\\xd6\\x27\\x07\\x5c\\xa5\\x54\\x6d\\x93\\x78\\x20\\x11\\x72\\xd2\\x9e\\x57\\x66\\x18\\xcf\\xdd\\xc1\\xe9\\x90\\x3d\\xf1\\x5c\\xdf\\x8f\\x39\\xb1\\x23\\x52\\x81\\x6f\\x5b\\x08\\xcb\\xa7\\xd7\\x38\\x4b\\x3f\\xf3\\x3c\\xbb\\x10\\x3e\\xbd\\x33\\xd0\\x10\\x65\\x22\\x21\\x15\\xc8\\xac\\xdf\\xe3\\xf4\\x61\\x68\\x8d\\xb1\\x74\\x10\\xa2\\xf9\\xd0\\x1f\\x88\\x5b\\xd1\\xe1\\xb5\\xd1\\xc2\\xff\\x11\\x40\\x30\\x00\\xfa\\x0c\\x12\\xcc\\x6f\\x17\\x92\\xa7\\x60\\xc1\\x5d\\x6d\\x3a\\x78\\xd7\\xab\\xbf\\xb2\\x40\\xf7\\x6e\\xdf\\x8f\\x98\\xea\\x34\\x89\\xbe\\xac\\x95\\x80\\x82\\x41\\xca\\xfa\\xf0\\x74\\x0e\\x0a\\x10\\xd2\\x19\\x06\\x66\\xfb\\x3a\\x2f\\x59\\xed\\x4c\\x80\\x44\\x24\\x41\\xc2\\x6c\\x8b\\x9c\\x2d\\x3f\\x24\\x23\\x0d\\x01\\x84\\x6d\\x4b\\xda\\x16\\xdd\\xcd\\x8e\\x8f\\xec\\x70\\x16\\x6f\\x55\\x19\\xcc\\xa2\\x27\\x8e\\x3a\\x55\\x4b\\x64\\x70\\xc7\\xd4\\x4f\\x02\\x4d\\x66\\xfc\\x24\\x80\\xfe\\x91\\x86\\x7e\\x12\\x6c\\x38\\x8d\\xba\\x80\\x08\\x32\\x4c\\x93\\x59\\xda\\xc8\\x2d\\x2a\\xea\\xd8\\x12\\x19\\x9a\\xef\\x37\\x41\\xa1\\x1d\\xc1\\x61\\x34\\x78\\xe0\\xeb\\x78\\xb3\\x45\\xe4\\x73\\x16\\x90\\xe5\\x9c\\x5c\\xc3\\x67\\x17\\x68\\xf6\\xf2\\x39\\xd1\\xa4\\xfa\\xf3\\x71\\x16\\x7f\\xbe\\x08\\x08\\x55\\x39\\x55\\xa6\\x2f\\x18\\x3d\\x75\\xdb\\xd2\\xea\\xf7\\xe5\\xbb\\xec\\x98\\x85\\x59\\x9e\\xd5\\xef\\x5d\\x6b\\x97\\xc5\\x31\\x2f\\x2c\\xd0\\xcb\\x6e\\xe1\\xba\\x5b\\x2d\\x7c\\xc9\\xe8\\x29\\xe7\\x75\\xcd\\xab\\xd7\\x07\\x16\\x89\\x15\\xc7\\xc5\\x2c\\x8b\\xfa\\x17\\x89\\xe9\\xac\\x4f\\x56\\x2b\\xab\\x85\\xaf\\x18\\xf5\\xad\\x5f\\x10\\x0a\\x2d\\xb0\\x7e\\xb4\\xc0\\xfa\\xbe\\xfc\\xcd\\x02\\x6b\\x7f\\xb4\\x82\\x1e\\x8b\\x7d\\xad\\xc8\\x51\\x96\\x38\\xa1\\x34\\x57\\xd1\\xdc\\x85\\x0a\\x5a\\x15\\xe2\\xd5\\xbe\\xe5\\xdf\\x0f\\x07\\xad\\x1d\\x98\\x6b\\xaf\\x9c\\xb5\\x10\\x9e\\x42\\xe0\\xf4\\x2b\\x36\\x34\\xcd\\xe7\\xd2\\x25\\x3f\\xa4\\x5f\\x31\\x9f\\x07\\xf3\\x08\\xc6\\x55\\x6b\\x73\\x9d\\x9e\\x2c\\xfe\\x75\\xc8\\x4f\\xd0\\xcf\\x94\\x9e\\x22\\xec\\xaf\\x43\\xf4\\xf0\\x16\\xf2\\x3d\\x7b\\x72\\x56\\x10\\xfb\\xeb\\x60\\xe1\\x44\\xe8\\x32\\x31\\x77\\x62\\xe9\\xdc\\x7f\\x78\\xb2\\x88\\x1b\\xf6\\x75\\x7e\\xc3\\x4c\\x63\\x31\\xcd\\xb7\\x27\\x34\\x42\\xcf\\x56\\x4f\\x91\\x0a\\xcb\\xd5\\xa4\\xc6\\x22\\xde\\x27\\xae\\x25\\x2f\\xc3\\xc5\\xb0\\x4d\\x6b\\x0c\\x11\\xbe\\xda\\x7c\\x72\\x93\\x6c\\x92\\x39\\x7d\\x41\\x2c\\x09\\xe5\\xea\\xec\\xd1\\x49\\xe7\\x5d\\xa8\\x9d\\x68\\xfe\\x33\\xba\\xe8\\xaf\\xf0\\x1a\\x96\\xd8\\x73\\xba\\x4a\\x75\\xde\\x45\\x1f\\x96\\x47\\x6d\\x55\\x6b\\x50\\x46\\xd7\\x3d\\x3b\\xcf\\xaf\\x3a\\x8a\\xd9\\xe7\\xd6\\x2f\\xf2\\xb6\\x5e\\x59\\x8c\\xb8\\x66\\x2f\\xa6\\x6a\\xee\\x13\\x67\\x67\\xbd\\xfe\\x60\\xcd\\xdd\\x29\\x5e\\x3f\\xa3\\xdf\\x8e\\x56\\x49\\xe4\\xa4\\xe6\\x8c\\xb1\\xa5\\xf4\\x1e\\xc2\\x9a\\x5c\\xfd\\xf6\\x0d\\x02\\x26\\x24\\xf4\\x51\\x1d\\x2d\\x5a\\x3d\\x8d\\x1b\\xc4\\x2b\\xea\\xd0\\xbb\\x25\\xe4\\xf3\\x04\\x19\\x8e\\xd5\\x0d\\xe5\\x4d\\x23\\x91\\xba\\xba\\xf7\\x8d\\x2a\\xee\\x33\\x21\\xe0\\xac\\x6e\\x8c\\xaf\\x78\\x5a\\xa2\\xb7\\xb8\\xe0\\x28\\xdf\\xf5\\x87\\x71\\x7a\\xa7\\x6f\\x62\\x9a\\xda\\xb6\\x73\\xb7\\x3c\\xa3\\x25\\x0e\\x69\\x1a\\x8e\\x6a\\xc7\\xbe\\x02\\x4e\\x0d\\xf4\\xc7\\x49\\xd3\\xac\\xba\\xe0\\x82\\x73\\x0d\\x5f\\x82\\x1b\\x9d\\x82\\x26\\x88\\x21\\x21\\x73\\x01\\x96\\xfd\\x0c\\xfe\\x6d\\x6c\\x09\\xa1\\x0e\\x89\\xf0\\xfa\\xb5\\x15\\x32\\xd0\\x6a\\x2b\\xed\\xd4\\x4d\\x33\\x31\\x1e\\x10\\x41\\x2c\\x3b\\x65\\xdb\\x18\\xaa\\x4a\\x85\\xb2\\x89\\xc1\\x2a\\xf3\\xb8\\x13\\xb2\\x30\\x36\\xaa\\x44\\xea\\x2a\\x0d\\x42\\x0f\\xf3\\x37\\x4d\\x2f\\x37\\x35\\x8d\\x33\\xca\\x45\\xbb\\xbb\\x94\\x47\\x1f\\x6c\\xfb\\xb5\\xf4\\x22\\x56\\x6d\\x76\\x46\\x9d\\x66\\xb3\\x50\\x33\\x27\\xee\\x0e\\xeb\\x09\\x91\\x71\\x5e\\x5f\\x63\\xcc\\x50\\x1d\\x91\\x2a\\xb2\\x6d\\xde\\x34\\xd2\\x9e\\x62\\x54\\x9a\\x7b\\x91\\x12\\x19\\x63\\x43\\x5e\\x24\\xea\\xa2\\xd4\\x14\\x7d\\x1c\\x2f\\xcc\\x44\\x68\\xdb\\xdd\\xb0\\xce\\x7a\\x6e\\x4d\\xa4\\x4e\\x0c\\x3d\\xf4\\xd4\\xfc\\x58\\xae\\xac\\x8b\\x0c\\xaf\\x26\\xd3\\x67\\xff\\xc7\\xa3\\x72\\x66\\x2a\\x05\\xd6\\xad\\xdf\\xbb\\xa7\\xf3\\x88\\xc2\\x78\\x98\\xae\\xcc\\x17\\x10\\x44\\x2d\\x95\\xb9\\x93\\x7f\\x55\\xe8\\x53\\x6b\\x6d\\xb9\\x51\\xdb\\xb6\\x2d\\x44\\xc7\\xe3\\x0f\\x0f\\xfb\\x90\\x57\\xee\\x29\\x2a\\xf3\\x87\\x7d\\x81\\x7e\\xa6\\xee\\x6c\\x05\\x49\\x96\\xe7\\x3f\\xaa\\xb6\\xc4\\x6b\\xce\\x9f\\xfe\\x5a\\x95\\x8f\\xfa\\xf9\\xf5\\xae\\xca\\x8a\\x3b\\x7c\\xeb\\x51\\xff\\x6c\\x05\\x79\\x56\\xf0\\x6f\\xba\\xb7\\xb2\\xaf\\x40\\xf2\\x09\\xf8\\x70\\xd8\\xb1\\x02\\xef\\x6e\\x7c\\xcc\\xe2\\xf2\\x11\\x9f\\x7e\\xfb\\x16\\x6f\\xc1\\x13\\x4f\\x65\\xb9\\x47\\x0f\\xa6\\xe8\\x88\\xa6\\xf6\\x47\\xf7\\x64\\x25\\x02\\xfc\\x05\\x68\\x1f\\x8f\\xb8\\x13\\xac\\x16\\x70\\x16\\x27\\x8e\\xe6\\xa5\\xb5\\xe6\\xc7\\x23\\xfb\\x85\\xff\\x33\\x7a\\x67\\x5a\\x8a\\x30\\x4e\\xf1\\xc7\\xa1\\x81\\xb3\\xb1\\x30\\x19\\x4a\\x44\\x81\\x9d\\xf2\\x77\\x01\\xc6\\xdd\\x37\\xde\\xe9\\xd7\\x0c\\xd5\\x52\\x02\\xc1\\xe0\\x07\\xe9\\xb4\\x16\\xe2\\x05\\x58\\xdd\\xeb\\x2e\\x00\\x23\\xf2\\x72\\x6a\\xdb\\x56\\xca\\x6b\\x2b\\x2b\\xae\\x52\\x23\\xe2\\xa5\\xc3\\x69\\xaa\\x42\\x14\\xce\\xd6\\x10\\x13\\xe2\\x71\\x37\\xf3\\xc3\\xc0\\x75\\x92\\x2e\\xfa\\xad\\x11\\x10\\x97\\x26\\x88\\x78\\x3e\\x57\\x34\\x2b\\x22\\xd2\\x60\\xd3\\xe1\\xfe\\x3a\\x98\\xaf\\xc9\\x73\\xee\\xbf\\x08\\xe6\\x06\\x1e\\xd1\\xf8\\x4e\\xc8\\xad\\x09\\xb5\\x0a\\x04\\x00\\x8b\\x80\\x3c\\x09\\x89\\x6c\\x3b\\x52\\x44\\x43\\x7f\\x9a\\xa1\\x17\\x20\\x16\\x93\\xd0\\x22\\x87\\x1f\\xcd\\x29\\x12\\xbd\\x73\\xf1\\x49\\xc0\\xb3\\xdc\\xeb\\x2b\\xb4\\x51\\xeb\\x02\\x74\\xf4\\xe2\\x93\\x85\\xf1\\xaa\\xfc\\x30\\xa0\\x56\\x56\\xec\\x78\\x95\\xa1\\x81\\x86\\x6d\\x5b\\xc7\\xd1\\x7c\\x50\\x3c\\xa5\\x4e\\x55\\x14\\x5e\\xb1\\xc8\\x5d\\xc9\\xa8\\x93\\x75\\x89\\x84\\xe5\\x4b\\x8e\\x4f\\x93\\x2b\\xfc\\x1f\\xac\\xab\\x82\\x84\\x3f\\xb2\\xba\\xc3\\x25\\x35\\x57\\x72\\x05\\x7d\\x7f\\xbb\\x48\\x99\\x8a\\x94\\xc4\\x04\\xb1\\x55\\xb5\\x67\\xb9\\x8a\\xa2\\x89\\x3c\\xcb\\x97\\x0c\\x33\\x7d\\x89\\xf7\\xd6\\x48\\x14\\x19\\x35\\x4d\\xe4\\x39\\xc9\\x90\\x2e\\x48\\x83\\xdc\\x95\\xb4\\xcb\\xf9\\xe1\\x61\\xcf\\xab\\x2c\\x72\\x12\\xe2\\x25\\x4d\\xb3\\x72\\x39\\x71\\xb9\\xa1\\xcd\\xf4\\x2d\\x29\\x92\\x5a\\xa0\\x28\\x67\\x70\\xa6\\x75\\x34\\x86\\x47\\xc7\\x78\\xc6\\x34\\xa5\\x8e\\xbc\\xdf\\x14\\x81\\x3b\\x0f\\xf9\\x47\\x6c\\x5b\\x3a\\x37\\x19\\x14\\xd9\\x93\\xdc\\xb6\\xc3\\xe0\\x0b\\xe3\\x96\\xf0\\xae\\xba\\x6f\\xf5\\x5c\\xb4\\xc4\\xed\\x9e\\x3b\\x47\\xbc\\xe3\\x44\\x3f\\xa4\\x57\\x5b\\x6c\\xdb\\x48\\xd9\\xf5\\x82\\x22\\x33\\x17\\x41\\xec\\x29\\x0a\\x19\\xc3\\x1f\\x23\\xf8\\x9c\\x00\\x27\\xee\\x4a\\x3b\\x00\\xe8\\x59\\x18\\xc8\\x31\\xef\\x99\\x73\\xb7\\x9c\\x10\\xe9\\x60\\xf2\\x90\\x2f\\xec\\x47\\x7c\\xea\\x38\\xe9\\xac\\x10\\x48\\x72\\xa1\\x19\\xea\\x27\\x06\\x3e\\xd3\\xec\\x97\\x8c\\xbc\\x18\\x18\\x01\\xd4\\x3a\\xbf\\x1b\\x29\\x71\\x59\\x16\\x68\\x49\\xcb\\xb2\\x40\\x49\\x5f\\x8a\\x73\\x3a\\x57\\x1f\\x77\\x0b\\xc9\\xe6\\x62\\x29\\xa5\\x8d\\x84\\x6b\\x1e\\x7d\\x68\\x46\\x40\\x1a\\x59\\x9d\\x5a\\x81\\x10\\xce\\x22\\x6d\\x7b\\x91\\xe1\\x66\\xed\\xfa\\x51\\xb0\\xf9\\x44\\x19\\x61\\x71\\x9f\\xcd\\x7f\\xf6\\xe3\\x40\\x54\\x9f\\xf8\\x71\\xd0\\x34\\x89\\x1f\\x2f\\x5e\\xe0\\xef\\xca\\x10\\x6f\\x5a\\x78\\x60\\xfd\\xe5\\xae\\xce\\xa8\\x67\\x62\\x6f\\xd3\\xbf\\x32\\x32\\x36\\xdc\\x18\\xef\\xe8\\xcb\\xe7\\x9a\\x23\\x5d\\xa0\\x18\\x88\\x20\\xdd\\x2a\\x92\\xbf\\x8e\\x0f\\xaf\\x83\\x17\\x48\\x3e\\x90\\xf7\\xa1\\xbc\\xb8\\x22\\xf1\\x89\\x1f\\xfa\\x69\\x10\\x74\\x00\\x22\\xde\\x24\\x0a\\xee\\x43\\xf9\\x0f\\x4c\\x44\\x30\\xd2\\xbd\\xa1\\x09\\x04\\x3c\\x70\\xd0\\xe8\\xb5\\x05\\x36\\x19\\xa2\\x98\\xb4\\x70\\xdc\\x95\\x8f\\x13\\xca\\x83\\xbf\\x29\\xa3\\x05\\x3c\\x5b\\xdb\\x65\\xf1\\x94\\x82\\x41\\xe5\\x21\\x2d\\xd4\\x65\\x9a\\xe6\\x53\\x21\\x51\\xad\\xb0\\x2c\\x73\\xce\\x0a\\x33\\xe4\\xb4\\x0a\\x3a\\x2d\\x1a\\x56\\x97\\x49\\x2d\\x45\\x03\\xfa\\x79\\x6c\\xcd\\xf2\\x5a\\x36\\xe2\\xc9\\x7b\\xb3\\x89\\x2e\\xa7\\x5f\\x65\\xd1\\x76\\x78\\xef\\xcb\\x77\\x03\\x89\\x47\\xeb\\x43\\xf8\\xe3\\xd5\\x77\\xac\\x77\\x1f\\xc4\\x3b\\xd0\\x8d\\x7c\\x6d\\xb1\\x7c\\xf3\\xc8\\x79\\x41\\xbf\\x63\\x60\\xe6\\xa3\\x27\\xe3\\xaa\\x71\\xf7\\x3b\\x06\\xa2\\xdc\\x84\\x1f\\x0e\\x24\\xca\\x16\\x82\\xe7\\x7c\\xaf\\x9d\\x32\\x0f\\x55\\x79\\xa0\\x91\\xf6\\x4c\\x38\\x66\\x05\\x5e\\xab\\x68\\x1d\\x1f\\x71\\xaf\\x4b\\x97\\x08\\x34\\xca\\x3e\\xd2\\x50\\xfb\\xbc\\xb1\\xaa\\xd6\\x96\\x24\\x8f\\xea\\x22\\x02\\xf4\\x4e\\x96\\x95\\x14\\x31\\x8d\\xe5\\xe3\\x03\\xde\\xe1\\xae\\xa1\\x58\\x11\\xc4\\x28\\xf0\\x04\\x0b\\x27\\xc8\\x61\\x0b\\xd1\\x43\\x75\\x7e\\x00\\x2c\\xc7\\x76\\x90\\x50\\xdf\\x75\\xb2\\xf7\\x19\\x17\\x5c\\x49\\xca\\x6b\\x69\\x16\\xab\\xec\\x8d\\xcc\\x32\\x7d\\x90\\x9e\\xee\\x7b\\x0b\\xd5\\xc3\\xc4\\x05\\x55\\x10\\xfd\\x5e\\x63\\xe6\\x04\\x2c\\xe3\\x87\\x0a\\xdd\\xfc\\x94\\x6b\\x7c\\x79\\xa4\\x82\\x22\\xca\\x59\\xf3\\x8d\\x19\\x0c\\xb4\\x11\\xc9\\xb8\\xe0\\x73\\x06\\x2b\\x58\\x4f\\x7f\\xd3\\x5e\\xf5\\x58\\xab\\x36\\x42\\x29\\x1f\\xa9\\xa3\\x67\\x75\\xd1\\xcf\\x3e\\x79\\x1e\\xce\\xfb\\xb7\\x61\\x7d\\xc7\\x9a\\x1f\\xd4\\x99\\xbc\\x99\\xd4\\x9f\\x4d\\xca\\x20\\x2f\\xba\\x7e\\x7d\\xd7\\xb5\\x6d\\x63\\x2c\\x56\\x2f\\xea\\x02\\x88\\x5f\\x9a\\xd4\\xee\\xbb\\xbc\\xdc\\xa9\\x85\\x33\\x98\\x35\\x40\\xd3\\xfc\\x06\\x66\\x7d\\xf4\\xd4\\xf9\\x0d\\x8c\\x08\\xa7\\x5a\\x9b\\x71\\xe8\\x09\\xd1\\x6b\\x5f\\x56\\x80\\x96\\xf8\\xe2\\x5d\\x0b\\x18\\xea\\x9e\\x36\\x23\\x4d\\xe7\\xf4\\x9c\\x50\\xe3\\x28\\x39\\x6e\\x99\\x0e\\x42\\x90\\x12\\x52\\x09\\x7b\\xa8\\x4b\\xc1\\x80\\x85\\x5e\\xe8\\xae\\x88\\x3b\\x6c\\x66\\x4c\\x4a\\xf1\\x9c\\xf1\\x09\\xa7\\xb3\\xab\\xff\\x2c\\x05\\xef\\x89\\x1f\\xf4\\xce\\x99\\xe8\\x9e\\xc1\\x38\\xa9\\x72\\x43\\xfe\\x48\\x25\\x92\\x1e\\x65\\x0e\\xba\\x2f\\x58\\xf4\\xc7\\x39\\xde\\xff\\x59\\x8f\\x7b\\x8d\\xfc\\xfb\\x63\\xdb\\x2d\\x8c\\x5a\\xbf\\x2e\\xc4\\x05\\x9d\\x48\\x7e\\xc5\\x93\\x1a\\x3d\\x19\\x87\\xb1\\xa1\\x64\\x8f\\x4d\\x69\\x00\\x13\\x06\\x36\\x49\\x53\\x8d\\x6b\\x37\\x58\\x44\\x27\\x27\\x41\\xc4\\x59\\x35\\x79\\x4f\\x67\\x0b\\x88\\x68\\x26\\xbe\\x2d\\x3f\\x5d\\xa0\\x1a\\x29\\x2a\\x8f\\x0e\\x7b\\x8e\\x8f\\x3f\\x7d\\x4b\\xae\\x5f\\x60\\xcd\\xc9\\x13\\x3d\\x03\\x3a\\xe8\\x56\\x82\\x9e\\xd4\\xfd\\x1d\\x0c\\xbe\\x67\\xf0\\x03\\x93\\xf1\\x72\\x25\\x09\\x68\\x04\\x76\\x6e\\x04\\x4e\\xc6\\xfb\\x3a\\xc6\\x4a\\x40\\xcf\\x55\\x7a\\xc0\\x86\\x68\\x9d\\xa1\\x3c\\xe2\\xeb\\x15\\x87\\x3f\\x31\\x7a\\xdd\\x07\\x9f\\x7e\\x76\\x0d\\xff\\xcd\\xa8\\xff\\x0f\\x16\\xc0\\xcf\\x8c\\x9e\\xac\\xe7\\x96\\xeb\\x5f\\x72\\xaa\\xd2\\x76\\xb6\\x02\\x87\\xf7\\xb1\\xe5\\x25\\xea\\xe4\\xf4\\xc7\\x4e\\x91\\x06\\x89\\x60\\x6b\\xb9\\xff\\x71\\x30\\x42\\x9d\\xac\\x47\\x9d\\x90\\xd2\\xd1\\x27\\xa9\\x57\\x9b\\xa1\\x8c\\x33\\x8f\\x89\\x6d\\xeb\\x0a\\x25\\xf8\\x47\\x0a\\x7e\\x08\\x81\\x1d\\x5d\\x43\\x46\\x5f\\x20\\xd1\\x4f\\x6d\\x3b\\xf5\\x3f\\x0e\\x44\\x31\\x65\\x05\\x2d\\x5e\\x81\\x0b\\x22\\x80\\xaa\\x8e\\x79\\xdc\\x34\\xeb\\x4d\\x5c\\x5e\\xed\\xe8\\xae\\x69\\xac\\xe5\\xa7\\x16\\xa4\\xd7\\x74\\x07\\x1a\\x2e\\x75\\xbd\\x90\\xce\\x13\\xa2\\xd4\\x8a\\x3b\\x21\\x99\\xed\\xf4\\xd8\\xae\\x63\\x75\\xa9\\xf8\\xce\\xb6\\x17\\x8b\\xac\\xbf\\xf4\\x41\\x9d\\x33\\x4a\\x7a\\x32\\x4f\\x9b\\x46\\xb4\\xb5\\x82\\x48\\xd1\\x0d\\x88\\x90\\x96\\x08\\xd9\\xcc\\x4b\\xe7\\x03\\x19\\xcd\\x9d\\x8b\\xbf\\x04\\xa2\\x36\\x30\\x8e\\x3a\\x5f\\xb3\\x9e\\xf4\\x1b\\x17\\x95\\x99\\x41\\xe8\\x75\\x8c\\xf1\\x96\\xc0\\x2b\\x46\\x95\\x93\\x7f\\xaf\\xf4\\x79\\x33\\x74\\x4c\\x91\\x9c\\x9e\\x3a\\x97\\x62\\x52\\xb9\\x1d\\x4a\\x75\\xa3\\xe2\\xeb\\xe8\\x8b\\x45\\x48\\x22\\x2a\\x18\\x3b\\xe0\\xbe\\xd6\\x0c\\xce\\xa3\\x80\\x72\\xbf\\xd7\\xf1\\x45\\x01\\x65\\xc6\\x7d\\xe8\\x0e\\x5f\\x2a\\x71\\x9f\\x6a\\xa5\\xbe\\x60\\xb2\\xfa\\x6e\\xfc\\xbd\\xd3\\xde\\x75\\x4c\\x27\\x70\\xea\\xfc\\xcc\\x50\\x8a\\xf2\\x03\\xa2\\x03\\xb2\\xfc\\xcc\\x7c\\xeb\\xb9\\x15\\x10\\xbc\\xad\\xb6\\xb7\\x6c\\xd8\\xa4\\xa8\\x07\\x9d\\xcb\\xcb\\x64\\xb8\\x9f\\x04\\x12\\xfb\\x47\\x82\\xc7\\xea\\x14\\x6c\\x86\\x52\\xf7\\x1f\\xd3\\x87\\xc4\\x3a\\x32\\xac\\x34\\x38\\xda\\x53\\x0c\\xb3\\xaa\\x25\\xbc\\xc3\\x40\\x4f\\xf0\\x5a\\xf0\\x89\\xf7\\xdd\\xc5\\x0d\\x56\\xf2\\x24\\x36\\x1a\\x06\\x09\\xc7\\xcd\\xd2\\x34\\x68\\x4f\\x33\\xbc\\x31\\x01\\xaf\\x7d\\x00\\x89\\xe0\\x77\\xcb\\x87\\x02\\x3f\\xc6\\x68\\xad\\xa2\\x5f\\xf0\\x06\\xb7\\x9d\\x71\\x97\\x01\\x98\\x2f\\x66\\xc8\\xf9\\xbe\\x4c\\xd3\\x64\\x82\\xe1\\x82\\x3e\\x65\\x3e\\x87\\x7c\\x29\\xef\\x5e\\x35\\xc1\\x61\\x2a\\xad\\x2f\\xb4\\x58\\x40\\x7f\\x11\\x04\\x76\\xb5\\x33\\x0c\\xdb\\x0d\\x2f\\x57\\xc0\\x1b\\xd9\\xce\\xec\\x20\\xb5\\xf4\\x98\\x15\\x57\\x61\\xd3\\x28\\x11\\x12\\xcf\\x36\\x6c\\xdb\\x89\\x96\\xe5\\x3b\\x5e\\x25\\x79\\xf9\\x48\\xfd\\xb2\\x7b\\x86\\xfe\\xf1\\x57\\xe3\\xf9\\x9f\\x01\\xdc\\x4e\\xc4\\x8a\\x87\\x3b\\xda\\xe9\\xed\\x6e\\xbd\\x6e\\xea\\x4d\\x45\\x63\\xd3\\xd4\\x42\\x26\\xef\\x74\\x7e\\xee\\x2d\\x28\\xa9\\x4a\\x14\\xba\\xd3\\x6a\\x39\\x53\\xd2\\x93\\x2a\\x24\\xd1\\xc7\\xb2\\x57\\x3b\\x0e\\x24\\x31\\xb4\\x29\\xd5\\x7d\\xc3\\x7c\\xdd\\x58\\xba\\xd3\\x90\\xa9\\xa9\\x35\\xf2\\xf5\\xe5\\xfd\\x55\\x60\\x8e\\xda\\xfc\\xb2\\x36\\xbf\\xfc\\xd3\\xfc\\xf2\\x22\\x68\\x95\\xda\\x51\\x5d\\x24\\x86\\xca\\xe6\\x50\\xec\\xc2\\x1f\\x3a\\xdf\\x0c\\x54\\x71\\xa9\\x73\\x79\\xfc\\x84\\xe8\\xcd\\x92\\x74\\x00\\x75\\x07\\xc0\\x29\\xa5\\xce\\xc1\\x13\\xbd\\xe6\\x96\\x6b\\x49\\x90\\xc5\\x72\\xf2\\x59\\xde\\x4d\\x3a\\xbb\\x37\\x62\\x90\\xdc\\xfb\\x71\\x40\\xa2\\xb2\\xa8\\xb3\\xe2\\x81\\x6f\\x0e\\x74\\xb6\\x6a\\xf7\\x7e\\x1c\\xd0\\x7b\\xdb\\xbe\\x47\\xb1\\xae\\x97\\x71\\x62\\x15\\xe9\\xf6\\x56\\xdf\\x82\\x34\\x71\\x5d\\xda\\x9e\\x10\\x63\\x41\\x1c\\x63\\x3d\\xc7\\x0b\\x37\\x5c\\x91\\x5b\\xe9\\xc7\\x72\\xba\\xf7\\xf4\\x94\\x67\\xc5\\xd5\\xbd\\x6d\\x3b\\x07\\x7a\\xbf\\x94\\x29\\xc4\\xbd\\x37\\xaf\\x49\\xd1\\x5b\\x12\\x4e\\x2d\\x81\\x04\\x03\\xc9\\xca\\x7c\\x74\\x76\\x20\\xf0\\xff\\xe7\\xee\\x4f\\xdb\\x1c\\xb7\\xb1\\x43\\x71\\xfc\\x7d\\x3e\\x85\\x44\\x3b\\x32\\x51\\x82\\x54\\x52\\xb5\\xc7\\x99\\x50\\xcd\\xd2\\xdf\\xeb\\x4c\\xcf\\xf5\\x16\\x77\\x3b\\xf1\\x44\\xd6\\xf4\\x05\\x49\\x50\\x62\\x95\\x8a\\x94\\x49\\xd6\\x36\\x25\\xdd\\xcf\\xfe\\x7f\\x70\\x0e\\x56\\x2e\\xaa\\x6a\\x4f\\x92\\x27\\xcf\\xef\\x45\\x77\\x89\\x20\\x00\\x62\\x39\\x38\\x38\\xfb\\xd9\\x2f\\xc5\\xdd\\xab\\x78\\x97\\x1d\\xe6\\xef\\xb4\\x9d\\x8a\\xc5\\x5b\\xc5\\xca\\xd0\\xf6\\x7b\\x24\\xd9\\xec\\x18\\xbc\\x1a\\x03\\x00\\xd6\\x14\\xdb\\x74\\x43\\x6c\\xfe\\xef\\x66\\x15\\xad\\xc9\\xd1\\xda\\xc5\\x1b\\xb2\\x09\\x7f\\x66\\xfe\\x7e\\x29\\xd6\\x31\\x98\\xd1\\x84\\xee\\x08\\x85\\x37\\xbf\\x1d\\x0e\\xbe\\x28\\x0c\\x37\\x92\\xe0\\xdd\\x8b\\xab\\x03\\x6e\\x07\\x55\\x22\\xff\\x5a\\x3a\\x8e\\xe4\\x70\\x50\\x27\\x10\\x12\\x04\\xcf\\x83\\x99\\xe3\\x79\\xf7\\x1f\\x5d\\x4e\\x88\\x30\\x9a\\x18\\x95\\x60\\x80\\x3c\\x6d\\x41\\x58\\x0c\\x9c\\x30\\x42\\x12\\xf8\\x3e\\x1a\\x8e\\x39\\x45\\x8d\\x46\\x2a\\x60\\x16\\x5f\\x86\\x82\\xad\\x27\\x34\\x96\\x79\\x21\\x99\\x18\\x7e\\xaa\\xc2\\x20\\x8b\\x0a\\x0d\\xf9\\x58\\x82\\x02\\x31\\x14\\x3c\\x80\\x4c\\x4c\\xdc\\xc7\\x1b\\xe9\\xad\\xe1\\xa7\\xc4\\xb4\\x4d\\xd6\\x66\\x98\\x29\\xc1\\xd1\\x1e\\x0e\\xbe\\x0e\\xae\\x45\\x21\\x69\\x3f\\x97\\xd0\\x27\\x06\\x1c\\x5a\\x97\\xcb\\x2f\\x6d\\x5c\\x0f\\x97\\xc7\\xbf\\x31\\x93\\xc9\\xc3\\xce\\xf6\\xd1\\x71\\x90\\x55\\x30\\x67\\xb8\\xfa\\x8f\\x84\\x66\\x36\\x1e\\x16\\x47\\x91\\xa8\\x1c\\x02\\x0b\\xed\\x65\\x13\\x7e\\xcb\\x0e\\x07\\x71\\x43\\xd3\\x38\\xb4\\xf4\\x83\\x57\\xb8\\x6f\\xe2\\xae\\x1e\\x5f\\x69\\x5e\\x68\\x82\\xb4\\xd1\\xb9\\x29\\x11\\x84\\x41\\x1a\\xce\\x27\\x09\\x68\\x5f\\xb2\\xf0\\x6a\\x5a\\x0b\\x32\\xca\\x18\\x62\\x4b\\xb9\\x84\\x2a\\x5f\\x6d\\xd6\\xd3\\xf2\\x36\\xf7\\x53\\x93\\xfb\\xc3\\x4e\\xe5\\xcb\\xe8\\xea\\x8a\\xa6\\x54\\xec\\xc2\\xfc\\x32\\x1d\\x8d\\xb2\\x65\\x1c\\xf8\\x5b\\x27\\x5f\\x89\\xa8\\xb2\\x26\\x18\\x14\\xe9\\x2a\\xdc\\xea\\xac\\x21\\x18\\xfe\\x90\\xc9\\x10\\x87\\xb6\\x93\\x67\\x44\\x68\\xb1\\xaf\\xad\\xb2\\xe1\\x8c\\x3e\\x49\\x67\\xa2\\xaf\\x81\\x16\\x0e\\x9e\\x8e\\x47\\x1a\\x13\\x1d\\x2f\\xca\\xe4\\x7f\\x0c\\x22\\x5d\\xf8\\x03\\x72\\x6d\\x41\\x4c\\xf5\\xd2\\x04\\x7a\\xf1\\xd4\\x7a\\x04\\xb1\\x5e\\x1a\\x8a\\x33\\x0e\\x56\\x6b\\x6a\\x11\\x98\\x4e\\xbc\\x6b\\xa5\\x06\\x94\\x02\\x04\\x9f\\xd1\\x2b\\xc1\\x1c\\x56\\x20\\x19\\xc0\\x9f\\x53\\x67\\xa0\\x40\\x68\\xc8\\x17\\x48\\xc6\\xeb\\x75\\xd4\\x2b\\x0f\\x8e\\x56\\x09\\xa1\\x09\\x46\\xea\\x09\\x6c\\xcb\\x37\\xe3\\x3b\\x1c\\x2d\\x1b\\x5b\\x15\\x00\\x1e\\xe4\\x4e\\x98\\x0c\\xf0\\xc5\\x0d\\x87\\x33\\x6d\\xa8\\xae\\xb7\\x31\\xc6\\x6d\\x9c\\x5b\\x4e\\xcd\\xed\\x6d\\xa2\\xd1\\x9a\\x04\\x5b\\x99\\xf4\\xd8\\x29\\xa5\\xca\\x40\\xf5\\x3a\\xbc\\xc2\\x80\\x75\\xf0\\xad\\xff\\x60\\xfe\\x75\\xe7\\xbc\\x89\\x4b\\x3a\\xfd\\x1b\\xd3\\xb4\\xd3\\x15\\x65\\x54\\xb5\\x31\\x24\\x94\\xc9\\xb7\\x7e\\xc3\\xf6\\xfe\\x35\\xfd\\x19\\x22\\xcc\\x3a\\xb6\\xd8\\xea\\x33\\xc0\\xb7\\x8f\\x46\\xf6\\xa3\\x0a\\xa5\\x0e\\x4d\\xd2\\x07\\x88\\x3f\\x55\\xfa\\x1a\\x7c\\x32\\xaa\\x60\\x8d\\xe5\\xd9\\x4d\\x70\\x45\\x31\\x3f\\x90\\xec\\x01\\x1e\\x04\\xe1\\x71\\x65\\xb2\\x3c\\xcb\\x57\\xea\\x59\\xa6\\x61\\x96\\xa5\\xe2\\xb7\\x9a\\xb4\\x4a\\xf0\\x2b\\x13\\x46\\xcb\\x52\\xf1\\x5b\\x9f\\x77\\x59\\x86\\x4f\\xe4\\x98\\x4f\\x3f\\xcf\\xb3\\x1b\\x00\\x38\\xe3\\xd9\\xfc\\x0b\\xa3\\x4f\\xb0\\x51\\xad\\x50\\x12\\x6e\\x32\\x6f\\xb2\\x94\\x19\\x7e\\x90\\x5c\\x0d\\x98\\xa0\\x22\\xb5\\x9c\\x74\\x61\\x5b\\xea\\xce\\x20\\xf0\\x50\\xc3\\x83\\x35\\x0e\\x05\\xd6\\xa3\\x3f\\x01\\x8a\\x83\\xff\\x81\\x3b\\x81\\x5f\\x3a\\x47\\x56\\x84\\xbe\\x54\\x9d\\xb1\\x2d\\xa3\\xe5\\xbf\\x31\\x5d\\x91\\x91\\xe0\\xdf\\x18\\x82\\x2f\\x93\\xa9\\xa7\\xaa\\x3d\\xe7\\x49\\x2b\\x82\\x1a\\x1e\\x1a\\x36\\x1a\\x75\\xe4\\xa5\\xb3\\x0f\\x3e\\x23\\xc1\\x93\\x5a\\xd1\\x20\\x3e\\x1c\\x86\\xf1\\x68\\x14\\xa1\\x8a\\xc1\\x5a\\x83\\xd1\\x88\\x99\\xe3\\xcb\\x28\\x1e\\xab\\x00\\xab\\x46\\x32\\x20\\xf4\\x37\\xe6\\x0c\\x8d\\x46\\x91\\x95\\x61\\x5e\\x35\\x0c\\x01\\x50\\x8a\\x34\\x5d\\xce\\x02\\xa5\\x74\\xd2\\xa3\\x32\\xd5\\x96\\xe6\\x67\\x60\\x7e\\x8a\\x9b\\x02\\xb9\\x64\\x31\\xdd\\x6a\\x69\\xfd\\x5e\\x99\\x5a\\xeb\\xc0\\x2a\\x37\\x9e\\xab\\x32\\x9e\\x4e\\xa2\\xe8\\x79\\xf9\\x03\\xd4\\x29\\x60\\xbe\\x29\\x9f\\x91\\xa8\\x4f\\xa6\\xc5\\x2e\\x09\\x13\\x0d\\x68\\xd4\\xfc\\x74\\x73\\xa4\\xd9\\x91\\xb1\\x45\\x1b\\x32\\x1a\\xc1\\x5f\\x23\\xaf\\x12\\x9d\\x41\\xd7\\xad\\xbc\\x59\\xb2\\x9c\\x1c\\x05\\x0e\\x72\\xe4\\xe1\\x29\\x4b\\xf8\\xbb\\xe2\\x99\\xd0\\x36\\xd2\\x5b\\xeb\\x2d\\x01\\xd2\\x57\\xab\\x80\\xe9\\x4c\\xd1\\x41\\x82\\xc2\\x10\\x17\\x20\\x00\\x3e\\xf7\\xb5\\x46\\x39\\x3a\\x52\\x54\\xab\\x1c\\xa9\\x7c\\x77\\x22\\x8e\\xa0\\x4b\\xef\\x31\\xcc\\x1c\\x07\\x8b\\x8b\\x99\\x08\\x1a\\x59\\xe3\\xf0\\xb2\\xfc\\x45\\x4a\\xb7\\x5d\\x28\\xa3\\x29\\x59\\xf8\\x5c\\x85\\x58\\x80\\x0a\\x5e\\x9a\\xe5\\x59\\xb5\\x05\\x2d\\x52\\x04\\xe1\\xc8\\x20\\x3b\\xba\\x36\\x09\\x99\\xe2\\xfb\\x70\\x43\\xf9\\xe1\\x90\\x9a\\x2d\\x9b\\x5b\\x89\\x15\\x37\\x52\\xf4\\x88\\x2b\\x2b\\x2b\\xd1\\x0d\\x69\\xe2\\x75\\xe7\\x54\\xb4\\x3d\\xa5\\x30\\x5a\\xda\\x42\\x91\\x29\\x98\\x9c\\x2e\\xf2\\x63\\x3d\\x9a\\xce\\xcc\\x5f\\x18\\x2e\\xc7\\xce\\xfe\\x15\\x8d\\x46\\x90\\x99\\x7d\\x2e\\xa5\\x98\\xad\\x7c\\x65\\xdd\\x61\\x74\\x70\\x10\\x60\\xe8\\x22\\xe5\\x6d\\xa3\\x91\\x9b\\x27\\x0c\\x56\\x1e\\x70\\x6c\\x05\\x31\\x23\\xb4\\x74\\x18\\x2f\\xa4\\x0d\\xb8\\xd0\\x8a\\xff\\x61\\xe8\\xa3\\x51\\xe2\\x6f\\xd0\\x5d\\x4f\\xa5\\xab\\x80\\x70\\x11\\x9b\\x76\\xc5\\x1f\\xb5\\xf1\\x8a\\x69\\x84\\x57\\x9a\\xf1\\xc5\\x9f\\x4c\\x16\\x24\\x15\\x4d\\x04\\x4a\\x97\\xc1\\xa5\\xd1\\x1e\\x06\\x46\\x0a\\xaf\\x60\\xac\\xc3\\x30\\x14\\xd4\\x1c\\x14\\x08\\xe8\\xc2\\x4d\\x8d\\xc1\\xc2\\x6f\\x4e\\x53\\x95\\xec\\x83\\xd3\\x39\\x21\\x0b\\x3f\\x12\\xd8\\x86\\xf4\\x64\\x94\\xc3\\xbd\\xef\\x14\\xbc\\x0d\\x55\\x20\\x6f\\x95\\x6a\\xed\\xd4\\xaa\\xd2\\xd8\\x5e\\x2d\\x41\\x99\\xad\\xd4\\xca\\x7a\\x6b\\xca\\xad\\x47\\x5c\\xe8\\xb5\\xbb\\xd2\\xc9\\x32\\x31\\x77\\x3f\\x50\\xae\\x0a\\x2a\\x21\\x57\\xba\\x93\\x51\\x4f\\x6c\\x2f\\x46\\xe4\\x85\\x95\\xc5\\xbf\\x96\\x77\\xd1\\x50\\x00\\x88\\x59\\xd6\\x08\\x97\\x35\\xc2\\x65\\x95\\x0e\\xae\\x62\\x35\\xa3\\xb5\\x86\\x75\\x06\\x66\\x31\\x91\\xbd\\x9a\\xa2\\x17\\xbd\\x92\\x11\\xac\\x24\\xca\\x76\\x66\\x8b\\xcd\\x65\\x04\\x6e\\x8d\\xc9\\x2a\\x5a\\x8f\\x46\\xe2\\x7f\\x39\\x58\\xe7\\xc1\\xc2\\x4e\\x0a\\xe0\\xd5\\xa4\\x74\\x1e\\x4c\\x54\\x21\\x4b\\x76\\x93\\x22\\x43\\x49\\x91\\xd5\\x6c\\x2a\\x92\\x55\\x72\\xc1\\x34\\x5f\\x45\\xeb\\x85\\xfc\\x6b\\x5f\\x47\\x8e\\x9a\\x08\\x05\\xe2\\x87\\x43\\x97\\xee\\x2a\\xee\\x36\\x36\\xc7\\x03\\xae\\x10\\xd9\\x3b\\xf0\\xed\\x9b\\x11\\x8a\\x1d\\xdb\\x0e\\x3c\\xd5\\x2e\\x4b\\xf8\\x57\\xc5\\x7d\\x1e\\xbc\\x63\\x92\\x09\\x26\\x14\\x0a\\x7f\\xde\\x43\\x11\\x8c\\x5f\\x16\\xbd\\x43\\xad\\x9a\\x28\\x96\\xd3\\x24\\x54\\x60\\xde\\x37\\xb9\\xb1\\xbe\\xc1\\x3e\\x8e\\x50\\xfe\\xc3\\x6d\\x6d\\xbd\\x80\\x9e\\xf0\\x85\\xec\\xc8\\xbc\\x93\\xdd\\x1d\\x9f\\xf7\\xf3\\x69\\xa3\\x75\\x35\\xcb\\x48\\x21\\x69\\x98\\x1e\\x42\\x63\\xb8\\x5a\\x2b\\x52\\x2b\\xbe\\x6e\\xa2\\x5d\\xf0\\x72\\xa5\\xb1\\x06\\x5d\\x80\\x09\\x23\\x26\\x5c\\x44\\xaf\\x63\\x0d\\x77\\xe3\\x31\\x61\\x61\\x0c\\x31\\x8d\\x7d\\xe9\\x16\\x81\\x07\\x37\\xd6\\x60\\x35\\x99\\xd0\\x39\\x59\\xc4\\x5a\\x68\\x24\\xe5\\xd3\\x90\\x2f\\xc2\\x08\\x22\\x2d\\xca\\xaf\\x11\\x99\\x10\\x07\\xa1\\xe8\\x14\\xf1\\x1d\\xa5\\x6c\\x60\\x65\\xed\\x93\\xc0\\xd4\\x10\\x5d\\xca\\x8e\\x20\\x38\\xe4\\x1d\\xdb\\x85\\xf3\\x57\\xd4\\xd4\\xb6\\x67\\xfa\\x9d\\xc0\\x2e\\xdf\\xb1\\xb0\\xe2\\xf5\\x1b\\x59\\xd9\\xd7\\x4b\\xe2\\x76\\x42\\x54\\xaf\\x62\\xd4\\x76\\x1f\\x60\\xc4\\xa2\\x5b\\x7f\\xc7\\x08\\xfd\\x0e\\xbd\\x74\\x55\\x7d\\xa0\\x1d\\xc2\\xa7\\x6a\\x57\\xdc\\x07\\x9f\\xcd\\x66\\x34\\x65\\x55\\x1d\\x5c\\xcc\\x66\\x26\\x58\\xd4\\xa7\\xb3\\x99\\xbc\\xb3\\x13\\xbe\\x63\\x8f\\x7d\\xf9\\x12\\x45\\x77\\x0e\\x9d\\xc2\\xd6\\x87\\x03\\x03\\x37\\x60\\x99\\xb3\\x95\\x5a\\x97\\x44\\x44\\xbb\\xb8\\x1e\\x4b\\x16\\x1c\\x51\\x06\\x79\\x0b\\xbb\\xe6\\xa3\\xea\\x48\\x3f\\xf7\\x96\\x5a\\xb2\\x2f\\x0f\\x22\\x8d\\xda\\xaf\\x30\\x9a\\x17\\x18\\xfa\\x45\\xa7\\xcd\\xd5\\x51\\x47\\xe7\\x11\\xb2\\x90\\xc1\\x9a\\x4c\\x74\\x66\\x95\\xf1\\xf0\\x87\\x3c\\xf4\\x30\\xaf\\xc0\\x1d\\xdb\\xdd\\x72\\x7a\\x2d\\x28\\x73\\x0c\\xed\\xc3\\x93\\x30\\x96\\x21\\xef\\x20\\xc9\\xa1\\xca\\x49\\x20\\x30\\x2b\\x54\\xfb\\x4a\\x17\\xc4\\xfa\\x25\\x3d\\x31\\x17\\xf9\\x8d\\xd0\\xab\\x3d\\x15\\x87\\x53\\x26\\x74\\xa4\\xd7\\x53\\xf8\\xf1\\xef\\xea\\x7d\\xa8\\x47\\xa4\\xd2\\x1f\\xfe\\x95\\xd1\\xff\\x64\\xf4\\x63\\x48\\x29\\xf2\\xb0\\x2f\\x21\\x85\\x35\\x46\\x9a\\x5b\\x38\\xd4\\x99\\x28\\x3f\\x69\\xae\\x90\\x43\\xd3\\x7e\\x9b\\x00\\x13\\xc9\\xea\\x03\\xb2\\xa5\\x9a\\x46\\x7d\\x29\\x8b\\x5b\\xe3\\x72\\xa5\\x24\\x46\\xba\\xbb\\x30\\xc6\\x73\\x29\\xda\\xcc\\xa5\\xa3\\xd1\\x05\\x28\\x51\\xdc\\x1c\\x81\\x6e\\x4c\\xaf\\x30\\x0c\\x7f\\x5e\\xe6\\xc0\\x87\\x2a\\x13\\x08\\x08\\xde\\x90\\x62\\x8a\\x18\\x1d\\x26\\xe8\\x70\\xf0\\xa3\\x30\\x6a\\x84\\x93\\x11\\xdc\\x3b\\x2c\\xa8\\x36\\xa7\\xf2\\x9d\\xd4\\x78\\xe2\\x32\\x50\\xde\\x54\\xcb\\xff\\x64\\xc1\\x5f\\x99\\x6d\\x43\\x15\\x2f\\x13\\x63\\x6e\\x95\\x28\\x8d\\x69\\xe8\\xf3\\x30\\xd1\\xb9\\x96\\xc9\\x92\\x63\\xe2\\xff\\x34\\xcb\\x13\\xf8\\x16\\x6a\\xa9\\xa4\\xd1\\x2e\\x3a\\x3a\\x81\\x95\\x94\\x6c\\x8d\\x9d\\x56\\xba\\x53\\xdb\\x2c\\x2f\\xd1\\x66\\x68\\xb2\\x63\\xe6\\xa6\\xfa\\x8c\\x68\\x3c\\xf6\\xc4\\x01\\x91\\x16\\x3c\\xce\\xfe\\xc0\\x68\\x7a\\xb6\\xd9\\x91\\xd9\\x85\\x33\\x9a\\x86\\x91\\x20\\x7d\\x55\\xf6\\x39\\x99\\xe1\\xbb\\x91\\x55\\x5f\\x26\\x38\\x0f\\xd3\\x15\\x1f\\x8f\\xd7\\x44\\xac\\xa5\\xd8\\x85\\x6f\\xb2\\x07\\xe0\\x25\\x63\\xda\\xb3\\x94\\x10\\xd7\\x05\\x64\\x77\\xc3\\x39\\x66\\x26\\x71\\x43\\xa8\\xc5\\x82\\x05\\x50\\x9b\\x12\\x60\\x74\\xf0\\x86\\x1a\\x55\\xda\\x9b\\x0e\\xed\\xe3\\x33\\x1a\\xc9\\x43\\x85\\x79\\x9e\\xdd\\x08\\x76\\xf2\\x28\\x9a\\x98\\x60\\x70\\xc6\\x4c\\xc4\\xfc\\xae\\xa4\\xab\\x32\\x51\\xb6\\x3a\\xbd\\xe8\\xb7\\x01\\xd6\\x59\\xff\\xc9\\x9a\\x7a\\x5d\\x27\\xb9\\x3d\\x46\\xb3\\x5c\\x36\\x56\\x3f\\x26\\x41\\xe3\\x3b\\x31\\x05\\xef\\x48\\x1d\\xdd\\xb8\\xbd\\x5e\\x98\\x1b\\x57\\xee\\xc3\\xf9\\xaf\\xf7\\xe3\\xf3\\x0d\\xe9\\x24\\x73\\x3e\\x66\\xd2\\x18\\x50\\x83\\xd9\\x02\\x8a\\x5c\\xf6\\xdb\\x18\\x24\\x6a\\x26\\x58\\x50\\xc5\\xd8\\x9a\\x62\\x03\\xae\\x69\\xfd\\x58\\xb6\\x59\\x36\\x4e\\x0d\\xa6\\x09\\x93\\xdd\\x13\\xca\\x95\\x3b\\xee\\x7b\\xa9\\x14\\xc6\\x88\\x94\\x88\\x40\\x0f\\x2a\\xe0\\xd8\\x01\\x73\\x5f\\x40\\x4e\\x5d\\x07\\x6f\\x09\\x90\\x79\\x06\\x6f\\xa1\\x76\\xfe\\x34\\xde\\xfa\\xd1\\xed\\xe6\\x34\\xde\\xb2\\x1c\\x0b\\x57\\x06\\x68\\xe1\\x16\\x5c\\x37\\xf1\\x97\\x7c\\x1b\\x3c\\x79\\x69\\x51\\x7a\\x81\\xb7\\xad\\x6f\\x76\\xdf\\x14\\xa5\\x47\\xbd\\x78\\xc7\\xaa\\xca\\x0b\\xf0\\xaf\\x00\\x34\\x0f\\x73\\xb4\\x9c\\x0a\\x92\\xd6\\x8d\\xef\\x36\\x88\\xef\\x36\\x88\\xef\\x36\\x0a\\xdf\\xa5\\xe1\\x1c\\xdd\\x41\\x87\\x0e\\x26\\x03\\x45\\x43\\x64\\x9d\\x36\\xb1\\xf3\\x11\\xe4\\x93\\x36\\x56\\x37\\x60\\xff\\x6f\\x8c\\xc4\\xb8\\xc1\\x29\\xdc\\xc6\\x29\\x49\\xc8\\x1d\\x9c\\x92\\x04\\xb0\\xad\\x71\\xc0\\x0d\\x66\\xe3\\x06\\xb3\\x89\\xea\\x06\\xb3\\x61\\x65\\x9c\\xb4\\x3a\\xac\\x2c\\x42\\x5b\\xea\\x96\\xfd\\x89\\x3e\\x6a\\x5b\\x56\\xd9\\x47\\x8d\\x45\\x60\\x9e\\xeb\\x91\\xc3\\xe1\\xbd\\x32\\xd2\\x33\\x2a\\x9a\\xc3\\x81\\x4d\\xb7\\x25\\x4f\\x97\\x6c\\xaa\\xbb\\x9e\\xcc\\x8f\\x32\\x84\\xb5\\x75\\x65\\x03\\xe6\\xb6\\x2c\\x30\\xd4\\x4d\\xde\\x6d\\x07\\x03\\x59\\x57\\x94\\xbd\\x85\\xa5\\x45\\x8e\\x1c\\x33\\x0c\\xfb\\x49\\xf7\\x08\\x63\\x00\\xf4\\xed\\xb2\\x24\\x72\\x74\\x1e\\xf5\\x4a\\xce\\x92\\x1f\\xf2\\xdd\\xa3\\x47\\xbd\\x1b\\xf6\\xf0\\x2d\\x40\\xaa\\x00\\x17\\xbe\\xdb\\x49\\xa7\\x25\\xf9\\xf4\\xa3\\xd4\\x65\\x53\\xaf\\x2c\\xee\\xdf\\xee\\x59\\x2e\\xca\\x8b\\x9d\\xfc\\x75\\x5b\\xf1\\xef\\xd8\\xde\\xa3\\x1e\\x78\\x74\\x7f\\x81\\x0e\\x16\\x54\\x39\\x58\\x7c\\x9d\\x64\\x18\\x95\\x73\\x4d\\x9d\\x0b\\x59\\xc1\\x04\\x46\\x74\\x72\\xe2\\x9a\\x00\\x1f\\xa7\\xc2\\xca\\x46\\xe1\\xf9\\xea\\xd7\\xfa\\xd7\\xf2\\xd7\\xfc\\xd7\\x74\\x7d\\xbe\\x69\\xd0\\x12\\x49\\xf2\\xa5\\x00\\xea\\x2e\\xe3\\x2e\\x13\\x5a\\xb2\\x6d\\xaa\\xc9\\x46\\x23\\x46\\xb3\\x70\\x46\\xaf\\x9a\\x01\\x5d\\x1a\\x62\\xbb\\x13\\x01\\x31\\x04\\x43\\x22\\xad\\xfc\\xd4\\x30\\x7c\\x66\\x31\\xab\\xd2\\x60\\x4e\\x1f\\x3a\\x22\\x03\\x60\\x6c\\x09\\x72\\x9b\\x20\\xd4\\x70\\x33\\xa7\\xae\\x17\\x57\\x97\\xd9\\x22\\x43\\x01\\xb4\\x8c\\xc5\\x9b\\xad\\x69\\x12\\x62\\xb8\\x0b\\x4b\\xbd\\x1c\\x9b\\x7e\\x97\\xbe\\x37\\xf0\\xc6\\x56\\xc1\\xd8\\x1b\\x78\\xc4\\x84\\x85\\x89\\x28\\x98\\xa3\\x8a\\xff\\xc8\\x53\\x6a\\x45\\x52\\x8b\\x30\\xd5\\x5f\\x62\\xcc\\xce\\x07\\xde\\x18\\x5b\\xbf\\x9e\\x41\\x2a\\xf5\\x10\\x9f\\x16\\x1b\\xc1\\x15\\x95\\xd9\\x8d\\x9f\\x10\\x6a\\x7d\\x08\\x31\\x81\\x3d\\x96\\x70\\xe3\\x06\\x87\\x90\\x38\\xef\\x25\\x7b\\x04\\x56\\xd0\\x0d\\xb4\\x79\\x38\\xfc\\x77\\xef\\x9c\\x35\\xbe\\xff\\xd5\\x9b\\xd7\\xb3\\x77\\xf8\\xd8\\xb5\\x83\\x97\\xe1\\x8c\\x24\\x61\\xa2\\x7b\\xd2\\x6f\\xa8\\xdc\\x51\\x08\\xd9\\x86\\x7b\\x1a\\x78\\xde\\x07\\x6e\\x2b\\x72\\xe8\\xcd\\x6d\\xb5\\x0c\\x9e\\xe4\\x66\\x2d\\xfa\\xec\\x6c\\x23\\x3b\\x30\\x4d\\x18\\x2f\\x23\\x94\\x48\\x9a\\x83\\x44\\xec\\x70\\x3b\\x6e\\x99\\x24\\x41\\x5c\\x15\\x83\\x6d\\xac\\xad\\x36\\xd7\\x1a\\xa5\\xb3\\xb9\\x71\\x63\\x73\\x05\\x01\\x15\\x91\\x63\\xe0\\xea\\x31\\xed\\xf1\\x29\\x80\\x45\\x0d\\x85\\xec\\x1f\\x98\\x02\\x07\\x00\\x64\\xca\\xa3\\x30\\x5d\\x25\\x62\\x77\\xb8\\xb8\\x42\\xf0\\xf3\\x11\\x59\\x72\\x67\\x32\\x11\\x09\\xb8\\x99\\x6e\\x84\\xea\\x5a\\x3f\\x16\\x4c\\x82\\x23\\xdb\\xc1\\xe0\\xa7\\xee\\x78\\x47\\xa3\\x6f\\xb5\\x1d\\x26\\xf5\\xde\\xbf\\xd7\\x2f\\xde\\xbf\\xf7\\x9a\\x70\\xdb\\x78\\x0e\\xdd\\xc7\\xc3\\x81\\x21\\x09\\xe8\\x79\\x81\\x2d\\x57\\x76\\xfb\\x24\\x00\\xeb\\x10\\x40\\x4b\\xce\\xa7\\x3b\\x96\\x62\\x28\\x80\\x8c\\x01\\x90\\xb5\\x83\\x65\\x29\\xe5\\x9e\\x15\\xb2\\x6e\\x15\\xaf\\x1d\\x93\\x99\\x81\\x37\\x56\\xc5\\xa7\\xcf\\x83\\x86\\xf7\\x08\\xe0\\x5c\\x65\\xb2\\x5f\\xe8\\xe4\\xf5\\xf2\\xf2\\x88\\xa2\\xf0\\xfc\\xd7\\xb2\\x79\\x69\\xdc\\xb1\\x5d\\x1f\\x2e\\xd2\\xe1\\xcf\\xc1\\x41\\xaa\\x19\\xba\\x4a\\x87\\xaf\\x6f\\x00\\x5f\\x97\\xf0\\x54\\x82\\x0c\\x5f\\xb4\\x62\\xf1\\x81\\xad\\x40\\xb2\\x74\\x01\\x52\\x81\\xec\\x1d\\xdb\\xf9\\x84\\x04\\x4c\\xb3\\x5d\\x3c\\x04\\x97\\xb7\\x86\\xae\\x87\\x2f\\xf9\\x58\\xbc\\x30\\x36\\x08\\xd2\\xab\\x12\\x55\\x91\\xbc\\x2b\\x58\\xa3\\x8a\\xa3\\xe6\\x79\\x01\\x1b\\x7b\\xde\\x91\\x10\\x2a\\x68\\xb3\\x3b\\xb6\\xb3\\xcc\\x9f\\x65\\x6e\\xce\\x66\\x71\\x77\\x8c\\xdf\\x35\\x18\\xd1\\x4a\\x6a\\x2d\\xb2\\xa8\\xb5\\xc8\\x80\\x27\\xa7\\x1e\\x70\\x25\\xe0\\xc7\\x04\\x7d\\x21\\x93\\xa2\\x31\\xaa\\x09\\x94\\x66\\x0f\\x86\\x77\\x8c\\x84\\x9f\\x1c\\xc6\\xa6\\x3d\\x0c\\x3f\\x0e\\x23\\x00\\x6a\\x33\\x08\\xb2\\x8c\\x03\\x3f\\x0e\\xb9\\x14\\xa6\\x74\\xfa\\x70\\x28\\x60\\x8b\\x22\\xea\\x79\\x2a\\x4f\\x44\\x2c\\xd6\\x2d\\x56\\x3e\\x2f\\x16\\x28\\x69\\x7f\\x43\\x50\\xb7\\xf5\\x50\\x71\\x2e\\x57\\xad\\x06\\x63\\x1b\\x39\\x0f\\xc1\\x08\\x59\\xa2\\x64\\x19\\x4c\\x93\\x41\\x0a\\x6b\\xa4\\xe7\\xda\\x3d\\x3b\\x21\\x4c\\x43\\x15\\x66\\x1d\\x53\\xb7\\xb8\\x34\\x60\\x1a\\x4a\\x91\\xd4\\x44\\xda\\x17\\x31\\x19\\x49\\x6a\\x76\\xc9\\xe9\\x26\\x4c\\x97\\x62\\x00\\x01\\x64\\xd2\\x4c\\x97\\x7c\\x3c\\x0f\\x94\\xc4\\x5e\\x5c\\xb4\\x97\\x7c\\xb9\\x0d\\xd2\\x25\\x0f\\x66\\x8b\\xad\\x7d\\xbf\\x25\\xe2\\x72\\x1b\\xfa\\x43\\x23\\x81\\x1a\\x8d\\x32\\x34\\x99\\xf2\\x1d\\xe1\\xd3\\xd2\\xc8\\x9e\\xb4\\xe8\\xa0\\x11\\xec\\x5c\\xbd\\xf7\\x08\\x39\\x1c\\x9c\\x88\\x85\\xea\\x8d\\xc3\\x26\\xdb\\x35\\xa8\\xa7\\x42\\xcd\\x7b\\x2a\\xc4\\x6a\\x28\\x4e\\x1f\\x9e\\x24\\x9a\\x1a\\x6f\\x76\\x99\\xc0\\x32\\xd2\\x57\\xd9\\xa6\\xe5\\x2c\\xe5\\x08\\x17\\xcc\\x8a\\x62\\x14\\x31\\x95\\x35\\x3a\\xb2\\xc3\\x48\\x49\\x94\\xbf\\x99\\x4c\\x48\\x12\\xf2\\xd5\\x66\\x4d\\xfd\\xc4\\xd0\\xf4\\x26\\x2c\\x6e\\x22\\x01\\x2e\\x05\\x84\\x05\\x9a\\xaf\\xe1\\x8c\\xd8\\xb1\\x93\\x1a\\x9b\\x16\\x4e\\xe6\\x84\\xa6\\xc7\\xa3\\x43\\xbb\\x4b\\x59\\x9c\\x11\\x12\\x36\\x68\\x6a\\xe7\\xd0\\xae\\xdb\\xac\\xbf\\x15\\x1d\\xd1\\x78\\xfb\\x2c\\x75\\x0c\\x6e\\x6b\\xbc\\x60\\xf1\\x85\\x4b\\x08\\x38\\x56\\x27\\x7b\\x30\\x62\\x49\\x60\\x64\\xdc\\x2f\\x42\\xc8\\x9b\\x5e\\xd4\\xd3\\x8a\\x71\\x2f\\x8f\\xc1\\xd2\\x2b\\x72\\x2f\\x50\\xd2\\x44\\x62\\x26\\xec\\x45\\xbb\\xdb\\x72\\x00\\x09\\x7d\\x06\\x32\\xcb\\xcf\\x40\\xa5\\xf7\\x19\\xec\\x0a\\x96\\x0c\\x4a\\x5e\\x65\\x7f\\xe7\\x03\\x34\\x63\\x1f\\x60\\x1a\\xb9\\x01\\xa4\\xa7\\x1b\\x24\\xd1\\x0e\\x7f\\x40\\x9a\\xa5\\xa4\\xb8\\xcf\\xf1\\xd7\\xed\\x1e\\xff\\x8a\\xab\\x78\\xa0\\x33\\x33\\x0d\\x54\\x32\\xa6\\x81\\x49\\xdc\\x34\\x30\\xc9\\x9a\\x06\\xf1\\x96\\xe5\\x1b\\x3e\\x90\\x79\\x1c\\xaa\\xdb\\xe8\\x26\\xab\\x07\\xd7\\xfc\\x11\\xfa\\xbd\\xe6\\x8f\\xfb\\x92\\x57\\x95\\xf8\\x71\\xbb\\x1f\\xf0\\xb2\\x2c\\xca\\x41\\x8c\\x69\\x5b\\x6f\\x78\\x7e\\xeb\\x66\\xdf\\x6c\\xab\\x34\\x5c\\xe9\\x87\\x11\\xcf\\xb4\\xa4\\x08\\x33\\xa4\\x92\\x40\\xc0\\x2d\\xe3\\x2b\\xc6\\x2a\\xd9\\x99\\x4c\\xcf\\x11\\x91\\x56\\x5c\\xdf\\xad\\x98\\xe0\\x89\\x14\\x22\\x66\\xc6\\x62\\xd3\\xcd\\xa4\\xfd\\x08\\xd2\\x83\\x43\\xda\\xa8\\x3e\\x09\\x52\\xad\\xb3\\xc4\\x60\\x7a\\x3b\\x1a\\x93\\x23\\xbd\\xcd\\x5b\\x4d\\x1a\\x0d\\xd2\\x54\\xb7\\x20\\x26\\x97\\xe1\\xf3\\xc9\\x68\\xb4\\x56\\x87\\xde\\xe6\\x3d\\xad\\x74\\x9b\\x79\\x07\\x43\\xb1\\xb4\\x3e\\xef\\x9d\\x9d\\x79\\x72\\xf1\\x44\\x41\\x44\\x05\\x49\\x7f\\x76\\xe6\\x89\\x29\\x48\\xfa\\x21\\x8e\\x94\\xfa\\x87\\x26\\x82\\x94\\x58\\x9e\\x2f\\xf2\\x29\\x78\\x94\\xfe\\xe5\\xed\\x0f\\xdf\\x77\\x41\\xba\\x28\\xc7\\x1a\\xbe\\xb8\\x64\\x41\\x85\\x02\\x8f\\xbf\\x7c\\xf7\\x6d\\x5b\\x6b\\x4e\\x63\\x88\\x2c\\xcf\\x0c\\x9f\\x63\\xb4\\xe3\\xc4\\x3a\\x3b\\x10\\xcb\\x33\\x06\\x6f\\x85\\xaf\\x7e\\xf8\\xee\\x47\\xd1\\x5f\\x49\\xa3\\x30\\xc6\\xae\\xbf\\x29\\x8b\\x9b\\xb7\\xd0\\x1c\\x52\\x60\\xf0\\x87\\xfa\\xfc\\xe1\\x66\\xe7\\x11\\x19\\xa8\\x33\\x21\\x4f\\x2a\\x23\\x8d\\xca\\x62\\x33\\x8c\\x0e\\x87\\xa8\\x27\\xe3\\x05\\x74\\x59\\x02\\x0c\\x6b\\x9b\\x67\\x50\\x31\\x43\\x91\\xef\\xbd\\xc9\\xef\\xd8\\x2e\\x4b\\x06\\xbf\\x7c\\xf7\\x6d\\x20\\xc8\\x3d\\x42\\x23\\x74\\xb8\\xe0\\x51\\x78\\xfe\\xd1\\xf4\\xec\\xe3\\x73\\x9a\\x46\\xe1\\xb9\\xbf\\x5a\\x8e\\xd6\\xe4\\x7d\\xb8\\xfa\\xdb\\x68\\x7d\\x76\\x4e\\x37\\x51\\x78\\xfe\\x37\\x7f\\x7a\\xb6\\x24\\xc1\\x6a\\xf0\\x6b\\xbd\\x3e\\xf3\\x57\\x7f\\x13\\x3c\\xfd\\xfa\\x8c\\x7c\\x7c\\xbe\\xb9\\xa1\\xdb\\x08\\x45\\x72\\x2c\\x2a\\x6e\\xeb\\x03\\xdb\\xef\\xc5\\xbf\\x49\\x55\\x17\\x25\\xdb\\xf0\\xc3\\x74\\x3c\\x01\\x60\\xae\\xb2\\x22\\x3f\\xa4\\xd9\\x8e\\x1f\\x4a\\x5e\\x1d\\xee\\xb3\\x64\\xc3\\x6b\\x12\\x7c\\x7c\\x4e\\x33\\xd9\\xfc\\x4f\\x5f\\xbf\\x3b\\xfc\\xf9\\xeb\\xcf\\xbf\\x22\\x1f\\x9f\\xd3\\x2b\\x51\\xf6\\xeb\\xf9\\xaf\\xe7\\xe7\\xf4\\x1a\\x5e\\xaf\\x7e\\xbd\\x9f\\x8e\\x27\\xeb\\x71\\x40\\xfc\\x65\\x20\\x5e\\x40\\x72\\x98\\x5f\\xcf\\x97\\x1f\\xad\\xcf\\xfe\\x7f\\x07\\xe2\\xe3\\xef\\x60\\x7d\\x26\\xde\\x07\\xfe\\xaf\\xc9\\x98\\x1c\\xc8\\x81\\x9c\\xd3\\x5d\\x14\\x3e\\x1d\\xe9\\x0d\\xfc\\x9f\\x47\\xa1\\x77\\x76\\xee\\x29\\x1b\\x7c\\xef\\xcc\\x23\\xb4\\x88\\x42\\x36\\xdd\\x15\\x31\\x18\\xd0\\x80\\x14\\x88\\xee\\xa3\\xf0\\x3a\\x42\\x5b\\xe4\\xa2\\x21\\x95\\x44\\x56\\x41\\x5b\\x64\\xfe\\x16\\x59\\xe0\\xe3\\x2a\\xb0\\x7a\\x32\\x63\\x45\\x54\\x8c\\xc1\\x43\\x10\\xd5\\x62\\x70\\xf7\\x23\\x2e\\x5f\\xd2\\xe4\\x8e\\x63\\xa2\\x38\\x47\\x25\\x13\\xf7\\xc6\\x60\\x27\\xbb\\x9a\\xad\\x97\\xbe\\x60\\x1b\\x55\\xe8\\x18\\x48\\x1b\\x41\\x51\\x08\\xce\\xc0\\xc2\\x79\\xb5\\x26\\xda\\x96\\x2a\\x26\\x24\\x68\\xbe\\x83\\x4b\\x36\\xb6\\x6d\\x6d\\xcb\\xa8\\x69\\x17\\x03\\xfe\\xb3\\x82\\xf3\\xb8\\x89\\xec\\x48\\x5d\\x5b\\x7c\\x9f\\x69\\x7f\\xd8\\xd5\\x76\\x8d\\x56\\x02\\x70\\x1d\\x30\\xf0\\x3a\\x5f\\x39\\xea\\x73\\xd9\\xe4\\x2a\\xdc\\x4a\\x7b\\x9a\\x3e\\x6b\\x93\\xab\\xc3\\x21\\x3d\\x1c\\xf8\\xea\\x6a\\xbd\\x4c\\x97\\x43\\x3f\\x0b\\xaf\\x94\\xf3\\x70\\xe0\\x47\\x90\\x3e\\x5d\\xd0\\xe6\\x95\\x9e\\xda\\x15\\xa1\\x1b\\xf1\\xdf\\x70\\x2e\\x2e\\xa4\\x4c\\xd3\\x0c\\x76\\xe5\\xd5\\x6c\\x4d\\x0e\\x87\\x21\\x07\\xbb\\xb6\\xd1\\x68\\x03\\xd0\\x60\\xe6\\x5d\\x45\\x4d\\x92\\x22\\x9f\\xb2\\x2b\\xf6\\xf0\\x96\\xd7\\x75\\x96\\x6f\\xaa\\x69\\xba\\x63\\xb5\\xb4\\xf7\\x84\\x74\\xf8\\xda\\xae\\x37\\x22\\x86\\x94\\x5e\\xc5\\xeb\\xd1\\xc8\\xf7\\xf9\\x2a\\x5e\\x2f\\x59\\x90\\x1c\\x0e\\x7e\\x12\\x3e\\x1d\\x09\\x59\\xc5\\x6b\\x78\\x69\\x22\\xef\\x58\\xa1\\xba\\x86\\x33\\xca\\x68\\xe2\\x24\\x77\\xa9\\xa3\\xde\\x54\\x18\\x28\\xa8\\xab\\x20\\x94\\x83\\x9e\\x9c\\xa4\\x6c\\xbc\\x33\\x01\\x18\\x99\\x98\\x6a\\x36\\xc5\\xa5\\xb1\\x14\\x4b\\x89\\x8c\\x3a\\x79\\x93\\xdd\\xc8\\x30\\xd6\\x80\\x56\\x7e\\xe2\\xd5\\xbe\\xc8\\x2b\\xfe\\x67\\xce\\x12\\x5e\\xfa\\x9e\\x0c\\x24\\x3a\\x79\\x87\\x49\\x6d\\x04\\x3c\\x26\\x44\\xdb\\xd4\\x6c\\x05\\x41\\xb9\\x05\\xb3\\x1a\\xf1\\x3f\\x8a\\x56\\x13\\x41\\xcc\\xe9\\xdd\\xe0\\x64\\x11\\x95\\x9c\\x5d\\x1f\\xb3\\xd4\\x17\\x63\\xc9\\xf2\\x41\\x4c\\x52\\x18\\x16\\x5a\\xc2\\xeb\\xce\\x62\\xd4\\xb7\\x64\\x32\\x63\\x4f\\x5c\\xe4\\x77\\xbc\\xac\\x79\\x59\\xad\\x80\\x95\\x1c\\x8b\\x17\\x6b\\xf2\\x94\\x86\\x5c\\xf6\\xb8\\x81\\x28\\x85\\x9c\\x1c\\xd1\\xff\\x49\\x6d\\x74\\xba\\xf4\\xd3\\x21\\x4e\\x7c\\x34\\x32\\x03\\x49\\x09\\x8d\\x57\\xa9\\x71\\x3c\\xd7\\xcb\\x7b\\xdb\\x04\\x72\\x2b\\x86\\xef\\xd3\\x91\\x5e\\xdb\\x4b\\x2b\\x4f\\x17\\xac\\xc3\\xf5\\x6a\\xbe\\x26\\x26\\xb9\\x9d\\x35\\x60\\x72\\xb5\\xda\\x34\\x05\\xa3\\xce\\x84\\x36\\xeb\\x45\\x1a\\x5e\\xab\\x4d\\x91\\xfb\\x95\\x8a\\xc5\\x84\\x6c\\xb7\\xb0\\x03\\xdf\\x64\\x7c\\x97\\x54\\xab\\x54\\xc0\\x50\\xbc\\xea\\x28\\x5f\\x87\\x11\\x81\\xfc\\x1e\\x90\\x4d\\x55\\x0c\\xf1\\x1b\\x30\\x8c\\x03\\xc9\\xbd\\x5d\\x00\\xc9\\x11\\xd5\\x14\\x08\\x98\\x7d\\x53\\xeb\\xf3\\x90\\x8c\\x03\\x60\\x25\\x15\\x1b\\xa3\\xf3\\x6c\\x78\\x67\\x9e\\x58\\x46\\xe4\\x0d\\x52\\xd8\\x9c\\x4d\\x78\\xb5\\xca\\x60\\x33\\xd2\\xf5\\xe1\\x70\\xb5\\xf2\\xce\\xe0\\x27\\x1d\\x6e\\x88\\x95\\x96\\x47\\xc0\\x44\\xc8\\x6d\\xca\\x69\\xbb\\x9a\\xaf\\x65\\x14\\x0f\\xd3\\xc5\\x56\\xec\\xa7\\xee\\x05\\x9e\\x08\\x79\\xda\\x80\\x61\\xe2\\x72\\x03\\x29\\x7d\\x02\\xf1\\x1f\\xe4\\xe9\\x87\\xe4\\x41\\xa2\\x0e\\xbd\\xd6\\x3b\\x2a\\x7a\\x25\\x16\\x78\\x6d\\xa0\\x26\\x41\\xef\\x38\\xb6\\xf2\\xea\\x6d\\x59\\xdc\\x57\\xde\\x9a\\x44\\xe1\\xc6\\x8f\\xa4\\x3d\\x98\\xb8\\x8f\\xf1\\x59\\x5e\\xb2\\x3b\\x1d\\x2a\\xb2\\xaa\\x05\\x4d\\xe2\\x5c\\xa3\\x14\\xfe\\x04\\x9b\\xe5\\x2e\\xf0\\xbe\\x2f\\x06\\xb8\\x85\\xe2\\x2e\\x1b\\xa4\\x65\\x71\\x23\\x80\\x72\\xec\\x0d\\xea\\x42\\xac\\xc2\\xf1\\x78\\x74\\xfb\\xa9\\x6e\\xc1\\x85\\xc3\\xa3\\x62\\xe9\\x83\\xe8\\x68\\x05\\xbb\\x61\\x71\\x9d\\xdd\\xf1\\x60\\x46\\x77\\xac\\xaa\\xbf\\x2b\\x92\\x2c\\xcd\\x78\\x12\\x3c\\x1d\\x29\\xaf\\xd9\\x46\\xfc\\xb5\\x91\\x4d\\xf0\\x74\\x5b\\xee\\x82\\x22\\xa2\\xa0\\xa5\\xf4\\xfe\\xf4\\xf5\\x3b\\x8f\\x66\\xd5\\xb7\\x45\\xcc\\x76\\xc1\\x36\\x92\\xf1\\x9f\\x23\\xb1\\x16\\x14\\xe3\\x00\\x07\\xc3\\x19\\xdd\\x97\\x85\\xf8\\x38\\x64\\xcf\\x10\\x28\\xa5\\x7a\\xcc\\x63\\xf1\\x43\\x62\\x0c\\xcc\\x3d\\xcd\\xf6\\xfb\\x5d\\x86\\x77\\xdf\\xf9\\xc3\\xe4\\xfe\\xfe\\x7e\\x92\\x16\\xe5\\xcd\\xe4\\xb6\\xdc\\xf1\\x3c\\x2e\\x12\\x9e\\x2c\\x20\\xcb\\x7e\\xc5\\xeb\\xf0\\xe7\\x77\\xdf\\x4c\\xfe\\xe8\\x51\\x4c\\x9d\\x51\\x05\\xe0\\x30\\x99\\x47\\x14\\x12\\x4f\\x20\\xe1\\xb2\\xdf\\xb1\\x2c\\xf7\\x30\\x50\\x3b\\x96\\x88\\x9f\\x1e\\x7d\\x10\\xcf\\xce\\x97\\x6e\\x76\\x74\\xa0\\x69\\x1d\\x7a\\x55\\x41\\x8c\\x36\\xab\\x82\\x28\\x91\\x35\\xae\\xd8\\x1d\\x93\\x91\\x9a\\x8f\\x6a\\xec\\x55\\xf0\\x24\\xfa\\x14\\xad\\xcf\\xf1\\x73\\xf0\\xa5\\x73\\xec\\x09\\x5a\\x9f\\x1f\\xa9\\x7b\\x5c\\xb0\\x89\\xa7\\x0a\\x7f\\xf9\\xee\\x5b\\x4f\\x8e\\x5d\\x15\\xbd\\xe3\\x0f\\xb5\\x1a\\x8c\\x2a\\x13\\x24\\x21\\x7e\\x57\\x1e\\x5c\\x31\\x6f\\x18\\x98\\x17\\x20\\xd9\\x86\\x44\\xdb\\x00\\x66\\x2a\\x96\\x17\\x1f\\x45\\x2f\\x5e\\x60\\xd1\\x9b\\xb2\\x5c\\xcc\\x37\\x30\\x54\\xe5\\x91\\x5a\\xd7\\x08\\xee\\xb2\\xda\\xa1\\x87\\x3a\\x18\\x0a\\x96\\x4d\\xc2\\xc1\\x6d\\x8f\\xfa\\x32\\x5a\\x56\\x91\\x0f\\x97\\x95\\x7b\\x3f\\x09\\xd6\\x2f\\xa8\\x22\\xdf\\x2d\\xa5\\x82\\x25\\x10\\x05\\x3f\\x6a\\x6b\\xeb\\xdf\\x22\\x7f\\x17\\x11\\x28\\x7c\\x57\\xb2\\xbc\\xda\\x17\\x65\\x2d\\x0a\\x6f\\x64\\x61\\xe3\\xb3\\x6d\\x7b\\x6a\\x44\\x36\\xb6\\x15\\x68\\x18\\xc1\\x8d\\xd8\\x91\\x23\\x8c\\x5e\\x9b\\x6b\\xf4\\x76\\x2f\\x3d\\x2f\\x76\\xe1\\xf5\\x54\\x4e\\xf9\\x70\\xb8\\xa6\\x37\\xe6\\x71\\x34\\xf2\\x77\\x56\\x96\\x85\\xdd\\xf4\\x0a\\x72\\x63\\x91\\x65\\xee\\xef\\x74\\x2e\\x6e\\x5a\\x38\\x4e\\x2f\\x74\\x1f\\xe6\\xd3\\x2f\\xd9\\x6e\\x17\\xb1\\xf8\\xba\\xf2\\xbd\\x22\\x8f\\xf9\\xe0\\x86\\xdf\\x14\\xe5\\xa3\\x47\\xe8\\x6f\\x02\\xe9\\xd5\\xac\\xbe\\xad\\xbe\\x2c\\x12\\x0e\\xb1\\xf4\\x4b\\x81\\xe2\\x2b\\xf1\\x5f\\x1d\\xce\\xe8\\x6d\\xe8\\xc5\\x2c\\x8f\\xf9\\x8e\\x27\\x1e\\xbd\\x0b\\x9f\\x4a\\xce\\x92\\xc7\\xb7\\x70\\x9c\\x67\\xb4\\x75\\x3b\\x76\\xf8\\xbe\\x67\\xa9\\x7f\\x11\\x86\\x61\\x8d\\x57\\x19\\xb8\\xe6\\x3e\\x1d\\xb5\\x70\\x79\\x13\\x69\\x1f\\xb7\\x74\\x15\\xb5\\xb3\\x02\\x84\\xd1\\xea\\x62\\x7d\\x8c\\xc2\\x74\\xc5\\x1a\\x6f\\x8e\\x0e\\x3b\\x1e\\xa1\\xd8\\x27\\x3a\\x8a\\x31\\x7d\\xbe\\xdb\\xb9\\xc3\\xaa\\x3a\\x22\\x6a\\xc0\\xa0\\x96\\x3c\\x40\\x5b\\xaf\\x4a\\xcc\\xe4\\xb7\\x5b\\x5e\\xd5\\xad\\x89\\xd8\\x39\\xcd\\xdc\\xac\\x60\\x8a\\x9f\\x3b\\x1c\\x7c\\x16\\x56\\x82\\x86\\xc1\\x84\\x04\\x8c\\x96\\x2b\\x06\\x77\\x11\\x2a\\x18\\x04\\xcb\\x5a\\x66\\x09\\xff\\x4e\\x12\\x16\\x9d\\x1a\\x73\\x90\\x34\\x29\\xd2\\x23\\x64\\xaa\\xad\\xd9\\x9c\\xee\\xb5\\x05\\xe7\\xae\\x8b\\xcb\\x9a\\x68\\xdf\\x34\\x46\\x7e\\x13\\x4c\\xf8\\xea\\x37\\x30\\xe9\\x5b\\x45\\x6b\\xa4\\x2a\\x06\\x77\\xca\\x1d\\x82\\xad\\xee\\xe4\\x9e\\x37\\xd2\\x82\\x52\\x16\\x09\\x60\\xef\\xd0\\xdb\\x1e\\x0e\\xb7\\x5a\\xbc\\x33\\x1a\\xc5\\x53\\xa8\\xe8\\x47\\x84\\x3e\\xf8\\x33\\x95\\x82\\xfc\\x78\\x14\\xe3\\x29\\xb4\\x77\\xd1\\x1d\\x31\\x76\\xf2\\xfb\\x29\\x4b\\x12\\x7a\\x37\\x95\\x17\\x40\\x78\\x87\\x2e\\x1c\\x77\\xc8\\x87\\x85\\x77\\xe0\\xaf\\x21\\xee\\xb1\\x72\\x17\\xfa\\x3e\\x3b\\x1c\\xe0\\xe7\\xe1\\x50\\x44\\x44\\x30\\x9e\\x5a\\x8a\\xc9\\x41\\x8a\\xa9\\x1f\\xaf\\x22\\x0a\\x68\\x7e\\xec\\x9d\\x9f\\x43\\x48\\x2a\\xcc\\x11\\x38\\xbd\\xe1\\xf5\\xb6\\x48\\x04\\xfd\\x86\\xa2\\xc1\\x6b\\x5d\\x82\\x55\\xe8\\xb5\\xa1\\x5f\\x94\\x36\\xd0\\x14\\x61\\x76\\xb9\\x7e\\x16\\xc4\\xf3\\xd6\\x52\\xa2\\x7d\\x3d\\x8d\\xcb\\xa2\\xaa\\xbe\\x2a\\x6e\\x58\\x96\\x43\\x9c\\x7d\\xc5\\x27\\xc1\\xf8\\x1b\\xac\\x12\\x75\\xaa\\x87\\x43\\x7f\\xb8\\x3d\\x1c\\x24\\x1d\\x00\\xd3\\x10\\x24\\xe3\\x85\\x7c\\xba\\x10\\x44\\xce\\x16\\x1d\\xe7\\xbd\\x6d\\x5d\\xef\\x03\\x41\\x8e\\x88\\xda\\x4b\\xef\\x8f\\x33\\x2f\\xf0\\x3e\\xfd\\xf4\\x95\\x47\\x08\\x78\\x7d\\x46\\xcd\\x6a\\xd0\\x9b\\x53\\x0f\\xbe\\x2e\\x26\\x38\\x1a\\x5d\\x4f\\xad\\x9b\\xd0\\x68\\xae\\x34\\x73\\xa1\\xea\\xc9\\x15\\x09\\x01\\x3b\\x33\\xb5\\x40\\x62\\x91\\x4b\\x96\\x40\\x1c\\x51\\xb6\\x23\\x84\\x96\\x02\\x5f\\xd2\\x6b\\x1a\\xd1\\x3b\\x42\\xf1\\xa4\\xab\\x68\\x39\\x8b\\x4c\\x25\\xa2\\x12\\x5f\\xc5\\x9b\\x98\\x66\\x18\\x23\\x2a\\x9f\\xe2\\x8d\\x3f\\x1e\\x03\\xa5\\xef\\x64\\x65\\xf5\\x00\\x23\\xd6\\xac\\xac\\xcd\\xa6\\xe2\\x1f\\x37\\x2a\\x28\\xbd\\x06\\x9d\\x94\\x4c\\xc4\\x32\\xcc\\xe4\\xcd\\x8f\\x55\\x09\\x4d\\x42\\xd8\\x05\\xa7\\x16\\x9c\\x32\\x39\\x3f\\xf9\\x7e\\x1c\\xfa\\x49\\xa4\\xe8\\xf4\\xa5\\x37\\xf2\\x02\\x6f\\xe9\\x91\\xb1\\x9c\\xae\\x34\\x5a\\xc1\\x27\\xd8\\x42\\x16\\x6f\\xb9\\x4a\\x85\\x8b\\x10\\x9b\\x9a\\xe6\\x46\\x47\\x99\\x46\\xd4\\xfb\\x78\\xfe\\x3e\\xf4\\xc6\\x71\\x34\\x1e\\x93\\x20\\x19\\x77\\x7e\\xc6\\xd3\\x35\\x44\\xe7\\x59\\xaa\\x48\\x1f\\xc8\\x61\\x62\\xd3\\x42\\xab\\x64\\x3d\\x1a\\xdd\\x4d\\x9b\\x88\\xca\\xf7\\xde\\xa4\\x13\\x55\\x67\\xf2\\x36\\xcb\\x63\\xee\\xd1\\x56\\x4b\\x90\\x42\\xd6\\x6c\\x73\\xaa\\x93\\xef\\x8b\\x9c\\x4f\\xbe\\x13\\x60\\xee\\x99\\xda\\x84\\x50\\xdf\\x00\\x8e\\x59\\x47\\xf1\\x64\\x11\\x4e\\x43\\x4c\\x24\\x1c\\xd9\\x65\\xa4\\xfb\\x4b\\x0e\\xfb\\x44\\x9d\\x5e\\x08\\xed\\x6a\\xf0\\x39\\x10\\x58\\x9e\\x7d\\x66\\x81\\x8f\\xb9\\x96\\x59\\xcb\\xaa\\x95\\xfb\\x66\\xbd\\xec\\x7d\\x33\\x96\\x14\\xbc\\x5b\\xbc\\xf4\\xe8\\xc0\\x1b\\xe7\\xd1\\xd8\\x5b\\x0c\\x7e\\x0b\\x67\\xd3\\xd9\\xdc\\x0b\\x3c\\x8f\\x04\\xa6\\x1b\\x70\\xf5\\x02\\x8e\\xf6\\x4a\\x60\\xd8\\xeb\\xe9\\x16\\xaf\\x15\\xd2\\x31\\xde\\x2b\\xaa\\x5f\\xaf\\xae\\x30\\xdb\\xe1\\xf5\\x14\\x13\\x43\\xbc\\xe5\\x79\\x82\\x61\\x40\\xf5\\x23\\xea\\xcd\\x76\\xf4\\x8e\\x5e\\x13\\x99\\x8d\\x19\\xcf\\x90\\x3e\\x44\\x12\\xd7\\x92\\xc5\\x6d\\xe8\\xc1\\x4f\\x4f\\x0f\\xe4\\x49\\xa2\\xd3\\x60\\x2e\\x89\\xf2\\x39\\xd5\\xbe\\x5b\\xf3\\x23\\xb9\\x5b\\x5d\\xad\\xfd\\x6b\\x35\\x88\\x38\\x2c\\x05\\x11\\x23\\x4f\\x2a\\x79\\xba\\x9b\\x9a\\xab\\x3c\\x9c\\x43\\x8a\\xba\\xc6\\x01\\x84\\x04\\x17\\xab\\x3b\\x7a\\xbd\\x16\\xa0\\x09\\xf4\\xb2\\x58\\xf5\\x1a\\x8d\\x8b\\x2f\\x67\\xc0\\xba\\x74\\x47\\xa7\\x50\\xa3\\xf6\\x64\\x65\\x8f\\x1c\\xa9\\x6e\\x49\\x30\\x9d\\x4f\\x1d\\xce\\x69\\x3c\\xad\\x04\\xf5\\x5f\\xd2\\x07\\xc5\\x7b\\xdc\\x23\\x9d\\x00\\x57\\x1a\\x01\\x76\\x65\\x70\\xbf\\x78\\xf0\\x27\\x73\\x7a\\x4f\\x8e\\xe8\\x06\\x0c\\x4f\\x82\\xf7\\xd0\\xf4\\x99\\x67\\xc5\\xa3\\x7a\\xc0\\x30\\xad\\x5a\\x98\\x42\\x4b\\x5a\\xd1\\x5b\\x7a\\x4f\\x1f\\xc2\\x68\\x71\\x31\\x0c\\x43\\x41\\x45\\xd5\\xe1\\x05\\xdd\\x8c\\x46\\x8e\\xb1\\xf4\\x86\\xe8\\x1c\\xe9\\x94\\x43\\x84\\x10\\x8f\\x3a\\x8b\\xc4\\x2e\\x67\\xcb\\x4f\\x83\\x19\\xbd\\x0a\\xd9\\x65\\x78\\x31\\x9b\\x8d\\x46\\xaf\\x66\\xb3\\x4b\\x76\\x38\\xbc\\x9a\\x7d\\x1a\\x86\\x21\\x03\\x0b\\xb1\\xdb\\xb0\\x8e\\xfc\\x6b\\x7a\\x47\\x53\\x42\\xe8\\x6d\\x78\\x2b\\x1e\\x6e\\xe9\\x1d\\xbd\\x22\\xf4\\x6a\\xe9\\x37\\x4e\\xf8\\x7d\\x78\\xd7\\x25\\x61\\xf8\\x96\\x55\\xb5\\x3e\\xd3\\x1e\\xa1\\xf7\\x5d\\xc8\\x20\\xbc\\x27\\xb4\\xa7\\xbd\\x38\\xbb\\xba\\x99\\x3c\\xc8\\xe1\\x3d\\x21\\xf4\\x02\\x07\\x7a\\x38\\x78\\x7f\\xfe\\xfa\\xf3\\xaf\\x20\\x6e\\x02\\xe0\\xca\\xe5\\x43\\xe8\\xe5\\x85\\x0a\\x22\\x1b\\xc8\\xf9\\x60\\x69\\x7d\\xa3\\x06\\x12\\xf8\\x0f\\xe1\\x2d\\x50\\x0e\\x9c\\x96\\xe1\\x2d\\xe2\\xc7\\x2a\\xbc\\xc5\\x4b\\x9c\\x5e\\x85\\xc3\\x8a\\x90\\xc0\\xaf\\xc2\\x07\\x2a\\xae\\xf0\\xe1\\x03\\x19\\x8d\\xfc\\x87\\xd0\\x93\\x7c\\xe3\\xec\\x12\\x52\\x12\\x85\\x33\\x71\\x19\\x29\\x0a\\x24\\x64\\xfa\\x27\\x04\\x31\\xf7\\xa3\\xc3\\xe1\\x41\\xdc\\xf9\\xf4\\x6a\\x59\\x38\\xde\\xb1\\x3b\\xba\\x2a\\xe9\\x03\\xbd\\x5b\\x93\\xa0\\xb0\\xfd\\x63\\x77\\x02\\x44\\x1f\\x68\\xb5\\x36\\x9d\\x0a\\x6a\\xc9\\xff\\x4d\\x10\\xb7\\x72\\x3b\\x1d\\xe0\\xbe\\x5a\\x22\\x78\\x4b\\x5e\\x34\\x80\\xa7\\xaf\\x71\\x8c\\x02\\xda\\xe9\\xd5\\xb2\\x0c\\x44\\x77\\x7b\\x08\\x8a\\x61\\x7d\\x64\\x0d\\x99\\x1c\\xfd\\xc6\\x39\\xf9\\x52\\x1e\\x39\\x7d\\x56\\x26\\x13\\x75\\xb9\\x1d\\x0e\\x3d\\x57\\x5b\\xb1\\xb7\\x53\\xcf\\xdc\\x01\\xd5\\x2a\\xb8\\xa2\\x3e\\xf1\\x7f\\xae\\xec\\xff\\x68\\x4c\\x3d\\xe0\\xa5\\x08\\xb4\\x79\\x0b\\x8c\\x60\\x9f\\x5a\\x0c\\xdb\\xc8\\x35\\x88\\x4c\\x82\\x1f\\x47\\x0d\\xb7\\xe1\\xb5\\x47\\xbd\\x7d\\x51\\xd5\\xed\\xa0\\x90\\x4d\\x65\\x8e\\xeb\\xbc\\xe3\\x0a\\x61\\x41\\x63\\xcf\\x0f\\x87\\x84\\x26\\x61\\xac\\x4f\\x12\\x91\\x6c\\x98\\x0f\\xbc\\x1c\\x43\\x86\\x3d\\xa2\\x0a\\xfd\\x06\\x1c\\x45\\x01\\x31\\x55\\xa8\\x2c\\x51\\x96\\xa0\\x2a\\xa5\\x4f\\xa7\\x0a\\xae\\xdd\\x27\\x0a\\x01\\x74\\xbf\\x6a\\xae\\x8a\\xcd\\x9f\\x6b\\x41\\xc0\\x9c\\x2a\\x29\\x88\\xe0\\x27\\x49\\xc3\\xdb\\xf2\\xbe\\x64\\xfb\\xcf\\x77\\x1d\\x26\\x15\\x8b\\xae\\x59\\x33\\xb2\\x3c\\x6d\\x91\\x25\\xbb\\x73\\xad\\xb1\\x08\\x39\\x12\\xcc\\xaa\\x01\\xf7\\x18\\xe8\\x78\\x7b\\x52\\x46\\x91\\x29\\xff\\xcd\\x9f\\x11\\x2b\\x7d\\x8f\\xaa\\xe6\\x5a\\x4c\\x3a\\x69\\xff\\x64\\x15\\x42\\xa3\\x66\\x3a\\x39\\xf4\\xfe\\x00\\x3f\\x75\\x64\\xc0\\x18\\xa6\\xa1\\x92\\x9a\\x13\\x4c\\x8d\\xc8\\xc2\\x8e\\x52\\x13\\x9f\\x58\\xe7\\x45\\xab\\x31\\x07\\x99\\x0c\\x4a\\x27\\x66\\xfa\\x26\\xcf\\xf9\\x33\\x6e\\x0c\\xbd\\x96\\x4e\\x8d\\x45\\x83\\xae\\x5a\\xcb\\xd6\\xca\\xa1\\xa0\\xad\\x97\\xe2\\x50\\xd3\\x1e\\x95\\x6f\\x5c\\x95\\x96\\xb1\\xd9\\x02\\x12\\x44\\x56\\x4a\\x37\\x39\\xe4\\x4e\\xf3\\x06\\x67\\x88\\x8b\\x93\\x59\\xc4\\x9a\\x1b\\x1d\\xb9\\xa6\\x30\\x24\\xc0\\x4f\\xdd\\xe6\\xee\\xc7\\xdc\\x95\\xc1\\xbd\\xec\\xc8\\x2e\\x6a\\x99\\x09\\xa0\\x29\\x13\\xe6\\x61\\x3f\\x1c\\x8c\\xc5\\x9f\\x4e\\x24\\x25\\xcd\\xaa\\x4c\\xe6\\xdc\\xa3\\x74\\xfa\\x55\\x46\\x1e\\xfb\\x52\\xba\\x09\\x57\\x2a\\x5a\\x4a\\xa7\\xa1\\xb0\\x15\\xba\\xf5\\x75\\x38\\x1b\\x8d\\xdc\\x80\\xea\\xaf\\x43\\xf0\\x75\\x72\\x7a\\x83\\x14\\x02\\x3b\\xde\\xd1\\xdd\\xb0\\xf3\\xbb\\x62\\xf9\\x41\\x18\\x72\\x17\\x85\\xe7\\xff\\x7c\\x31\\x3b\\xdf\\xd0\\xfb\\x28\\x3c\\xff\\x75\\xf5\\xeb\\xfa\\xe3\\x73\\xfa\\x00\\x66\\x4e\\xcb\\x5f\\xf3\\xf3\\x0d\\x7d\\x94\\x9a\\x30\\x54\\x51\\x4b\\x63\\xf6\\x43\\x76\\xc3\\x36\\xa0\\x34\\xe3\\x35\\xe8\\xcf\\xc8\\xc7\\xe7\\x19\\xfd\\x7b\\x74\\xca\\x0c\\xfe\\x9a\\x3f\\x6e\\x78\\x4e\\xce\\x33\\x43\\x27\\x7c\\xde\\x94\\x71\\xb7\\x02\\x87\\x4a\\x14\\xe9\\x78\\x62\\x71\\xf2\\x14\\x1f\\x0e\\xf7\\x91\\x8a\\x6b\\xba\\x4c\\x7c\\x46\\x39\\x09\\x44\\x6f\\x63\\x6f\\xe5\\x8d\\xfd\\x96\\x40\\x88\\x2f\\x23\\x41\\x4e\\x8e\\xbd\\xb5\\x47\\x39\\x2a\\x7c\\xad\\xcc\\xcd\\x87\\x83\\x6a\\x30\\xd4\\x59\\x9f\\x23\\x42\\x12\\xc0\\xc0\\x0d\\x7f\\xdd\\x88\\xe8\\xcf\\x70\\xe8\\x2e\\x5a\\xf1\\x35\\xf6\\x28\\x99\\xb4\\xb0\\xd3\\xfe\\x03\\x73\\x86\\x35\\xc2\\x08\\x84\\x0d\\x27\\xfd\\x65\\xe4\\x2b\\xf3\\xa0\\x68\\xe9\\x79\\x02\\x49\\xaf\\x94\\xe9\\xcc\\x3a\\x44\\xe9\\xe7\\xcf\\x3f\\xbd\\x11\\xb7\\x5d\\x91\\x43\\x96\\x3b\\x32\\xf6\\x42\\x6f\\xdc\\xf1\\x26\\x22\\x47\\x27\\x9d\\x64\\x24\\x2d\\xe7\\x6d\\xc9\\x9b\\xe0\\xfa\\x1c\\xfd\\x91\\xcd\\x55\\x5a\\xe1\\x68\\x18\\x18\\xa3\\xa3\\x9c\\x4b\\x46\\x16\\xf8\\x71\\xc7\\xb2\\x5c\\x3b\\xa1\\xab\\x6d\\x72\\x82\\x0b\\xe3\\x79\\x99\\xe6\\xec\\x86\\x53\\x63\\xa7\\xa5\\x17\\xde\\x0a\\x8d\\xf3\\x79\\xe4\\xc7\\x14\\x42\\xe0\\x88\\xcd\\x35\\x51\\x0a\\xae\\x8a\\x2c\\xf7\\xbd\\x91\\x25\\x6c\\xb8\\x8b\\xa8\\x37\\xf6\\x9a\\x17\\x46\\xc5\\xcb\\x8c\\xed\\xb2\\xbf\\x77\\x66\\x85\\x91\\x9c\\x33\\xc6\\xb7\\x54\\x15\\x71\\x5e\\x84\\x1c\\xa9\\x5b\\xd4\\x87\\x1d\\x3a\\x71\\xb8\\x74\\xbd\\x42\\xac\\xc0\\xa5\\xe2\\xdb\\x18\\x61\\xb1\\xa5\\x6d\\xe4\\x23\\x6d\\x4d\\x8f\\x44\\xc5\\x09\\xe8\\xbc\\x12\\x00\\xf6\\x1c\\x6c\\x97\\x83\\x79\\xe6\\x50\\x21\\x9b\\xac\\xf2\\xbd\\xc0\\x58\\x37\\x8d\\x46\\x7f\\x97\\xc7\\xc0\\xb1\\xaa\\x23\\xa3\\xd1\\xf0\\x31\\x32\\x29\\x40\\x15\\x5e\\x92\\x59\\xe6\\x87\\x2a\\x7b\\xbe\\xb8\\x05\\xdd\\xb9\\xd9\\xfe\\xc3\\xb6\\x05\\xa1\\x1b\\x3e\\x33\\x46\\x49\\x9f\\x81\\x90\\x18\\xf2\\xfb\\xb3\\xbd\\x1f\\x77\\x18\\x0a\\x3e\\x89\\x39\\x04\\x11\\x42\\x02\\x00\\x41\\x60\\x92\\x8c\\x3e\\x44\\xd4\\xfb\\xb5\\xfc\\x35\\x07\\x8a\\x28\\xe8\\xa8\\x1a\\x77\\x57\\xc5\\x4c\\x79\\x88\\x57\\x1d\\x18\\x7e\\xd8\\x96\\xb6\\x2f\\xa6\\xe0\\x72\\xac\\x80\\xb8\\xbf\\x7c\\xf7\\xed\\x9f\\xeb\\x7a\\x2f\\xd9\\x45\\xc9\\xef\\x30\\xf2\\x74\\x44\\x6c\\xf8\\x45\\x14\\xce\\xe8\\x97\\xa0\\x97\\xff\\x2a\\x0a\\x9f\\x66\\xe0\\x64\\x3a\\xbf\\xb8\\x78\\x15\\x5c\\xcc\\x3e\\x3d\\xd2\\xaf\\x9b\\x27\\x48\\x7c\\xcd\\x27\\x0b\\x36\\x65\\x75\\xcd\\xe2\\xed\\xd7\\x28\\x67\\x71\\x1e\\x7d\\xaf\\xc8\\xd1\\x8e\\xc8\\xb3\\x4f\\x87\\xce\\x85\\x2b\\x8e\\xc0\\x97\\x11\\xf9\\x32\\x5a\\xb1\\x35\\x44\\xc3\\x12\\xec\\x78\\x59\\x85\\xc3\\xe1\\xd7\\xd1\\x68\\xe4\\xdd\\x67\\xf5\\xf6\\xcb\\x92\\x27\\x3c\\xaf\\x33\\xb6\\xab\\xbc\\x2c\\x1f\\x7c\\x1d\\x09\\x56\\xf0\\x8a\\x3d\\x84\\x5f\\x47\\x50\\x4d\\x2e\\x81\\x66\\xc5\\xfc\\x5e\\xca\\x09\\xfb\\x3e\\x1c\\x44\\xd7\\x43\\x66\\x8b\\xc2\\x96\\x4f\\x95\\x93\\x35\\xda\\xd6\\x3b\\x86\\x0c\\xe7\\x49\\x37\\xe1\\x78\\xfc\\x45\\x84\\xe9\\xc0\\x8a\\xbd\\xb8\\x45\\x50\\x94\\xc7\\x40\\xc6\\xc3\\x90\\x3f\\x15\\x4f\\x15\\x2f\\x61\\x0b\\xd9\\x74\\xcf\\xaa\\xea\\xbe\\x28\\x13\\x42\\xa1\\x13\\xd4\\x7b\\x18\\xb5\\x9c\\x53\\xb8\\xe2\\xeb\\xd0\\x2a\\x58\\xf1\\xf5\\xc2\\x68\\x82\\x47\\xa3\\x74\\xda\\x14\\xe2\\x76\\x95\\xf9\\xa6\\x89\\xf8\\xa6\\x35\\xc5\\xc3\\x21\\x5e\\x79\\xbf\\x4c\\xe4\\xde\\xf3\\x64\\x02\\xb9\\x1f\\x21\\xa0\\x7e\\x57\\x79\\xe8\\xb9\\xc0\\x22\\x23\\xcb\\x48\\xa5\\x70\\xda\\x96\\x3a\\x70\\x1a\\x43\\xac\\x86\\xa8\\xeb\\x52\\xb7\\xb6\\x5e\\xa0\\x62\\x29\\xd2\\xfa\\x12\\x02\\x5d\\x47\\x61\\x3a\\x2d\\x00\\x44\\xe0\\x07\\xca\\x63\\xc1\\x98\\x49\\x4a\\x1b\\x80\\x13\\x4c\\x95\\x14\\x22\\x90\\xdc\\x1c\\x94\\x26\\x90\\x99\\x4d\\x70\\x5c\\x34\\xb5\\x98\\x38\\x12\\x24\\xfe\\x57\\xd1\\x4a\\x15\\xad\\x0f\\x87\\xce\\x6a\\x6d\\x7b\\xd5\\x74\\x6a\\xab\\x9e\\x96\\x32\\x87\\xbb\\x53\\x78\\x94\\xba\\x6a\\x9a\\x4e\\x3b\\x05\\xfd\\x3e\\x01\\x33\\x53\\x3d\\xa7\\xc8\\x27\\xd4\\xcc\\x2b\\xf2\\xe5\\xf0\\x09\\x8d\\x42\\x98\\xbf\\x28\\xc2\\x79\\xca\\x1c\\xc3\\x28\\x90\\x60\\x8e\\xa8\\x0b\\x55\\xc5\\x18\\xe2\\x42\\xc9\\x29\\xb6\\x32\\xf5\\x06\\x8a\\x28\\xb6\\xc7\\x96\\xf0\\x1c\\xd6\\x3a\\x12\\x68\\xc2\\x8e\\xeb\\x6e\\xe9\\x7a\\xb4\\xe2\\x10\\x59\\x15\\xa9\\x21\\x34\\xea\\x3d\\x3a\\x70\\x34\\x80\\x3d\\xe5\\x3c\\xbe\\xe9\\x2c\\x7f\\x98\\x98\\x37\\x8e\\xa2\\x50\\x7e\\xed\\xdc\\x5f\\x06\\xa2\\xcf\\x83\\xa8\\x46\\xb0\\xf0\\xbc\\xa1\\xd8\\x03\\x0d\\x9d\\xec\\xa2\\x8b\\xac\\x77\\xb2\\xac\\x32\\x42\\xd9\\xd1\\xe0\\x44\\xad\\x50\\xf3\\x35\\x2b\\xe6\\x60\\x06\\x9d\\x6a\\x1a\\x05\\xaa\\xe0\\xf1\\x89\\xa2\\x55\\x74\\x4f\\x75\\x05\\xeb\\xca\\x7f\\x5b\\x30\\x79\\x44\\x7f\\xc3\\x20\\x9d\\xce\\x6f\\x80\\xed\\x80\\xd5\\x8f\\xb1\\x53\\x53\\x5a\\x69\\x07\\xeb\\x00\\x6f\\x2b\\x38\\x0a\\xef\\x35\\xf6\\x76\\xe9\\x11\\xbc\\x65\\x9f\\x8c\\xae\\x18\\x75\\xbf\\x01\\x9b\\x62\\x95\\x2f\\xf1\\x99\\x56\\x65\\x1c\\x00\\x22\\x3a\\x92\\x69\\x91\\xfb\\x1e\\x98\\x6e\\x4a\\xb9\\x47\\xec\\x1c\\xc9\\x48\\x27\\x5d\\xa6\\x31\\x9e\\x33\\x36\\x1a\\x71\\xdf\\x3a\\x56\\x28\\x91\\xf9\\x74\\xf6\\x29\\x5c\\x00\\xf8\\x88\\x91\\x0a\\xb7\\x9c\\xb9\\xc9\\xd2\\x22\\xc1\\xe6\\x75\\x40\\x5e\\x3c\\x1a\\xc5\\x02\\xf2\\x94\\xe9\\xdf\\x37\\x91\\x20\\x01\\xff\\x14\\x85\\xe7\\x7e\\x48\\x7e\\x5d\\xfa\\xcb\\x70\\x74\\xf8\\x98\\x1c\\x7e\\x5d\\xa2\\x11\\xa0\\x05\\x94\\x57\\x55\\x91\\xef\\x03\\x2f\\x96\\xfa\\x42\\x54\\xff\\xee\\x95\\xfa\\xb0\\x1d\\xe0\\xfc\\x9b\\x08\\x63\\x36\\x80\\xa4\\x03\\xe2\\xfb\\x15\\x63\\xef\\x3d\\x4a\\xb4\\x6d\\x5a\\x62\\xc5\\xc0\\xf8\\x89\\x75\\x02\\x88\\xf8\\x06\\x68\\x88\\xf7\\x9e\\x13\\xf5\\xa0\\x99\\xca\\x23\\x9a\\x42\\x25\\x15\\xf0\\xe5\\x4f\\x92\\xca\\x88\\xc4\\xc2\\x93\\xa5\\x77\\x5b\\xee\\xbc\\xa0\\x85\\x54\\x22\\x29\\xbd\\x1e\\xfa\\x8e\\x74\\x1a\\x3d\\x9e\\xb4\\xab\\xd1\\xb3\\x7a\\x7f\\x41\\xef\\x98\\x0f\\x82\\x32\\x60\\x34\\xf2\\xc4\\x5f\\x43\\x75\\x6d\\x0f\\x07\\x0f\\xa7\\x01\\xe9\\xc8\\x1d\\x19\\xb3\\xcf\\xd5\\xf0\\xd5\\x62\\x36\\x08\\x70\\xf7\\x25\\x59\\x36\\x0a\\x7c\\xc1\\xbe\\x3a\\x25\\x74\\xbb\\x8c\\x56\\xdb\\x75\\x28\\xfe\\xd3\\x74\\xca\\x9f\\x40\\xeb\\xe0\\x8d\\xb9\\xae\\xae\\x56\\x2b\\x6a\\xe8\\x3a\\xd4\\xaa\\x29\\x45\\x84\\xac\\x8e\\x34\\x3d\\x24\\x9a\\x35\\xc6\\x39\\xf2\\x78\\xa1\\x16\\x7f\\x1d\\xb6\\x09\\x55\\x48\\x9e\\x8a\\x36\\x95\\x7c\\xec\\x0d\\xee\\x59\\x35\\xc8\\x8b\\x7a\\x20\\xc0\\x08\\x24\\x98\\x9b\\xd5\\x6c\\x7d\\xa4\\xee\\x92\\x84\\x28\\xc8\\x82\\x20\\x93\\x7c\\x4d\\xc5\\x7f\\x76\\xcf\\x1b\\x63\\xef\\x7a\\xa4\\x49\\x47\\xe8\\x46\\x6c\\x00\\x3c\\x10\\x4c\\xcf\\x5d\\xdc\\xb8\\xb1\\x58\\x02\\x50\\x6f\\xab\\xad\\xcf\\x89\\xcc\\x7d\\x6d\\xad\\x7d\\x4a\\x46\\xa3\\xd4\\xdf\\x80\\xcc\\x64\\x13\\xa6\\x26\\xb0\\xb2\\x96\\x98\\xd9\\x28\\x1c\\x6c\\x15\\x20\\x8f\\x65\\x53\\x58\\xf7\\x32\\xf3\\xd7\\x4e\\xff\\x31\\x69\\x09\\x29\\x70\\x1f\\x98\\x0b\\xec\\xd0\\x1e\\x32\\xbc\\x53\\xa9\\xf3\\x29\\x0f\\x87\\xf1\\x68\\xb4\\x5a\\x9b\\xdc\\x74\\xab\\xa8\\x11\\xfa\\x22\\x59\\xcd\\xd7\\x64\\x1d\\x40\\xac\\x4f\\x37\\x23\\xf9\\x8a\\x21\\x7f\\x83\\x01\\x89\\x54\\x7a\\xf1\\xdc\\xe7\\xc4\\xa0\\x23\\x95\\x0e\\x7c\\xb5\\xa6\\x89\\x2d\\x47\\x90\\xcc\\xfa\\x9f\\xc1\\xf1\\x23\\x9f\\x0a\\xd4\\xb6\\xd0\\xbf\\xba\\xd6\\xa0\\x2b\\x38\\xd6\\x9f\\x23\\xb5\\x06\\x7f\\x8e\\xba\\xe3\\xfa\\x2c\\x6c\\x7f\\x6d\\x78\\xb7\\x0d\\x99\\xed\\x0b\\x68\\x8e\\xd9\\x65\\x08\\x1e\\x9d\\x4a\\x73\\xcb\\xa4\\x09\\xda\\x96\\x10\\x0a\\xe1\\xf8\\xe0\\x69\\x06\\x89\\x7b\\x9a\\x4c\\xae\\x5c\\x67\\x29\\x9c\\x0c\\xa2\\x8e\\x80\\x78\\x10\\xd6\\x3a\\xf4\\x7e\\xfc\\xe1\\xed\\x3b\\x01\\xb9\\xda\\x5c\\x5d\\x71\\xac\\x8e\\xd8\\x91\\x5b\\x22\\x47\\x34\\xee\\x91\\xa6\\x4d\\xa4\\x11\\x57\\x96\\x91\\xa7\\xd4\\x40\\x34\\xdd\\x60\\x62\\xf9\\x64\\x29\\xae\\x9b\\x24\\xbb\\x13\\x77\\x8d\\x14\\x4e\\x59\\x10\\x26\\xb8\\x24\\x70\\xb6\\xf1\\x13\\x94\\x24\\x69\\x8d\\xba\\x1f\\x8f\\x46\\x2e\\xe3\\xb4\\x41\\x36\\x38\\xa6\\xe9\\xe1\\x60\\xd9\\xc6\\x01\\xa5\\x15\\x51\\xb6\\x16\\x57\\x08\\x6a\\xf9\\xb5\\xe8\\xd7\\xa8\\x59\\xa9\\x91\\x4b\\xd3\\x86\\x50\\xdb\\x16\\x8f\\x3b\\x82\\x73\\x6a\\xb4\\x44\\xed\\x6c\\x42\\x4d\\x47\\x80\\x2e\\xe3\\xf7\\x2e\\xc9\\x94\\x8c\\x78\\x94\\x74\\x4b\\x7d\\x37\\x25\\xdf\\xfb\\x3a\\x1c\\x97\\x2d\\x3b\\xd4\\x51\\x76\\x04\\xe2\\xc5\\x58\\xae\\x72\\xe3\\x10\\x7a\\xdf\\x80\\xfd\\x9f\\xce\\x49\\xed\\x66\\x25\\x36\\x42\\xa1\\xbf\\x44\\xce\\xf7\\xb2\\xea\\x3f\\xb2\\x3c\\x29\\xee\\x7d\\x46\\x96\\x2c\\xf8\\xd7\\xb0\\x99\\x50\\xcc\\xca\\x6d\\x7d\\xcc\\xa5\\x9c\\x0c\\x1c\\x55\\x7e\\x80\\x9f\\xa7\\x42\\x12\\x58\\xf6\\x3f\\x2a\\x8f\\xa2\\xcc\\xce\\xe9\\x11\\xba\\xc3\\x04\\xef\\x37\\xe1\\xd3\\x71\\xe1\\x09\\x8a\\x39\\x8b\\x65\\x90\\x6b\\x95\\x95\\x6a\\xaa\\x6a\\x87\\x5e\\xc9\\x77\\xac\\xce\\xee\\xb8\\x47\\xe8\\x36\\xdc\\xc9\\x51\\xf8\\x18\\x9c\\x4f\\x76\\x0d\\xfa\\x06\\x9a\\x99\\x82\\x1d\\x4f\\x6b\\x8f\\xd0\\xab\\xd0\\x37\\xa9\\x40\\xc5\\x07\\x0e\\x07\\x2f\\xcd\\x1e\\x78\\x02\\x0f\\x90\\x84\\x6f\\x9c\\xd9\\xb7\\xe4\\x6d\\x5d\\x78\\xe4\\x72\\x32\\xa7\\x57\\x4b\\x3f\\x09\\x77\\x7a\\x14\\xc0\\x9f\\x25\\x90\\x98\\x97\\x87\\xc9\\x54\\x74\\x4f\\x02\\x7f\\x63\\x27\\xac\\x4a\\xc9\\xe1\\x30\\x73\\x73\\x1b\\x66\\xa2\\xa8\\x75\\x46\\x41\\x58\\x14\\xa9\\x80\\xa2\\x31\\x1e\\x63\\x74\\x2a\\x9b\\x42\\x24\\x35\\xff\\x46\\xfc\\xc5\\xa7\\xc9\\x56\\xfc\\x3f\\xde\\x98\\x2a\\xe2\\xdb\\x50\\x47\\xfc\\x90\\xcf\\x93\\x2d\\xfc\\x11\\xf7\\x9a\\x77\\x5b\\x09\\xdc\\x94\\xe5\\x83\\x68\\x19\\x4d\\xe1\\x41\\x7d\\xea\\x86\\x04\\x3b\\x58\\xa0\\x1b\\x4c\\xfa\\x60\\x49\\x79\\x8a\\xe6\\x7e\\x92\\x53\\x3e\\x95\\x86\\xb8\\xb5\\x32\\xf0\\xb7\\x75\\x04\\x72\\xab\\xa6\\x1a\\x5e\\x54\\xe4\\xb8\\x88\\x28\\x97\\x4f\\xf0\\x86\\x93\\xf2\\x7c\\xca\\xc3\\x27\\xc8\\x27\\x4d\\x21\\x9f\\xf4\\xec\\x48\\xd3\\x30\\x81\\x10\\x93\\xb6\\xc6\\x00\\x18\\x64\\xe3\\x85\\x98\\xb6\\x32\\x70\\x5b\\x49\\xce\\x21\\xcc\\x88\\xaf\\x23\\x6e\\x6e\\x78\\xfd\\x45\\x71\\x9b\\x27\\x59\\xbe\\xf9\\x72\\x97\\xf1\\xbc\\xfe\\x89\\xc7\\xf5\\x30\\x0c\\x7f\\x46\\x27\\xcf\\xee\\xf7\\x3e\\x11\\x84\\xec\\x5f\\x22\\x3f\\x25\\x14\\x86\\xc7\\x61\\x43\\xe2\\xe9\\x9e\\x6d\\xf8\\x5f\\x71\\x5e\\x93\\x68\\x1a\\x43\\x83\\x77\\xc5\\x1e\\x07\\xcf\\x71\\x3f\\xb0\\xd6\\x2f\\x8d\\x5a\\xdf\\xf2\\xb4\\x3e\\x92\\x80\\x1f\\xe9\\xbe\\x23\\x39\\x73\\x96\\x6a\\x05\\x87\\x0a\\x75\\x46\\x63\\xbd\\x46\\x49\\x63\\x8d\\x94\\x05\\xbd\\x86\\x6a\\x99\\x42\\xc2\\x3e\\x6e\\xcb\\x08\\x7d\\xf8\\xba\\x26\\x17\\xf8\\x52\\x38\\x86\\x7b\\xf5\\xa3\\x94\\xd4\\xd3\\xc8\\x2e\\x85\\xcb\\xd3\\xc4\\xbd\\x11\\xe3\\xc0\\xcb\\x80\\x80\\x81\\x3b\\xd3\\xd5\\x08\\x85\\x33\\xa2\\x93\\xa1\\x42\\x4d\\xcc\\xe7\\xf5\\xae\\xd8\\xeb\\x54\\xa8\\xa2\\x1a\\xac\\x4f\\x47\\x3d\\xb1\\x38\\xa6\\xa2\\x5c\\x73\\x3c\\x0a\\xd0\\xf7\\x44\\x4f\\x10\\x33\\x38\\xbc\\x13\\x28\\x5d\\x74\\x09\\x0b\\x22\\x8f\\x03\\x76\\xdf\\xac\\x2a\\xba\\x86\\xba\\xc7\\xe3\\x91\\xda\\xf3\\xfd\\x20\\xc9\\x64\\x6b\\xb5\\x0e\\x87\\x37\\x91\\x52\\x37\\x81\\x04\\xd7\\x8e\\x10\\x84\\xcb\\x04\\x56\\x48\\x0a\\xcb\\x75\\x20\\x44\\xd0\\x49\\xd9\\x7d\\x6a\\x39\\xa7\\xe8\\xfc\\xe8\\x86\\xfd\\xd3\\x59\\x60\\x02\\xcf\\x82\\x2e\\x8f\\xea\\xac\\x31\\x58\\x2e\\x61\\xd3\\x4e\\xa0\\x66\\x05\\x5a\\x73\\xaa\\x84\\x61\\x18\\xb7\\x43\\x19\\xf2\\xde\\xcc\\x64\\x11\\x26\\xa8\\xc2\\x94\\xe6\\x7f\\x89\\xac\\xb4\\x83\\x1a\\x33\\xa4\\xcb\\xcd\\x72\\xb3\\x8a\\xd7\\x81\\x20\\x5f\\x81\\xba\\xf4\\x37\\xcb\\x8d\\xce\\x6c\\xe3\\x27\\x4b\\x66\\x9f\\x8d\\x20\\xa5\\xc9\\x32\\x0d\\x98\\x7d\\xaa\\x08\\xb4\\x0d\\x53\\x72\\x14\\xa4\\x5d\\x2b\\x4a\\x0f\\xe6\\xc8\\x6e\\x04\\x70\\x14\\xd7\\x3b\\xe0\\xfe\\xd3\\xf9\\xff\\x20\\xe1\\x9d\\x93\\x1e\\x9d\\x76\\xfa\\xf4\\xc5\\x82\\x9e\\xc2\\x6c\\x86\\x26\\xef\\x6d\\x4c\\x30\\x00\\xbf\\xb9\\x1b\\x56\\xd1\\x1a\\x52\\xd2\\x06\\xb1\\x21\\xa4\\xad\\x1d\\x93\\xa9\\x43\\x75\\x8a\\x42\\x4c\\xe4\\x2b\\xc3\\xdf\\xb7\\xc3\\x26\\x62\\x23\\x9d\\x10\\x0f\\xd2\\xca\\x7b\\x63\\xa6\\x44\\x1c\\x41\\x44\\x3d\\x2f\\xf0\\x8a\\xdb\\x1a\\x8a\\xad\\xf6\\xc0\\x4f\\xc2\\x36\\x26\\xd6\\x36\\x02\\xdb\\x8f\\x49\\x9a\\x9b\\x4b\\x28\\xc8\\x72\\x2b\\x7e\\x81\\xa6\\x67\\x21\\xd0\\x2d\\xe4\\xb4\\x95\\x19\\x18\\x31\\x74\\xf0\\x52\\x25\\x4d\\x09\\x54\\x62\\x5e\\xbd\\xef\\x6d\\x08\\xb1\\xf4\\x4e\\x6d\\x72\\x23\\x12\\xec\\x5f\\x1f\\xb5\\xb2\\xf2\\x10\\x4d\\x7a\\x63\\xb6\\x06\\x9a\\x24\\xd2\\x34\\x09\\x72\\x99\\x4d\\x8c\\xaf\\x63\\xd4\\x47\\xd3\\xa8\\x48\\x1e\\x81\\x9b\\x2b\\x76\\x3b\\xd1\\x9e\\x72\\xe7\\x49\\x55\\xc0\\xa3\\xa6\\x2a\\xb8\\x4f\\xe6\\xe3\\x44\\xed\\x26\\x24\\x25\\xc0\\x63\\x2b\\x26\\xb6\\x21\\x81\\xca\\x8e\\x80\\x91\\x08\\x36\\x00\\xa2\\xe9\\x32\\xd1\\xc2\\x3b\\x0d\\x9c\\xca\\xbd\\xb3\\xca\\xfe\\xce\\x3b\\xf8\\x4a\\x2b\\xe6\\x82\\xbc\\x91\\x59\\x9e\\xbc\\xe5\\xbb\\x14\\x79\\x11\\x96\\x24\\x5f\\x08\\xe6\\xce\\x53\\x2d\\xad\\x00\\xd2\\x3c\\xcd\\x72\\x3e\\x1a\\xe1\\xdf\\x29\\xbb\\x49\\xd4\\x6f\\xdf\\x43\\x6d\\x92\\x47\\x57\\xeb\\x8e\\x84\\x94\\xb9\\xbc\\x7b\\xff\\x8f\\xa0\\x18\\xaf\\xfe\\x4d\\xd4\\xa4\\xdf\\x8a\\xdf\\x1f\\x9b\\x8d\\xca\\x8b\\x2f\\x8b\\x3c\\xdd\\x65\\xb1\\xe5\\x20\\x6c\\x11\\xa1\\xd3\\x8f\\x05\\x1a\\x03\\x62\\xed\\xe3\\xf0\\xdb\\x08\\xe3\\x00\\xcb\\xbe\\xf4\\x1b\\xf9\\xf8\\x7f\\x22\\x42\\xf3\\x23\\x55\\xbc\\x47\\x88\\xd7\\xad\\x7e\\x2d\\x7a\\xc8\\x45\\x0d\\xb2\\x38\\x3f\\x1b\\xfe\\xd3\\xd9\\xe0\\x8b\\xa2\\xa8\\xab\\xba\\x64\\xfb\\xc1\\xdd\\xab\\xe9\\xab\\xe9\\xbf\\x0c\\x7c\\xb0\\xfa\\x3c\\x3f\\xdf\\xf0\\x3a\\x52\\xef\\x04\\x9b\\x40\\xfe\\xe9\\x6c\\xf0\\x65\\xb1\\x7f\\x2c\\xc5\\xa1\\x1a\\x5c\\xcc\\xe6\\xf3\\xc9\\xc5\\x6c\\xfe\\xd9\\xe0\\xdd\\x7d\\x56\\xd7\\xbc\\xa4\\x83\\x37\\x79\\x3c\\xfd\\xa7\\xb3\\xc1\\xb7\\x59\\xcc\\xf3\\x8a\\x27\\x83\\xdb\\x3c\\xe1\\xe5\\xa0\\xde\\xf2\\xc1\\x77\\x6f\\xde\\x0d\\x76\\x58\\xfc\\x4f\\x67\\xe7\\x82\\xa3\\x13\\xef\\xc4\\xda\\x25\\x66\\x81\\x71\\x80\\x52\\xfe\\x99\\xf3\\xfb\\xc1\\xd7\\xe8\\x52\\xa9\\x07\\xf8\\x49\\x35\\xf8\\x0b\\xbb\\x63\\x68\\xa2\\x32\\x28\\xf9\\x6f\\xb7\\x59\\xc9\\x2b\\xd9\\xce\\x23\\x8b\\xb1\\x4d\\x4d\\x79\\xb7\\x15\\x1f\\x08\\xbe\\x31\\xae\\xbd\\x85\\x0a\\x16\\x95\\xe6\\x52\\xf1\\x67\\x39\\xce\\xac\\x66\\x6b\\xf5\\x34\\xf5\\xc0\\xb0\\x2d\\x5a\\xcd\\xd6\\xaf\\x2f\\x46\\xa3\\x68\\x35\\x5f\\xbf\\xfe\\xd7\\xc3\\x61\\x1e\\x42\\x02\\xf9\\xd1\\xe8\\x5f\\xc5\\x8f\\xf9\\x5a\\xbc\\xb9\\x58\\xbf\\x9e\\x1f\\x0e\\xa2\\xf8\\xf2\\xd5\\xef\\x1d\\xf2\\x40\\xf9\\xb9\\xcc\\xa7\\xff\\x3a\\x9d\\x0f\\x8a\\x72\\xb0\\xcd\\x36\\x5b\\xb1\\x92\\x11\\x78\\x70\\xdf\\xc3\\xea\\xb1\\x5c\\xd7\\xfb\\xd4\\x23\\x47\\x5f\\x2e\\x13\\xed\\x9f\\xad\\x66\\x3e\\x22\\x7d\\x87\\xea\\xa3\\xdf\\x08\\x6d\\xa9\\x37\\x18\\x04\\xd8\\x4f\\x98\\x69\\x1f\\xa4\\xa0\\x32\\xaf\\xff\\x7d\\xa3\\xe4\\xeb\\x3c\\xf1\\xe8\\x77\\xc5\\xdf\\xed\\x3a\\xb5\\xfe\\x0d\\x06\\x7e\\x3f\\xd8\\xef\\x0a\\xa7\\xe9\\xa0\\x68\\xd4\\xad\\x7b\\xbb\\x39\\x9a\\xc8\\xf7\\x3a\\x8d\\x8d\\x76\\xfb\\x53\\xc9\\xcd\\xe3\\xb5\\x24\\x4c\\x9f\\x78\\x9e\\x04\\xd1\\x2a\\x5e\\x1f\\x4d\\x94\\x13\\xd8\\x6e\\x7e\\x73\\xbb\\x63\\x35\\x77\\x46\\xe1\\x1c\\x31\\x54\\x0f\\x0e\\xe7\\x92\\x2c\\x5e\\xc8\\xb4\\x98\\x53\\xc1\\x6b\\x7b\\x51\\xd5\\x98\\xb9\\x2d\\x12\\x0d\\x87\\x33\\x79\\xb2\\x1d\\x44\\x13\\x1f\\x0e\\xcc\\x4f\\x88\\x36\\xd0\\x62\\xd3\\xea\\x76\\xbf\\x2f\\xca\\x7a\\x6a\\x26\\x38\\xe5\\x79\\x62\\x02\\x91\\x5b\\x16\\x8f\\x5c\\xdb\\xbe\\x53\\xe6\\x88\\xa6\\x3a\\x3a\\x01\\x55\\x44\\xd7\\x0b\\x4c\\x3c\\x07\\x56\\x62\\x32\\x81\\xc3\\xb4\\x31\\x91\\xf0\\x29\\xca\\xf2\\x04\\x84\\x0c\\x7d\\xc3\\xd3\\x6e\\xe7\\xa7\\x6b\\x6d\\x21\\x84\\xa9\\x93\\xdf\\x42\\xf0\\x31\\x7e\\x34\\xad\\x59\\xb9\\xe1\\x35\\x28\\x79\\xd1\\xb0\\x47\\xb1\\x10\\x53\\x6c\\xf3\\x43\\x74\\x25\\x7f\\x95\\xdd\\xf2\\x1b\\x40\\xe6\\x1f\\x08\\xef\\xd1\\xe9\\x80\\x81\\xd2\\xeb\\x42\\x9a\\xf8\\xf0\\x30\\x06\\xf9\\xa1\\xd8\\xe7\\x29\\xdb\\x71\\xd0\\xd9\\xf0\\xc3\\xa1\\x55\\x4a\\x39\\x38\\x97\\x6b\\x0b\\xa5\\xb6\\x48\\x78\\x34\\xe2\\xab\\x48\\x65\\x12\\x13\\xc3\\xc6\\x2f\\x7d\\xb2\\x12\\x3d\\x4d\\x92\\xac\\xba\\xc9\\xaa\\x2a\\xf4\\xb0\\xbb\\xf5\\x27\\xd4\\x85\\x41\\xe6\\x47\\x28\\xe5\\x87\\x90\\x0c\\x9e\\x89\\xc0\\x54\\x54\\x9c\\x1c\\x17\\xc9\\xf4\\xdf\\xbf\\xfe\\xe9\\xed\\x9b\\x1f\\xbe\\x0f\\x3d\\xc0\\xd0\\x1e\\x4d\\xa6\\xef\\x7e\\xfa\\xfc\\xfb\\xb7\\x6f\\xde\\xbd\\xf9\\xe1\\xfb\\xf7\\x5f\\xfd\\xfc\\xd3\\xe7\\xe2\\x47\\x38\\xff\\xc3\\x8c\\x26\\x56\\xe6\\x3f\\x68\\xef\\x7c\\x48\\xaf\\x54\\xec\\x93\\xa7\\xcd\\x34\\xe1\\xb5\\x58\\x20\\x03\\xab\\x1e\\x34\\x49\\xa6\\x66\\x3d\\xb4\\x34\\xef\\x88\\x80\\xce\\x74\\x70\\x27\\x8e\\xf1\\x5a\\x40\\x62\\x3d\\xc1\\xcd\\xf6\\xc8\\x22\\x85\\x40\\x94\\xea\\xdd\\xb6\\xe4\\xa9\\x27\\x2a\\xa7\\xa3\\x51\\xaa\\x45\\xca\\xe7\\xd3\\x33\\x7f\\x19\\x7e\\xb4\\xfa\\xdb\\xaf\\xd5\\xfa\\xec\\x63\\x72\\x4e\\x3d\\x8f\\xe0\\x41\\xda\\x84\\xcc\\xf7\\x3e\\x02\\x37\\xc9\\xe5\\x6a\\x1d\\xa4\\x64\\x81\\xc1\\xfc\\x4a\\x80\\xe6\\xaf\\x50\\x38\\xe2\\x1b\\x19\\x1a\\x3a\\xa7\\xe2\\x44\\x2b\\x81\\xc0\\xe5\\xa8\\x45\\x0d\\x1d\\xf2\\x21\\x64\\x53\\xa9\\xbb\\x86\\x7a\\xd6\\xe4\\x08\\x8d\\xa6\\x59\\x25\\xbb\\xfd\\x11\\x3f\\xc2\\x13\\x5f\\x30\\x59\\x1b\\x27\\x1c\\x95\\x97\\xe5\\x5e\\xdf\\x59\\xdb\\x98\\x30\\x56\\x5e\\xca\\x12\\xee\\x91\\xe5\\xa6\\x07\\x7b\\xc4\\xa4\\x13\\x1f\\xf9\\x9d\\xdb\\x49\\x82\\xd8\\x57\\xa2\\x52\\x8e\\x77\\x17\\x0c\\x7b\\x61\\x7e\\x86\\x11\\x35\\x0f\\xd3\\x2f\\x4d\\xa2\\xdb\\x30\\xb1\\x5f\\x74\\x11\\x17\\x16\\x6d\\xa1\\x7b\\xe3\\x1a\\xf3\\x24\\xda\\x5a\\x50\\x43\\xa5\\x5e\\x36\\x38\\x1c\\x13\\xb6\\xcf\\x04\\x9c\\xb6\\xc0\\xed\\xbf\\xe1\\xc0\\x26\\xd6\\x81\\x4d\\xcc\\xd1\\x44\\xdb\\x2d\\x80\\xae\\x2e\\x89\\x6b\\xb4\\x80\\x3c\\x1c\\xcd\\xea\\xf2\\x28\\xc7\\x92\\x7c\\x16\\x87\\x59\\x27\\x3d\\x8b\\x96\\x5c\\x06\\x45\\xf3\\x41\\x90\\x0b\\x21\\x35\\xc1\\x52\\xdb\\x8f\\xcc\\x99\\xb6\\x48\\xee\\x44\\xe6\\x0c\\xfe\\x58\\xda\\xcb\\x84\\xe2\\x20\\xbb\\x79\\x81\\x99\\x95\\xa4\\x22\\x9e\\x7e\\xf5\\xf5\\x37\\x9f\\xff\\xfc\\xed\\xbb\\xb7\\x34\\x91\\xd5\\xb2\\xea\\xdb\\x82\\x09\\xb6\\x23\\x1c\\xce\\x8f\\x8b\\xb8\\x75\\xd0\\x4d\\x93\\xf0\\x69\\x87\\x35\\xdf\\x81\\x4b\\xa5\\x7c\\x98\\x4e\\xa7\\x9e\\xe8\\xd8\\xec\\x82\\x1a\\x72\\xc7\\x25\\x67\\x02\\x09\\xa9\\xe0\\x63\\x6a\\xe0\\xb0\\xb2\\x59\\xa5\\x43\\x5d\\x2f\\xbd\\x3b\\xb6\\xf3\\x94\\x00\\x3a\\x55\\xcb\\x4e\\x16\\xd1\\x38\\xf4\\xd0\\x8b\\x13\\x6d\\x67\\x40\\x97\\xce\\xeb\\x77\\xe0\\x4a\\xa8\\x56\\x5b\\x17\\x79\\x34\\x59\\xf1\\xb5\\x4f\\x08\\xb5\\xae\\x38\\xc8\\x4d\\xfa\\xf0\\xe8\\xc4\\x71\\x15\\xb5\\x64\\x87\\xab\\x68\\xbd\\xb4\\x57\\x70\\x15\\xad\\x83\\x14\\x13\\xd7\\x5b\\x0b\\x00\\xbb\\xe5\\x37\\x97\\x50\\xa0\\x3f\\x1d\\x34\\x2e\\x26\\x88\\x84\\x62\\x71\\xec\\x40\\xeb\\x1a\\x83\\x80\\x23\\x70\\x5b\\x29\\x7b\\x22\\x7b\\x27\\x68\\xe2\\x9c\\xfe\\x98\\xd8\\x11\\x80\\xad\\xde\\xe6\\x84\\x1c\\x65\\x8e\\xe0\\x19\\x71\\xb7\\x01\\xe1\\xa8\\x15\\x45\\x5f\\x8c\\x31\\x72\\xd7\\x5e\\x63\\x2f\\x79\\x59\\xc8\\x96\\x1e\\x02\\x6c\\xe5\\xad\\x3f\\x41\\xa2\\x54\\x89\\x04\\xed\\xa4\\xa9\\xba\\x0f\\x10\\xe9\\xab\\xdd\\x5b\\xe8\\x00\\xca\\x31\\x0e\\x15\\x03\\x21\\x93\\xa5\\xaf\\x9e\\xa5\\xf1\\x14\\x64\\x32\\x64\\xa8\\x23\\x92\\x5d\\x48\\x3b\\x73\\xcf\\x8d\\xfd\\xe8\\xa9\\x52\\xea\\x7e\\x56\\x2f\\xb6\\xae\\x40\\x02\\x13\\x7e\\xa9\\xf9\\x7d\\x88\\x9a\\xd8\\x18\\x80\\xcc\\xf6\\x61\\xba\\x34\\xc8\\x54\\x75\\xa9\\xc7\\xe8\\x56\\xb4\\xc3\\x17\\x9a\\xcf\\xd3\\xe6\\x17\\xe8\\x73\\xdd\\x13\\xca\\x46\\xa3\\xd8\\xba\\x02\\x21\\x96\\x91\\x27\\x33\\xc4\\x35\\xe6\\x0b\\xb7\\x1a\\x2b\\x33\\x36\\x81\\x90\\x46\\xa2\\xff\\xe1\\xf3\\x1f\\x78\\xc1\\xc0\\x8f\\x52\\x3d\\x07\\xe8\\x18\\xb7\\x7e\\x61\\xfd\\x56\\x98\\x1e\\x9f\\x1c\\x54\\x1f\\x3b\\x6f\\x9e\\xc7\\xf5\\xb2\\xc3\\xe4\\x39\\x64\\x2f\\x3b\\x34\\xd8\\xde\\x81\\xcf\\xbf\\x29\\x00\\x15\\xd4\\x8c\\x6d\\xbf\\xac\\x30\\x76\\xac\\x09\\x40\\x73\\x3b\\x47\\x75\\xee\\x91\\x85\\x94\\xc4\\x27\\xd4\\x24\\xc6\\xb0\\xab\\x67\\x95\\xff\\x09\\x00\\xf2\\xca\\x8e\\xb0\\xbf\\xa6\\x03\\xbb\\xd0\\x84\\xf8\\xfa\\x44\\xdc\\xd6\\x71\\x9b\\x44\\xb0\\xf0\\x19\\x55\\x57\\xc5\\x32\\x31\\xdb\\x0c\\x91\\xb2\\x3c\\x12\\x24\\xf6\\xd9\\x09\\xa4\\xe5\\xb1\\x6c\\xa1\\x1e\\x3d\\x82\\xf6\\xeb\\x36\\xa5\\x24\\xdb\\x13\\x69\\x9f\\x01\\x8f\\x1d\\xcb\\x36\\x88\\x76\\xb7\\xe5\\xef\\x5d\\x4e\\x24\\x0d\\xfb\\x16\\xd2\\x05\\x24\\x1c\\x0f\\x3d\\xff\\x1b\\xfc\\xf0\\xb3\\x9c\\x2c\\x3f\\x3e\\x57\\x8a\\x79\\xb0\\xf8\\xf8\\x6f\\xa1\\xa6\\x7b\\x2e\\xe7\\x98\\x95\\x10\\x28\\xcb\\xc3\\x30\\xa0\\xdd\\x77\\xa0\\xbc\\x54\\x68\\xe7\\xf5\\x4d\\xe8\\xa6\\x1d\\x98\\x38\\x5a\\x46\\x41\\x3a\\x85\\xfc\\x2a\\x8d\\xeb\\x5d\\x7f\\xb0\\xe3\\x82\\x6f\\x86\\x87\\xc4\\x7b\\xde\\x8f\\x48\\xb0\\x59\\xf2\\xd5\\x66\\xed\\x93\\x20\\xd5\\x79\\x3d\\xc4\\xb5\\xbf\\x67\\xb7\\xe0\\xa2\\x1b\\x3f\\xc6\\x3b\\xcc\\x61\\xdb\\xba\\xfa\\xe3\\xfe\\xab\\xff\\xe3\\x2c\\x4f\\xb2\\x98\\xd5\\x45\\x59\\x75\\x62\\x69\\x3d\\xd6\\x89\\xa9\\xe8\\x35\\xc8\\x06\\xc9\\x01\\xc0\\x40\\x12\\xb4\\xea\\x41\\x9b\\xdf\\x5d\\x06\\x77\\x94\\x29\\xd1\\x49\\x4d\\x4c\\xd1\\xc7\\x88\\x54\\xec\\x92\\xac\\xe6\\x37\\x95\\x55\\xa0\\xb2\\xdf\\x5f\\xf3\\xc7\\xa8\\x60\\x65\\x22\\xd3\\x49\\xe9\\x91\\x0a\\x90\\x96\\xf1\\xdb\\xa6\\xce\\xea\\xaa\\xdb\\x1b\\xaa\\xcb\\x1a\\x54\\xb1\\x45\\x10\\x4a\\xcd\\x93\\x18\\x5d\\x7d\\x02\\xe6\\x30\\x1a\\x0d\\x7d\\xaf\\xc8\\xeb\\xe2\\x36\\xde\\x42\\xd6\\x15\\xc8\\x8a\\xd0\\x23\\x8f\\x24\\x5d\\xa3\\x31\\x61\\xd8\\x4e\\x0c\\x08\\xbe\\x25\\x87\\x63\\x5a\\x41\\xb8\\xb6\\x13\\xad\\x60\\x9b\\x65\\xab\\x6e\\x22\\xac\\x8b\\xdb\\xfa\\x6c\\x36\\x73\\xc8\\x33\\xb5\\x11\\xc1\\x1f\\xf8\\x2b\\x0a\\x03\\x09\\xe4\\x82\\xa0\\x5f\\xc8\\x70\\x46\\xd5\\x6a\\x07\\xc3\\x99\\x4b\\x2d\\xc8\\x85\\x0c\\x1b\\xea\\xc0\\xe1\\x39\\x3a\\x1f\\x28\\xaf\\x83\\xf3\\x4c\\x05\\x56\\x47\\x94\\x30\\xad\\x31\\x2c\\x19\\x21\\x4f\\xd5\\x7d\\x06\\xc6\\xbf\\xd3\\xfb\\x6d\\x16\\x6f\\xc9\\x53\\xcc\\x2a\\x3e\\x78\\xf5\\x2f\\x48\\xec\\x08\\xe4\\xe8\\xcb\\x20\\x2e\\x0b\\x7c\\xf3\\xaf\\xf8\\x26\\xe7\\x0f\\xb5\\x7e\\xa3\\xd2\\xcf\\xe0\\x99\\x3f\\xb2\\x16\\x52\\x3d\\xba\\xa3\\x86\\x75\\xeb\\x92\\x57\\x46\\x2a\\x98\\xa9\\x84\\x5f\\x7d\\x79\\x9b\\x43\\xe6\\x66\\xc9\\x71\\x5e\\xba\\x47\\xc1\\x6a\\x33\\xb4\\xfa\\xd4\\x64\\x9b\\x02\\x7f\\x3b\\x65\\x8f\\xb3\\xbb\\x62\\x8a\\x92\\x48\\xeb\\xec\\x97\\x28\\x81\\x8b\\x3d\\xb5\\x0d\\xaf\\xdf\\xd4\\xfc\\x06\\x63\\x4d\\xf6\\x19\\x1d\\xc8\\x53\\xc5\\x8c\\xbb\\x0d\\x18\\xb9\\x94\\x3c\\xf7\\xbd\\xa9\\x78\\xa7\\xe9\\x25\\xa8\\x88\\x5a\\x6f\\x9f\\x1d\\x0e\\xf6\\x29\\x25\\x9d\\x1f\\xfe\\xa6\\x28\\xbf\\xca\\x4a\\x0e\\x9f\\xed\\x72\\xc1\\xc0\\x23\\x66\\x8f\\xd2\\x87\\xb4\\xb0\\x9e\\xd8\\x32\\x0f\\xf2\\x7a\\x41\\x66\\x93\\xc3\\xc1\\xcb\\x91\\x5c\\x16\\x44\\x8e\\xa2\\xb5\\x70\\x38\\x48\\x4f\\x4e\\xe6\\x10\\x6f\\x4a\\xad\\xae\\x5a\\x1d\\x01\\xb2\\x26\\x38\\x28\\xf2\\xa0\\xba\\xf3\\xe5\\x64\\x1e\\xcc\\x69\\x1a\\xfa\\xf1\\x98\\x93\\x7f\\x6e\\xf7\\xb9\\x68\\xaf\\xd2\\x94\\xff\\xe6\\xa7\\x2d\\x1a\\xb9\\x23\\x53\\x1e\\xba\\x39\\x75\\xcc\\xcf\\x41\\x6d\\x9d\\x78\\x55\\x7c\\x48\\xd3\\xaf\\x40\\x34\\x0f\\x7d\\x76\\xd9\\x35\\xe5\\xc3\\x81\\xbd\\x9e\\xb9\\x31\\xd0\\x25\\x66\\x5d\\x36\\x31\\x0f\\xf7\\x3d\\xf1\\xca\\x45\\x1f\\xb6\\x4d\\xae\\xb8\\x4a\\x18\\x39\\x92\\x20\\x56\\xea\\xf9\\xe6\\xfd\\x11\\xe8\\x0f\\x70\\x9f\\x5d\\xc6\\x4b\\xdc\\x92\\x00\\x97\\x93\\x36\\x16\\x89\\x91\\xc6\\x2a\\x41\\x67\\x2f\\x3a\\x65\\xb3\\x26\\xa5\\x29\\xd7\\x05\\x4e\\xc0\\x00\\x4e\\xb3\\x8e\\x59\\x38\\x1a\\xf5\\x48\\x0e\\x1b\\xb4\\xea\\x73\\x42\\x4c\\x6a\\x30\\xa8\\x0f\\xea\\x63\\xf7\\x54\\x3e\\x7b\\xcc\\xdd\\xb9\\x8a\\x91\\x36\\xf2\\x25\\x0f\\xed\\xdd\\x69\\xed\\x18\\xf7\\x71\\x31\\x9b\\x6b\\x56\\xf2\\xbb\\x0f\\xed\\x07\\x97\\xa7\\xc1\\x4c\\x8b\\x57\\x0d\\x8e\\x1f\\xcf\\xc2\\xf3\\x00\\x28\\xd8\\x66\\x79\\xd4\\x3b\\x0e\\x35\\x78\\x7e\\x49\\xbb\\x34\\xbd\\x24\\x74\\x1b\\xaa\\xe3\\x1a\\x2d\\x51\\xad\\x1a\\x78\\x25\\xea\\x30\\x33\\x14\\x4f\\x83\\xb7\\x42\\x07\\x8f\\xd1\\x01\\xca\\xe1\\x70\\xbe\\xc0\\xe8\\x7f\\x29\\xc4\\xf4\\x32\\x72\\x30\\x98\\x96\\x0b\\xd1\\x4f\\x60\\xf4\\xc3\\x93\\x77\\x70\\xb1\\x04\\x57\\x34\\x51\\x23\\x0d\\xb6\\x18\\x89\\xba\\x1b\\x30\\xae\\x09\\x1d\\x5e\\x77\\x0a\\xd1\\xb4\\x61\\x85\\x19\\xcf\\x8c\\x6e\\xe4\\xd5\\x2e\\x4f\\x48\\x8b\\x60\\xd2\\x4c\\x6e\\xeb\\xc5\\x8b\\xd8\\x53\\x98\\xef\\x4e\\x92\\xa4\\x4e\\x73\\x8d\\x99\\xc9\\xaa\\x8d\\x5a\\x52\\xb2\\x26\\x8b\\xdd\\x68\\xb4\\xeb\\x60\\x68\\x81\\xf4\\xbb\\x71\\xd7\\xee\\x83\\x96\\xce\\xe4\\x26\\xea\\x38\\x6e\\x7d\\xbc\\x23\\xec\\x90\\xe0\\xd8\\x53\\x3b\\x0a\\x3e\\x4d\\xc1\\x9f\\xd7\\xf8\\x53\\x52\\x2b\\x48\\xfe\\x96\\xd0\\xd4\\x79\\xe2\\xcf\\xeb\\x30\\x52\\x67\\x19\\x57\\x11\\xdd\\xae\\xa5\\x9f\\xda\\xc0\\x23\\xa4\\x63\\x35\\xa8\\x1b\\xa6\\x7f\\xa5\\x5e\\xb8\\x0d\\x69\\x66\\xc1\\x20\\xed\\x0e\\xe8\\x90\\xb5\\x61\\xe9\\x86\\x1c\\xe9\\x0c\\xbc\\x4c\\xbb\\x84\\xa4\\x9d\\x54\\x18\\x21\\x81\\xcf\\x7b\\x44\\x15\\x69\\xd7\\xf8\\x1b\\x07\\xa4\\xc9\\x9a\\xeb\\x91\\x10\\x0d\\xaa\\x12\\x89\\xab\\x88\\x44\\x16\\x9b\\xae\\x40\\x60\\xe1\\x3c\\x29\\x56\\x5d\\x3d\\x77\\x31\\xeb\\xfa\\xdd\\xf3\\xec\\xba\\xee\\x56\\x32\\xec\\x4d\\x85\\x93\\x31\\x02\\xb4\\x64\\xf3\\xcc\\xef\\x94\\xce\\x83\\x81\\x81\\x2b\\x9b\\x87\\x94\\xc2\\x5d\\x82\\xf9\\xb1\\x16\\xcc\\x37\\x50\\x8e\\x61\\xed\\x94\\x41\\x8a\\xcd\\xdf\\xa5\\x8a\\xa9\\xe3\\xf2\\x07\\xa1\\x5b\\x57\\x55\\x00\\xa0\\x3d\\xa9\\x0b\\x8f\\x2c\\xb6\\xa3\\x91\\xbf\\x31\\x97\\x05\\xca\\xa1\\x40\\x38\\x90\\xd2\\x0d\\xa1\\xdb\\xd1\\x28\\xed\\x62\\x29\\xc5\\x8d\\xbb\\x45\\x49\\x4f\\x93\\x3e\\x5d\\xf4\\x8a\\x33\\xf4\\x92\\x1b\\x0e\\xdc\\x5b\\x99\\x01\\xad\\x3d\\xca\\x3f\\xac\\xc5\\xa4\\x2e\\xa0\\x11\\x65\\xfe\\x3d\\x18\\x59\\x18\\x47\\x0d\\xe7\\x8c\\x31\\x25\\xd8\\x2b\\xc5\\x5d\\x62\\x96\\x6f\\xfd\\x49\\xdb\\x3d\\xdb\\xd1\\x4f\\x29\\x41\\x49\\x4c\\x63\\xb5\\x96\\xbf\\x4f\\x23\\xa6\\x9c\\x76\\xa3\\x1e\\x98\\x88\\xf5\\x1b\\x0d\\x13\\xf1\\x49\\x98\\xd0\\x38\\xcd\\x4f\\xac\\x80\\xae\\xf1\\x3f\\xa0\\x7d\\x8b\\x8b\\xdd\\x8e\\xed\\x2b\\xde\\x92\\x17\\x24\\x46\\x5e\\x10\\x9f\\x96\\x17\\x2c\\x86\\xe0\\x41\\x87\\x42\\x91\\xd1\\xe8\\xbc\\xda\\x16\\xf7\\x87\\x6d\\x96\\x70\\x25\\x05\\x01\\xeb\\x53\\x25\\x98\\x15\\xb0\\xe6\\xaa\\xfa\\xf4\\x10\\x1c\\x6d\\x1f\\x4a\\x10\\x7a\\xf4\\x7d\\x5a\\x34\\x90\\xbc\\x50\\x34\\xd0\\xa5\\x15\\xb0\\x67\\xa8\\x2e\\x44\\x89\\x87\\x42\\xd6\\x14\\x0a\\xeb\\x41\\xae\\x57\\x62\\xaf\\x42\\xef\\xa3\\x4f\\xc6\\xd1\\x34\\x4b\\xc6\\x9f\\x78\\x6b\\xda\\x5b\\xd5\\xda\\x70\\xa7\\xc5\\x27\\xf2\\x7b\\xe6\\x46\\x72\\x65\\x0b\\x86\\x85\\x17\\xfc\\x8d\\x24\\x8d\\xf1\\x41\\x13\\xe8\\xca\\x80\\x51\\x66\\xd1\\x4d\\x92\\xcf\\xcb\\x8c\\x7d\\x9e\\x27\\x5f\\xca\\xcf\\x4b\\x0c\\xec\\xaa\\x1b\\x9c\\x59\\x36\\xf8\\x32\\xb5\\x81\\x38\\x32\\xa9\\x8e\\x79\\xb9\\x12\\xf4\\x15\\x28\\x41\\x0d\\x5b\\x8e\\x3d\\x00\\xc7\\x6d\\x2b\\xab\\x92\\xec\\x06\\x03\\x66\\xb7\\x45\\xf4\\x7d\\x77\\x32\\x9a\\x8f\\x59\\x1e\\xd1\\xb2\\x44\\xdb\\x99\\xb9\\x5f\\x10\\xf0\\xd7\\x49\\x83\\x3a\\xab\\xad\\xf8\\xae\\x8e\\xef\\x65\\xb9\\x42\\xb1\\x11\\x55\\x04\\x27\\x2e\\xbe\\xa2\\x1b\\xf0\\xc9\\xe6\\x3a\\xf7\\x2c\\x07\\x0c\\x69\\x33\\xa2\\x39\\x1d\\x28\\xe0\\x16\\x40\\x2c\\x19\\x23\\xc7\\x6f\\xc3\\x8f\\x42\\xde\\x79\\x18\\x41\\xfd\\xea\\x0c\\x98\\x10\\x6d\\xdc\\xa6\\x49\\xa2\\x6d\\x71\\x3f\\x75\\xda\\xf5\\xd3\\x8b\\x29\\xa1\\xc3\\xb4\\x87\\x5e\\x74\\x87\\x14\\x23\\xf6\\xe3\\x54\\xa5\\x55\\x8e\\x0e\\x87\\xae\\x41\\xa2\\xe5\\x97\\xd2\\x1f\\xc3\\x57\\xf5\\xe6\\xfa\\x64\\xe1\\x0e\\xc3\\xa1\\x14\\xcc\\x78\\x2d\\x4a\\xc1\\x5e\\xa9\\xd5\\x66\\xed\\xcf\\x88\\x2d\\xf5\\x47\\x8f\\x34\\x10\\xfb\\xcf\\x1a\\x87\\xb5\\xbb\\xef\\xc4\\x7b\\xae\\xbd\\x7b\\xf8\\x90\\x64\\xdf\\x3a\\x4e\\xdf\\xcf\\xce\\x00\\x06\\xdb\\x9e\\x03\\x1f\\x08\\x10\\x12\\x93\\xf0\\xbc\\xce\\x8f\\xcd\\x7a\\xc8\\x1f\\xd8\\xd1\\xdc\\xdd\\xd2\\x23\\xc6\\xe2\\xef\\xa0\\x62\\x15\\xef\\xe1\\x24\\xfe\\x86\\x48\\xe5\\xe0\\x8b\\x79\\xc3\\x77\\x10\\x5c\\x4f\\xdb\\x05\\xd2\\x8d\\xa2\\x15\\x27\\x82\\xbc\\xe8\\x60\\xb8\\x5b\\x24\\xab\\x12\\xe8\\x6c\\x95\\x6c\\xef\\x03\\xd4\\xe8\\x62\\xfe\\xce\\x37\\x56\\xb3\\xf5\\x2a\\x5b\\x83\\x33\\xa3\\x73\\x60\\xb7\\x0e\\xaf\\xd7\\x7f\\x60\\x5f\\x70\\x5e\\xcd\\xd9\\xd8\\x2a\\x4e\\xeb\\x05\\x67\\x23\\x22\\x74\\xd8\\x6d\\x90\\xe0\\x48\\x7d\\x7a\\xa1\\x7b\\x15\\x37\\x67\\x1a\\xaf\\x7d\\x42\\x0c\\xcf\\x80\\x76\\xb1\\xbd\\x3a\\x3c\\x07\\x9a\\x3a\\xa1\\x19\\x00\\xaa\\x07\\x9e\\xe7\\xcd\\xf3\\xd0\\x86\\xc7\\xfe\\xc3\\x30\\x3f\\x71\\x18\\x78\\xeb\\x30\\x9c\\x86\\xe2\\x0f\\x39\\x21\\x9e\\xa5\\xd1\\xc1\\x58\\x32\\x4d\\xa8\\x3f\\xc1\\xbe\\x61\\xd2\\xdf\\xd6\\x8a\\xcf\\xfa\\x8c\\xc7\\x14\\x14\\xf3\\xdf\\x01\\xc5\\x01\\xb7\\x4e\\x57\\x13\\x72\\xdb\\xca\\x66\\x51\\x6d\\x75\\x0a\\x50\\x97\\x88\\x55\\x65\\x0a\\x7a\\x41\\xc9\\x38\\x3d\\xea\\x8b\\xbd\\x8b\\x2d\\xf1\\x3b\\x88\\x03\\xe9\\x55\\xd6\\x4f\\xae\\x40\\xb9\\xa4\\x1d\\xbc\\x4f\\xc6\\x1d\\x5d\\x20\\x45\\x22\\x63\\xaf\\x34\\x8d\\x04\\xac\\xf4\\x08\\x82\\xea\\x5c\\x9c\\xa6\\x36\\x22\\x9f\\x13\\xca\\x95\\x72\\x5e\\x85\\x2d\\x72\\x66\\xd8\\xd7\\xb6\\x53\\xda\\xca\\x1a\\xab\\x87\\x31\\x32\\xda\\x70\\x1c\\x0b\\x06\\xc6\\x51\\xcb\\x19\\xd0\\xa7\\xc3\\xb8\\x07\\xfa\\x63\\xd7\\xca\\x47\\x35\\x59\\x38\\x4f\\x9a\\x75\\x94\\xcf\\x5d\\xe6\\x3e\\xfa\\xdd\\x0b\\xd8\\x4a\\xd5\\xed\\xb3\\x46\\x3f\\xba\\xd3\\x1e\\xd5\\xa5\\xbd\\xcb\\x96\\xee\\xd2\\xda\\x2e\\xbc\\x11\\x7a\\x38\\xd2\\xa4\\xc5\\xc5\\x2d\\x90\\xbc\\x80\\x3d\\xdc\\x84\\x69\\x27\\x5d\\xb2\\x0d\\x37\\x4b\\xa5\\x3e\\x0e\\x14\\xab\\xb9\\x88\\x15\\xf3\\xb8\\xfd\\xfd\\x7c\\x52\\x37\\x97\\xb4\\x88\\x3b\\xf8\\x24\\x1a\\x87\\xf1\\x68\\x74\\xfe\\xd1\\xea\\xf3\\xc9\\x7f\\xb2\\xc9\\xdf\\xd7\\xe7\\x26\\x2f\\x76\\x37\\xff\\xe4\\x1a\\xbb\\x25\\xa2\\x35\\xf3\\x63\\x3b\\x45\\x85\\x8a\\x8f\\xb4\\x4c\\x82\\x48\\xab\\x15\\x6c\\x16\\x2b\\x06\\x5f\\xfc\\x57\\x90\\x33\\x13\\x54\\x3d\\x87\\x83\\xcf\\x1c\\xaf\\x5b\\xe6\\xa7\\xdd\\x8c\\xa5\\xad\\xaa\\x8d\\xfc\\x44\\x70\\x5a\\x0d\\xd1\\x15\\x0a\\x18\\xac\\xbc\\x8c\\x5e\\xb1\\xe7\\x39\\x1a\\x6e\\x8c\\x46\\xd2\\x3a\\x51\\x7c\\xb9\\x06\\x77\\xc5\\x1e\\xed\\x54\\xdc\\xd4\\x4e\\x8d\\x46\\xcc\\xb8\\x88\\xf1\\xd5\\x6c\\x4d\\xb5\\xb6\\xff\\x70\\xf0\\xb9\\xc6\\xc0\\x71\\xfb\\xda\\x4c\\xca\\x62\\x9f\\x14\\xf7\\xb9\\x07\\x7c\\x58\\xdc\\x67\\xad\\x97\\x74\\x1f\\x2c\\x2f\\x65\\xbb\\xaa\\x2d\\xb5\\x92\\xb3\\xb2\\x84\\xdb\\xe6\\xab\\xf2\\x06\\x70\\xbe\\x4b\\x04\\xe3\\x6d\\xed\\x42\\xf2\\x61\\x8c\\x6e\\x62\\x33\\xba\\xba\\x63\\xb2\\x48\\x1c\\xf6\\xd3\\x7c\\x31\\x01\\xf6\\x73\\x73\\xca\\xd8\\x34\\x69\\x1b\\x9b\\xf2\\xd0\\xd3\\x7d\\x4c\\x22\\x16\\x5f\\x8b\\x07\\x8f\\xa6\\x61\\xe3\\xb0\\xea\\xef\\xac\\x3f\\x11\\xa7\\xab\\xd7\\x0a\\xd5\\x5d\\x05\\x8b\\x19\\x23\\xc7\\xc5\\xa6\\xc5\\x8b\\x6d\\x4e\\xdc\\x46\\x2d\\x4c\\x20\\x08\\x2b\\x0e\\xe6\\x19\\x3a\\x81\\x1d\\x1d\\x58\\x71\\xa0\\x14\\x83\\xa1\\x31\\x40\\x13\\x1e\\x21\\xfa\\xac\\x4f\\xe8\\x70\\x43\\x9e\\x5e\\xac\\x55\\x1e\\x8d\\x86\\xa9\\x65\\x42\\x91\\xb3\\xbb\\x88\\x95\\x93\\x9c\\x39\\x3a\\x11\\xbf\\xcf\\x50\\x3e\\xc9\\xee\\x5c\\x89\\x68\\x7b\\xad\\x89\\x0c\\x9a\\xf8\\x79\\x0a\\xb9\\xc2\\x7c\\x4b\\x0d\\xad\\xec\\x7a\\x89\\xa4\\xee\\x3b\\xcf\\x1d\\xc8\\xd9\\x14\\x4c\\x26\\x6d\\xf6\\xca\\xec\\xc6\\x96\\xa0\\x7d\\x4b\\x07\\xa1\\x88\\x60\\xb9\\xe0\\x2d\\x43\\x95\\x9e\\x13\\x52\\x97\\xb7\\x28\\x2b\\x75\\x6e\\xad\\xbe\\x03\\xa2\\xf9\\x02\\x67\\x2c\\x47\\x93\\x58\\xd4\\x01\\x84\\x96\\x56\\x1b\\xbd\\xf9\\xcf\\xfd\\x57\\x7f\\x3c\\x7c\\x3a\\x3b\\x5c\\xfc\\xcb\\xe1\\xd5\\x05\\x51\\x48\\x53\\x2a\\xae\\x47\\xa3\\x3e\\xa5\\x77\\x0b\\xad\\x34\\xb0\\x1a\\x00\\x45\\xdb\\x0e\\x28\\x9e\\x56\\x75\\xb1\\xff\\xb1\\x2c\\xf6\\x6c\\xc3\\xf0\\x7c\\xd2\\x61\\xf2\\x2c\\xf4\\x49\\x14\\xb9\\x09\\xdb\\xd8\\x10\\xe0\\x77\\x33\\x1a\\x5d\\xfc\\xcb\\xd0\\x20\\x61\\x78\\xd6\\x48\\x59\\xb1\\x44\\x56\\x91\\xe0\\x6d\\x81\\x44\\x4a\\xdb\\x46\\x44\\x34\\xb1\\x2d\\xb0\\x05\\xa8\\x28\\x40\\xf1\\x06\\xbb\\x2c\\xc8\\x8b\\xda\\xd7\\x63\\x25\\xca\\x28\\x69\\xc0\\x3c\\x9a\\x85\\x5c\\x29\\x46\\x34\\x3c\\x42\\x4a\\xbd\\xf1\\x16\\x86\\x99\\x39\\x46\\x83\\x57\\x61\\x26\\x75\\xd0\\x1a\\xff\\x2e\\x5e\\xfd\\xd1\\x1a\\xe1\\xd5\\xe5\\x6c\\x34\\xba\\x9a\\x4c\\xe8\\xa7\\x33\\xbb\\xf4\\x75\\xa6\\x15\\xa7\\xa3\\xd1\\xd5\\x78\\x4c\\xff\\xdf\\xd5\\xe1\\xe0\\x5f\\x85\\x33\\x42\\xb3\\x29\\xff\\xcd\\xbf\\x6a\\xcf\\x48\\x30\\x57\\x72\\x0a\\x40\\x6e\\xa8\\xd1\\x2d\\x9c\\x27\\x45\\xb7\\xa8\\x67\\x87\\xa6\\xd9\\x34\\xde\\x3d\\x4f\\xd3\\xe8\\x6e\\xb7\\xcf\\xd1\\x34\\xba\\x53\\xcb\\x96\\xf9\\xf9\\x2a\\x66\\x91\\x07\\x69\\x51\\xde\\xb8\\xb1\\x81\\x58\\x1b\\xce\\x8e\\xcf\\x77\\x99\\x76\\x60\\x4e\\xd2\\xb4\\xbe\\x79\\xb6\\x9d\\xac\\xfb\\x92\\x86\\x4d\\x40\\xe9\\xec\\xe7\\x43\\x49\\xa7\\x66\\x2a\\xc2\\xae\\xfb\\xd0\\x75\\x1d\\xd0\\xd7\\xde\\x4d\\x91\\xb0\\x9d\\x27\\x0e\\x5a\\x8f\\x95\\x18\\x7f\\x46\\xea\\x9b\\x3a\\x52\\x21\\xec\\x8e\\xa6\\xb6\\x0d\\xd8\\xa6\\xf3\\x12\\x5d\\xa6\\xab\\x68\\xed\\x27\\x24\\xd8\\x80\\xa4\\x6e\\x34\\x4a\\xe1\\xaf\\x9f\\x9c\\x34\\xf7\\x6a\\xd8\\x67\\x7d\\x1c\\x15\\xc9\\x63\\x68\\xdd\\x1a\\xe2\\xb9\\xa1\\x85\\xb7\\x2d\\xc3\\x92\\x8c\\xed\\x8a\\x4d\\xb7\\xf2\\x18\\x86\\x3e\\xc1\\x1a\\xda\\x70\\x44\\x5d\\x2e\\xb6\\xc1\\x57\\xf5\\x56\\x60\\x61\\x5b\\x4c\\x5b\\x66\\x9b\\x2c\\x67\\xbb\\x2f\\x8a\\xe4\\xf1\\x47\\xe6\\x98\\x8b\\x81\\xc4\\x25\\x62\\x25\\x68\\x0b\\x15\\xa7\\x9c\\x6d\\xf2\\xa2\\xe4\\x5f\\xc8\\xae\\xbf\\x14\\xe0\\xa9\\x55\\x61\\x8a\\x25\\x13\\xf4\\x52\\xcd\\x9b\\xc2\\x0e\\x67\\xa8\\x2a\\xba\\x37\\x81\\xb8\\x2d\\x7e\\x47\\x73\\xda\\x61\\xeb\\xdd\\x23\\x71\\x12\\x5d\\xa0\\xe3\\x89\\x84\\x88\\xe3\\x07\\x1b\\x64\\xbd\\x02\\x83\\xac\\x2f\\x3e\\xff\\xf2\\xff\\x7c\\xf5\\xd3\\x0f\\x3f\\xbe\\xef\\xf3\\x90\\xb1\\x6d\\xb6\\xd4\\xf2\\x36\\x8c\\xb3\\xa8\\x80\\x84\\x96\\x91\\x56\\x93\\xae\\x69\\x58\\x03\\xc9\\x7d\\x41\\x29\\xb9\\xa0\\x5f\\xb5\\xe1\\xc7\\x16\\xe2\\x7d\\x34\\x2c\\x0b\\x1c\\xe9\\x70\\xa4\\xee\\x32\\x00\\x58\\xde\\xbe\\xfb\\x25\\x5c\\x37\\xe8\\x86\\xe8\\xd8\\x14\\x9f\\xa9\\xf5\\xe4\\xc4\\x01\\x16\\x71\\x46\\x7a\\x48\\x67\\x07\\xa6\\x86\\x12\\x42\\xc0\\xbc\\xf6\\xad\\x02\\x1e\\xa5\\xa7\\xaf\\x20\\x3c\\xb8\\x5b\\x06\\x27\\xc0\\x22\\x8b\\x10\\x34\\xf0\\xa2\\x94\\x89\\xbf\\xab\\x98\\xed\\xb5\\xae\\x1f\\x53\\xd2\\xfa\\x4d\\x4b\\x15\\x83\\x27\\xa5\\xaf\\x94\\x35\\xe9\\xa6\\x13\\x15\\x16\\xaf\\x3f\\x71\\x8d\\xf8\\xc4\\x8a\\x2b\\x43\\x44\\xfb\\xb0\\x19\\x33\\x40\\xc4\\x84\\xad\\xee\\x6d\\x3f\\x84\\x86\\x1c\\x52\\x66\\xc4\\x3d\\xd5\\xa8\\x61\\xa2\\x9b\\x55\\xbe\\xe9\\x44\\xf0\\x4d\\x49\\xf7\\x69\\x9b\\x81\\x2a\\x0f\\x07\\xaa\\x80\\xb0\\x03\\x63\\x76\\xda\\x0c\\x24\\x5d\\x32\\x1d\\xf4\\x3c\\x5a\\x58\\xef\\xb4\\x51\\x9a\\x72\\x95\\xb2\\xde\\x61\\x60\\xa0\\x77\\x85\\x18\\x2c\\xa2\\x2c\\xeb\\x25\\xc0\\x2b\\xd1\\x91\\x03\\xf6\\x3e\\x84\\x8f\\x60\\xc9\\xd5\\x6d\\x55\\x7f\\x05\\x6b\\xea\\x43\\xd8\\xa7\\xc4\\x96\\xa8\\x3a\\x56\\x09\\x49\\x97\\x74\\x11\\x5c\\xa8\\x92\\x29\\xcf\\xd3\\xa2\\x8c\\xf9\\x37\\x60\\xa5\\xac\\x78\\xfd\\x36\\x81\\xd9\\x0f\\xf0\\x7c\\x99\\x58\\x7b\\xfb\\x8c\\x81\\x43\\xd2\\x81\\x6a\\x14\\x41\\x6c\\x54\\x12\\x1f\\x66\\x72\\x10\\xbc\\xb4\\xd3\\xc6\\x91\\x77\\xe5\\xcb\\x11\\x86\\x73\\x6c\\x13\\xac\\x1d\\xc2\\x63\\x75\\x49\\xf6\\x8a\\x8d\\xed\\x43\\x3c\\x1a\\xf5\\x08\\x91\\x8d\\xa7\\x8b\\x3c\\xec\\xf3\\x93\\x07\\xd4\\x21\\x9e\\xd2\\x54\\x4e\\x31\\xcb\\xfb\\x07\\xd4\\xf2\\x98\\xc3\\x76\\x3d\\xe7\\x5a\\xbe\\xed\\x3d\\x63\\xcd\\x63\\xac\\x2b\\x77\\x9f\\xe3\\x3e\\xf7\\xbc\\x3e\\x21\\xa8\\x74\\xd5\\xfb\\x10\\xed\\x83\\xc6\\x33\\xdf\\x89\\x2f\\x9e\\x14\\xe2\\xf6\\x40\\x8e\\xdb\\x83\\xdf\\x84\\x10\\xfb\\x6c\\x84\\x8e\\x09\\xc1\\xb3\\x5b\\x61\\x9c\\x10\\xec\\xe2\\xf6\\x05\\xcc\\xc8\\x93\\xea\\x0b\\x43\\x43\\xc2\\xc1\\x52\\x26\\xa9\\xe6\\x3c\\xf7\\xbf\\x14\\x6b\\xa8\\x2d\\x90\\x0d\\x76\\xe9\\xb9\\xd7\\x15\\x3f\\xa0\\x6e\\x73\\x77\\xbe\\x00\\x79\\x2d\\xf1\\xbe\\x06\\x64\\x87\\xa4\\x50\\xf7\\x73\\x6b\\xcb\\x0c\\xc9\\xdb\\xc6\\xd3\\x5d\\xf3\\x17\\x4c\\x19\\x53\\xcc\\x8d\\x75\\x5b\\xab\\x31\\x06\\xee\\xcd\\xd9\\xf8\\x9c\\x58\\xfe\\xde\\xef\\x35\\xe6\\x87\\x67\\xa9\\x6f\\x7e\\x4b\\xd7\\x70\\x04\\x2b\\x77\\x8c\\x1d\\x87\\x08\\x9e\\xd2\\x3f\\xef\\x13\\x56\\xab\\x6b\\x2e\\xb0\\xda\\x8b\\x51\\x35\\x3b\\xe8\\x40\\x3f\\x00\\x76\\xdd\\x1a\\xef\\x06\\x21\\x81\\x4b\\xd2\\x7f\\x41\\x31\\x79\\xf3\\x3b\\x67\\xde\\xb9\\xfc\\x19\\xba\\x06\\x7e\\x0e\\xf7\\xc6\\x0d\\xa6\\x51\\x50\\x85\\x36\\x19\\xc1\\x3a\\xa0\\xc6\\x08\\xe2\\xd4\\x54\\x5a\\x2b\\x2b\\x3e\\xab\\x2e\\xd5\\xb6\\xb6\\x54\\x0d\\x59\\x9d\\x7f\\xf5\\x6c\\xc4\\xa4\\x1d\\xf4\\xb5\\xfb\\x89\\xa8\\xd5\\x79\\x93\\x4a\\x7b\\x06\\xb5\\xe0\\xdf\\xc0\\xf3\\xb4\\xc6\\xaf\\x1b\\xb0\\xd5\\x87\\x8c\\x5e\\xbd\\x0b\\x8f\\x71\\xa3\\x37\\xd4\\x23\\xfb\\x00\\x71\\x15\\x6e\\x8d\\x6a\\x39\\xf0\\xc6\\x9c\\x18\\x2a\\xc0\\x50\\x72\\x1f\\x42\\x97\\x75\\x9d\\x2d\\x87\\x20\\x6e\\x13\\x3e\\xa0\\x31\\xf3\\x4f\\x30\\x21\\x18\\x00\\x46\\xa3\\x17\\x0c\\xe7\\x7b\\x5b\\x0a\\x4a\\x06\\x49\\x80\\xd1\\xc8\\x37\\x91\\x9d\\x3a\\x97\\x71\\xd9\\x44\\x65\\x53\\xf4\\x88\\xb2\\xb0\\x2f\\xc4\\x74\\x56\\xc4\\x62\\xda\\x84\\x91\\x26\\x35\\xd3\\x80\\xa0\\x06\\x45\\x33\\x54\\x71\\x28\\x17\\xe9\\xb2\\x51\\xb3\\xfb\\x36\\x89\\x7a\\xaf\\x8c\\x53\\xac\\x0b\\x09\\x22\\x5f\\xba\\x24\\x6a\\xbd\\xb4\\x0b\\x4e\\x1f\\x1b\\x38\\xea\\x84\\x79\\x5b\\x7d\\x85\\xb6\\x12\\x0e\\x9d\\xe4\\x9e\\x28\\x1f\\x4d\\x3f\\x7c\\x72\\x5c\\xfc\\x03\\xd7\\xea\\x33\\x2b\\xb1\\xf9\\x9d\\x2b\\xb1\\x51\\x2b\\x21\\x87\\xe8\\xa2\\x39\\x0b\\x51\\xb6\\xf0\\x82\\x4b\\xc4\\xba\\x0d\\xed\\x77\\xcf\\x18\\x05\\x41\\xc8\\x18\\x40\\x61\\xa8\\x51\\xbf\\xec\\x93\\x39\\xcb\\xf8\\x73\\x58\\xab\\x81\\x61\\xe3\\xaa\\xd2\\x41\\xa7\\x20\\xb8\\x18\\x6e\\xaa\\x38\\x85\\x6f\\xaa\\x1f\\xee\\x78\\x99\\xee\\x8a\\x7b\\x30\\x38\\x90\\x5e\\x05\\x2e\\x33\\x1f\\x78\\x1e\\x95\\xad\\x7f\\x82\\x68\\x57\\x7d\\xad\\x87\\x7d\\xcd\\xdb\\x38\\xd5\\x45\\xd7\\xfd\\x36\\x28\\xad\\xa1\\x37\\xc7\\xd2\\xee\\xdc\\xe5\\x28\\xdb\\xeb\\x8b\\x37\\xd9\\x14\\x62\\x6f\\xc1\\x00\\xd1\\xdc\\x44\\xd9\\x53\\xf4\\x2e\\x70\\x4f\\x94\\xbd\\x05\\x0b\\xa3\\x29\\x58\\xce\\x4f\\x20\\x58\\x15\\x8b\\x2a\\x1f\\x43\\xd5\\x91\\x63\\xf7\\x42\\x85\\x8e\\x0c\\x47\\x6e\\x1c\\x26\\xad\\x61\\x9d\\xc2\\x14\\x28\\xbb\\xe1\\xac\\xba\\x2d\\xb9\\x75\\x9f\\xb5\\xbd\\xf1\\xfb\\x27\\x0d\\x91\\x2b\\xdf\\xe4\\xb5\\x85\\x80\\x61\\x6d\\x3d\\xb9\\x98\\x13\\xb4\\xfd\\x87\\x38\\x97\\xf3\\x99\\xe4\\xf5\\x9b\\xd2\\x1e\\x77\\xdc\\x32\\x96\\xa7\\xb5\\x19\\x90\\x76\\xae\\x0f\\x38\\x4e\\x7f\\x98\\xb2\\x71\\xc7\\xcc\\xbb\\xc0\\xa6\\x73\\x92\\xcf\\x74\\xde\\x35\\x9b\\x46\\xdf\\xcd\\xe5\\x6d\\x2f\\xe1\\xc9\\x0b\\x70\\xc1\\xa6\\xb1\\x40\\x4b\\xdf\\xb3\\x1b\\x2e\\xe5\\x06\\x13\\x3d\\x97\\x89\\xec\\xdc\\x73\\x04\\x19\\x2a\\x9d\\x93\\x0e\\x19\\x65\\xdd\\x04\\x13\\x66\\x83\\x85\\xeb\\xe4\\x04\\x61\\xce\\x66\\x6b\\x85\\x6b\\x21\\x98\\x3a\\x23\\x34\\x72\\x0c\\xc6\\x61\\x04\\x0b\\xf3\\x53\\x99\\x8a\\xc3\\x43\\x97\\x9d\\x38\\xbe\\x78\\x5e\\xf2\\x8d\\xbd\\x3d\\xeb\\xd2\\x8d\\xdd\\xf5\\xea\\xf1\\xb5\\x60\\xa5\\xcb\\x9f\\xbb\\xd6\\x4e\\xbe\\x8d\\xd0\\x2e\\x4c\\x6b\\x5f\\x1b\\x9a\\x7d\\x30\\xe7\\x3b\\x69\\x5a\\xee\\xaa\\xf7\\x25\\xa9\\x67\\xf4\\xfa\\x46\\x22\\x8c\\xe2\\xc4\\x60\\x78\\xfe\\x91\\x54\\x17\\x71\\x32\\x1a\\x71\\xcb\\xda\\x5c\\xf9\\x12\\x93\\x05\\xaa\\x76\\x98\\x07\\x4a\\xf8\\x16\\x73\\x9d\\x4a\\x8f\\x2e\\x57\\xac\\xe6\\xca\\xf1\\xbb\\x05\\x65\\xb2\\x65\\x93\\x32\\x75\\x85\\x0d\\x90\\xd0\\x46\\x3b\\x8d\\x8f\\x46\\x6d\\x7f\\x73\\x10\\xfb\\x18\\x23\\x77\\x99\\xec\\xec\\x7f\\xce\\x31\\xbb\\x2e\\x8a\\x5d\\x9d\\xed\\x4f\\x84\\x4d\\x19\\xf2\\xd1\\xe8\\x3c\\xe1\\x55\\x5d\\x16\\x8f\\xae\\xfd\\xf4\\xe1\\xe0\\xbb\\x4e\\xd7\\xaa\\xb3\\x0e\\x9f\\xeb\\x5e\\x8b\\xe9\\x0e\\xf1\\x3a\\x18\\xda\\xa0\\x86\\xf9\\x71\\xcf\\xdb\\xf6\\xc7\\x56\\x09\\xcf\\x41\\x09\\x66\\x95\\xc8\\x14\\xa0\\x56\\x09\\x38\\xdd\\x62\\x0c\\x14\\xcb\\x03\\x5a\\x49\\xe3\\x6d\\xcf\\xe9\\x66\\xa5\\x2c\\xcf\\x6a\\xdf\\xd3\\xb3\\x82\\xb8\\xb9\\x2f\\x16\\x3f\\x37\\x65\\xcb\\x18\\x78\\x3a\\x2b\\xf2\\x60\\x38\\xa3\\x70\\x08\\xc4\\xf7\\x03\\x8c\\x99\\x89\\xe9\\xc4\\x8a\\x32\\x18\\xce\\x69\\xcd\\x6f\\xf6\\x82\\x08\\x0a\\x3e\\x79\\x9d\\x64\\x77\\x03\\xc0\\x58\\xa1\\x1e\\xc5\\xa0\\x2c\\xc4\\xd9\\x54\\x8f\\x97\\x1d\\x75\\x26\\xac\\x2c\\x8b\\x7b\\xef\\xf2\\xf5\\x79\\x92\\xdd\\x75\\x56\\xc0\\x90\\x96\\xaa\\x02\\xfc\\xff\\x09\\x95\\xa0\\x29\\xbd\\x94\\x07\\x32\\x80\\x40\\x9d\\xd5\\x3b\\x2e\\x2e\\xf4\\x84\\xef\\xd8\\x63\\x30\\xc3\\xec\\xff\\xc3\\x39\\x95\\x16\\x1c\\x1c\\xc6\\x7c\\x97\\xf1\\x7b\\xc8\\x63\\xff\\xa4\\x67\\x82\\xa9\\xe4\\x14\\x1d\\x10\\xcc\\x1a\\xce\\xc2\\x62\\x6d\\xc3\\x66\\xb8\\x4a\\xc5\\xd2\\xa8\\x6d\\x55\\xf2\\x67\\xcc\\xba\\xdd\\xd2\\xa3\\xc4\\x0d\\x33\\x7a\\x78\\xd8\\x70\\x95\\xde\\xdf\\x57\\xee\\x88\\x1f\\xab\\xe1\\xb9\\x1c\\x82\\x2a\\x1d\\x8d\\x98\\xcf\\xec\\x10\\xd1\\x9d\\xb5\\xc8\\xb2\\xb3\\xd8\\x4a\\xc6\\xe7\\x0c\\x4f\\xb2\\x17\\xad\\xea\\x6a\\x7d\\xa4\\x20\\xa1\\xf5\\x15\\x17\\x16\\x9f\\x00\\x57\\x8b\\x15\\x86\\x4d\\x11\\x3f\\x60\\x5f\\x82\\xe1\\xfc\\x48\\x9b\\x34\\x68\\x96\\x57\\x35\\xcb\\x63\\x08\\x4e\\xa9\\xaf\\x41\\x73\\x89\\x34\\x5d\\x7a\\xd5\\x48\\xda\\xe1\\x0a\\xff\\xaf\\x7a\\xf5\\x7f\\x07\\x58\\x79\\x70\\x73\\x5b\\xd5\\x83\\x88\\x0f\\x20\\x7e\\x5c\\x9a\\xf1\\x64\\x70\\xbf\\xe5\\xf9\\x40\\x6c\\x22\\x24\\x18\\xcb\\xf2\\xcd\\xc0\\x1b\\xeb\\xbd\\x1a\\x7b\\x83\\x22\\x87\\x48\\x8f\\x92\\x8e\\x53\\xe3\\x19\\x20\\x8a\\x19\\xca\\x74\\x43\\x96\\xef\\xa4\\x36\\xf7\\x97\\xd6\\xa2\\x26\\x20\\x23\\x28\\x08\\xa5\\x23\\x71\\x3a\\x99\\x2c\\x94\\x9b\\x11\\x5f\\xa5\\x6b\\x41\\x15\\x6a\\x3b\\xa4\\x0d\\xe9\\x63\\x56\\xad\\xa1\\xd1\\xce\\x35\\x70\\x85\\x2b\\x78\\xe1\\x48\\x86\\x50\\x67\\xd2\\xf3\\x6e\\x58\\x7e\\xcb\\x76\\xde\\x30\\xdc\\xe0\\x10\\xb6\\xa1\\x8e\\x70\\xb0\\x59\\x5a\\x01\\x09\\xbc\\x40\\x49\\xde\\x3c\\x9a\\xb5\\xeb\\x40\\xf8\\x01\\x55\\xa7\\xb8\\xad\\xbd\\x96\\xc9\\xb3\\xbf\\x1d\\x7b\\x1f\\x3a\\x66\\xf8\\xb2\\xab\\xf0\\xb0\\x3a\\xcc\\x3e\\xbc\\x43\\x18\\xa6\\x12\\xd3\\x1d\\x3b\\x1b\\xe0\\x89\\x78\\xdf\\xe5\\xc5\\x62\\xd7\\xa7\\x4f\\x1a\\xb5\\xc8\\x25\\x34\\xf8\\x4e\\x70\\x06\\x78\\x52\\xd2\\xec\\xe1\\x9d\\xc0\\x35\\x4d\\x92\\x79\\xc3\\xd5\\x7d\\x5d\\x75\\x90\\x3b\\x06\\xc3\\xb6\\x5a\\x49\\x2c\\xd0\\xe9\\x2a\\xdd\\x1e\\xab\\xf5\\x99\\x96\\x36\\x4a\\x12\\x15\\x91\\xb8\\xa9\\x01\\x0d\\x8e\\x46\\xed\\x20\\x22\\xea\\x8d\\x2f\\x7f\\x85\\x4f\\xa0\\x35\\x94\\x4f\\x54\\xdc\\x9c\\xea\\x41\\x5c\\xf9\\x1d\\x93\\xc4\\xf8\\x8a\\xad\\x61\\x2b\\x9e\\xe7\\xe9\\x68\\xf9\\xc1\\x9b\\xb1\\x3a\\x74\\xa7\\xda\\x8b\\xd1\\x88\\x21\\x15\\xe0\\x94\\xda\\x91\\x8e\\x13\\xf2\\x14\\xaf\\xd8\\x7a\\x18\\x26\\x62\\xc8\\x2b\\xb6\\x0e\\x13\\xd2\\x1e\\x17\\x40\\x55\\x47\\xe8\\xb0\\x68\\x60\\x21\\x1b\\xf8\\x86\\x85\\x68\\x96\\x51\\xc0\\xfc\\xc8\\x95\\xd3\\x10\\x43\\x25\\x58\\x70\\xa8\\x07\\x8f\\xe6\\x94\\x02\\x05\\x35\\x3b\\x6b\\x76\\x64\\xed\\x96\\xb3\\x5e\\x3e\\x21\\xf4\\x85\\x5f\\xa5\\x31\\x21\\xd4\\x99\\x81\\xd4\\xb0\\x80\\x97\\x89\\x44\\xbd\\x2b\\x7d\\x86\\xc3\\x10\\x03\\xe6\\x2c\\x25\\xcd\\xa6\\xc2\\x78\\xac\\xc1\\xc3\\x3e\\x9e\\xd6\\xd9\\xde\\x27\\x0d\\x83\\xe0\\xc3\\xc1\\x83\\x96\\xb1\\x45\\x7d\\xa0\\xb0\\xcb\\x2e\\x09\\xa1\\x6e\\xe0\\x3b\\x59\\xc2\\x63\\x9d\\xc5\\x9c\\xb6\\xea\\xd2\\x58\\x9f\\x41\\x09\\x6d\\x8d\\x02\\x50\\xd6\\xa9\\x0f\\x29\\x52\\xa8\\xdb\\xe1\\xb6\\x3d\\x40\\xd1\\x1b\\x2a\\xfb\\x8e\\xcd\\x0f\\x41\\x39\\x21\\x81\\xaa\\xd0\\x38\\xa3\\x59\\xf5\\x06\\x57\\xed\\x5d\\x79\\xeb\\x48\\x59\\x9c\\x44\\x80\\xf6\\xcd\\x46\\xb4\\x0c\\x54\\x2e\\x37\\x53\\xa1\\x5b\\x87\\x33\\x13\\xb2\\xd5\\xf9\\x08\\x20\\xa4\\xff\\x4e\\x58\\xc4\\x6c\\xa9\\xff\\x3b\\xe1\\x50\\xdc\\x13\\x27\\x00\\x71\\x4e\\xe8\\x30\\x76\\xb7\\x41\\x1b\\xff\\x0d\\x5e\\x06\\x5e\\xe2\\x0b\\xcf\\xc3\\x97\\x40\\x63\\x2f\\x84\\x2f\\x1c\\x72\\x13\\xc0\\x94\\x6e\\xa5\\xab\\x63\\x00\\x30\\x53\\xa1\\xdf\\x77\\xae\\xe1\\x54\\xa3\\xd8\\xb7\\xe6\\x6e\\x4a\\x4d\\x89\\xca\\xb3\\xe7\\xab\\x40\\x42\\x92\\xbc\\xec\\x33\\x3e\\x89\\x88\\x66\\xd2\\xb5\\x99\\x72\\x4b\\xde\\xe7\\xe4\\xc4\\x68\\x45\\x44\\x6f\\x56\\x97\\x21\\xfb\\xba\\x59\\xc9\\x61\\xa2\\x44\\xc6\\x86\\x1e\\xa2\\xa9\\x4c\\x99\\x2a\\x90\\x8b\\x8a\\x0b\\xb1\\xe1\\xf5\\xcf\\x6f\\xbe\\xf2\\xad\\x49\\xa2\\x38\\x86\\xd7\\x7a\\x86\\x34\\x95\\xcc\\x77\\x06\\x02\\xd5\\xa6\\x6f\\x8f\\xb1\\xf9\\x4c\\x78\\x15\\x97\\x59\\xc4\\x93\\xe8\\xd1\\x54\\x54\\x5b\\xa2\\x79\\x95\\xd1\\xc8\\xf6\\x9a\\x97\\x46\\x05\\x92\\xf6\\x69\\x87\\x44\\x77\\xfa\\xd0\\x2c\\xce\\xb2\\xbb\\xd8\\x22\\x9c\\x21\\x1e\\x45\\x6b\\xc9\\x82\\xee\\x76\\x34\\x0b\\xcf\\x7f\\xad\\x96\\xec\\xb6\\x2e\\x96\\xbf\\x56\\xcb\\xf3\\x8c\\x5e\\x85\\xd2\\x24\\x74\\x4b\\x16\\x57\\xa3\\x91\\xbf\\x0d\\xb7\\x5a\\xce\\x90\\x51\\x0f\\xb0\\x31\\x26\\xa8\\x49\\x4d\\x88\\x5b\\x90\\x59\\xda\\x99\\x3c\\x68\\x92\\x55\\x7b\\xc1\\xe2\\x78\\xd1\\xae\\x88\\xaf\\xbd\\x23\\xb1\\xa3\\x27\\x74\\x1f\\xe0\\xba\\x1d\\x46\\x48\\xb3\\x45\\xcb\\xb4\\xa1\\x50\\x69\\xd5\\xc0\\x30\\x63\\xc6\\x44\\xd8\\xe5\\x1f\\xfa\\x7c\\xf1\\xb0\\x05\\xda\\x46\\x39\\x00\\x2f\\xb6\\xe5\\xda\\xf8\\xe1\\x9a\\xc4\\x39\\xbb\\xb0\\x15\\x27\\xe2\\xc6\\x2e\\x92\\xe2\\xe8\\x2c\\xf5\\xaf\\xf0\\x68\\xe5\\xe1\\x96\\x16\\xed\\x9e\\x5c\\x5e\\x8a\\x2c\\xb6\\xa1\\x17\\x15\\x75\\x5d\\xdc\\x78\\x61\\xb8\\x1d\\x8d\\xae\\xa7\\xf8\\x34\\xbe\\xb9\\x2c\\xe4\\xcf\\x25\\xac\\x3b\\xf2\\xb8\\xb2\\x4e\\x5d\\xec\\x27\\x37\\xaf\\x0b\\xf1\\x77\\xa9\\x9a\\xab\\xa0\\x26\\xb2\\x0a\\x3c\\x8c\\x77\\x97\\xc5\\x14\\x1c\\x6a\\x75\\xe4\\x13\\xf8\\x23\\xeb\\x40\\x7a\\x91\\xdd\\xeb\\x02\\x7e\\x2c\\x65\\xfb\\x60\\x4b\\xdd\\x08\\x16\\xb9\\xb3\\x87\\x20\\x67\\xd8\\xeb\\x79\\x7d\\xc9\\x76\\x31\\x68\\x1b\\x12\\x99\\x1c\\x67\\x4b\\xaf\\xe9\\x8e\\xde\\x28\\x67\\xa2\\xfd\\x7e\\xf7\\xf8\\xa3\\x82\\x3a\\x7f\\x4f\\xb7\\xb8\\xc4\\xbf\\xb5\\x85\\x8e\\xdc\\xc2\\x71\\x0b\\x7e\\xca\\x7f\\xd2\\x1b\\x73\\xdc\\x2d\\xca\\x5b\\x72\\x09\\x89\\x30\\x19\\x7a\\xbd\\xb2\\x3b\\xee\\xf3\\x67\\xd4\\x2d\\x75\\xb6\\x6f\\xab\\x5a\\xd2\\x1e\\xed\\xca\\x6f\\x1f\\x66\\x9a\\xf0\\x5b\\x2b\\xbc\\x97\\xbb\\x20\\x0d\\x6b\\x48\\xa3\\x08\\x95\\x28\\x8b\\x87\\x49\\x13\\xe8\\x52\\xbb\\x48\\xfa\\x1e\\x6e\\x8c\\xd0\\x3b\\x41\\xa9\\x30\\xa6\\xb8\\x98\\xe0\\x81\\x9d\\xcf\\x08\\xdd\\xf6\\x55\\x91\\x39\\xa6\\xe6\\x33\\xb2\\xc8\\xaa\\xef\\xd9\\xf7\\xfe\\x86\\x8c\\x46\\xfe\\x06\\xec\\x90\\xe1\\x79\\x4b\\x00\\x1b\\xcc\\xd0\\x0b\\x6b\\x3f\\x0e\\x37\\x34\\x92\\x79\\x6f\\xb6\\x94\\xb5\\xb3\\x23\\x89\\xe1\\x51\\xc3\\x19\\x40\\xee\\x26\\x27\\x25\\x53\\x62\\xd0\\x06\\xa8\\x11\\xca\\xe2\\x16\\x72\\xb9\\xd6\\xc5\\x5e\\xe6\\xbf\\x71\\x8a\\x51\\xbf\\x20\\xd6\\x31\\x22\\x54\\x5a\\x4d\\x25\\x4d\\xbd\\x5b\\xd6\\x5e\\xa8\\xab\\xf6\\x42\\x2d\\xe4\\x19\\x8a\\x47\\xa3\\xab\\x61\\x98\\x02\\x9b\\xa1\\x73\\x54\\x8d\\xd3\\xc9\\x55\\xf3\\xfc\\xff\\xbb\\x3c\\xa6\\xa8\\xc0\\xe1\\xc9\\x57\\x7c\\x57\\x33\\x3f\\xa6\\x11\\xcd\\xe8\\x15\\x59\\xe0\\x09\\x5a\\xaa\\xe5\\xc0\\xc7\\x40\\x2e\\x13\\x9c\\x52\\x19\\x3b\\xe7\\xbc\\x2e\\xf6\\x07\\x3c\\xa7\\xda\\x9f\\x89\\xde\\x84\\xbb\\xe5\\xc5\\x99\\x3c\\x85\\x7c\\x9c\\x05\\xe2\\x41\\x9c\\xec\\x74\\x7c\\x45\\xf3\\x70\\xb7\\xf4\\xac\\xe9\\x78\\x81\\x67\\xcf\\xc4\\x5b\\x24\\x2a\\x5d\\x51\\xa4\\x6d\\x8c\\x00\\x59\\x7f\\x5e\\x96\\xc5\\xbd\\x7f\\x43\\xc5\\xe4\\x57\\xf9\\x9a\\xee\\x5a\\x9a\\x05\\x53\\xad\\x95\\x16\\x10\\xcf\\x2c\\xf4\\x80\\xc8\\x3d\\xd6\\x78\\x03\\x24\\x6c\\x7f\\x98\\x9d\\xf9\\xf3\\x09\\x3b\\x8f\\xc8\\xd8\\xfb\\x67\\x4f\\x57\\x41\\xfc\\x04\\x15\\xc5\\x4d\\xd1\\xd2\\xd6\\xc8\\x8b\\xb5\\x47\\x01\\x88\\xa0\\x1e\\xe9\\x45\\x97\\x0c\\xec\\x82\\x29\\xcb\\x58\\x57\\xe0\\x26\\x63\\x0d\\xa9\\x8b\\x60\\x5b\\xdf\\xec\\x96\\x18\\x53\\x19\\x73\\xf3\\x7a\\x6b\\xb1\\x24\\xcc\\x55\\xd0\\x8a\\x63\\x0d\\xd4\\x73\\xb1\\x1f\\xe0\\x3e\\x0c\\xc4\\x70\\x07\\x52\\x17\\xf4\\x8c\\x4d\\x99\\xe5\\xa4\\x84\\x24\\xff\\xd0\\xc1\\x56\\x10\\x51\\x45\\x5e\\x89\\xd4\\x60\\x2e\\x81\\x82\\x1a\\x66\\x5c\\x9f\\x77\\x93\\x0e\\x9d\\xfe\\xb2\\x06\\xcb\\x49\\x8d\\xac\\x43\\xd7\\xa8\\x68\\x4c\\x75\\xb6\\x47\\x3b\\xef\\x86\\x75\\x5b\\x27\\x15\\xd7\\xc2\\xa9\\x1b\\x42\\x87\\x9b\\x53\\x3e\\x2f\\x83\\xf4\\xc5\\x21\\xdb\\xd3\\x97\\x63\\xd1\\xe4\\x03\\x4d\\x03\\x95\\x2c\\xa1\\x4b\\x08\\xed\\x6e\\x9d\\x92\\x7f\\x3c\\xa3\\x6b\\x5e\\xf8\\xca\\xd7\\x14\\x24\\xb3\\x40\\xdc\\xb4\\xd2\\x61\\xda\\x0a\\x18\\xa5\\x51\\x9b\\xc8\\xfa\\x44\\xa6\\x70\\xef\\x79\\x4f\\xdb\\xdd\\x6b\\x67\\x21\\x59\\xa3\\x75\\x4e\\x0c\\x89\\xdd\\x97\\x61\\xc7\\x9c\\x8d\\x96\\xdc\\x43\\x91\\x17\\xae\\x29\\x64\\x18\\x35\\x2c\\xad\\x16\\x92\\xd9\\xc3\\x1c\\x6c\\xde\\x17\\x3f\\x7c\\xf5\\x57\\x74\\x3d\\x44\\xef\\x1f\\x08\\x1f\\xd3\\xa7\\xfc\\xc5\\x50\\xe2\\x1c\\xc9\\x09\\xc8\\x35\\x67\\x8b\\x7f\\x38\\x7d\\x82\\x17\\x01\\x97\\x1a\\x62\\xcc\\x1d\\x47\\x31\\x8a\\x47\\xc0\\x25\\x2d\\x33\\x81\\xbc\\x73\\x47\\xa2\\x6c\\x54\\xa5\\x64\\xf3\\xed\\xbf\\xff\\x49\\x3b\\x94\\xc5\\x36\\x2f\\xd7\\x7a\\x4f\\x37\\x61\\xb2\\x74\\x93\\xc7\\x05\\xe9\\x52\\x8c\\x2d\\x88\\x4c\\x9e\\xb7\\x6d\\x28\\x13\\x8c\\x05\\xc9\\xb2\\x57\\xcb\\xad\\x6d\\x71\\x0f\\x87\\x86\\xba\\x57\\xa7\\x20\\x8b\\x2c\\x83\\x5d\\x72\\xa4\\x99\\xf8\\x36\\x4e\\xd3\\x98\\x89\\xc1\\xb3\\xf8\\x26\\xce\\xd4\\xbc\\xc0\\x02\\x9f\\x1c\\x03\\x48\\x28\\xab\\x55\\x8b\\xf6\\xa2\\x6d\\x69\\x06\\x79\\x97\\x1a\\xdb\\xd9\\xa4\\xaa\\x1a\\x88\\xda\\xb8\\x86\\x18\\xda\\x91\\x2d\\x4d\\x8e\\xb9\\x71\\x24\\x3f\\x6e\\xa7\\x93\\x1b\\x47\\x38\\xd4\\xf3\\x8b\\x49\\x7c\\x7e\\x71\\x54\\xf4\\xa4\\xdd\\x6e\\x92\\x9c\\x6c\\x20\\x49\\xc7\\xce\\x2f\\x9d\\x5f\\x4c\\x92\\xf3\\x0b\\x27\\x7d\\x5d\\x7c\\x0c\\x5e\\x54\\x51\\x7d\\xe7\\xd8\\x5a\\x86\\xce\\xeb\\xb7\\x63\\x2d\\x10\\x33\\x36\\x52\\x0a\\x6a\\x8b\\x1e\\x43\\x6c\\xcb\\x2d\\xe0\\x12\\xf8\\x7a\\xf4\\x18\\xdd\\x2a\\x07\\xa9\\x82\\x39\\x1c\\x66\\x16\\x23\\xd9\\x4b\\xd5\\x67\\xa9\\x7f\\x0e\\xe7\\xe0\\x20\\x86\\x23\\xef\\x7c\\x46\\x94\\xc8\\x1b\\x57\\x3b\\x9d\\xa8\\x54\\x72\\x34\\xd3\\x34\\x88\\x2a\\x1a\\x27\\x8b\\xed\\xeb\\x0d\\x50\\xf8\\x70\\x66\\xc2\\x0d\\x26\\xd2\\x0c\\xb2\\xcb\\x0d\\x26\\xd3\\x94\\x0b\\x2a\\x8e\\xa2\\xa9\\xa0\\x8b\\x27\\x19\\xda\\xf3\\x48\\x27\\x35\\xb9\\x27\\x29\\xbd\\x96\\x3f\\xc7\\xe9\\x38\\x5e\\x5c\\xbd\\xde\\x20\\x09\\x83\\xa7\\x35\\xc4\\xa7\\xc9\\x55\\x70\\x7d\\xb9\\xc1\\x73\\x0c\\xbd\\x5b\\xef\\xc6\\x1b\\xdc\\xac\\xc9\\xb5\\xf2\\x50\\x1c\\xf0\\xd6\\xbe\\x75\\xa3\\xe0\\x66\\x8c\\x7e\\x25\\x88\\x95\\x4b\\xad\\x0f\\x88\\xeb\\x2c\\xde\\xc4\\xbc\\x87\\x83\\xdf\\xc1\\x34\\xc7\\x53\\x78\\xbd\\x94\\x7f\\x91\\x2d\\x86\\xbc\\xeb\\x81\\x2c\\x6a\\x1f\\xb2\\x9f\\xdf\\x7c\\x15\\xba\\x26\\xbc\\x03\\x36\\x0e\\xff\\xdf\\xff\\xf3\\xe7\\xfc\\xb3\\x33\\x24\\x41\\x59\\x9e\\x14\\x37\\x3e\\x21\\x32\\x31\\xa2\\x46\\x13\\x1b\\xae\\xb0\\xc8\\x17\\x8f\\x6f\\x12\\xb1\\xb1\\x7a\\xf4\\x0d\\xf7\\x96\\x6c\\xdf\\x19\\xfd\\x44\\xdc\\xdb\\x3a\\x2e\\xa8\\xa8\\xd4\\x88\\xff\\xa0\\xd4\\x97\\x84\\xce\\x87\\xa1\\xe1\\x53\\xa4\\xe3\\x61\\x4b\\xd9\\x64\\xeb\\x8c\\xfe\\xaf\\x6a\\xeb\\xea\\x9d\\xe2\\x22\\xaf\\xb2\\xaa\\x1e\\x14\\xe9\\x80\\x3f\\xb0\\xb8\\xde\\x3d\\x0e\\xe6\\x82\\x1c\\x9a\\xec\\xf8\\x1d\\xdf\\x0d\\xe4\\x9e\\x0c\\x3d\\x57\\x14\\x2e\\xbe\\xda\\x60\\x60\\x5c\\xc2\\xb1\\x11\\xbc\\x17\\xdf\\x5a\\xbf\\xe5\\x05\\x84\\xe2\\xdd\\x06\\x3d\\x87\\x1a\\xd6\\x96\\xb9\\x36\\x8b\\xda\\x61\\x37\\x2c\\x65\\xa6\\x5b\\x5d\\x7a\\x70\\xf6\\xd7\\x9f\\x77\\xf9\\x1b\\x7d\\x2d\\xdf\\xf6\\xb6\\xb2\\x9f\\x4e\\x3b\\x2c\\x39\\xc1\\x83\\x17\\x98\\x23\\xfc\\xa5\\xc2\\x52\\xfa\\x3f\\x2e\\x29\\x25\\x34\\x5a\\x1a\\xb1\\xe8\\x34\\x46\\x0b\\xd1\\x46\\x01\\x6d\\x09\\x41\\x97\\x31\\x2a\\x31\\xfc\\x58\\x9c\\x27\\xe4\\xab\\x63\\x82\\x67\\xab\\x2d\\xb7\\x5f\\x9a\\x2a\\x81\\x69\\xd8\\xd8\\x37\\xb4\\x85\\xe8\\x31\\x9b\\x76\\x84\\xad\\xb5\\x65\\x91\\xa0\\x08\\xc1\\x2c\\xe1\\x0d\\xc3\\x69\\xc7\\x96\\x7c\\xea\\x8d\\x19\\x2e\\xb1\\x24\\x5f\\xbf\\x32\\xeb\\x21\\x5f\\x50\\x26\\x0f\\x21\\xfe\\x35\\x04\\x3c\\x3e\\x23\\x81\\xc9\\x14\\x44\\xab\\x27\\xad\\x03\\x57\\x05\\xb6\\x05\\xc4\\xd1\\x4d\\x38\\x21\\xc1\\x7c\\x61\\x3f\\x28\\xe3\\x24\\xf9\\xd8\\x65\\x9e\\xa4\\x5e\\x3d\\x6f\\xa0\\xa4\\xfa\\x94\\x26\\x4a\\xff\\x63\\xe6\\x2e\\xfb\\x62\\x0f\\x22\\xf3\\xff\\x12\\x73\\x17\\xd5\\xd9\\x7f\\x99\\xb9\\x0b\\xda\\x9b\\xe8\\x6e\\xd1\\xde\\x04\\xc3\\x6c\\x99\\x35\\x6b\\xab\\xeb\\x7f\\xc4\\x06\\x26\\x9d\\xa0\\xda\\x87\\xab\\xca\\x23\\xa7\\x93\\x08\\xd9\\x24\\x5d\\xdf\\xee\\x1a\\xdf\\xdb\\x27\\xcb\\x6c\\x45\\x19\\xed\\x29\\xcd\\xae\\x0a\\x69\\x20\\x73\\xa4\\x7a\\x5e\\x8f\\x1d\\x8b\\x9a\\xdd\\x29\\x3b\\x16\\xd7\\x7e\\x65\\xfb\\xaa\\xd1\\x56\\xde\\xa7\\x97\\xaf\\xcf\\xb7\\xaf\\x2e\\x3b\\xfa\\xd6\\x9e\\xa8\\xae\\x81\\xcb\\x91\\xd8\\xc7\\xf8\\x65\\x53\\xd7\\xd5\\x89\\x6b\\xbd\\xea\\xc0\\xfe\\x3f\\xae\\xad\\xfe\\xbd\\x82\\x06\\x4b\\x21\\xac\\x35\\x00\\x46\\xf8\\xe0\\x2e\\xd7\\x4b\\x85\\x0f\\x8d\\xc6\\xc6\\xab\\xd7\\x84\\x4c\\x36\\x52\\x74\\x08\\xa4\\xd4\\xd5\\x71\\xf3\\x00\\xc4\\xfa\\x5b\\x28\\x14\\x37\\x1f\\x8d\\xbb\\x25\\x1e\\x9d\\xe2\\x8e\\x81\\x64\\xe2\\xbb\\x27\\x08\\x9f\\xf6\\xc9\\xe1\\xd0\\x5f\\xa1\\x43\\xb7\\xf4\\x21\\xcc\\xab\\x89\\xdf\\xad\\x97\\xbb\\xcd\\x00\\x9d\\xdc\\x48\\x4d\\x41\\x46\\xdd\\x14\\xa4\\x4d\\x3f\\xea\\xa5\\xef\\x26\\x1c\\xa3\\xa9\\xac\\xb0\\xd4\\xbf\\x64\\xa2\\x79\\x20\\x1e\\x75\\x61\\xd3\\xae\\xfd\\x1f\\xa7\\x82\\x14\\xf5\\x63\\x5f\\x19\\x72\\xa9\\x17\\xf6\\x83\\xba\\x32\\xe4\\x63\\xd7\\x95\\xa1\\x5e\\x3d\\x7f\\x65\\xa8\\x3e\\x7f\\xdf\\x95\\x11\\x9b\\xe4\\x6c\\xa7\\x7c\\xf4\\x91\\x81\\xf9\\x5a\\x5b\\x98\\x31\\x3f\\x46\\x27\\x5e\\xa7\\xf2\\x12\\xf9\\xe4\\xa0\\x69\\x7f\\x66\\xa3\\x94\\xa8\\x9d\\xdc\\x4d\\x19\\xbd\\x84\\x0d\\x82\\x59\\x7a\\xd5\\x79\\x1e\\x19\\x7b\\x83\\x69\\xce\\xee\\x06\\xbb\\x6c\\x70\\x39\\x60\\xca\\x24\\x1a\\xf8\\xe8\\x2a\\x5c\\x49\\x1d\\x19\\xd6\\x37\\xcf\\x18\\xcb\\x1a\\xc9\\xa7\\x96\\xaf\\x3f\\xca\\x5c\\x75\\x4c\\x3c\\x67\\x7e\\x60\\x20\\x85\\x25\\xd3\\x48\\x35\\xa8\\xf6\\x8f\\xcd\\x24\\x2a\\x65\\x11\\xf3\\xaa\\x72\\x6c\\x8b\\x4a\\x9e\\x96\\xbc\\xda\\x2a\\xe9\\x96\\xac\\xd2\\x0a\\x4d\\xf5\\x3b\\x6f\\x69\\x33\\x92\\xce\\x7b\\x3a\\x1e\\x8d\\xe2\\x46\\xba\\x1f\\x6b\\xec\\x78\\x19\\x47\\x27\\x2e\\xe3\\x58\\x5c\\xc6\\x31\\x46\\xeb\\x8d\\x5a\\xb7\\x63\\x64\\xd9\\x6c\\xe2\\xd2\\x07\\xf3\\x99\\xd8\\x4f\\xe7\\x94\\xbf\\xb5\\x57\\xb7\\xef\\x30\\x39\\xab\\xdd\\x74\\x12\\x39\\x1c\\x74\\xda\\x6c\\x03\\x97\\xcd\\x4a\\xf4\\x19\\x11\\x10\\xd6\\x22\\xee\\xf0\\xe4\\xe6\\xb4\\x15\\xe6\\x35\\xe6\\xd2\\x50\\xf9\\xb6\\x69\\x12\\xce\\x16\\x2f\\x02\\x31\\x07\\x96\\x14\\x0a\\xb4\\x97\\x00\\x88\\x4f\\x9d\\x5d\\xbc\\x7b\\xf6\\x18\\x5a\\xda\\x24\\xdd\\xd7\\x49\\x07\\x5d\\xa0\\xb4\\xc4\\x56\\x4e\\x4c\\x01\\xc0\\x3d\\xce\\x39\\x22\\xd3\\x1b\\xd6\\xf2\\x92\\x8f\\xec\\xa8\\x66\\x12\\x40\\x8c\\x0d\\x7a\\xd4\\xb4\\x56\\x3f\\xff\\xdb\\x47\\x53\\xcb\\x86\\x9c\\xf9\\xc6\\x26\\x09\\x72\\x94\\xaa\\x48\\x50\\x69\\xcb\\x96\\x7b\\xb5\\x4a\\x01\\x88\\x40\\x74\\x91\\x50\\xbe\\x5e\\x1f\\x0e\\x48\\x4a\\x4f\\xab\\xa2\\xb4\\x4c\\x21\\x80\\xbe\\x53\\x98\\x6c\\x35\\x5b\\x4f\\x04\\x73\\x7f\\x6c\\xc7\\x64\\x53\\x42\\xc0\\x6a\\xba\\xbf\\xad\\xd0\\x72\\x4b\\xac\\x1a\\x55\\xd1\\x04\\xec\\xf2\\xf9\\x1a\\x5c\\x20\\x23\\x27\\xc7\\x05\\x9c\\xc1\\x7e\\xd9\\x45\\xef\\x32\\xbb\\xc1\\x17\\x71\\x10\\x16\\x65\\xd1\\xd8\\xe7\\x24\\xec\\xa8\\x3e\\x8e\\x27\\x5d\\x1f\\x51\\x72\\x44\\xe5\\x1c\\x29\\x27\\xa8\\x8d\\x1b\\x70\\x5e\\x4a\\x2a\\x65\\x23\\x32\\x2d\\xf8\\xb7\\x41\\x6f\\x18\\xc6\\x52\\xc6\\x65\\xf0\\x4f\\x74\\x19\\x2a\\xf3\\x89\\xc1\\x66\\x18\\xfa\\x2c\\x4c\\x57\\xa9\\x8e\\x4f\\xb4\\x56\\x26\\x1f\\xd0\\x37\\xab\\xb9\\xcf\\x40\\xc2\\xb5\\x19\\x8d\\xa2\\xd7\\x5c\\x2c\\xaf\\x7d\\x60\\x7b\\x30\\x29\\xb0\\x74\\x3e\\x5a\\xac\\x32\\x63\\x8b\\xca\\x26\\x93\\x05\\xd9\\x0c\\xc3\\x74\\xc5\\xd6\\xa3\\x51\\x74\\x19\\x72\\xf8\\xe1\\xeb\\x94\\xf5\\x7c\\xc5\\xc6\\xf3\\xf5\\xe1\\x20\\xbe\\x24\\x7e\\xb5\\xc6\\x22\\x5a\\x36\\x76\\x51\\xbd\\x73\\xb8\\xf4\\xf6\\xe0\\x22\\x77\\x64\\x56\\x34\\x58\\x75\\x38\\xc6\\x9f\\xb8\\x61\\xbe\\x3f\\x19\\x47\\x10\\x14\\x5c\\x86\\xda\\xb4\\xaa\\x61\\xe0\\x70\\xf9\\xfe\\x13\\x0a\\xc9\\xfa\\x88\\x0c\\x17\\x51\\xf9\\xde\\x2e\\xf3\\xba\\x32\\x3f\\x2c\\x12\\x15\\x51\\xa2\\x19\\x42\\xc8\\x84\\x4f\\xf3\\x93\\x30\\x31\\x21\\xd6\\x76\\x99\\x15\\xed\\xae\\x2b\\x55\\xa4\\x1d\\xf6\\x4a\\xad\\x83\\x7b\\x31\\x35\\x16\\x0b\\xa6\\xef\\x3a\\xc6\\x37\\x10\\x84\\x9c\\xc5\\xcf\\x79\\x9d\\xed\\xba\\x6e\\x5d\\xfa\\x5c\\x06\\x11\\x87\\xc6\\xd1\\x03\\x59\\xb8\\x8f\\x8a\\x98\\xd1\\x05\\x0e\\xa5\\x13\\x35\\x5f\\x3e\\x4f\\xeb\\x98\\x9e\\x8d\\x0f\\x4f\\x33\\xa9\\x80\\xb3\\x32\\x76\\x28\\xa8\\x8e\\x54\\x03\\xa2\\x27\\x15\\x6e\\xb9\\x2f\\xcf\\x80\\x46\\x9c\\x2a\\x6c\\x66\\x44\\xa3\\x7f\\x2c\\xcf\\xc0\\xef\\x75\\x49\\x61\\x11\\xe6\\xdd\\x6e\\x94\\x39\\x6c\\xf6\\x4b\\xa2\\xf0\\xc7\\xed\\x43\\x64\\xc7\\x60\\xfa\\x50\\x57\\x8e\\xe7\\xcc\\xd1\\xec\\x0f\\xd0\\x38\\x8c\\x0c\\xe4\\xdf\\xee\\x64\\xcc\\x36\\xfb\\x9c\\x10\\x8f\\x40\\x0e\\x06\\xf7\\x8a\\x82\\xe4\\x5b\\x90\\x97\\xa3\\x71\\x55\\x25\\x61\\xd2\\x97\\x9a\\x43\\x87\\x11\\xa5\\x43\\x1d\\x24\\x14\\x8f\\x6d\\x47\\x62\\x20\\xa9\\x71\\x88\\xdd\\x04\\x3a\\xc1\\x8e\\x55\\xf5\\x80\\xc9\\x74\\x0b\\x0d\\x85\\x2c\\x2c\\x7e\\x33\\xf2\\x0a\\xdc\\x61\\xb6\\xfa\\x56\\x19\\xe1\\x75\\xd5\\xe6\\x50\\x5b\\xcc\\x8d\\xdb\\x91\\xdf\\xa3\\x17\\x68\\x73\\x21\\x4c\\x63\\x7f\\x0c\\xec\\xad\\x1d\\xfe\\x57\\xe1\\xd5\\xc8\\x46\\x3a\\x1e\\xd1\\x79\\x14\\x74\\x85\\x2d\\xdd\\xea\\x78\\x38\\xf6\\x81\\x31\\xa3\\x7b\\x12\\x1b\\x1d\\x58\\x3a\\x6d\\x98\\x56\\xe7\\x1a\\x44\\xcd\\x46\\xda\\xda\\xa7\\xa3\\x0d\\xae\\xc4\\x11\\x42\\x36\\xc7\\xa7\\xf1\\x3e\\x4d\\x28\\xb7\\x14\\xf8\\x29\\xa4\\x68\\xef\\x44\\x52\\x72\\x2f\\x2f\\x07\\x2e\\x84\\x0d\\x2e\\x07\\xcf\\x60\\x37\\xe4\\xdf\\x3b\\x43\\x35\\x8b\\xb1\\x0b\\x54\\xd1\\x1b\\x9f\\x3b\\xea\\x40\\xe1\\xbf\\xa3\\xa7\\x19\\xa1\\xdb\\x25\\xe8\\x3b\\x1c\\x13\\x98\\xa8\\x61\\x2a\\x23\\xf8\\xd9\\x96\\x90\\xc0\\x13\\xa3\\x78\\xf6\\x16\\x8a\\x5e\\x7e\\x05\\xfd\\xee\\xf5\\x98\\x41\\x04\\x24\\x95\\x16\\x7f\\x13\\x26\\x66\\x4b\\x74\\xaa\\xa1\\x6d\\xc8\\x7b\\xb3\\xac\\x6d\\xf4\\x68\\xdb\\xe9\\xe3\\x0f\\x87\\xe1\\xd0\\xea\\x0f\\x0b\\x95\\x3e\\x65\\x61\\x5a\\x6e\\x7b\\xf3\\xcc\\xa7\\x1f\\x66\\xb4\\x90\\x42\\x46\\xfd\\x96\\xf1\\x84\\x2b\\x21\\x66\\xd1\\x42\\xfd\\xd0\\x92\\x61\\x16\\x75\\x4a\\x85\\x59\\xf4\\x12\\x89\\x30\\x8b\\x4e\\xa4\\x34\\xea\\x70\\xdd\\x94\\x4e\\x93\\xea\\x0a\\xc1\\xc0\\xe5\\xe4\\x44\\xc6\\x1f\\x31\\x8e\\x5e\\x5f\\x57\\xdc\\xde\\x56\\xce\\x9f\\x93\\x6d\\xf6\\x19\\x5c\\xa7\\xf4\\x7f\\x30\\xc9\\x3d\\x4b\\xd3\\xec\\xe1\\xc5\\x39\\xee\\xb1\\xf6\\x87\\x88\\xa7\\x4f\\x65\\xb5\\x7f\\x61\\x0a\\xfb\\x8f\\x25\\xc5\\xd9\\x54\\x0b\\x4a\\xf5\\x8e\\x2b\\x73\\x80\\x11\\x5a\\x2b\\xec\\xe6\\x61\\xdd\\xf2\\xf8\\x5a\\xe9\\xa9\\x55\\x78\\x25\\x67\\x7b\\x5e\\xde\\xfc\\x3f\\xb2\\x7a\\x0b\\x17\\xd5\\xb7\\x45\\xb1\\xef\\x74\\x93\\xb2\\xe2\\x32\\x42\\xb7\\x8e\\x57\\xe9\\x6d\\xbe\\xcf\\xec\\x10\\x8b\\xfb\\x2c\\xcf\\xb5\\x85\\x83\\xc5\\x29\\xd8\\x9f\\xf4\\x7b\\x28\\x8c\\x9f\\xbe\\x7e\\xfb\\xf5\\xbb\\xd0\\x83\\x8f\\x0c\\xe0\\xff\\x49\\x5d\\xec\\xe5\\x2f\\x69\\x14\\xe1\\x78\\x8e\\x4a\\x29\\xc4\\x8c\\xe2\\x1a\\x06\\x48\\x09\\xb6\\x04\\x8f\\x8d\\x34\\xff\\x0d\\x13\\x03\\x7b\\x6f\\x6c\\xe6\\x4f\\xf1\\x62\\xb6\\x16\\x0a\\x2d\\x51\\x36\\x6e\\x1b\\xc5\\xcb\\x89\\x5b\\x5c\\xcc\\x18\\x98\\x31\\x69\\x89\\x61\\xaf\\x9a\\x36\\x55\\x78\\xad\\xde\\x83\\x93\\x9e\\xb6\\xf6\\xe8\\xaa\\x2b\\xfb\\x5b\\x0e\\x7d\\x3e\\x36\\xeb\\xfd\\x3a\\x4c\\xc1\\xb2\\x72\\x34\\xd2\\x86\\xc2\\xa2\\xc2\\xe6\\x75\\xc8\\x26\\x89\\x55\\x2a\\x0d\\xd2\\xd1\\xca\\xc7\\xee\\x9e\\x66\\xe1\\x76\\xc9\\x03\\xe8\\x85\\x5e\\x85\\xdb\\xe5\\x26\\x88\\x16\\xee\\x27\\x47\\x23\\xfe\\x3a\\x54\\x76\\x80\\x58\\x96\\x8c\\x46\\xd9\\xf8\\xea\\x52\\x7c\\xc4\\x7c\\xa3\\x6d\\xb6\\x64\\x43\\x80\\xab\\x27\\x6f\\x41\\x88\\xc3\\x64\\xda\\x2f\\x4e\\x64\\xa3\\x91\\x70\\xe2\\xdc\\x52\\x78\\xf8\\x17\\xb6\\x38\\xb9\\x63\\x43\\xa3\\x9e\\x0d\\x5d\\xf4\\x8d\\x42\\xda\\x74\\xb0\\x8e\\x08\\x1d\\x9d\\xc7\\xc7\\x9e\\xae\\xe5\\xfb\\xf1\\xdc\\xd9\\xa5\\xf3\\xae\\x18\\x20\\x6d\\xf3\\x2f\\xb3\\x86\\x7a\\x0a\\xae\\xec\\xc5\\x21\\xb8\\x4d\\xcc\\x99\\x93\\x02\\x0a\\x40\\xa3\\x02\\x0c\\xd2\\x30\\x91\\x06\\x5d\\x74\\x13\\x6a\\x09\\x9c\\x7d\\x69\\xe8\\x8e\\x9a\\x32\\x62\\xfd\\x86\\x2c\\x14\\xf6\\xd5\\x26\\x77\\xc9\\x68\\xe4\\xa7\\x21\\x0f\\x13\\x42\\x3b\\x44\\xf5\\x1c\\x8c\\xce\\x60\\x00\\x0d\\x2b\\xff\\xce\\xea\\x29\\x74\\xa6\\xc6\\xd9\\x6c\\x21\\xc1\\x5d\\x8b\\x67\\xc4\\xb1\\xf7\\x37\\x34\\xa2\\x9c\\xa6\\xc6\\x60\\x52\\x1e\\x81\\x61\\xb8\\x25\\x4f\\x08\\xd7\\xe6\\x60\\x35\\xc3\\xf5\\x80\\x51\\x35\\x58\\xc9\\x7a\\xda\\x28\\x59\\x42\\xdb\\xd8\\xdf\\x2e\\xbd\\x89\\x37\\xde\\x06\\x9e\\x47\\xe8\\x95\\x26\\xf7\\xb3\\xb1\\x37\\x35\\xf7\\x51\\xbf\\x99\\xe6\\x15\\xa1\\x57\\x27\\x23\\x93\\x3b\\x08\\x77\\x6b\\x63\\x5b\\xcb\\xb9\\x60\\xa9\\x26\\x6b\\x9f\\x3a\\x9f\\x04\\x6d\\x7f\\xfe\\x67\\xce\\x50\\x66\\xec\\x55\\x33\\xcd\\x4b\\xc9\\xa9\\x52\\x4f\\x0e\\xc3\\x23\\xce\\xe4\\x8e\\x8e\\x97\\x43\\xe7\\xd9\\x02\\xfb\\xad\\xcd\\x24\\x9a\\xa4\\x82\\xb2\\xb7\\xe9\\x24\\xe8\\x63\\x61\\x7e\\x2a\\x5a\\x09\\x6f\\xae\\x0e\\x6a\\x09\\x5f\\x3c\\x4f\\x2f\\x61\\x6f\\xfd\\xe2\\x81\\x13\\x82\\x00\\x9c\\xd7\\xb3\\xf9\\x06\\x4d\\xa2\\x02\\xa2\\x4d\\xb6\\x43\\xf5\\xe3\\x70\\x78\\x3a\\x52\\x89\\x2f\\x65\\xd1\\x17\\xb0\\x4a\\x10\\xe3\\x54\\x5a\\xd6\\xe3\\xba\\x35\\x2a\\x90\\x46\\xb3\\x77\\xc5\\xde\\x6e\\x53\\x17\\x7b\\xfb\\x95\\xa6\\xf3\\xc4\\x55\\xe6\\x88\\x21\\x0c\\x41\\xb5\\xe5\\x0f\\xef\\x8a\\x9f\\x36\\x91\\xcf\\x95\\xaa\\xed\\xfc\\x6f\\x1f\\x2d\\xfd\\x15\\x9b\\xa4\\xbf\\x26\\x6b\\xd2\\xfe\\xf1\\xf1\\x79\\xb6\\xe0\\xa1\\x09\\x46\\xc2\\xcc\\x5a\\x71\\xca\\x68\\x4d\\x33\\xb3\\xd6\\x63\\x36\\xae\\xc7\\xf5\\x38\\x1b\\x67\\x47\\x3c\\x1a\\xb5\\xd3\\xfb\\xd3\\xc5\\x91\\xf4\\xfd\\xfe\\xf8\\x3c\\x9b\\xf2\\x07\\x1e\\x5b\\x32\\xe5\\x7a\\xf9\\x54\\x06\\x26\\xcc\\xcf\\x6a\\xbe\\xa6\\xf3\\xcf\\x08\\xdd\\xd8\\x65\\x17\\x58\\x16\\xd9\\x65\\xaf\\xa0\\x0c\\xcd\\x31\\x2d\\x1d\\xcb\\x8e\\xdd\\xec\\x71\\xc8\\x7a\\xc0\\x88\\xd2\\xb2\\xdc\\xd7\\xb8\\x8d\\x53\\x46\\x68\\x6d\\xa9\\x66\\xb2\\xea\\x4d\\xfe\\x79\\x59\\xb2\\x47\\x78\\x65\\xa0\\x0a\\x62\\xc1\\xff\\x90\\xfa\\x9c\\x5c\\x4e\\xe6\\xe8\\x2c\\xf3\\x97\\xb7\\xa1\\xbd\\x34\\xb8\\xbe\\xb5\\x89\\xb2\\xf3\\x9b\\xd8\\x8a\\xb7\\x52\\xdc\\xe6\\x7b\\x1f\\x79\\x63\\x3e\\xf6\\x04\\xdf\\xb9\\x67\\x65\\x9d\\xc5\\x3b\\x5e\\x4d\\xae\\xaa\\x49\\xcc\\xf2\\x3b\\x56\\x4d\\xf8\\xce\\x93\\x9c\\xba\\xe8\\xf7\\x09\\x4b\\x83\\x27\\xbe\\x0b\\x6a\\x7a\\x1f\\xd4\\x0e\\xff\\xb7\\xd5\\xcf\\x28\\xfa\\x3d\\x52\\xdd\\x63\\xf0\\x84\\xbe\\xd7\\xc1\\xd3\\x1d\\xdb\\xdd\\xf2\\xe0\\xd3\\xd9\\x8c\\x26\\x5c\\xb0\\x35\\x8f\\xc1\\x13\\x1a\\x3e\\x05\\xc3\\x19\\x85\\x97\\xef\\x59\\xc9\\x59\\xf0\\xc7\\x19\\x44\\x9f\\x28\\x76\\x85\\x6e\\xe4\\x7d\\x94\\xa6\\xa9\\x77\\xa4\\xd5\\x96\\xed\\x79\\x20\\x19\\xf7\\x38\\x2b\\xe3\\x1d\\xf7\\x68\\x55\\x97\\xc5\\x35\\x0f\\xa4\\xbd\\xec\\x4c\\xb6\\x14\\x4d\\x66\\xb3\\xd9\\xcc\\x3b\\xd2\\x7d\\xb1\\x7b\\xdc\\x14\\x79\\xf0\\x94\\x47\\xef\\xab\\x2c\\xe1\\x55\\xf0\\x87\\x23\\xcd\\x6e\\xd8\\x86\\x07\\x4f\\x55\\x19\\x07\\x9e\\x47\\xb1\\xed\\x7c\\x36\\x53\\xd6\\xb5\\x73\\x18\\x44\\xb1\\x67\\x31\\x0c\\x14\\x87\\x31\\xa7\\x68\\xa8\\x17\\x0c\\xe7\\x94\\xe5\\xd9\\x8d\\x99\\xc0\\x9c\\x56\\x7b\\xce\\x93\\xe0\\x42\\x35\\x79\\x7f\\x93\\xe5\\xc1\\x8c\\x56\\x8f\\x79\\x1c\\x40\\x6a\\x85\\x2a\\xfb\\x3b\\x57\\xfd\\x5c\\xcc\\x9e\\xef\\x68\\x06\\x2d\\x5a\\xdd\\xec\\xb2\\x9c\\xbf\\xdf\\x65\\xf9\\x35\\x4f\\xec\\xe5\\x4b\\x32\\xb4\\x64\\x86\\x29\\x98\\x05\\x48\\x3d\\x3d\\x85\\xb9\\x9a\\xe3\\x91\\x0a\\x94\\x6b\\x37\\x56\\x43\\x37\\x99\\x8f\\xbd\\xbc\\xc8\\xb9\\x67\\x0d\\xb2\\xaa\\x4b\\x06\\xeb\\x32\\x9c\\xd3\\xe2\\xb6\\x7e\\x7f\\x53\\x24\\x3c\\x40\\x27\\xd4\\xa8\\xb8\\x15\\x1f\\x16\\x33\\xa9\\xeb\\x92\\xc5\\xb5\\x3d\\x99\\xb2\\x10\\xf7\\xdd\\x2f\\xc1\\x2b\\xfe\\x4a\\xfe\\xfe\\xab\\xf8\\x7d\\x3c\\x52\\x26\\x40\\x3a\\x58\\xad\\x8f\\x14\\x32\\xc8\\x02\\xdf\\x0d\\x4b\\x9d\\xf0\\x9a\\xc7\\xf5\\x7b\\x31\\x0a\\x84\\x39\\x8f\\xc2\\x35\\x54\\x05\\x4f\\x45\\x8e\\x71\\x35\\xac\\xb1\\xe3\\x40\\x36\\x25\\x8b\\xbc\\x23\\x2d\\x72\\x0c\\xc0\\xd1\\x7a\\xbf\\xbf\\xad\\xb6\\xde\\x91\\x62\\x8c\\x4d\\x08\\x0d\\x2e\\xca\\xab\\xe0\\x49\\x34\\x0c\\x9e\\x9c\\xd5\\x73\\x56\\x58\\xaf\\xde\\xf1\\x48\\xa3\\xdb\\x48\\x74\\x6a\\x6a\\x5f\\xcc\\x70\\x93\\x82\\x3f\\xce\\x68\\x72\\x5b\\x62\\xb8\\x98\\xe9\\xa7\\xe2\\x3b\\xfb\\xdb\\x5d\\xd5\\xac\\xea\\x54\\x11\\x23\\x0a\\x9e\\xf4\\x29\\x79\\x9f\\x47\\x01\\x34\\xc4\\xbd\\x71\\xca\\x2f\\x8e\\x62\\xb8\\xb7\\xa2\\xbf\\xa3\\xa8\\x52\\x67\\x39\\x7b\\x8f\\xab\\x04\\x11\\x46\\xf2\\xe0\\x49\\x2d\\x61\\xf0\\xa4\\x67\\x76\\xa4\\x77\\x3c\\x4f\\x8a\\xb2\\x82\\x56\\xf5\\xcd\\x5e\\xfc\\x95\\xd4\\x82\\x3a\\xd5\\x0b\\x36\\x1a\\xfd\\x00\\xa4\\xd1\\x34\\xe1\\x7c\\xff\\x35\\x32\\x8a\\x99\\xc0\\x40\\xd9\\xb4\\xbe\\xd9\\x4f\\x8b\\xe8\\x2a\\x7c\\x02\\x38\\x44\\xc0\\xcd\\x0c\\xa6\\x98\\x42\\xb8\\x52\\x28\\x46\\x48\\x15\\x70\\xfc\\x1e\\x41\\xa9\\x55\\x4d\\xbc\\x9b\\xc2\\x3b\\x00\\xbe\\x8e\\x6a\\xa2\\x58\\xd6\\xb0\\x36\\xe0\\xbd\\x5e\\x40\\xbb\\xae\\x55\\x61\\xaa\\x2a\\x38\\xad\\x10\\xd2\\xfb\\x9a\\xdc\\xa3\\x4f\\x65\\x91\\xf0\\xf7\\x62\\xfb\\xed\\x6f\\x38\\xa0\\x38\\x85\\x95\\x9c\\x8a\\x3a\\xe6\\x33\\xd0\\x0c\\x21\\xe1\\xb9\\x86\\x58\\xab\\xbb\\x29\\x80\\xcd\\xc9\\x66\\xa2\\x06\\x36\\x91\\xd0\\xf4\\xdc\\xe7\\x64\\x35\\xfd\\xbd\\x23\\xcd\\x04\\xe5\\x81\\xf0\\xf2\\xc6\\x89\\xdf\\x43\\x9e\\xb2\\xa9\\x03\\x47\\xa3\\x91\\x8a\\xfc\\xc2\\xef\\xb2\\x98\\xff\\x98\\x3d\\xf0\\xdd\\x4f\\x02\\x58\\x2f\\xe7\\x4b\\x3f\\x9b\\xe2\\x39\\x9c\\xee\\x1f\\x00\\x80\\xc3\\x9e\\xba\\x12\\x66\\xb0\\xe3\\x70\\x38\\x23\\x41\\xbb\\xe9\\xbc\\x51\\x69\\x2e\\x20\\x4d\\xd6\\xb9\\x0f\\xf5\\x4f\\xbe\\xb3\\xaf\\x97\\xb3\\x66\\x37\\xa6\\xcd\\xb6\\xa3\\x0d\\x5e\\x41\\x5d\\x8d\\xba\\x80\\x37\\xd4\\x90\\x3e\\x35\\x80\\xfe\\x82\\xc6\\x06\\xa4\\x9b\\x3d\\x98\\x83\\x70\\xba\\x1b\\x03\\xf2\\x56\\x0f\\xe6\\x78\\x9c\\x6e\\xdc\\x75\\x06\\xac\\x6e\\xba\\xce\\x50\\x57\\x87\\xcf\\x02\\xbc\\x33\\xb4\\xe6\\x89\\x79\\x69\\x8f\\x8d\\x93\\xd0\\xec\\xb3\\x71\\x9c\\x5e\\x3e\\x71\\x38\\xc9\\x3d\\xb3\\xbe\\xef\\x83\\x9c\\x67\\xce\\x5c\\xcf\\xe0\\xc4\\xab\\x97\\xf6\\xd6\\x3c\\x89\\xcd\\x2e\\x9b\\x07\\xba\\xd5\\xaf\\x3c\\xba\\x58\\xd8\\x3e\\xba\\xb2\\x72\\x5c\\x3f\\x38\\xd0\\xaf\\xac\\xd9\\x1e\\x6a\\xdf\\xbb\\x48\\x3c\\xe2\\xf4\\xf2\\xb6\\x11\\xca\\xda\\x6e\\xa8\\x96\\x51\\x9d\\x43\\x6a\\xbf\\x44\\x7a\\xc8\\xbc\\xdd\\xd2\\x6c\\x34\\x6a\\xce\\x1b\\x2f\\x68\\x19\\x31\\x5b\\x23\\x13\\x96\\x24\\x28\\x85\\xc8\\xaa\\x9a\\xe7\\xbc\\x54\\x41\\xae\\x1d\\x66\\xe7\\xf9\\xe3\\xff\\x92\\xd3\\xee\\xa0\\x95\\xd1\\xc8\\x20\\x9e\\xfb\\xb3\\xf0\\x04\\xf6\\x68\\xbf\\x24\\xf4\\x1f\\x59\\x99\\xe6\\xe9\\x46\\x3a\\xe4\\x70\\xf0\\x61\\x27\\xf4\\xcb\\xaf\\x6f\\xf6\\xf5\\xa3\\x4f\\xa8\\x5b\\xfa\\x25\\xc4\\xc0\\x6c\\x15\\x7f\\x55\\xb2\\x7b\\x55\\x28\\xaf\\xf4\\xa9\\x24\\xa0\\x3f\\xbf\\xad\\x8b\\x1f\\x55\\x3d\\x9f\\xbc\\xa8\\xd2\\xd1\\x85\\x8b\\x1f\\x59\\x96\\xf7\\x82\\xd7\\x34\\xcd\\x76\\x3b\\xf0\\xca\\x9b\\xd1\\x19\\xed\\x5a\\x86\\xad\\xdb\\xdb\\x97\\x4d\\x15\\xbf\\xd3\\x1b\\x18\\x00\\xbc\\xac\\x3b\\x35\\xfb\\xd0\\x65\\xf5\\x8c\\xb0\\xa9\\x64\\x49\\x76\\x5b\\x85\\x7e\\x0b\\x2f\\x23\\xcd\\xba\\x74\\xdc\\x6a\\x82\\x39\\x39\\xeb\\x21\\x5d\\xba\\xf1\\x3a\\xee\\x9b\\xf2\\x9b\\x01\\xac\\x5e\\xd5\\xac\\xbe\\xad\\x74\\xda\\x85\\xbb\\x2a\\x3c\\x71\\x25\\x9c\\x0b\\x42\\xb2\\xe7\\xfd\\x63\\x1e\\xab\\xc4\\x2d\\x77\\x32\\x08\\xde\\x5d\\xd5\\x70\\x03\\x92\\x92\\xed\\x87\\xb0\\x5e\\xd6\\xd3\\x87\\xc0\\x79\\x79\\x66\\x2d\\x1c\\xd4\\x7a\\x84\\x5a\\x8f\\x7d\\xb5\\xa4\\x94\\xe6\\xe1\\xd2\\xb4\\x9b\\x5c\\x9c\\x59\\x8b\\xb8\\x54\\xdf\\x82\\x3f\\x13\\xeb\\x0d\\xc6\\xf4\\x78\\x78\\xed\\x54\\x57\\xab\\xa2\\x1a\\x8c\\xad\\x77\\x72\\xdc\\x8f\\xe6\\x5b\\xdb\\xae\\x6f\\x3d\\x62\\xd3\\xc7\\xf6\\xb7\\x1e\\xbb\\xbf\\xa5\\x1a\\xb8\\xdf\\x6a\\x1d\\x37\\x64\\x45\\x04\\x7a\\xb2\\x8e\\x01\\xc8\\x2d\\x7f\\xb8\\xe3\\xe5\\x8e\\xed\\x65\\xe4\\x3f\\x39\\x4c\\xe0\\x93\\xc2\\xa7\\x63\\x3b\\x39\\x95\\x84\\x0e\\x02\\x2a\\x70\\xf8\\x69\\xfb\\x8a\\x02\\x37\\x8e\\xcc\\x75\\x15\\xca\\xf7\\x2b\\x58\\xfd\\x74\\x57\\x14\\xa5\\xdf\\xdc\\x08\\x33\\x4a\\xf8\\x22\\x36\\x50\\x2a\\xc1\\xf5\\xc2\\x8c\\x65\\x5a\\x6e\\xa2\\x50\\xcb\\x47\\x2a\\x19\\x27\\x1b\\x2d\\x94\\x86\\xea\\x4b\\xd3\\x72\\x34\\x6a\\x16\\x6d\\xda\\x45\\x91\\x5a\\x3b\\xd3\\xf3\\x53\\x19\\xe8\\x3e\\xe8\\x46\\xff\\xde\\xd0\\x48\\xff\\x8e\\x8e\\x84\\x36\\x7b\\xda\\xb6\\x3b\\xaf\\xda\\x45\\x3b\\xf7\\x7b\\xdb\\x6a\\x17\\x3e\\x6d\\x75\\xbf\\x5b\\x5a\\xe9\\xdf\\x15\\xdd\\xe9\\xdf\\xbb\\x23\\x46\\xec\\xf3\\x70\\xb9\\xbc\\x50\\xf5\\xb7\\x6c\\x8f\\xdd\\x5a\\xe1\\x8b\\x3f\\x34\\x1d\\xe7\\xc6\\x33\\xba\\x79\\xb6\\x46\\xf4\\x5c\\x8d\\x63\\xd0\\x52\\xb6\\xc9\\xf1\\x38\\xb3\\x93\\x69\\x77\\xbb\\x36\\xcd\\x2a\\x47\\x10\\x52\\x71\\x9f\\x91\\x91\\x74\\x11\\x96\\x2c\\x7c\\x11\\xce\\x52\\x75\\xdb\\x68\\x4b\\xbd\\xe9\\xc0\\x5c\\x4a\\x18\\xd1\\x44\\x5e\\x45\\xd8\\xdb\\x41\\x37\\xfe\\x72\\xab\\xd8\\x28\\x4c\\x46\\x9e\\xb9\\x2b\\x9a\\x28\\x6c\\x81\\xb1\\x69\\x9e\\x8e\\x8b\\xea\\x3e\\xab\\xe3\\xad\\xdf\\x3a\\xae\\x5a\\xde\\x40\\x9e\\x62\\x56\\x71\\xa9\\xd5\\x09\\x9f\\x1e\\x82\\x19\\x7d\\x0c\\x26\\xf3\\xe3\\x22\\x2a\\x39\\xbb\\x5e\\xa8\\x97\\x32\\xf4\\x34\\x56\\x99\\xfe\\x41\\xd4\\x99\\xfe\\xc1\\xa9\\x64\\x57\\x98\\x8b\\xf7\\x33\\xe7\\xb5\\x74\\x0d\\x6f\\x75\\xd3\\xe8\\x45\\xa9\\xaf\\xf4\\x50\\xe6\\x5d\\xbd\\x60\\xb8\\x0a\\xa8\\x33\\x81\\x5e\\xdc\\x5a\\xf6\\x6b\\x31\\x94\\x59\\x6b\\x36\\xad\\x0e\\xac\\xd9\\x24\\x28\\x81\\x37\\x43\\x98\\x1d\\x8f\\x6d\\xde\\x41\\x0a\\x65\\x96\\x72\\x2b\\x1e\\xc2\\x7c\\xfa\\x20\\x77\\xf8\\x31\\xcc\\xa7\\x8f\\x6d\\x0c\\x89\\xdb\\xa3\\xc0\\xe3\\x4e\\xe2\\xf0\\xbb\\x07\\x77\\xf3\\x74\\x1f\\xf2\\x6f\\x73\\x6b\\x03\\xfb\\x83\\x63\\xe7\\xa5\\x98\\x89\\x35\\x82\\xd6\\x4b\\xd5\\xf7\\xc3\\xfb\\x4c\\x7d\\x5b\\xd5\\xd7\\x25\\x8f\\x00\\x3a\\xa5\\x7b\\xc1\\x6e\\xd9\\x1e\\xc3\\x54\\x80\\x7e\\xb2\\x89\\xb0\\x4b\\xa0\\x0c\\xca\\x1e\\x2c\\x1d\\x87\\x65\\x3f\\x7e\\x2e\\x1b\\x98\\x18\\xbe\\x14\\xc6\\x47\\x44\\xbe\\x56\\x51\\x09\\x5f\\x06\\xb9\\xa1\\x52\\x8c\\xc2\\x0b\\xfc\\x46\\xd1\\x1e\\x2e\\xf6\\x97\\xdd\\x6c\\x42\\x10\\x33\\x16\\x53\\x68\\x3b\\xad\\xca\\x98\\x02\\xad\\xa9\\x4b\\xd0\\xfb\\x5d\\x3d\\x6d\\xa5\\x08\\x55\\xb5\\x9e\\x42\\x65\\x9d\\xec\\x4d\\x15\\x84\\x73\\x42\\xbd\\xea\\x4e\\xa0\\x2a\\x24\\x7e\\xb3\\x9b\\xcd\\x7b\\x4c\\xed\\xac\\x70\\x33\\x96\\x57\\xc5\\x6d\\x19\\xf3\\xf7\\xd5\\xdd\\x06\\x08\\x63\\xfb\\x6a\\x04\\x8a\\xf3\\xed\\xdd\\xe6\\xcd\\x8d\\x4c\\x58\\x2c\\xe9\\xe8\\xfd\\x6d\\xb5\\x85\\x08\\xf3\\xe6\\x9b\\x98\\xe2\\x4f\\x70\\xec\\xe4\\xd8\\x20\\xd2\\x6c\\x6f\\xcb\\x92\\x39\\xb6\\x76\\x5a\\x8a\\xcd\\x9b\\xc4\\xa0\\xa8\\xf9\\x46\\xcc\\xd7\\x2f\\x29\\x13\\x64\\x07\\x65\\x82\\x20\\xa0\\x17\\x67\\xf0\\xef\\x9c\\x99\\x99\\xa2\\x95\\x83\\xf4\\xd8\\xcc\\x52\\x5f\\x4d\\x8f\\x49\\x4a\\x40\\xf2\\x68\\x04\\xa5\\xdd\\x8d\\x52\\x0c\\x08\\xeb\\xbe\\x72\\x3b\\x51\\x48\\xd2\\xea\\xa5\\x6a\\x15\\x9b\\x6e\\xac\\x77\\xa2\\x1f\\x66\\x6e\\x01\\x82\\x18\\xcf\\x2b\\x37\\x11\\xf3\\xbd\\xb1\\xf5\\x66\\x5a\\x8e\\x3d\\xea\\x96\\x6c\\x5a\\x25\\x11\\x94\\x54\\x63\\x8f\\x78\\xe6\\x6b\\x79\\xe8\\x6d\\xab\\x9d\\xdd\\xdd\\xb6\\xda\\x4d\\xb7\\x4e\\x63\\x51\\x52\\x8d\\xbd\\x7f\\x6e\\x14\\xed\\xb0\\x08\\x3b\\xd4\\x38\\xb8\\x41\\xdd\\xbf\\xad\\x1f\\x77\\x3c\\xcc\\xa9\\xf3\\x22\\xe2\\x9b\\x2c\\xff\\x91\\xd5\\xe8\\xa5\\x2a\\x81\\x1c\\xf0\\x96\\x94\\xb9\\x07\\x4e\\x75\\x56\\xc6\\x3e\\x9b\\x3e\\x88\\x0d\\xa4\\x35\\x9d\\xd1\\x0b\\xc4\\x17\\x3f\\xbe\\xa1\\xc3\\x39\\xb1\\xb1\\x1e\\x4f\\x36\\xcd\\xb6\\xe2\\x06\\xf0\\x3b\\xf6\\xdf\\x69\\x57\\x97\\x19\\xcb\\x37\\xf8\\x5d\\x9b\\xc1\\x29\\xd9\\xfd\\x5b\\x31\\x38\\x67\\x5a\\x06\\x9a\\xc6\\xf5\\xf9\\x7c\\xfa\\xd9\\x67\\xd0\\xe5\\x2b\\x7a\\xe1\\x74\\x29\\x75\\x02\\x1f\\xd0\\xe3\\xb9\\xdf\\xc6\\x47\\xb2\\x97\\xa9\\x52\\x2c\\x9c\\xbf\\x12\\x18\\x0e\\x26\\x72\\x3e\\xfd\\x97\\xcf\\xe8\\xc5\\xf4\\xb3\\xcf\\xce\\x5e\\xd8\\xd2\\xa5\\x67\\xbb\\x6b\\x51\\x77\\x3d\\xab\\x9a\\x95\\x2f\\x9f\\xc1\\xc5\\x0b\\x47\\xf2\\xa9\\x9a\\xc1\\x7c\\xfa\\x87\\x0b\\xb1\\x78\\x67\\x62\\x1a\\xff\\x85\\x93\\x70\\x77\\x02\\x11\\x6a\\x20\\x70\\x6b\\x17\\x36\\x23\\x78\\x17\\x20\\x3a\\x28\\xa2\\x2b\\x73\\x34\\x4a\\xab\\xa6\\x78\\x51\\xa2\\x49\\x5f\\x83\\xe5\\x2c\\x2a\\x2e\\x21\\xb9\\x3d\\x32\\xd4\\x1c\\x21\\xfa\\xbd\\x9c\\xd9\\x62\\x03\\xd1\\x16\\xdf\\xe2\\x01\\xe9\\x6d\\x0b\\xc7\\xcd\\x3d\\x3d\\xbb\\x2c\\xe7\\xff\\x21\\x05\\x07\\xa7\\xbe\\x48\\x3b\\xbe\\x86\\x4c\\x7c\\xe3\\x8c\\xfa\\x4d\\xae\\x58\\x8a\\x0a\\xba\\x42\\xb7\\xf2\\x70\\xb6\\xe0\\xaf\\xed\\x0f\\xa3\\xfa\\x0d\\xe9\\xc6\\x05\\x1f\\x8f\\x89\\xfd\\x12\\xb4\\x30\\xe8\\xa9\\x92\\xf3\\xfb\\x81\\xf3\\x15\\xbf\\xc5\\xb9\\x74\\x92\\x84\\x92\\xcc\\x6d\\x0e\\xb1\\x9d\\xc3\\xa7\\x7f\\x88\\x38\\x0a\\xe9\\xa8\\x21\\x86\\x28\\x15\\xc3\\xad\\x3a\\x2b\\xbe\\xc6\\xc4\\xd8\\x9d\\x72\\x16\\xa5\\xef\\xec\\x16\\xb2\\x9e\\x5f\\x2c\\xd8\\xf4\\x61\\x1c\\x32\\x41\\xee\\x20\\x7e\\x10\\xbf\\x1f\\xcf\\xea\\x63\\xa3\\xcb\\x6e\\x82\\x7a\\x1e\\x5a\\x97\\x02\\x12\\xd4\\x4b\\x5f\\x97\\x5c\\x76\\x52\\xd4\\x8a\\x75\\x68\\x36\\x04\\xc1\\xb7\\x2e\\x84\\x71\\x14\\x24\\x30\\xd5\\x5e\\xf7\\xd3\\xe7\\x96\\x7e\\xb1\\xb3\\xe3\\x99\\xd5\\xf1\\x04\\x3b\\x36\\x05\\xaf\\x67\\x76\\x9b\\x70\\x46\\xc8\\x73\\x02\\x10\\x98\\xb5\\x25\\x00\\x11\\x53\\xc6\\x4b\\xf4\\xb2\\x2d\\x00\\x31\\xd3\\x75\\x45\\x26\\xe0\\x33\\x0c\\x8d\\x60\\xaa\\x15\\x4c\\x15\\x0b\\x5e\\xf7\\x89\\x51\\xa4\\xf2\\xb3\\xdd\\xdb\\xcc\\xf4\\x36\\xc1\\xde\\xf4\\xb3\\x9c\\x9e\\x94\\x0d\\x89\\xd9\\x79\\x28\\x12\\x00\\xac\\xd2\\x00\\x0a\\xa5\\xc6\\x94\\x17\\xfe\\xd3\\xc3\\x7b\\x08\\xe8\\xa3\\x9a\\xd3\\x87\\xf7\\xc0\\x27\\x04\\x96\\xb8\\xe5\\xf1\\x7d\\x5d\\xec\\x4d\\x8d\\xc7\\xf7\\xc8\\x0a\\x98\\x2a\\xdb\\xa3\\x4d\\x27\\xa8\\x2e\\x27\\x27\\xfa\\x1c\\x5b\\xbd\\x89\\xce\\x27\\xa7\\x7a\\xd7\\x95\\x35\\x4f\\x25\\xf0\\xba\\xde\\x10\\xd3\\xab\\xd8\\xa5\\x87\\xb0\\x9a\\xe2\\x00\\x04\\xac\\x87\\x7d\\xd2\\x21\\x12\\x88\\x53\\xd1\\x58\\x41\\x6c\\x0b\\x63\\x3d\\xdd\\x18\\x6e\\x8a\\xf6\\x00\\xb6\\x62\\x00\\x8f\\x61\\x35\\x85\\x49\\x89\\xdb\\xa7\\xaf\\x8b\\x7b\\xf1\\xfd\\xc7\\xe6\\xf7\\xb1\\xa9\\x34\\xfc\\x3a\\xd9\\xba\\xcd\\xe2\\xe8\\x7d\\x7d\\x92\\xdc\\x1a\\x00\\x80\\x33\\x4b\\x7b\\xa5\\x04\\x3a\\x08\\x27\\xe2\\xff\\xc0\\x5e\\x4c\\x39\\x10\\xf5\\x0e\\x26\\xda\\xd1\\x7e\\x2b\\xda\\x3f\\x42\\x9d\\xc7\\xc0\\x5e\\x0b\\xd5\\x5e\\xbe\\x23\\x80\\x63\\xb4\\x25\\x07\\x2a\\xac\\x5b\\xea\\x03\\x29\\x46\\x97\\x6a\\x6e\\x50\\x16\\x10\\x29\\xcd\\x32\\xaa\\x19\\x25\\xcb\\xf5\\x19\\xa1\\x76\\x97\\x48\\xa7\\xbe\\xac\\xd3\\xc3\\xe1\\x43\\x1a\\xa2\\x01\\x2f\\x34\\x74\\x87\\x83\\x2d\\xfb\\x06\\x24\\xd5\\x1c\\xbf\\x63\\x44\\xcf\\xb7\\xec\\x1d\\x92\\x6c\\x6a\\x8f\\xa9\\x4f\\x7b\\xa4\\x84\\xf3\\x2d\\x08\\x92\\x76\\x0c\\xea\\x56\\x51\\xf7\\x56\\x1e\\xf2\\xf1\\x7c\\x91\\xf7\\xdf\\x5c\\xb9\\xba\\xb9\\xca\\x8e\\x9b\\x2b\\x5f\\x2f\\x4e\\x0f\\x44\\x4e\\x43\\x4d\\x58\\xd4\\xb8\\x36\\x72\\x7b\\x46\\xcb\\x0e\\x58\\x77\\x47\\xda\\xec\\x41\\xbe\\x7d\\xae\\x13\\x47\\x6a\\xaa\\x1b\\x63\\xa9\\xdb\\xf6\\xd8\\xe4\\xfc\\x40\\x39\\xf1\\x0f\\xc9\\xfb\\x3b\\xa9\\x06\\xdf\\xce\\x37\\xf2\\x0f\\x11\\x0b\\x0c\\x08\\x62\\xbf\\xc5\\xb2\\xa2\\x0a\\xc6\\x1d\\x79\\xa3\\x79\\x08\\xb6\\x29\\x4e\\xa3\\x9f\\xda\\xae\\xda\\x31\\xcb\\x63\\xbe\\xfb\\x89\\xff\\x76\\xcb\\xab\\xfa\\xf3\\x3c\\xbb\\xf9\\xa6\\x64\\x37\\x1c\\xd9\\x6c\\x90\\x3c\\xeb\\x32\\x42\\x4f\\xd5\\x15\\xc3\\xb4\\xaa\\x36\\x39\\xf7\\x10\\xd9\\x55\\xea\\x50\\xbc\\x6e\\x61\\x5c\\xdc\\xe6\\x35\\xd4\\x9d\\x75\\xcd\\x55\\xa9\\x90\\x2c\\x45\\x4d\\x53\\xab\\x24\\xd8\\x89\\x5a\\x13\\x9b\\xdd\\x80\\xd8\\x69\\x60\\xc6\\x01\\x71\\x3e\\xd0\\x2a\\xe4\\x80\\x02\\x1f\\x69\\x8e\\x18\\xbb\\xfa\\xad\\xac\\xfd\\xfa\\xac\\x1e\\x57\\x67\\x15\\x9a\\xa2\\xbb\\xf7\\x7d\\x97\\x16\\xbb\\xeb\\x08\\xd9\\xf5\\x14\\x6d\\x93\\x9f\\xfb\\xf3\\xf3\\x67\\x2a\\x91\\xde\\x0a\\xea\\x6b\\x62\\x50\\xe5\\xe5\\x4c\\xc9\\x89\\xfa\\xaa\\x03\\xf9\\xfb\\xbe\\xdc\\x44\\xa2\\x80\\x2f\\x7a\\xf9\\x04\\xc5\\xfb\\xc7\\x92\\xe3\\x8f\\x25\\x9f\\x1f\\x4b\\xee\\xbe\\x14\\xcc\\xf8\\x4b\\xd8\\x85\\xb6\\xc1\\x4a\\x2f\\x87\\xee\\xbc\\x10\\x27\\xfa\\x5d\\xe1\\xf3\\xe9\\x03\\xe5\\xd3\\x47\\xd2\\xfe\\xd4\\xbb\\x42\\xf1\\xea\\xa4\\x9b\\x01\\xa1\\x7d\\x0c\\x94\\x3e\\xfd\\xbd\\x08\\xe6\\x7f\\x0e\\x38\\xea\\x73\\x7f\\xce\\x5f\\x9d\\xf5\\x22\\x44\\x69\\x77\\x46\\x68\\x1c\\x56\\x2f\\xaa\\xfa\\x57\\xb2\\xe0\\xd3\\xbb\\x87\\x49\\x58\\x52\\x3e\\xbd\\x7b\\x9c\\x80\\x81\\xef\\xdd\\xc3\\x38\\x2c\\xc5\\xdf\\xc7\\x71\\x18\\xb7\\x66\\xdf\\xc0\\x90\\x27\\x27\\x9f\\xe9\\xc9\\x57\\x8d\\xc9\\x67\\x67\\x19\\xa1\\x79\\xc8\\x15\\x81\\xac\\x65\\x54\\xf9\\x65\\x58\\x41\\x50\\x44\\x41\\x83\\x88\\xff\\x61\\x60\\xf0\\xf3\\x91\\x1a\\xca\\x84\\xda\\x44\\x06\\xb5\\x6e\\x42\\xc1\\xd4\\xf5\\x0d\\xce\\x91\\xf2\\x85\\xc3\\x99\\x46\\xb7\\xb5\\x40\\xb7\\x97\\xf5\\xa2\\xfe\\x6f\\xe2\\x13\\xe9\\xd3\\x43\\xc0\\x96\\x6c\\xba\\x2f\\xaa\\xf7\\x27\\xf4\\x9a\\x8f\\xba\\x52\\xbf\\x5a\\xf3\\x48\\x08\\xad\\xc3\\x90\\x4f\\xe6\\xc0\\xb8\\xf7\\x68\\xde\\x7b\\x74\\xe9\\xce\\xf4\\xe7\\xee\\xc2\\xa1\\x11\\x5e\\xd7\\xd2\\x75\\xdc\\x12\\x90\\xf9\\x2a\\xe6\\xfe\\x8c\\xf2\\x8e\\xab\\xf5\\xd4\\x28\\x9c\\x6f\\xba\\x94\\x94\\xf3\\x49\\x2d\\x42\\x65\\xe0\\xf2\\xea\\x8a\\x25\\x43\\x5d\\x40\\xb9\\x2b\\xf7\\xd4\\x10\\x65\\x2c\\x89\\x6b\\x9f\\xd1\\x9a\\x56\\x34\\xa7\\x31\\x88\\xcb\\xd9\\x30\\xac\\x09\\xf0\\xbe\\x62\\x39\\x94\\x15\\x8e\\xb4\\x52\\x7c\\xcf\\x73\\x4c\\xf1\\xa6\\x04\\xa5\\x95\\x92\\x73\\xe7\\x93\\xfd\\x99\\x9f\\x4f\\x98\\x40\\xae\\xa7\\xac\\x7d\\x64\\x47\\x74\\x17\\xb2\\x49\\xb1\\x48\\x42\\x36\\xde\\x51\\x0f\\xec\\x3f\\x20\\x30\\xba\\xdf\\x1c\\x70\\x42\\xa8\\x27\\x27\\xa3\\x6b\\x34\\x66\\x9b\\x90\\xa3\\xce\\xa2\\x5c\\x0a\\x6c\\xf1\\x02\\x6b\\xa3\\xc6\\x24\\xc4\\x1c\\xee\\xc2\\xca\\xf0\\x69\\x77\\x61\\x0e\\xf2\\xe0\\x61\\xc8\\x94\\x33\\xdf\\x07\\xce\\x70\\xf1\\x5f\\x34\\xab\\x53\\xdd\\xe0\\x04\\x9e\\xef\\x4b\\xd6\\x43\\x91\\xc6\\x49\\xb2\\x5b\\xd3\\x8c\\xbf\\x8f\\x85\\x30\\xfa\\xef\\x87\\x49\\x7b\\x95\\x6e\\x2b\\x8e\\x67\\x1c\\x50\\xdb\\xe3\\x89\\x1a\\x8f\\xb4\\xb4\\x30\\x62\\x75\\x56\\x8d\\xf3\\xb3\\x5c\\xe0\\xed\\xf9\\xa4\\x7c\\x66\\xf9\\xed\\x2b\\xfc\\x43\\x80\\x21\\xbe\\x0c\\x67\\xa3\\x11\\xa6\\x77\\x13\\xc7\\x14\\xa4\\x03\\x6e\\x63\\x14\\x36\\x40\\xed\\x67\\x2d\\xc6\\x86\\x3d\\x82\\x10\\xf2\\x92\\xc6\\x97\\x3d\\x6d\\xe5\\x59\\xd3\\xd7\\xc2\\xb3\\x1d\\x9d\\xc5\\x8b\\x02\\xe6\\xd5\\x02\\x9d\\xc2\\x8a\\xcf\\xbb\\xd3\\x3d\\x76\\x6c\\x49\\xd3\\xfa\\xd4\\x7c\\x7e\\xb2\\x83\\xee\\x67\\xcb\\x56\\xdf\\x41\\xb3\\x64\\xd6\\x05\\x7a\\x4e\\xdf\\x12\\x62\\x87\\xfd\\x12\\xb3\\x67\\x57\\x4e\\x09\\xdd\\xfa\\x7b\\x78\\xc2\\xa3\\xfd\\x92\\x5e\\xce\\xe2\\xc5\\xdd\\xa5\\x7e\\x1a\\x8d\\xee\\x9e\\x81\\x25\\x5d\\xb1\\xe3\\xf4\\x59\\x4b\\x7d\\x67\\x70\\xf3\\xa4\\x53\\xbc\\x08\\x03\\x3d\\xbd\\x0d\\x8a\\x8c\\x15\\x43\\x7c\\x6d\\x0f\\xf1\\xf2\\x1f\\x19\\xa2\\xc4\\xa1\\xcc\\x27\\x0b\\x3b\\xc7\\x61\\xdf\\x29\\x18\\x8d\\x98\\x95\\xbc\\xfe\\x19\\x96\\xfc\\xf7\\x60\\x15\\x9b\\x99\\x7f\\x6a\\xde\\x47\\xf0\\x32\\xcb\\x37\\xcf\\xe3\\x1b\\xa8\\xf9\\xfe\\x79\\xac\\x63\\xea\\xf5\\xe0\\x9e\\x7d\\xe8\\x03\\x95\\xf3\\x15\\xab\\x39\\xc1\\x78\\x82\\x37\\xdc\\x27\\x27\\xbb\\xab\\xb3\\x1b\\x4e\\xce\\xe7\\xfc\\xd5\\x62\\x7f\\xf9\\xa2\\x4b\\x03\\x88\\x96\\x9e\\x7b\\x17\\x84\\x9c\\xfb\\xcb\\x8b\\xb3\\xdf\\xd5\\x93\\x5a\\xb1\\x70\\xa8\\xac\\xad\\x3b\\x3f\\x31\\x27\\xc7\\xce\\x66\\xa3\\x91\\x5f\\x3f\\x8f\\xb7\\x7a\\xac\\xa9\\x9b\\x54\\x88\\x7e\\x96\\x37\\x3f\\xa1\\xcf\\xf4\\xad\\xa8\\x99\\x7e\\x0a\\xb2\\x09\\xd1\\xa6\\xc0\\x5c\\x8e\\x46\\x47\\xdd\\x29\\x15\\xea\\xa7\\xaf\\x50\\x94\\x80\\x49\\xe7\\x6b\\x96\\x5f\\xf8\\x09\\xdd\\xcb\\x48\\x28\\x77\\x0f\\xe1\\x2d\\x2a\\x36\\xe3\\xa2\\xf2\\x19\\x41\\x72\\x5c\\x16\\x55\\x59\\x2e\\x8a\\x5e\\x22\\x6e\\x96\\x9c\\xc1\\xd3\\x43\\xc0\\xa7\\x0f\\x63\\x20\\xec\\x1f\\x03\\x3e\\x7d\\x14\\x3f\\x1f\\x8f\\x8b\\x1a\\x0a\\xdb\\x72\\x4a\\xc3\\x07\\x04\\xf5\\xf4\\x61\\xc2\\x6d\\x39\\xa3\\x79\\x47\\x68\\x0d\\x3d\\xb5\\xe5\\x94\\x86\\x79\\x08\\xea\\xe9\\x63\\xab\\xbd\\x7c\\x47\\x8e\\xbf\\x8f\\x72\\xf8\\x20\\x59\\xdf\\x0b\\xef\\x5e\\xc3\\x41\\x9d\\xa2\\x2f\\xaa\\x67\\xe9\\x8b\\x2e\\x76\\x93\\x96\\x62\\x03\\xea\\xf3\\x9c\\x3e\\x06\\xd5\\x79\\x7e\\xa4\\x71\\x0f\\x42\\x6d\\xda\\x72\\xd3\\x22\\x04\\x27\\xa1\\x10\\xbd\\xf9\\xe6\\xe7\\xf1\\x99\\x3f\\x99\\x23\\x10\\xec\\x8b\\x7b\\x3f\\x3f\\x8f\\xe9\\x05\\x19\\xcf\\xc9\\x59\\x7c\\x56\\xd0\\x19\\xfd\\xc3\\x8c\\xd0\\x3b\\xb5\\xd9\\xe5\\xf4\\xe1\\x6c\\x27\\x77\\xbb\\x9c\\x3e\\x9e\\xed\\x8e\\x8b\\x17\\x40\\xcc\\xd2\\xbf\\xb3\\x36\\xfc\\x72\\x36\\x1a\\xdd\\x59\\x30\\xf2\\xda\\xc0\\x08\\xec\\xe4\\x43\\x78\\x37\\x7d\\x20\\xf4\\xce\\xda\\x63\\x6c\\xf2\\xd8\\xd1\\x04\\xd2\\x6b\\x4c\\x1f\\xc3\\xbb\\xe9\\x23\\x21\\x81\\x6a\\x4d\\x55\\xd1\\x3f\\x80\\xf4\\x3f\\x4c\\x84\\xab\\x91\\xbe\\x32\\x8d\\x4f\\xb3\\x3c\\xab\\xb6\\x60\\x38\\x6d\\x17\\x83\\x8c\\x6b\\x3c\\xa6\\x1d\\xa5\\x61\\x5b\\x00\\x68\\x22\\x9b\\x75\\x75\\x2e\\x90\\x2c\\x69\\xf6\\xe4\\x5c\\x36\\x71\\xa8\\xb7\\xf5\\x65\\xc0\\x71\\xfe\\x19\\x7d\\x25\\xae\\x8f\\x67\\xef\\xa7\\x09\\x9f\\x3e\\xd0\\xe4\\xd9\\x7a\\x62\\x0b\\x1f\\xe9\\x4d\\xb8\\x3f\\xdb\\x8f\\x93\\xb3\\x84\\xde\\x86\\x93\\xf8\\xfc\\xe6\\x6c\\xbe\\x88\\x2f\\xc3\\x1b\\xeb\\x5a\\x9e\\x29\\xa5\\x79\\x73\\x1e\\x0a\\x37\\x70\\x30\\xb8\\x42\\x8c\\xc5\\xc1\\xd4\\xca\\x65\\x3f\\x6d\\xbd\\x82\\xcb\\xef\\xbe\\x18\\x19\\xbc\\xf8\\x48\\xb3\\x67\\x8f\\x74\\xfd\\xec\\x91\\xb6\\x85\\x28\\xec\\x8c\\x8d\\xeb\\x33\\x4c\\x85\\x51\\xf5\\x91\\x6e\\x8e\\x4f\\x8b\\x4a\\x9b\\x77\\xa2\\x6a\\x97\\xc0\\xb1\\x42\\x81\\xe3\\x87\\xb4\\xe9\\x63\\x20\\x9d\\xe1\\x80\\xe8\\x4b\\x89\\x20\\xfb\\xe5\\x9e\\x1f\\x2a\\x82\\x2c\\xa5\\x08\\xb2\\x94\\x22\\xc8\\x52\\x8a\\x20\\xf3\\xff\\x0d\\x22\\xc8\\x53\\xdb\\x7f\\x62\\xe3\\x7f\\x87\\xc8\\xf2\\xe8\\xca\\xb8\\x11\\x7a\\x95\\x47\\x8a\\x13\\x7f\\xd3\\x43\\xb7\\x95\\x0e\\xf0\\xd5\\x2e\\xa9\\xcb\\xd6\\x61\\xd8\\x49\\x6f\\xb8\\x96\\x53\\x1e\\xdf\\xd9\\xce\\x2a\\xf4\\x65\\xc7\\xe8\\x70\\x78\\x11\\xa6\\x25\\x80\\xd2\\x9a\\xdf\\xeb\\xf0\\xb7\\x31\\x67\\x92\\x3e\\x77\\xaa\\x77\\xa1\\x9c\\x09\\x51\\x87\\x34\\x86\\xa4\\x4c\\xbf\\xc0\\x71\\xc4\\xdf\\x7f\\x35\\x52\\x13\\x51\\x01\\x1d\\x70\\x7e\\x39\\x1c\\xdc\\xba\\x58\\xfc\\x57\\x53\\xfc\\xd7\\xc5\\x89\\xed\\x0e\\xd9\\xa9\\x0d\\x0f\\x3b\\x3c\\x7b\\x7a\\xbb\\xea\\x74\\xf5\\xe9\\xed\\xba\\xdb\\xf7\\xa7\\x0b\\x6f\\x85\\xd6\\x3a\\x1e\\xdb\\x95\\xfa\\x57\\x1e\\xf9\\x2a\\x77\\xe9\\x4f\\xac\\x04\\xc4\\xc7\\x38\\xb5\\x18\\x9d\\x15\\x9c\\x31\\xe2\\x17\\x8f\\xa4\\x63\\x94\\x3d\\x57\\xf6\\x4b\\x26\\x23\\xb3\\x05\\xb8\\x31\\x5f\\x9e\\xbd\\xe4\\x7a\\xae\\xb7\\x53\\x87\\xdc\\xba\\xfa\\x4e\\xb4\\x7e\\x3c\\xd9\\x5a\\x70\\x62\\x61\\x17\\xff\\xf6\\xb2\\x25\\x21\\xda\\x52\\xf2\\x79\\xba\\x05\\x2d\\x0c\\xc0\\xb9\\xbc\\xed\\xcc\\x8c\\xdd\\x2d\\xfb\\x24\\xf2\\x3d\\x24\\x85\\xa8\\x33\\xb5\\xdd\\xbf\\xbb\\xe7\\x4a\\x82\\x79\\x1b\\x4d\\xf5\\xf4\\xf0\\xdf\\x36\\x84\\x17\\x36\\xbf\\x9c\\x3b\\x1a\\xfa\\xdf\\x35\\x04\\xc7\\x62\\x10\\x05\\xf4\\xd2\\xf0\\xb1\\x53\\x66\\xdf\\x4b\\xaf\\xc1\\xce\\xf4\\x76\\x2c\\x25\\x15\\x41\\x0f\\x3b\\x3d\\x73\\x07\\x81\\x04\\x6e\\xd0\\x4d\\x79\\x85\\xc3\\x59\\x27\\x95\\xda\\x2c\\x55\\xb4\\xe8\\x9c\\x76\\xe7\\xe5\\xee\\xeb\\x7d\\x7e\\xa4\\xa8\\xd5\\x3a\\x49\\x97\\x4a\\x86\\x9f\\x1c\\xb5\\xd7\\xdf\\x29\\xe7\\xc0\\xb0\\x79\\xc0\\x5b\\x46\\x84\\xb2\\x95\\x63\\x6f\\xc7\\xc3\\x96\\xc7\\xe4\\x59\\xdb\\x4d\\x12\\x44\\x23\\x0d\\x54\\xce\\xcf\\xc3\\x8b\\x96\\xef\\xab\\x0a\\x98\\xc5\\xcf\\xfa\\x8c\\x18\\xcf\\x4f\\x0c\\xcc\\x84\\x11\\xa1\\x75\\x2f\\x43\\x30\\x61\\x8b\\xd9\\x65\\xdd\\x7f\\x2c\\x90\\xfd\\x8f\\x2a\\xbf\\x26\\xe4\\x14\\x90\\xd5\\xa4\\x49\\x5d\\xd8\\xbe\\x66\\x0d\\x95\\x9b\\xad\\x61\\xab\\xfb\\x0d\\x1a\\x6a\\x65\\xd0\\x50\\x75\\x18\\x34\\xd4\\x6b\\x10\\x6c\\x3d\\x4c\\xaa\\xe9\\x03\\x2d\\x81\\x4a\\xae\\xa6\\x8f\\x34\\xb6\\xa8\\xe1\\xfc\\x2c\\x1f\\x97\\x67\\x25\\x59\\xc4\\xaf\\x8d\\xf0\\xd8\\x72\\xa7\\x13\\x2c\\x1e\\x5b\\xb2\\x53\\x4e\\x85\\x82\\xfb\\x13\\x55\\x4e\\x78\\x14\\xf6\\x3b\\xd8\\x71\\xd2\\x5e\\x14\\xcb\\xcb\\xc0\\x61\\x2e\\x94\\xdd\\x86\\x6b\\xea\\x40\\xeb\\xf0\\xfc\\x23\\x7f\\x35\\x9b\\xfc\\xeb\\xe7\\x93\\x6f\\xd6\\x4f\\xaf\\xe8\\x67\\x47\\x72\\xbe\\xc9\\x68\\x15\\x32\\x1d\\x02\\xa8\\xa6\\x56\\xe0\\xbc\\x9a\\x66\\x14\\x45\\xf5\\xbc\\xd7\\x16\\x9f\\xb7\\x6c\\xf1\\x79\\xcb\\x16\\x9f\\xb7\\x6c\\xf1\\xb5\\x64\\xa9\\xcf\\x26\\x9f\\xb7\\x6c\\xf2\\x79\\xdb\\x26\\x9f\\xb7\\x6d\\xf2\\xdd\\x8e\\x55\\x8c\\xbb\\x23\\xa1\\x39\\x04\\x7f\\xfc\\x62\\x57\\x44\\xfe\\xaa\\x5a\\x53\\x19\\xe9\\x06\\x4c\\xa4\\xcf\\xab\\xbb\\xcd\\xf8\\xe1\\x66\\xb7\\x88\\xb7\\xac\\xac\\x78\\x1d\\xde\\xd6\\xe9\\xe4\\x8f\\x82\\x20\\x29\\x55\\x44\\x86\\x9f\\x7f\\xfa\\xf6\\x70\\x90\\xbf\\xef\\x79\\x74\\x9d\\xd5\\x56\\x09\\x8d\\xc3\\x52\\xee\\x05\\xc6\\xfc\\xf8\\xf9\\xa7\\x6f\\xfd\\x9c\\xd0\\x02\\x3e\\x09\\xae\\x18\\x8b\\xa2\\xe3\\xf2\\x6f\\x85\\xa7\\xe2\\xca\\x14\\x3b\\x2c\\x28\\x77\\x7c\\x43\\x66\\xb4\\x9c\\x96\\xfc\\xae\\xb8\\xb6\\xbe\\x10\\x93\\xa6\\x7d\\xca\\x78\\x7c\\x24\\xb4\\x98\\x56\\x65\\x1c\\xc6\\x2d\\xac\\x04\\x99\\x9c\\x9c\\x40\\x46\\xca\\xc6\\xe6\\x73\\x95\\xe5\\xbe\\xdf\\x6a\\x46\\xc5\\x13\\xf3\\x09\\xdd\\xff\\xe5\\xed\\x57\\xc5\\x0d\\x66\\xcb\\xa2\\xdd\\x16\\xf2\\x61\\x33\\x8c\\x14\\xad\\x68\\xae\\xb8\\xb0\\xea\\x2c\\x07\\xdb\\x81\\x9c\\x16\\xe1\\xfc\\x8f\\xb3\\x33\\x3f\\x9e\\x5c\\x90\\xf3\\x98\\xee\\x42\\xe9\\xdb\\x30\\x91\\x7f\\xcf\\x8a\\xf3\\xf9\\x1f\\x67\\x0b\\x3e\\xad\\x18\\x7c\\x98\\x3b\\x8c\\x11\\xc7\\xc0\\xb1\\x3b\\x88\\x65\\x4f\\x6b\\x51\\x20\\xd9\\xa3\\x19\\x9d\\x19\\x2b\\xa7\\xbb\\x70\\xb6\\x28\\x2f\\xef\\x16\\x77\\xe3\\x31\\xe1\\x9a\\x47\\xa2\\x33\\xb7\\x03\\x59\\x80\\x06\\x0b\\xfe\\x8e\\x2c\\xb8\\x34\\x0f\\x17\\x85\\xbc\\xaa\\x8b\\x92\\xfb\\x4d\\x3c\\xcf\\x1f\\xf6\\x45\\x59\\x3b\\x27\\x8f\\x3c\\x49\\x10\\x29\\xf6\\x3c\\xf7\\x6d\\x54\\x5d\\x17\\x5f\\xb1\\x9a\\x89\\x5d\\x93\\x20\\xb7\\xcf\\x37\\x1e\\xa1\\xde\\xfb\\x68\\xc7\\xf2\\x6b\\xaf\\xd9\\xb7\\xd8\\xf6\\xe6\\x99\\xd6\\x92\\x9c\\xec\\x66\\xf3\\x9e\\x97\\x65\\x51\\x2a\\x2b\\x25\\xcf\\x1b\\x76\\x18\\xc4\\x6b\\x97\\x28\\x62\\x1c\\x00\\x34\\x6a\\x10\\x80\\xf9\\xcb\\x77\\xdf\\xfe\\xb9\\xae\\xf7\\xd2\\x6a\\x6a\\xc1\\x70\\xd4\\xde\\x9f\\xbe\\x7e\\xe7\\x75\\x58\\xf4\\x9b\\xee\\x28\\x9b\\x16\\x79\\xc9\\x59\\xf2\\x28\\x08\\x64\\x1e\\x6f\\x59\\xbe\\x71\\x65\\x1b\\x9f\\x86\\x80\\x51\\x58\\xf2\\x28\\x93\\x2b\\xfb\\x17\\xb3\\x19\\x98\\x3b\\x4b\\x4b\\xe7\\x96\\x11\\x16\\x77\\xb3\\xdf\\x89\\x45\\xdf\\x17\\x79\\xc5\\x3b\\xf0\\xe1\\x17\\x3c\\x2d\\x4a\\x8e\\x9a\\x7e\\x12\\xf8\\x71\\x91\\x57\\xc5\\x8e\\x4f\\x77\\xc5\\xc6\\xf7\\x20\\x11\\xd8\\x60\\xff\\x97\\xb7\\x83\\x09\\x9e\\xbb\\x41\\x5e\\xd4\\x83\\xb4\\xb8\\xcd\\x13\\x8f\\xd0\\xe6\\xf2\\x0d\\x67\\x84\\x1c\\x29\\x9b\\x56\\x10\\xed\\xd8\\xe8\\x97\\x6a\\xeb\\xdc\\xd6\\x2f\\x39\\xb7\\xae\\xed\\x58\\xfd\\xcc\\xa0\\x8f\\xe2\\x38\\x89\\x33\\x7a\\x62\\x91\\x51\\xfa\\xd4\\x3b\\xb7\\xef\\x8b\\x81\\xae\\xda\\x39\\xb1\\x8e\\x93\\xe9\\x30\\xe4\\xca\\xd7\\xae\\xdb\\x11\\x70\\xd9\\xe9\\x2f\\xb2\\x6c\\x60\\x1b\\xd7\\x4c\\xdd\\xa6\\x23\\x96\\x7e\\x8f\\x71\\xc8\\x09\\x42\\xde\\x41\\x38\\x61\\xd9\\x69\\xca\\x67\\x4f\\x87\\x04\\x2f\\x37\\xfa\\x23\\x41\\x63\\x85\\x54\\xdc\\x88\\x0f\\xfe\\x28\\x09\\x5c\\x0f\\x40\\xb9\\xe7\\xff\\x5f\\x9e\\xf0\\xff\\xb6\\xa9\\x75\\x11\\x86\\xe6\\x78\\xfd\\xc3\\x50\\xae\\x7c\\x3c\\xc3\\x16\\xf9\\xa4\\xe0\\xdf\\xb1\\x3d\\x6d\\xcf\\x0e\\xde\\x0b\\xc4\\xd4\\x37\\xa5\\x76\\x27\\xad\\x13\\xac\\xb6\\x4b\\x4d\\x12\\x12\\x22\\x36\\x83\\x90\\x20\\x06\\x54\\x1b\\xf4\\x82\\xaa\\x8d\\x95\\xcb\\x5a\\xe1\\x6f\\x9c\\xa0\\x56\\xae\\x59\\x6b\\xbb\\xe4\\x6d\\xf6\\x77\\xee\\x96\\x40\\xc4\\x93\\x67\\x82\\xaf\\x9c\\x0e\\xa1\\xd2\\x6b\\x51\\xee\\x8a\\x68\\x4d\\x50\\x80\\x93\\xf5\\x9b\\x13\\x06\\x2b\\x5c\\x67\\xc6\\x46\\xab\\x82\\xa0\\xd2\\x71\\xef\\x81\\xa7\\xdc\\xd2\\x77\\x81\\xe4\\x14\\xea\\x9e\\x56\\xb7\\x51\\x55\\x97\\x1d\\x4e\\x7d\\xa6\\x8a\\xe4\\x96\\x5e\\x91\\xce\\x6b\\xbf\\xf1\\x31\\xc5\\x2a\\xf5\\x5f\\x28\\x27\\x05\\xb1\\x7d\\xb6\\xc8\\x8b\\x56\\x7c\\xba\\x3e\\xbe\\x6a\\x90\\xe5\\x03\\x46\\xd8\\xaa\\x5e\\x8f\\x46\\xe2\\x7f\\x3b\\xed\\x63\\xbb\\x24\\x0c\\x43\\xec\\x79\\xe9\\xf3\\x55\\xbd\\x0e\\xc5\\x7f\\x10\\x25\\x95\\x95\\x1b\\x08\\x96\\x59\\x41\\x20\\x53\\xce\\xe1\\x35\\x15\\xcd\\x09\\x09\\xa0\\xaa\\xf8\\xbd\\x30\\x29\\xa9\\x25\\x31\\xd5\\x3c\\x61\\x1d\\x91\\x60\\xdb\\x35\\x0d\\x3d\\xdb\\xa0\\xdb\\x7f\\x3a\\x59\\xe7\\xa6\\xf8\\xfb\\xe9\\x0a\\xc5\\x33\\xed\\xab\\x9e\\xf7\\x36\\x79\\x24\\xeb\\x5a\\x62\\x09\\x4e\\xe7\\xfc\\xd5\\xf9\\x67\\x33\\x72\\x3c\\xfa\\x44\\xcd\\xbb\\x1b\\x81\\xf4\\xcf\\xbe\\x8b\\x98\\x6f\\x4c\\xfe\\xcb\\x66\\x97\\xdd\\x4b\\xf0\\x92\\x6a\\xc5\\x8b\\xfa\\xaa\\x4e\\xd6\\xb2\\x73\\x04\\x5b\\x13\\x97\\x1c\\xc6\\x6a\\xad\\x0b\\xd4\\x41\\x6a\\x85\\x61\\x55\\x41\\x45\\x86\\x76\\x84\\x69\\x16\\x72\\xca\\x43\\x4f\\xb7\\x9a\\x5c\\x55\\x1e\\xa1\\xfc\\x70\\xf0\\x5b\\xa5\\x8b\\x46\\x1c\\xd7\\x46\\x56\\x70\\x81\\x99\\xdd\\x26\\x56\\x0c\\x57\\x5a\\x85\\x76\\x83\\xea\\x8b\\x47\\x88\\xad\\xfc\\x3d\\x60\\x79\\x54\\x9a\\xa9\\x00\\x08\\xe2\\x28\\x2d\\xd4\\xd3\\xe5\\x6c\\x41\\x74\\x7c\\xe6\\x6d\\xb6\\x4b\\x7c\\xc8\\x6f\\x26\\xa3\\x7a\\xe8\\xa1\\x20\\x43\\x29\\x3b\\xf7\\x55\\xc4\\x4e\\xb2\\xc8\\xa7\\xb1\\xfa\\x4c\\x98\\xd1\\x7c\\x5a\\xd5\\x8f\\x3b\\xe9\\xf7\\x1a\\x7a\\xf3\\xd9\\xec\\x9f\\x3d\\x5d\\x28\\xe3\\x68\\x61\\xa9\\x0c\\xfd\\xd0\\x3f\\xd5\\x29\\x66\\x24\\xc5\\x21\\xe5\\x64\\x81\\xe1\\x89\\xcb\\xd1\\x08\\xf7\\xc3\\xd8\\x28\\xef\\xff\\xf2\\x16\\x56\\x9f\\x1c\\x3b\\x36\\x08\\x90\\x58\\x2b\\xb8\\x14\\x46\\xc7\\xec\\xe0\\x3a\\x32\\x9b\\xeb\\x00\\x97\\xa2\\x53\\xbc\\x05\\x03\\x36\\xe8\\x53\\x71\\x37\\x1b\\xf6\\x42\\xf0\\x37\\xc0\\x5f\\x64\\x8e\\x36\\xb4\\x0a\\xff\\xf2\\xf6\\x87\\xef\\xa7\\x10\\x3c\\xd8\\x67\\x3d\\xfc\\x05\\x59\\xb4\\x67\\xe0\\x73\\x5a\\x11\\x5a\\x8f\\x46\\xb5\\xd2\\x02\\xf7\\xd2\\xe1\\xee\\x64\\x06\\xf8\\xf9\\x60\\xe0\\x8d\\xf5\\x50\\x68\\x6f\\xdb\\x6f\\xb2\\x1d\\xf4\\x9c\\x66\\x1b\\x9b\\x4b\\x11\\xc8\\x5c\\x32\\x24\\x0b\\x7b\\x50\\x9f\\xd8\\x50\\xf8\\x09\\x7d\\x32\\x50\\xe9\\x05\\x4f\\x1e\\x52\\xdf\\xe2\\x17\\x10\\xe0\\x5e\\xf0\\xc7\\x19\\xf5\\xe4\\x1d\\x2b\\x4a\\x91\\x3a\\xf3\\x82\\xba\\xbc\\xe5\\xd4\\x33\\xb2\\x3c\\x4f\\xc6\\x04\\xf6\\xe0\\xc2\\xb4\\xda\\x43\\x8c\\x5b\\x0c\\x0d\\xec\\xc1\\xed\\x25\\xde\\x89\\x33\\xe6\\x99\\xf0\\xc0\\x1e\\x6a\\x09\\xc5\\x1b\\x00\\x3f\\x2f\\x98\\xe9\\x8e\\xbc\\x8f\\x66\\x33\\x19\\x24\\xd8\\x44\\x04\\x78\\xf2\\x94\\xa7\\xba\\x17\\xfc\\xe1\\xff\\xcf\\xd7\\xd5\\xee\\x44\\x08\\x03\\xc1\\x57\\x31\\x93\\xf8\\xc3\\xa4\\x62\\x8b\\x40\\xb4\\x3e\\x0c\\xe1\\x4b\\x8e\\x28\\x68\\xb8\\xf3\\x87\\x31\\xbc\\xbb\\xd9\\x76\\xb7\\x14\\xf0\\xfc\\x77\\xe9\\xd2\\xdd\\x76\\xa6\\x70\\x3d\\xb6\\x3b\\xb7\\x28\\x29\\x50\\xff\\x01\\xfd\\x8c\\xb1\\x18\\xc6\\xfe\\xa1\\x1f\\x2e\\xa7\\xaf\\x3a\\xa1\\x9d\\x99\\x12\\xaf\\x46\\x6b\\x05\\xbf\\x96\\xc1\\xf2\\xc1\\xe1\\x3c\\xd2\\x3a\\x62\\x9d\\xe4\\x4a\\xc4\\x8e\\xec\\x6b\\xf5\\x7e\\xee\\x14\\xaa\\x69\\x18\\xe3\\xe9\\x73\\xb3\\xab\\x5a\\x86\\x35\\xc1\\x4d\\x39\\x0e\\x13\\x79\\x30\\x0a\\xe7\\xef\\xa9\\xe1\\x0b\\x29\\x8e\\x3b\\x5b\\xb5\\x06\\x89\\x42\\x78\\x28\\xff\\x8f\\x90\\x69\\xef\\xe1\\xba\\xff\\x68\\xd3\\x72\\xe4\\x49\\xf2\\xd8\\xb0\\x26\\x8f\\xa1\\x65\\x6a\\x22\\x14\\x74\\x92\\xad\\x70\\x2d\\x0a\\xfe\\x35\\xfe\\xde\\x1f\\x8f\\xaa\\x20\\xcf\\x2c\\x10\\x04\\x51\\x24\\xde\\x43\\x27\\x12\\x38\\xa1\\x41\\x0e\\xcd\\x80\\xd5\\x89\\xc1\\x65\\x1e\\x7f\\xcc\\x9e\\x6b\\x44\\x60\\x0b\\x62\\x8e\\xcb\\x40\\x60\\x4d\\x4a\\xdc\\x11\\xef\\xf1\\x9b\\x75\\xea\\x1f\\xd2\\xc0\\x58\\xa5\\x89\\xe1\\xf7\\x31\\x64\\xe6\\x54\\xee\\x71\\x42\\x3c\\x1e\\xc9\\x18\\xd0\\xba\\xf0\\x59\\xa4\\xab\\x97\\xb2\\x5e\\xb1\\xe8\\x25\\x3a\\xe3\\xe2\\xad\\x2e\\x94\\x2b\\x1f\\xa5\\x11\\x05\\xe8\\x33\\x9a\\xc3\\x8e\\xa6\\x80\\xbb\\xa1\\xe9\\x48\\x72\\xe3\\xd0\\xcb\\x87\\xa0\\x45\\x20\\xf9\\x02\\xd8\\x34\\x62\\xed\\x29\\x50\\xf2\\xe8\\x86\\xc4\\x79\\x8f\\xd8\\x0f\\x41\\xa6\\x38\\x11\\x16\\xdd\\xf3\\xe5\\x54\\xc3\\x66\\xae\\x93\\x50\\xbd\\xb5\\xa5\\x0e\\xe8\\x8d\\x14\\xad\\x20\\xe1\\x9f\\x39\\x65\\xdb\\x8d\\x1f\\xd4\\xef\\x34\\xb4\\x5d\\xd9\\x54\\x73\\x1b\\xe8\\xab\\xab\\xe6\\xad\\x9f\\xe9\\x71\\x54\\x86\\x25\\x57\\x17\\xe6\\x39\\xcd\\xb0\\x31\\xf2\\xed\\x8b\\x6d\\x6b\\xf8\\x5f\\x53\\x8b\\x5c\\xdf\\xde\\xe4\\xf4\\x85\\x14\\xdb\\xe7\\xee\\xb3\\xab\\x2e\\x6e\\xdd\\xdd\\xf3\\xe7\\x8d\\xdd\\x83\\x86\\xc6\\x31\\xbe\\x2c\\x77\\x2f\\xbf\\x01\\x00\\x00\\xff\\xff\\x0d\\xcc\\x2b\\xb4\\x02\\x39\\x02\\x00\")\n\nfunc assetsLoginDistAllMinJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_assetsLoginDistAllMinJs,\n\t\t\"assets/login/dist/all.min.js\",\n\t)\n}\n\nfunc assetsLoginDistAllMinJs() (*asset, error) {\n\tbytes, err := assetsLoginDistAllMinJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"assets/login/dist/all.min.js\", size: 145666, mode: os.FileMode(420), modTime: time.Unix(1571033118, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _assetsLoginDistRespondMinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x94\\x57\\x6d\\x73\\xdb\\xb8\\xf1\\x7f\\x7f\\x9f\\x82\\xe2\\x3f\\x7f\\x06\\xb0\\x20\\x50\\x72\\xf2\\xa6\\xe4\\xc1\\xba\\xc4\\x71\\x7a\\xd7\\x49\\xee\\xae\\x67\\x4f\\x7b\\x53\\x49\\x99\\x01\\xc1\\xa5\\x44\\x89\\x24\\x68\\x02\\xd4\\x83\\x45\\x7e\\xf7\\x0e\\x48\\xea\\xc9\\x8e\\xa7\\xed\\x1b\\x09\\x58\\x2c\\x16\\xfb\\xf8\\xdb\\xa5\\x7b\\xd5\\xb3\\xfe\\x00\\x95\\xcb\\x2c\\xa4\\x4b\\x65\\xad\\x47\\xf4\\x3d\\xbd\\xf6\\xac\\x34\\xce\\xdc\\x94\\x6f\\x07\\x9b\\x38\\xd4\\x0b\\x2b\\x85\\x30\\xe6\\xd6\\x63\\x09\\xc5\\xce\\xca\\x65\\xb2\\x8b\\xe2\\x24\\xb1\\xae\\xac\\x5b\\x99\\xef\\x8a\\x78\\xbe\\xd0\\xd6\\xf5\\x70\\xf4\\xce\\xba\\x17\\x52\\x6b\\xeb\\x6f\\xb0\\x48\\x7e\\xb0\\xae\\xac\\x2f\\xb1\\x80\\x4c\\x41\\x68\\x95\\x59\\x08\\x85\\xb5\\xd0\\x3a\\x57\\x9e\\xeb\\xce\\x63\\xbd\\x28\\x03\\x2a\\x64\\xea\\x2a\\xc3\\xbf\\x84\\x45\\xe2\\x76\\x0a\\xb8\\x41\\x22\\x03\\x37\\xe5\\x4a\\x43\\xe1\\x7e\\xf9\\xe5\\xf6\\xee\\xd7\\xfb\\xbb\\xc1\\xd7\\x5f\\x1e\\x8c\\x38\\xeb\\xca\\xfd\\xe1\\x87\\x5e\\x54\\x66\\x42\\xc7\\x32\\x43\\x1c\\xef\\xed\\x52\\x81\\xa5\\x74\\x11\\x0b\\x6d\\xfb\\x9c\\xa6\\x5c\\x8b\\xc5\\x57\\xa3\\x28\\x3b\\xdf\\x54\\xd5\\xf9\\x9d\\x35\\x2f\\xac\\x80\\x08\\xc6\\x69\\x28\\x45\\x99\\x42\\xa6\\xef\\x12\\x30\\x7f\\x24\\x64\\x82\\x46\\x71\\xa1\\x0e\\x84\\xdb\\x45\\x9c\\x84\\x55\\xd5\\x11\\x9b\\x1d\\x01\\xc6\\xa9\\x28\\x80\\x6b\\xe8\\x98\\x90\\x1d\\xc8\\x70\\x67\\x63\\x12\\xbd\\x3c\\x09\\xe3\\xb5\\x8d\\xfd\\x02\\x74\\x59\\x64\\x56\\x44\\xe3\\x90\\xd9\\xe9\\xe3\\x40\\x83\\xd2\\x83\\x91\\x4d\\x22\\xaa\\xf4\\x2e\\x01\\x2a\\x94\\x7a\\x80\\xad\\x66\\x76\\x2e\\x55\\x6c\\xb4\\xf4\\x78\\xa0\\x64\\x52\\x6a\\xf0\\xb5\\xcc\\xbd\\xc1\\x68\\x38\\x84\\xd4\\x26\\xd0\\xb1\\x07\\x5c\\xac\\xe6\\x85\\x2c\\xb3\\x90\\xd9\\x99\\xcc\\xc0\\x9c\\xf0\\x3c\\x87\\x2c\\x6c\\x34\\x44\\x11\\x26\\xe7\\xe6\\x9e\\x5e\\xcf\\x32\\x28\\x7e\\x7e\\xf8\\xfa\\x85\\xbd\\x75\\xd4\\x62\\xe7\\xff\\xd8\\x88\\x6b\\xe3\\xca\\xec\\xb7\\x7d\\xde\\x7f\\x6b\\xdf\\x58\\xff\\x77\\x54\\xd0\\xda\\x5b\\x4d\\xe4\\x3d\\xeb\\xfd\\x75\\xbe\\xf5\\xad\\xfa\\x47\\xb7\\xb9\\x71\\xf3\\x96\\x08\\x1a\\x67\\x0a\\x0a\\xfd\\x11\\x22\\x59\\x00\\x02\\x12\\x62\\x12\\xb0\\xf7\\xd7\\x8c\\xb1\\x88\\xca\\x28\\x52\\xa0\\xff\\x69\\xae\\x12\\x41\\x0b\\x48\\xe5\\x1a\\x5a\\xcd\\x00\\x93\\x7d\\x13\\x15\\x50\\x5e\\x40\\x9a\\x87\\x3d\\x5e\\xd7\\x35\\x3a\\x85\\x02\\xd7\\x48\\x2f\\x62\\x75\\x69\\xc2\\x45\\x94\\x0f\\x07\\x56\\x80\\xf0\\xbe\\x44\\xbd\\x21\\xae\\x4d\\x44\\x05\\xdb\\xd7\\x3e\\xa7\\x45\\x9b\\x45\\x4c\\x10\\x41\\xcb\\x3c\\xe4\\x1a\\xd8\\x51\\x12\\xde\\xd7\\xbe\\x61\\x0d\\xd9\\x64\\x46\\x2e\\xe8\\x4d\\x4a\\xb0\\xde\\xc8\\xd7\\xc5\\x6e\\x1f\\xb0\\x0c\\x36\\x16\\xa7\\x7f\\x7e\\xfd\\xf2\\xb3\\xd6\\xf9\\x1f\\xf0\\x58\\x82\\xd2\\xb5\\x30\\x8a\\x23\\x81\\x8f\\xe7\\x1f\\x84\\x8e\\xd7\\xf0\\xe7\\x6f\\xc1\\x12\\x84\\x46\\xf6\\xd7\\x58\\x14\\x52\\xc9\\x48\\x37\\x17\\x1f\\x1e\\x7e\\xb7\\x71\\x7d\\xf0\\xfd\\xe9\\xa5\\x8e\\x12\\xd4\\x35\\x32\\x19\\x73\\xb2\\x92\\x04\\xad\\x1a\\x82\\x01\\xc2\\xbe\\x70\\x1c\\x24\\xa8\\xcc\\x21\\x43\\xf6\\x5f\\xef\\x1e\\x6c\\xc2\\x49\\x6f\\x88\\x89\\xa0\\x32\\x2b\\x80\\x87\\x3b\\xa5\\xb9\\x06\\xb1\\xe0\\xd9\\xfc\\xc2\\x8e\\xf7\\x3d\\xc6\\x8c\\xcb\\x79\\xb8\\xbb\\x37\\x1c\\x55\\x75\\x3d\\x1c\\x36\\x34\\x73\\xa1\\x54\\x8e\\xf3\\x6e\\xf8\\xfe\\x6c\\x5f\\x55\\x01\\x12\\x9d\\xcf\\x14\\x98\\x24\\xc4\\x35\\x79\\x2e\\xc4\\x71\\x04\\x55\\x90\\x85\\x28\\x2b\\x93\\x04\\xe3\\xda\\x8f\\x23\\x24\\x28\\x5f\\xf2\\x2d\\x8b\\x88\\xa0\\x8f\\x25\\x94\\xc0\\xc2\\x26\\xd4\\x73\\xd8\\xb2\\x7d\\x1b\\x57\\xf7\\xa7\\xe6\\x7f\\xf2\\x6d\\xba\\x9f\\xf5\\xa7\\x7b\\x64\\x16\\xd3\\x7a\\x76\\x35\\xdd\\x4f\\xbe\\x4d\\xeb\\xe9\\x7e\\x76\\x35\\xad\\x71\\xdf\\x9d\\xc7\\x64\\x05\\xbb\\xa8\\xe0\\x29\\x28\\xcf\\xfd\\x09\\x8d\\xbd\\xe9\\x00\\x8d\\x3d\\x59\\xa5\\xf2\\xa9\\xda\\x40\\xb0\\x8a\\x35\\x9e\\x0e\\xf0\\xf8\\xc8\\x74\\x14\\x38\\xf6\\xbe\\x2f\\xd2\\xac\\xcd\\xca\\x88\\x2e\\x8b\\x44\\x79\\x2e\\x2a\\x8b\\x64\\x8a\\xf0\\xe4\\xad\\x3d\\x1b\\x1b\\x3d\\xdc\\x29\\x7e\\x6b\\xcf\\x26\\xdf\\xbc\\xe6\\xbf\\xdf\\x1d\\x4c\\x31\\x76\\xe7\\x24\\x8a\\xb3\\xf0\\xde\\x64\\xb9\\x3a\\x58\\x60\\x5d\\xa1\\xf6\\x4d\\x6c\\xac\\x98\\xde\\x4f\\xd5\\xac\\x3f\\xc6\\x6f\\x5c\\x22\\xb3\\x64\\xe7\\xb9\\xc8\\xfc\\x4d\\x55\\x1f\\x8f\\xd1\\x84\\x0f\\x9e\\x3e\\x0c\\xfe\\x65\\x38\\xd5\\xd8\\x25\\x69\\x9c\\x6d\\x3c\\x77\\x8a\\x26\\x53\\x35\\xbb\\x4a\\xe3\\x6c\\xda\\x02\\xe9\\x54\\x5d\\x79\\x0d\\xa9\\x3d\\x98\\x0c\\x07\\x7f\\x99\\xd2\\x59\\x1f\\xa3\\x7c\\x5b\\x41\\x8a\\x1b\\xe2\\x14\\xbb\\x24\\xe5\\xdb\\xb3\\xeb\\x7c\\xfb\\xbf\\x5d\\xaf\\x89\\xa0\\x8d\\xfa\\x7f\\x2f\\xa1\\x88\\x41\\xdd\\x97\\x79\\x2e\\x0b\\x0d\\xe1\\x05\\x30\\x3a\\x8e\\x89\\x69\\x8f\\x5d\\x10\\x91\\x6d\\x4c\\xb2\\x78\\x92\\xd8\\xd8\\x71\\x5e\\x3b\\xa1\\x5d\\x21\\x93\\xde\\x2b\\x0f\\xb5\\xe9\\x3c\\x27\\x0b\\x12\\x93\\xe5\\x19\\xd8\\x92\\x15\\x5b\\xbe\\x40\\xde\\xc4\\x94\\x64\\x6a\\x7e\\x32\\xf3\\x23\\xd9\\xbe\\x26\\x39\\x7b\\x37\\x24\\x8f\\x6c\\x49\\xe7\\x70\\xe0\\x53\\x1f\\x77\\x0f\\x7c\\xfe\\x2b\\x4f\\x01\\xd9\\x0b\\xe0\\xa1\\x8d\\x27\\xc3\\x59\\x55\\xad\\x48\\xf1\\x2a\\x5b\\xc0\\x15\\x34\\x6c\\x44\\xb1\\xc7\\x57\\x78\\x92\\x38\\x5b\\xd9\\x98\\xe8\\xe7\\x90\\xc0\\x49\\xc0\\x96\\xdf\\xc5\\x74\\x22\\xd8\\x92\\x1a\\xdc\\x27\\x21\\x5b\\x75\\xb8\\x1c\\xc9\\x4c\\xdf\\xc7\\x4f\\x40\\x80\\x89\\xa6\\x66\\x2e\\xa9\\x91\\xc1\\x97\\x43\\xf9\\xff\\x67\\xe4\\x37\\xf7\\x06\\x2a\\x7e\\x02\\x6f\\x04\\xa9\\xdf\\x02\\xf1\\xc8\\xb4\\x01\\x51\\x55\\x48\\xb0\\xe8\\xa5\\x62\\x5d\\x1b\\x12\\xaf\\xb5\\x09\\x4c\\x9e\\x6b\\xca\\xec\\xd1\\x70\\xf8\\xff\\x36\\x79\\xae\\xeb\\x89\\x7e\\xde\\x57\\x02\\x4c\\x22\\xc7\\x59\\x5d\\x42\\xbf\\x20\\xab\\xb3\\xee\\x88\\x09\\x67\\xc1\\x45\\x03\\x88\\xc6\\xab\\x8b\\x16\\x20\\xb0\\x77\\xd9\\x13\\x82\\xef\\xa8\\x15\\x12\\x68\\xf0\\xef\\x19\\x19\\x8c\\xf8\\x98\\xe5\\xbc\\x50\\xf0\\x39\\x91\\x5c\\x23\\x8e\\x6b\\x52\\x9e\\xa2\\x76\\x84\\x50\\x5b\\x24\\x31\\x64\\xad\\x0a\\xb6\\x09\\xd1\\x44\\x18\\xc4\\xb7\\x6f\\xef\\xef\\x47\\xb7\\x32\\xcd\\xb9\\xb6\\x19\\x33\\x1e\\x6c\\xd6\\x5f\\x65\\x08\\x8e\\x13\\x56\\x55\\x1b\\xd2\\x89\\x98\\x55\\x55\\x48\\x22\\x93\\x83\\x92\\xa9\\x89\\xa2\\x09\\x64\\x73\\xbd\\x18\\x8c\\x66\\xa4\\x60\\xc8\\x80\\xff\\x27\\xae\\x01\\x9b\\x64\\x7a\\x88\\x53\\x03\\xd7\\x71\\x84\\x02\\xc7\\x99\\x3b\\x4e\\x7e\\x53\\x0c\\xe6\\xb8\\x8b\\x32\\xa7\\x22\\x01\\x5e\\x18\\x1e\\x59\\x6a\\xb4\\xc0\\x64\\xc1\\x38\\x55\\xed\\x2d\\x43\\x29\\x49\\x8e\\xc9\\x5a\\xc6\\xa1\\x35\\xf4\\xe7\\xac\\xf0\\x23\\x59\\x20\\x63\\xc0\\xda\\x8a\\x33\\x2b\\xc1\\x71\\x84\\x12\\xba\\xe0\\xea\\xb7\\x4d\\xf6\\x7b\\x21\\x73\\x28\\xf4\\x0e\\xad\\x71\\x6b\\xe3\\x86\\x25\\x93\\xf5\\x8c\\x6c\\xd9\\x86\\x1a\\x9c\\x21\\x3b\\xb3\\xe0\\xdb\\x0d\\x79\\x62\\xa6\\xa4\\x19\\x63\\x5b\\xf2\\xe1\\xb0\\xdc\\x91\\x8f\\xcc\\x86\\xd4\\xf6\\xb7\\x8e\\x83\\xb6\\xe7\\x0e\\xdc\\xe2\\x2b\\xb4\\xa5\\x71\\x16\\xc2\\xf6\\xb7\\x08\\x7d\\xc4\\x37\\x83\\xd1\\x38\\xae\\x2a\\x8d\\xb0\\x37\\xc2\\x98\\xec\\x1c\\x07\\xed\\xce\\xf9\\x77\\xf8\\x0a\\xed\\x5e\\xe7\\xdf\\x18\\x75\\x9b\\x11\\xd1\\x71\\xd0\\x93\\xe3\\x7c\\xa8\\xaa\\x1e\\x7a\\xaa\\x2a\\xb8\\x61\\x5b\\x6c\\xd6\\x1f\\xaa\\x6a\\x77\\xc3\\x00\\xe3\\xaa\\x42\\xd1\\x64\\xd3\\x22\\xc7\\xec\\x62\\xc3\\x26\\x33\\x4c\\x4e\\x5b\\x9a\\x97\\x6a\\x81\\xd2\\xc9\\x86\\x16\\x65\\x02\\x6a\\x86\\x71\\x7d\\x70\\xd3\\xad\\x71\\x53\\x86\\xb3\\xe7\\x3e\\xba\\xc5\\x8e\\x93\\x4d\\x6e\\x67\\xed\\x2f\\xcd\\x79\\x01\\x99\\xfe\\x55\\x86\\xc0\\x18\\x7b\\x74\\x9c\\xc7\\x8b\\xfc\\x33\\x2c\\xd8\\xcf\\xba\\x18\\xb3\\xe1\\x31\\x08\\x9f\\x8c\\xf4\\xc8\\x04\\x21\\x7a\\xfe\\xc0\\xa7\\x2e\\x08\\x77\\x2f\\x8b\\xb0\\x49\\x59\\x1b\\x93\\xcf\\x2c\\x9a\\x7c\\x9a\\xd1\\xa5\\x8c\\x33\\x64\\x4f\\x33\\x1b\\xfb\\x77\\x54\\xef\\x72\\x60\\xb6\\x86\\xad\\x76\\x85\\x52\\x36\\xb9\\x6b\\x4d\\x64\\x9f\\xc8\\xe3\\x65\\x51\\xdd\\x11\\x49\\x33\\xd8\\xea\\xfb\\x38\\x48\\xe2\\x6c\\x8e\\xc9\\x5d\\x5b\\x0a\\xf7\\x0b\\x00\\x3d\\x3e\\xdf\\x1c\\x11\\xe4\\xb3\\x77\\x77\\x51\\xac\\x07\\xc5\\xcc\\xa1\\x31\\x1d\\x7d\\xc6\\x98\\x64\\xad\\x33\\xef\\x70\\x5d\\x93\\xf5\\xc5\\xec\\x41\\x3a\\xb8\\x36\\xd3\\x6d\\x01\\x79\\xc2\\x05\\xa0\\xae\\xa1\\xd3\\x63\\xeb\\x25\\xf6\\x01\\xf6\\x8f\\x67\\x8d\\x01\\x66\\x90\\x01\\xc7\\x81\\xce\\x87\\x55\\x35\\xf4\\x03\\x16\\x50\\x55\\x06\\x66\\x66\\xcb\\xe6\\x68\\x48\\x02\\x9a\\x70\\xa5\\x7f\\xe9\\xf2\\xc6\\x76\\x6d\\x8c\\x9b\\x51\\x6c\\xce\\xbe\\x33\\xaa\\xbe\\x54\\xc1\\xf4\\x71\\x62\\xbf\\x19\\xd9\\xfd\\xa0\\x6f\\xbf\\xb9\\x7e\\xf3\\xce\\xc6\\x35\\x59\\xb0\\x5e\\xe4\\x38\\xa1\\x1f\\x74\\xef\\x3a\\x0e\\x0a\\xfa\\xcc\\xc8\\x26\\x66\\x1d\\xb1\\x11\\x3e\\x06\\x33\\x36\\x81\\xbd\\x89\\xfd\\xb8\\xdf\\x6f\\x0d\\x5d\\x92\\x15\\xc9\\x88\\xf4\\x17\\x63\\xb4\\x64\\x21\\x49\\x5b\\xcf\\xcc\\x11\\xc7\\x18\\x7b\\x68\\xc9\\x60\\x12\\xcf\\x9e\\xd9\\x7a\\x1a\\x0d\\xb0\\xe3\\xfc\\x01\\xf3\\xbb\\x6d\\x4e\\xdf\\x8c\\x0e\\x57\\x0f\\x84\\x6b\\xc7\\x99\\x9f\\x36\\xd8\\x78\\x9d\\x2d\\xa9\\xca\\x93\\x58\\x23\\x9b\\xd8\\x98\\x48\\x76\\x48\\xb6\\xa3\\x76\\x39\\x1b\\xfa\\xf2\\x26\\xf7\\xf3\\x7e\\x1f\\xaf\\x58\\x36\\xc9\\x67\\x24\\x69\\xa5\\x76\\xc3\\xd4\\xea\\x20\\x00\\x35\\xad\\xec\\x99\\x62\\xa6\\x29\\x9f\\xa9\\x74\\x5d\\x55\\xb6\\x69\\xd1\\xa4\\x29\\x18\\x2f\\x3d\\xc2\\x17\\x39\\x14\\xa7\\xb7\\x3a\\x96\\xb0\\x91\\x78\\x33\\x18\\xb5\\xc3\\xca\\xea\\x79\\x74\\xe3\\x6c\\x83\\x1d\\xe7\\xac\\xfe\\x8f\\x66\\xe3\\x3e\\x3a\\x7f\\xcf\\xc6\\xed\\xbc\\xf2\\x42\\x02\\xdf\\xfe\\xd7\\x12\\x6a\\x5c\\x97\\x08\\xd7\\x64\\x73\\xde\\x86\\xe3\\x08\\x85\\x9d\\x01\\x87\\x31\\x3d\\xa4\\x6a\\x11\\x47\\x1a\\x61\\x3f\\x42\\x01\\x5d\\x14\\x10\\x9d\\x3e\\x16\\x04\\xde\\xaf\\x91\\x20\\x1d\\x39\\x38\\xe4\\xa7\\x9c\\xb4\\x94\\x19\\xeb\\x0d\\xc9\\x05\\x04\\x9f\\x3d\\xb5\\x31\\x8f\\x0f\\x8d\\x1a\\x35\\xd9\\x9e\\xeb\\x70\\x08\\x53\\xc0\\x86\\x7e\\xf0\\xe3\\xa1\\x1d\\xf8\\xc1\\x21\\x97\\x04\\x53\\x93\\xc0\\xf4\\x17\\xd1\\x69\\xc3\\xba\\x91\\x88\\xcc\\x9b\\x41\\x3a\\x71\\x9c\\x16\\x17\\x94\\x29\\x59\\xd3\\x79\\x1a\\x2a\\xd5\\xf2\\x8b\\xdc\\x40\\x71\\xcb\\x95\\xe9\\x21\\xd0\\x34\\x90\\x9e\\x9c\\xc0\\xec\\xd4\\xfc\\x9a\\x22\\x3f\\x0e\\x13\\x6d\\xc9\\x17\\x7c\\x73\\xdb\\x56\\xfd\\x18\\xad\\xd1\\x2b\\x47\\x04\\x48\\x64\\xec\\x06\\x63\\x32\\xf6\\x50\\xcf\\xfd\\x76\\x98\\x4f\\xbd\\xd9\\xd5\\xd4\\x9d\\xba\\xd8\\xa5\\xe6\\x3b\\x0f\\x01\\x76\\x9c\\x5e\\x51\\x55\\x70\\xac\\xba\\x53\\x6e\\x9b\\x82\\xef\\x32\\xcf\\x6d\\x32\\x8f\\x99\\x51\\x31\\x91\\x82\\x1b\\xd7\\xd0\\x85\\x54\\x1a\\x3b\\x0e\\xb2\\x5d\\xd7\\x58\\x05\\x17\\x25\\x7f\\x6d\\x4e\\xe0\\x9c\\x3d\\x2f\\xa4\\x96\\x42\\x26\\x7d\\xc0\\x24\\xec\\xf2\\xdb\\x38\\xcc\\x83\\xee\\x5b\\x30\\xaa\\x31\\xc6\\xb5\\x89\\x83\\xbf\\x45\\xf8\\xf4\\x05\\xb7\\x25\\xa2\\x99\\xdc\\xd2\\x7f\\xf0\\xa4\\x04\\xa6\\x09\\xa7\\x3c\\x0c\\xef\\xd6\\x90\\xe9\\x2f\\xb1\\xd2\\x90\\x41\\x31\\x7e\\x49\\x42\\x76\\x01\\x66\\x80\\xb2\\x49\\x40\\x7a\\x23\\xec\\x71\\xca\\xb5\\xe6\\x62\\xd1\\x30\\x99\\xc1\\xf6\\x6c\\x6b\\x26\\xdb\\x23\\x37\\xae\\xbb\\x8f\\x50\\xff\\xdf\\x01\\x00\\x00\\xff\\xff\\xed\\x16\\x16\\x7b\\x19\\x11\\x00\\x00\")\n\nfunc assetsLoginDistRespondMinJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_assetsLoginDistRespondMinJs,\n\t\t\"assets/login/dist/respond.min.js\",\n\t)\n}\n\nfunc assetsLoginDistRespondMinJs() (*asset, error) {\n\tbytes, err := assetsLoginDistRespondMinJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"assets/login/dist/respond.min.js\", size: 4377, mode: os.FileMode(420), modTime: time.Unix(1570872928, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n\tcannonicalName := strings.ReplaceAll(name, \"\\\\\", \"/\")\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.bytes, nil\n\t}\n\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n\ta, err := Asset(name)\n\tif err != nil {\n\t\tpanic(\"asset: Asset(\" + name + \"): \" + err.Error())\n\t}\n\n\treturn a\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n\tcannonicalName := strings.ReplaceAll(name, \"\\\\\", \"/\")\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.info, nil\n\t}\n\treturn nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n\tnames := make([]string, 0, len(_bindata))\n\tfor name := range _bindata {\n\t\tnames = append(names, name)\n\t}\n\treturn names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n\t\"assets/login/dist/all.min.css\":    assetsLoginDistAllMinCss,\n\t\"assets/login/dist/all.min.js\":     assetsLoginDistAllMinJs,\n\t\"assets/login/dist/respond.min.js\": assetsLoginDistRespondMinJs,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"}\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"}\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n\tnode := _bintree\n\tif name != \"\" {\n\t\tcannonicalName := strings.ReplaceAll(name, \"\\\\\", \"/\")\n\t\tpathList := strings.Split(cannonicalName, \"/\")\n\t\tfor _, p := range pathList {\n\t\t\tnode = node.Children[p]\n\t\t\tif node == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t\t\t}\n\t\t}\n\t}\n\tif node.Func != nil {\n\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t}\n\trv := make([]string, 0, len(node.Children))\n\tfor childName := range node.Children {\n\t\trv = append(rv, childName)\n\t}\n\treturn rv, nil\n}\n\ntype bintree struct {\n\tFunc     func() (*asset, error)\n\tChildren map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n\t\"assets\": &bintree{nil, map[string]*bintree{\n\t\t\"login\": &bintree{nil, map[string]*bintree{\n\t\t\t\"dist\": &bintree{nil, map[string]*bintree{\n\t\t\t\t\"all.min.css\":    &bintree{assetsLoginDistAllMinCss, map[string]*bintree{}},\n\t\t\t\t\"all.min.js\":     &bintree{assetsLoginDistAllMinJs, map[string]*bintree{}},\n\t\t\t\t\"respond.min.js\": &bintree{assetsLoginDistRespondMinJs, map[string]*bintree{}},\n\t\t\t}},\n\t\t}},\n\t}},\n}}\n\n// RestoreAsset restores an asset under the given directory\nfunc RestoreAsset(dir, name string) error {\n\tdata, err := Asset(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo, err := AssetInfo(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// RestoreAssets restores an asset under the given directory recursively\nfunc RestoreAssets(dir, name string) error {\n\tchildren, err := AssetDir(name)\n\t// File\n\tif err != nil {\n\t\treturn RestoreAsset(dir, name)\n\t}\n\t// Dir\n\tfor _, child := range children {\n\t\terr = RestoreAssets(dir, filepath.Join(name, child))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc _filePath(dir, name string) string {\n\tcannonicalName := strings.ReplaceAll(name, \"\\\\\", \"/\")\n\treturn filepath.Join(append([]string{dir}, strings.Split(cannonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "template/installation/assets_list.go",
    "content": "package login\n\nvar AssetsList = []string{\n\t\"/login/dist/all.min.css\",\n\t\"/login/dist/all.min.js\",\n\t\"/login/dist/respond.min.js\",\n}\n"
  },
  {
    "path": "template/installation/installation.go",
    "content": "package login\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n)\n\ntype Installation struct {\n\tName string\n}\n\nfunc Get() *Installation {\n\treturn &Installation{\n\t\tName: \"installation\",\n\t}\n}\n\nvar DefaultFuncMap = template.FuncMap{\n\t\"lang\":     language.Get,\n\t\"langHtml\": language.GetFromHtml,\n\t\"link\": func(cdnUrl, prefixUrl, assetsUrl string) string {\n\t\tif cdnUrl == \"\" {\n\t\t\treturn prefixUrl + assetsUrl\n\t\t}\n\t\treturn cdnUrl + assetsUrl\n\t},\n\t\"isLinkUrl\": func(s string) bool {\n\t\treturn (len(s) > 7 && s[:7] == \"http://\") || (len(s) > 8 && s[:8] == \"https://\")\n\t},\n\t\"render\": func(s, old, repl template.HTML) template.HTML {\n\t\treturn template.HTML(strings.ReplaceAll(string(s), string(old), string(repl)))\n\t},\n\t\"renderJS\": func(s template.JS, old, repl template.HTML) template.JS {\n\t\treturn template.JS(strings.ReplaceAll(string(s), string(old), string(repl)))\n\t},\n\t\"divide\": func(a, b int) int {\n\t\treturn a / b\n\t},\n}\n\nfunc (i *Installation) GetTemplate() (*template.Template, string) {\n\ttmpl, err := template.New(\"installation\").\n\t\tFuncs(DefaultFuncMap).\n\t\tParse(List[\"installation\"])\n\n\tif err != nil {\n\t\tlogger.Error(\"Installation GetTemplate Error: \", err)\n\t}\n\n\treturn tmpl, \"installation\"\n}\n\nfunc (i *Installation) GetAssetList() []string               { return AssetsList }\nfunc (i *Installation) GetAsset(name string) ([]byte, error) { return Asset(name[1:]) }\nfunc (i *Installation) IsAPage() bool                        { return true }\nfunc (i *Installation) GetName() string                      { return \"login\" }\n\nfunc (i *Installation) GetContent() template.HTML {\n\tbuffer := new(bytes.Buffer)\n\ttmpl, defineName := i.GetTemplate()\n\terr := tmpl.ExecuteTemplate(buffer, defineName, i)\n\tif err != nil {\n\t\tfmt.Println(\"ComposeHtml Error:\", err)\n\t}\n\treturn template.HTML(buffer.String())\n}\n"
  },
  {
    "path": "template/installation/installation.tmpl",
    "content": "{{define \"installation\"}}\n    <html>\n    <head>\n        <title>GoAdmin Install</title>\n        <meta charset=\"utf-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n        <link rel=\"stylesheet\" href=\"../../assets/install/assets/css/main.css\">\n        <link rel=\"stylesheet\" href=\"../../assets/fullpage/fullpage.min.css\">\n        <noscript>\n            <link rel=\"stylesheet\" href=\"../../assets/install/assets/css/noscript.css\"/>\n        </noscript>\n    </head>\n    <body class=\"\">\n\n    <div id=\"fullpage\">\n        <div class=\"section active\" id=\"section1\">\n            <div class=\"slide\" id=\"slide1\">\n                <div class=\"page-wrapper\" style=\"margin-left: auto;margin-right:  auto;width: 1236px;\">\n                    <!-- Wrapper -->\n                    <div class=\"wrapper\" style=\"margin-left: auto;margin-right:  auto;\">\n                        <section class=\"panel color2-alt\">\n                            <div class=\"intro color2\">\n                                <h2 class=\"major\">数据库配置</h2>\n                                <p>目前仅支持Mysql</p>\n                            </div>\n                            <div class=\"inner columns aligned\" style=\"padding: 2.5rem 3.5rem 2rem 3.5rem;\">\n                                <div class=\"span-2-5\">\n                                    <form method=\"post\" action=\"#\">\n                                        <div class=\"field\" style=\"width: calc(73% - 0.75rem);\">\n                                            <label for=\"demo-name\">地址</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"db-host\" value=\"\"\n                                                   placeholder=\"127.0.0.1\">\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <label for=\"demo-email\">端口</label>\n                                            <input type=\"email\" name=\"demo-email\" id=\"db-port\" value=\"\"\n                                                   placeholder=\"3306\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-name\">账号</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"db-username\" value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-email\">密码</label>\n                                            <input type=\"password\" name=\"demo-email\" id=\"db-password\" value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-email\">数据库名</label>\n                                            <input type=\"text\" name=\"demo-email\" id=\"db-database\" value=\"\"\n                                                   placeholder=\"database\">\n                                        </div>\n                                        <div class=\"field\" style=\"margin-top: 20px;\">\n                                            <ul class=\"actions\">\n                                                <li><input id=\"test-con-btn\" type=\"submit\" value=\"连接测试\"\n                                                           class=\"special color2\"></li>\n                                                <li><input class=\"input-next\" type=\"reset\" value=\"下一步\"></li>\n                                            </ul>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </section>\n                        <!-- Copyright -->\n                        <div class=\"copyright\">Copyright © 2018.Company name All rights reserved.<a target=\"_blank\"\n                                                                                                    href=\"https://github.com/chenhg5/go-admin\">GoAdmin</a>\n                        </div>\n                    </div>\n\n                </div>\n            </div>\n            <div class=\"slide\" id=\"slide2\">\n                <div class=\"page-wrapper\" style=\"margin-left: auto;margin-right:  auto;width: 1236px;\">\n                    <!-- Wrapper -->\n                    <div class=\"wrapper\" style=\"margin-left: auto;margin-right:  auto;\">\n                        <section class=\"panel color2-alt\">\n                            <div class=\"intro color2\">\n                                <h2 class=\"major\">选择管理数据表</h2>\n                                <p>选择管理数据表</p>\n                            </div>\n                            <div class=\"inner columns aligned\" style=\"padding: 2.5rem 3.5rem 2rem 3.5rem;\">\n                                <div class=\"span-2-5\">\n                                    <form method=\"post\" action=\"#\" id=\"table-div\">\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-copy\" name=\"demo-copy\" class=\"color2\">\n                                            <label for=\"demo-copy\">users</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-human\" name=\"demo-human\" class=\"color2\"\n                                                   checked=\"\">\n                                            <label for=\"demo-human\">ninepic</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-copy1\" name=\"demo-copy1\" class=\"color2\">\n                                            <label for=\"demo-copy1\">users</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-human1\" name=\"demo-human1\" class=\"color2\"\n                                                   checked=\"\">\n                                            <label for=\"demo-human1\">ninepic</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-copy2\" name=\"demo-copy2\" class=\"color2\">\n                                            <label for=\"demo-copy2\">users</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-human2\" name=\"demo-human2\" class=\"color2\"\n                                                   checked=\"\">\n                                            <label for=\"demo-human2\">ninepic</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-copy3\" name=\"demo-copy3\" class=\"color2\">\n                                            <label for=\"demo-copy3\">users</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-human3\" name=\"demo-human3\" class=\"color2\"\n                                                   checked=\"\">\n                                            <label for=\"demo-human3\">ninepic</label>\n                                        </div>\n                                        <div class=\"field\" style=\"margin-top: 20px;\">\n                                            <ul class=\"actions\">\n                                                <li><input class=\"input-prev\" type=\"reset\" value=\"上一步\"></li>\n                                                <li><input class=\"input-next\" type=\"reset\" value=\"下一步\"></li>\n                                            </ul>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </section>\n                        <!-- Copyright -->\n                        <div class=\"copyright\">Copyright © 2018.Company name All rights reserved.<a target=\"_blank\"\n                                                                                                    href=\"https://github.com/chenhg5/go-admin\">GoAdmin</a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"slide\" id=\"slide3\">\n                <div class=\"page-wrapper\" style=\"margin-left: auto;margin-right:  auto;width: 1236px;\">\n                    <!-- Wrapper -->\n                    <div class=\"wrapper\" style=\"margin-left: auto;margin-right:  auto;\">\n                        <section class=\"panel color2-alt\">\n                            <div class=\"intro color2\">\n                                <h2 class=\"major\">设置字段</h2>\n                                <p>User表</p>\n                            </div>\n                            <div class=\"inner columns aligned\"\n                                 style=\"padding: 2.5rem 3.5rem 2rem 3.5rem;overflow-y: scroll;\">\n                                <div class=\"span-2-5\">\n                                    <form method=\"post\" action=\"#\">\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"id\" value=\"\" placeholder=\"字段显示名称\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\" id=\"demo-category-id\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy1\" name=\"demo1-copy1\" class=\"color2\">\n                                            <label for=\"demo1-copy1\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\" id=\"demo-category-name\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy2\" name=\"demo1-copy2\" class=\"color2\">\n                                            <label for=\"demo1-copy2\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy3\" name=\"demo1-copy3\" class=\"color2\">\n                                            <label for=\"demo1-copy3\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy4\" name=\"demo1-copy4\" class=\"color2\">\n                                            <label for=\"demo1-copy4\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy5\" name=\"demo1-copy5\" class=\"color2\">\n                                            <label for=\"demo1-copy5\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy6\" name=\"demo1-copy6\" class=\"color2\">\n                                            <label for=\"demo1-copy6\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy7\" name=\"demo1-copy7\" class=\"color2\">\n                                            <label for=\"demo1-copy7\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy8\" name=\"demo1-copy8\" class=\"color2\">\n                                            <label for=\"demo1-copy8\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy9\" name=\"demo1-copy9\" class=\"color2\">\n                                            <label for=\"demo1-copy9\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy10\" name=\"demo1-copy10\" class=\"color2\">\n                                            <label for=\"demo1-copy10\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy11\" name=\"demo1-copy11\" class=\"color2\">\n                                            <label for=\"demo1-copy11\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy12\" name=\"demo1-copy12\" class=\"color2\">\n                                            <label for=\"demo1-copy12\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"margin-top: 20px;\">\n                                            <ul class=\"actions\">\n                                                <li><input class=\"input-prev\" type=\"reset\" value=\"上一步\"></li>\n                                                <li><input class=\"input-next\" type=\"reset\" value=\"下一步\"></li>\n                                            </ul>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </section>\n                        <!-- Copyright -->\n                        <div class=\"copyright\">Copyright © 2018.Company name All rights reserved.<a target=\"_blank\"\n                                                                                                    href=\"https://github.com/chenhg5/go-admin\">GoAdmin</a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"slide\" id=\"slide4\">\n                <div class=\"page-wrapper\" style=\"margin-left: auto;margin-right:  auto;width: 1236px;\">\n                    <!-- Wrapper -->\n                    <div class=\"wrapper\" style=\"margin-left: auto;margin-right:  auto;\">\n                        <section class=\"panel color2-alt\">\n                            <div class=\"intro color2\">\n                                <h2 class=\"major\">设置超级管理员</h2>\n                                <p>超级管理员设置</p>\n                            </div>\n                            <div class=\"inner columns aligned\" style=\"padding: 2.5rem 3.5rem 2rem 3.5rem;\">\n                                <div class=\"span-2-5\">\n                                    <form method=\"post\" action=\"#\">\n                                        <div class=\"field\">\n                                            <label for=\"demo-name\">账号</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"username\" value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-email\">密码</label>\n                                            <input type=\"password\" name=\"demo-email\" id=\"password\" value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-email\">确认密码</label>\n                                            <input type=\"password\" name=\"demo-password_comfirm\" id=\"password_comfirm\"\n                                                   value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\" style=\"margin-top: 20px;\">\n                                            <ul class=\"actions\">\n                                                <li><input class=\"input-next\" type=\"reset\" value=\"Enjoy!\"></li>\n                                            </ul>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </section>\n                        <!-- Copyright -->\n                        <div class=\"copyright\">Copyright © 2018.Company name All rights reserved.<a target=\"_blank\"\n                                                                                                    href=\"https://github.com/chenhg5/go-admin\">GoAdmin</a>\n                        </div>\n                    </div>\n\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Scripts -->\n    <script src=\"../../assets/install/assets/js/jquery.min.js\"></script>\n    <script src=\"../../assets/install/assets/js/skel.min.js\"></script>\n    <script src=\"../../assets/install/assets/js/main.js\"></script>\n    <script src=\"../../assets/fullpage/fullpage.min.js\"></script>\n    <script type=\"text/javascript\">\n        var myFullpage = new fullpage('#fullpage', {\n            anchors: ['first'],\n            lazyLoad: true,\n            scrollBar: true,\n            autoScrolling: false\n        });\n\n        myFullpage.destroy();\n\n        $(\".input-next\").click(function (e) {\n            myFullpage.moveSlideRight()\n        });\n        $(\".input-prev\").click(function (e) {\n            myFullpage.moveSlideLeft()\n        });\n\n        /** 处理逻辑 **/\n\n        // 测试连接\n        $('#test-con-btn').on('click', function (e) {\n            e.preventDefault();\n            $.ajax({\n                dataType: 'json',\n                type: 'POST',\n                url: '/install/database/check',\n                async: 'true',\n                data: {\n                    'h': $(\"#db-host\").val(),\n                    'po': $(\"#db-port\").val(),\n                    'u': $(\"#db-username\").val(),\n                    'pa': $(\"#db-password\").val(),\n                    'db': $(\"#db-database\").val()\n                },\n                success: function (data) {\n                    console.log(data)\n                    if (data.code === 0) {\n\n                        // html = \"\";\n                        //\n                        // for (i = 0; i < data.data.list.length; i++) {\n                        //     html += '<div class=\"field\"><input type=\"checkbox\" id=\"' +\n                        //             data.data.list[i] +\n                        //             '\" name=\"table-' + i + '\" class=\"color2\"><label for=\"table-' + i + '\">' +\n                        //             data.data.list[i]\n                        //             + '</label></div>';\n                        // }\n                        //\n                        // $(\"#table-div\").html(html);\n\n                        alert(data.msg);\n\n                    } else {\n                        alert(data.msg);\n                    }\n                },\n                error: function (data) {\n                    alert(\"ok\");\n                }\n            });\n        });\n\n    </script>\n    <style>\n        .fp-controlArrow {\n            display: none;\n        }\n    </style>\n    </body>\n    </html>\n{{end}}"
  },
  {
    "path": "template/installation/template.go",
    "content": "package login\n\nvar List = map[string]string{\"installation\": `{{define \"installation\"}}\n    <html>\n    <head>\n        <title>GoAdmin Install</title>\n        <meta charset=\"utf-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n        <link rel=\"stylesheet\" href=\"../../assets/install/assets/css/main.css\">\n        <link rel=\"stylesheet\" href=\"../../assets/fullpage/fullpage.min.css\">\n        <noscript>\n            <link rel=\"stylesheet\" href=\"../../assets/install/assets/css/noscript.css\"/>\n        </noscript>\n    </head>\n    <body class=\"\">\n\n    <div id=\"fullpage\">\n        <div class=\"section active\" id=\"section1\">\n            <div class=\"slide\" id=\"slide1\">\n                <div class=\"page-wrapper\" style=\"margin-left: auto;margin-right:  auto;width: 1236px;\">\n                    <!-- Wrapper -->\n                    <div class=\"wrapper\" style=\"margin-left: auto;margin-right:  auto;\">\n                        <section class=\"panel color2-alt\">\n                            <div class=\"intro color2\">\n                                <h2 class=\"major\">数据库配置</h2>\n                                <p>目前仅支持Mysql</p>\n                            </div>\n                            <div class=\"inner columns aligned\" style=\"padding: 2.5rem 3.5rem 2rem 3.5rem;\">\n                                <div class=\"span-2-5\">\n                                    <form method=\"post\" action=\"#\">\n                                        <div class=\"field\" style=\"width: calc(73% - 0.75rem);\">\n                                            <label for=\"demo-name\">地址</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"db-host\" value=\"\"\n                                                   placeholder=\"127.0.0.1\">\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <label for=\"demo-email\">端口</label>\n                                            <input type=\"email\" name=\"demo-email\" id=\"db-port\" value=\"\"\n                                                   placeholder=\"3306\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-name\">账号</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"db-username\" value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-email\">密码</label>\n                                            <input type=\"password\" name=\"demo-email\" id=\"db-password\" value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-email\">数据库名</label>\n                                            <input type=\"text\" name=\"demo-email\" id=\"db-database\" value=\"\"\n                                                   placeholder=\"database\">\n                                        </div>\n                                        <div class=\"field\" style=\"margin-top: 20px;\">\n                                            <ul class=\"actions\">\n                                                <li><input id=\"test-con-btn\" type=\"submit\" value=\"连接测试\"\n                                                           class=\"special color2\"></li>\n                                                <li><input class=\"input-next\" type=\"reset\" value=\"下一步\"></li>\n                                            </ul>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </section>\n                        <!-- Copyright -->\n                        <div class=\"copyright\">Copyright © 2018.Company name All rights reserved.<a target=\"_blank\"\n                                                                                                    href=\"https://github.com/chenhg5/go-admin\">GoAdmin</a>\n                        </div>\n                    </div>\n\n                </div>\n            </div>\n            <div class=\"slide\" id=\"slide2\">\n                <div class=\"page-wrapper\" style=\"margin-left: auto;margin-right:  auto;width: 1236px;\">\n                    <!-- Wrapper -->\n                    <div class=\"wrapper\" style=\"margin-left: auto;margin-right:  auto;\">\n                        <section class=\"panel color2-alt\">\n                            <div class=\"intro color2\">\n                                <h2 class=\"major\">选择管理数据表</h2>\n                                <p>选择管理数据表</p>\n                            </div>\n                            <div class=\"inner columns aligned\" style=\"padding: 2.5rem 3.5rem 2rem 3.5rem;\">\n                                <div class=\"span-2-5\">\n                                    <form method=\"post\" action=\"#\" id=\"table-div\">\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-copy\" name=\"demo-copy\" class=\"color2\">\n                                            <label for=\"demo-copy\">users</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-human\" name=\"demo-human\" class=\"color2\"\n                                                   checked=\"\">\n                                            <label for=\"demo-human\">ninepic</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-copy1\" name=\"demo-copy1\" class=\"color2\">\n                                            <label for=\"demo-copy1\">users</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-human1\" name=\"demo-human1\" class=\"color2\"\n                                                   checked=\"\">\n                                            <label for=\"demo-human1\">ninepic</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-copy2\" name=\"demo-copy2\" class=\"color2\">\n                                            <label for=\"demo-copy2\">users</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-human2\" name=\"demo-human2\" class=\"color2\"\n                                                   checked=\"\">\n                                            <label for=\"demo-human2\">ninepic</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-copy3\" name=\"demo-copy3\" class=\"color2\">\n                                            <label for=\"demo-copy3\">users</label>\n                                        </div>\n                                        <div class=\"field quarter\">\n                                            <input type=\"checkbox\" id=\"demo-human3\" name=\"demo-human3\" class=\"color2\"\n                                                   checked=\"\">\n                                            <label for=\"demo-human3\">ninepic</label>\n                                        </div>\n                                        <div class=\"field\" style=\"margin-top: 20px;\">\n                                            <ul class=\"actions\">\n                                                <li><input class=\"input-prev\" type=\"reset\" value=\"上一步\"></li>\n                                                <li><input class=\"input-next\" type=\"reset\" value=\"下一步\"></li>\n                                            </ul>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </section>\n                        <!-- Copyright -->\n                        <div class=\"copyright\">Copyright © 2018.Company name All rights reserved.<a target=\"_blank\"\n                                                                                                    href=\"https://github.com/chenhg5/go-admin\">GoAdmin</a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"slide\" id=\"slide3\">\n                <div class=\"page-wrapper\" style=\"margin-left: auto;margin-right:  auto;width: 1236px;\">\n                    <!-- Wrapper -->\n                    <div class=\"wrapper\" style=\"margin-left: auto;margin-right:  auto;\">\n                        <section class=\"panel color2-alt\">\n                            <div class=\"intro color2\">\n                                <h2 class=\"major\">设置字段</h2>\n                                <p>User表</p>\n                            </div>\n                            <div class=\"inner columns aligned\"\n                                 style=\"padding: 2.5rem 3.5rem 2rem 3.5rem;overflow-y: scroll;\">\n                                <div class=\"span-2-5\">\n                                    <form method=\"post\" action=\"#\">\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"id\" value=\"\" placeholder=\"字段显示名称\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\" id=\"demo-category-id\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy1\" name=\"demo1-copy1\" class=\"color2\">\n                                            <label for=\"demo1-copy1\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\" id=\"demo-category-name\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy2\" name=\"demo1-copy2\" class=\"color2\">\n                                            <label for=\"demo1-copy2\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy3\" name=\"demo1-copy3\" class=\"color2\">\n                                            <label for=\"demo1-copy3\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy4\" name=\"demo1-copy4\" class=\"color2\">\n                                            <label for=\"demo1-copy4\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy5\" name=\"demo1-copy5\" class=\"color2\">\n                                            <label for=\"demo1-copy5\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy6\" name=\"demo1-copy6\" class=\"color2\">\n                                            <label for=\"demo1-copy6\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy7\" name=\"demo1-copy7\" class=\"color2\">\n                                            <label for=\"demo1-copy7\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy8\" name=\"demo1-copy8\" class=\"color2\">\n                                            <label for=\"demo1-copy8\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy9\" name=\"demo1-copy9\" class=\"color2\">\n                                            <label for=\"demo1-copy9\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy10\" name=\"demo1-copy10\" class=\"color2\">\n                                            <label for=\"demo1-copy10\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">id</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"id\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy11\" name=\"demo1-copy11\" class=\"color2\">\n                                            <label for=\"demo1-copy11\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"width: calc(38% - 0.5rem);\">\n                                            <label for=\"demo-name\">name</label>\n                                            <input type=\"text\" name=\"demo-name\" value=\"\" placeholder=\"name\">\n                                        </div>\n                                        <div class=\"field third\">\n                                            <label for=\"demo-category\">编辑表单类型</label>\n                                            <div class=\"select-wrapper\">\n                                                <select name=\"demo-category\">\n                                                    <option value=\"\">-</option>\n                                                    <option value=\"1\">显示</option>\n                                                    <option value=\"1\">Text</option>\n                                                    <option value=\"1\">Select</option>\n                                                </select>\n                                            </div>\n                                        </div>\n                                        <div class=\"field third\" style=\"margin-top: 40px;\">\n                                            <input type=\"checkbox\" id=\"demo1-copy12\" name=\"demo1-copy12\" class=\"color2\">\n                                            <label for=\"demo1-copy12\">取消</label>\n                                        </div>\n\n                                        <div class=\"field\" style=\"margin-top: 20px;\">\n                                            <ul class=\"actions\">\n                                                <li><input class=\"input-prev\" type=\"reset\" value=\"上一步\"></li>\n                                                <li><input class=\"input-next\" type=\"reset\" value=\"下一步\"></li>\n                                            </ul>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </section>\n                        <!-- Copyright -->\n                        <div class=\"copyright\">Copyright © 2018.Company name All rights reserved.<a target=\"_blank\"\n                                                                                                    href=\"https://github.com/chenhg5/go-admin\">GoAdmin</a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"slide\" id=\"slide4\">\n                <div class=\"page-wrapper\" style=\"margin-left: auto;margin-right:  auto;width: 1236px;\">\n                    <!-- Wrapper -->\n                    <div class=\"wrapper\" style=\"margin-left: auto;margin-right:  auto;\">\n                        <section class=\"panel color2-alt\">\n                            <div class=\"intro color2\">\n                                <h2 class=\"major\">设置超级管理员</h2>\n                                <p>超级管理员设置</p>\n                            </div>\n                            <div class=\"inner columns aligned\" style=\"padding: 2.5rem 3.5rem 2rem 3.5rem;\">\n                                <div class=\"span-2-5\">\n                                    <form method=\"post\" action=\"#\">\n                                        <div class=\"field\">\n                                            <label for=\"demo-name\">账号</label>\n                                            <input type=\"text\" name=\"demo-name\" id=\"username\" value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-email\">密码</label>\n                                            <input type=\"password\" name=\"demo-email\" id=\"password\" value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\">\n                                            <label for=\"demo-email\">确认密码</label>\n                                            <input type=\"password\" name=\"demo-password_comfirm\" id=\"password_comfirm\"\n                                                   value=\"\"\n                                                   placeholder=\"root\">\n                                        </div>\n                                        <div class=\"field\" style=\"margin-top: 20px;\">\n                                            <ul class=\"actions\">\n                                                <li><input class=\"input-next\" type=\"reset\" value=\"Enjoy!\"></li>\n                                            </ul>\n                                        </div>\n                                    </form>\n                                </div>\n                            </div>\n                        </section>\n                        <!-- Copyright -->\n                        <div class=\"copyright\">Copyright © 2018.Company name All rights reserved.<a target=\"_blank\"\n                                                                                                    href=\"https://github.com/chenhg5/go-admin\">GoAdmin</a>\n                        </div>\n                    </div>\n\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Scripts -->\n    <script src=\"../../assets/install/assets/js/jquery.min.js\"></script>\n    <script src=\"../../assets/install/assets/js/skel.min.js\"></script>\n    <script src=\"../../assets/install/assets/js/main.js\"></script>\n    <script src=\"../../assets/fullpage/fullpage.min.js\"></script>\n    <script type=\"text/javascript\">\n        var myFullpage = new fullpage('#fullpage', {\n            anchors: ['first'],\n            lazyLoad: true,\n            scrollBar: true,\n            autoScrolling: false\n        });\n\n        myFullpage.destroy();\n\n        $(\".input-next\").click(function (e) {\n            myFullpage.moveSlideRight()\n        });\n        $(\".input-prev\").click(function (e) {\n            myFullpage.moveSlideLeft()\n        });\n\n        /** 处理逻辑 **/\n\n        // 测试连接\n        $('#test-con-btn').on('click', function (e) {\n            e.preventDefault();\n            $.ajax({\n                dataType: 'json',\n                type: 'POST',\n                url: '/install/database/check',\n                async: 'true',\n                data: {\n                    'h': $(\"#db-host\").val(),\n                    'po': $(\"#db-port\").val(),\n                    'u': $(\"#db-username\").val(),\n                    'pa': $(\"#db-password\").val(),\n                    'db': $(\"#db-database\").val()\n                },\n                success: function (data) {\n                    console.log(data)\n                    if (data.code === 0) {\n\n                        // html = \"\";\n                        //\n                        // for (i = 0; i < data.data.list.length; i++) {\n                        //     html += '<div class=\"field\"><input type=\"checkbox\" id=\"' +\n                        //             data.data.list[i] +\n                        //             '\" name=\"table-' + i + '\" class=\"color2\"><label for=\"table-' + i + '\">' +\n                        //             data.data.list[i]\n                        //             + '</label></div>';\n                        // }\n                        //\n                        // $(\"#table-div\").html(html);\n\n                        alert(data.msg);\n\n                    } else {\n                        alert(data.msg);\n                    }\n                },\n                error: function (data) {\n                    alert(\"ok\");\n                }\n            });\n        });\n\n    </script>\n    <style>\n        .fp-controlArrow {\n            display: none;\n        }\n    </style>\n    </body>\n    </html>\n{{end}}`}\n"
  },
  {
    "path": "template/login/Makefile",
    "content": "all:\n\tfind ./ -name \".DS_Store\" -depth -exec rm {} \\;\n\tadm combine js --path=./assets/src/js/combine/ --out=./assets/login/dist/all.min.js\n\tadm combine css --path=./assets/src/css/ --out=./assets/login/dist/all.min.css\n\tadm compile asset --path=./assets/login/dist/ --out=./ --pa=login"
  },
  {
    "path": "template/login/assets/src/css/0_font.css",
    "content": "/* cyrillic-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 300;\n    src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN_r8OX-hpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 300;\n    src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN_r8OVuhpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 300;\n    src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN_r8OXuhpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 300;\n    src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN_r8OUehpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0370-03FF;\n}\n/* vietnamese */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 300;\n    src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN_r8OXehpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 300;\n    src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN_r8OXOhpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 300;\n    src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2');\n    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 400;\n    src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWJ0bf8pkAp6a.woff2) format('woff2');\n    unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 400;\n    src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFUZ0bf8pkAp6a.woff2) format('woff2');\n    unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 400;\n    src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWZ0bf8pkAp6a.woff2) format('woff2');\n    unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 400;\n    src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVp0bf8pkAp6a.woff2) format('woff2');\n    unicode-range: U+0370-03FF;\n}\n/* vietnamese */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 400;\n    src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWp0bf8pkAp6a.woff2) format('woff2');\n    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 400;\n    src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFW50bf8pkAp6a.woff2) format('woff2');\n    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 400;\n    src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0bf8pkAg.woff2) format('woff2');\n    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 700;\n    src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN7rgOX-hpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 700;\n    src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN7rgOVuhpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 700;\n    src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN7rgOXuhpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 700;\n    src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN7rgOUehpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0370-03FF;\n}\n/* vietnamese */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 700;\n    src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN7rgOXehpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 700;\n    src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN7rgOXOhpKKSTj5PW.woff2) format('woff2');\n    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n    font-family: 'Open Sans';\n    font-style: normal;\n    font-weight: 700;\n    src: local('Open Sans Bold'), local('OpenSans-Bold'), url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN7rgOUuhpKKSTjw.woff2) format('woff2');\n    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}"
  },
  {
    "path": "template/login/assets/src/css/2_animate.css",
    "content": "@charset \"UTF-8\";\n\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2015 Daniel Eden\n*/\n\n.animated {\n  -webkit-animation-duration: 1s;\n  animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n}\n.animated-fast {\n  -webkit-animation-duration: .5s;\n  animation-duration: .5s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n}\n\n.animated.infinite {\n  -webkit-animation-iteration-count: infinite;\n  animation-iteration-count: infinite;\n}\n\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n  animation-duration: 2s;\n}\n\n.animated.bounceIn,\n.animated.bounceOut {\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n}\n\n.animated.flipOutX,\n.animated.flipOutY {\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n}\n\n@-webkit-keyframes bounce {\n  from, 20%, 53%, 80%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    -webkit-transform: translate3d(0,0,0);\n    transform: translate3d(0,0,0);\n  }\n\n  40%, 43% {\n    -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n\n  70% {\n    -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0,-4px,0);\n    transform: translate3d(0,-4px,0);\n  }\n}\n\n@keyframes bounce {\n  from, 20%, 53%, 80%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    -webkit-transform: translate3d(0,0,0);\n    transform: translate3d(0,0,0);\n  }\n\n  40%, 43% {\n    -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n\n  70% {\n    -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0,-4px,0);\n    transform: translate3d(0,-4px,0);\n  }\n}\n\n.bounce {\n  -webkit-animation-name: bounce;\n  animation-name: bounce;\n  -webkit-transform-origin: center bottom;\n  transform-origin: center bottom;\n}\n\n@-webkit-keyframes flash {\n  from, 50%, to {\n    opacity: 1;\n  }\n\n  25%, 75% {\n    opacity: 0;\n  }\n}\n\n@keyframes flash {\n  from, 50%, to {\n    opacity: 1;\n  }\n\n  25%, 75% {\n    opacity: 0;\n  }\n}\n\n.flash {\n  -webkit-animation-name: flash;\n  animation-name: flash;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes pulse {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes pulse {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n.pulse {\n  -webkit-animation-name: pulse;\n  animation-name: pulse;\n}\n\n@-webkit-keyframes rubberBand {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n\n  65% {\n    -webkit-transform: scale3d(.95, 1.05, 1);\n    transform: scale3d(.95, 1.05, 1);\n  }\n\n  75% {\n    -webkit-transform: scale3d(1.05, .95, 1);\n    transform: scale3d(1.05, .95, 1);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes rubberBand {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n\n  65% {\n    -webkit-transform: scale3d(.95, 1.05, 1);\n    transform: scale3d(.95, 1.05, 1);\n  }\n\n  75% {\n    -webkit-transform: scale3d(1.05, .95, 1);\n    transform: scale3d(1.05, .95, 1);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n.rubberBand {\n  -webkit-animation-name: rubberBand;\n  animation-name: rubberBand;\n}\n\n@-webkit-keyframes shake {\n  from, to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  10%, 30%, 50%, 70%, 90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n\n  20%, 40%, 60%, 80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n\n@keyframes shake {\n  from, to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  10%, 30%, 50%, 70%, 90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n\n  20%, 40%, 60%, 80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n\n.shake {\n  -webkit-animation-name: shake;\n  animation-name: shake;\n}\n\n@-webkit-keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n\n  to {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n\n@keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n\n  to {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n\n.swing {\n  -webkit-transform-origin: top center;\n  transform-origin: top center;\n  -webkit-animation-name: swing;\n  animation-name: swing;\n}\n\n@-webkit-keyframes tada {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  10%, 20% {\n    -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n  }\n\n  30%, 50%, 70%, 90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n\n  40%, 60%, 80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes tada {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  10%, 20% {\n    -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n  }\n\n  30%, 50%, 70%, 90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n\n  40%, 60%, 80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n.tada {\n  -webkit-animation-name: tada;\n  animation-name: tada;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes wobble {\n  from {\n    -webkit-transform: none;\n    transform: none;\n  }\n\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes wobble {\n  from {\n    -webkit-transform: none;\n    transform: none;\n  }\n\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.wobble {\n  -webkit-animation-name: wobble;\n  animation-name: wobble;\n}\n\n@-webkit-keyframes jello {\n  from, 11.1%, to {\n    -webkit-transform: none;\n    transform: none;\n  }\n\n  22.2% {\n    -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);\n    transform: skewX(-12.5deg) skewY(-12.5deg);\n  }\n\n  33.3% {\n    -webkit-transform: skewX(6.25deg) skewY(6.25deg);\n    transform: skewX(6.25deg) skewY(6.25deg);\n  }\n\n  44.4% {\n    -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);\n    transform: skewX(-3.125deg) skewY(-3.125deg);\n  }\n\n  55.5% {\n    -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);\n    transform: skewX(1.5625deg) skewY(1.5625deg);\n  }\n\n  66.6% {\n    -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);\n    transform: skewX(-0.78125deg) skewY(-0.78125deg);\n  }\n\n  77.7% {\n    -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);\n    transform: skewX(0.390625deg) skewY(0.390625deg);\n  }\n\n  88.8% {\n    -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);\n    transform: skewX(-0.1953125deg) skewY(-0.1953125deg);\n  }\n}\n\n@keyframes jello {\n  from, 11.1%, to {\n    -webkit-transform: none;\n    transform: none;\n  }\n\n  22.2% {\n    -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);\n    transform: skewX(-12.5deg) skewY(-12.5deg);\n  }\n\n  33.3% {\n    -webkit-transform: skewX(6.25deg) skewY(6.25deg);\n    transform: skewX(6.25deg) skewY(6.25deg);\n  }\n\n  44.4% {\n    -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);\n    transform: skewX(-3.125deg) skewY(-3.125deg);\n  }\n\n  55.5% {\n    -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);\n    transform: skewX(1.5625deg) skewY(1.5625deg);\n  }\n\n  66.6% {\n    -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);\n    transform: skewX(-0.78125deg) skewY(-0.78125deg);\n  }\n\n  77.7% {\n    -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);\n    transform: skewX(0.390625deg) skewY(0.390625deg);\n  }\n\n  88.8% {\n    -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);\n    transform: skewX(-0.1953125deg) skewY(-0.1953125deg);\n  }\n}\n\n.jello {\n  -webkit-animation-name: jello;\n  animation-name: jello;\n  -webkit-transform-origin: center;\n  transform-origin: center;\n}\n\n@-webkit-keyframes bounceIn {\n  from, 20%, 40%, 60%, 80%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(.9, .9, .9);\n    transform: scale3d(.9, .9, .9);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n\n  80% {\n    -webkit-transform: scale3d(.97, .97, .97);\n    transform: scale3d(.97, .97, .97);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes bounceIn {\n  from, 20%, 40%, 60%, 80%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(.9, .9, .9);\n    transform: scale3d(.9, .9, .9);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n\n  80% {\n    -webkit-transform: scale3d(.97, .97, .97);\n    transform: scale3d(.97, .97, .97);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  animation-name: bounceIn;\n}\n\n@-webkit-keyframes bounceInDown {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes bounceInDown {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n\n@-webkit-keyframes bounceInLeft {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes bounceInLeft {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.bounceInLeft {\n  -webkit-animation-name: bounceInLeft;\n  animation-name: bounceInLeft;\n}\n\n@-webkit-keyframes bounceInRight {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes bounceInRight {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.bounceInRight {\n  -webkit-animation-name: bounceInRight;\n  animation-name: bounceInRight;\n}\n\n@-webkit-keyframes bounceInUp {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes bounceInUp {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.bounceInUp {\n  -webkit-animation-name: bounceInUp;\n  animation-name: bounceInUp;\n}\n\n@-webkit-keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(.9, .9, .9);\n    transform: scale3d(.9, .9, .9);\n  }\n\n  50%, 55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n}\n\n@keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(.9, .9, .9);\n    transform: scale3d(.9, .9, .9);\n  }\n\n  50%, 55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n}\n\n.bounceOut {\n  -webkit-animation-name: bounceOut;\n  animation-name: bounceOut;\n}\n\n@-webkit-keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n\n@keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n\n.bounceOutDown {\n  -webkit-animation-name: bounceOutDown;\n  animation-name: bounceOutDown;\n}\n\n@-webkit-keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n@keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n.bounceOutLeft {\n  -webkit-animation-name: bounceOutLeft;\n  animation-name: bounceOutLeft;\n}\n\n@-webkit-keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n@keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n.bounceOutRight {\n  -webkit-animation-name: bounceOutRight;\n  animation-name: bounceOutRight;\n}\n\n@-webkit-keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n\n@keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n\n.bounceOutUp {\n  -webkit-animation-name: bounceOutUp;\n  animation-name: bounceOutUp;\n}\n\n@-webkit-keyframes fadeIn {\n  from {\n    opacity: 0;\n    -ms-transform: scale(0.95);\n    -webkit-transform: scale(0.95);\n    transform: scale(0.95);\n  }\n\n  to {\n    opacity: 1;\n    -ms-transform: scale(1.0);\n    -webkit-transform: scale(1.0);\n    transform: scale(1.0);\n  }\n}\n\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n    -ms-transform: scale(0.95);\n    -webkit-transform: scale(0.95);\n    transform: scale(0.95);\n  }\n\n  to {\n    opacity: 1;\n    -ms-transform: scale(1.0);\n    -webkit-transform: scale(1.0);\n    transform: scale(1.0);\n  }\n}\n\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n\n@-webkit-keyframes fadeInDown {\n  from {\n    opacity: 0;\n    /*-webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);*/\n    -webkit-transform: translate3d(0, -50px, 0);\n    transform: translate3d(0, -50px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInDown {\n  from {\n    opacity: 0;\n    /*-webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);*/\n    -webkit-transform: translate3d(0, -50px, 0);\n    transform: translate3d(0, -50px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n\n@-webkit-keyframes fadeInDownBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInDownBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n\n@-webkit-keyframes fadeInLeft {\n  from {\n    opacity: 0;\n    /*-webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);*/\n    -webkit-transform: translate3d(-50px, 0, 0);\n    transform: translate3d(-50px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInLeft {\n  from {\n    opacity: 0;\n    /*-webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);*/\n    -webkit-transform: translate3d(-50px, 0, 0);\n    transform: translate3d(-50px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInLeft {\n  -webkit-animation-name: fadeInLeft;\n  animation-name: fadeInLeft;\n}\n\n@-webkit-keyframes fadeInLeftBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInLeftBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInLeftBig {\n  -webkit-animation-name: fadeInLeftBig;\n  animation-name: fadeInLeftBig;\n}\n\n@-webkit-keyframes fadeInRight {\n  from {\n    opacity: 0;\n    /*-webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);*/\n    -webkit-transform: translate3d(50px, 0, 0);\n    transform: translate3d(50px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInRight {\n  from {\n    opacity: 0;\n    /*-webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);*/\n    -webkit-transform: translate3d(50px, 0, 0);\n    transform: translate3d(50px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInRight {\n  -webkit-animation-name: fadeInRight;\n  animation-name: fadeInRight;\n}\n\n@-webkit-keyframes fadeInRightBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInRightBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInRightBig {\n  -webkit-animation-name: fadeInRightBig;\n  animation-name: fadeInRightBig;\n}\n\n@-webkit-keyframes fadeInUp {\n  from {\n    opacity: 0;\n    visibility: hidden;\n    /*-webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);*/\n    -webkit-transform: translate3d(0, 40px, 0);\n    transform: translate3d(0, 40px, 0);\n  }\n\n  to {\n    opacity: 1;\n    /*visibility: visible;*/\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInUp {\n  from {\n    opacity: 0;\n    visibility: hidden;\n    /*-webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);*/\n    -webkit-transform: translate3d(0, 40px, 0);\n    transform: translate3d(0, 40px, 0);\n  }\n\n  to {\n    visibility: visible;\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInUp {\n  -webkit-animation-name: fadeInUp;\n  animation-name: fadeInUp;\n}\n\n@-webkit-keyframes fadeInUpMenu {\n  from {\n    opacity: 0;\n    visibility: hidden;\n    /*-webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);*/\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n\n  to {\n    opacity: 1;\n    visibility: visible;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInUpMenu {\n  from {\n    opacity: 0;\n    visibility: hidden;\n    /*-webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);*/\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n\n  to {\n    visibility: visible;\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInUpMenu {\n  -webkit-animation-name: fadeInUpMenu;\n  animation-name: fadeInUpMenu;\n}\n\n@-webkit-keyframes fadeInUpBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInUpBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInUpBig {\n  -webkit-animation-name: fadeInUpBig;\n  animation-name: fadeInUpBig;\n}\n\n@-webkit-keyframes fadeOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n@keyframes fadeOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n.fadeOut {\n  -webkit-animation-name: fadeOut;\n  animation-name: fadeOut;\n}\n\n@-webkit-keyframes fadeOutDown {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 40px, 0);\n    transform: translate3d(0, 40px, 0);\n  }\n}\n\n@keyframes fadeOutDown {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 40px, 0);\n    transform: translate3d(0, 40px, 0);\n  }\n}\n\n.fadeOutDown {\n  -webkit-animation-name: fadeOutDown;\n  animation-name: fadeOutDown;\n}\n\n@-webkit-keyframes fadeOutDownBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n\n@keyframes fadeOutDownBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n\n.fadeOutDownBig {\n  -webkit-animation-name: fadeOutDownBig;\n  animation-name: fadeOutDownBig;\n}\n\n@-webkit-keyframes fadeOutLeft {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n@keyframes fadeOutLeft {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n.fadeOutLeft {\n  -webkit-animation-name: fadeOutLeft;\n  animation-name: fadeOutLeft;\n}\n\n@-webkit-keyframes fadeOutLeftBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n@keyframes fadeOutLeftBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n.fadeOutLeftBig {\n  -webkit-animation-name: fadeOutLeftBig;\n  animation-name: fadeOutLeftBig;\n}\n\n@-webkit-keyframes fadeOutRight {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n@keyframes fadeOutRight {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n.fadeOutRight {\n  -webkit-animation-name: fadeOutRight;\n  animation-name: fadeOutRight;\n}\n\n@-webkit-keyframes fadeOutRightBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n@keyframes fadeOutRightBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n.fadeOutRightBig {\n  -webkit-animation-name: fadeOutRightBig;\n  animation-name: fadeOutRightBig;\n}\n\n@-webkit-keyframes fadeOutUp {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n@keyframes fadeOutUp {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n.fadeOutUp {\n  -webkit-animation-name: fadeOutUp;\n  animation-name: fadeOutUp;\n}\n\n@-webkit-keyframes fadeOutUpBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n\n@keyframes fadeOutUpBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n\n.fadeOutUpBig {\n  -webkit-animation-name: fadeOutUpBig;\n  animation-name: fadeOutUpBig;\n}\n\n@-webkit-keyframes flip {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n    transform: perspective(400px) scale3d(.95, .95, .95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n\n@keyframes flip {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n    transform: perspective(400px) scale3d(.95, .95, .95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n\n.animated.flip {\n  -webkit-backface-visibility: visible;\n  backface-visibility: visible;\n  -webkit-animation-name: flip;\n  animation-name: flip;\n}\n\n@-webkit-keyframes flipInX {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n\n@keyframes flipInX {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n\n.flipInX {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipInX;\n  animation-name: flipInX;\n}\n\n@-webkit-keyframes flipInY {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n\n@keyframes flipInY {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n\n.flipInY {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipInY;\n  animation-name: flipInY;\n}\n\n@-webkit-keyframes flipOutX {\n  from {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes flipOutX {\n  from {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n.flipOutX {\n  -webkit-animation-name: flipOutX;\n  animation-name: flipOutX;\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n}\n\n@-webkit-keyframes flipOutY {\n  from {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes flipOutY {\n  from {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n.flipOutY {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipOutY;\n  animation-name: flipOutY;\n}\n\n@-webkit-keyframes lightSpeedIn {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes lightSpeedIn {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.lightSpeedIn {\n  -webkit-animation-name: lightSpeedIn;\n  animation-name: lightSpeedIn;\n  -webkit-animation-timing-function: ease-out;\n  animation-timing-function: ease-out;\n}\n\n@-webkit-keyframes lightSpeedOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n\n@keyframes lightSpeedOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n\n.lightSpeedOut {\n  -webkit-animation-name: lightSpeedOut;\n  animation-name: lightSpeedOut;\n  -webkit-animation-timing-function: ease-in;\n  animation-timing-function: ease-in;\n}\n\n@-webkit-keyframes rotateIn {\n  from {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateIn {\n  from {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateIn {\n  -webkit-animation-name: rotateIn;\n  animation-name: rotateIn;\n}\n\n@-webkit-keyframes rotateInDownLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInDownLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInDownLeft {\n  -webkit-animation-name: rotateInDownLeft;\n  animation-name: rotateInDownLeft;\n}\n\n@-webkit-keyframes rotateInDownRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInDownRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInDownRight {\n  -webkit-animation-name: rotateInDownRight;\n  animation-name: rotateInDownRight;\n}\n\n@-webkit-keyframes rotateInUpLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInUpLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInUpLeft {\n  -webkit-animation-name: rotateInUpLeft;\n  animation-name: rotateInUpLeft;\n}\n\n@-webkit-keyframes rotateInUpRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInUpRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInUpRight {\n  -webkit-animation-name: rotateInUpRight;\n  animation-name: rotateInUpRight;\n}\n\n@-webkit-keyframes rotateOut {\n  from {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOut {\n  from {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n\n.rotateOut {\n  -webkit-animation-name: rotateOut;\n  animation-name: rotateOut;\n}\n\n@-webkit-keyframes rotateOutDownLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutDownLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutDownLeft {\n  -webkit-animation-name: rotateOutDownLeft;\n  animation-name: rotateOutDownLeft;\n}\n\n@-webkit-keyframes rotateOutDownRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutDownRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutDownRight {\n  -webkit-animation-name: rotateOutDownRight;\n  animation-name: rotateOutDownRight;\n}\n\n@-webkit-keyframes rotateOutUpLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutUpLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutUpLeft {\n  -webkit-animation-name: rotateOutUpLeft;\n  animation-name: rotateOutUpLeft;\n}\n\n@-webkit-keyframes rotateOutUpRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutUpRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutUpRight {\n  -webkit-animation-name: rotateOutUpRight;\n  animation-name: rotateOutUpRight;\n}\n\n@-webkit-keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n\n  20%, 60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n\n  40%, 80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n\n@keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n\n  20%, 60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n\n  40%, 80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n\n.hinge {\n  -webkit-animation-name: hinge;\n  animation-name: hinge;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollIn {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes rollIn {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.rollIn {\n  -webkit-animation-name: rollIn;\n  animation-name: rollIn;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n\n@keyframes rollOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n\n.rollOut {\n  -webkit-animation-name: rollOut;\n  animation-name: rollOut;\n}\n\n@-webkit-keyframes zoomIn {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes zoomIn {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  50% {\n    opacity: 1;\n  }\n}\n\n.zoomIn {\n  -webkit-animation-name: zoomIn;\n  animation-name: zoomIn;\n}\n\n@-webkit-keyframes zoomInDown {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInDown {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInDown {\n  -webkit-animation-name: zoomInDown;\n  animation-name: zoomInDown;\n}\n\n@-webkit-keyframes zoomInLeft {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInLeft {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInLeft {\n  -webkit-animation-name: zoomInLeft;\n  animation-name: zoomInLeft;\n}\n\n@-webkit-keyframes zoomInRight {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInRight {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInRight {\n  -webkit-animation-name: zoomInRight;\n  animation-name: zoomInRight;\n}\n\n@-webkit-keyframes zoomInUp {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInUp {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInUp {\n  -webkit-animation-name: zoomInUp;\n  animation-name: zoomInUp;\n}\n\n@-webkit-keyframes zoomOut {\n  from {\n    opacity: 1;\n  }\n\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n@keyframes zoomOut {\n  from {\n    opacity: 1;\n  }\n\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n.zoomOut {\n  -webkit-animation-name: zoomOut;\n  animation-name: zoomOut;\n}\n\n@-webkit-keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomOutDown {\n  -webkit-animation-name: zoomOutDown;\n  animation-name: zoomOutDown;\n}\n\n@-webkit-keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n    transform: scale(.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n\n@keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n    transform: scale(.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n\n.zoomOutLeft {\n  -webkit-animation-name: zoomOutLeft;\n  animation-name: zoomOutLeft;\n}\n\n@-webkit-keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n    transform: scale(.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n\n@keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n    transform: scale(.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n\n.zoomOutRight {\n  -webkit-animation-name: zoomOutRight;\n  animation-name: zoomOutRight;\n}\n\n@-webkit-keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomOutUp {\n  -webkit-animation-name: zoomOutUp;\n  animation-name: zoomOutUp;\n}\n\n@-webkit-keyframes slideInDown {\n  from {\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideInDown {\n  from {\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n  animation-name: slideInDown;\n}\n\n@-webkit-keyframes slideInLeft {\n  from {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideInLeft {\n  from {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n  animation-name: slideInLeft;\n}\n\n@-webkit-keyframes slideInRight {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideInRight {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n  animation-name: slideInRight;\n}\n\n@-webkit-keyframes slideInUp {\n  from {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideInUp {\n  from {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n  animation-name: slideInUp;\n}\n\n@-webkit-keyframes slideOutDown {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n\n@keyframes slideOutDown {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n  animation-name: slideOutDown;\n}\n\n@-webkit-keyframes slideOutLeft {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n@keyframes slideOutLeft {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n  animation-name: slideOutLeft;\n}\n\n@-webkit-keyframes slideOutRight {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n@keyframes slideOutRight {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n  animation-name: slideOutRight;\n}\n\n@-webkit-keyframes slideOutUp {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n@keyframes slideOutUp {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n  animation-name: slideOutUp;\n}"
  },
  {
    "path": "template/login/assets/src/css/3_style.css",
    "content": "/* =======================================================\n*\n* \tTemplate Style \n*\tEdit this section\n*\n* ======================================================= */\nbody {\n  font-family: \"Open Sans\", Arial, sans-serif;\n  line-height: 1.5;\n  font-size: 16px;\n  color: #848484;\n  background-color: #f0f0f0;\n}\nbody.style-2 {\n  background-color: #ffffff;\n  background-size: cover;\n  background-position: -30% center;\n  background-repeat: no-repeat;\n  background-image: url(../images/bg_2.jpg);\n  height: 100%;\n}\nbody.style-3 {\n  background: #ffffff url(../images/geometry2.png) repeat;\n}\n\na {\n  color: #33cccc;\n  -moz-transition: all 0.3s ease;\n  -o-transition: all 0.3s ease;\n  -webkit-transition: all 0.3s ease;\n  -ms-transition: all 0.3s ease;\n  transition: all 0.3s ease;\n}\na:hover {\n  color: #29a3a3;\n}\n\n.menu {\n  padding: 0;\n  margin: 30px 0 0 0;\n}\n.menu li {\n  list-style: none;\n  margin-bottom: 10px;\n  display: -moz-inline-stack;\n  display: inline-block;\n  zoom: 1;\n  *display: inline;\n}\n.menu li a {\n  padding: 5px;\n}\n.menu li.active a {\n  color: #b3b3b3;\n}\n\n.fh5co-form {\n  padding: 30px;\n  margin-top: 4em;\n  -webkit-box-shadow: -4px 7px 46px 2px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: -4px 7px 46px 2px rgba(0, 0, 0, 0.1);\n  -o-box-shadow: -4px 7px 46px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: -4px 7px 46px 2px rgba(0, 0, 0, 0.1);\n  background: #ffffff;\n}\n.style-2 .fh5co-form {\n  -webkit-box-shadow: -4px 7px 46px 2px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: -4px 7px 46px 2px rgba(0, 0, 0, 0.1);\n  -o-box-shadow: -4px 7px 46px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: -4px 7px 46px 2px rgba(0, 0, 0, 0.1);\n}\n@media screen and (max-width: 768px) {\n  .fh5co-form {\n    padding: 15px;\n  }\n}\n.fh5co-form h2 {\n  text-transform: uppercase;\n  letter-spacing: 2px;\n  font-size: 20px;\n  margin: 0 0 30px 0;\n  color: #000000;\n}\n.fh5co-form .form-group {\n  margin-bottom: 30px;\n}\n.fh5co-form .form-group p {\n  font-size: 14px;\n  color: #9f9f9f;\n  font-weight: 300;\n}\n.fh5co-form .form-group p a {\n  color: #000000;\n}\n.fh5co-form label {\n  font-weight: 300;\n  font-size: 14px;\n  font-weight: 300;\n}\n.fh5co-form .form-control {\n  font-size: 16px;\n  font-weight: 300;\n  height: 50px;\n  padding-left: 0;\n  padding-right: 0;\n  border: none;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  -o-box-shadow: none;\n  box-shadow: none;\n  -webkit-border-radius: 0px;\n  -moz-border-radius: 0px;\n  -ms-border-radius: 0px;\n  border-radius: 0px;\n  -moz-transition: all 0.3s ease;\n  -o-transition: all 0.3s ease;\n  -webkit-transition: all 0.3s ease;\n  -ms-transition: all 0.3s ease;\n  transition: all 0.3s ease;\n}\n.fh5co-form .form-control::-webkit-input-placeholder {\n  color: rgba(0, 0, 0, 0.3);\n  text-transform: uppercase;\n}\n.fh5co-form .form-control::-moz-placeholder {\n  color: rgba(0, 0, 0, 0.3);\n  text-transform: uppercase;\n}\n.fh5co-form .form-control:-ms-input-placeholder {\n  color: rgba(0, 0, 0, 0.3);\n  text-transform: uppercase;\n}\n.copyrights{\n\ttext-indent:-9999px;\n\theight:0;\n\tline-height:0;\n\tfont-size:0;\n\toverflow:hidden;\n}\n.fh5co-form .form-control:-moz-placeholder {\n  color: rgba(0, 0, 0, 0.3);\n  text-transform: uppercase;\n}\n.fh5co-form .form-control:focus, .fh5co-form .form-control:active {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.4);\n}\n\n.btn-primary {\n  height: 50px;\n  padding-right: 20px;\n  padding-left: 20px;\n  border: none;\n  background: #33cccc;\n  color: #ffffff;\n  -webkit-box-shadow: -2px 10px 20px -1px rgba(51, 204, 204, 0.4);\n  -moz-box-shadow: -2px 10px 20px -1px rgba(51, 204, 204, 0.4);\n  -o-box-shadow: -2px 10px 20px -1px rgba(51, 204, 204, 0.4);\n  box-shadow: -2px 10px 20px -1px rgba(51, 204, 204, 0.4);\n}\n.btn-primary:hover, .btn-primary:focus, .btn-primary:active {\n  color: #ffffff;\n  background: #47d1d1 !important;\n  outline: none;\n}\n\ninput, textarea {\n  color: #000;\n}\n\n.placeholder {\n  color: #aaa;\n}\n\n.js .animate-box {\n  opacity: 0;\n}\n\n#particles-js {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  background-size: cover;\n  top: 0;\n  left: 0;\n  z-index: -1;\n}\n\nbody {\n  color: #ffffff !important;\n  background-color: #212121 !important\n}\n\n/*# sourceMappingURL=style.css.map */\n"
  },
  {
    "path": "template/login/assets/src/js/combine/3_particles.js",
    "content": "/* -----------------------------------------------\n/* Author : Vincent Garreau  - vincentgarreau.com\n/* MIT license: http://opensource.org/licenses/MIT\n/* Demo / Generator : vincentgarreau.com/particles.js\n/* GitHub : github.com/VincentGarreau/particles.js\n/* How to use? : Check the GitHub README\n/* v2.0.0\n/* ----------------------------------------------- */\nfunction hexToRgb(e){var a=/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;e=e.replace(a,function(e,a,t,i){return a+a+t+t+i+i});var t=/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}function clamp(e,a,t){return Math.min(Math.max(e,a),t)}function isInArray(e,a){return a.indexOf(e)>-1}var pJS=function(e,a){var t=document.querySelector(\"#\"+e+\" > .particles-js-canvas-el\");this.pJS={canvas:{el:t,w:t.offsetWidth,h:t.offsetHeight},particles:{number:{value:400,density:{enable:!0,value_area:800}},color:{value:\"#fff\"},shape:{type:\"circle\",stroke:{width:0,color:\"#ff0000\"},polygon:{nb_sides:5},image:{src:\"\",width:100,height:100}},opacity:{value:1,random:!1,anim:{enable:!1,speed:2,opacity_min:0,sync:!1}},size:{value:20,random:!1,anim:{enable:!1,speed:20,size_min:0,sync:!1}},line_linked:{enable:!0,distance:100,color:\"#fff\",opacity:1,width:1},move:{enable:!0,speed:2,direction:\"none\",random:!1,straight:!1,out_mode:\"out\",bounce:!1,attract:{enable:!1,rotateX:3e3,rotateY:3e3}},array:[]},interactivity:{detect_on:\"canvas\",events:{onhover:{enable:!0,mode:\"grab\"},onclick:{enable:!0,mode:\"push\"},resize:!0},modes:{grab:{distance:100,line_linked:{opacity:1}},bubble:{distance:200,size:80,duration:.4},repulse:{distance:200,duration:.4},push:{particles_nb:4},remove:{particles_nb:2}},mouse:{}},retina_detect:!1,fn:{interact:{},modes:{},vendors:{}},tmp:{}};var i=this.pJS;a&&Object.deepExtend(i,a),i.tmp.obj={size_value:i.particles.size.value,size_anim_speed:i.particles.size.anim.speed,move_speed:i.particles.move.speed,line_linked_distance:i.particles.line_linked.distance,line_linked_width:i.particles.line_linked.width,mode_grab_distance:i.interactivity.modes.grab.distance,mode_bubble_distance:i.interactivity.modes.bubble.distance,mode_bubble_size:i.interactivity.modes.bubble.size,mode_repulse_distance:i.interactivity.modes.repulse.distance},i.fn.retinaInit=function(){i.retina_detect&&window.devicePixelRatio>1?(i.canvas.pxratio=window.devicePixelRatio,i.tmp.retina=!0):(i.canvas.pxratio=1,i.tmp.retina=!1),i.canvas.w=i.canvas.el.offsetWidth*i.canvas.pxratio,i.canvas.h=i.canvas.el.offsetHeight*i.canvas.pxratio,i.particles.size.value=i.tmp.obj.size_value*i.canvas.pxratio,i.particles.size.anim.speed=i.tmp.obj.size_anim_speed*i.canvas.pxratio,i.particles.move.speed=i.tmp.obj.move_speed*i.canvas.pxratio,i.particles.line_linked.distance=i.tmp.obj.line_linked_distance*i.canvas.pxratio,i.interactivity.modes.grab.distance=i.tmp.obj.mode_grab_distance*i.canvas.pxratio,i.interactivity.modes.bubble.distance=i.tmp.obj.mode_bubble_distance*i.canvas.pxratio,i.particles.line_linked.width=i.tmp.obj.line_linked_width*i.canvas.pxratio,i.interactivity.modes.bubble.size=i.tmp.obj.mode_bubble_size*i.canvas.pxratio,i.interactivity.modes.repulse.distance=i.tmp.obj.mode_repulse_distance*i.canvas.pxratio},i.fn.canvasInit=function(){i.canvas.ctx=i.canvas.el.getContext(\"2d\")},i.fn.canvasSize=function(){i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i&&i.interactivity.events.resize&&window.addEventListener(\"resize\",function(){i.canvas.w=i.canvas.el.offsetWidth,i.canvas.h=i.canvas.el.offsetHeight,i.tmp.retina&&(i.canvas.w*=i.canvas.pxratio,i.canvas.h*=i.canvas.pxratio),i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i.particles.move.enable||(i.fn.particlesEmpty(),i.fn.particlesCreate(),i.fn.particlesDraw(),i.fn.vendors.densityAutoParticles()),i.fn.vendors.densityAutoParticles()})},i.fn.canvasPaint=function(){i.canvas.ctx.fillRect(0,0,i.canvas.w,i.canvas.h)},i.fn.canvasClear=function(){i.canvas.ctx.clearRect(0,0,i.canvas.w,i.canvas.h)},i.fn.particle=function(e,a,t){if(this.radius=(i.particles.size.random?Math.random():1)*i.particles.size.value,i.particles.size.anim.enable&&(this.size_status=!1,this.vs=i.particles.size.anim.speed/100,i.particles.size.anim.sync||(this.vs=this.vs*Math.random())),this.x=t?t.x:Math.random()*i.canvas.w,this.y=t?t.y:Math.random()*i.canvas.h,this.x>i.canvas.w-2*this.radius?this.x=this.x-this.radius:this.x<2*this.radius&&(this.x=this.x+this.radius),this.y>i.canvas.h-2*this.radius?this.y=this.y-this.radius:this.y<2*this.radius&&(this.y=this.y+this.radius),i.particles.move.bounce&&i.fn.vendors.checkOverlap(this,t),this.color={},\"object\"==typeof e.value)if(e.value instanceof Array){var s=e.value[Math.floor(Math.random()*i.particles.color.value.length)];this.color.rgb=hexToRgb(s)}else void 0!=e.value.r&&void 0!=e.value.g&&void 0!=e.value.b&&(this.color.rgb={r:e.value.r,g:e.value.g,b:e.value.b}),void 0!=e.value.h&&void 0!=e.value.s&&void 0!=e.value.l&&(this.color.hsl={h:e.value.h,s:e.value.s,l:e.value.l});else\"random\"==e.value?this.color.rgb={r:Math.floor(256*Math.random())+0,g:Math.floor(256*Math.random())+0,b:Math.floor(256*Math.random())+0}:\"string\"==typeof e.value&&(this.color=e,this.color.rgb=hexToRgb(this.color.value));this.opacity=(i.particles.opacity.random?Math.random():1)*i.particles.opacity.value,i.particles.opacity.anim.enable&&(this.opacity_status=!1,this.vo=i.particles.opacity.anim.speed/100,i.particles.opacity.anim.sync||(this.vo=this.vo*Math.random()));var n={};switch(i.particles.move.direction){case\"top\":n={x:0,y:-1};break;case\"top-right\":n={x:.5,y:-.5};break;case\"right\":n={x:1,y:-0};break;case\"bottom-right\":n={x:.5,y:.5};break;case\"bottom\":n={x:0,y:1};break;case\"bottom-left\":n={x:-.5,y:1};break;case\"left\":n={x:-1,y:0};break;case\"top-left\":n={x:-.5,y:-.5};break;default:n={x:0,y:0}}i.particles.move.straight?(this.vx=n.x,this.vy=n.y,i.particles.move.random&&(this.vx=this.vx*Math.random(),this.vy=this.vy*Math.random())):(this.vx=n.x+Math.random()-.5,this.vy=n.y+Math.random()-.5),this.vx_i=this.vx,this.vy_i=this.vy;var r=i.particles.shape.type;if(\"object\"==typeof r){if(r instanceof Array){var c=r[Math.floor(Math.random()*r.length)];this.shape=c}}else this.shape=r;if(\"image\"==this.shape){var o=i.particles.shape;this.img={src:o.image.src,ratio:o.image.width/o.image.height},this.img.ratio||(this.img.ratio=1),\"svg\"==i.tmp.img_type&&void 0!=i.tmp.source_svg&&(i.fn.vendors.createSvgImg(this),i.tmp.pushing&&(this.img.loaded=!1))}},i.fn.particle.prototype.draw=function(){function e(){i.canvas.ctx.drawImage(r,a.x-t,a.y-t,2*t,2*t/a.img.ratio)}var a=this;if(void 0!=a.radius_bubble)var t=a.radius_bubble;else var t=a.radius;if(void 0!=a.opacity_bubble)var s=a.opacity_bubble;else var s=a.opacity;if(a.color.rgb)var n=\"rgba(\"+a.color.rgb.r+\",\"+a.color.rgb.g+\",\"+a.color.rgb.b+\",\"+s+\")\";else var n=\"hsla(\"+a.color.hsl.h+\",\"+a.color.hsl.s+\"%,\"+a.color.hsl.l+\"%,\"+s+\")\";switch(i.canvas.ctx.fillStyle=n,i.canvas.ctx.beginPath(),a.shape){case\"circle\":i.canvas.ctx.arc(a.x,a.y,t,0,2*Math.PI,!1);break;case\"edge\":i.canvas.ctx.rect(a.x-t,a.y-t,2*t,2*t);break;case\"triangle\":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t,a.y+t/1.66,2*t,3,2);break;case\"polygon\":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t/(i.particles.shape.polygon.nb_sides/3.5),a.y-t/.76,2.66*t/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,1);break;case\"star\":i.fn.vendors.drawShape(i.canvas.ctx,a.x-2*t/(i.particles.shape.polygon.nb_sides/4),a.y-t/1.52,2*t*2.66/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,2);break;case\"image\":if(\"svg\"==i.tmp.img_type)var r=a.img.obj;else var r=i.tmp.img_obj;r&&e()}i.canvas.ctx.closePath(),i.particles.shape.stroke.width>0&&(i.canvas.ctx.strokeStyle=i.particles.shape.stroke.color,i.canvas.ctx.lineWidth=i.particles.shape.stroke.width,i.canvas.ctx.stroke()),i.canvas.ctx.fill()},i.fn.particlesCreate=function(){for(var e=0;e<i.particles.number.value;e++)i.particles.array.push(new i.fn.particle(i.particles.color,i.particles.opacity.value))},i.fn.particlesUpdate=function(){for(var e=0;e<i.particles.array.length;e++){var a=i.particles.array[e];if(i.particles.move.enable){var t=i.particles.move.speed/2;a.x+=a.vx*t,a.y+=a.vy*t}if(i.particles.opacity.anim.enable&&(1==a.opacity_status?(a.opacity>=i.particles.opacity.value&&(a.opacity_status=!1),a.opacity+=a.vo):(a.opacity<=i.particles.opacity.anim.opacity_min&&(a.opacity_status=!0),a.opacity-=a.vo),a.opacity<0&&(a.opacity=0)),i.particles.size.anim.enable&&(1==a.size_status?(a.radius>=i.particles.size.value&&(a.size_status=!1),a.radius+=a.vs):(a.radius<=i.particles.size.anim.size_min&&(a.size_status=!0),a.radius-=a.vs),a.radius<0&&(a.radius=0)),\"bounce\"==i.particles.move.out_mode)var s={x_left:a.radius,x_right:i.canvas.w,y_top:a.radius,y_bottom:i.canvas.h};else var s={x_left:-a.radius,x_right:i.canvas.w+a.radius,y_top:-a.radius,y_bottom:i.canvas.h+a.radius};switch(a.x-a.radius>i.canvas.w?(a.x=s.x_left,a.y=Math.random()*i.canvas.h):a.x+a.radius<0&&(a.x=s.x_right,a.y=Math.random()*i.canvas.h),a.y-a.radius>i.canvas.h?(a.y=s.y_top,a.x=Math.random()*i.canvas.w):a.y+a.radius<0&&(a.y=s.y_bottom,a.x=Math.random()*i.canvas.w),i.particles.move.out_mode){case\"bounce\":a.x+a.radius>i.canvas.w?a.vx=-a.vx:a.x-a.radius<0&&(a.vx=-a.vx),a.y+a.radius>i.canvas.h?a.vy=-a.vy:a.y-a.radius<0&&(a.vy=-a.vy)}if(isInArray(\"grab\",i.interactivity.events.onhover.mode)&&i.fn.modes.grabParticle(a),(isInArray(\"bubble\",i.interactivity.events.onhover.mode)||isInArray(\"bubble\",i.interactivity.events.onclick.mode))&&i.fn.modes.bubbleParticle(a),(isInArray(\"repulse\",i.interactivity.events.onhover.mode)||isInArray(\"repulse\",i.interactivity.events.onclick.mode))&&i.fn.modes.repulseParticle(a),i.particles.line_linked.enable||i.particles.move.attract.enable)for(var n=e+1;n<i.particles.array.length;n++){var r=i.particles.array[n];i.particles.line_linked.enable&&i.fn.interact.linkParticles(a,r),i.particles.move.attract.enable&&i.fn.interact.attractParticles(a,r),i.particles.move.bounce&&i.fn.interact.bounceParticles(a,r)}}},i.fn.particlesDraw=function(){i.canvas.ctx.clearRect(0,0,i.canvas.w,i.canvas.h),i.fn.particlesUpdate();for(var e=0;e<i.particles.array.length;e++){var a=i.particles.array[e];a.draw()}},i.fn.particlesEmpty=function(){i.particles.array=[]},i.fn.particlesRefresh=function(){cancelRequestAnimFrame(i.fn.checkAnimFrame),cancelRequestAnimFrame(i.fn.drawAnimFrame),i.tmp.source_svg=void 0,i.tmp.img_obj=void 0,i.tmp.count_svg=0,i.fn.particlesEmpty(),i.fn.canvasClear(),i.fn.vendors.start()},i.fn.interact.linkParticles=function(e,a){var t=e.x-a.x,s=e.y-a.y,n=Math.sqrt(t*t+s*s);if(n<=i.particles.line_linked.distance){var r=i.particles.line_linked.opacity-n/(1/i.particles.line_linked.opacity)/i.particles.line_linked.distance;if(r>0){var c=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle=\"rgba(\"+c.r+\",\"+c.g+\",\"+c.b+\",\"+r+\")\",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(a.x,a.y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}},i.fn.interact.attractParticles=function(e,a){var t=e.x-a.x,s=e.y-a.y,n=Math.sqrt(t*t+s*s);if(n<=i.particles.line_linked.distance){var r=t/(1e3*i.particles.move.attract.rotateX),c=s/(1e3*i.particles.move.attract.rotateY);e.vx-=r,e.vy-=c,a.vx+=r,a.vy+=c}},i.fn.interact.bounceParticles=function(e,a){var t=e.x-a.x,i=e.y-a.y,s=Math.sqrt(t*t+i*i),n=e.radius+a.radius;n>=s&&(e.vx=-e.vx,e.vy=-e.vy,a.vx=-a.vx,a.vy=-a.vy)},i.fn.modes.pushParticles=function(e,a){i.tmp.pushing=!0;for(var t=0;e>t;t++)i.particles.array.push(new i.fn.particle(i.particles.color,i.particles.opacity.value,{x:a?a.pos_x:Math.random()*i.canvas.w,y:a?a.pos_y:Math.random()*i.canvas.h})),t==e-1&&(i.particles.move.enable||i.fn.particlesDraw(),i.tmp.pushing=!1)},i.fn.modes.removeParticles=function(e){i.particles.array.splice(0,e),i.particles.move.enable||i.fn.particlesDraw()},i.fn.modes.bubbleParticle=function(e){function a(){e.opacity_bubble=e.opacity,e.radius_bubble=e.radius}function t(a,t,s,n,c){if(a!=t)if(i.tmp.bubble_duration_end){if(void 0!=s){var o=n-p*(n-a)/i.interactivity.modes.bubble.duration,l=a-o;d=a+l,\"size\"==c&&(e.radius_bubble=d),\"opacity\"==c&&(e.opacity_bubble=d)}}else if(r<=i.interactivity.modes.bubble.distance){if(void 0!=s)var v=s;else var v=n;if(v!=a){var d=n-p*(n-a)/i.interactivity.modes.bubble.duration;\"size\"==c&&(e.radius_bubble=d),\"opacity\"==c&&(e.opacity_bubble=d)}}else\"size\"==c&&(e.radius_bubble=void 0),\"opacity\"==c&&(e.opacity_bubble=void 0)}if(i.interactivity.events.onhover.enable&&isInArray(\"bubble\",i.interactivity.events.onhover.mode)){var s=e.x-i.interactivity.mouse.pos_x,n=e.y-i.interactivity.mouse.pos_y,r=Math.sqrt(s*s+n*n),c=1-r/i.interactivity.modes.bubble.distance;if(r<=i.interactivity.modes.bubble.distance){if(c>=0&&\"mousemove\"==i.interactivity.status){if(i.interactivity.modes.bubble.size!=i.particles.size.value)if(i.interactivity.modes.bubble.size>i.particles.size.value){var o=e.radius+i.interactivity.modes.bubble.size*c;o>=0&&(e.radius_bubble=o)}else{var l=e.radius-i.interactivity.modes.bubble.size,o=e.radius-l*c;o>0?e.radius_bubble=o:e.radius_bubble=0}if(i.interactivity.modes.bubble.opacity!=i.particles.opacity.value)if(i.interactivity.modes.bubble.opacity>i.particles.opacity.value){var v=i.interactivity.modes.bubble.opacity*c;v>e.opacity&&v<=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}else{var v=e.opacity-(i.particles.opacity.value-i.interactivity.modes.bubble.opacity)*c;v<e.opacity&&v>=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}}}else a();\"mouseleave\"==i.interactivity.status&&a()}else if(i.interactivity.events.onclick.enable&&isInArray(\"bubble\",i.interactivity.events.onclick.mode)){if(i.tmp.bubble_clicking){var s=e.x-i.interactivity.mouse.click_pos_x,n=e.y-i.interactivity.mouse.click_pos_y,r=Math.sqrt(s*s+n*n),p=((new Date).getTime()-i.interactivity.mouse.click_time)/1e3;p>i.interactivity.modes.bubble.duration&&(i.tmp.bubble_duration_end=!0),p>2*i.interactivity.modes.bubble.duration&&(i.tmp.bubble_clicking=!1,i.tmp.bubble_duration_end=!1)}i.tmp.bubble_clicking&&(t(i.interactivity.modes.bubble.size,i.particles.size.value,e.radius_bubble,e.radius,\"size\"),t(i.interactivity.modes.bubble.opacity,i.particles.opacity.value,e.opacity_bubble,e.opacity,\"opacity\"))}},i.fn.modes.repulseParticle=function(e){function a(){var a=Math.atan2(d,p);if(e.vx=u*Math.cos(a),e.vy=u*Math.sin(a),\"bounce\"==i.particles.move.out_mode){var t={x:e.x+e.vx,y:e.y+e.vy};t.x+e.radius>i.canvas.w?e.vx=-e.vx:t.x-e.radius<0&&(e.vx=-e.vx),t.y+e.radius>i.canvas.h?e.vy=-e.vy:t.y-e.radius<0&&(e.vy=-e.vy)}}if(i.interactivity.events.onhover.enable&&isInArray(\"repulse\",i.interactivity.events.onhover.mode)&&\"mousemove\"==i.interactivity.status){var t=e.x-i.interactivity.mouse.pos_x,s=e.y-i.interactivity.mouse.pos_y,n=Math.sqrt(t*t+s*s),r={x:t/n,y:s/n},c=i.interactivity.modes.repulse.distance,o=100,l=clamp(1/c*(-1*Math.pow(n/c,2)+1)*c*o,0,50),v={x:e.x+r.x*l,y:e.y+r.y*l};\"bounce\"==i.particles.move.out_mode?(v.x-e.radius>0&&v.x+e.radius<i.canvas.w&&(e.x=v.x),v.y-e.radius>0&&v.y+e.radius<i.canvas.h&&(e.y=v.y)):(e.x=v.x,e.y=v.y)}else if(i.interactivity.events.onclick.enable&&isInArray(\"repulse\",i.interactivity.events.onclick.mode))if(i.tmp.repulse_finish||(i.tmp.repulse_count++,i.tmp.repulse_count==i.particles.array.length&&(i.tmp.repulse_finish=!0)),i.tmp.repulse_clicking){var c=Math.pow(i.interactivity.modes.repulse.distance/6,3),p=i.interactivity.mouse.click_pos_x-e.x,d=i.interactivity.mouse.click_pos_y-e.y,m=p*p+d*d,u=-c/m*1;c>=m&&a()}else 0==i.tmp.repulse_clicking&&(e.vx=e.vx_i,e.vy=e.vy_i)},i.fn.modes.grabParticle=function(e){if(i.interactivity.events.onhover.enable&&\"mousemove\"==i.interactivity.status){var a=e.x-i.interactivity.mouse.pos_x,t=e.y-i.interactivity.mouse.pos_y,s=Math.sqrt(a*a+t*t);if(s<=i.interactivity.modes.grab.distance){var n=i.interactivity.modes.grab.line_linked.opacity-s/(1/i.interactivity.modes.grab.line_linked.opacity)/i.interactivity.modes.grab.distance;if(n>0){var r=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle=\"rgba(\"+r.r+\",\"+r.g+\",\"+r.b+\",\"+n+\")\",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(i.interactivity.mouse.pos_x,i.interactivity.mouse.pos_y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}}},i.fn.vendors.eventsListeners=function(){\"window\"==i.interactivity.detect_on?i.interactivity.el=window:i.interactivity.el=i.canvas.el,(i.interactivity.events.onhover.enable||i.interactivity.events.onclick.enable)&&(i.interactivity.el.addEventListener(\"mousemove\",function(e){if(i.interactivity.el==window)var a=e.clientX,t=e.clientY;else var a=e.offsetX||e.clientX,t=e.offsetY||e.clientY;i.interactivity.mouse.pos_x=a,i.interactivity.mouse.pos_y=t,i.tmp.retina&&(i.interactivity.mouse.pos_x*=i.canvas.pxratio,i.interactivity.mouse.pos_y*=i.canvas.pxratio),i.interactivity.status=\"mousemove\"}),i.interactivity.el.addEventListener(\"mouseleave\",function(e){i.interactivity.mouse.pos_x=null,i.interactivity.mouse.pos_y=null,i.interactivity.status=\"mouseleave\"})),i.interactivity.events.onclick.enable&&i.interactivity.el.addEventListener(\"click\",function(){if(i.interactivity.mouse.click_pos_x=i.interactivity.mouse.pos_x,i.interactivity.mouse.click_pos_y=i.interactivity.mouse.pos_y,i.interactivity.mouse.click_time=(new Date).getTime(),i.interactivity.events.onclick.enable)switch(i.interactivity.events.onclick.mode){case\"push\":i.particles.move.enable?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):1==i.interactivity.modes.push.particles_nb?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):i.interactivity.modes.push.particles_nb>1&&i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb);break;case\"remove\":i.fn.modes.removeParticles(i.interactivity.modes.remove.particles_nb);break;case\"bubble\":i.tmp.bubble_clicking=!0;break;case\"repulse\":i.tmp.repulse_clicking=!0,i.tmp.repulse_count=0,i.tmp.repulse_finish=!1,setTimeout(function(){i.tmp.repulse_clicking=!1},1e3*i.interactivity.modes.repulse.duration)}})},i.fn.vendors.densityAutoParticles=function(){if(i.particles.number.density.enable){var e=i.canvas.el.width*i.canvas.el.height/1e3;i.tmp.retina&&(e/=2*i.canvas.pxratio);var a=e*i.particles.number.value/i.particles.number.density.value_area,t=i.particles.array.length-a;0>t?i.fn.modes.pushParticles(Math.abs(t)):i.fn.modes.removeParticles(t)}},i.fn.vendors.checkOverlap=function(e,a){for(var t=0;t<i.particles.array.length;t++){var s=i.particles.array[t],n=e.x-s.x,r=e.y-s.y,c=Math.sqrt(n*n+r*r);c<=e.radius+s.radius&&(e.x=a?a.x:Math.random()*i.canvas.w,e.y=a?a.y:Math.random()*i.canvas.h,i.fn.vendors.checkOverlap(e))}},i.fn.vendors.createSvgImg=function(e){var a=i.tmp.source_svg,t=/#([0-9A-F]{3,6})/gi,s=a.replace(t,function(a,t,i,s){if(e.color.rgb)var n=\"rgba(\"+e.color.rgb.r+\",\"+e.color.rgb.g+\",\"+e.color.rgb.b+\",\"+e.opacity+\")\";else var n=\"hsla(\"+e.color.hsl.h+\",\"+e.color.hsl.s+\"%,\"+e.color.hsl.l+\"%,\"+e.opacity+\")\";return n}),n=new Blob([s],{type:\"image/svg+xml;charset=utf-8\"}),r=window.URL||window.webkitURL||window,c=r.createObjectURL(n),o=new Image;o.addEventListener(\"load\",function(){e.img.obj=o,e.img.loaded=!0,r.revokeObjectURL(c),i.tmp.count_svg++}),o.src=c},i.fn.vendors.destroypJS=function(){cancelAnimationFrame(i.fn.drawAnimFrame),t.remove(),pJSDom=null},i.fn.vendors.drawShape=function(e,a,t,i,s,n){var r=s*n,c=s/n,o=180*(c-2)/c,l=Math.PI-Math.PI*o/180;e.save(),e.beginPath(),e.translate(a,t),e.moveTo(0,0);for(var v=0;r>v;v++)e.lineTo(i,0),e.translate(i,0),e.rotate(l);e.fill(),e.restore()},i.fn.vendors.exportImg=function(){window.open(i.canvas.el.toDataURL(\"image/png\"),\"_blank\")},i.fn.vendors.loadImg=function(e){if(i.tmp.img_error=void 0,\"\"!=i.particles.shape.image.src)if(\"svg\"==e){var a=new XMLHttpRequest;a.open(\"GET\",i.particles.shape.image.src),a.onreadystatechange=function(e){4==a.readyState&&(200==a.status?(i.tmp.source_svg=e.currentTarget.response,i.fn.vendors.checkBeforeDraw()):(console.log(\"Error pJS - Image not found\"),i.tmp.img_error=!0))},a.send()}else{var t=new Image;t.addEventListener(\"load\",function(){i.tmp.img_obj=t,i.fn.vendors.checkBeforeDraw()}),t.src=i.particles.shape.image.src}else console.log(\"Error pJS - No image.src\"),i.tmp.img_error=!0},i.fn.vendors.draw=function(){\"image\"==i.particles.shape.type?\"svg\"==i.tmp.img_type?i.tmp.count_svg>=i.particles.number.value?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):void 0!=i.tmp.img_obj?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame))},i.fn.vendors.checkBeforeDraw=function(){\"image\"==i.particles.shape.type?\"svg\"==i.tmp.img_type&&void 0==i.tmp.source_svg?i.tmp.checkAnimFrame=requestAnimFrame(check):(cancelRequestAnimFrame(i.tmp.checkAnimFrame),i.tmp.img_error||(i.fn.vendors.init(),i.fn.vendors.draw())):(i.fn.vendors.init(),i.fn.vendors.draw())},i.fn.vendors.init=function(){i.fn.retinaInit(),i.fn.canvasInit(),i.fn.canvasSize(),i.fn.canvasPaint(),i.fn.particlesCreate(),i.fn.vendors.densityAutoParticles(),i.particles.line_linked.color_rgb_line=hexToRgb(i.particles.line_linked.color)},i.fn.vendors.start=function(){isInArray(\"image\",i.particles.shape.type)?(i.tmp.img_type=i.particles.shape.image.src.substr(i.particles.shape.image.src.length-3),i.fn.vendors.loadImg(i.tmp.img_type)):i.fn.vendors.checkBeforeDraw()},i.fn.vendors.eventsListeners(),i.fn.vendors.start()};Object.deepExtend=function(e,a){for(var t in a)a[t]&&a[t].constructor&&a[t].constructor===Object?(e[t]=e[t]||{},arguments.callee(e[t],a[t])):e[t]=a[t];return e},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}}(),window.cancelRequestAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout}(),window.pJSDom=[],window.particlesJS=function(e,a){\"string\"!=typeof e&&(a=e,e=\"particles-js\"),e||(e=\"particles-js\");var t=document.getElementById(e),i=\"particles-js-canvas-el\",s=t.getElementsByClassName(i);if(s.length)for(;s.length>0;)t.removeChild(s[0]);var n=document.createElement(\"canvas\");n.className=i,n.style.width=\"100%\",n.style.height=\"100%\";var r=document.getElementById(e).appendChild(n);null!=r&&pJSDom.push(new pJS(e,a))},window.particlesJS.load=function(e,a,t){var i=new XMLHttpRequest;i.open(\"GET\",a),i.onreadystatechange=function(a){if(4==i.readyState)if(200==i.status){var s=JSON.parse(a.currentTarget.response);window.particlesJS(e,s),t&&t()}else console.log(\"Error pJS - XMLHttpRequest status: \"+i.status),console.log(\"Error pJS - File config not found\")},i.send()};"
  },
  {
    "path": "template/login/assets/src/js/combine/4_main.js",
    "content": "particlesJS('particles-js',\n\t{\n\t\t\"particles\": {\n\t\t\t\"number\": {\n\t\t\t\t\"value\": 80,\n\t\t\t\t\"density\": {\n\t\t\t\t\t\"enable\": true,\n\t\t\t\t\t\"value_area\": 800\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"color\": {\n\t\t\t\t\"value\": \"#ffffff\"\n\t\t\t},\n\t\t\t\"shape\": {\n\t\t\t\t\"type\": \"circle\",\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"width\": 0,\n\t\t\t\t\t\"color\": \"#000000\"\n\t\t\t\t},\n\t\t\t\t\"polygon\": {\n\t\t\t\t\t\"nb_sides\": 5\n\t\t\t\t},\n\t\t\t\t\"image\": {\n\t\t\t\t\t\"src\": \"img/github.svg\",\n\t\t\t\t\t\"width\": 100,\n\t\t\t\t\t\"height\": 100\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"opacity\": {\n\t\t\t\t\"value\": 0.5,\n\t\t\t\t\"random\": false,\n\t\t\t\t\"anim\": {\n\t\t\t\t\t\"enable\": false,\n\t\t\t\t\t\"speed\": 1,\n\t\t\t\t\t\"opacity_min\": 0.1,\n\t\t\t\t\t\"sync\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"size\": {\n\t\t\t\t\"value\": 5,\n\t\t\t\t\"random\": true,\n\t\t\t\t\"anim\": {\n\t\t\t\t\t\"enable\": false,\n\t\t\t\t\t\"speed\": 40,\n\t\t\t\t\t\"size_min\": 0.1,\n\t\t\t\t\t\"sync\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"line_linked\": {\n\t\t\t\t\"enable\": true,\n\t\t\t\t\"distance\": 150,\n\t\t\t\t\"color\": \"#ffffff\",\n\t\t\t\t\"opacity\": 0.4,\n\t\t\t\t\"width\": 1\n\t\t\t},\n\t\t\t\"move\": {\n\t\t\t\t\"enable\": true,\n\t\t\t\t\"speed\": 6,\n\t\t\t\t\"direction\": \"none\",\n\t\t\t\t\"random\": false,\n\t\t\t\t\"straight\": false,\n\t\t\t\t\"out_mode\": \"out\",\n\t\t\t\t\"attract\": {\n\t\t\t\t\t\"enable\": false,\n\t\t\t\t\t\"rotateX\": 600,\n\t\t\t\t\t\"rotateY\": 1200\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"interactivity\": {\n\t\t\t\"detect_on\": \"canvas\",\n\t\t\t\"events\": {\n\t\t\t\t\"onhover\": {\n\t\t\t\t\t\"enable\": true,\n\t\t\t\t\t\"mode\": \"repulse\"\n\t\t\t\t},\n\t\t\t\t\"onclick\": {\n\t\t\t\t\t\"enable\": true,\n\t\t\t\t\t\"mode\": \"push\"\n\t\t\t\t},\n\t\t\t\t\"resize\": true\n\t\t\t},\n\t\t\t\"modes\": {\n\t\t\t\t\"grab\": {\n\t\t\t\t\t\"distance\": 400,\n\t\t\t\t\t\"line_linked\": {\n\t\t\t\t\t\t\"opacity\": 1\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"bubble\": {\n\t\t\t\t\t\"distance\": 400,\n\t\t\t\t\t\"size\": 40,\n\t\t\t\t\t\"duration\": 2,\n\t\t\t\t\t\"opacity\": 8,\n\t\t\t\t\t\"speed\": 3\n\t\t\t\t},\n\t\t\t\t\"repulse\": {\n\t\t\t\t\t\"distance\": 200\n\t\t\t\t},\n\t\t\t\t\"push\": {\n\t\t\t\t\t\"particles_nb\": 4\n\t\t\t\t},\n\t\t\t\t\"remove\": {\n\t\t\t\t\t\"particles_nb\": 2\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"retina_detect\": true,\n\t\t\"config_demo\": {\n\t\t\t\"hide_card\": false,\n\t\t\t\"background_color\": \"#b61924\",\n\t\t\t\"background_image\": \"\",\n\t\t\t\"background_position\": \"50% 50%\",\n\t\t\t\"background_repeat\": \"no-repeat\",\n\t\t\t\"background_size\": \"cover\"\n\t\t}\n\t}\n);"
  },
  {
    "path": "template/login/assets.go",
    "content": "// Code generated by go-bindata. DO NOT EDIT.\n// sources:\n// assets/login/dist/all.min.css\n// assets/login/dist/all.min.js\n// assets/login/dist/respond.min.js\npackage login\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc bindataRead(data []byte, name string) ([]byte, error) {\n\tgz, err := gzip.NewReader(bytes.NewBuffer(data))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\n\tvar buf bytes.Buffer\n\t_, err = io.Copy(&buf, gz)\n\tclErr := gz.Close()\n\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\tif clErr != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\ntype asset struct {\n\tbytes []byte\n\tinfo  os.FileInfo\n}\n\ntype bindataFileInfo struct {\n\tname    string\n\tsize    int64\n\tmode    os.FileMode\n\tmodTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n\treturn fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n\treturn fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n\treturn fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n\treturn fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n\treturn false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n\treturn nil\n}\n\nvar _assetsLoginDistAllMinCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xbd\\x6b\\xb7\\xe3\\xb6\\xb1\\x20\\xfa\\xfd\\xfc\\x0a\\xc6\\x5e\\xbd\\xdc\\xed\\x16\\xd9\\x24\\xf5\\xda\\x92\\x56\\xfa\\xc6\\x76\\xe2\\x19\\xdf\\x39\\x19\\xdf\\x35\\x27\\x9e\\x49\\xc6\\xf1\\x9d\\x05\\x91\\x90\\x44\\x37\\x45\\x32\\x24\\xb5\\x1f\\xd6\\x68\\x7e\\xfb\\x2c\\xe2\\x41\\xe2\\x51\\x00\\x49\\xed\\xdd\\xaf\\x64\\x9f\\x3e\\x49\\xb4\\x51\\x85\\x42\\xa1\\xaa\\x50\\x05\\x14\\xf1\\xf8\\xc3\\x2e\\xcf\\x6a\\x77\\x87\\x22\\x7c\\x66\\xbf\\x8e\\x49\\xfa\\xb0\\xce\\x0b\\x9c\\x39\\x15\\xca\\xaa\\x0d\\x29\\xad\\xea\\x87\\x14\\xaf\\xb3\\xbc\\x3c\\xa2\\x94\\x96\\xdc\\xe1\\x64\\x7f\\xa8\\xd7\\x53\\xdf\\xdf\\x54\\x65\\xb4\\x4e\\xf3\\x08\\xa5\\x2f\\xbf\\xfa\\xb1\\xa9\\xf6\\x1f\\x28\\xab\\x9c\\x7f\\x6f\\xc0\\x5f\\xbd\\x9a\\x08\\x80\\xa6\\xdc\\xe5\\xe5\\xa7\\x32\\x7d\\x79\\xa8\\xeb\\xa2\\x5a\\xbf\\x79\\xd3\\x10\\xac\\xbc\\x7d\\x55\\xa3\\x3a\\x89\\xbc\\x28\\x3f\\xbe\\xa9\\xde\\x34\\x0c\\x34\\xed\\xbf\\xb9\\x0d\\x96\\x6f\\x8e\\xf8\\x38\\xff\\x1b\\xfa\\x4f\\x55\\x10\\x2e\\xfe\\x9c\\xfc\\xcf\\xe2\\xdb\\x6f\\xdc\\x9f\\xfe\\xeb\\xff\\x2a\\x6f\\x7e\\xfc\\xab\\x7b\\x28\\xfe\\xcb\\x7f\\xf9\\x8f\\xbf\\xfc\\x3a\\xff\\xff\\xfe\\x87\\x77\\x97\\xef\\x76\\xe1\\xab\\x5d\\xc3\\x63\\xfd\\xf2\\x2b\\xf2\\xd7\\x57\\xaf\\x36\\xa7\\x2c\\x89\\xf2\\x18\\xbb\\x25\\xca\\xf6\\x78\\xfd\\xd3\\x6b\\x7f\\xb6\\xf0\\x5d\\x7f\\x1e\\x7e\\x3f\\xf9\\xe9\\x75\\xf0\\xdd\\x8d\\xef\\x06\\xdf\\xdd\\xdc\\x4c\\x7e\\x7a\\x1d\\xfa\\xdf\\xce\\x9a\\xff\\xf9\\xe3\\x9f\\x7c\\x37\\xfc\\xe3\\xf7\\x0d\\xf8\\x9b\\xc5\\xcc\\x77\\xbf\\x59\\xac\\x9a\\xdf\\xdf\\xff\\x29\\xfc\\x93\\xfb\\xfd\\x9f\\xc2\\xef\\x2f\\x9f\\xb5\\xc0\\xfe\\xfb\\xe9\\x0a\\x81\\xf9\\xbe\\xeb\\xcf\\xe6\\x8d\\x14\\xfc\\xd9\\xaa\\xf9\\xbd\\x0a\\xc8\\xef\\x6f\\x9b\\xdf\\xdf\\x36\\xbf\\xc3\\x20\\x58\\x7c\\xde\\x82\\xf9\\xeb\\x78\\xc1\\x04\\xdf\\xfb\\xbe\\x1b\\x7c\\xff\\xfd\\x67\\x6e\\x12\\x3f\\xe1\\xf1\\x26\\x31\\x5d\\xfa\\xae\\x3f\\xfd\\xdc\\x7b\\xfe\\xd7\\x2b\\x7a\\x1e\\xf8\\xa1\\xeb\\x07\\xfe\\xb4\\x19\\x00\\x41\\xe0\\xbb\\x7e\\x10\\x34\\x03\\x20\\xf8\\xd3\\x37\\xbe\\x1b\\xfc\\xe9\\xfb\\x15\\xf1\\x24\\xdf\\x7c\\xfb\\x99\\x0b\\xe6\\xc7\\x6b\\x04\\xe3\\xbb\\x7e\\x38\\x23\\x5e\\x22\\x9c\\xaf\\x88\\x4c\\x7c\\x22\\x93\\xef\\x89\\x4c\\x42\\x9f\\x8a\\xc6\\x77\\x1b\\xf9\\xd0\\xdf\\x7f\\x74\\x43\\xff\\xbb\\xef\\xa9\\xff\\x68\\x24\\x1a\\x7e\\xb7\\xf0\\xdd\\xf0\\xbb\\x25\\x71\\xbe\\xcb\\xd0\\x77\\xbf\\x59\\x7e\\xee\\x36\\xf6\\x13\\xf7\\x2b\\x77\\x43\\x05\\xe9\\x37\\x82\\xf4\\x89\\xd4\\xfc\\x60\\x4a\\x3c\\x6d\\x30\\x6f\\x8c\\x6e\\x4e\\x8c\\x2e\\xfc\\xf6\\x5b\\xd7\\x0f\\xbf\\xfd\\x8e\\xfc\\xfe\\x6e\\x41\\xfe\\xe7\\x8f\\xdf\\xd0\\xff\\xf9\\x8e\\x88\\xd5\\x6f\\x44\\xbc\\xa0\\x52\\x5f\\xce\\xa8\\xa4\\x09\\x24\\x08\\x43\\xf2\\x3f\\x2b\\xea\\xb2\\x57\\x44\\xe4\\x61\\x10\\xd2\\xff\\x99\\x93\\x28\\x47\\xda\\xfd\\xfe\\xfb\\xef\\xff\\xf8\\x58\\xb1\\xcf\\x4c\\x62\\xff\\x6f\\x78\\x7f\\x4a\\x51\\x09\\x08\\xbe\\x83\\x8c\\x15\\xfd\\x8d\\x22\\xfa\\xef\\xff\\xc7\\xff\\xeb\\x6f\\x77\\x37\\xc5\\xbb\\x6f\\x8a\\x05\\xfa\\x4c\\x26\\x06\\x1f\\x57\\x60\\x3f\\xfd\\xcf\\x2b\\x04\\xf6\\x61\\x26\\x06\\x1f\\xd9\\x92\\xc6\\x0b\\xe6\\xc9\\x26\\x06\\x1f\\xb7\\xe7\\xff\\xbd\\x18\\x6f\\x12\\x4f\\x35\\x31\\xf8\\xc8\\x3a\\xbf\\xa2\\xe7\\x1f\\x68\\x62\\xf0\\x91\\x05\\x33\\xbf\\x46\\x30\\x9f\\xe8\\xc4\\xe0\\x23\\x8f\\x2e\\xee\\x57\\xf6\\xff\\x62\\x13\\x83\\xa5\\x49\\xec\\xdf\\xe6\\x69\\x0c\\xc8\\x9c\\x15\\x3f\\x7a\\x36\\xb6\\x2c\\xf7\\x9f\\x63\\xbe\\xe0\\x63\\x8a\\xeb\\x13\\xce\\x16\\x7c\\x54\\x2b\\xfa\\x88\\xb9\\x82\\x8f\\xd9\\xef\\x8f\\x99\\x29\\xf8\\xa8\\xfa\\xfe\\x74\\xf3\\x04\\x1f\\x55\\x2c\\xff\\x4c\\x59\\x82\\x8f\\x3a\\xae\\x3e\\xdb\\x1c\\xc1\\x9b\\xaf\\x7f\\xf7\\xb5\\xf3\\x6d\\x9e\\xd7\\x55\\x5d\\xa2\\xc2\\xb9\\x9d\\x7a\\x53\\x6f\\xe9\\x10\\x89\\xac\\xdf\\xbc\\xd9\\xe3\\x7a\\xcb\\x61\\x8d\\x3c\\x5e\\xfd\\xdb\\xd7\\xce\\x77\\x79\\xf1\\x50\\x36\\x12\\x77\\x42\\x3f\\x08\\xdc\\xd0\\x0f\\x16\\xce\\x5f\\xee\\x92\\xba\\xc6\\xe5\\xc4\\xf9\\x21\\x8b\\xbc\\x7f\\xfb\\xda\\xf9\\xf7\\x24\\xc2\\x59\\x85\\x63\\xe7\\x94\\xc5\\xb8\\x74\\xfe\\xfc\\xc3\\x5f\\x9c\\x56\\xc8\\xfb\\xa4\\x3e\\x9c\\xb6\\x44\\xba\\xf5\\xdd\\xb6\\x7a\\xd3\\x36\\xf0\\x66\\x9b\\xe6\\xdb\\x37\\x47\\x54\\xd5\\xb8\\x7c\\xf3\\xef\\x3f\\x7c\\xf7\\xa7\\xff\\xfa\\x1f\\x7f\\x7a\\xf5\\xf5\\x9b\\x37\\x5f\\xff\\x8e\\x6a\\x3b\\xf9\\x0d\\x7b\\x51\\x55\\x35\\x3c\\xfa\\xde\\xd4\\xf9\\xdf\\x84\\x2c\\x6b\\xc9\\xf9\\xdf\\x8e\\x40\\x37\\xc3\\x51\\x9e\\xa2\\xea\\x8d\\x54\\xef\\xeb\\x37\\x87\\xfa\\x98\\x4a\\xa6\\xd5\\xe8\\xd5\\xad\\x70\\x99\\xec\\x36\\xee\\x1d\\xde\\xbe\\x4b\\x6a\\xb7\\xc6\\xf7\\xb5\\x5b\\x25\\xbf\\x61\\x17\\xc5\\xbf\\x9e\\xaa\\x7a\\x1d\\xf8\\xfe\\x8b\\x8d\\x7b\\xac\\x60\\xc8\\x65\\x9b\\xc7\\x0f\\xe7\\x23\\x2a\\xf7\\x49\\xb6\\xf6\\x2f\\xa8\\xac\\x93\\x28\\xc5\\x13\\x54\\x25\\x31\\x9e\\xc4\\xb8\\x46\\x49\\x5a\\x4d\\x76\\xc9\\x3e\\x42\\x45\\x9d\\xe4\\x59\\xf3\\xf3\\x54\\xe2\\xc9\\x2e\\xcf\\x1b\\x71\\x1d\\x30\\x8a\\x9b\\xff\\xd9\\x97\\xf9\\xa9\\x98\\x1c\\x51\\x92\\x4d\\x8e\\x38\\x3b\\x4d\\x32\\x74\\x3b\\xa9\\x70\\x44\\x6a\\x54\\xa7\\xe3\\x11\\x95\\x0f\\xe7\\x38\\xa9\\x8a\\x14\\x3d\\xac\\xb7\\x69\\x1e\\xbd\\xbb\\xa0\\x53\\x9c\\xe4\\x93\\x08\\x65\\xb7\\xa8\\x9a\\x14\\x65\\xbe\\x2f\\x71\\x55\\x4d\\x6e\\x93\\x18\\xe7\\x2d\\x66\\x92\\xa5\\x49\\x86\\x5d\\x52\\x61\\x73\\x8b\\x1b\\xd6\\x50\\xea\\xa2\\x34\\xd9\\x67\\xeb\\x2d\\xaa\\x70\\x03\\xa5\\x84\\xd6\\x59\\x5e\\xbf\\xfc\\x39\\xca\\xb3\\xba\\xcc\\xd3\\xea\\x97\\x57\\x2d\\x89\\x2c\\xcf\\xf0\\xe6\\x40\\xc7\\x97\\x7f\\xf9\\xf9\\x90\\xc4\\x31\\xce\\x7e\\x99\\xd4\\xf8\\x58\\xa4\\xa8\\xc6\\x12\\xde\\x05\\x9d\\xb7\\x28\\x7a\\xd7\\xf4\\x25\\x8b\\xdd\\x28\\x4f\\xf3\\x72\\x5d\\x97\\x28\\xab\\x0a\\x54\\xe2\\xac\\xbe\\xa0\\x35\\x8a\\xea\\xe4\\x16\\x4f\\xd0\\xfa\\x90\\xdf\\xe2\\xf2\\x9c\\x9f\\xea\\x86\\x85\\x46\\x6c\\xdb\\x6d\\xf9\\x73\\x9d\\xd4\\x29\\xfe\\xe5\\xbc\\xcd\\xcb\\x18\\x97\\xee\\x36\\xaf\\xeb\\xfc\\xb8\\x0e\\x8a\\x7b\\x27\\xce\\xeb\\x1a\\xc7\\x97\\xed\\xa4\\xaa\\xcb\\x3c\\xdb\\x9f\\x95\\x41\\x7f\\x89\\x77\\xd9\\x59\\x70\\x0d\\x49\\x8d\\xd2\\x24\\xba\\x1c\\x02\\xae\\x16\\x6f\\xb1\\xc4\\x47\\xc7\\x67\\xee\\x23\\xf9\\x0d\\xaf\\x43\\x7c\\xbc\\x1c\\x51\\xf9\\xee\\x4c\\xb9\\xfc\\xd2\\xf7\\xfd\\x4d\\xc7\\xfb\\xfa\\xcb\\xdd\\xce\\xbf\\x54\\x47\\x94\\x32\\x6b\\x21\\x75\\x6e\\xfc\\x17\\x97\\xea\\xb4\\x9d\\x54\\xa7\\xe2\\x5c\\xe4\\x55\\xd2\\x28\\x67\\x5d\\xe2\\x14\\x35\\x7d\\x12\\x68\\x2f\\xe7\\x2f\\x36\\x44\\xee\\x5c\\x6c\\x46\\xd1\\x37\\x94\\xea\\xbc\\x58\\xbb\\xde\\x1c\\x1f\\x1b\\xda\\x67\\xd6\\x69\\xd7\\x0b\\x9b\\x92\\xe4\\xb8\\x67\\xd2\\x58\\xfb\\x97\\xea\\x76\\x4f\\xb4\\xb4\\x2e\\xf3\\xbc\\x7e\\x75\\x6e\\x04\\xb8\\x4b\\xf3\\xbb\\x35\\x55\\xc9\\x85\\xda\\x15\\xef\\x71\\x80\\x8f\\xce\\xcc\\x2f\\xee\\x2f\\x87\\xf2\\xdc\\xb2\\xc1\\x2d\\x7c\\x9b\\xdf\\x37\\x9c\\x26\\xd9\\x7e\\xdd\\x68\\x1c\\x67\\xa4\\x68\\xe3\\x1e\\xf3\\xdf\\x4c\\x30\\xb8\\xf8\\x52\\x94\\xb8\\x63\\x04\\x9d\\xea\\xfc\\xd2\\xf8\\xb8\\xc9\\xbb\\x6d\\x3c\\x29\\x4a\\x3c\\xa9\\xd0\\xb1\\x90\\x86\\xdb\\x31\\xcf\\xf2\\xaa\\x40\\x11\\x9e\\xb4\\xbf\\x04\\xc1\\x05\\xf8\\x78\\xd9\\x9e\\xea\\x3a\\xcf\\x26\\x49\\x56\\x9c\\xea\\x49\\x5e\\xd4\\x74\\x60\\x54\\x38\\xc5\\x51\\x3d\\x69\\x06\\x20\\x2a\\x31\\x6a\\x87\\x1b\\xa9\\xbc\\x4e\\xb2\\x03\\x2e\\x93\\x7a\\x43\\x75\\xc9\\xfe\\x62\\x94\\x3a\\xf6\\x6e\\x93\\x2a\\xd9\\xa6\\x98\\xb7\\x40\\x49\\x9e\\xc9\\x98\\x26\\x46\\xda\\x38\\x6c\\x6a\\xc6\\x0c\\xa3\\x71\\x16\\x0e\\x61\\xe4\\xe7\\xfa\\xa1\\xc0\\xbf\\xa7\\xc5\\xbf\\x4c\\x84\\xa2\\x12\\x57\\xb8\\x96\\x4a\\xaa\\xd3\\xf6\\x98\\xd4\\xbf\\x9c\\xb9\\xac\\x51\\x51\\x60\\x54\\xa2\\x2c\\xc2\\x6b\\x5a\\x7f\\x13\\x9d\\xca\\x2a\\x2f\\xd7\\x45\\x9e\\x64\\x35\\x2e\\x59\\x63\\x3f\\xc7\\x49\\x85\\xb6\\x29\\x8e\\x7f\\x11\\x9b\\x6d\\x0b\\xcf\\xac\\x52\\x8c\\x77\\xe8\\x94\\xf2\\xbe\\xad\\xd7\\x44\\x65\\xbb\\x3c\\x3a\\x55\\x6e\\x92\\x65\\xb8\\xa4\\x9c\\xe8\\xe5\\xe7\\x02\\xc5\\x71\\xa3\\x3c\\x7f\\xd3\\xda\\x13\\x41\\x3d\\x8b\\x86\\x4a\\x9d\\xe5\\x45\\xe8\\x4d\\x74\\xc0\\xd1\\xbb\\x6d\\x7e\\x2f\\x77\\x1a\\xc5\\x49\\xde\\xf5\\x50\\x30\\x8d\\x76\\xe4\\xea\\xc6\\x24\\x80\\xe0\\xd2\\x96\\x43\\xb1\\xfd\\xec\\x74\\xdc\\xe2\\xf2\\x97\\xf5\\x9a\\x37\\x46\\x7a\\xe3\\x56\\x45\\x92\\xb9\\xa2\\xa5\\x18\\xb0\\xf3\\x53\\x2d\\x63\\xf3\\xb1\\x40\\x4c\\x55\\xd4\\x1a\\x46\\x65\\x74\\x00\\xfb\\xf4\\xb8\\x11\\xb2\\x01\\xec\\xa0\\x31\\xb9\\x5d\\x82\\xd3\\x18\\xe0\\xa0\\xe3\\x9d\\x16\\xb8\\x51\\x53\\x25\\x05\\x3a\\x6b\\xaa\\x10\\xe3\\x28\\x2f\\x51\\xe3\\x9b\\x20\\x1b\\x24\\xf6\\x4d\\x1a\\xaf\\x70\\xdd\\x5a\\x85\\x37\\x9d\\xe3\\xa3\\xe3\\x2d\\x42\\xf2\\x3f\\xcb\\x39\\x3e\\x6e\\xf8\\x08\\x73\\xc2\\xe2\\x9e\\xdb\\x4c\\xe3\\x8a\\xab\\x3c\\x4d\\x62\\xa7\\x4a\\xd2\\x5b\\x5c\\x5e\\x52\\xbc\\xc7\\x59\\x0c\\x19\\x57\\x3b\\x52\\x65\\xef\\xc0\\x07\\xb4\\xe6\\xc1\\xeb\\xc6\\xce\\xb9\\xe7\\x6f\\xfc\\x82\\x48\\xaf\\x09\\x25\\x29\\x2a\\x2a\\xbc\\xe6\\x3f\\x2e\\x75\\x3c\\xa9\\x0f\\x5d\\xc3\\xcd\\x24\\xe6\\x3f\\xf2\\x53\\x19\\xe1\\xb5\\x03\\xcc\\x32\\x0e\\xf3\\x6d\\x41\\x62\\xff\\xdc\\xdd\\xe6\\x49\\x8a\\x4b\\x12\\xbb\\xa4\\xd9\\x46\\x55\\x46\\x6f\\xa2\\xaa\\x7a\\xd3\\x84\\x60\\x3a\\x57\\xf8\\xc3\\x11\\xc7\\x09\\x72\\x8a\\x32\\xc9\\xea\\xf3\\xd7\\x93\\x35\\xda\\x35\\x01\\x7b\\xbd\\xc5\\xbb\\xbc\\xc4\\x42\\xdc\\xf8\\x5d\\x72\\x2c\\xf2\\xb2\\x46\\x59\\xbd\\xa1\\x13\\x84\\x03\\x8a\\xf3\\x3b\\x22\\x69\\x01\\x24\\x04\\x17\\xdf\\x11\\xeb\\x48\\x26\\x07\\x57\\x35\\x41\\x2e\\x68\\x82\\x88\\x5b\\xab\\x71\\x4c\\x1d\\x59\\xa7\\xfc\\x35\\x99\\x77\\xd1\\x00\\xff\\xf3\\xa1\\xc4\\xbb\\x5f\\x68\\x07\\xce\\xcc\\x38\\xd7\\x5f\\x38\\x2f\\xbf\\x70\\x50\\x5d\\x97\\x2f\\x1b\\xe8\\xab\\x2f\\x5e\\x7d\\x21\\x06\\x61\\x23\\x32\\x01\\x53\\x6c\\x42\\xf6\\xff\\xff\\xfd\\x17\\xbf\\xa2\\x5b\\x54\\x45\\x65\\x52\\xd4\\xeb\\x2f\\x58\\xc5\\x49\\x0b\\xfc\\xf2\\x0b\\x8d\\xd6\\x17\\x17\\x32\\x21\\xf9\\xc7\\x29\\xaf\\x71\\x13\\x26\\xce\\x9a\\x79\\x7d\\xb9\\x5a\\xad\\x36\\x05\\xda\\x63\\x77\\x5b\\x62\\xf4\\xce\\x4d\\xb2\\x66\\x36\\xb5\\x46\\xb7\\x79\\x12\\x5f\\xea\\x66\\xce\\xd4\\xce\\x3b\\x88\\xe1\\xb8\\x74\\x1a\\xe5\\x12\\xdb\\x6a\\xa2\\xe6\\xa4\\x6e\\x5c\\x1e\\x5c\\xbf\\x09\\xaa\\x47\\x74\\xef\\xde\\x25\\x71\\x7d\\x20\\x53\\x38\\x41\\xa2\\x87\\x70\\x72\\x98\\x4e\\x8a\\x73\\x5e\\x16\\x07\\x94\\x55\\xeb\\xe9\\xe6\\x2e\\x89\\xf3\\xbb\\x6a\\x3d\\xa5\\x20\\x91\\x2a\\xe9\\x16\\x23\\xea\\x65\\xe8\\x76\\x8b\\x4a\\x79\\x3a\\xe4\\x6d\\xeb\\xec\\xad\\x17\\xa1\\x12\\xd7\\x13\\x2f\\x2e\\xf3\\xe2\\x54\\xbc\\x15\\xca\\xb8\\xb9\\xd7\\x79\\xe1\\x42\\xe6\\x74\\xf1\\x52\\xb4\\xc5\\x29\\x20\\x1e\\xdf\\xf7\\x2f\\x9e\\x34\\x64\\xb4\\x11\\x22\\x92\\x21\\x98\\x4e\\x1d\\x4f\\xf8\\xaf\\x83\\x3e\\x4f\\xfb\\x72\\xb7\\xdb\\x69\\x75\\x5c\\x4a\\x1d\\xc7\\x5d\\x65\\xa1\\xe8\\x00\\x70\\x16\\xc7\\xb1\\x40\\xc5\\xb4\\xa0\\xdb\\xa7\\x0f\\xc5\\x21\\x89\\xf2\\xac\\x72\\x0e\\x28\\xdd\\xa5\\x49\\xb6\\xaf\\xc8\\xca\\x8d\\x2f\\xc5\\xd6\\x6f\\xde\\x3c\\xa0\\xac\\x3a\\x24\\x5e\\x75\\x8a\\x50\\x72\\x38\\xe5\\x64\\x1c\\x1f\\xf3\\x18\\xa5\\xd5\\x9b\\x70\\xf1\\x26\\x5c\\x2c\\x67\\x6f\\x62\\x7c\\xcc\\xe9\\x8a\\xed\\x4d\\x47\\xd1\\x6d\\x29\\xba\\x25\\xcd\\xf4\\x7a\\x38\\xaf\\x5f\\xbd\\x5f\\xf2\\xff\\x4f\\xbb\\xdc\\xc3\\xc7\\x2d\\x8e\\x63\\x1c\\xbb\\xcd\\xaa\\xb1\\x71\\xd4\\xc2\\x02\\xf3\\x69\\x9b\\x05\\x97\\x99\\xef\\xb1\\x2d\\xa9\\xa9\\xf7\\xd6\\x52\\x5d\\x77\\x0d\\xd5\\xe5\\x09\\xbf\\x57\\x11\\x56\\xb7\\xfb\\xb6\\xb1\\xea\\x76\\xff\\xd5\\xab\\x8b\\xd7\\xe2\\x03\\x53\\xfc\\x66\\xaa\\x1e\\x14\\xf7\\x1b\\x70\\x79\\xd5\\x6b\\xdf\\xfd\\x1f\\x32\\xc4\\xb9\\x58\\xd0\\x06\\x06\\x5a\\xef\\x98\\xe7\\xf5\\xa1\\x89\\x75\\x28\\xab\\x13\\x94\\x26\\xa8\\xc2\\x31\\x9d\\x8f\\xe4\\xd5\\xbd\\x8a\\xb3\\x2f\\xd1\\x43\\x15\\xa1\\x14\\x0b\\xfd\\x71\\x49\\x9c\\x4b\\xaa\\x77\\x5d\\x04\\x63\\xfe\\xf8\\xef\\xbe\\x1f\\xa2\\x2f\\x44\\xd4\\x22\\x3d\\x55\\x20\\xda\\x56\\x42\\xc3\\xa7\\x92\\x61\\x4d\\xe4\\xd2\\x5c\\xaf\\x1c\\xfa\\x28\\x92\\x2a\\x1f\\x93\\x0c\\x6a\\x24\\x0c\\x83\\x50\\xc2\\x8b\\xd2\\xfc\\x14\\x03\\x78\\x0b\\x3f\\x90\\x99\\xc9\\x6e\\x71\\x9a\\x17\\x18\\x40\\x5d\\xfa\\x2b\\xb9\\x7b\\x38\\x8b\\x92\\x14\\x44\\xdc\\x49\\x88\\xfb\\x14\\x55\\x00\\x8f\\xd8\\x57\\xda\\x3e\\x9e\\xaa\\x24\\x02\\xf1\\xe4\\xbe\\xd0\\x29\\x1a\\x88\\x38\\x95\\x10\\x0f\\x18\\x95\\x35\\x88\\x37\\x97\\x09\\xd6\\xa8\\x04\\xd1\\x16\\x1a\\x9a\\x8b\\x8f\\x45\\xfd\\x00\\x22\\x2f\\x25\\xe4\\x53\\x85\\x61\\x9a\\x37\\x12\\xda\\x2e\\x49\\x8f\\x20\\x9a\\x2c\\xeb\\xfa\\xe0\\xa6\\xa8\\xdc\\x03\\x6a\\xc1\\x7e\\xe0\\x2b\\xa8\\x20\\x52\\xa0\\xd1\\x4b\\x2a\\x50\\x36\\x8a\\xe1\\xe4\\x80\\xa5\\x63\\x3f\\x90\\x05\\x5d\\xe2\\x63\\x7e\\x0b\\x33\\x37\\x93\\x10\\x7f\\xcb\\xf3\\xa3\\x9b\\x64\\x20\\xe6\\x5c\\xc7\\xcc\\x4f\\x30\\x8b\\xb2\\x5e\\xf2\\xdd\\x0e\\xc4\\x92\\x15\\x52\\x25\\xfb\\x0c\\x01\\xe6\\x8a\\xfd\\x40\\x56\\x49\\x94\\xef\\x41\\x2c\\x45\\x23\\x25\\xaa\\x40\\x49\\x87\\xb2\\x3a\\x0e\\xf9\\x11\\x14\\x4c\\x18\\xa8\\x76\\x00\\xa3\\xc9\\xda\\xa8\\x13\\x03\\x35\\x45\\x1f\\x39\\x02\\x06\\x3b\\xf6\\x43\\x59\\x1b\\x71\\x7e\\x97\\xa5\\x39\\x8a\\x5d\\x94\\x82\\x72\\x0e\\xe7\\x20\\x3a\\x88\\x2a\\xab\\xe4\\x54\\x18\\x11\\x65\\xad\\x24\\xd9\\x36\\xbf\\x07\\xf1\\x6e\\x14\\x5f\\x8a\\x1e\\xdc\\x28\\x29\\x23\\x83\\x98\\x56\\x8a\\x3d\\x16\\x18\\x81\\x5d\\x9a\\xfa\\x0a\\xe2\\xae\\xc4\\xb0\\x1e\\xa7\\xb2\\x82\\x9a\\xe1\\x62\\x92\\xd3\\x54\\x56\\x52\\x13\\xc8\\x40\\x34\\x59\\x49\\xbb\\x14\\x81\\x86\\x36\\x9d\\xa9\\x4e\\x2c\\x2e\\x0e\\x79\\x86\\x41\\x17\\x3a\\x95\\x55\\x74\\x9b\\xa7\\xa7\\x23\\x36\\x8d\\x88\\xe9\\x02\\x42\\x6e\\xd4\\x0a\\x62\\x2f\\x21\\xec\\x53\\x01\\xe2\\xca\\xda\\xfa\\x47\\x19\\xe5\\x31\\xa8\\xa8\\xa9\\xac\\xa8\\x2d\\x32\\x62\\xce\\x14\\xb7\\x06\\x0b\\x6b\\x16\\xa8\\x58\\xa0\\x98\\x66\\xb2\\x86\\xb6\\x39\\xec\\xd6\\x66\\x53\\x0d\\xed\\x88\\x4a\\x18\\x55\\xd6\\x12\\x59\\xdf\\x82\\x78\\xb2\\x82\\x22\\x74\\xc4\\x25\\x02\\x11\\x65\\xe5\\x90\\x94\\x1c\\x84\\xb6\\x54\\x58\\x4c\\xc1\\x61\\x36\\x93\\x15\\x42\\x73\\xb9\\x20\\xa2\\xe2\\xd6\\x9a\\xf5\\x2f\\x9b\\x3c\\x01\\xd8\\x73\\x5f\\xc7\\xa6\\x2b\\x40\\x08\\x59\\xd6\\x0d\\xc9\\xda\\xba\\x29\\xde\\xc1\\x94\\x43\\x00\\x39\\xc2\\x59\\x0d\\x87\\xd1\\xf9\\x14\\x40\\x2f\\x8d\\x6c\\xcf\\x00\\xec\\x5f\\x4f\\x55\\x9d\\xec\\xc0\\x58\\x3e\\x9f\\x6b\\x63\\x1f\\x44\\x5b\\x28\\xbe\\x2c\\xc6\\x59\\x6d\\xee\\xa1\\xea\\xf9\\x08\\xb6\\x99\\x67\\x65\\xa2\\x80\\x22\\xdc\\x78\\x7f\\x97\\x7c\\x9b\\x00\\x2b\\x28\\xd3\\xb3\\x24\\xaa\\x4f\\x25\\x38\\xb4\\x16\\xb2\\x16\\x8f\\xa8\\x70\\x1b\\x33\\x87\\x25\\xbd\\x50\\x14\\x43\\xbf\\xd9\\x40\\x88\\x53\\x25\\x54\\xc1\\x06\\xbc\\x90\\x75\\x81\\xe3\\x04\\x46\\x53\\xa6\\x68\\x07\\x64\\xe8\\x8b\\xac\\x03\\x92\\x6a\\x05\\xf1\\x64\\xe9\\x9b\\xe6\\x2b\\x8b\\x1b\\x65\\xca\\x87\\x0b\\xb7\\x59\\xe5\\xdf\\xa1\\x12\\x1c\\x67\\x8b\\x95\\xa2\\xa5\\xaa\\xb6\\xe2\\x2f\\x7d\\xc5\\xff\\x59\\x50\\x03\\x2d\\x02\\x82\\x68\\xb2\\x7e\\x0a\\x74\\xaa\\xc0\\x9e\\x2d\\xa7\\x4a\\xcf\\x72\\xd0\\x93\\x2f\\x67\\x8a\\x1b\\x2a\\x8d\\xfc\\xcd\\xf5\\xae\\xdb\\xd0\\xd5\\xc9\\x34\\x2e\\xac\\xe8\\xb2\\xbe\\xf0\\xaf\\x38\\x02\\xed\\x64\\x79\\xa3\\xea\\xff\\xb6\\xcc\\xcd\\x6e\\x66\\xb9\\x02\\xd1\\x8d\\xa3\\xf0\\xc6\\xd7\\x96\\x74\\x64\\x26\\x09\\xe2\\x06\\xfa\\xd2\\xcc\\x8c\\x1c\\x02\\x33\\x68\\x33\\xf6\\x54\\x99\\x94\\x9b\\x31\\x65\\xfd\\xfd\\xe3\\x84\\xab\\x66\\xf9\\x6d\\xc6\\x9f\\x2b\\x5e\\x69\\x97\\x9b\\x71\\x15\\x15\\x46\\x25\\xc6\\x59\\x75\\xc8\\x61\\xc9\\x2d\\xa1\\x0e\\x9a\\xa7\\x70\\x37\\x37\\x6a\\x17\\x2d\\xb8\\xea\\x2c\\x22\\xb3\\x20\\xaf\\x64\\x15\\xa2\\xb2\\xcc\\xef\\x8c\\xf6\\xb1\\x0a\\x00\\x64\\xa3\\x75\\xac\\x42\\x00\\x1b\\x9e\\x21\\xad\\xa6\\x00\\xaa\\x69\\xea\\xb5\\x9a\\xe9\\xce\\xcf\\x34\\xf9\\x5c\\xcd\\x15\\x39\\x93\\x4f\\xeb\\xbb\\x53\\x0a\\xae\\x75\\x56\\x0b\\x08\\x9b\\x7c\\xa3\\x05\\xd1\\x95\\x51\\x78\\x1f\\xa5\\xe8\\x88\\x6c\\x06\\x15\\x28\\x8b\\xfa\\x7d\\x02\\x0a\\x3a\\x50\\xd6\\xf4\\x29\\x46\\xd0\\x94\\x35\\x50\\x56\\xf4\\xbb\\x04\\x8c\\x02\\x81\\xaf\\x04\\x95\\x07\\x4c\\x32\\x87\\x20\\xea\\x5c\\x43\\x8d\\xd2\\x1c\\xf4\\x99\\x81\\x92\\x00\\xb8\\x43\\x65\\x96\\x64\\x7b\\x73\\xd7\\x97\\xaa\\xc7\\xce\\x60\\xb2\\x8a\\xcf\\x42\\x29\\xce\\x62\\x30\\x05\\x11\\x28\\x79\\x80\\x12\\x65\\x71\\x0e\\x25\\x0c\\x02\\x25\\x0b\\x10\\xe5\\xc7\\x23\\x06\\x03\\x70\\xa0\\xa4\\x02\\x8e\\x68\\x9f\\x61\\x18\\x31\\x04\\x7d\\x25\\x68\\xdf\\x81\\x92\\x11\\xe0\\xc8\\x06\\x0b\\x0f\\x94\\xbc\\x40\\x89\\xeb\\x3b\\x6c\\xe0\\x42\\x9d\\x08\\xe4\\x45\\xd1\\x28\\x21\\x82\\x73\\x3b\\x41\\xa0\\xce\\xa3\\x53\\x92\\xd9\\x37\\xa9\\x58\\xc9\\x12\\x30\\x74\\x93\\xf1\\x28\\xa9\\x02\\x36\\x7c\\xf8\\xc6\\x04\\xb0\\x86\\xba\\x32\\x25\\x35\\x0e\\x79\\x99\\xfc\\x96\\x67\\x35\\x5c\\x47\\x4d\\x21\\xc4\\x50\\x84\\x0c\\x94\\x0c\\xc2\\xf6\\x94\\xa6\\x87\\xbc\\x04\\xd9\\x56\\xb2\\x08\\x5b\\x0c\\x8e\\xf6\\x40\\xc9\\x22\\x44\\x4d\\xb7\\x76\\x49\\x84\\x6a\\x50\\x72\\x4a\\x32\\xa1\\x3e\\x9c\\x8e\\xdb\\xca\\x60\\x1d\\x4a\\x26\\x81\\xe1\\x9a\\x8c\\x43\\x49\\x26\\x1c\\x50\\x16\\x1b\\x7d\\x70\\xa0\\x24\\x14\\x08\\xb2\\xc1\\xbb\\x07\\x4a\\x52\\x81\\xe0\\x1a\\x18\\x5e\\xe9\\x98\\x26\\x76\\x95\\x9c\\x02\\x8d\\x44\\x3d\\xa1\\x23\\x50\\xd2\\x0b\\x52\\x25\\x13\\xfb\\x4a\\x9e\\x41\\xaa\\x03\\x77\\x43\\x49\\x39\\x48\\x35\\x8c\\xdd\\x91\\xf5\\xba\\x4f\\xf3\\x2d\\xa8\\x7f\\x25\\xf5\\x70\\x57\\xe2\\x0c\\xcc\\xca\\x06\\x4a\\xda\\xa1\\x46\\xd5\\x3b\\x68\\x91\\x1e\\x28\\x09\\x87\\x5d\\x92\\xc2\\x8b\\xbf\\x40\\xc9\\x36\\x6c\\xcb\\x04\\xef\\x22\\x04\\x8f\\x6f\\x25\\xe1\\xd0\\xc4\\x45\\x3a\\x6f\\x81\\x90\\x95\\x9c\\x43\\x8c\\xaa\\xc3\\x36\\x87\\x27\\xa8\\x81\\x92\\x79\\x28\\x50\\x81\\xcb\\x28\\x4d\\x40\\x35\\x28\\xe9\\x07\\x92\\x97\\x36\\x66\\x92\\x03\\x25\\x0b\\x91\\x26\\x19\\xb4\\xa2\\x09\\xd4\\x0c\\xc4\\x21\\x87\\xa3\\x8d\\x92\\x81\\x28\\x4e\\xd5\\xa1\\x00\\x53\\xb0\\x81\\x92\\x82\\x38\\x55\\x70\\xc7\\x65\\xe9\\xef\\xb7\\x70\\x97\\x65\\xb9\\x57\\x39\\xec\\xad\\x95\\x84\\x42\\x83\\xe6\\x6e\\x1f\\x5c\\x94\\x16\\x07\\xb4\\x85\\x03\\x82\\x92\\x56\\x50\\xab\\x18\\xe6\\x49\\x81\\x92\\x60\\xe0\\xd5\\xe8\\xb7\\x57\\x08\\x7f\\x6a\\xc6\\x37\\xb6\\x31\\x83\\x59\\xab\\xeb\\x32\\xd9\\x9e\\x6a\\x30\\x85\\x17\\x28\\xc9\\x06\\xbd\\x92\\xb1\\x35\\x45\\x5d\\x19\\x59\\xfc\\x62\\x50\\x69\\x73\\x75\\x22\\x57\\xa0\\x0c\\x46\\x54\\x93\\xe1\\xf4\\x43\\xb8\\xd1\\x5b\\x28\\x59\\x87\\x16\\x1f\\xf6\\x47\\x4a\\xe6\\x21\\xcd\\xf7\\xf0\\xd7\\x80\\x60\\x11\\xa8\\xb9\\x52\\x30\\x4b\\x1b\\x2c\\xd4\\xd4\\xeb\\xde\\xf0\\xd1\\x20\\x50\\xd2\\x13\\x19\\xbe\\x73\\xef\\x92\\x2c\\xce\\xef\\x40\\x64\\x75\\x7a\\x12\\xe5\\xb0\\x17\\x50\\xd3\\x14\\x08\\x4c\\x2b\\x04\\x4a\\x96\\xc2\\x34\\xbd\\x50\\x92\\x14\\x0d\\x35\\xb8\\x55\\x25\\xbb\\x47\\xb6\\x0a\\x80\\x88\\x2b\\x55\\xed\\x06\\x44\\x25\\x2f\\x51\\x61\\xd8\\x3a\\x96\\xaa\\x5a\\xf2\\xa2\\x78\\x70\\x63\\xf0\\x7b\\x28\\x0e\\x94\\xd4\\x04\\xc3\\x36\\xf6\\x6a\\xa9\\xe6\\xc7\\x09\\xba\\xf1\\xdb\\x52\\xa0\\xa6\\x2a\\x3a\\xf2\\x20\\xf6\\x1c\\xc2\\x36\\x69\\x42\\xc9\\x56\\x44\\x25\\x8e\\x93\\xba\\x99\\x73\\xc2\\x9c\\xcb\\x7a\\xa3\\x1b\\x21\\x61\\xb7\\xa2\\xe6\\x2b\\x4e\\x75\\x8a\\x4b\\x30\\x0c\\x28\\xa9\\x0a\\xba\\x39\\x07\\x42\\xbc\\xd1\\xa6\\xfe\\x45\\x89\\xab\\x0a\\x16\\xb2\\x92\\xa4\\xc0\\xa8\\x34\\x06\\x0e\\x25\\x45\\x41\\xf0\\x4c\\xbe\\x48\\x49\\x50\\xd4\\xf9\\x9d\\x81\\x57\\xc5\\x43\\xd6\\xa8\\x06\\x9d\\xa2\\x92\\x96\\xa8\\x62\\x63\\xde\\x33\\x50\\xb2\\x12\\x07\\x1b\\xaa\\x32\\xbe\\x4e\\x5b\\xb2\\x11\\x0b\\xe6\\x40\\xc9\\x04\\x92\\x5d\\x3e\\x55\\x8d\\x4b\\x03\\x69\\x35\\xde\\x9d\\xc8\\x8c\\x31\\xdd\\x82\\xba\\x5d\\xa9\\x61\\xaf\\xc1\\x9e\\xbb\\x01\\x88\\xab\\xc6\\xbb\\x06\\x77\\x61\\xc0\\x55\\x83\\x5c\\x83\\xbb\\x34\\xe0\\x2a\\x73\\x43\\x7e\\x1c\\xc1\\x35\\x7c\\xf2\\x08\\x56\\xaa\\x53\\xdc\\x27\\x55\\x4d\\xf7\\xc9\\x99\\xeb\\x28\\x9f\\x3f\\xd2\\xfc\\x14\\xdb\\x3e\\x24\\x06\\x4a\\xc6\\x81\\x56\\x30\\x7e\\x4e\\x0c\\x56\\x37\\xca\\xc8\\xc3\\xd8\\x8d\\xf2\\x2c\\x31\\x8c\\xbe\\x95\\xfa\\x11\\x17\\x63\\x37\\xc6\\x51\\x12\\x9f\\x72\\x68\\x1b\\x05\\x0e\\x7d\\x65\\x6c\\x41\\x4c\\x84\\x4a\\xca\\xa3\\xf1\\x40\\xa6\\x0f\\xba\\xa1\\x92\\xf7\\x68\\xfc\\x8f\\x19\\x57\\x99\\x08\\xe2\\x5b\\x9c\\xc2\\x81\\x35\\x54\\x12\\x20\\x8d\\x32\\x41\\x34\\x65\\x2e\\x88\\x2a\\x70\\x6d\\x17\\x2a\\x89\\x0f\\x94\\x62\\x30\\x6c\\x84\\x4a\\x7a\\x02\\xff\\xe3\\x44\\x8e\\x89\\x40\\xb2\\x0f\\x95\\x0c\\xc5\\x3b\\xb2\\x73\\x19\\x40\\x0b\\xd4\\x04\\x26\\xe8\\xa1\\xd5\\x0d\\x2e\\x05\\x02\\xe7\\x27\\xa1\\x92\\x97\\xd8\\x26\\xd5\\x01\\x4c\\x7c\\x87\\x4a\\x46\\xe2\\x5d\\x66\\x58\\xb9\\x85\\x4a\\x42\\x62\\x8b\\xb6\\x0f\\xee\\x2e\\x2f\\x8f\\xa7\\x14\\xfa\\xae\\x17\\x2a\\xf9\\x88\\x1a\\xcc\\xca\\x84\\x8b\\x9d\\xbc\\x77\\x68\\x9b\\xa2\\xe8\\x9d\\x69\\xed\\x11\\x2a\\x69\\x88\\x2d\\xe8\\xea\\x43\\x25\\xf5\\x80\\x8a\\x02\\x32\\xb3\\xdd\\xcd\\x4e\\xde\\xae\\x83\\x4b\\x78\\x29\\x15\\x2a\\x09\\x87\\x43\\x7e\\x2a\\x0d\\x5b\\x7b\\xc2\\x69\\x20\\xef\\x71\\x4a\\xd1\\x11\\x14\\xba\\x92\\x71\\x88\\x4f\\x45\\x6a\\xca\\x37\\x84\\x4a\\xbe\\xa1\\x48\\xf6\\xfb\\x07\\x77\\x8b\\xc0\\xc5\\x51\\xa8\\x24\\x1c\\xaa\\x28\\xa9\\xaa\\xbc\\x04\\x87\\xb8\\x92\\x6d\\xd8\\x26\\x75\\x94\\x83\\x93\\xd2\\x50\\x49\\x35\\x6c\\x6b\\xe8\\x8b\\xaa\\x8a\\x75\\xbf\\x05\\xad\\x48\\xc1\\x7a\\x80\\x8c\\xdc\\xf7\\x91\\xdc\\x8d\\x5f\\xa1\\x51\\xad\\x61\\x95\\xa7\\x2d\\xa4\\xe8\\xd0\\xdf\\xc6\\x2a\\xde\\x00\\x2c\\xb2\\x03\\x0e\\xea\\x81\\x92\\xf6\\x48\\x22\\xec\\xa6\\x79\\x9a\\x82\\x7e\\x47\\xc9\\x76\\xb4\\xb8\\x6e\\xdd\\x78\\x20\\xd0\\x7a\\x95\\x64\\x07\\x8e\\x4f\\x11\\xdd\\x92\\x0d\\xe1\\x2a\\x9f\\x47\\xc8\\x19\\x31\\x7b\\x92\\x2d\\x54\\xd2\\x1c\\xac\\x8e\\x25\\x95\\x17\\x2a\\x09\\x8f\\x23\\xce\\x4e\\xee\\x01\\x1d\\xb7\\xa7\\x72\\x0f\\x7b\\x3c\\x25\\xf1\\x41\\xb6\\x57\\x9a\\x17\\x1d\\xa1\\x92\\xff\\xc8\\xa1\\xcd\\x75\\x38\\x54\\x92\\x1f\\xfb\\x12\\xc1\\xc6\\xaa\\x24\\x3e\\xaa\\x53\\x46\\x06\\x2b\\x38\\xd9\\x09\\xd5\\xcd\\x16\\xfc\\x88\\x1e\\x88\\x1b\\xe8\\xb8\\x74\\xf7\\x33\\x84\\x1c\\xea\\xc8\\xc2\\x26\\x7e\\xa8\\x86\\xa2\\xcb\\xed\\xaf\\x38\\xaa\\xd9\\x27\\x7b\\xf8\\x9b\\x65\\xa8\\x64\\x42\\xa4\\x2a\\xec\\x28\\x18\\x54\\x6b\\x6e\\xae\\x65\\x37\\x1d\\x25\\x4f\\x22\\xd5\\x34\\xe4\\xee\\x42\\x65\\xdf\\x86\\x54\\xc7\\x66\\x74\\x4a\\xb6\\x45\\xaa\\x67\\x4a\\x2e\\x86\\xea\\xa6\\x8e\\x32\\x41\\xd9\\x3e\\xc5\\xe6\\x0a\\xea\\xbe\\x0e\\x5e\\xc1\\xd4\\x1b\\x25\\x07\\xd3\\xe2\\x9b\\xa5\\xad\\xa4\\x5f\\xda\\x1a\\x06\\x95\\xce\\xd5\\xc9\\x69\\x56\\xe5\\xb0\\x1b\\x52\\x73\\x2e\\xa7\\x02\\x97\\xec\\x1c\\x05\\x84\\x3d\\x57\\x57\\x00\\x16\\xdc\\x85\\x3e\\xde\\x8d\\x02\\x59\\xea\\xb8\\x66\\x69\\xdf\\xe8\\xc8\\x86\\xfc\\x4a\\xa8\\xe4\\x57\\x08\\x2e\\x3c\\x05\\x5c\\xf8\\x5f\\x5c\\xbe\\x7e\\xe2\\xf3\\x64\\x17\\xe5\\xbc\\xce\\x13\\x53\\xef\\x0e\\x12\\xd3\\x93\\x8b\\x7e\\xd1\\x1d\\xf5\\xaa\\x51\\xe1\\x1e\\x92\\xfd\\x21\\x25\\x6b\\x12\\xfd\\x18\\x2c\\x39\\x30\\x2c\\x6e\\x17\\x3f\\xe0\\xf4\\x16\\x37\\xe3\\xc8\\xc9\\xf0\\x09\\x4f\\xfe\\x33\\xff\\x73\\xf2\\x4d\\x99\\xa0\\x74\\x22\\x9c\\x51\\x16\\x5a\\x9c\\x15\\xf7\\xf2\\x86\\x71\\x6f\\x16\\xde\\xcc\\x97\\xc1\\x6c\\xca\\xce\\x41\\x7e\\x39\\x9d\\x4e\\x37\\xe0\\x39\\x0f\\xf9\\x90\\xa5\\x7a\\xb6\\x52\\xe4\\x8c\\x9f\\xac\\xec\\xda\\xe5\\x25\\x62\\xd3\\xfc\\xc4\\x25\\x3a\\xb7\\x2d\\x2f\\xd1\\x76\\xb9\\x51\\x8f\\x24\\xd1\\x33\\xc2\\x6b\\x72\\x2e\\xb1\\x3d\\x03\\xcc\\xaa\\x84\\xd3\\x79\\xb8\\x8c\\xb4\\x2a\\xc2\\x29\\x26\\x5a\\xaf\\x3d\\x33\\x3c\\x2f\\xee\\x1d\\x74\\xaa\\x73\\xa7\\xdb\\x27\\x1f\\x9d\\x2a\\xb7\\x24\\x5f\\xd8\\x1a\\x9a\\x1b\\x86\\xe9\\xe6\\xbb\\x5d\\x85\\xeb\\xb5\\x1b\\x16\\xf7\\xca\\x29\\x59\\x9f\\x1c\\x06\\x52\\x4e\\xe7\\x1e\\x93\\x38\\x4e\\xf1\\xc5\\x8b\\x50\\x99\\x9f\\x2a\\x9c\\xd2\\x33\\x87\\x6f\\xbd\\xa4\\xc6\\xc7\\xb7\\xe8\\x6d\\x72\\xdc\\x4f\\x60\\x18\\x81\\x24\\xc7\\xbd\\x5b\\xe2\\xaa\\xc8\\xb3\\x2a\\xb9\\xc5\\x13\\x8f\\x7c\\x30\\xca\\x50\\x92\\x3a\\xac\\x6a\\x5b\\xd0\\xfc\\x29\\x9f\\xe9\\xde\\xc8\\xc7\\x92\\x36\\xe2\\x61\\x45\\x4a\\xb8\\x51\\x24\\x8e\\xf9\\xa1\\x9f\\x12\\xc5\\xc9\\xa9\\x5a\\x2f\\x8a\\x7b\\x0a\\x6e\\x49\\xc3\\x07\\xc0\\xcd\\xd4\\xdb\\xc3\\x97\\x16\\xa3\\x02\\x2d\\x49\\x3f\\x19\\xf8\\x65\\x1c\\xc7\\x1b\\x99\\xbf\\x99\\x38\\x36\\x9a\\x71\\x40\\x8f\\x55\\xa0\\x34\\x75\\xbc\\xb0\\x72\\x30\\xaa\\xb0\\x9b\\x64\\x6e\\x7e\\xaa\\x37\\x6e\\xde\\x87\\x61\\x07\\x53\\x39\\xd0\\x8f\\x45\\x8a\\x94\\xe6\\xfe\\x8b\\xcb\\xa1\\x64\\x9a\\x27\\xce\\x3b\\x6c\\x06\\x2d\\xfb\\x9b\\xb9\\x7f\\x52\\xc4\\x0f\\x31\\x6e\\xba\\xf3\\x59\\x62\\x07\\x31\\xc6\\x17\\xaf\\x2a\\xdd\\x3c\\x4b\\x1f\\xba\\x43\\x22\\x68\\x5b\\xe5\\xe9\\xa9\\xc6\\x1b\\x26\\xe1\\xe2\\x9e\\x0b\\xb8\\xf9\\xd9\\x9d\\x90\\x64\\x96\\xe7\\x36\\xa5\\xca\\x11\\xee\\x0d\\xf9\\x08\\x53\\xe2\\xa8\\x7e\\xe9\\x4f\\xc8\\xbf\\x57\\xdd\\x81\\x4a\\xde\\x22\\x35\\x73\\xd4\\xcc\\x93\\xd9\\x61\\x7a\\x00\\x42\\x47\\x4a\\xcb\\x1b\\xbd\\xcd\\x82\\x71\\x46\\xf4\\x2d\\xea\\xbe\\x3d\\x4b\\xad\\x9e\\x94\\xa6\\xfc\\x10\\xeb\\xfb\\xb9\\xcc\\xd3\\xf6\\x00\\xf4\\x59\\x39\\xc1\\xec\\x1d\\x82\\x89\\x77\\x08\\x27\\xde\\x61\\x3a\\xf1\\x0e\\xb3\\x89\\x77\\x98\\x4f\\xbc\\xc3\\x62\\x72\\x08\\x26\\xf4\\x38\\xdd\\x61\\x36\\x39\\xcc\\x27\\x87\\x85\\xd9\\xb5\\xb0\\x43\\x30\\x73\\xf5\\x10\\x8c\\x17\\x28\\x87\\xba\\xbd\\x43\\xe0\\x78\\x64\\xd3\\xc7\\xa4\\xf9\\xc9\\x7f\\x85\\x5d\\x61\\xd8\\x16\\x4e\\xbb\\xc2\\x69\\x5b\\x38\\xeb\\x0a\\x67\\x6d\\xe1\\xbc\\x2b\\x9c\\xb7\\x85\\x8b\\xae\\x70\\xc1\\x0a\\xbb\\xc6\\xdb\\xb6\\xbb\\xa6\\xdb\\x96\\xbb\\x86\\xdb\\x76\\xbb\\x66\\xdb\\x56\\xbb\\x46\\xdb\\x36\\xbb\\x26\\x79\\x8b\\x67\\xfb\\x11\\x21\\x36\\x10\\x97\\xcb\\xa5\\xa4\\x04\\x2e\\xf8\\x1e\\x63\\x6f\\x82\\xd6\\x63\\x05\\x7a\\xad\\x44\\x84\\xd8\\xb9\\x98\\xbf\\xb8\\x48\\x66\\xc3\\xad\\x45\\xe0\\x3e\\x30\\x72\\xff\\x38\\x7d\\x3e\\x4a\\x2d\\xfc\\xb2\\x07\\x22\\xfb\\x43\\x20\\x14\\x4e\\x89\\x4b\\x6e\\x74\\x10\\x8a\\xa5\\x94\\xe3\\x69\\xa3\\x19\\xe1\\x26\\x8a\\x19\\xed\\xc7\\xe4\\x30\\x13\\x27\\x14\\x37\\xa4\\x74\\x3e\\x39\\xcc\\xcf\\x72\\xd0\\xbf\\x10\\x19\\x2d\\xc4\\xd2\\x26\\xb0\\x15\\x6d\\x4c\\x73\\x7c\\x87\\xca\\x26\\xc5\\x28\\x3e\\x03\\xfe\\x4d\\xa8\\xb9\\xe0\\x7f\\x0a\\xf7\\xec\\x2a\\xfe\\xff\\x42\\xcf\\x41\\xbf\\x3c\\x26\\x19\\x8b\\x1e\\xcb\\xc5\\x4d\\x71\\xff\\xea\\x4c\\xe9\\x0b\\x1d\\x09\\x8a\\xfb\\xcb\\x85\\x49\\x4a\\xbb\\x3b\\xa3\\x11\\xd3\\x11\\x95\\xef\\x26\\xe4\\xd6\\x8d\\xf6\\xe0\\x79\\x88\\x8f\\x50\\x64\\x89\\x76\\x37\\x78\\x7a\\xf1\\xc8\\x6c\\xa0\\x99\\xb8\\xd2\\xd3\\xcd\\x34\\x3e\\x37\\x7f\\x33\\x10\\x99\\xa7\\x8a\\x30\\x52\\xc0\\x80\\x74\\x0b\\xb6\\x08\\xa5\\x25\\x0c\\xcc\\x36\\x51\\x8b\\x70\\x56\\xc4\\x10\\xb2\\xfc\\xae\\x44\\xc5\\xf9\\xee\\x90\\xd4\\x98\\x1c\\x49\\xc7\\x6b\\x5a\\xc4\\xf9\\xca\\xef\\x70\\x19\\xa1\\x0a\\xab\\x77\\x48\\xb4\\x00\\x86\\x78\\x2a\\x0a\\x18\\xb1\\x05\\x70\\x8e\\x51\\x41\\xb6\\xbb\\xff\\xa6\\x61\\x76\\x10\\x86\\x7a\\x3c\\xd5\\x38\\x3e\\x8b\\xe3\\x9f\\x14\\x17\\x65\\x42\\xae\\x8a\\x91\\xe6\\x61\\x17\\x24\\x01\\xf9\\xfc\\x4b\\x2e\\x94\\x27\\x63\\x37\\x0b\\x7f\\xe5\\x33\\x9a\\xd5\\x29\\x8a\\x70\\x55\\xb5\\x34\\xa3\\xe5\\x62\\x1a\\x73\\x9a\\x0c\\x28\\xd3\\xe4\\x85\\x32\\xcd\\xed\\x7c\\x16\\x46\\x8c\\x66\\x92\\xed\\xf2\\x96\\x60\\xb0\\xf4\\x6f\\x76\\x9c\\x60\\x03\\x91\\xa9\\x91\\x12\\x99\\xd4\\x6c\\x1e\\x2e\\x56\\x8c\\x14\\xdb\\xda\\xc6\\x61\\x37\\x68\\x11\\x4f\\xb7\\x9c\\x1a\\x03\\xca\\x04\\x79\\xa1\\x44\\x73\\xb1\\x98\\x07\\x2d\\x7b\\x31\\xca\\xf6\\x1d\\x08\\xad\\x66\\xb3\\x59\\xc8\\x49\\x52\\x98\\x4c\\x91\\x95\\x49\\x04\\x6f\\x66\\xd3\\xf9\\x74\\x76\\xf1\\xb6\\x7b\\x55\\x2b\\x64\\xde\\xa4\\xd9\\x7c\\xab\\xab\\xae\\x42\\xdb\\x88\\x50\\x44\\xdb\\xd0\\xab\\x73\\x95\\x6d\\xf7\\xad\\xc2\\x74\\xa4\\x78\\xb7\\xf3\\xe3\\x1b\\xda\\x86\\xaa\\x39\\xa1\\xc8\\xd4\\x46\\x14\\xe0\\x70\\x3b\\x25\\x6d\\x10\\x05\\x02\\x0d\\xac\\x70\\xbc\\x63\\x9d\\x90\\x34\\xc9\\xff\\x36\\x91\\x46\\xbb\\x78\\xd5\\xcc\\xab\\xb6\\xfb\\x56\\xa1\\x46\\xb7\\x80\\x04\\x2c\\xb1\\x01\\x59\\xaf\\x40\\xf5\\x25\\x8e\\xb6\\x73\\xd2\\x06\\x53\\x30\\x80\\x13\\xc6\\x38\\xc6\\xb4\\x09\\x45\\xd3\\x5d\\x89\\xa9\\x01\\x3c\\xdb\\xae\\xb6\\xab\\x8b\\x47\\xee\\x08\\xa0\\x5f\\x3d\\xb9\\xa7\\xe3\\x0e\\x78\\xd5\\xc6\\xb1\\xf5\\xcc\\x2f\\xee\\x1d\\xdf\\x11\\xa6\\x9c\\xe2\\x95\\x47\\xc2\\x64\\x33\\x4f\\x27\\xa7\\x54\\x8c\\x86\\x3e\\x14\\x0a\\xf3\\xd4\\xc9\\xd3\\x49\\x9e\\x3a\\xa7\\x06\\xdd\\x21\\x95\\x9c\\xae\\x1e\\x43\\xf5\\x2f\\x1e\\x39\\x0f\\x76\\xca\\xc8\\x49\\xe4\\xf6\\xee\\x0e\\x9a\\x1e\\x68\\x9c\\x7f\\xd5\\x1d\\x52\\xce\\x30\\xc3\\xa6\\xcb\\x08\\x15\\x97\\x51\\x26\\x7f\\xb9\\x73\\xb2\\x72\\x30\\x57\\x7e\\x9b\\x26\\xf0\\xaa\\x84\\x13\\xa5\\x39\\x87\\x79\\x37\\x59\\xa6\\x84\\xe7\\xc5\\xfd\\x25\\xb6\\xf6\\xbe\\x11\\xe0\\x25\\x8e\\x27\\xb1\\x7c\\x99\\x4d\\xb7\\x74\\xb9\\xc4\\xb5\\x7e\\x63\\x54\\x1b\\x19\\x69\\x67\\xcc\\x51\\x2e\\x4e\\x85\\x9c\\x9a\\xd3\\x90\\x4a\\x73\\x54\\x93\\x28\\xc4\\xe7\\xfa\\x0b\\x1f\\x9c\\xcc\\x63\\x54\\x52\\x34\\x35\\x40\\xd1\\x82\\xb6\\x02\\x4e\\xd3\\xa4\\xa8\\x92\\x6a\\x03\\x85\\x1a\\xa5\\x79\\x99\\xed\\xe0\\xa6\\xe9\\x3b\\xbd\\xb7\\x23\\x46\\x35\\x72\\xf3\\x32\\xd9\\x27\\x19\\x4a\\x5d\\x7a\\x8b\\xc7\\x44\\xbc\\x56\\x8b\\xcd\\xda\\x0f\\x38\\x2d\\x00\\x7b\\xa3\\x57\\x6c\\x39\\x34\\x96\\x24\\x59\\x42\\x0e\\x99\\x57\\x47\\x21\\x84\\xaf\\xfc\\x17\\x1b\\x63\\x00\\xeb\\x6e\\xf4\\x68\\x63\\x7b\\x63\\x95\\x8e\\x30\\xed\\x24\\x33\\x13\\x75\\x02\\xb2\\xf4\\xe6\\x9d\\xf9\\x73\\x85\\x8b\\xc6\\xdf\\x11\\x76\\xf2\\x74\\x9d\\xa2\\xaa\\x76\\xa3\\x43\\x92\\xc6\\x13\\x01\\x50\\x18\\xca\\x4f\\x62\\x05\\x6d\\x20\\x08\\x88\\x6c\\xd2\\x22\\x94\\xb0\\xeb\\xd9\\x84\\x12\\x3a\\xa3\\x91\\xd7\\xeb\\xd2\\xdd\\x60\\x3d\\xd9\\x98\\x46\\xb0\\x5a\\x93\\x2c\\x3b\\xa5\\xb7\\x0c\\x00\\xc0\\xad\\xee\\x5f\\xfd\\x3d\\xf4\\x83\\x99\\xf3\\x77\\xdf\\xff\\xc6\\xff\\xea\\xe2\\x75\\xe8\\x6e\\x89\\x6f\\x71\\x59\\x89\\x14\\xbc\\xe2\\x94\\xa6\\x6c\\xce\\x24\\x8f\\xba\\x40\\x1b\\x76\\xbe\\x6e\\xb4\\x7c\\x39\\xcd\\xc7\\xa9\\xa0\\x25\\x49\\x81\\x3e\\xc4\\x86\\xd2\\x5f\\x08\\x43\\xee\\x38\\x84\\x61\\x10\\x99\\xd0\\x2f\\xa3\\x58\\x45\\x1c\\x93\\x84\\x45\\x1c\\x58\\xd8\\xa0\\x84\\x79\\x9b\\x34\\xdf\\x68\\xe9\\x99\\x19\\x41\\x24\\x60\\xed\\x97\\x0d\\x45\\x6a\\xc5\\xd6\\x2b\\xf9\\x3a\\x9e\\xaf\\x88\\xed\\x38\\xc4\\x8e\\xbe\\xba\\xa0\\x38\\x2e\\x9b\\xb9\\x83\\x71\\xd9\\x20\\xde\\x5f\\x61\\x70\\xb7\\xf6\\x2b\\xe0\\xfe\\x8c\\xb3\\x34\\x9f\\xfc\\x39\\xcf\\x50\\x94\\x4f\\xbe\\x23\\xd9\\x71\\x54\\x4d\\xa2\\xfc\\x54\\x26\\xb8\\x74\\x32\\x7c\\xd7\\x5d\\x0d\\x47\\x28\\xb5\\xfe\\x24\\x2c\\xee\\x9d\\x99\\xe4\\x3d\\x1a\\x8f\\xc4\\xa7\\x26\\xcb\\x70\\x3e\\xc3\\xd0\\x52\\x62\\xb5\\x0b\\x77\\x33\\x3d\\x23\\x75\\x79\\xb7\\x8d\\x87\\x91\\x36\\x4d\\xd7\\xa6\\x0a\\xd1\\xa9\\x90\\xe6\\x12\\xae\\x6c\\x4a\\xb2\\x0a\\xd7\\x8e\\xef\\xb8\\x01\\x09\\xf7\\xe5\\x7e\\x8b\\x58\\x7a\\xc7\\x0b\\xe7\\xaf\\x36\\x83\\x31\\x1b\\x86\\x1d\\x91\\x69\\xf1\\x3a\\x43\\x92\\xd0\\x53\\xaf\\x42\\x35\\xdc\\x2c\\xa5\\xde\\x27\\x45\\x2e\\xf1\\x93\\xfd\\x1a\\x6f\\x62\\x45\\xbc\\xb3\\xb2\\xb0\\x14\\x9b\\x9d\\x0e\\x4a\\x42\\xdf\\xe5\\x65\\x4c\\xef\\x4c\\x5a\\xb3\\x9b\\x93\\xd2\\x94\\x16\\x36\\x31\\x8e\\x95\\x35\\x7f\\x43\\xfa\\x9b\\x37\\xff\\x80\\x3c\\x63\\x14\\x45\\x80\\x56\\x8b\\x12\\x3b\\x92\\xd5\\xf8\\x40\\xee\\x5a\\x4a\\x29\\x49\\x51\\xb7\\x28\\x31\\xe1\\x49\\x67\\x44\\x48\\xe0\\x2b\\xcd\\xfa\\x17\\xaf\\xa9\\x56\\x45\\x65\\x9e\\xa6\\xe4\\x4e\\xa6\\x23\\xba\\xe7\\x02\\x99\\xce\\xc4\\xb9\\x81\\xfb\\xb0\\xa6\\x68\\x17\\xaf\\x19\\x7e\\x28\\x11\\xae\\xe6\\x33\\xba\\xe2\\xa0\\xd3\\x01\\xc3\\x11\\xd2\\x76\\x14\\x85\\xe4\\xe8\\x8c\\x33\\x98\\xae\\x29\\x56\\x3e\\x27\\xb3\\x06\\x0d\\x7f\\xb5\\x0a\\x41\\xfc\\xd5\\x12\\xc6\\x0f\\x42\\xdf\\x07\\x2b\\x04\\x01\\xad\\xd1\\x01\\xdc\\x5d\\x7a\\x4a\\xe2\\x27\\xeb\\xaa\\x57\\xe6\\x77\\x67\\x09\\xcf\\x15\\xab\\xd2\\x19\\x69\\x53\\xd2\\xb0\\x90\\xba\\xe9\\xde\\x0d\\x26\\xed\\x2f\\xbf\\xfb\\x29\\x94\\x86\\xed\\xcf\\xee\\xd7\\xb4\\xfd\\x35\\x6b\\x7f\\xcd\\xdb\\x5f\\x8b\\xf6\\xd7\\xb2\\xfd\\x75\\xd3\\xfe\\x5a\\xd1\\x5f\\xc7\\x98\\x37\\xdd\\xfc\\xf2\\xbb\\x9f\\x42\\x69\\xd8\\xfe\\xec\\x7e\\x4d\\xdb\\x5f\\xb3\\xf6\\xd7\\xbc\\xfd\\xb5\\x68\\x7f\\x2d\\xdb\\x5f\\x37\\xed\\x2f\\xd6\\x74\\x75\\xe4\\x4d\\x37\\xbf\\xfc\\xee\\xa7\\x50\\x1a\\xb6\\x3f\\xbb\\x5f\\xd3\\xf6\\xd7\\xac\\xfd\\x35\\x6f\\x7f\\x2d\\xda\\x5f\\xcb\\xf6\\xd7\\x4d\\xfb\\x8b\\x35\\x7d\\x5f\\xf1\\xa6\\x9b\\x5f\\x7e\\xf7\\x53\\x28\\x0d\\xdb\\x9f\\xdd\\xaf\\x69\\xfb\\x6b\\xd6\\xfe\\x9a\\xb7\\xbf\\x16\\xed\\xaf\\x65\\xfb\\xeb\\xa6\\xfd\\xb5\\x02\\x2e\\x6c\\x6a\\x6c\\x55\\xcf\\xc2\\x5b\\xcd\\xef\\xf2\\x11\\x3b\\xd0\\xad\\x2c\\x3a\\x2e\\xc2\\x73\\xf7\\xc9\\xa6\\x2b\\x0d\\xf8\\xd0\\x0c\\xbc\\x05\\xfd\\xbf\\xa5\\x00\\xf5\\x19\\xf4\\x66\\xea\\x4d\\xd9\\xff\\x75\\xd0\\x55\\xeb\\x05\\xba\\xb2\\x1b\\x56\\xb6\\x58\\x00\\xe4\\x96\\x0c\\x38\\xbf\\x01\\xa8\\x2d\\x38\\x50\\xe0\\x6e\\xce\\xca\\x66\\x10\\x73\\x33\\x06\\x9c\\x42\\xbc\\x4d\\x19\\x30\\x14\\x78\\x6b\\x05\\x00\\xf1\\xc6\\xe5\\x00\\xb1\\x46\\xe6\\x3d\\x41\\x78\\x66\\xda\\x16\\xe5\\x47\\x41\\x01\\x03\\x81\\x42\\xa4\\x28\\x3e\\x43\\x01\\x25\\x49\\x50\\x56\\x0c\\x43\\x14\\x27\\x01\\xdc\\x30\\x00\\x28\\x53\\x82\\xb1\\x64\\x18\\xa0\\x60\\x09\\xc6\\x82\\x63\\xa8\\xbc\\xcf\\x19\\x00\\x14\\x31\\xc1\\x98\\x31\\x0c\\x50\\xce\\x04\\x63\\xca\\x30\\x42\\x95\\xf3\\x56\\x64\\x46\\xce\\xb9\\xe4\\x8c\\x8c\\x73\\xb9\\x51\\x6f\\xdd\\x42\\xaa\\x43\\xa3\\x10\\x3a\\xd6\\x64\\x7d\\x34\\x90\\x80\\x42\\x0c\\xea\\x68\\x30\\x7c\\x8a\\x61\\xd0\\x46\\x75\\x70\\x57\\x14\\x41\\x56\\x46\\x75\\x70\\x6f\\x68\\xb9\\x41\\x17\\xd5\\xc1\\x5d\\x52\\x04\\x83\\x2a\\xaa\\x83\\xbb\\x60\\x08\\x2a\\xd7\\x73\\x5a\\x6e\\x50\\x44\\x75\\x70\\x67\\x14\\xc1\\xa0\\x87\\xea\\xe0\\x4e\\x29\\x42\\xa8\\xf2\\xcc\\x05\\x65\\xe4\\x99\\xc9\\xcb\\xc8\\x32\\x93\\x96\\xa4\\x03\\xfa\\x2d\\xbc\\xd1\\x82\\x94\\x47\\x10\\x95\\xc1\\x51\\x02\\x09\\x05\\xd4\\x0a\\x47\\xf5\\x25\\x54\\x50\\x3d\\x0c\\x75\\x25\\x61\\x8a\\x7a\\x62\\x08\\x37\\x12\\x02\\xa8\\x30\\x86\\xb9\\x94\\x30\\x41\\xcd\\x31\\xcc\\x85\\x8c\\xa9\\xf7\\x75\\x2e\\x21\\x80\\xba\\x64\\x98\\x33\\x09\\x13\\x54\\x2a\\xc3\\x9c\\x4a\\x98\\xa1\\xde\\x53\\x45\\x05\\x96\\x9e\\xca\\x9a\\xb0\\x74\\xd4\\x1f\\x9a\\xd4\\xfa\\x68\\xf3\\x03\\x2d\\xc6\\x91\\x56\\xb4\\x18\\x47\\xd8\\x30\\xc6\\x38\\xc2\\xaf\\x31\\xc6\\x91\\x66\\x94\\x18\\xd7\\x30\\x61\\x8c\\x71\\x0d\\xaf\\xc6\\x18\\xd7\\x74\\x49\\x8d\\x71\\x4d\\x87\\x8d\\x31\\xae\\x91\\x8b\\x31\\xc6\\x35\\xe2\\x53\\x63\\x5c\\x23\\x5c\\x63\\x8c\\x6b\\xba\\x6a\\x8a\\x71\\xd5\\xd1\\x18\\xe3\\x5a\\x90\\x39\\xc6\\xb5\\x28\\xe6\\x18\\xc7\\x51\\xb4\\x18\\xc7\\x01\\xe6\\x18\\xc7\\x31\\xcc\\x31\\x8e\\x63\\x68\\x31\\x8e\\x03\\xcc\\x31\\x8e\\x63\\x98\\x63\\x1c\\xc7\\xd0\\x62\\x1c\\x07\\x98\\x63\\x5c\\x2b\\x17\\x53\\x8c\\xe3\\x08\\x7a\\x8c\\x23\\x10\\x30\\xc6\\xb5\\x10\\x63\\x8c\\x6b\\x31\\x8c\\x31\\x8e\\x63\\xa8\\x31\\x8e\\x97\\x1b\\x63\\x1c\\x47\\x30\\xc6\\x38\\x8e\\xa0\\xc6\\x38\\x5e\\x6e\\x8c\\x71\\x1c\\xc1\\x18\\xe3\\x38\\x82\\x1a\\xe3\\x78\\xb9\\x31\\xc6\\xb5\\xe2\\x30\\xc4\\x38\\x0e\\xd7\\x62\\x5c\\x75\\xec\\x8d\\x71\\x02\\x4a\\x5f\\x8c\\x13\\x50\\xfb\\x62\\x5c\\x87\\x6a\\x88\\x71\\x1d\\x42\\x5f\\x8c\\xeb\\x30\\xfb\\x62\\x5c\\x87\\x69\\x88\\x71\\x1d\\x42\\x5f\\x8c\\xeb\\x30\\xfb\\x62\\x5c\\x87\\x69\\x88\\x71\\x1d\\x42\\x5f\\x8c\\x13\\xe4\\x6b\\x8f\\x71\\x1d\\xa2\\x1a\\xe3\\x6c\\x79\\x8c\\x8f\\xb4\\xfe\\xd6\\x82\\x1c\\x69\\x45\\x0b\\x72\\x84\\x0d\\x63\\x90\\x23\\xfc\\x1a\\x83\\x1c\\x69\\x46\\x09\\x72\\x0d\\x13\\xc6\\x20\\xd7\\xf0\\x6a\\x0c\\x72\\x4d\\x97\\xd4\\x20\\xd7\\x74\\xd8\\x18\\xe4\\x1a\\xb9\\x18\\x83\\x5c\\x23\\x3e\\x35\\xc8\\x35\\xc2\\x35\\x06\\xb9\\xa6\\xab\\xa6\\x20\\x77\\x8c\\x8d\\x41\\xae\\x05\\x99\\x83\\x5c\\x8b\\x62\\x0e\\x72\\x1c\\x45\\x0b\\x72\\x1c\\x60\\x0e\\x72\\x1c\\xc3\\x1c\\xe4\\x38\\x86\\x16\\xe4\\x38\\xc0\\x1c\\xe4\\x38\\x86\\x39\\xc8\\x71\\x0c\\x2d\\xc8\\x71\\x80\\x39\\xc8\\xb5\\x72\\x31\\x05\\x39\\x8e\\xa0\\x07\\x39\\x02\\x01\\x83\\x5c\\x0b\\x31\\x06\\xb9\\x16\\xc3\\x18\\xe4\\x38\\x86\\x1a\\xe4\\x78\\xb9\\x31\\xc8\\x71\\x04\\x63\\x90\\xe3\\x08\\x6a\\x90\\xe3\\xe5\\xc6\\x20\\xc7\\x11\\x8c\\x41\\x8e\\x23\\xa8\\x41\\x8e\\x97\\x1b\\x83\\x5c\\x2b\\x0e\\x43\\x90\\xe3\\x70\\x2d\\xc8\\x1d\\xe3\\xde\\x20\\x27\\xa0\\xf4\\x05\\x39\\x01\\xb5\\x2f\\xc8\\x75\\xa8\\x86\\x20\\xd7\\x21\\xf4\\x05\\xb9\\x0e\\xb3\\x2f\\xc8\\x75\\x98\\x86\\x20\\xd7\\x21\\xf4\\x05\\xb9\\x0e\\xb3\\x2f\\xc8\\x75\\x98\\x86\\x20\\xd7\\x21\\xf4\\x05\\x39\\x41\\xbe\\xf6\\x20\\xd7\\x21\\xf6\\x07\\x39\\x21\\xf9\\xfe\\x91\\x12\\xdc\\x5a\\x94\\x23\\xad\\x68\\x51\\x8e\\xb0\\x61\\x8c\\x72\\x84\\x5f\\x63\\x94\\x23\\xcd\\x28\\x51\\xae\\x61\\xc2\\x18\\xe5\\x1a\\x5e\\x8d\\x51\\xae\\xe9\\x92\\x1a\\xe5\\x9a\\x0e\\x1b\\xa3\\x5c\\x23\\x17\\x63\\x94\\x6b\\xc4\\xa7\\x46\\xb9\\x46\\xb8\\xc6\\x28\\xd7\\x74\\xd5\\x14\\xe5\\xd2\\xbd\\x31\\xca\\xb5\\x20\\x73\\x94\\x6b\\x51\\xcc\\x51\\x8e\\xa3\\x68\\x51\\x8e\\x03\\xcc\\x51\\x8e\\x63\\x98\\xa3\\x1c\\xc7\\xd0\\xa2\\x1c\\x07\\x98\\xa3\\x1c\\xc7\\x30\\x47\\x39\\x8e\\xa1\\x45\\x39\\x0e\\x30\\x47\\xb9\\x56\\x2e\\xa6\\x28\\xc7\\x11\\xf4\\x28\\x47\\x20\\x60\\x94\\x6b\\x21\\xc6\\x28\\xd7\\x62\\x18\\xa3\\x1c\\xc7\\x50\\xa3\\x1c\\x2f\\x37\\x46\\x39\\x8e\\x60\\x8c\\x72\\x1c\\x41\\x8d\\x72\\xbc\\xdc\\x18\\xe5\\x38\\x82\\x31\\xca\\x71\\x04\\x35\\xca\\xf1\\x72\\x63\\x94\\x6b\\xc5\\x61\\x88\\x72\\x1c\\xae\\x45\\xb9\\x74\\xdf\\x1b\\xe5\\x04\\x94\\xbe\\x28\\x27\\xa0\\xf6\\x45\\xb9\\x0e\\xd5\\x10\\xe5\\x3a\\x84\\xbe\\x28\\xd7\\x61\\xf6\\x45\\xb9\\x0e\\xd3\\x10\\xe5\\x3a\\x84\\xbe\\x28\\xd7\\x61\\xf6\\x45\\xb9\\x0e\\xd3\\x10\\xe5\\x3a\\x84\\xbe\\x28\\x27\\xc8\\xd7\\x1e\\xe5\\x3a\\x44\\x2d\\xca\\xb1\\x27\\x8d\\x6c\\x6f\\x48\\xb2\\x67\\x34\\xdb\\x4f\\xc9\\x75\\x5e\\xac\\x6f\\x84\\x0f\\x79\\x6c\\xc7\\x4a\\x53\\xd4\\x6d\\xbc\\xda\\xa8\\xdb\\xc7\\xeb\\x03\\xb0\\xa3\\x9c\\x34\\x2e\\x1c\\x90\\x52\\xce\\x4b\\x01\\xbb\\x0e\\x69\\x9d\\xb7\\xf5\\x36\\x8f\\x1f\\xde\\xd6\\xe5\\xdb\\xf6\\x95\\x24\\xa1\\xe8\\xd0\\x16\\xed\\xf2\\xbc\\x56\\xb0\\xda\\xa2\\x0e\\xeb\\x80\\x51\\xac\\x60\\xb5\\x45\\xdd\\x8b\\x67\\x37\\xe6\\x8d\\x17\\xca\\x71\\xb6\\x3a\\x2f\\x0c\\x07\\x99\\xe2\\x38\\xbe\\x00\\x4d\\xa8\\x8f\\x55\\x92\\xfe\\x2a\\x3b\\x06\\x43\\x90\\x0a\\xd3\\xcd\\x6b\\x4e\\x6d\\xbd\\x4b\\x4a\\xbe\\xfd\\x4e\\xe8\\x8f\\x1d\\xad\\x95\\x44\\x94\\xa7\\xe4\\x3d\\xaf\\x5e\\x72\\x76\\x3c\\x59\\xb2\\x32\\xcc\\x44\\xb2\\x1f\\xf5\\x20\\x3c\\xde\\xb5\\xf6\\x25\\x43\\x78\\x4d\\xfe\\x5b\\x84\\x83\\xd2\\x72\\x3c\\x83\\xb5\\x93\\x13\\x9a\\xec\\xb1\\xad\\x28\\xcf\\x62\\xf2\\x8c\\x2e\\x60\\x63\\x20\\xf0\\x00\\x00\\x35\\xbb\\x03\\x81\\x50\\x4d\\xcd\\x16\\x41\\x60\\x67\\x95\\xf3\\x76\\x4c\\xb4\\xcf\\x84\\xc1\\x6f\\x84\\xa9\\x58\\x50\\xf7\\x00\\xd8\\x41\\x87\\xe9\\x9d\\x03\\x60\\x40\\x3d\\xbd\\x6b\\x00\\xcc\\xf0\\xc2\\x99\\xce\\xfd\\x28\\x6a\\x6c\\x10\\x31\\xdf\\x12\\x76\\x32\\xab\\xea\\x32\\x29\\x84\\x0e\\xaf\\xb3\\xfa\\xe0\\xe6\\x3b\\xb7\\x7e\\x28\\xf0\\xcb\\x3c\\x8e\\x5f\\x41\\xc6\\xb2\\x6a\\xfe\\x71\\x0a\\x64\\x67\\x7a\\x57\\xdf\\xb8\\x13\\x9e\\x6c\\xaa\\xa2\\xee\\xd6\\x89\\xf2\\xf4\\xe7\\x28\\x45\\x55\\xf5\\xf5\\xef\\x1b\\xf7\\xfc\\x8b\\x76\\x6e\\x50\\x7e\\x6a\\x2f\\xca\\xd3\\xd3\\x31\\xdb\\xd0\\xc9\\x3f\\xd9\\x3f\\xc6\\x9f\\x97\\x93\\xa8\\x4c\\xf8\\x53\\x73\\xa3\\x68\\xe3\\x34\\x15\\x29\\x2b\\xce\\xd4\\xa3\\x27\\x1e\\x01\\x37\\xdb\\x42\\x0e\\xba\\x03\\x8e\\x3d\\x7e\\x50\\x52\\x73\\xcd\\x2a\\x84\\x19\\x0c\\xd0\\x8e\\x0a\\x81\\xbc\\xba\\x81\\x1a\\xd0\\x0e\\x33\\x09\\xa0\\x1d\\x15\\x02\\xc5\\x05\\x03\\xb5\\xae\\x1d\\xb3\\xc6\\x41\\x33\\x61\\xb5\\xd6\\xac\\xb4\\x35\\x61\\x2b\\xd6\\x01\\xc6\\x62\\x60\\x99\\x45\\x05\\xa7\\xeb\\x02\\xc5\\x36\\x61\\x1d\\x24\\x2c\\xe8\\xbc\\xc5\\x4d\\xf3\\x4f\\xb3\\x12\\x76\\x8c\\x05\\x32\\x93\\x16\\x04\\xda\\x09\\x83\\x42\\x86\\xa2\\x82\\xb8\\x3d\\x00\\x6d\\x69\\x20\\xd0\\x56\\x0c\\x04\\xa1\\xb6\\xb8\\x4d\\x00\\x6d\\x69\\x20\\xd0\\x5e\\x0c\\x04\\x85\\xb6\\xcc\\x67\\x85\\x60\\x5b\\x90\\x4e\\x0a\\x99\\x4d\\x46\\x41\\xeb\\xb1\\x19\\x99\\x4d\\xc0\\x68\\x24\\x72\\x66\\xab\\xe9\\x3b\\xc6\\x14\\xfb\\x78\\x15\\x2d\\x34\\xb3\\x49\\xb2\\x5d\\x0e\\xd9\\x0c\\x2d\\x07\\x0d\\xa6\\x01\\x41\\xd6\\x22\\x95\\x73\\x7b\\x50\\xe9\\xcb\\xe5\\xa0\\x91\\x40\\x74\\x34\\xfa\\xdc\\x06\\x54\\xfa\\x72\\x39\\x68\\x18\\x10\\x1d\\x4e\\xdf\\x7c\\xba\\x0b\\xd6\\x75\\x77\\xbc\\xcb\\x6c\\x0f\\x22\\x4e\\x8f\\x31\\x08\\xac\\x01\\x96\\xd0\\x11\\x32\\x9b\\x81\\xf5\\xbc\\x59\\x34\\xc3\\xd3\\xdd\\x54\\xb3\\x01\\x76\\x84\\x0c\\x32\\x83\\x16\\x04\\x5a\\x02\\x83\\x42\\xc6\\xa0\\x82\\xb8\\xde\\x81\\xb6\\x34\\x10\\x68\\x15\\x06\\x82\\x50\\x5b\\xdc\\x06\\x80\\xb6\\x34\\x10\\x68\\x21\\x06\\x82\\x42\\x5b\\xe6\\x73\\x7a\\xb0\\x0d\\x48\\xa7\\xf4\\xcc\\xa6\\xa2\\xa0\\xf5\\x58\\x8b\\xcc\\x26\\x60\\x30\\x12\\x39\\xb3\\xcd\\xf4\\x1e\\x21\\x44\\xbb\\x30\\x8a\\x34\\xb3\\xa1\\xe7\\x02\\x21\\xab\\xe1\\x10\\xd0\\x68\\x28\\x10\\xb2\\x19\\x05\\xc2\\xed\\x42\\x6f\\x47\\x85\\x80\\x06\\x03\\x53\\x03\\xda\\xe1\\x36\\xa1\\xb7\\xa3\\x42\\x40\\x63\\x81\\xa9\\x75\\xed\\x98\\xcf\\x5b\\xc2\\x36\\x20\\x1e\\xb7\\x34\\x5b\\x8a\\x8c\\xd5\\x63\\x28\\x12\\x8b\\x80\\x9d\\x88\\xc4\\xcc\\x66\\xd2\\x77\\x0e\\x74\\x1b\\x45\\xad\\x95\\x08\\xb7\\xc1\\x9c\\x85\\xfd\\xc8\\x9e\\x1f\\xbc\\xe8\\xce\\x05\\xdc\\x8b\\x5b\\xf8\\x1d\\x7a\\xcd\\xbb\\x83\\xb2\\xd8\\x79\\xd9\\x25\\x21\\x96\\x8b\\x25\\x49\\xf8\\x6b\\x54\\x8d\\x39\\x0a\\xb2\\xc3\\x59\\x38\\x7b\\xc0\\x4e\\x26\\xba\\xc7\\xaa\\x3d\\x7c\\xc8\\x0e\\xf4\\x34\\x45\\x0d\\x07\\x87\\x84\\x24\\x51\\xe8\\x21\\x85\\x2d\\x2a\\xe1\\xfb\\x5d\\xf4\\x9e\\xbd\\x65\\x8b\\x59\\xed\\xb0\\xa9\\x01\\x11\\x5a\\xef\\xd9\\x90\\x0e\\x16\\x24\\x7d\\x05\\x68\\x43\\xb2\\x51\\xd2\\x57\\x71\\x36\\xa4\\x03\\x7c\\x35\\x00\\x5c\\x4f\\x5b\\x0f\\x9b\\x65\\x03\\x2e\\x8a\\xc5\\xec\\x83\\x91\\x39\\x70\\xc9\\x3c\\xb6\\x66\\x27\\xce\\xab\\x6b\\x8e\\x6e\\xb3\\x13\\xfc\\xd5\\x35\\xa5\\x36\\xcf\\xca\\x79\\xc4\\x51\\x92\\x16\\xce\\x92\\x8e\\x13\\xf4\\xb8\\x8a\\x82\\x9c\\xaf\\xac\\x38\\xb6\\x45\\x41\\xca\\x57\\x56\\x14\\x5b\\x3c\\x4b\\xe7\\x41\\xc7\\x08\\x59\\x20\\x62\\x1b\\x6a\\x3d\\x15\\xcd\\x03\\x59\\x97\\xd5\\xf8\\x16\\xa1\\x8a\\x4a\\xfe\\x66\\xed\\x5f\\x2e\\xbb\\x04\\xa7\\x71\\x85\\xeb\\x73\\xf7\\x61\\xd6\\xd7\\x2f\\x7b\\xf2\\xbb\\x6b\\x9c\\x52\\xbc\\xc7\\x59\\xac\\x1c\\xb7\\x13\\x1c\\xb8\\x5a\\xd7\\x70\\x71\\x4b\\x18\\x28\\xf9\\x5f\\xf9\\x68\\x9b\\x70\\x3a\\xb1\\xbb\\xc6\\x0a\\xb8\\x5c\\x60\\xde\\xfc\\xbb\\xa4\\x68\\x8b\\x87\\x5d\\x19\\x26\\xf3\\x34\\x57\\x2e\\x8f\\x59\\xfa\\xfe\\x85\\x5c\\x29\\xf7\\x73\\xfd\\x50\\xe0\\xdf\\xd3\\xc7\\xae\\x7f\\x79\\xea\\x9b\\xf7\\x84\\x16\\xc8\\xab\\x11\\xdb\\xfc\\xfe\\x97\\x89\\x50\\x58\\xa2\\x38\\xc9\\x7f\\xe1\\xb7\\xe1\\xcc\\xc8\\x51\\xca\\x56\\x9a\\x2c\\x03\\xfe\\xf7\\x95\\x24\\x3c\\x7a\\x9c\\x55\\xa4\\xbc\\x4b\\x52\\xfc\\x8b\\xac\\xa5\\x8b\\xd4\\x46\\xb6\\x57\\xe1\\x82\\x16\\x2f\\xf4\\x4a\\xbd\\x9f\\x8f\\xa7\\xb4\\x4e\\x8a\\x14\\xff\\xc2\\xee\\xd8\\xfb\\xb9\\xd1\\xdd\\x2f\\x67\\xf1\\x5a\\x37\\xb5\\x4d\\x76\\xdb\\x04\\xd4\\x49\\x1d\\x44\\xbb\\xfa\\x24\\xf7\\xe2\\xe5\\xa7\\xba\\x38\\xd5\\xf0\\x31\\x50\\x22\\xb5\\xa5\\x7c\\xf0\\xb3\\xff\\xf6\\xc1\\xf9\\x7c\\x7e\\xf1\\x76\\x79\\x79\\x74\\xa3\\x3c\\xab\\xcb\\x5c\\x3d\\x3b\\xaf\\xdf\\x44\\x37\\x9d\\x09\\x37\\xa5\\x2d\\x8a\\x7b\\x27\\x08\\xaf\\x68\\xd4\\x74\\x51\\x5d\\x57\\x9a\\x1c\\xd1\\x1e\\xf3\\xa3\\xb0\\x83\\x8e\\x95\\xda\\xce\\xf5\\x36\\x75\\x9b\\xff\\x88\\xc7\\x75\\xfd\\x25\\x7c\\xb2\\xd7\\x88\\x0b\\x5c\\x8f\\xc7\\x98\\x20\\x5d\\x10\\xaf\\xb8\\x73\\xbc\\x60\\x5e\\x4d\\x74\\x86\\x34\\x1c\\xe5\\x32\\x3d\\x3b\\x3d\\x1b\\x9d\\xa7\\x20\\x22\\x9b\\x02\\x33\\x59\\x91\\xda\\xfa\\xcb\\xc5\\x02\\xed\\xf0\\x8a\\x5b\\xe7\\x1a\\x3c\\xbf\\xdc\\x27\\xc8\\x89\\xef\\xf8\\xce\\x0d\\x07\\x04\\x7e\\x38\\x09\\x96\\xf3\\x49\\x38\\x9d\\x4e\\xbc\\xc5\\x28\\x8d\\x58\\x09\\x29\\x9d\\x59\\x13\\x1f\\x56\\xa4\\x28\\xc2\\x07\\xf2\\x08\\x1b\\xbf\\xe8\\x67\\xb5\\x5a\\x6d\\xf2\\x02\\x45\\x49\\xfd\\xb0\\x0e\\x94\\x4a\\xcd\\x8c\\x9b\\x0c\\x65\\x43\\x45\\xad\\x0d\\x26\\x8c\\x51\\x75\\x8e\\x15\\x7b\\x2f\\xc7\\xfa\\x4d\\x55\\xb8\\x64\\x50\\xac\\xff\\x73\\x9c\\x90\\xdb\\x04\\xe3\\x5f\\x26\\x72\\x79\\x89\\x51\\x9c\\x67\\xe9\\xc3\\x2f\\x13\\x1e\\xfe\\x3a\\x54\\x47\\x1e\\xf2\\xc0\\xda\\x08\\x63\\x93\\x4c\\x84\\x06\\x7b\\x09\\xb3\\xcb\\x4c\\xb2\\xbc\\x76\\x51\\x9a\\xe6\\x77\\x38\\xbe\\xf0\\x0b\\x4c\\x65\\x44\\x83\\xb3\\x55\\x83\\x13\\x2a\\x0a\\x8c\\x4a\\x94\\x45\\xec\\xea\\x1a\\x60\\x25\\xc6\\x51\\x9b\\x50\\x1f\\xe3\\xdb\\x24\\xc2\\x6e\\x91\\xdc\\xe3\\xd4\\x25\\x57\\x95\\xae\\xfd\\x57\\x67\\x81\\x7e\\x8c\\x6a\\xfc\\x8b\\xc4\\x89\\xe8\\xb8\\xeb\\xe4\\x68\\x81\\x36\\x75\\xc9\\x83\\xc9\\x69\\x1e\\xa1\\xd4\\x8c\\x77\\xcc\\xb3\\xfa\\x20\\x83\\xa5\\x1b\\x70\\xa6\\xe4\\xb6\\x38\\x6a\\x30\\xe4\\x0b\\xa9\\x5b\\x1d\\x1d\\x95\\xc7\\x89\\x05\\x81\\xb0\\x69\\x43\\x50\\x38\\xb5\\xa1\\x52\\x66\\xd5\\x6e\\xfe\\xc2\\x6a\\x54\\x47\\x5d\\x3c\\x10\\x44\\x15\\x0d\\x84\\xc3\\xc4\\xc2\\x41\\xb2\\x48\\x7c\\x55\\x24\\xe9\\xbe\\x47\\x24\\x32\\x02\\x20\\x12\\x9d\\x82\\x51\\x24\\x32\\xaa\\x5d\\x24\\xe9\\xde\\x24\\x12\\x19\\x02\\x8b\\x44\\xc6\\x91\\x44\\x92\\xee\\x25\\x91\\xcc\\x16\\xe4\\xa8\\x3e\\xb1\\x22\\xc2\\xe5\\x59\\x4f\\x22\\x5c\\x3c\\x3e\\x0b\\x99\\x78\\x64\\xd2\\x01\\x9c\\xb5\\x56\\x6f\\xb2\\xed\\xbf\\xbb\\x91\\xd3\\x74\\xc8\\x04\\x94\\x51\\xa6\\x7f\\x88\\x99\\x12\\x32\\xf5\\x95\\xce\\x69\\x03\\x77\\x59\\xfa\\x1b\\xf5\\xa6\\x4c\\xf5\\x92\\xd2\\xb6\\x35\\x70\\x02\\xd9\\x82\\xd9\\x75\\x55\\x06\\x2c\\xca\\xa2\\x36\\x05\\x63\\x00\\xa0\\x2e\\x9b\\x8d\\xea\\xd7\\xc4\\x0a\\x02\\x9a\\x91\\x09\\xa9\\x74\\x77\\x41\\x28\\x09\\xe8\\xb5\\x2a\\xfe\\xd7\\x4c\\x0b\\x02\\x11\\x57\\x52\\x13\\xe3\\x44\\xe6\\xcb\\xa2\\x34\\xf0\\x46\\xae\\xe1\\xb2\\x06\\x6f\\x50\\x36\\x6a\\x80\\xb1\\xf3\\xda\\xce\\xed\\x6b\\x99\\x77\\xe8\\x02\\x30\\xb6\\x19\\x8c\\x5c\\xeb\\xac\\xc5\\x0b\\x50\\x81\\x76\\x3c\\xa6\\x4c\\xa8\\xa6\\xc7\\x2b\\x80\\x50\\x21\\x72\\x69\\xe4\\xc0\\x9a\\x14\\xd4\\x55\\x83\\xe2\\x99\\x2a\\x9e\\x8e\\x90\\x24\\x99\\xae\\x18\\x0a\\x9a\\xaa\\x88\\x21\\x1c\\x49\\xce\\x36\\x46\\xda\\xa6\\xa4\\x11\\xab\\x96\\xda\\xd8\\xb0\\xa0\\x88\\xa3\\x1f\\x62\\x42\\x0c\\x73\\x2e\\xdd\\x3d\\x20\\x7a\\x09\\x71\\xf1\\xd0\\x2e\\x58\\x94\\x4d\\x61\\x4b\\xdd\\x94\\x41\\xba\\x9d\\x0f\\xb5\\x40\\xab\\xa3\\x72\\x9d\\x89\\xaf\\xdc\\xa0\\x75\\xe9\\x10\\x85\\xe8\\xb3\\x11\\xf6\\xca\\x68\\xd7\\xe9\\x84\\xda\\x02\\x67\\xae\\x5f\\x32\\xc4\\x56\\x97\\x30\\x75\\x2d\\xd8\\xa9\\x4b\\xd1\\x2e\\x64\\xb6\\xf3\\x25\\x95\\x10\\xdd\\x81\\xd9\\x05\\x84\\x26\\x92\\x83\\x93\\xaa\\x27\\xea\\x8f\\xd2\\x14\\xeb\\x9e\\xb1\\x41\\x3d\\x9e\\x43\\xf5\\x85\\x1e\\x4b\\xf3\\x27\\x05\\xb9\\x7f\\xd2\\x68\\x13\\x04\\xb7\\x43\\x91\\x3d\\xd1\\x26\\x43\\x75\\x41\\xdb\\x2f\\x9f\\x4b\\x17\\xa5\\x85\\x00\\xbd\\x91\\x2e\\xd5\\xeb\\xae\\xed\\x6d\\xef\\x0a\\x56\\xc8\\xb0\\x1d\\x97\\x1b\\xfd\\xa2\\x78\\xc9\\x78\\x94\\x46\\xb4\\x69\\x81\\xc1\\x78\\xd2\\xbd\\x6a\\x3c\\x1d\\x21\\x4d\\x66\\xe9\\x1e\\x36\\x9e\\xa7\\xed\\x96\\xd2\\xa2\\xc5\\x86\\xe0\\x9e\\x82\\xf5\\x87\\xd8\\x50\\xba\\x1f\\x69\\x43\\xaa\\x3c\\x14\\x1b\\x22\\xec\\x89\\x36\\x74\\x23\\x8a\\x29\\x18\\x23\\xa6\\x8b\\x77\\x40\\x95\\xbb\\xc3\\x38\\x6e\\x96\\x61\\x7a\\xf4\\x97\\xe1\\x8a\\x96\\x64\\xdf\\x36\\x0b\\xbd\\x79\\x2b\\x25\\xce\\xb8\\x4e\\xb9\\x9d\\xdd\\xd0\\x30\\xcd\\xfd\\xe2\\x6f\\x6e\\x92\\xc5\\xf8\\x7e\\x1d\\x6e\\xa0\\x14\\x10\\xf1\\xdc\\xa2\\x17\\x57\\xd7\\x30\\x1b\\xed\\x0a\\xe7\\x0d\\x9b\\x53\\xb8\\xf8\\x16\\x67\\x75\\xc5\\x36\\x8b\\x59\\x84\\xfc\\x1a\\xe6\\x5c\\x9d\\x9d\\xf7\\xa0\\x19\\x11\\xf8\\x09\\x92\\x45\\xd7\\x93\\x7e\\x33\\x53\\x9d\\xc9\\x20\\x1e\\xab\\x63\\x0f\\x9a\\x11\\x81\\x1f\\x64\\xf1\\x05\\x69\\xc3\\xee\\xb4\\xb1\\x0a\\xb6\\x87\\xc6\\x11\\x66\\x9e\\x60\\x71\\x3b\\x75\\x93\\xa1\\xac\\x6d\\x36\\x4d\\x90\\x60\\x07\\x9c\\x16\\x74\\xa2\\xa9\\x00\\xc8\\x04\\x00\\x2a\\x83\\xda\\xd0\\x16\\x0f\\x10\\x8c\\xcf\\xc7\\x01\\x14\\x61\\xb6\\x01\\x00\\xa4\\x8a\\xca\\xc5\\xd7\\x32\\x83\\x72\\xb6\\x43\\xca\\x67\\x51\\xfc\\xf7\\x9d\\x3a\\xb4\\xf0\\x03\\x66\\xd9\\xe8\\x35\\xdc\\x57\\xe7\\xd6\\x9a\\x28\\xf6\\xe5\\x62\\xb9\\x0d\\x16\\x37\\xa3\\xd3\\x69\\x42\\x5d\\x85\\x6b\\xd1\\xc2\\x51\\x1c\\xe7\\x99\\x2c\\x73\\x20\\xa5\\x4b\\x77\\xa7\\x6d\\x20\\x89\\x5b\\x24\\xd2\\x0d\\x06\\xa0\\x06\\xdb\\xfb\\xa1\\x9a\\xbc\\x56\\x2c\\x99\\x63\\x07\\xd5\\x4d\\xbe\\x85\\xa9\\x26\\xdf\\x02\\x04\\x93\\x97\\xcb\\xa0\\x36\\x40\\x93\\x57\\x61\\x80\\xc9\\x73\\x14\\xcd\\xe4\\x25\\x00\\x68\\xf2\\xec\\x32\\x75\\x99\\x41\\x8b\\xc9\\x53\\xfc\\x0f\\x63\\xf2\\x20\\x3f\\x86\\xc4\\xf2\\x3c\\x78\\xac\\xc9\\x47\\x3e\\x0a\\x16\\xdb\\xeb\\x4c\\x9e\\xd6\\x55\\xb8\\x36\\x9a\\x3c\\x93\\xa1\\x69\\x57\\xd5\\x06\\x92\\xb8\\x45\\x22\\x9a\\xc9\\x8b\\x35\\x70\\x59\\xe6\\xa5\\x6a\\xf0\\x4a\\xa1\\x64\\x8a\\x1c\\xa6\\x1b\\x3b\\x83\\xa8\\xa6\\xce\\x8a\\x05\\x43\\x17\\x4b\\x74\\xda\\xa0\\x91\\xcb\\x10\\xc0\\xc4\\x29\\x82\\x66\\xe0\\x42\\x31\\x68\\xde\\xec\\x62\\x7f\\x91\\x2d\\x8b\\x71\\x53\\xec\\x0f\\x63\\xdc\\x00\\x37\\xa0\\x69\\xd3\\x47\\x06\\x1e\\x69\\xda\\xf8\\x66\\x76\\x33\\xbd\\xd2\\xb4\\x49\\x5d\\x89\\x67\\xa3\\x61\\x33\\xf9\\x99\\xf6\\x80\\x6d\\x20\\x69\\x1b\\xa5\\xa1\\x99\\xb5\\x88\\xdf\\x4e\\x69\\x89\\xb6\\xff\\x8f\\xa1\\x22\\x39\\x99\\x33\\xe7\\x13\\x1e\\xb9\\x0e\\x7f\\x53\\xc9\\x56\\xd7\\xbf\\x08\\xd6\\xae\\x3d\\xe4\\xd5\\x66\\xab\\xe6\\x60\\xf6\\xb3\\x3d\\x9c\\x36\\x6d\\xfe\\x99\\x2f\\xea\\x22\\xcd\\x33\\xdb\\x15\\x73\\xb4\\x86\\xaf\\xf5\\x72\\x9a\\xce\\xf0\\xb0\\x99\\x4e\\x53\\xfd\\x42\\x2b\\x51\\x15\\x9e\\x8d\\x1a\\x4b\\x90\\xaf\\x6d\\x20\\xba\\x4a\\x35\\xc1\\x6c\\x54\\x74\\xb2\\x37\\x63\\x50\\xdb\\x02\\x11\\x07\\x5a\\xb2\\x81\\x78\\x9a\\xc1\\x0e\\x45\\xde\\xd6\\xd9\\xb9\\x13\\x8e\\x99\\x95\\xb7\\xb2\\x90\\xc5\\x03\\xf2\\x52\\x15\\xc9\\xab\\xaa\\x5b\\xe9\\x06\\xf5\\xbf\\x73\\xe4\\x52\\x31\\x4d\\x16\\xdb\\x4c\\x06\\x7a\\x57\\x61\\x5c\\x93\\xdc\\xef\\xea\\x0d\\x33\\x9f\\xab\\x26\\xc7\\x60\\x2a\\x70\\xda\\x1d\\x20\\x6a\\xc9\\xb1\\x77\\xd7\\xbf\\x4a\\xa7\\x4b\\x65\\x2a\\xe6\\xa5\\xaf\\x3a\\xca\\x59\\x45\\xe1\\x15\\x06\\x55\\xce\\x10\\xa8\\x0d\\x6d\\x1a\\x06\\x8b\\x85\\x70\\xb9\\xfa\\xd4\\x06\\xcf\\x64\\xda\\xf4\\x34\\x8e\\x41\\xf6\\xe5\\x40\\xf8\\xbe\\xb2\\x6c\\x17\\xa6\\x22\\x9e\\xfe\\x41\\xc8\\x7e\\xd3\\xb2\\xdd\\x85\\x49\\xcc\\x49\\x76\\x6e\\xe8\\x69\\x6b\\x84\\xda\\xeb\\x4e\\x00\\xaf\\x43\\x94\\xd9\\x5d\\xfa\\x3b\\x82\\x55\\x25\\xa5\\x60\\xe6\\x3c\\x08\\xb4\\xa4\\x0c\\x70\\x69\\xc7\\x90\\x76\\xaa\\xa3\\xad\\x9d\\x85\\x96\\x40\\xbc\\x5c\\xbc\\xc6\\x11\\xd9\\xbe\\xe4\\x74\\x9b\\x69\\xc0\\x0f\\x39\\xdd\\xe6\\x1a\\xeb\\x6b\\x73\\xdd\\x66\\x1b\\x3d\\x1f\\xa3\\xef\\x84\\x35\\x7c\\x13\\x72\\x8f\\x95\\x5b\\xe7\\xa7\\xe8\\xe0\\xa2\\x88\\x0c\\xd6\\x23\\xca\\x92\\xe2\\x94\\x92\\xd7\\x3e\\x37\\x66\\x88\\xfc\\x2d\\xa9\\x9d\\xf0\\x9c\\x2a\\x5c\\xba\\x34\\x59\\x47\\x37\\xf4\\x90\\xad\\x18\\x40\\x69\\xa5\\x17\\x6a\\x05\\x03\\xb7\\x08\\x99\\x6f\\x82\\x27\\xdf\\xdb\\xb7\\x75\\xc6\\xce\\xad\\x79\\x74\\xc3\\x96\\x50\\xb2\\x16\\x4a\\xba\\x9f\\x6b\\x0d\\x7d\\xad\\xa1\\x3f\\xc9\\x26\\x2f\\xb5\\x5d\\xe1\\xa7\\xf4\\x74\\xd5\\x74\\x3a\\x85\\xdf\\x6e\\x15\\xba\\x22\\xf2\\x79\\x86\\x25\\x37\\x68\\x27\\xcf\\xb4\\xb8\\x77\\xe6\\xca\\x1c\\x33\\x30\\x3c\\x8c\\x60\\xc2\\xa5\\x7c\\x75\\x9f\\xc7\\xb6\\x75\\xd6\\xb3\\x97\\xa4\\x19\\x31\\xfa\\x47\\xa6\\xcd\\x2e\\x49\\xc9\\x13\\x1a\\x69\\x71\\x40\\x2f\\xd9\\x2e\\x95\\xdf\\x2f\\x84\\xfd\\x59\\x3d\\x4f\\x29\\xb4\\x3b\\x5b\\xbc\\xc5\\xfc\\x82\\x64\\xae\\x00\\x36\\x08\\xc6\\x19\\xcc\\x65\\x6e\\xeb\\xcc\\x8d\\xf1\\x0e\\x9d\\xd2\\xfa\\xdc\\xf7\\x9c\\xaf\\x32\\x73\\x26\\x47\\x0f\\x84\\xfa\\x82\\xc6\\x79\\x11\\xb3\\x26\\x2b\\x61\\xbc\\x68\\xfe\\xa9\\xcb\\xcd\\xa8\\xf9\\x27\\x91\\xd7\\x4d\\x67\\x20\\x2d\\x14\\x37\\xff\\x64\\x56\\x05\\xdb\\x6a\\xe9\\xf3\\xb2\\xbc\\xc0\\xd9\\x5b\\x2f\\x2e\\xf3\\x22\\xce\\xef\\x9a\\x50\\xb8\\xdf\\xa7\\x78\\xb8\\xa0\\x46\\xf2\\x00\\x48\\x4d\\x1f\\xc4\\x2a\\x84\\x1d\\x1b\\xd1\\xb9\\x87\\x74\\x60\\xa4\\xb6\\x96\\xa9\\xf5\\xf6\\x9b\\x13\\xef\\x45\\x5c\\x0f\\x46\\x1c\\xa0\\xd3\\x78\\xd6\\xfc\\xeb\\xb7\\x8f\\x47\\xea\\x14\\x74\\x2d\\x72\\x03\\x7c\\x40\\x41\\x2a\\xe3\\x30\\x48\\x69\\x2d\\x4c\\x57\\x5b\\x37\\x48\\x01\\xa2\\x1d\\x10\\xa0\\x2a\\x00\\x29\\x59\\x83\\xfb\\x51\\x94\\xd7\\x83\\xb5\\x1e\\x86\\x65\\x3c\\xb6\\xd6\\xeb\\x24\\x1c\\x6f\\x8b\\xe2\\x3d\\xee\\x7b\\xa2\\x70\\x4a\\x2b\\x8d\\x78\\xd0\\x50\\x69\\x37\\xc4\\x8b\\x18\\xcd\\x24\\x2a\\xa2\\x84\\xa5\\x87\\x0f\\xed\\xe4\\xe9\\x83\\x87\\x0a\\xf9\\x20\\x0c\\xb7\\x33\\x5f\\x22\\x2f\\xdb\\xf2\\x08\\x5a\\xa1\\x3f\\x8b\\x97\\x0a\\xab\\xa2\\x2d\\x73\\xfa\\xfd\\xb6\\x3c\\x48\\x5c\\x23\\x79\\x00\\xa4\\x06\\xf8\\x27\\x05\\x22\\x18\\xba\\xcc\\x3d\\xa4\\x03\\x23\\xb5\\xc1\\xfe\\x49\\x51\\x70\\x2f\\x62\\xbf\\x7f\\x1a\\xa3\\x53\\x22\\xba\\x7e\\xfb\\x78\\xa4\\x4e\\x2d\\xfe\\x89\\x37\\x00\\xf9\\x27\\x15\\x06\\x29\\x0d\\xf2\\x4f\\x0c\\x06\\xfb\\x27\\x0d\\x08\\x50\\x1d\\xec\\x9f\\x64\\xe5\\xf5\\x60\\xf5\\xf8\\xa7\\xbe\\xc7\\x4b\\x87\\xba\\x0a\\xc5\\x4b\\xf1\\x6a\\xf0\\x0d\\x3a\\x4d\\x3d\\xe5\\xed\\x5a\\xd8\\x52\\xe6\\xd1\\xf6\\x66\\x1e\\x29\\xad\\xcf\\x22\\x84\\x67\\x91\\x44\\x45\\x14\\xb5\\xf4\\x7a\\xaa\\x9d\\xfc\\x6c\\xb6\\x8a\\x67\\xaa\\x21\\x86\\xf3\\xf9\\x22\\x9c\\x4b\\xe4\\x87\\x18\\x35\\x48\\x6b\\xba\\xba\\x99\\x4d\\x57\\x32\\xab\\xa2\\x51\\x73\\xfa\\xfd\\x46\\x3d\\x48\\x5c\\x23\\x79\\x00\\xa4\\x06\\x38\\x2a\\x05\\x22\\x58\\xbc\\xcc\\x3d\\xa4\\x03\\x23\\xb5\\xc1\\x8e\\x4a\\x51\\x70\\x2f\\x62\\xbf\\xa3\\x1a\\xa1\\x53\\x2a\\xba\\x7e\\xfb\\x78\\xa4\\x4e\\x2d\\x8e\\x8a\\x37\\x00\\x39\\x2a\\x15\\x06\\x29\\x0d\\x72\\x54\\x0c\\x06\\x3b\\x2a\\x0d\\x08\\x50\\x1d\\xec\\xa8\\x64\\xe5\\xf5\\x60\\xf5\\x38\\xaa\\xbe\\xab\\x43\\x86\\xba\\x0a\\xc5\\x51\\xf1\\x6a\\x66\\x47\\x25\\x3e\\x88\\x6d\\xf0\\x52\\xdb\\xc8\\xd7\\xbe\\x92\\xcc\\x16\\xdb\\x9b\\x18\\x75\\x24\\x44\\x21\\x77\\xef\\x2f\\xf7\\xd8\\x5f\\xb0\\xf5\\xe3\\xb9\\x1a\\x28\\xb7\\x8b\\xf8\\x66\\xde\\x11\\x1e\\x64\\xc8\\x10\\xa1\\x70\\xb1\\x42\\xdb\\x48\\xe0\\x50\\xb4\\x62\\x42\\xb9\\xdf\\x84\\xfb\\x85\\x33\\xa6\\x69\\x55\\x46\\x80\\x37\\x12\\x8b\\x05\\x9b\\x16\\xd8\\xd5\\x04\\x0d\\x13\\x19\\xec\\x81\\x44\\xe5\\xd9\\xb1\\xfa\\x7d\\xcf\\x50\\x7d\\x51\\xf9\\xf4\\x28\\xfe\\x6a\\x7d\\x59\\xfc\\x0d\\xa1\\x0b\\x39\\x1b\\x09\\xa0\\x29\\x04\\x72\\x33\\x0d\\x00\\xf6\\x31\\x32\\x44\\x25\\x36\\xd8\\xbb\\x08\\x8a\\xb1\\xa1\\xf4\\xf8\\x15\\xeb\\x5d\\x34\\x83\\x46\\xb6\\xea\\x51\\x58\\x1d\\xb3\\x47\\x51\\xde\\xc5\\x87\\x4d\\x60\\xe7\\xa3\\x78\\xa6\\x36\\x8d\\x31\\x0a\\xa7\\x0b\\x89\\x8a\\x28\\x58\\xe9\\xe5\\x75\\x3b\\x79\\x1c\\xad\\x96\\x81\\xba\\xf4\\x5c\\xdd\\xcc\\x77\\x7e\\x2c\\x91\\x1f\\x62\\xad\\x20\\xad\\x78\\x7e\\x33\\x0f\\x42\\x99\\x55\\xd1\\x60\\x39\\xfd\\x7e\\x9b\\x1d\\x24\\xae\\x91\\x3c\\x00\\x52\\x03\\x9c\\x8d\\x02\\x11\\x8c\\x5b\\xe6\\x1e\\xd2\\x81\\x91\\xda\\x60\\xc7\\xa3\\x28\\xb8\\x17\\xb1\\xdf\\xfd\\x8c\\xd0\\x29\\x15\\x5d\\xbf\\x7d\\x3c\\x52\\xa7\\x16\\x57\\xc4\\x1b\\x80\\xbc\\x91\\x0a\\x83\\x94\\x06\\xf9\\x24\\x06\\x83\\xdd\\x92\\x06\\x04\\xa8\\x0e\\x76\\x4e\\xb2\\xf2\\x7a\\xb0\\x7a\\x5c\\x54\\xef\\xd5\\x47\\x03\\x5d\\x85\\x9a\\x49\\x62\\xd5\\xcc\\x8e\\x8a\\xdd\\x0d\\x64\\x37\\x94\\xd5\\x7c\\x3a\\xd3\\x06\\xde\\x6c\\xba\\x9b\\x22\\x91\\x88\\x94\\xac\\xa3\\x77\\xf4\\x0c\\xf0\\x52\\xd1\\x6a\\xea\\x87\\x6a\\x1c\\x5c\\x2e\\x82\\x28\\x58\\x89\\xc4\\x87\\x18\\x34\\x48\\x0a\\x45\\xe1\\x8a\\xcf\\xe5\\x19\\x9f\\x52\\x4e\\x94\\x52\\x1f\\x90\\x12\\x1d\\x20\\xa8\\x71\\x0c\\xe8\\xf2\\x82\\x72\\xdc\\x12\\x40\\xcc\\x95\\x8a\\x8c\\x03\\xa2\\x37\\x91\\x1a\\x9e\\xdf\\x96\\x94\\xda\\x87\\x37\\x20\\xbb\\x3d\\x58\\x8f\\x54\\x62\\xbd\\x26\\xf1\\x28\\x3d\\xda\\x32\\xdb\\x94\\x3a\\x98\\xd8\\x96\\x41\\x80\\xa2\\xc0\\xb4\\x36\\x01\\x19\\xb2\\xda\\x0a\\x4c\\x27\\x39\\x3c\\xa7\\x2d\\x2a\\xcc\\x8e\\xd4\\x97\\xd1\\xb6\\xdf\\xb0\\x35\\xd0\\x1f\\x28\\xbe\\x88\\xd7\\x32\\xfb\\xa2\\x34\\xc9\\xde\\x9d\\xb5\\x93\\xa4\\x50\\x92\\xaa\\x7b\\xfc\\x9b\\xd7\\x9b\\xb4\\xbf\\x24\\xb3\\x68\\x0a\\xd6\\x6a\\x41\\xff\\xe7\\x49\\xca\\x8a\\xf5\\xd8\\xfe\\xd0\\xf7\\xdd\\x01\\x0e\\x35\\x86\\x44\\xa5\\x93\\xbf\\x99\\xe4\\x45\\x01\\x8b\\xd7\\xb0\\xf7\\x55\\xe4\\x4b\\x8c\\xe9\\x3c\\x5c\\x46\\xda\\xc7\\xe4\\x53\\x16\\xe3\\x32\\x4d\\x32\\x20\\x2e\\x80\\x8d\\xc0\\xc6\\xa9\\x40\\xec\\xa6\\x29\\xf0\\x6a\\x45\\x91\\xd8\\x6f\\xaf\\x8e\\x87\\x3e\\x84\\xb7\\xfb\\x42\\xde\\x36\\x7f\\x31\\x96\\xf6\\xe7\\xa7\\x3b\\xd2\\xd4\\xb5\\x51\\x1d\\x85\\x36\\xba\\x83\\x87\\x8f\\x39\\x73\\xd7\\x11\\xbf\\xaf\\x04\\xe2\\xf7\\x55\\xd7\\x01\\xfa\\xb5\\xfd\\x4a\\xda\\xd0\\xae\\x48\\x71\\xe7\\x5b\\x8b\\xf3\\x5a\\x40\\x97\\xb7\\x4d\\x8a\\xf7\\x35\\x6c\\x4f\\x75\\x9d\\x67\\xbf\\x74\\xb8\\xd2\\x69\\x5a\\x5c\\xe1\\xda\\x00\\xab\\x4e\\xdb\\x63\\x22\\x02\\xe5\\xfd\\x77\\x28\\xc6\\x67\\xfe\\xd1\\xde\\x87\\xae\\x61\\x61\\x40\\x72\\x89\\x89\\xd3\\xf4\\x1d\\x95\\xca\\xc5\\x2a\\x10\\x86\\x1d\\x4c\\xdb\\xf5\\x92\\xec\\x2c\\xdc\\x84\\x11\\xe5\\x69\\x8a\\x8a\\x0a\\xb7\\x32\\xa3\\x86\\xc6\\x8b\\x1b\\x6c\\xf9\\x3e\\xa2\\xba\\x04\\x81\\xec\\x6e\\xab\\xfc\\xee\\x42\\xae\\xcd\\xb2\\xe3\\x50\\x13\\x68\\x5b\\x69\\x26\\xcb\\xfa\\x36\\x3a\\xa6\\x6c\\xbf\\xbd\\x4a\\xb0\\xbd\\x48\\x50\\x13\\x97\\x5b\\x27\\xc7\\x24\\xdb\\xbb\\xbb\\x53\\x46\\x37\\xf1\\x60\\x54\\x61\\x59\\x5e\\x30\\x4a\\x2f\\x09\\xbd\\xa9\\xf8\\xc4\\x46\\xa4\\x37\\x55\\x2f\\xbb\\x51\\x60\\xe6\\x4a\\x3a\\xd5\\xa2\\xcc\\x0b\\x5c\\xd6\\x0f\\x6b\\xda\\xeb\\xc9\\x6d\\x52\\x25\\xdb\\x24\\x4d\\xea\\x07\\xa5\\x09\\x0b\\xe2\\x20\\xac\\x8b\\x17\\xa1\\x12\\xd7\\xb6\\x3d\\xb7\\x7e\\x27\\x7a\\xe9\\x71\\x8e\\xe2\\xde\\xb0\\xbb\\x4a\\x78\\x73\\x60\\x56\\xdc\\x3b\\x31\\xaa\\x0e\\x38\\x56\\x4b\\xc9\\x2e\\xa6\\xbf\\xb7\\x09\\x67\\x76\\xc0\\xcf\\xb6\\xbd\\x89\\x3e\\x33\\x02\\x61\\x5c\\xda\\x09\\xce\\x84\\xfc\\x3a\\x15\\xd0\\x31\\x43\\x65\\x12\\xa4\\xec\\x65\\xf2\\x05\\x84\\x23\\xce\\x4e\\x86\\xe3\\x84\\xe4\\xa6\\x28\\xba\\x95\\xb3\\x3d\\x50\\x18\\xf8\\xbe\\xbf\\x11\\xc7\\xcb\\xa6\\x7b\\x93\\x6a\\x23\\xbc\\x95\\xb5\\x50\\x0f\\x2a\\xb7\\x57\\xb3\\x85\\xec\\x7e\\x30\\x65\\x23\\x9c\\xf2\\x38\\xc8\\x26\\x4d\\xaa\\x9a\\x5d\\x95\\xa9\\x6e\\x15\\x13\\xe6\\x91\\x6d\\x40\\x16\\xa0\\x69\\x52\\xac\\xbb\\x63\\xe8\\xf7\\x1b\\x2b\\xcc\\x72\\x1b\\x95\\x50\\x2a\\x6d\\x7f\\x22\\x3b\\xa5\\x06\\x5c\\x57\\x45\\x37\\xec\\x37\\x1e\\x5c\\xae\\xaf\\x1c\\x4f\\xb0\\xa0\\x29\\x6a\\xf2\\xc8\\xcb\\x49\\xc4\\x7a\\xce\\xfc\\xa0\\xa7\\xf0\\x80\\x8f\\x84\\xeb\\x78\\x71\\x72\\x9b\\xc4\\xb8\\xe4\\xa7\\x5c\\x83\\x76\\x2f\\xe2\\x7a\\x45\\xd4\\xa1\\xba\\x16\\x20\\xf7\\x42\\x2f\\xab\\x93\\x09\\xbf\\x4d\\x93\\xb7\\x08\\xbe\\xb5\\xac\\x09\\x45\\x0e\\xb9\\xbd\\x22\\x4a\\x31\\x2a\\xd7\\xdb\\xbc\\x3e\\x0c\\xdd\\xe0\\x28\\x6c\\x7c\\x81\\xee\\xf8\\xd4\\x59\\xe0\\xd3\\x12\\x00\\x22\\xcf\\x87\\x16\\xcd\\x3f\\x70\\x4e\\x01\\xd9\\x14\\xbb\\xb4\\x5f\\xa6\\xca\\xdf\\x06\\x40\\x6a\\x73\\x2d\\x00\\xe6\\xa6\\x03\\x6b\\x0b\\xa0\\x81\\xfc\\xb0\\x19\\xb0\\x69\\xe0\\xbe\\x6d\\x97\\x1e\\x00\\x6f\\x1d\\xc8\\xc0\\x9d\\x80\\xa0\\xce\\xc1\\x2c\\xed\\x0c\\x25\\x06\\xf6\\x10\\xd8\\x01\\x68\\xbf\\x27\\x0b\\xdc\\xe6\\xc8\\x36\\x0d\\x16\\x65\\xbe\\x4f\\xe2\\xf5\\x1f\\xff\\xfa\\x43\\x03\\xfa\\x4b\\x53\\x6d\\x97\\x97\\x47\\xef\\xcf\\x49\\x54\\xe6\\x55\\xbe\\xab\\xbd\\x7d\\x33\\x42\\x71\\x56\\xbf\\xc4\\x19\\x61\\xee\\xf7\\x3b\\x94\\x56\\xf8\\xd5\\x45\\x5d\\x2a\\x12\\x27\\x28\\xc7\\x7a\\x8a\\x82\\x8c\\x3e\\x73\\xe0\\x38\\x24\\x9e\\x5c\\x78\\xeb\\x6c\\xc3\\xb7\\xc6\\xb7\\x58\\x07\\x8c\\x9a\\x61\\xda\\x33\\xa2\\xac\\x53\\x42\\x75\\x14\\x35\\x93\\x68\\xeb\\x28\\x6a\\xc4\\xda\\xfc\\xd1\\x39\\xfe\\x5d\\x72\\x8f\\x63\\xe5\\x10\\x79\\xbb\\x67\\x59\\x89\\x01\\xab\\x95\\x7f\\x11\\x7c\\x91\\x2a\\x47\\x83\\x48\\x4e\\x85\\x43\\xe3\\xef\\xc4\\xcb\\xd0\\xed\\x16\\x95\\x2e\\x69\\x93\\xed\\x8c\\x76\\x5a\\x22\\x0c\\xeb\\x1c\\xe5\\x59\\x8d\\xb3\\x7a\\xfd\\xc5\\x17\\x62\\x38\\x55\\xef\\xd6\\xd4\\x83\\xae\\x00\\x60\\x71\\xb7\\x6b\\x5f\\x62\\xb4\\x97\\x0f\\xb9\\x5b\\x4d\\xeb\\x44\\x83\\xed\\x99\\x22\\xfd\\x85\\x2a\\xdb\\x4e\\x77\\xd6\\x18\\x91\\x8e\\x4a\\x1b\\x10\\x99\\x05\\xdd\\x64\\x53\\xc2\\x12\\x63\\x22\\xac\\x36\\xf8\\xc4\\x65\\xe8\\x65\\x44\\x86\\x33\\x28\\x3a\\x41\\x61\\x11\\xc3\\x4e\\xdd\\xd0\\xcd\\xb5\\x6a\\x2b\\xe2\\xab\\x95\\x06\\x2a\\xd2\\xfa\\x1d\\x80\\xaf\\xfb\\xe0\\xc2\\x22\\x15\\x02\\x0b\\x89\\x99\\x8e\\x55\\xbd\\x51\\x43\\x5b\\x70\\x13\\x02\\xe5\\x73\\x7b\\xdf\\x82\\xd0\\x43\\xb2\\xc4\\x7d\\xad\\xc8\\xa8\\x2b\\xd4\\x14\\xe5\\x74\\x3f\\xc1\\x5a\\x02\\x48\\x3e\\x25\\xc2\\x8e\\x84\\xf0\\x75\\x60\\x9d\\xe7\\xe9\\x16\\x95\\x32\\x74\\xae\\x40\\x9d\\xae\\x05\\xb1\\x44\\x64\\xaa\\x2d\\x17\\x0f\\x8a\\xa9\\xba\\x64\\x48\\x6f\\x35\\x72\\x6f\\x0d\\xe4\\xde\\x4a\\xe4\\xa4\\x67\\xf7\\xa4\\x45\\x32\\x95\\x6e\\x96\\xd7\\x2f\\xc5\\x6b\\xa6\\x5f\\xd1\\x92\\xee\\x8e\\x60\\x5a\\xa0\\xce\\x77\\x5f\\x9d\\xc1\\x9c\\x91\\xa8\\x4c\\xe1\\xea\\x6a\\xe5\\xd0\\x92\\x19\\x73\\x64\\xe3\\x75\\x5e\\xd0\\xf1\\xdb\\xb2\\x21\\xfb\\x28\\x05\\xa8\\xb5\\xdc\\x35\\xa4\\xcb\\x41\\xb2\\x43\\x75\\xb6\\xaf\\x61\\x8b\\x1c\\x35\\xdd\\x34\\x31\\x24\\xc1\\x54\\x7e\\x0c\\x16\\xa0\\x22\\x0c\\xd0\\x19\\x75\\x14\\x3d\\x2a\\x62\\xd4\\x6c\\xe2\\x57\\xc5\\xa4\\x0e\\xce\\x41\\x24\\x14\\xe1\\x3d\\x91\\xf2\\x58\\xd3\\x36\\x15\\xea\\x86\\xf8\\x48\\x2d\\x39\\x9a\\x21\\x68\\x9e\\x8c\\xcc\\x6a\\x34\\x3c\\x71\\x92\\x23\\x77\\xe3\\xb5\\x86\\x2a\\xdf\\x52\\x73\\xa3\\x5e\\x14\\x78\\xa3\\x0f\\x62\\x72\\x89\\x8b\\x9d\\x4c\\x10\\xaa\\x74\\x82\\x50\\x22\\x64\\xe0\\xfb\\x43\\x9c\\x72\\xb1\\x31\\xd0\\xa5\\x8d\\xc7\\x64\\x86\\xf9\\x0c\\x07\\xf0\\x3b\\xe4\\xc8\\x1b\\x01\\x32\\x95\\xb3\\xc7\\x93\\x19\\x83\\xaa\\x25\\xb0\\xa4\\x45\\x37\\xc1\\xb1\\xd0\\xf0\\x1d\\x46\\x65\\x48\\x28\\x97\\x01\\xe6\\x39\\xc5\\x5b\\x35\\xfa\\xcb\\xd3\\xd8\\xee\\x61\\xb9\\x8d\\xf1\\x95\\x4f\\x23\\x3b\\x22\\x59\\xf1\\x85\\x3a\\x03\\xba\\x1a\\x33\\x01\\xe8\\xa0\\x7e\\xd8\\xe9\\x18\\x83\\x30\\xb9\\x11\\x32\\x50\\xce\\x69\\xfa\\x46\\x6e\\x07\\x78\\x49\\x8b\\x83\\x54\\x27\\x3f\\x16\\x07\\x67\\x72\\x2a\\xb3\\xe2\\x7e\\x63\\x72\\x75\\x02\\x0c\\x74\\x76\\x03\\xfd\\x91\\xc2\\xa5\\xcd\\x17\\xf6\\xba\\xbe\\x71\\xee\\x58\\xef\\x80\\xd2\\xf5\\x1e\\xa3\\x7b\\x82\\x18\\x06\\x92\\xbd\\x32\\x98\\x5d\\x41\\xcb\\x10\\xd5\\x9e\\x4e\\x9d\\xef\\x25\\xc0\\xe9\\x5a\\x16\\xdb\\xff\\xf5\\x54\\xd5\\xc9\\x2e\\xc1\\xb1\\x9c\\x55\\x17\\x5d\\x0b\\x4d\\xb3\\xa7\\xe8\\x21\\x3f\\xd5\\x6c\\x4d\\xdb\\x7d\\x50\\x23\\x49\\xf9\\x75\\x85\\x0b\\x54\\xa2\\x1a\\x83\\x94\\x35\\x3f\\x28\\x43\\x94\\xdb\\x12\\x68\\x6b\\xca\\x13\\x9a\\x9c\\x9d\\x17\\xe6\\x06\\x84\\x49\\xfd\\x19\\x76\\x84\\x30\\xbe\\xbc\\x68\\xec\\x16\\x8b\\x3f\\xc7\\xa8\\x46\\x4c\\xd3\\xec\\xbb\\x4d\\xf5\\x0b\\xa9\\x09\\x9f\\xee\\x1f\\x86\\xcf\\xee\\x66\\x35\\x23\\x0b\\x0e\\x7a\\x6c\\x3b\\x86\\xaa\\xc6\\xbb\\x7b\\x49\\xe2\\xb6\\xc4\\x51\\xcd\\xc2\\xb3\\xff\\x0a\\xbe\\x90\\x4e\\x5c\\x5b\\x98\\x97\\xbb\\xd4\\x6c\\xcc\\x86\\x21\\x50\\x91\\xdf\\x52\\x15\\xb4\\x3c\\xec\\x26\\xd2\\xbd\\x7e\\x31\\x06\\xc0\\x57\\x77\\x5b\\x9f\\x90\\x4c\\x37\\x3e\\x02\\x62\\x23\\xce\\x12\\xfd\\x9c\\xe0\\x54\\xbd\\x79\\xfb\\xad\\x72\\x47\\x87\\x0a\\x05\\x6e\\xe6\\xb0\\xa1\\x6c\\xeb\\x8c\\xfa\\xc1\\xf7\\x7f\\x71\\xa6\\xa1\\x07\\x06\\x1c\\xbd\\x1f\\x03\\x10\\xc1\\xde\\x0c\\xbd\\xa1\\xd3\\xca\\x9f\\x05\\xdb\\xc4\\xe9\\xc0\\x2a\\x9c\\x67\\xf5\\x7a\\x50\\x03\\x3b\\x46\\x2c\\x9d\\x8d\\x41\\xa8\\xaa\\xc8\\x68\\xee\\x4a\\xbe\\x3e\\xd1\\x66\\x73\\x0d\\xb4\\xc7\\xe6\\x54\\x14\\xb5\\xc9\\xf7\\x71\\xc5\\xaf\\x81\\x75\\x03\\xce\\x20\\x63\\x1b\\xd4\\x8d\\xa1\\x77\\x09\\x5b\\xf9\\xb3\\x60\\x8f\\x34\\x36\\x13\\xcf\\xb0\\x6d\\x68\\xec\\x18\\xb1\\x06\\x1a\\x5b\\x9f\\xc8\\x34\\x63\\x53\\x6f\\x20\\xea\\xb1\\x2c\\x71\\xbd\\xd2\\x85\\x72\\x9b\\x77\\xed\\x9f\\x16\\x02\\x8d\\x8e\\xae\\x75\\xed\\xf2\\x60\\x40\\x77\\xf9\\xdc\\x64\\xf0\\xf5\\x21\\x00\\xd5\\x73\\xdf\\x83\\x41\\xd6\\x4f\\x7e\\xe2\\xbb\\x41\\xfa\\xad\\x26\\xf0\\xeb\\x25\\x03\\xdf\\x0c\\x02\\x78\\xd5\\x6e\\x0e\\x37\\x7a\\x08\\x60\\x53\\x8d\\x89\\xda\\x90\\x2d\\x47\\xc0\\xe6\\x22\\x8d\\x9c\\xe1\\xea\\x25\\x2b\\x9e\\xf4\\xd6\\x96\\xcb\\x2e\\x45\\xb3\\x4c\\x07\\xc4\\xb7\\xfd\\x74\\xcb\\x34\\x82\\x95\\x89\\x3b\\x9b\\x16\\xf7\\x61\\x08\\xb3\\xba\\x1e\\x64\\x65\\x79\\xa2\\x63\\x0b\\xaf\\xc0\\xa9\\xcb\\x32\\x75\\xcd\\xd4\\x5b\\xf9\\x7d\\xa7\\x6d\\xad\\x72\\xd5\\x1e\\xed\\x33\\x2b\\x4b\\x5c\\xfb\\xe9\\x34\\x4d\\x50\\xb3\\x22\\x0c\\x2b\\xb2\\xfe\\xea\\x50\\xba\\xb9\\x47\\xc6\\x03\\x35\\x38\\x00\\xd7\\x92\\x8f\\x1d\\x91\\x14\\xb5\\xc9\\x4f\\x7d\\xab\\x52\\x75\\x92\\xc0\\x17\\xac\\x76\\x70\\xfb\\xe0\\x87\\x55\\x30\\x4a\\x01\\xdb\\x72\\x20\\x3c\\x92\\x4b\\x02\\x3e\\xe5\\x40\\xb8\\x6d\\x42\\x17\\x04\\xb2\\x0f\\x54\\x20\\x4c\\xfb\\x4c\\xf5\\x54\\xa3\\x5d\\xbd\\xaa\\x0c\\x60\\xfd\\x4a\\x5b\\xe9\\xb8\\xdd\\xe8\\xd2\\xc9\\xd0\\xad\\x72\\xbf\\x9d\\x76\\xd3\\x96\\xb2\\x83\\x88\\xd4\\x79\\x9b\\x26\\x7d\\x0f\\xe9\\x70\\xbc\\xb7\\xa8\\xf7\\xc9\\x1d\\x39\\x0a\\xcc\\x19\\x5f\\xd2\\xf6\\x94\\xf6\\x6f\\xcb\\xa6\\x08\\x30\\xe8\\x71\\x52\\xc2\\xc6\\x0a\\x69\\x7f\\x86\\x06\\x95\\x5b\\xb4\\x6d\\xee\\x80\\x37\\x9f\\x8c\\xdc\\x9a\\x41\\x38\\x70\\xd8\\x2e\\x89\\x89\\xf8\\x87\\xc0\\x48\\x5b\\x64\\x7c\\xb7\\x19\\xab\\xe7\\x5b\\xe8\\x8e\\x17\\x46\\x3d\\x43\\xb7\\xee\\xd3\\xed\\x63\\xe2\\xba\\x78\\x9b\\x1c\\xf7\\xe7\\x2e\\x09\\xdd\\x1a\\x87\\x5b\\xa3\\x6d\\x75\\x36\\xbe\\xdd\\x49\\x9e\\x61\\xe6\\x68\\x8d\\x21\\x89\\x3b\\xdf\\x24\\xdb\\x6b\\x4d\\x94\\xa3\\xbe\\x45\\xf2\\x30\\xb1\\x6c\\xe1\\x18\\x77\\xf9\\x99\\xc3\\x5e\\xdb\\x54\\x5a\\x83\\xf6\\x92\\x37\\xb2\\x76\\xe8\\x7f\\xa9\\x3d\\x11\\xf6\\x37\\x41\\xa5\\x82\\x42\\x75\\x98\\x64\\x5c\\xcd\\xa4\\x8e\\xd9\\x11\\xbb\\xe5\\xc6\\x7a\\x7f\\x96\\x22\\x5d\\xc5\\xa3\\xc3\\x26\\x47\\x38\\x20\\x3f\\xba\\x74\\xa0\\x90\\x2a\\x91\\xb5\\xe7\\x9b\\xaa\\x74\\xea\\x93\\xb5\\xaf\\x61\\x75\\x9a\\x13\\x9e\\x60\\xd5\\xe6\\xad\\x46\\x02\\xfd\\xbb\\x49\\xba\\x2c\\x9e\\x6d\\xe7\\x88\\xa1\\x0b\\x40\\x22\\xb2\\xcb\\x3e\\x0e\\xef\\x93\\x7f\\x19\\x84\\xdd\\xed\\x0b\\xd2\\x26\\xde\\xa6\\xee\\xeb\\x86\\x65\\xc2\\x50\\x8d\\xcc\\x88\\x27\\x9a\\xb6\\x3a\\x3c\\xc7\\x8b\\xf0\\x2d\\xb2\\x0e\\xf8\\x21\\x23\\xee\\x03\\xf7\\x59\\x1e\\x1e\\xe4\\x20\\x0d\\xe5\\xa5\\x48\\xd2\\x54\\xf1\\x4b\\x32\\xa0\\xeb\\xab\\xaa\\x3a\\x8e\\xf1\\x3a\\x4d\\xce\\xca\\xbe\\x67\\x19\\x41\\xe9\\x9c\\x56\\x2c\\xf6\\x48\\x07\\x0e\\xb9\\xd1\\xa0\\x73\\xff\\x6e\\x55\\xa3\\xe8\\x1d\\x3c\\x56\\x3b\\x90\\xc0\\x32\\xb9\\x5e\\x5a\\xff\\x02\\x67\\xf2\\x15\\x97\\x7e\\x97\\x70\\xad\\x27\\x78\\x0f\\x0e\\x60\\xdc\\xb8\\x1f\\x3c\\xdc\\x05\\xc9\\x18\\x5d\\xe7\\xf5\\xee\\xc0\\x3e\\x2c\\x86\\x0c\\x89\\xa7\\x77\\x01\\x4f\\x3d\\xfc\\x3f\\x40\\x1f\\xc1\\x21\\x5f\\xa3\\xad\\xcb\\xf6\\x48\\x92\\xc7\\xd4\\xdd\\x02\\x65\\xea\\x51\\x16\\x09\\x87\\xdd\\x1c\\xaa\\x4f\\x76\\x09\\x13\\xaa\\x7d\\xaa\\x9f\\xb5\\xaf\\xf9\\x74\\x47\\xf7\\x30\\x42\\xd7\\x44\\x77\\x77\\x21\\xcf\\xf5\\xd7\\x0e\\xc9\\x86\\x57\\xdb\\x3c\\xa8\\x6f\\x93\\x25\\xe0\\xe6\\x7a\\xf7\\x65\\xb2\\x6d\\xb8\\x82\\xef\\x6c\\xf7\\x60\\xb6\\xe7\\x84\\x94\\x4d\\x2b\\x73\\x6d\\xd3\\x4a\\x53\\xc2\\xe7\\xa3\\xee\\xfd\\x9a\\x1c\\x3d\\x49\\xbb\\xa3\\x34\\x2d\\xa8\\x8a\\xca\\x3c\\x4d\\x9b\\xa5\\x03\\xb9\\x7f\\x57\\xdc\\xe0\\x0a\\x4f\\xfc\\x7a\\x9e\\x1b\\xf0\\xe9\\xd6\\x95\\x70\\x3e\\x9f\\xf0\\xff\\x78\\x81\\xf1\\x11\\x04\\x18\\x5b\\xeb\\x2e\\x39\\x2d\\xc5\\x39\\x7e\\xe8\\x77\\x51\\x92\\xa8\\x84\\x2b\\xec\\xa5\\xdd\\xbb\\x83\\xf7\\xc9\\xa8\\xcc\\x68\\x87\\xb5\\x88\\xfd\\xfe\\x2e\\x39\\x16\\x79\\x59\\xa3\\xac\\xde\\x08\\x49\\x61\\xa1\\x54\\x79\\x8f\\x50\\x58\\x2e\\x30\\xe5\\x74\\xb8\\x7d\\x02\\x60\\x15\\x2e\\xf0\\xb6\\x61\\xa5\\xae\\xb2\\xb9\\xb8\\xce\\x0b\\x33\\x0a\\xbd\\xb2\\x1f\\xc4\\xe9\\x7b\\xf0\\xf0\\xc9\\x98\\x21\\xeb\\xa1\\xf6\\x05\\x30\\x5f\\xd8\\xc8\\x8c\\xee\\xf9\\xdb\\xcb\\xec\\xc9\\xad\\x1b\\xbf\\xb8\\x7f\\x45\\x1f\\x68\\xce\\xcb\\x04\\x67\\x35\\x5d\\x44\\xa6\\x28\\x8b\\xab\\x08\\x15\\xb8\\xb3\\x86\\xa7\\x64\\x2a\\xf4\\x7d\\x72\\xf3\\x76\\xe3\\xce\\x50\\x92\\xe1\\xd2\\xdd\\xa5\\xa7\\x24\\x7e\\xab\\x93\\x35\\x61\\xd0\\x11\\x2e\\xc0\\x6d\\x75\\x95\\x5a\\x8f\\xbc\\x90\\xfd\\x53\\x60\\xda\\x57\\xe6\\x45\\x17\\xdd\\xfc\\xce\\xd2\\x29\\x2f\\x65\\xf7\\x18\\xf1\\x1d\\xbd\\x0e\\x40\\x20\\xa6\\x7e\\x9f\\x00\\x6d\\x55\\xb7\\x02\\xf5\\x4c\\x82\\xb4\\x37\\x5e\\x3c\\x88\\x36\\xf5\\x7b\\xb9\\xe9\\x69\\xa9\\x87\\xc3\\x06\\x45\\x3a\\x73\\x20\\x8b\\x02\\x6a\\xe4\\xdc\\xfa\\x19\\x35\\x1b\\x25\\x91\\x08\\x84\\x49\\x44\\x43\\x62\\x5b\\xa2\\x2c\\x16\\xf3\\x09\\x62\\x70\\x6c\\xb3\\x4c\\x73\\xfb\\xa7\\x74\\xfa\\x82\\xb1\\x48\\x51\\x98\\x68\\x74\\x65\\xe6\\x44\\x94\\x5c\\x99\\x64\\x49\\xe4\\xc9\\x42\\x8f\\xb8\\xdf\\x76\\x96\\xe8\\x48\\xa4\\x26\\x3a\\x02\\x35\\x73\\x19\\xed\\xac\\x8f\\xa8\\x96\\x25\\xbe\\x6d\\xd4\\x70\\xb8\\x80\\x18\\x49\\x2b\\xa9\\x15\\xff\\xc6\\x23\\x4c\\x62\\x6e\\xba\\x3f\\x85\\xf0\\x2d\\x6b\\x89\\x7c\\xb8\\x19\\x7f\\x1c\\x69\\xec\\x7d\\xf5\\x52\\x97\\xf4\\xa3\\x99\\x12\\xd8\\xf1\\x92\\x28\\xcf\\xdc\\x66\\x52\\x03\\x9d\\xec\\x0e\\xc3\\xee\\x6d\\x41\\xfd\\x2b\\x56\\xa0\\xb5\\xd6\\x91\\x7b\\xdd\\x11\\x96\\x1f\\xc6\\xee\\x1d\\x54\\x4c\\x15\\xd2\\x4c\\xb3\\x6d\\x26\\x43\\xb7\\x8c\\xde\\x7a\\xe9\\xcd\\x8b\\x7b\\xc7\\x6d\\xf3\\xa2\\x0c\\xcc\\x52\\xab\\xe2\\x4b\\x0e\\xbe\\xfe\\x70\\x70\\xa0\\x7e\\x0e\\x0f\\x95\\x98\\xc4\\x59\\x5b\\x8a\\xac\\xb5\\x29\\x47\\x75\\x36\\xdb\\xda\\x0d\\xf5\\x4f\\xfa\\x76\\x2d\\x32\\x53\\x91\\x9e\\xfc\\xb0\\x1b\\x02\\x55\\xf9\\xf8\\xf9\\x8c\\x89\\x43\\x47\\x3d\\x10\\x36\\xe9\\xab\\x21\\xc9\\x91\\x7e\\xd6\\xe4\\xdb\\x84\\x43\\x45\\xe4\\x96\\xfa\\x46\\x07\\x62\\xad\\xa6\\x38\\x16\\x3b\\xae\\x96\\xfb\\x15\\xee\\x5e\\xe9\\x35\\xb6\\xc6\\x9e\\xb4\\x3c\\xab\\x30\\x4a\\x58\\x4e\\x5f\\x49\\x79\\x98\\x4d\\x6d\\x0e\\x98\\x9a\\xe4\\x68\\x76\\x79\\x79\\x3c\\x6b\\x89\\x7d\\xab\\x27\\x71\\x0d\\xae\\x44\\x73\\x67\\xfd\\xf3\\x7c\\xd3\\x62\\xf4\\xd1\\x6b\\x81\\xc9\\xd3\\x2d\\x14\\xac\\xa4\\xfa\\x43\\x72\\x5e\\x1e\\x9f\\xec\\x5d\\x2d\\x9d\\xe6\\x23\\xdf\\xd5\\x32\\x12\\xb4\\xbf\\xab\\x25\\x55\\xbb\\xf6\\x5d\\x2d\\x13\\x11\\x75\\x57\\x8b\\x19\\x0f\\xd8\\x00\\x32\\x0c\\x59\\x7d\\x57\\xcb\\x54\\xcb\\xf2\\xae\\x96\\x54\\xe5\\xaa\\x77\\xb5\\x64\\x0a\\xed\\x73\\x4a\\x52\\xf1\\x13\\xbf\\xab\\x05\\x36\\xc9\\xdf\\xd5\\xd2\\x1b\\x36\\xbc\\xab\\x05\\x53\\x81\\x37\\x77\\x00\\x44\\xaf\\x78\\x57\\x4b\\xa2\\x32\\xe2\\x5d\\xad\\xbe\\xf8\\xa9\\x0d\\x4e\\x2d\\xe3\\x09\\x0d\\x11\\x75\\x27\\xb8\\x9e\\x6e\\x1c\\xe2\\x14\\xc4\\x94\\x81\\xe8\\xb2\\x7d\\x7d\\x0d\\x6f\\x5b\\xd7\\x8c\\x0f\\xcd\\x6a\\xc4\\x30\\x27\\xc2\\xfc\\x47\\x64\\xc1\\xe0\\xc5\\xb0\\xb5\\x49\\x75\\xed\\xf0\\xe1\\x8e\\x70\\xf0\\x59\\x79\\xb7\\x31\\x41\\x09\\x7c\\x5d\\x94\\x13\\x91\\x3d\\x76\\x59\\x92\\x50\\x27\\xd0\\xd3\\x7b\\x81\\x0f\\xd4\\xba\\xaf\\xa4\\x5a\\x33\\xbd\\x96\\x34\\x75\\xc6\\xf7\\xb5\\x84\\x0f\\x3c\\xf9\\x68\\x5d\\x90\\x8b\\x74\\xf4\\xcf\\xb8\\xfa\\x02\\xa1\\x4d\\xef\\xf5\\xdb\\x32\\x39\\x9c\\xdd\\xd1\\x04\\xf2\\x4b\\xf4\\xe6\\x00\\x61\\xe1\\x22\\xe4\\xab\\xf4\\x89\\x85\\x5c\\xed\\xff\\xc8\\x44\\xe4\\x91\\xd0\\x99\\x32\\xf0\\x96\\x0b\\x4f\\x1e\\xdf\\x34\\xff\\xd4\\x4b\\x25\\x97\\xcd\\x3f\\xb5\\xb6\\xb2\\x3a\\x53\\x76\\x1f\\x18\\x11\\x95\\xc9\\x21\\x8c\\x23\\x7f\\x36\\x26\\x5f\\xe8\\xfb\\xb7\\x1b\\x40\\xe4\\x88\\x0a\\x07\\xb0\\xd6\\x4e\\x07\\x47\\xe0\\xf6\\xf4\\x44\\xd9\\xdb\\x21\\x5c\\x61\\x72\\x55\\x4f\\x1a\\x72\\xf2\\x17\\x84\\x5e\\xac\\x01\\x0c\\x5a\\xbe\\xd4\\x03\\x3b\\x25\\xec\\x76\\x40\\xe8\\x89\\x37\\x8e\\x0c\\xc3\\x1b\\xc2\\xa5\\x69\\xbb\\x0a\\xd9\\xe8\\x79\\x95\\x5d\\x48\\xbb\\xc7\\xf8\\x75\\x84\\x6c\\xe3\\x83\\xb9\\x42\\x0f\\xaf\\x0c\\xc9\\x78\\x49\\x62\\x2f\\x7d\\x61\\x3d\\xaf\\x57\\xbf\\xb9\\xb9\\x31\\x56\\xd7\\xd2\\xa6\\x2a\\x02\\x89\\xa1\\xa3\\x86\\x35\\x11\\xbc\\xb0\\x81\\xa7\\x07\\x67\\x88\\x1a\\xa5\\xed\\x3e\\x43\\x4c\\xad\\x6f\\x46\\x02\\xb4\\x62\\x59\\xcd\\x0e\\x1b\\xdb\\x83\\xd7\\xb5\\xe3\\xea\\x3e\\x99\\x17\\x80\\xdb\\x18\\xe4\\x1a\\x7a\\xaa\\x5e\\xdb\\xbf\\x27\\x76\\x22\\x86\\x46\\x86\\x79\\x96\\xde\\xca\\x57\\x77\\xf2\\x6a\\x1f\\x64\\xec\\x2b\\x39\\x1a\\x3e\\xc0\\x28\\xf5\\x7b\\x30\\xc9\\xc3\\x5f\\x2a\\x76\\x7b\\xda\\xdc\\x46\\x52\\xbd\\x26\\xd4\\x08\\x1f\\xde\\x9e\\x7e\\x19\\xe8\\x00\\x4c\\xf3\\xe5\\xa0\\x3d\\x1c\\x8f\\xaa\\xa2\\x2a\\xaa\\xed\\x44\\x92\\xdd\\xe2\\xb2\\xc2\\x80\\x97\\x0d\\x43\\xf5\\xfe\\x73\\xff\\xa6\\xf9\\xa7\\x56\\x85\\xa7\\x3f\\xab\\xb8\\xf9\\x67\\xc7\\x55\\xa4\\x04\\xe3\\xf4\\x6f\\x86\\x81\\xdc\\x85\\x4a\\x4b\\x9c\\xfe\\xf4\\xb0\\xa6\\xce\\x80\\x06\\xa2\\xf7\\x74\\x06\\x9e\\x04\\x5d\\xdd\\x1f\\x78\\x12\\x64\\xc5\\x1a\\xc0\\xe0\\xa8\\x2d\\x48\\x3d\\xd6\\x60\\x9a\\x04\\xf5\\xe0\\x0d\\xe1\\xd2\\xe4\\x80\\x66\\xb3\\xd9\\x95\\xd6\\x01\\x4d\\x82\\xc4\\xa1\\x0e\\x57\\xe8\\xe1\\xb5\\x67\\x12\\xd4\\x4f\\xdf\\x3a\\x09\\x22\\x37\\x43\\x1b\\xaa\\x6b\\x93\\x20\\x15\\x01\\x98\\x04\\x05\\x7e\\xf3\\xcf\\xae\\x4e\\x65\\x12\\x64\\xc1\\x19\\xa2\\x46\\x68\\x12\\x64\\x35\\xb5\\xbe\\x49\\x10\\xd0\\x8a\\x29\\x84\\x29\\xb7\\xca\\x8d\\xf2\\x73\\x96\\x6f\\x13\\x6c\\x0f\\xf6\\x35\\x83\\xa5\\x7f\\xba\\xd6\\xef\\x88\\x06\\xcf\\xd8\\xc6\\xd5\\x7d\\x32\\x97\\x35\\x74\\xc6\\x36\\xbe\\xea\\xb5\\xfd\\x7b\\x62\\x8f\\x37\\x7c\\xc6\\x76\\x4d\\xe5\\xab\\x3b\\x79\\xb5\\xc3\\x34\\xf6\\x55\\x9c\\x5e\\xf5\\xd8\\xa5\\x3e\\xff\\x00\\x5d\\x97\\x3a\\x69\\x33\\x51\\x35\\xcc\\xdb\\x74\\xf8\\xf0\\x26\\x8d\\xf3\\x36\\x1b\\x66\\xef\\xbc\\xcd\\xc4\\xf1\\xa8\\x2a\\xaa\\xba\\x2e\\xde\\xb6\\xc4\\x28\\x8e\\xca\\xd3\\x71\\xdb\\x7e\\x7e\\xbb\\x51\\xbe\\xbe\\x89\\xfb\\x03\\x07\\xdc\\x0f\\x4c\\xee\\x72\\x05\\x1f\\x8c\\x6f\\x9b\\x12\\x37\\xd3\\xca\\x9f\\x74\\x24\\x9c\\xd7\\x69\\xb2\\xde\\xe2\\x5d\\x5e\\xb6\\x1b\\xb2\\xe8\\x75\\x4a\\x1b\\x61\\x85\\xd0\\xde\\x57\\xf9\\xe6\\xef\\xbe\\x8f\\xfc\\x2f\\x24\\x12\\x7c\\xf3\\xa5\\x38\\x71\\x2f\\xd0\\x3e\\xc9\\xc8\\xee\\x0b\\xf8\\x83\\x06\\x78\\xbc\\x89\\x74\\xde\\x01\\x37\\xdd\\x76\\xf4\\xf4\\x5e\\x29\\xd0\\x66\\xbc\\xca\\x05\\x55\\x81\\xec\\x57\\x37\\x6e\\xb4\\x53\\xbf\\xea\\xa1\\xac\\xde\\xab\\x7d\\xc9\\x55\\xb6\\x43\\x2f\\xe2\\x35\\x1d\\x12\\x51\\x7a\\x22\\x9d\\x4a\\x53\\x7b\\x25\\x01\\x49\\x0f\\xa1\\x4f\\x05\\xb6\\xbc\\xba\\xe9\\xf6\\x20\\xb9\\x19\\xe1\\xf8\\x9a\\xc6\\x82\\x00\\x23\\x1c\\x5c\\x99\\xb0\\xd7\\x5b\\xed\\xdc\\xa6\\x5a\\xcc\\x2e\\xbb\\xd4\\x15\\x0c\\x57\\x20\\x10\\xe5\\x7c\\xe0\\x46\\x7e\\x4d\\x62\\xc8\\xc1\\x2d\\x55\\x37\\x42\\xf4\\x83\\x4a\\x01\\x5e\\x94\\x98\\x05\\xc2\\x1a\\x66\\x8d\\x00\\x0b\\x4d\\xa0\\x93\\xad\\x65\\x36\\xb6\\xd6\\x7b\\x6a\\x09\\x7c\\x30\\x97\\x9f\\x56\\x10\\x1b\\x14\\x63\\x22\\x5c\\x0e\\xb1\\xa9\\x46\\x32\\x03\\x54\\xef\\xbe\\x04\\xb2\\x52\\x16\\x44\\x20\\x9c\\x05\\x1c\\x72\\xec\\x0f\\x78\\xcd\\x5c\\xd1\\xb6\\x9b\\xee\\x35\\xb7\\xc2\\xca\\xa8\\x67\\xb9\\xea\\x4e\\x18\\xbd\\x05\\xf3\\x70\\x07\\xe0\\xea\\x78\\x13\\x47\\xf1\\xc2\\x3a\\xc6\\x17\\xf2\\x68\\x63\\xb4\\x4d\\xc3\\x5c\\x07\\x5b\\x47\\xba\\xde\\xb4\\x0a\\x96\\xda\\xae\\x8e\\xba\\x64\\x69\\x99\\x24\\xd9\\x81\\x37\\x9f\\xe8\\xa4\\x2d\\x22\\xd5\\xe1\\x36\\x91\\x4e\\xad\\x22\\x9d\\x42\\xdd\\x32\\x8b\\x54\\x03\\x5b\\x45\\xaa\\x37\\xad\\x82\\x49\\xdb\\xb8\\x84\\xcf\\x0c\\xf3\\xa0\\xaa\\xdf\\x47\\xa1\\x9d\\x21\\x26\\x54\\x1c\\x38\\xbe\\x12\\x00\\xeb\\x07\\xfd\\x4d\\x98\\xb6\\x05\\x77\\xaa\\xb6\\x19\\xb4\\xef\\xb0\\xff\\x9c\\x24\\xdf\\xe5\\x37\\x6f\\xbb\\xe7\\x28\\x61\\x81\\x97\\x8c\\x3f\\x7c\\x4c\\x2b\\x7b\\x19\\xbe\\xaf\\xbb\\x1e\\xd1\\x3f\\x49\\xa7\\x84\\xaf\\x97\\x2d\\x72\\x51\\xe2\\xdb\\x24\\x3f\\x55\\x42\\x85\\xb6\\x48\\xa8\\x44\\x77\\x69\\x31\\x04\\xc5\\x5b\\xca\\x45\\x72\\x4f\\x60\\x1f\\x29\\x01\\x48\\x2b\\x57\\x38\\xb7\\x8b\\x47\\x77\\x76\\xc8\\xaa\\x6a\\x95\\xe4\\x85\\xf8\\xe8\\x78\\x8b\\xe6\\xbf\\xa6\\xf8\\x28\\x8c\\xb0\\xe5\\xfc\\x85\\x74\\xdb\\xc9\\xd2\\x74\\xdb\\x49\\x7b\\xe5\\xbf\\x64\\x5d\\xfd\\x97\\xb0\\x6c\\x51\\x85\\xe9\\xab\\x4d\\x92\\xca\\xbd\\x70\\x8e\\x8f\\x17\\x44\\xb9\\x66\\x52\\xe2\\x7f\\x0d\\x7b\\x6a\\x80\\x49\\x86\\x5d\\xa2\\xc6\\xfa\\xbf\\xc6\\xc7\\xa2\\x7e\\x50\\xce\\x10\\x91\\x0b\\x4b\\xd9\\xc6\\x17\\x6d\\x7e\\xc8\\x8f\\x07\\x31\\x02\\x96\\xef\\xce\\x64\\xca\\x2b\\x21\\xfd\\x7c\\x28\\xf1\\xae\\x5d\\x99\\x40\\x20\\xe3\\xf3\\xad\\xe4\\x7b\\x31\\x27\\xc7\\x5e\\xaa\\x37\\x3e\\x72\\xaf\\xe0\\x41\\xcd\\xca\\x20\\x53\\xb3\\xe1\\xcd\\xc2\\x5f\\xf9\\x9c\\x1c\\xf0\\xca\\x37\\x67\\x8f\\xbc\\x3d\\xad\\xe0\\x41\\xcd\\xca\\x20\\x53\\xb3\\xf4\\xf5\\x77\\x4e\\x4e\\x7d\\xe9\\x97\\xb7\\x49\\x5e\\xa7\\x15\\x91\\xa0\\x06\\x85\\x72\\x63\\xf6\\x8e\\xbc\\xeb\\xcc\\x09\\x01\\xef\\x79\\x72\\xcb\\x22\\xaf\\x4c\\x2a\\x78\\x50\\x9b\\x32\\xc8\\x78\\x11\\x00\\x79\\xe7\\xb5\\xb5\\x10\\xed\\xbd\\x3e\\x3e\\xed\\x20\\xef\\xc9\\xc9\\x68\\xa0\\x1d\\x89\\x10\\x53\\x9b\\xf4\\xe5\\xc6\\x0b\\x7b\\xb1\\x0e\\xde\\x54\\xd6\\xbd\\x68\\x23\\x6e\\xc5\\x9f\\x16\\xf7\\xce\\x52\\x8f\\xb5\\xef\\xd5\\x15\\xf0\\x07\\x87\\xa0\\x91\\xa5\\x46\\x04\\xb2\\xc3\\x86\\x74\\xcb\\x3c\\xa4\\x69\\xaf\\x6d\\x43\\x5a\\x7b\\xb0\\x8c\\x55\\xe2\\xef\\x96\\x71\\x1a\\xd2\\x2e\\x2d\\xfe\\x88\\xd9\\x05\\x31\\x06\\xb8\\x77\\xa2\\x7f\\x5d\\xe9\\x9d\\x9a\\x30\\x4c\\x59\\x49\\x6a\\x7c\\xe4\\x93\\x7a\\xce\\x4e\\x77\\xda\\xb8\\x5d\\x42\\xbc\\x95\\xdf\\x21\\xe4\\xb3\\x77\\x83\\xf3\\x97\\xc9\\xf3\\xba\\x52\\x8c\\x83\\x71\\x5e\\x33\\x54\\x69\\x1f\\xce\\x5c\\x3d\\x35\\xdd\\xb1\\x23\\xae\\x3f\\xc9\\xac\\xe4\\xd7\\xd3\\x71\\x9b\\xd7\\x65\\x77\\xab\\x16\\xd9\\xcf\\x34\\x05\\x76\\xc4\\x4f\\xf5\\x9d\\x54\\xa4\\x88\\x76\\x24\\xc9\\x0e\\xb8\\x4c\\xa0\\x85\\x0b\\x09\\xe7\\x6d\\x33\\x8e\\x77\\x08\\x26\\xc2\\x9f\\x87\\xe0\\x2c\\x11\\x10\\x51\\xd5\\xed\\x7f\\xca\\x01\\x94\\x30\\x50\\x4c\\x3e\\xf4\\x7d\\xa1\\xfa\\xdb\\x43\\x29\\xce\\xd7\\xf8\\x00\\x9e\\x37\\xff\\x2e\\xe2\\x49\\x91\\xb6\\x86\\x76\\x0a\\xca\\x01\\xc4\\x63\\x3d\\x7b\\x09\\xdc\\xba\\x25\\xf4\\xbc\\xa5\\x7e\\x56\\x6e\\xa0\\xa6\\xf9\\x77\\xa7\\x8a\\x4a\\x8c\\x33\\x7a\\xb2\\x4d\\xdf\\xde\\x05\\x6b\\x6a\\x76\\xa3\\x6b\\x6a\\x46\\xb6\\xc5\\x3d\\xb2\\x87\\xe2\\x03\\x5a\\xb4\\x87\\x0b\\x5f\\xe9\\x8f\\xa6\\xc9\\x4e\\x37\\x8b\\x29\\xd9\\xd3\\x5e\\x1f\\x4e\\xc7\\x6d\\x86\\x92\\xd4\\xf0\\xbc\\x8c\\xbe\\xcd\\x2e\\x54\\xcf\\x5d\\x88\\x57\\x93\\x5c\\x3d\\x45\\x15\\x5f\\xc8\\x12\\x1e\\xea\\xa3\\x48\\x8e\\x17\\x56\\x0e\\x46\\x15\\x76\\x93\\xcc\\xcd\\x4f\\xb5\\xf2\\xd8\\x9f\\x01\\xa9\\x17\\x43\\xe8\\xbd\\x43\\xae\\x7c\\x99\\x74\\x05\\xec\\x06\\x18\\x61\\xcc\\x8a\\xe7\\x3f\\xba\\x13\\xf9\\xa8\\xab\\xc2\\x1f\\x0b\\x11\\x8a\\x5a\\xd7\\xd6\\x95\\x40\\xf7\\xae\\xf0\\x59\\x48\\xc7\\x8e\\x17\\xa1\\x82\\xe4\\xfd\\x84\\x03\\x4b\\x1b\\xf1\\xeb\\x19\\x4a\\x71\\x59\\x9f\\xa5\\x83\\x5f\\x23\\x8f\\x48\\x43\\x09\\x42\\x42\\xd5\\x39\\xcc\\xe4\\x2d\\xad\\xca\\xf0\\xa7\\x48\\xf4\\x7f\\xf4\\xc7\\x59\\x97\\xcd\\x10\\x27\\xb0\\xb7\\xc5\\x84\\xfd\\x38\\x69\\x3b\\xbc\\x5b\\x94\\xd7\\x85\\xfa\\xc0\\x24\\x23\\x1c\\x27\\xd5\\x31\\xa9\\xc8\\xac\\x7d\\x22\\x17\\x25\\x5b\\xed\\x75\\x80\\x29\\x5c\\xd1\\xf1\\xa2\\x34\\xaf\\xa0\\xfa\\x0c\\x62\\x0a\\x6e\\x4d\\xa8\\x66\\x1b\\x2c\\x89\\x0f\\x83\\x24\\xd0\\x4e\\xef\\xb8\\x5a\\xa2\\xe5\\x62\\x0a\\xad\\x1e\\xe2\\xdd\\xce\\x8f\\xd5\\xfd\\x94\\xf1\\x02\\xaf\\xa2\\x85\\x42\\xca\\x01\\x1d\\x62\\xb4\\xc2\\xe1\\x76\\xaa\\xa2\\x8a\\xf2\\xe7\\xb3\\xcf\\xed\\x7c\\xd6\\xcc\\x56\\x28\\x84\\x4c\\x03\\xdb\\x29\\xdb\\xd2\\xbf\\x81\\xdf\\xf0\\xc6\\xf1\\x4e\\xcd\\x59\\x6d\\x23\\x7c\\xb3\\x0b\\x44\\x3a\\x30\\x63\\x68\\x81\\x03\\x2c\\xb5\\x07\\x72\\x35\\x9b\\x87\\x8b\\x15\\xc7\\x52\\x9e\\xf4\\xbf\\x41\\x8b\\x78\\xba\\x85\\xfc\\x46\\xb4\\xbb\\xc1\\x53\\x85\\xb1\\x1d\\xc2\\xdb\\x28\\x52\\x48\\xc1\\xbc\\xed\\x96\\x38\\xd8\\xce\\x55\\x54\\x80\\xbd\\xc5\\x62\\x1e\\x74\\x42\\x93\\x9f\\xf3\\x46\\xab\\xd9\\x6c\\x16\\x42\\xdc\\x85\\x31\\x8e\\xb5\\x77\\xd7\\xb7\\x51\\x14\\x07\\x32\\x25\\x98\\x39\\x3c\\xdb\\xae\\x22\\x5f\\xc1\\x04\\x78\\xbb\\x99\\x4d\\xe7\\xd3\\xd9\\xe5\\x0f\\xdc\\x31\\xbe\\xc3\\x0f\\xbb\\x12\\x1d\\x71\\xe5\\x14\\x65\\xbe\\x2f\\x71\\x55\\xb9\\x5b\\x72\\xa2\\xb6\\x4c\\x0a\\x5c\\x9d\\x77\\x65\\x7e\\x14\\x27\\xb1\\xad\\x71\\xcf\\x48\\xf2\\xe2\\x52\\xe7\\x20\\xd4\\x77\\xfc\\xcb\\xe5\\x0f\\x6e\\xfe\\x5e\\xc9\\xbf\\x47\\xda\\x1e\\xa7\\x78\\x16\\x4e\\xa9\\x41\\xde\\xb0\\xff\\x1e\\x30\\xd3\\x07\\xa1\\xbe\\x13\\x55\\xda\\xd3\\x8c\\xc6\\x03\\x53\\x3a\\x66\\xc7\\x3f\\xd9\\xee\\xa0\\xdd\\xef\\xdd\\x3e\\x38\\x4a\\x6e\\xaf\\xb2\\xe4\\xee\\xc2\\x6e\\xae\\x67\\x58\\x42\\x18\\x73\\xd6\\x96\\xee\\xb9\\xc2\\x49\\x2e\\xe9\\x7d\\xcb\\xa1\\x98\\x40\\x54\\x27\\x1d\\x73\\xbc\\x05\\x8d\\xc6\\x4a\\x34\\x57\\x80\\x46\\x88\\x2c\\x37\\x66\\x49\\xf1\\xa4\\x2b\\x65\\x25\\x8e\\x2c\\x5f\\xed\\x94\\x21\\xe7\\x8f\\x3e\\x03\\xec\\xb6\\x0f\\x02\\xce\\xe6\\x31\\xde\\x4f\\x80\\x13\\x6c\\xf3\\x57\\x4e\\x38\\x7f\\x31\\x11\\x42\\xa9\\xf6\\xf7\\xdc\\x7f\\x61\\xa8\\x69\\x86\\x2c\\x15\\x1a\\xca\\xdf\\xaf\\xf4\\xa3\\xc5\\x6e\\xfe\\x19\\x32\\xfd\\xc9\\x73\\x0c\\x3c\\x18\\x4b\\xc6\\x1b\\xf1\\x44\\x33\\x5f\\x4e\\xc4\\xca\\x10\\xd9\\x24\\xdb\\xc7\\xe3\\x78\\x21\\x2b\\x50\\x0c\\x92\\xb7\\x87\\xb2\\xe4\\x48\\x17\\xb8\\x90\\x87\\x74\\x42\\xfe\\x50\\xb5\\x93\\x64\\xbb\\x24\\x4b\\x6a\\x32\\x6e\\xc6\\x57\\x1a\\x5d\\x43\\x1d\\x67\\xbd\\x49\\x2d\\xfb\\x00\\x84\\x08\\x3c\\x0f\\xc4\\xe7\\x81\\xa8\\x71\\xac\\xd8\\x5d\\x4f\\x56\\xb3\\xc7\\xe8\\xd4\\xda\\xcf\\x16\\xf7\\x6c\\x71\\x7d\\x16\\xd7\\x9f\\xd9\\xee\\x31\\x3a\\x80\\xc0\\xb3\\xdd\\x3d\\xdb\\x5d\\x9f\\xdd\\xf5\\x7e\\xda\\xe8\\x31\\x3b\\xbd\\xfe\\xb3\\xd5\\x3d\\x5b\\x1d\\x60\\x75\\x24\\xa7\\xad\\x1e\\x92\\x66\\xc5\\xd0\\xf3\\xb7\\xec\\x2d\\x09\\x02\\x9f\\xd0\\xff\\x71\\xb7\\x79\\xfc\\x70\\x56\\x17\\xd6\\xbf\\xe5\\xf9\\x71\\x1d\\x5c\\x44\\x14\\x96\\x4b\\xc7\\xb3\\xb6\\x05\\x37\\xdf\\xfe\\x8a\\xa3\\x5a\\xbd\\x6d\\x52\\x84\\x79\\xc9\\x71\\xef\\x76\\x19\\x6a\\xf5\\x42\\x6e\\x8a\\x4a\\xf2\\x74\\x8c\\x9d\\xb7\\xc2\\xa3\\xe3\\xf2\\x46\\x0e\\xfa\\xc1\\x8b\\xd6\\x68\\x0a\\xe4\\x0a\\xe4\\x44\\xb6\\xf2\\xfd\\x40\\xa8\\xd0\\xf4\\x60\\xa2\\x57\\x66\\xed\\x00\\x57\\xad\\x2a\\x1f\\xe6\\xea\\xbc\\xe0\\xa4\\xe8\\x37\\xba\\xb3\\xe1\\xb6\\x09\\xde\\x1c\\xb9\\x28\\x4c\\xfd\\xd0\\x4f\\x4a\\x39\\xce\\x01\\xa3\\x86\\xd9\\xb3\\xe5\\x4e\\x8b\\xb9\\xd0\\xe3\\xa4\\xaa\\xd5\\x8d\\x2d\\xda\\xc6\\x95\\xee\\xfb\\x95\\xfd\\xde\\x7c\\x7a\\x09\\x90\\xf2\\xb5\\x6b\\xfc\\x4d\\xf8\\xc0\\x8d\\xe8\\xe3\\x76\\x79\\x2a\\x1c\\x0c\\x79\\x46\\xb0\\xe7\\x3e\\x04\\x9d\\xa6\\xf9\\xca\\x8a\\xc7\\x3d\\x2e\\x89\\xd4\\x96\\x26\\xf4\\xf1\\x3b\\x4d\\xac\\xdd\\x39\\x4a\\xbd\\x8e\\xa3\\x16\\x70\\xab\\x30\\x10\\x33\\xe2\\x8b\\x47\\xfc\\xb4\\x56\\xba\\xcd\\x23\\x4a\\x39\\xdd\\x61\\x03\\x37\\xc5\\x2a\\x19\\x80\\xda\\x11\\xd1\\xa1\\x5b\\x7e\\x49\\x7a\\xee\\x62\\x10\\x95\\xf8\\xc8\\x63\\x97\\xfa\\xa2\\x7b\\x89\\xd4\\xcf\\xc3\\x7c\\x3f\\xd0\\xc4\\x08\\x69\\x77\\x0b\\x98\\xe0\\xd7\\xed\\x93\\x24\\xdf\\x5a\\x4d\\x34\\xcd\\x0a\\xed\\x61\\xf3\\x9a\\x8a\\x84\\xff\\x3e\\x93\\x68\\x3f\\x79\\x0c\\x67\\xb9\\x91\\xfd\\x78\\x7e\\x7b\\x6a\\x19\\x98\\xd5\\xae\\x76\\x80\\xb7\\x01\\xe8\\x84\\x69\\xb9\\x49\\xc7\\x0c\\x6a\\xd8\\xf1\\x6c\\xbb\\x96\\xdc\\xb0\\xfb\\x17\\x6e\\x60\\x84\\xd6\\x7a\\x2a\\xbc\\xf5\\xaa\\x23\\x4a\\xd3\\xf1\\xf5\\xac\\xd5\\x46\\xdb\\xd6\\xa0\\x6a\\x3d\\xbc\\xf6\\xd5\\xb6\\x57\\xb6\\x1b\\xf5\\x95\\xd5\\xfa\\x38\\xee\\xa9\\x4d\\x2a\\xf7\\x8d\\x27\\x93\\xa2\\xe0\\x71\\x61\\x17\\x95\\xb5\\xce\\x80\\x91\\x14\\x2d\\xe3\\x18\\xeb\\x9b\\x5e\\x46\\x7e\\xf0\\xd4\\x23\\x09\\x27\\x60\\x08\\x0b\\x30\\x7d\\x33\\x99\\xb1\\xe1\\xaf\\xb7\\x9e\\xa2\\x23\\x63\\xc3\\xa6\\x88\\xd8\\xc2\\x6d\\x91\\x51\\x21\\xd2\\x83\\x24\\x9f\\xc0\\x37\\x0a\\xdc\\x27\\x1f\\x93\\x8d\\x0c\\x75\\x3b\\x13\\xec\\x08\\x7d\\x1d\\x93\\x6c\\xa8\\x87\\x75\\xde\\xe6\\x20\\xac\\x41\\xc2\\x90\\xdd\\xb2\\xdd\\x19\\x33\\x49\\xc9\\xce\\x98\\xda\\x93\\x46\\x7e\\xc4\\x87\\x72\\x40\\xc4\\x4d\\x6d\\x13\\xe3\\x3a\\x65\\x03\\x81\\xd1\\xa6\\x6c\\xad\\xd4\\x6b\\xc7\\x4d\\x6d\\xa3\\xae\\x09\\xd0\\xaa\\x61\\xa1\\xba\\x0d\\x43\\xb6\\x5d\\x93\\x60\\xa3\\x19\\x9e\\xee\\x80\\x69\\x27\\xa1\\x61\\x36\\x5c\\x01\\x6a\\xed\\xc9\\x20\\x93\\x15\\x9b\\xea\\x47\\xe9\\xef\\xfa\\x18\\x4b\\x65\\x72\\x91\\x2d\\x95\\xda\\x8a\\x46\\x7b\\xdc\\xe6\\x09\\x40\\xa6\\x8c\\x80\\x89\\x77\\x90\\xbe\\x99\\xcc\\x68\\xab\\xed\\xab\\xd7\\x6b\\xb8\\x8c\\x80\\x51\\xe3\\x1c\\x6e\\xd5\\xb6\\x4c\\xa4\\x07\\x49\\x52\\xa1\\x59\\xe0\\x68\\x17\\x46\\x91\\x99\\x61\\xb3\\x1d\\xcb\\x08\\x7d\\x1d\\x1b\\x64\\xcd\\x4a\\x9b\\x83\\xb0\\x06\\x09\\x63\\x84\\x59\\x73\\x49\\x49\\x66\\xcd\\xec\\x49\\x23\\x3f\\x6a\\xd3\\x0d\\x20\\x64\\x5a\\xdf\\xc4\\x3c\\x44\\xdd\\x48\\x64\\xb4\\x49\\xf7\\x54\\xeb\\xb5\\x68\\x5a\\xdf\\xa8\\x77\\x06\\xb6\\xea\\x5b\\x22\\x61\\xc7\\x91\\x34\\x67\\x14\\x34\\xde\\x46\\x11\\x68\\xcd\\x94\\x8a\\xd9\\x98\\x25\\x78\\x4f\\x9f\\x06\\x99\\xb2\\xdc\\xe0\\x10\\xa4\\x21\\x62\\x18\\x61\\xc7\\x5c\\x46\\x92\\x1d\\x33\\x1b\\x32\\xea\\xbc\\x2f\\x27\\x07\\xce\\xbd\\xf5\\xb7\\x29\\xa5\\xe3\\x8e\\x17\\xaf\\x40\\x99\\x76\\x53\\x6e\\xe8\\x0f\\x4f\\x9a\\x59\\xb7\\x7e\\x42\\x3b\\x80\\xe8\\x86\\xa5\\x40\\xd9\\xb0\\xe4\\xcb\\x9b\\x7f\\x8c\\x48\\x8c\\x61\\x9a\\xfd\\x15\\xf7\\xa9\\x72\\x00\\x97\\x96\\x9e\\x18\\x1c\\x72\\xc5\\x75\\xff\\x09\\x43\\xe8\\x08\\xa0\\xd2\\x36\\xf8\\xf6\\x16\\xbb\\x11\\x47\\x59\\xaf\\xd1\\x7a\\x75\\x52\\xa7\\xd8\\xa6\\x5f\\x5f\\xdc\\xa0\\xb5\\xd0\\x77\\x8e\\x0a\\x64\\xda\\x55\\xa5\\x5e\\x46\\x8f\\xba\\x75\\xa5\\xca\\x9f\\x40\\x3d\\x56\\x0d\\xe6\\x7a\\x97\\xe7\\x75\\x77\\xb0\\x51\\x14\\x74\\xcf\\x06\\x38\\xf9\\x16\\x72\\xe0\\x01\\xc6\\x9e\\x23\\x96\\xc0\\xe9\\xce\\x0c\\xa7\\x6f\\x85\\x01\\x30\\xe1\\x45\\x94\\x53\\x7e\\x7b\\x8f\\x88\\xa2\\x6f\\x1d\\xd6\\xa8\\x68\\xee\\x77\\x00\\x59\\xad\\xce\\x59\\x7f\\x7f\\x63\\xa3\\x3d\\xa0\\xae\\x35\\x2d\\x66\\x9d\\x35\\x92\\xf2\\xeb\\xd9\\xbd\\x2c\\x0d\\xa6\\x75\\x96\\x1e\\x4c\\x7a\\xd4\\x50\\x90\\xda\\xef\\xb2\\xdd\\x7a\\xf3\\xe2\\xe3\\xd2\\xfd\\x3d\\x19\\x46\\x49\\x7d\\x50\\xee\\x69\\xac\\x4b\\x1a\\xe2\\xaf\\xc7\\x98\\xc0\\x90\\x4f\\x08\\xd6\\x8b\\x9c\\x95\\xa6\\xaf\\x68\\x8a\\xed\\xf9\\x14\\x83\\xc4\\x6b\\x79\\x18\\x43\\xc8\\x06\\x85\\xd4\\x74\\xf7\\x3c\\x83\\x02\\x7f\\xb9\\x25\\xae\\x8a\\x3c\\xab\\xc8\\x51\\x29\\x52\\x62\\x1c\\x6d\\x20\\x6d\\x87\\x1d\\x53\\x90\\xa9\\xc2\\xa5\\x7a\\x5b\\x8e\\x72\\xc8\\xc1\\x7a\\x72\\xe7\\x62\\x22\\x26\\xbf\\x3a\\x4d\\xa0\\xe0\\xb8\\xd3\\x20\\x03\\x4e\\xa9\\x5b\\x07\\xce\\x48\\x46\\xde\\xd6\\x4d\\x28\\x94\\x4b\\x4a\\x33\\xa7\\x63\\x08\\x37\\x06\\x37\\x98\\xf0\\x23\\x78\\x1a\\xd5\\xea\\xa7\\x26\\x5e\\xa7\\x8e\\x9f\\x46\\xda\\xbd\\xed\\x1c\\x3e\\x88\\x56\\x9f\\xac\\x3f\\xbd\\xed\\x58\\xfa\\xf3\\x74\\x1a\\x78\\x3a\\x19\\x3f\\x9d\\x14\\x1f\\x23\\x27\\x8b\\xf9\\xbf\\x57\\x13\\x07\\xe2\\xf4\\xfb\\xb0\\xf0\\xa7\\x68\\x66\\x80\\x6a\\x3e\\x48\\x33\\xe6\\xde\\x3c\\x99\\xf4\\x9f\\x4c\\xbe\\x4f\\x26\\xc1\\x47\\xc8\\xc8\\x76\\xc9\\x8a\\xd9\\xb6\\x85\\x9b\\x5a\\x18\\x07\\x46\\xd6\\x4c\\x33\\xc4\\x6b\\x67\\x84\\xa3\\x78\\x61\\xea\\x11\\x0b\\xca\\x41\\x76\\x68\\x27\\xda\\xcc\\xde\\x06\\x12\\xbd\\x96\\x99\\xe1\\xed\\x7d\\x7a\\x62\\x1d\\x1c\\xcd\\x1e\\xd5\\xc6\\xc0\\xc8\\xfc\\x08\\x4d\\x3e\\x51\\x3f\\x7a\\xda\\xb0\\x45\\xbf\\xa7\\x11\\xf9\\x13\\x49\\xf5\\x89\\x04\\x77\\xb5\\x6c\\xce\\x1f\\xc7\\x92\\x1f\\xef\\x2e\\x7a\\x45\\xfe\\x9e\\x3d\\xd2\\xd3\\xf4\\xa2\\x57\\x55\\x8f\\x77\\x81\\xd6\\x18\\xf7\\x24\\x12\\x7d\\x1a\\xa1\\x5d\\x2b\\x97\\x1e\\x57\\xad\\xac\\xcf\\x9b\\x4e\\xbe\\x56\\x56\\xfa\\x1a\\x44\\xd0\\x9f\\xcc\\xe3\\x6b\\x01\\xd7\\xa8\\x72\\x11\\xe9\\x6c\\x4c\\x14\\xca\\x43\\x6b\\xc8\\xdc\\x69\\x32\\xb6\\xc6\\x41\\x4a\\x83\\x29\\x63\\x99\\x82\\xb0\\xd9\\x72\\x55\\xc4\\x33\\x7f\\x15\\xcc\\x40\\x88\\x32\\xf4\\xb6\\x2e\\xdf\\x5a\\x3d\\x3c\\x80\\x6e\\x0b\\x3a\\x1d\\x7a\\x63\\x12\\x23\\xa8\\xb7\\xe8\\xc3\\xa8\\x37\\xf3\\xbb\\x11\\xd4\\x5b\\xf4\\x61\\x01\\xf3\\x4a\\x59\\x0d\\x22\\x70\\x2d\\x07\\x83\\xe4\\x39\\x88\\xc0\\xb5\\x1c\\x0c\\x92\\xf9\\x20\\x02\\x60\\x48\\xe3\\x2f\\xfd\\xf5\\x5b\\xab\\xd1\\x8f\\x83\\xe2\\x1e\\x80\\x2d\\xc8\\x76\\x0c\\xf6\\x20\\xda\\x82\\xd4\\xc6\\x60\\x0f\\x0a\\x88\\xd7\\x49\\x69\\xa0\\x99\\x5e\\x55\\x7f\\x88\\x24\\x07\\x1a\\xe9\\x55\\xf5\\x87\\x48\\x7b\\xa0\\x89\\xea\\x21\\x8b\\xbf\\x39\\xd7\\x63\\x74\\xb2\\x93\\xef\\xb5\\x51\\x65\\xe1\\xda\\x67\\x1a\\x43\\xa9\\x83\\xe8\\x2a\\xf5\\x01\\xa6\\x60\\x6f\\x6f\\x34\\x81\\x31\\x1c\\x0c\\xea\\xf1\\x68\\x02\\x07\\xf5\\x2b\\x4d\\xaf\\x3e\\xc5\\x89\\x4d\\xbf\\x3a\\x45\\x6c\\xb3\\x36\\x99\\xa1\\x0f\\xa4\\x0d\\x61\\x5f\\xa3\\x4b\\x5b\\x6b\\x63\\xeb\\x8f\\x69\\x7f\\x48\\x6f\\xc7\\xd6\\xef\\xd3\\x63\\x47\\xcf\\x70\\xd4\\xa5\\xfb\\xc0\\x05\\x7d\\x97\\xa5\\xa7\\x82\\x04\\xb8\\x43\\xff\\x30\\x9d\\x9b\\x91\\x6f\\x2d\\x57\\x6b\\xbd\\x96\\x2b\\xb7\\x77\\x43\\xe9\\x98\\xed\\x3e\\x02\\xb8\\x77\\x20\\xae\\xed\\xa3\\xe0\\x64\\x54\\xbd\\x11\\x53\\x61\\x99\\xa2\\xf6\\x31\\xcf\\xc0\\x31\\xc5\\x53\\x1b\\x76\\x80\\x86\\xb5\\xed\\x12\\x62\\xdb\\xed\\xad\\xab\\xf2\\x25\\x54\\x1a\\x82\\xf2\\xf5\\xd4\\xfa\\x56\\x9d\\xb2\\x59\\x60\\x28\\xcd\\x81\\x42\\x1c\\x4c\\xcf\\x91\\xef\\x71\\xe4\\x4c\\xc1\\x8f\\x0e\\x81\\x84\\x60\\x19\\x43\\x7c\\xb1\\x45\\x98\\xce\\x5a\\x7b\\xc3\\x2c\\x78\\xfc\\x43\\xc2\\x31\\x88\\xf8\\x8a\\x53\\x25\\x36\\xb2\\x23\\xa5\\x3c\\x84\\xa4\\x33\\xe6\\xc2\\x4c\\x90\\xd0\\xb5\\x82\\x96\\xb9\\x6b\\x2f\\x10\\x01\\x2f\\x54\\x93\\x70\\x4c\\xe6\\x7c\\xd5\\x55\\x6d\\x36\\xca\\x63\\x8d\\x7a\\x00\\x49\\x45\\xdc\\x9c\\x35\\xc3\\x5e\\x77\\x03\\xad\\xab\\x4d\\x5b\\x62\\x90\\xde\\x9e\\x01\\xde\\x11\\xd7\\x21\\x98\\x64\\x7d\\xd5\\xd5\\x73\\x46\\xb2\\x23\\x05\\xdd\\x4b\\x4f\\x95\\x32\\x63\\xca\\xb0\\x4f\\x1b\\x22\\x74\\xad\\x88\\x65\\xd6\\xda\\xbb\\x22\\xc0\\x0b\\xef\\x24\\x1c\\x83\\xa0\\xaf\\xbb\\x4a\\xcf\\x46\\x79\\xa4\\xac\\x87\\x90\\x54\\x9d\\x35\\x63\\xcd\\xb0\\x7f\\xd8\\x40\\xeb\\x5a\\x89\\xcb\\x0c\\xf2\\x6b\\x12\\xc0\\x3b\\xfc\\x44\\x14\\x83\\xbc\\xaf\\xbb\\x1c\\xd0\\x42\\x78\\xa4\\xb8\\x07\\x50\\x54\\xa5\\xcd\\x18\\x33\\xec\\x72\\x85\\x49\\x5d\\x2b\\x6c\\xce\\x1e\\x3e\\x6e\\x71\\x2c\\x4e\\x2e\\xfb\\x0e\\x8a\\xb3\\x3d\\xaf\\xdd\\x75\\xd1\\xbe\\x7a\\x71\\x9f\\x4e\\xd4\\xd1\\x4a\\xd8\\x36\\x40\\x0d\\x91\\x14\\x00\\xe5\\x09\\xb9\\x9d\\x10\\x00\\xd0\\x9b\\x08\\x00\\xc0\\x6d\\x12\\xe3\\xbc\\xeb\\x0d\\xda\\x56\\x79\\x7a\\xaa\\xe9\\x05\\xa2\\xcd\\x2c\\x97\\xef\\xe3\\xa5\\x47\\xe8\\x85\\xc3\\xc9\\xe2\\x75\\x7e\\xdd\\xcc\\x5a\\xeb\\x40\\xb0\\xd8\\x3e\\xac\\xce\\xca\\xc5\\xc1\\xf3\\x85\\x17\\xce\\x5f\\x00\\xd8\\xb3\\xed\\xc3\\x54\\x45\\x5e\\x36\\x98\\x77\\x38\\x4d\\xcf\\xc7\\x24\\x93\\x6e\\x09\\x6c\\xb7\\x82\\xae\\x0c\\xf7\\xc6\\xda\\xe7\\x7a\\xe2\\x24\\x13\\x4f\\x9b\\x7f\\xe3\\xaf\\x4c\\xec\\xd9\\x57\\xdc\\x83\\x4a\\xfb\\xe5\\x10\\x8b\\xf9\\xc7\\x29\\xaf\\x81\\x67\\xbc\\xe5\\x01\\xa8\\xdc\\x4a\\x48\\xeb\\xbb\\x69\\xb7\\xfd\\x38\\x9c\\xc1\\xb7\\x43\\x13\\xbc\\xea\\x28\\x5d\\xc4\\x2b\\xa3\\x91\\x2c\\x3c\\xbd\\x4e\\x56\\xb8\\x0f\\xdc\\x76\\x0d\\xb6\\xf1\\xe6\\x77\\xdf\\x67\\x4f\\x8c\\x48\\xbb\\xab\\x7d\\x87\\xcc\\x0e\\x77\\x49\\x5a\\xe3\\x72\\x8d\\xd2\\xe2\\x80\\x5e\\xe6\\x05\\x8a\\x92\\xfa\\xe1\\xf7\\xa1\\xff\\x6a\\xc3\\x7e\\xaf\\xbd\\x90\\xf1\\xc1\\xcf\\x35\\xd3\\x3f\\xa4\\x6d\\xee\\x6d\\x0b\\xf6\\x0b\\xd5\\xe1\\xc6\\xe6\\x62\\x63\\xed\\x39\\x7c\\xda\\xf5\\xf6\\x1a\\xbb\\xa2\\xc0\\xa8\\x44\\x59\\xc4\\x5e\\x5d\\xeb\\x46\\xb1\\xd2\\x42\\x67\\x63\\x6b\\xdf\\x11\\xd7\\x98\\xc7\\x3c\\x46\\xa9\\x9b\\x17\\x38\\x53\\x2f\\x16\\x61\\xb0\\x6e\\xd0\\xed\\x92\\x7b\\x1c\\xb3\\x11\\xc7\\xb2\\x4d\\xda\\xc8\\xe3\\xe7\\xb7\\x03\\x7f\\xee\\x6f\\xc4\\x5b\\xee\\xb5\\xfb\\x40\\x79\\x17\\x78\\xb9\\x5b\\x45\\x65\\x9e\\xa6\\x0d\\xf7\\x75\\x7e\\x8a\\x0e\\x9b\\xfc\\x54\\x37\\x6a\\x6b\\x99\\xf4\\x76\\x28\\xc6\\x0e\\x63\\x38\\x4e\\x50\\x9a\\xef\\xcf\\xc0\\x75\\x97\\x52\\xd1\\x2e\\x2f\\x8f\\x8e\\x37\\x65\\x17\\x51\\xeb\\x97\\x59\\xf3\\xbf\\x74\\x3c\\x01\\xc9\\x44\\x49\\x6d\\x88\\x22\\xa6\\xa8\\xc6\\x2f\\xfd\\x89\\x1b\\xce\\x5f\\xbc\\xda\\xb8\\xc7\\xca\\x0e\\xcf\\xad\\x60\\x0b\\x8c\\x0b\\x25\\xc9\\x6c\\x22\\xd1\\xea\\xfa\\x36\\x9e\\x7c\\x0b\\x43\\xbe\\x89\\x1b\\xff\\x95\\x68\\x44\\x8c\\x99\\xd6\\x96\\xdc\\x7b\\xae\\xef\\xb6\\xe4\\x81\\xde\\xe5\\x2d\\x73\\xad\\xc7\\x29\\xea\\xc3\\x85\\x7b\\xc0\\xf9\\x25\\x31\\xa4\\x1a\\x7b\\xdd\\x0f\\xa8\\x07\\x1f\\xd0\\x00\\xee\\x99\\x8c\\xd2\\xa4\\x58\\x77\\x4e\\x5c\\xf6\\xc3\\x1a\\x4c\\x73\\xc5\\xab\\xd5\\x4a\\x2f\\x15\\x1d\\x5f\\xf8\\x4a\\xf7\\x70\\x9d\\x51\\xc3\\x67\\x40\\xa6\\xc5\\xbd\\xb3\\x52\\x1c\\xb0\\x7a\\x04\\x04\\xc6\\xe1\\x82\\x69\\x3a\\x11\\x97\\x79\\x71\\xed\\xb0\\x9d\\xf9\\xd0\\x83\\xa4\\xbe\\xaf\\xd2\\x27\\xa3\\xf1\\x0c\\x3a\\x2e\\xc1\\x6f\\xe9\\xd5\\x92\\x0c\\xae\\xa4\\x78\\x3b\\x56\\x8d\\x3d\\x9b\\x2b\\xdd\\xbc\\x6e\\xcc\\xc0\\x90\\x57\\x68\\x94\\xaa\\xfc\\xea\\x71\\x21\\xb5\\xe5\\x86\\x9d\\x19\\x89\\x47\\x4c\\xb4\\x63\\x40\\xfc\\xa2\\xfd\\xb6\\x0f\\xe4\\x70\\x8d\\x66\\x70\\xf2\\x71\\x1b\\x8a\\xaa\\x1e\\x02\\x69\\xf8\\x16\\xae\\x49\\xa1\\x31\\x0b\\xce\\x61\\xc9\\xbd\\xa0\\x84\\xc8\\x43\\x9d\\xaf\\x9b\\xff\\xd2\\x12\\x7c\\xe2\\x1d\\xf9\\x1a\\x03\\x4e\\xf7\\x66\\x88\\x4e\\xa2\\x7d\\x28\\x12\\xaa\\x43\\x62\\xfd\\xeb\\xee\\xa7\\xfc\\x52\\x23\\xaf\\x41\\x5d\\xf6\\x16\\x95\\xee\\x11\\xa3\\xea\\x54\\x62\\xc3\\x0c\\xcd\\x5d\\xad\\x56\\x4d\\x28\\xa7\\x63\\x7a\\xde\\x4c\\x7a\\x98\\x94\\xe7\\xd2\\x55\\xd1\\x94\\x5e\\xfb\\xfe\\xb2\\xf6\\xe6\\x83\\xe4\\x32\\x28\\x68\\xe1\\x77\\xf7\\x4f\\x93\\x07\\x38\\x1c\\xd1\\xbb\\x70\\x37\\x01\\x0e\\xb6\\x39\\x3b\\x99\\x63\\x1d\\x6d\\x06\\xa4\\x56\\x02\\xfc\\x26\\x9c\\x69\\xc3\\xc7\\x45\\x67\\x7d\\xb5\\x0a\\x05\\xd6\\x53\\xce\\xf6\\x8a\\xa2\\x7b\\x75\\x9e\\xa7\\x75\\x52\\x00\\x72\\xeb\\x86\\xe4\\xd2\\x57\\x26\\xed\\x64\\x76\\xb3\\x43\\xc7\\x24\\x7d\\x58\\x1f\\x70\\x7a\\x8b\\xeb\\x24\\x42\\x4e\\x86\\x4f\\x78\\xf2\\x9f\\xf9\\x9f\\x93\\x6f\\xca\\x04\\xa5\\x93\\x0a\\x65\\x95\\x5b\\xe1\\x32\\xd9\\x81\\x8f\\xe3\\xf0\\x1b\\xa9\\xca\\x23\\x4a\\xa5\\x49\\xd3\\x4c\\x9d\\x34\\x75\\xcf\\x4e\\x28\\xd7\\xfd\\x88\\x7f\\x57\\x35\\x2a\\x6b\\x78\\xc6\\x23\\x4e\\xb4\\xba\\x82\\x2e\\xa4\\x90\\xb2\\x14\\xd7\\x35\\x2e\\xc9\\xb3\\x3b\\xcd\\xb0\\x61\\x7c\\xdd\\xe5\\x65\\xec\\x6e\\x4b\\x8c\\xde\\x49\\x25\\x10\\xd6\\x5d\\x89\\x8a\\xb6\\x40\\x7a\\xc2\\x87\\xf6\\xb0\\xcf\\x5d\\xd1\\x3e\\xd3\\xb6\\xa8\\x1d\\x31\\x05\\x19\\xfd\\xd6\\x4a\\xf4\\x5b\\xab\\x0e\\xbf\\xce\\x0b\\xe9\\x2d\\xc0\\x76\\xa4\\x92\\xf1\\x40\\x66\\xb1\\x1c\\x55\\xba\\x40\\x8d\\x3d\\x64\\xab\\x3d\\x4c\\xc3\\x91\\xd9\\x75\\x65\\x46\\xd2\\x12\\xb2\\x78\\xd3\\x1a\\x40\\x58\\x62\\xc3\\x4d\\x32\\xf9\\x29\\x96\\xd0\\x57\\x9f\\x58\\xba\\x19\\x7f\\xe5\\x79\\x33\\x03\\x06\\xbe\\x41\\xf0\\x36\\x51\\x59\\xe6\\x77\\x80\\xf1\\x2b\\x97\\xb1\\xfb\\xf2\\xf2\\x02\\x38\\x9a\\x48\\x0d\\x99\\xb8\\x50\\x49\\x07\\x8e\\xd2\\x94\\x1c\\xf8\\xe6\\xfe\\x0b\\x59\\x20\\x42\\x7c\\x61\\xbe\\x8a\\xbe\\x9e\\xe4\\x48\\x07\\x91\\xc4\\xa8\\x28\\xb4\\x45\\x68\\xa8\\x0d\\xb6\\x4f\\x10\\x6d\\x54\\x97\\xcd\\xaf\\x62\\x7b\\x5c\\x9b\\x84\\x7e\\x4f\\x2f\\xf5\\xeb\\xdf\\xae\\x6f\\x13\\x6c\\x8f\\x7c\\x31\\xf2\\x5f\\x6c\\xe4\\x1b\\xec\\x88\\xa5\\x1b\\x5b\\x92\\x5a\\xa3\\x1b\\xad\\xa0\\xf6\\x20\\x99\\xf2\\xe6\\xf8\\x6c\\xa6\\xb7\\x3d\\x9f\\xb7\\xb8\\x11\\xb6\\x73\\x80\\xcd\\x51\\x01\\x41\\x0d\\x0e\\x36\\x19\\xad\\x31\\x39\\x55\\x03\\x34\\x07\\x1a\\x8e\\x38\\x61\\x13\\x34\\x08\\x77\\xf2\\x8a\\x36\\x8d\\x8a\\xd4\\xad\\xe6\\xfa\\x36\\x8b\\xbc\\x20\\xeb\\x61\\x53\\xe2\\x46\\x9b\\x7e\\x2e\\x94\\x55\\xa3\\xe0\\x8e\\x96\\x0b\\x31\\x97\\xc2\\x23\\xd8\\x63\\xc2\\xe0\\xec\\x5f\\x34\\x0c\\x7e\\xa8\\x25\\x52\\x14\\x45\\x57\\x2c\\x91\\xcc\\x73\\x35\\x5f\\x99\\x86\\x85\\xd0\\x5c\\x0d\\x40\\xd2\\x82\\x3a\\x33\\x4b\\x12\\xa4\\x45\\x1b\\xa7\\x2b\\x4c\\x0e\\xa5\\x71\\x59\\x1c\\xec\\x32\\x9c\\x85\\x62\\xf1\\x4a\\x57\\x09\\x4e\\xa2\\xaf\\x3c\\xd9\\x16\\xe1\\x6c\\xf1\\x21\\x3d\\xae\\xdf\\x3d\\x00\\x26\\x1f\\x6e\\x37\\xbc\\x48\\xbb\\x6c\\xfe\\x59\\x16\\x44\\xdb\\xe6\\x9f\\x22\\xe2\\xd6\\xf7\\x3a\\xdd\\xf8\\xec\\x96\\xd3\\x5d\\xde\\x8d\\x30\\xd3\\x62\\xbc\\xf5\\x88\\x83\\x98\\x28\\x7f\\xaf\\xd1\\xae\\x06\\x87\\xb7\\x3c\\x61\\x7d\\x5c\\x38\\x97\\x9b\\x54\\x4e\\x8e\\x07\\x3a\\x93\\x8c\\x29\\xd6\\xa7\\xf5\\x17\\x5f\\xc8\\x7e\\x4b\\x56\\x52\\x9d\\x17\\x1d\\x61\\x76\\x37\\x2a\\x79\\x3c\\x1f\\x74\\xf6\\x04\\xa4\\x47\\xc8\\x2e\\x17\\x20\\x94\\x4a\\x46\\x38\\x7f\\xa5\\x78\\xc9\\xee\\x34\\xb1\\xc6\\x08\\xe3\\xbf\\xd3\\xe7\\x46\\x33\\xa2\\x4d\\xdb\\x39\\xe7\\x0b\\x80\\x1f\\xe1\\x7d\\x70\\x53\\x73\\xc4\\xb8\\x79\\xcf\\xa5\\xf8\\x4d\\x3b\\x29\\x0d\\x0b\\xa1\\xd7\\x52\\xa4\\x16\\xfa\\x2d\\x96\\x1b\\x7a\\x4e\\x82\\xae\\x95\\x11\\xb9\\xe7\\xb4\\xa7\\x74\\xe0\\xc1\\x5d\\x96\\x98\\x11\\x3a\\x0d\\xb7\\x44\\xc9\\x8a\\x7d\\x1e\\xa3\\x6a\\x6e\\xc3\\x60\\xb0\\x13\\x04\\x21\\x01\\x14\\x49\\x18\\x78\\x61\\xdd\\x66\\x89\\x80\\xe1\\xda\\xb6\\xb2\\x44\\x37\\x06\\x08\\xae\\x48\\x55\\x36\\x7b\\x72\\x6d\\x80\\xb6\\x95\\x76\\xc4\\xc9\\x93\\xd0\\x71\\xa1\\xd8\\xd8\\x6d\\x81\\x0f\\xd6\\x69\\x76\\x0a\\xbd\\x9b\\x1f\\x1b\\x7b\\xdc\\xcb\\x0b\\xe9\\x71\\x84\\xca\\xfc\\x54\\x41\\x8f\\x23\\x77\\x30\\xb6\\xd4\\x31\\xe5\\x1c\\xc9\\xb7\\x22\\x2d\\x19\\x2e\\x57\\x7e\\xeb\\x25\\xf6\\x7b\\x98\\x49\\x20\\x07\\xd2\\xd3\\xfc\\x41\\x25\\xf6\\x2a\\xa2\\x43\\xe6\\x0e\\x72\\x52\\x1a\\x44\\xe9\\x81\\xc3\\xfc\\xbd\\x65\\x0f\\x2d\\x82\\xb0\\xe4\\xb8\\x3f\\x4b\\x73\\x1b\\xfe\\xee\\x26\\x4a\\x53\\xfa\\xe8\\x66\\x3b\\x2d\\x71\\xa7\\xf1\\xab\\xc9\\x4b\\x2d\\xb3\\xdc\\x14\\x9f\\x61\\xc1\\x0c\\x4b\\xcc\\x2f\\x6c\\x0f\\x4d\\xca\\xb9\\xf9\\x85\\xf1\\xb9\\x49\\x0b\\x3d\\x61\\x46\\xb3\\x43\\x11\\x76\\x6f\\x93\\x2a\\xd9\\x26\\x69\\xb3\\x56\\x17\\x5e\\x25\\x33\\x80\\x78\\xed\\x02\\x97\\x55\\x81\\xe9\\x25\\x46\\x01\\x9e\\x36\\x93\\x50\\xb5\\x04\\x96\\x3e\\xbb\\xf9\\xc8\\x63\\x77\\xa6\\x83\\x28\\x19\\xbe\\xaf\\xcf\\x6c\\x16\\x6c\\xc9\\xdc\\x4f\\xe3\\x97\\x8d\\x55\\x4e\\x4c\\x79\\x78\\x11\\x6e\\x67\\x86\\xde\\xa8\\x0e\\x62\\x14\\x25\\xbe\\x1d\\xc6\\x8b\\xdb\\xc7\\x8c\\x3b\\x8c\\x1b\\x8b\\x50\\xfa\\x18\\x65\\xb3\\xb3\\x41\\xec\\xfa\\x36\\x56\\x29\\xf0\\xa2\\xf3\\x69\\x62\\x31\\x23\\x17\\xbe\\xaa\\xa5\\x44\\x78\\xca\\xed\\xfa\\x30\\xc5\\x33\\xcf\\xa1\\x8e\\x20\\x6c\\x5a\\x3f\\x09\\x8f\\xe6\\x82\\xe4\\xce\\x6c\\xda\\x0a\\xc1\\x3b\\x75\\xbb\\x66\\x02\\x06\\x35\\x68\\x1a\\x30\\x75\\x96\\x4e\\x82\\x6d\\xad\\x88\\x83\\x04\\x64\\xb7\\x09\\x05\\x65\\x9e\\x8e\\xfd\\xf8\\x3f\\x17\\x9f\\xef\\xeb\\x7f\\xad\\x4f\\xff\\x10\\xac\\x3e\\x1e\\xb8\\x78\\xa5\\x4f\\xc1\\xc5\\xa9\\xeb\\xa0\\xcf\\x1a\\x6a\\xaf\\xa8\\x7c\\x06\\xbf\\x1e\\x42\\xb4\\x21\\x67\\xa2\\x1d\\x5f\\x2a\\xf0\\x7d\\x3f\\x78\\xe5\\x34\\x22\\x1c\\xf6\\xb4\\xc7\\x63\\x29\\x32\\x46\\x3b\\x7a\\x84\\xfe\\x84\\x64\\x34\\xea\\xbc\\x98\\xd0\\x34\\x43\\xf3\\x6b\\x57\\xe6\\xc7\\x97\\x72\\x4b\\xaf\\x26\\x75\\xfe\\x52\\x6b\\xeb\\xd5\\x80\\xf7\\x3d\\xea\\xdc\\xa1\\x6e\\x75\\x30\\xeb\\x4c\\x3d\\x45\\x99\\xef\\x93\\x78\\xfd\\xc7\\xbf\\xfe\\xd0\\xd0\\xfd\\x0b\\x77\\x09\\xde\\x9f\\x93\\xa8\\xcc\\xab\\x7c\\x57\\x7b\\x6d\\x1b\\x64\\x19\\xff\\x5d\\xa3\\xe7\\xaa\\x2e\\x7f\\xff\\xd5\\x97\\x37\\x3e\\xfd\\xbf\\xaf\\x26\\x38\\x8b\\x85\\x72\\xbf\\x2d\\xff\\x4f\\xac\\xea\\x5f\\x1e\\x0a\\xfc\\xfb\\x40\\xea\\x46\\x89\\x0b\\x8c\\xea\\x35\\xfd\\x1f\\xf7\\x1e\\xb0\\x04\\x3a\\x02\\x78\\x4e\\xab\\x7d\\xf4\\xd8\\x2c\\xf3\\x5e\\x55\\xd2\\xee\\xfb\\xaa\\x8c\\x1e\\x61\\x1c\\x23\\x29\\x3e\\xc2\\x38\\xa8\\x25\\xa8\\xf6\\x31\\xbf\\xde\\x38\\xac\\xac\\x3f\\xde\\x38\\x7c\\x83\\x71\\xdc\\x3c\\x89\\x71\\xb4\\x7b\\x4c\\xd4\\xf2\\x61\\xef\\xf7\\x9b\\xbf\\x5c\\xb4\\x9f\\xa3\\xc5\\x6f\\x18\\x6a\\x2b\\x8e\\xb7\\x4f\\x1f\\x8a\\x43\\x12\\xe5\\x99\\x1b\\x1d\\xf0\\x6d\\x99\\x67\\xae\\x12\\x17\\x2c\\x98\\xea\\xf4\\xa7\\x45\\x25\\x58\\x4a\\xd0\\x93\\x81\\x96\\xd8\\xd7\\xac\\x60\\x78\\xda\\x70\\xde\\xce\\xba\\x93\\x8c\\xe6\\x7a\\x48\\xd6\\x41\\xcf\\xec\\x3c\\xa6\\x63\\x1d\\x43\\x86\\xf5\\xe2\\xe0\\x16\\xfa\\x05\\xc2\\xbf\\x1a\\x74\\x6d\\xf0\\xc5\\x9a\\xa1\\x91\\x81\\xa2\\xe4\\x1f\\x76\\xba\\xef\\xaf\\xe4\\xb7\\x98\\x48\\xa5\\x49\\x52\\x79\\x5d\\x60\\xa3\\xb9\\xde\\xe2\\x5d\\x5e\\xe2\\x36\\xdb\\xf2\\xd5\\xdf\\x43\\x7f\\xba\\xfa\\xca\\xca\\x24\\x58\\x07\\x7d\\x25\\xcd\\x0d\\xe2\\x24\\x42\\x75\\x5e\\x56\\x80\\xfa\\x79\\x62\\xc4\\x17\\xd7\\xee\\x6d\\x0a\\x79\\xbe\\xe1\\x1f\\x86\\x5f\\x6c\\xe0\\x97\\x75\\xd8\\xb7\\x2f\\xf9\\xe5\\x12\\x36\\x0d\\x20\\x47\\x53\\xc4\\x77\\x7a\\x00\\x96\\x9c\\x34\\x39\\x83\\x06\\xd7\\xe5\\x97\\xba\\x6d\\x87\\x5d\\x42\\x2f\\xe0\\x7b\\x00\\x1a\\x46\\xb3\\x9a\\x7c\\x14\\x6f\\x66\\x25\\xa6\\x8d\\x5a\\x42\\x22\\xfd\\xef\\x2b\\xfb\\xd4\\x43\\x4f\\xbd\\x0a\\xc9\\x10\\x96\\xf7\\x53\\x4c\\x47\\xe8\\x0e\\x9f\\x97\\x32\\xf6\\x43\\x81\\xfd\\x50\\xcc\\x47\\x1a\\x0e\\x1f\\x74\\x8a\\xe6\\x17\\xcc\\x69\\x1a\\xe3\\x57\\xcd\\xbd\\xd8\\x88\\xfb\\x1e\\xd9\\x6d\\x73\\x82\\xee\\xda\\x6d\\xa8\\x64\\xd0\\x8a\\x9b\\x27\\xa5\\x0d\\x93\\x8f\\x9e\\xc8\\xe9\\x4c\\x93\\x5d\\x0f\\x67\\x35\\x3b\\xcf\\x57\\xc4\\x55\\x54\\x62\\x9c\\xd1\\x45\\xb1\\xbe\\x2b\\xe1\\xd3\\x72\\x97\\x7c\\x3b\\x42\\xa7\\xc5\\xa9\\xaf\\x66\\x78\\xda\\x41\\x4f\\x26\\xc7\\xd3\\x27\\xf4\\x8d\\xef\\xcf\\x25\\xda\\x1d\\x21\\x33\\xbd\\x92\\x39\\x35\\x96\\xca\\x0c\\x05\\x1f\\xc0\\x0c\\x68\\x6a\\x1a\\x06\\x67\\xf1\\x68\\xdd\\xa5\\xdb\\x38\\xe3\\xf2\\x97\\xc1\\xde\\x76\\x65\\x34\\x77\\x35\\xe9\\x41\\xa2\\x5e\\x8e\\x62\\xd5\\x79\\x9e\\x6e\\x51\\x29\\x56\\xe4\\x45\\x1c\\x2d\\x4a\\x31\\x2a\\x77\\xc9\\x3d\\xc7\\x69\\xff\\x6e\\x11\\xf2\\xac\\x46\\x49\\x86\\x4b\\x77\\x97\\x9e\\x92\\xb8\\xc5\\x53\\x8a\\x35\\x74\\x0d\\xb1\\x45\\x89\\x53\\xf7\\x90\\x97\\xc9\\x6f\\x0d\\x20\\x75\\xe2\\x96\\xa4\\x56\\xce\\x2b\\x90\\xac\\x8f\\x00\\xa2\\x05\\x92\\x4c\\x6c\\x28\\x9c\\x8c\\xb8\\xdf\\x88\\xd7\\x93\\xca\\x64\\x44\\xba\\x95\\x4b\\x46\\x64\\x65\\x1c\\x31\\x43\\xb7\\x1c\\xde\\xfc\\x14\\x8a\\xb7\\xa8\\x6c\\x37\\xd2\\x0b\\x28\\x52\\xb1\\x82\\x2e\\xb7\\x27\\x17\\xca\\xa8\\x32\\x4e\\x0b\\x2c\\xd0\\xbe\\xab\\x4f\\xff\\xe8\\x40\\x7c\\x27\\x7f\\x07\\x6f\\x4b\\x38\\x52\\x9b\\x1e\\xa5\\x3f\\x59\\xb8\\x94\\x9e\\xbe\\x13\\x33\\xa4\\x23\\xac\\x55\\xb1\\x43\\xcd\\xe6\\x7a\\x4c\\xcc\\x68\\x20\\x03\\x94\\x0f\\xe9\\x19\\x52\\xa9\\xa0\\x46\\x83\\xba\\x40\\xc5\\xc8\\x9a\\x90\\x64\\xaf\\x0b\\x5a\\x10\\x2e\\xfb\\x58\\xd4\\x08\\x62\\xbd\\xcd\\xeb\\xc3\\xc5\\xa3\\x81\\x84\\xed\\x7b\\x93\\x3f\\x64\\x49\\x4e\\x48\\xd8\\x9b\\xea\\xb6\\xcb\\xb5\\x8b\\xf8\\x28\\xa2\\xb0\\x43\\xfd\\x77\\xc9\\xb1\\xc8\\xcb\\x1a\\x65\\xf5\\x45\\x78\\x05\\x91\\x22\\x34\\x3f\\x45\\xf8\\x21\\x89\\x3b\\x6d\\x37\\x71\\x48\\x04\\x56\\x87\\xfc\\x4e\\xe6\\x4a\\x84\\x26\\x19\\x49\\x64\\xa6\\xf8\\xac\\x25\\x34\\x2f\\x1e\\x09\\x6f\\x84\\x78\\xe3\\xfc\\xd7\\xfe\\x1b\\xdf\\x41\\x1b\\x7d\\x36\\xa1\\x7d\\xa3\\x1e\\x32\\xf7\\xf0\\x09\\xdb\\x31\\xce\\x8c\\x8c\\xa3\\xdd\\x2e\\xb9\\x57\\xb6\\xa5\\x5e\\xfe\\xe0\\x1e\\x2b\\xf7\\x36\\xc1\\x77\\x0d\\x1a\\x8b\\x5d\\x31\\xbe\\x4d\\x22\\x4c\\x83\\xec\\xc5\\x63\\xfd\\x71\\xd3\\xfd\\xa4\\xfd\\x7d\\x8c\\xbb\\xdf\\xd5\\xb1\\xfb\\x7d\\x5f\\x19\\x5b\\xef\\xc8\\x50\\xc5\\x4e\\xc4\\x12\\x3a\\x8b\\x03\\x8a\\x54\\xdc\\x63\\x0c\\x94\\xa8\\xb5\\xdb\\x22\\x15\\xb7\\x3a\\x02\\x25\\x6a\\xed\\xb6\\x48\\xc5\\xbd\\xaf\\x80\\x12\\xb5\\x76\\x5b\\xa4\\x98\\xaf\\x22\\x0e\\xbe\\x4d\\xb1\\xdd\\x5d\\xb1\\x5c\\x2c\\xc9\\x5c\\x06\\x90\\xa4\\x6a\\x63\\xc4\\xfd\\x40\\x88\\x04\\x20\\x22\\x96\\x46\\x2c\\xb7\\xcc\\xef\\x44\\xcc\\x58\\xc0\\x9c\\xd4\\x07\\x73\\xbd\\x08\\xa7\\xa9\\x50\\x71\\x48\\x47\\xa0\\x81\\x3c\\x96\\x04\\x95\\xa9\\x32\\xeb\\xbf\\x8e\\x88\\xc2\\x8e\\x58\\x08\\x11\\x54\\x66\\x9b\\x6c\\x0e\\xda\\x36\\xb3\\x5a\\x05\\x52\\x33\\xd5\\x71\\xa0\\xde\\x04\\x44\\x8b\\xde\\x54\\x2c\\xb3\\xde\\xaa\\xa3\\xa8\\x37\\xad\\x9e\\x49\\x6f\\xa3\\xbb\\x37\\x54\\x9b\\xe3\\x09\\x0f\\xd6\\xf1\\xb5\\xa4\\xaf\\xd5\\x3c\\xdd\\x42\\xac\\x36\\x13\\x04\\xcd\\xf2\\x51\\x68\\xe7\\x18\\x0f\\x54\\xbd\\x80\\x68\\x51\\xbd\\x8a\\x65\\x56\\xfd\\x31\\x16\\x55\\xaf\\xd5\\xeb\\x55\\xfd\\xe0\\xfe\\x8d\\xd6\\xfd\\x70\\xca\\xe3\\x95\\x3f\\x96\\xf6\\xb5\\xda\\x0f\\xc8\\x3e\\x5c\\x81\\x62\\xba\\x1f\\xa8\\x67\\x01\\xd1\\xa2\\x67\\x15\\xcb\\xac\\xe7\\x74\\x2f\\xea\\x59\\xab\\xd7\\xab\\x67\\xa0\\x27\\xa3\\x35\\x0a\\xd1\\x18\\xaf\\x3b\\x33\\x95\\x91\\x5a\\xd2\\xdc\\x3d\\x9d\\x03\\x59\\x26\\x22\\x63\\xbd\\x08\\x23\\x28\\x38\\xd4\\x5e\\x82\\x3d\\x96\\xc9\\x28\\x0a\\xe3\\xb4\\x97\\x62\\x2b\\x2f\\x56\\x57\\xd0\\xbd\\x5a\\xb7\\x15\\x69\\x51\\x26\\x59\\x6d\\x9f\\x7f\\x38\\x14\\xc7\\x50\\xc5\\x6e\\xdc\\x32\\xae\\xc5\\xbe\\x01\\x44\\xb3\\x89\\x13\\x64\\xd1\\xca\\xa1\\xda\\xaa\\xa1\\xcb\\xc8\\x43\\x26\\x5e\\x60\\xc7\\xfb\\xc6\\x82\\x82\\xad\\x58\\xfd\\x88\\x76\\x7a\\xc7\\x0b\\x88\\x7f\\x7d\\xbf\\xae\\x18\\x59\\x9c\\x10\\xb3\\x37\\xab\\x2d\\x5d\\xfe\\x10\\x1d\\x50\\x59\\xe1\\xda\\xf9\\xe2\\xa7\\xbf\\x7c\\xef\\xde\\x7c\\xb1\\x79\\xf3\\xf5\\xef\\xbe\\xc9\\x92\\x23\\xaa\\xb1\\x17\\x55\\x95\\xe3\\x3a\\x87\\xba\\x2e\\xd6\\x6f\\xde\\xc4\\x28\\xc3\\x31\\xce\\xbc\\x23\\x7e\\x83\\x28\\xfc\\xdf\\xfe\\x3d\\x89\\x70\\x56\\xe1\\xd8\\x39\\x65\\x31\\x2e\\x9d\\xfa\\x80\\x9d\\x3f\\xff\\xf0\\x17\\x27\\xa5\\xc5\\x5d\\xd5\\xbc\\xc0\\x59\\x95\\x9f\\xca\\x08\\x7b\\x79\\xb9\\x7f\\xc3\\xe0\\xd5\\x9b\\x3f\\xff\\xf0\\x97\\x7f\\xfb\\x2e\\x2f\\x1e\\xe8\\x97\\xac\\x97\\xd1\\x2b\\x27\\xf4\\x83\\xb9\\xf3\\x47\\x94\\x25\\x38\\x75\\xfe\\x14\\xe3\\xec\\xeb\\x37\\x1e\\x6b\\x2c\\xee\\x8e\\xed\\x92\\x82\\x24\\xcf\\xdc\\xf8\\xc4\\xbe\\xd3\\x04\\xd5\\x06\\x2e\\xd5\\xeb\\xec\\x92\\x34\\x75\\x8f\\x79\\x8c\\xc9\\x7a\\x75\\x63\\x02\\x5c\\xda\\x76\\xdd\\x1d\\xaa\\x6a\\x5b\\xe3\\xde\\x1c\\x6c\\xbd\\x29\\x7e\\x82\\xe6\\xbd\\x24\\xdb\\x25\\x59\\x52\\x63\\x80\\x85\\xa4\\xc6\\xb4\\x31\\x37\\xca\\x4f\\x59\\xbd\\xe6\\xa8\\x9b\\x7e\\x14\\xa1\\x81\\x43\\x92\\xed\\x21\\xea\\x6d\\x4f\\x42\\xb0\\x7f\\x61\\x25\\xd0\\xd8\\xe6\\xa7\\x2c\\xc2\\x3f\\x64\\x13\\xb5\\xe8\\xc7\\x93\\x5d\\x76\\x4b\\x83\\xf0\\x96\\x73\\x91\\xfc\\x2e\\x4d\\x8a\\x1f\\x4f\\xf5\\x5f\\x27\\x5a\\xd1\\xdf\\xae\\xa6\\xfe\\x07\\x5e\\xf1\\x1d\\x7e\\x20\\x37\\x2a\\x54\\x0e\\x65\\xf9\\xbc\\x2b\\xf3\\xe3\\x24\\xf4\\x5f\\x4c\\xe6\\xd3\\x17\\x93\\x1b\\xff\\xc5\\xa4\\xce\\x81\\x56\\xea\\xe4\\x98\\x64\\x7b\\x77\\x77\\xca\\x22\\x42\\x34\\x3a\\x6d\\x93\\xc8\\xdd\\xe2\\xdf\\x12\\x5c\\xbe\\xf4\\xbd\\x30\\x98\\x4f\\x7c\\x6f\\x11\\xf8\\x13\\xdf\\x9b\\xce\\xe7\\x93\\xc0\\xf3\\x7d\\xff\\xd5\\xe6\\xb1\\xf5\\x1f\\xbf\\x57\\x67\\xe6\\xbf\\x98\\xcc\\xa6\\x2f\\xc6\\xf7\\x68\\x39\\x6f\\x38\\xf2\\xe7\\x0d\\x47\\x37\\xf4\\xf7\\x62\\x4c\\x8f\\x0c\\xf5\\xfb\\x7a\\xe4\\x4e\\xfd\\xe2\\xde\\xd6\\x2b\\x8e\\x70\\x59\\xfa\\x9f\\x51\\xaf\\x82\\x79\\x4f\\xaf\\x18\\xc2\\x65\\x25\\xf4\\xca\\x88\\x3c\\xeb\\x21\\x46\\xe1\\x97\\xcb\\x1f\\x9e\\x8d\\xfd\\xd3\\x36\\x8b\\x67\\x63\\x7f\\x3a\\x63\\x67\\x21\\x08\\x10\\x53\\x86\\x8e\\x4d\\x9c\\x6d\\xa0\\x1b\\xb8\\x54\\xdf\\xae\\x9b\\x97\\xc9\\x3e\\xe1\\x1f\\x4a\\x1d\\xfa\\xbd\\x6b\\x63\\x07\\x43\\x31\\x66\\x97\\xa2\\xea\\x40\\x47\\xdd\\x9c\\x8e\\x36\\xbe\\x79\\x24\\xb8\\x84\\xf3\\x17\\x93\\xe5\\xfc\\xc5\\xb9\\xbb\\x00\\x40\\x1c\\xb0\\x23\\x6b\\x7a\\x14\\xdf\\xd0\\x79\\x02\\x54\\xfb\\x4e\\x0a\\x21\\xa6\\x8b\\x53\\x5a\\x51\\x57\\x01\\x68\\xa7\\x8a\\x50\\x4a\\xf6\\xd0\\x4e\\x82\\x49\\x20\\xaa\\x45\\x06\\x5c\\xe6\\xa0\\x6e\\x5b\\x24\\xcf\\x27\\xe3\\x9e\\xfe\\x17\\x48\\x46\\xc6\\xb8\\x08\\x8e\\x6a\\x3c\\x33\\xa2\\x60\\xff\\x09\\x7b\\xe7\\xd1\\x3e\\x19\\x94\\x4f\\x80\\xaa\\xf2\\x49\\x21\\xa4\\xfc\\xf2\\xb4\\xdd\\xe2\\xf2\\x5b\\x94\\xc5\\x8f\\x95\\xd1\\xb4\\x47\\x46\\x61\\xe3\\x51\\x96\\x73\\x03\\x0d\\x01\\xdc\\xf8\\x75\\x0b\\x25\\x8a\\xd5\\xe0\\x83\\x94\\x44\\x70\\xaf\\xde\\x48\\x64\\xba\\x31\\xf2\\xd4\\x81\\x2f\\x8b\\xb9\\x8d\\x92\\xb7\\xe2\\xea\\x85\\x08\\x09\\xd0\\xcb\\xd2\\x4a\\x87\\x60\\x11\\x74\\xa3\\x15\\x51\\xe8\\xd3\\x8d\\x8f\\x67\\x03\\xf8\\x57\\x34\\x00\\x4f\\x50\\xbb\\xc1\\x8f\\x74\\x18\\xaa\\x33\\xe9\\x20\\x90\\x47\\xa9\\x0e\\xe8\\x1d\\x9b\\x79\\x82\\x3c\\x8e\\x9d\\xe5\\x05\\xfe\\x8b\\xc9\\xb4\\x99\\xc2\\xfa\\x2f\\x26\\x4b\\xff\\xc5\\xa4\\x7f\\x16\\x41\\xb6\\xc0\\xf4\\x9c\\xc1\\x60\\x08\\x97\\x66\\x72\\xdc\\xcc\\x23\\x17\\x3e\\x99\\x20\\xf7\\x50\\xee\\x23\\xdc\\xd1\\x15\\x87\\xd8\\xb3\\x44\\xe8\\x8c\\x8d\\xca\\xc1\\x60\\x6e\\x04\\xa8\\x5a\\x1a\\x29\\x04\\x8d\\xec\\x2e\\xc9\\xf6\\xe7\\x10\\x64\\xaf\\xcc\\xeb\\x4e\\x5c\\xc1\\x24\\x98\\xc7\\x78\\x2f\\xb2\\x07\\xc2\\x0d\\x3e\\x47\\xc1\\x75\\x03\\xdf\\x4e\\x8c\\x21\\x5c\\x16\\x43\\xa8\\xf5\\x30\\x46\\xf9\\x82\\x55\\xa0\\x36\\xdb\\x43\\x8a\\xc2\\x61\\x9f\\xa1\\xa0\\xf6\\x74\\x90\\x76\\x4f\\xb2\\xee\\x67\\x55\\x7c\\x54\\x55\\x78\\x54\\x01\\xc6\\x35\\x4d\\x9d\\x17\\x0e\\xdf\\x00\\x6a\\x81\\x99\\x86\\x65\\x43\\x5c\\x1b\\x96\\x4d\\x21\\x34\\x2c\\x6b\\x14\\xa3\\xc7\\x4e\\x23\\x1a\\xef\\x06\\x5b\\x53\\x17\\x4e\\x27\\xe4\\xff\\x5f\\xa9\\xa2\\x9d\\x2a\\x02\\x1b\\x56\\xe1\\xd2\\xef\\x4b\\x85\\x19\\xc1\\x84\\xfd\\x47\\xa5\\x65\\x6a\\xbb\\xaf\\xca\\xc5\\xee\\x6b\\x07\\x90\\x31\\x76\\xbb\\xb7\\xce\\xd3\\xcd\\x22\\x9f\\x15\\xff\\xaf\\xa4\\x78\\x8f\\xa8\\xdb\\xe0\\x31\\x1a\\x98\\xea\\x30\\x9a\\x32\\xc8\\x5f\\xdc\\xe5\\xdb\\x6d\\x6a\\x5c\\x9d\\xd3\\x5b\\x60\\xa4\\x3f\\x2f\\x01\\x38\\x7d\\x96\\xa6\\x32\\xe1\\x9c\\x9e\\xaf\\xed\\x73\\xcc\\xc3\\x2b\\x19\\x96\\x36\\x22\\x81\\xd0\\x07\\xeb\\xab\\x1a\\x1a\\x5a\\xe5\\x32\\xeb\\xef\\x67\\x60\\x60\\xd9\\xd6\\xa6\\xbd\\x92\\x21\\x56\\xca\\xf3\\x39\\xb0\\x7e\\x68\\x69\\xd3\\x56\\xc5\\xb0\\x1c\\x92\\x58\\x36\\x70\\x1c\\xd8\\xba\\x69\\xab\\x03\\x1b\\x3f\\x64\\x6c\\xa2\\x87\\x7b\\x36\\xd5\\x67\\x53\\xfd\\x94\\x4d\\xd5\\x63\\x06\\x6a\\xf0\\xca\\x14\\xaa\\xfa\\x65\\x5a\\x0a\\x79\\xe6\\x5f\\x71\\x9a\\xe6\\x74\\xcd\\x1a\\x04\\x5e\\xf0\\x02\\x5e\\xb9\\x42\\x9c\\x84\\xa1\\x17\\x82\\x01\\xed\\x1d\\xbe\\xfb\\xeb\\x4b\\x37\\x08\\x3d\\x62\\xa8\\xcd\\x9f\\x7f\\xeb\\xfe\\xdc\\x0c\\x45\\xbc\\x4c\\xa7\\xde\\xd4\\x4c\\x7f\\xe1\\x85\\x42\\x2d\\xfe\\x97\\x46\\x1d\\x46\\xbb\\xcc\\x66\\xde\\xcc\\xc2\\xfb\\xd4\\x0b\\xc4\\x6a\\xdd\\xdf\\x3a\\xf7\\x46\\xd4\\xcb\\x7c\\xee\\xc1\\x29\\x20\\x52\\x31\\xf0\\xe6\\x0b\\xb1\\x62\\xf7\\xb7\\xd6\\x86\\x19\\xf5\\xb2\\x58\\x78\\x0b\\x4b\\x3f\\x7c\\x6f\\x79\\x23\\xb3\\x27\\x94\\xe8\\x7d\\xb1\\xa2\\x5f\\x96\\x4b\\x6f\\x69\\x6e\\xcb\\xf7\\xa6\\x2b\\x5f\\x62\\x53\\x2c\\xd1\\xda\\xb2\\xa3\\x5f\\x6e\\x6e\\xbc\\x1b\\x6b\\xbf\\x82\\xd5\\x7c\\xaa\\xb2\\x2a\\x94\\x41\\x7d\\xeb\\xa9\\x22\\x05\\x81\\xe7\\x51\\xf1\\x3c\\x2a\\x9e\\x47\\x05\\x4d\\x3b\\xd0\\xb1\\x60\\x08\\x37\\x04\\xa8\\x46\\x1b\\x5a\\xd8\\xf3\\xf1\\xd5\\xf4\\xd5\\xd5\\xbc\\xa5\\xe7\\x87\\xac\\xdb\\xe7\\x20\\xac\\xa9\\x3e\\xa1\\xbd\\x0e\\x17\\x5f\\xf8\\x78\\x0b\\x7c\\x50\\x6f\\x97\\xab\\xd3\\x09\\xf9\\x7f\\x70\\x29\\xcb\\x61\\x17\\xfb\\x1a\\x59\\x5c\\xfb\\xf5\\x2c\\x0d\\x7b\\xbe\\xb3\\xb4\\x8b\\x67\\xdb\\xc2\\x9a\\xcc\\xc3\\xda\\x4f\\xd5\\x96\\xbe\\x05\\x9e\\x3f\\x9d\\xb4\\xff\\x65\\xf8\\xba\\x21\\x62\\x18\\xd2\\x6d\\x1d\\x07\\xcb\\x09\\xfb\\x0f\\xcc\\x60\\x07\\xbe\\x88\\x5f\\xd3\\x6d\\x2c\\x8e\\x48\\x78\\x3c\\x9b\\xde\\xb3\\xe9\\x7d\\x48\\xd3\\x6b\\x37\\x61\\xda\\x37\\xbc\\xfc\\x90\\xc1\\x5b\\x5e\\x7e\\xc8\\x6c\\xfe\\xf3\\x8f\\xf9\\x1d\\x33\\xe4\\xc6\\x80\\x97\\x73\\x92\\x0d\\xfb\\x8c\\x8c\\x58\\x5c\\x4f\\x91\\x5d\\x54\\x7e\\xff\\x46\\x2b\\x86\\xd2\\x6b\\x44\\x72\\xc5\\xb0\\x67\\xaf\\x13\\x83\\x0f\\x58\\x2b\\xfa\\x13\\xf6\\xcd\\xcd\\xb6\\x71\\xca\\x1f\\xbe\\x71\\xaa\\x87\\x31\\xc6\\xd7\\x55\\xa9\\x8f\\x67\\x33\\x79\\x36\\x13\\x63\\xda\\x41\\x32\\x8e\\x1e\\xdf\\xd4\\xe0\\x98\\xfc\\x53\\x03\\xb3\\xf9\\xa8\\x7f\\x27\\x87\\xc2\\xff\\x39\\x8c\\xaf\\xb5\\x2b\\xcb\\x07\\x79\\x01\\x65\\x94\\xf1\\x51\\xd3\\x32\\x13\\x6e\\xe1\\x43\\xf2\\x59\\x23\\xb6\\x0d\\xf4\\x1b\\x5f\\x0f\\x63\\x2d\\x5f\\x8f\\xf2\\x51\\xcf\\x66\\xf2\\x6c\\x26\\x46\\x1f\\x45\\x8c\\xa3\\xc7\\x47\\x35\\x38\\x26\\x1f\\xd5\\xc0\\x6c\\x3e\\xea\\xbf\\xd1\\xab\\x2d\\x3e\\x61\\xeb\\x23\\x9f\\x2f\\x86\\xda\\x5f\\xbf\\xf9\\x5d\\x6b\\x7d\\x6e\\x9f\\xf9\\xb9\\x63\\xec\\x6f\\xf8\\x1e\\xa4\\x01\\x3b\\xa5\\xfa\\x18\\x7b\\x1a\\x37\\xf5\\x6c\\x29\\xcf\\x96\\x62\\xf3\\x54\\xd4\\x3e\\x7a\\x5c\\x15\\x41\\x32\\xf9\\x2a\\x02\\xb4\\x39\\xab\\x9f\\x8a\\x7f\\x1e\\xfb\\xf3\\x27\\xfd\\x93\\xf9\\x6b\\xe7\\xf2\\x6e\\xd8\\x37\\xff\\x0e\\xfd\\xe1\\xb3\\xf9\\xbe\\xc9\\xfc\\x98\\xb9\\xbc\\xdb\\x77\\xf0\\xc6\\x36\\x9b\\x97\\x51\\x07\\xdc\\x02\\x0e\\x78\\xb1\\x67\\x13\\x7a\\x36\\xa1\\x51\\x17\\xc9\\x0b\\x86\\xd3\\xe3\\xdb\\x7e\\x2a\\x4c\\x8e\\xed\\xa7\\xc2\\xec\\xd5\\x7e\\x3c\\xd5\\x86\\x9d\\xa8\\xe3\\x32\\x8b\\x73\\xff\\xc5\\x64\\x3e\\x1f\\x9a\\x5d\\x1c\\x9e\\xf5\\x14\\xb2\\x81\\x8f\\x4f\\xc6\\xea\\x23\\xf2\\x5f\\xab\\xfb\\xd6\\x43\\xe8\\x82\\xc9\\xfc\\x78\\x32\\x04\\xc9\\x1f\\x4f\\x96\\x00\\xf9\\xe3\\xa9\\x26\\x29\\x0d\\x58\\x9e\\xd7\\x8d\\x48\\x72\\x60\\xb5\\x47\\xae\\xd7\\x7a\\x8e\\x1e\\xd9\\xca\\xb5\\xc2\\x5e\\x57\\xd7\\x62\\xc0\\x66\\xf6\\x2c\\x1a\\xd1\\xa1\\x71\\x81\\xf4\\x99\\xa1\\x39\\xff\\xc5\\x80\\x56\\x73\\x24\\xab\\xd7\\x70\\xcc\\x1a\\xbf\\x67\\xb6\\xdb\\xc2\\xc7\\x48\\xc8\\x0d\\xfb\\x93\\x12\\x02\\x0a\\x6c\\x3e\\x9f\\x69\\x57\\x3c\\xb9\\x03\\x7d\\xea\\x36\\xa7\\x12\\x18\\xd0\\xaa\\x6e\\xba\\x04\\x18\\x23\\x24\\xb7\\x4f\\x4a\\xee\\x55\\x62\\xea\\x97\\x52\\xaf\\xbe\\x3f\\xd7\\xbe\\x78\\x4a\\x0f\\xfa\\x34\\x6e\\x59\\x91\\x71\\xa8\\x55\\xe7\\x3f\\x15\\x83\\x9c\\xea\\xf0\\x4f\\x02\\xe3\\xdd\\x6a\\x9f\\x57\\xbd\\xca\\xa9\\xba\\xfd\\x5e\\xd5\\xed\\x89\\x38\\xcf\\xa2\\x51\\x2c\\xb2\\x6f\\x0e\\x4d\\x50\\x8c\\xb6\\x08\\xcf\\xa2\\x77\\x28\\xe6\\x7b\\x1a\\xc4\\x2e\\x1c\\x2b\\x75\\x96\\xf6\\xd2\\xf7\\x56\\x73\\xe8\\x6e\\x08\\x11\\x0a\\x96\\x2a\\x5f\\xc4\\x01\\xd2\\x81\\x07\\xde\\x3a\\x21\\x00\\xa1\\x42\\xf9\\x36\\x85\\xcf\\xb9\\x1f\\x1e\\xe3\\xde\\xa0\\x5d\\x0a\\xd5\\x6e\\x77\\x20\\xa5\\x66\\x9d\\xb6\\xdf\\x6e\\xc7\\x98\\xe6\\xbc\\xcf\\x30\\xe7\\xba\\xc5\\x43\\xc3\\xa8\\x2f\\x2b\\xfa\\xa9\\xb2\\xe8\\x09\\x8c\\x59\\xb5\\x01\\x4d\\xec\\x3a\\x88\\x5d\\x2b\\xdf\\x26\\xfb\\xd1\\xbd\\x1e\\xe5\\x33\\x9e\\x4c\\x39\\x9f\\x24\\xa7\\x9e\\xcc\\x5f\\xaf\\x9a\\xbe\\x4d\\xb4\\xe3\\x8c\\x12\\xd0\\xac\\xac\\xf6\\xd3\\xe2\\xf0\\x09\\xe6\\xbc\\x6f\\x12\\x33\\x87\\x26\\x31\\xd7\\x6b\\xe9\\xd3\\x63\\xd1\\x13\\x18\\xb3\\xea\\x06\\x9a\\x2c\\x77\\x10\\xbb\\x56\\x46\\x1b\\xe6\\xd8\\x99\\xff\\x93\\x29\\xe7\\x93\\xe4\\xd4\\x93\\xf9\\xeb\\x55\\x93\\x71\\x08\\x31\\xa0\\x59\\x59\\xdd\\x67\\xaf\\xc1\\x02\\xe8\\xb3\\xcf\\x27\\x1e\\x41\\x9f\\x1c\\x87\\x9e\\xc8\\x97\\x55\\x35\\xe0\\xe2\\x43\\x00\\xf5\\xa8\\x65\\xb4\\x69\\x8e\\x5b\\x4b\\x3d\\x9d\\x76\\x3e\\x41\\x46\\x3d\\x85\\xbd\\x7e\\x3d\\x19\\xc7\\x10\\x87\\x9a\\xb5\\xc5\\xbe\\xba\\x08\\xdd\\x37\\xbf\\xd0\\x6b\\x0a\\xba\\xb3\\x9e\\xa0\\x3c\\x7b\\xca\\xb9\\xc3\\x07\\x66\\x58\\x20\\xce\\x6e\\xdb\\xdd\\x5c\\xab\\x50\\xf3\\x1a\\x8b\\xc3\\x61\\x25\\xda\\x56\\x57\\x3f\\x15\\x7f\\xc6\\xd9\\xe9\\xf1\\x12\\xb9\\x62\\x35\\x1a\\x6c\\x00\\xd9\\x5c\\xaf\\xd5\\x0f\\xde\\x8f\\x27\\xd5\\x2c\\xe1\\xbe\\x47\\xbb\\x0d\\x8e\\x49\\xc3\\x0d\\xcc\\xa6\\xe5\\x2b\\x66\\xcb\\x63\\x72\\xcf\\x4f\\x34\\x32\\x3f\\x41\\x2e\\x3d\\x91\\xb7\\x1e\\x05\\x19\\xdd\\x28\\x01\\x99\\xd4\\xf3\\xe3\\x49\\x09\\xf1\\x81\\x94\\xb3\\xd1\\x04\\xd5\\x8b\\xef\\x71\\x2c\\x0b\\xbb\\xc0\\x67\\x28\\x56\\x6c\\x61\\x53\\x5f\\x13\\x07\\xe3\\xd2\\x4b\\x43\\xfd\\x26\\xd0\\xe5\\x0f\\xd7\\xb6\\x27\\xb6\\x68\\x17\\xa1\\x69\\xa5\\x6d\\xf9\\x80\\x22\\x80\\x35\\x6b\\x1f\\xd9\\xa3\\x6b\\xbf\\x9b\\x7d\\x2c\\x16\\x3c\\xa5\\xe1\\x7e\\xd9\\x1a\\x06\\x54\\x07\\xb5\\x48\\x58\\x5f\\x7d\\x8e\\xea\\xdb\\x98\\xa7\\xf3\\x01\\xe1\\x7e\\xc8\\xd6\\x3d\\xb1\\x4d\\xbb\\x50\\x4d\\xeb\\x5a\\xcb\\x27\\x20\\x01\\xfc\\x38\\x6b\\x79\\xcc\\xb7\\xba\\x8f\\xc7\\x84\\xa7\\x34\\xdd\\x2f\\x5f\\xb3\\xd1\\xf6\\xac\\x48\\xdb\\x0f\\x3b\\xd7\\x77\\xaf\\xcf\\x6c\\xac\\x36\\xfb\\x01\\x1b\\xf7\\xa4\\x26\\xed\\x32\\x35\\xae\\x24\\x6d\\x1f\\xb1\\x44\\xf8\\xe3\\x2c\\xe6\\xfa\\x0f\\x8e\\x1f\\x8d\\x07\\x4f\\x6d\\x79\\x80\\x80\\xcd\\x56\\xdb\\xb7\\x06\\xa4\\x5f\\x7f\\x1e\\x13\\x45\\x98\\x33\\xb3\\x7e\\x26\\x23\\x08\\x90\\x78\\x3f\\x5c\\xdb\\x5e\\xd7\\xa2\\x5d\\xa0\\xf0\\x42\\xcc\\xfa\\x9d\\x8b\\x00\\x1f\\x1b\\x8d\\xaf\\xff\\xb0\\xf9\\xb1\\x58\\xf0\\xa4\\x86\\xfb\\xa4\\x6a\\xb6\\x51\\xf3\\x04\\x3b\\x4d\\x0a\\xd3\\x35\\x49\\x05\\x2e\\xab\\x02\\x93\\x37\\xb5\\x5f\\xce\\xc8\\xc3\\x49\\xc2\\xb5\\x37\\xc1\\xc4\\x9f\\xb8\\xd3\\x85\\x7a\\xeb\\xe1\\xf0\\x3a\\x7a\\x67\\xd4\\x7d\\xa3\\x18\\x55\\xd8\\xcd\\xa5\\x89\\xb8\\x09\\xc5\\x70\\x42\\x59\\xe7\\x46\\x16\\xb5\\x3f\\x09\\xe6\\x10\\x8f\\xc1\\xaa\\xbf\\x5f\\xe3\\x28\\x3d\\x6d\\x6f\\xe1\\x8b\\x92\\xaf\\xe6\\x71\\xf9\\x64\\xbd\\x5d\\x8e\\xea\\x6d\\x92\\xf5\\x75\\x36\\xc9\\x0c\\xa7\\xbb\\x75\\x0e\\xc5\\xeb\\x9b\\xd9\\x7f\\xec\\x5d\\x02\\x2b\\x3c\\x25\\xe7\\xe0\\x36\\x5c\\x9d\\x0f\\x2b\\x93\\x4f\\xca\\x90\\xfc\\x84\\xc1\\xf3\\xc0\\x7f\\x1e\\xf8\\xcf\\x03\\xff\\x5f\\x63\\xe0\\xcb\\x8f\\x75\\xb5\\xdc\\x6d\\x51\\xf4\\x6e\\x87\\x22\\xec\\x02\\xb9\\x5a\\x1b\\xcc\\x34\\x11\\x49\\x13\\x7d\\x66\\x97\\x26\\xf0\\xa4\\x2e\\x4d\\x8a\\x1f\\xb2\\xbf\\x5e\\xe1\\x82\\x1a\\x83\\xf3\\x27\\x03\\x06\\x2a\\x5c\\xe3\\x09\\xe5\\xba\\xe9\\x92\\x8a\\x43\\xdd\\x90\\xc2\\x93\\x1b\\x8e\\xee\\x06\\xaf\\xf2\\x94\\xf6\\x01\\x5f\\xcf\\xd8\\xcb\\x8a\\x76\\xa9\\xf7\\xd0\\x1a\\xdd\\xe4\\x79\\xe8\\x20\\x57\\x85\\xa0\\x5e\\x85\\x35\\xb0\\xc6\\x93\\x0c\\x4d\\x2d\\x8e\\x3e\\xdb\\xf1\\xb3\\x1d\\x7f\\x96\\x76\\xec\\x71\\xeb\\x1d\\x10\\x10\\xba\\x97\\x4a\\x6d\\xa1\\x41\\xc0\\xb2\\x04\\x89\\x1f\\xb2\\xbf\\x42\\x71\\xe2\\x87\\xec\\xaf\\xe6\\x50\\xf1\\xb7\\xab\\x67\\xab\\x63\\x86\\x98\\x54\\xe3\\x13\\x19\\x62\\x6c\\x8e\\x35\\x66\\x88\\xc9\\x55\\x3e\\xea\\x10\\xa3\\xac\\x8c\\x19\\x62\\x52\\x8d\\x47\\x0c\\x31\\x26\\x84\\x11\\x43\\x4c\\xac\\xf1\\xbe\\x42\\xc5\\xb3\\x1d\\x3f\\xdb\\xf1\\x67\\x68\\xc7\\x1e\\xb7\\xde\\x0f\\x1e\\x2a\\xfe\\x06\\x87\\x8a\\xbf\\x99\\x42\\xc5\\x8f\\xa7\\x7a\\xc4\\x74\\xcc\\xde\\x6d\\xf8\\x7e\\xf6\\xf7\\x39\\x1d\\x92\\xf2\\xca\\x1f\\x72\\x3e\\x69\\xd8\\x50\\xf1\\x2c\\xd0\\x27\\x10\\x68\\xfb\\x6a\\xb6\\x31\\x85\\xcf\\xe0\\x90\\xa9\\x93\\xf2\\xf7\\x30\\xea\\x2c\\xe3\\x67\\x44\\x8c\\x7a\\x62\\x75\\xf3\\x7c\\xd2\\x78\\x67\\xc7\\xaa\\x5c\\xaf\\xee\\x47\\x06\\x59\\xeb\\xf8\\x79\\x16\\xe8\\xa3\\x04\\xaa\\x3f\\x31\\xff\\x81\\xa2\\x4f\\xd3\\xa6\\x61\\x4c\\x82\\xf1\\x27\\x4d\\xf6\\x87\\xfa\\x3f\\x0a\\x8c\\x63\\x7e\\xa0\\x6d\\xe0\\x96\\x00\\x7e\\xe5\\xba\\x2a\\xac\\x01\\xc8\\x9d\\x9c\\xe0\\x39\\x0d\\xc5\\xd6\\x1c\\xa8\\x54\\xdc\\x37\\x3b\\x61\\x2d\\x1a\\x2e\\x20\\x1f\\x64\\x28\\xc0\\xee\\x41\\xa1\\x8a\\x38\\x66\\x9e\\x85\\x78\\xad\\x10\\x3d\\x49\\x74\\x06\\xbb\\x16\\x71\\x54\\xdb\\x96\\x60\\x4f\\xfb\\xe9\\xc2\\x3a\\x5a\\xe0\\x3d\\x9b\\xa3\\xd4\\x3e\\x46\\xeb\\x9a\\xd2\\x61\\xf3\\xfb\\xe8\\x5c\\x79\\x32\\x2f\\xbd\\x0a\\x05\\x76\\xad\\xca\\xc0\\xa7\\x5c\\x41\\x41\\xef\\x53\\x13\\x47\\x6e\\x1c\\xb5\\xc3\\xde\\x0e\\x00\\xf6\\x50\\xa8\\xcf\\xed\\x84\\x7e\\xdf\\x73\\x92\\x1c\\xa3\\x13\\x26\\xa4\\xb9\\xab\\x19\\x1a\\xee\\xcc\\x9e\\x45\\xc2\\x5c\\x53\\x2b\\x08\\x83\\x15\\x73\\xb8\\xf6\\x7e\\x31\\x2b\\xb7\\xd9\\xdb\\x1f\\xf3\\x3b\\xe1\\x34\\xa5\\xb1\\x4f\\x29\\xde\\xd5\\xce\\x36\\xaf\\xeb\\xfc\\xa8\\x77\\x4c\\x04\\xf6\\x8b\\x7b\\xd6\\xf7\\x70\\xe8\\x6c\\x3e\\x42\\xd8\\x8f\\x60\\x6c\\xbc\\x25\\x3e\\x0b\\xab\\xd7\\x46\\x5b\\x11\\xf5\\xd8\\x2a\\xc7\\x33\\xd9\\x2c\\x87\\xf7\\xd9\\xae\\xb0\\xb3\\xd4\\xd8\\xed\\xb2\\xc1\\x31\\xf6\\x5b\\x82\\xf6\\x6a\\xa4\\x4f\\x21\\xa3\\xf4\\xf1\\x28\\xc6\\xae\\x33\\xdf\\x67\\x79\\x0d\\xb1\\x60\\xeb\\xe6\\x61\\x0d\\xd1\\x66\\xc3\\xc6\\x6d\\xc4\\x1c\\xe9\\xa7\\xe2\\x83\\x7a\\x94\\x27\\xd5\\xc7\\x07\\x75\\xbe\\xcf\\x82\\xb2\\x9a\\x2d\\x13\\x4f\\x8f\\xcd\\x52\\x2c\\x93\\xc1\\x52\\xa8\\xdd\\x5a\\x3f\\xb4\\x03\\x71\\xb5\\x2c\\x88\\x01\\xe1\\xe3\\xbb\\x10\\xd0\\x68\\x9f\\xe5\\x35\\xc4\\x76\\x07\\x39\\x5c\\x86\\x66\\xb6\\xde\\x1e\\x67\\xdb\\x2e\\x4a\\xaf\\x9d\\xba\\xdb\\x17\\xb3\\x4f\\xb5\\x20\\xe9\\x5d\\x8f\\xe8\\xcb\\x11\\xdd\\xf4\\xfe\\x89\\xfb\\xea\\x75\\x3d\\xb4\\x1a\\x0c\\xb0\\xa4\\x6f\\x01\\x56\\x23\\x79\\xea\\x69\\xfe\\x30\\x51\\x7e\\xc4\\xd0\\x05\\x9a\\xcf\\xbf\\x9e\\x14\\x3c\\xbd\\xef\\x7d\\x06\\x66\\x5f\\xc6\\x08\\x08\\xbd\\x06\\xf7\\xc4\\x71\\x62\\x98\\xb4\\x9f\\x34\\xf0\\x8c\\x5f\\xab\\x1a\\xed\\xee\\x5f\\x52\\x18\\x1e\\x20\\x82\\x21\\xf6\\x67\\x09\\x8a\\x22\\x86\\xd5\\x02\\x9f\\x76\\x72\\xfd\\xa1\\x87\\xfa\\x53\\x99\\xde\\xbf\\x9e\\x14\\x3c\\xb5\\xef\\x7d\\x06\\x67\\x5b\\x40\\xb4\\xe0\\x1e\\x53\\xfb\\xec\\x47\\x77\\xdf\\x14\\xdb\\xfa\\x5d\\xfb\\x5f\\x5b\\x10\\x9e\\xd6\\xfd\\x7e\\x8b\\xb3\\x3b\\x38\\xcb\\xb4\\xff\\x90\\x64\\x7b\\x7c\\x86\\xbe\\x28\\xf2\\xee\\xd6\\x79\\xe1\\x34\\x83\\x4c\\x17\\x44\\x0b\\x19\\xfc\\xe1\\x67\\xc8\\xe7\\x3c\\x8a\\x75\\x09\\xe9\\x1b\\xba\\xc0\\x07\\x31\\x45\\x80\\x37\\x3d\\x02\\xbe\\x91\\xb7\\xf7\\x7d\\x2a\\xfd\\x9b\\xd1\\xf7\\x81\\xfb\\xfb\\xa7\\x1d\\x86\\x83\\xe1\\x9f\\x58\\xff\\xfa\\xbe\\x35\\x93\\x5f\\xed\\xc9\\xaf\\x65\\xdf\\xb1\\xe5\\x16\\x01\\x76\\x18\\xcf\\x56\\xfc\\x6c\\xc5\\x9f\\xa9\\x15\\x7b\\xd4\\x76\\x0d\\x2e\\x9e\\x00\\x55\\xbf\\x4e\\x0a\\xe1\\x09\\x44\\x9a\\x02\\x77\\x5d\\x5b\\xd9\\xee\\xee\\xb2\\x51\\xa7\\x42\\x81\\xb6\\x21\\x65\\x54\\xbd\\xc7\\x5e\\x4b\\xf6\\xf9\\x77\\xc6\\x63\\x5d\\x30\\x86\\xef\\x06\\xaa\\x07\\xed\\xa6\\xd4\\xa4\\xdd\\x9e\\xeb\\xc7\\x86\\xde\\x11\\xa3\\xf4\\xd2\\x2e\\x9c\\x9e\\x5a\\x9a\\xd2\\x3e\\x49\\x1e\\x3d\\xce\\x99\\x45\\x19\\x60\\x36\\x8c\\x14\\x43\\xea\\xf8\\x2d\\xcf\\x8f\\x43\\xec\\x73\\xdc\\x53\\x46\\x73\\xf1\\x61\\x0c\\x49\\xb4\\x1f\\xa4\\x3d\\x8f\\xb5\\x62\\x90\\x12\\x85\\xaa\\x42\\xa2\\xa5\\x66\\x19\\x0d\\xbb\\xcd\\xbd\\xe5\\x2d\\x98\\x90\\xff\\x57\\x0e\\x87\\x37\\x43\\x54\\x73\\xaf\\xc3\\xeb\\xf4\\x07\\x07\\xe5\\x21\\xb9\\xf9\\xdc\\x9f\\xf8\\x9e\\x3f\\x27\\xcf\\xc9\\x2d\\x9b\\xff\\x0e\\x56\\x63\\x1e\\xa2\\x83\\xeb\\xf7\\xbe\\x16\\xd7\\xf6\\x68\\xb6\\x9c\\x4f\\xda\\xff\\x52\\xfa\\xb5\\x30\\x0b\\x62\\x48\\xb5\\xd1\\xb2\\x08\\x08\\xff\\x37\\x37\\xcd\\x7f\\x4f\\x43\\x7f\\x12\\x8c\\x90\\x83\\x5e\\x17\\xb0\\xea\\x67\\x0b\\x79\\xb6\\x10\\xc9\\x42\\x3c\\xc1\\x2e\\xac\\xbe\\x08\\xba\\x04\\xb2\\x83\\x98\\x7d\\xd2\\xb0\\xeb\\xf1\\xad\\xd6\\xd3\\xda\\xce\\x08\\x8b\\x93\\xea\\xfc\\x13\\x59\\x1c\\xf4\\x9a\\xee\\xa8\\x6a\\x1f\\xdd\\xe2\\x34\\x9f\\xf4\\x6c\\x21\\xcf\\x16\\x02\\xf9\\x24\\x5b\\x0e\\xb8\\xc3\\x80\\x7d\\x92\\x29\\xf3\\x4b\\xa1\\x03\\x1f\\x1c\\xb0\\x9a\\xcf\\x15\\x16\\xf7\\x4f\\x6a\\x70\\xee\\x95\\x16\\xe7\\x7e\\x42\\x26\\xa7\\x39\\xa5\\x67\\x13\\x79\\x36\\x11\\xd0\\x2b\\x59\\x3f\\x14\\x08\\x28\\xb0\\x5f\\x32\\x7e\\x1e\\xa0\\x60\\xfd\\xd5\\x86\\xd1\\x93\\xf3\\x2b\\xe6\\xe6\\xff\\xa4\\x53\\x73\\xf7\\xca\\xb9\\xb9\\xfb\\xc9\\x4c\\xce\\x35\\xaf\\xf4\\x6c\\x1f\\xcf\\xf6\\xa1\\xbb\\x24\\xf3\\x4d\\xbd\\x1c\\x0e\\x3b\\x23\\xf8\\x9e\\xde\\x06\\x06\\x64\\x16\\xc5\\xfc\\xd5\\xe3\\xb3\\x61\\xc6\\xa7\\x1f\\x3e\\x42\\xeb\\x1e\\x6f\\xd3\\x22\\x44\\x20\\x63\\xc9\\x8a\\x2d\\x22\\x24\\x8b\\xea\\xd9\\xe7\\x69\\xaa\\xef\\x69\\xe0\\x0e\\x7d\\x8d\\x1e\\x76\\x44\\xd0\\xad\\xcb\\x83\\xab\\xf4\\xec\\x1b\\x35\\xee\\x42\\x90\\xc1\\x1f\\x7d\\xcc\\xeb\\x63\\xe5\\xd9\\xcc\\x9e\\xcd\\xec\\xfd\\x84\\x96\\x9e\\xe7\\x61\\x04\\x14\\x83\\x73\\xb4\\xa5\\x06\\xf9\\x53\\x1e\\x4f\\x60\\xb9\\xb3\\xf0\\xaa\\xd5\\x45\\x5b\\x6d\\x90\\xbd\\xbc\\x54\\xf3\\x47\\xf0\\x73\\x05\\xfd\\xb8\\xf6\\xed\\x77\\xa6\\x5d\\xec\\x02\\x10\\x72\\x02\\xcf\\xa2\\xbc\\x52\\x94\\x9e\\x28\\x40\\xbb\\xa1\\x9b\\xd2\\x4d\\x96\\x67\\x65\\x18\\x98\\x2e\\x1a\\x9f\\x40\\x3d\\xee\\x95\\xfa\\x71\\x1f\\xa7\\xa0\\x11\\xfa\\x19\\xa4\\x1e\\xba\\xb3\\xcf\\xa4\\x1f\\x11\\x0a\\xd9\\xfa\\xb3\\x34\\xaf\\x97\\xa6\\x27\\xc9\\xd0\\x6e\\xef\\xc6\\x3c\\x86\\xed\\x49\\x1a\\x06\\xff\\xa9\\x78\\x9a\\x29\\xc9\\x87\\xfe\\xbe\\xf6\\x49\\x4e\\x48\\xc0\\xe7\\x46\\x86\\xd7\\xf9\\x27\\x99\\x92\\xe8\\x8e\\xe0\\xd9\\xc8\\x9e\\x8d\\xec\\x3d\\xcd\\x7b\\xed\\x39\\x15\\xf0\\xf5\\xa3\\x16\\x00\\xb9\\xc5\\x2a\\x4d\\xf8\\x83\\xf7\\x43\\x2e\\xc3\\x1a\\xf1\\x62\\x13\\xf0\\xbe\\xec\\x90\\x3d\\x94\\x96\\x57\\xb6\\x7c\\xfd\\x91\\xaf\\xcf\\x91\\x7d\\x4f\\x64\\xda\\xa0\\x4c\\x01\\x45\\x55\\xa7\\x00\\xb2\\x28\\xd4\\x72\\x48\\xe7\\xda\\xa7\\x0e\\x3f\\xa4\\x42\\x3f\\x2b\\xf6\\x3d\\x91\\x69\\xbb\\x42\\xa1\\xa9\\xba\\x00\\xb2\\x28\\xd4\\x76\\x0e\\xe6\\xba\\x77\\x00\\x3f\\xa4\\x3e\\x3f\\x27\\xee\\x3d\\x89\\x67\\xbb\\x3e\\xc1\\xa9\\xa8\\x08\\xb3\\x68\\xf4\\x27\\xe3\\x0b\\x49\\x32\\x57\\x7d\\x1e\\xeb\\x23\\xf8\\xdb\\xcf\\x86\\x75\\xaf\\x63\\xd8\\xae\\x48\\x3d\\x6c\\xb6\\x00\\xa3\\x0a\\xa5\\x77\\x91\\x1f\\xcf\\xac\\xfc\\xa8\\xf9\\xc0\\x17\\xd3\\x07\\x4a\\x58\\x57\\xe2\\x67\\xc5\\xbc\\x27\\xb1\\x6c\\xd3\\xa4\\x21\\xef\\x27\\xc2\\x6c\\xfa\\x1c\\x1a\\x77\\xde\\x93\\x48\\xae\\x7d\\xf6\\xf8\\x73\\x64\\xdf\\x93\\x98\\xee\\xd1\\xa9\\x31\\x6e\\x5a\\x72\\x5c\\x1c\\x3e\\x38\\xf6\\xbc\\x27\\xa9\\x5c\\xf7\\x2a\\xf0\\x67\\xc8\\xbd\\x27\\xf3\\xdc\\xa3\\x52\\x73\\xe8\\xb4\\xa5\\x71\\x38\\xc2\\xd0\\x08\\xf4\\x9e\\x3c\\xd7\\x75\\x6f\\xe6\\x7e\\x7e\\xcc\\x7b\\x02\\xcb\\x3d\\xfa\\x34\\x44\\x50\\xba\\xf2\\xdc\\xe6\\xf1\\xc3\\x79\\x97\\x67\\xb5\\xbb\\x43\\xc7\\x24\\x7d\\x58\\xe7\\x05\\xce\\x9c\\x0a\\x65\\xd5\\xe4\\x9b\\x32\\x41\\xe9\\xa4\\xf9\\xe9\\x56\\xb8\\x4c\\x76\\x9b\\x34\\xc9\\xb0\\x7b\\xc0\\x8d\\x05\\xac\\x03\\x6f\\xbe\\x21\\xd5\\xaa\\xe4\\x37\\xbc\\x0e\\x16\\xc5\\xfd\\x26\\xca\\xd3\\xbc\\x5c\\x7f\\x79\\x33\\x6b\\xfe\\x91\\x3b\\xb8\\xf7\\x65\\x7e\\xca\\x62\\x97\\x01\\x76\\x7e\\xf3\\x8f\\xb4\\xe8\\x55\\xf5\\x43\\x8a\\xdd\\xf0\\x0c\\x60\\xed\\x76\\x62\\x5d\\x42\\x3e\\xca\\x6f\\x71\\x29\\x96\\x16\\x79\\x95\\x90\\x05\\xba\\x3b\\xf5\\x5f\\x88\\x80\\x12\\x17\\x18\\xd5\\xeb\\x2c\\x67\\xbf\\x44\\x58\\x72\\x44\\x7b\\xbc\\x3e\\x95\\xe9\\x4b\\xcf\\x7b\\x43\\xfe\\xa8\\xde\\x6c\\xf7\\xff\\x2b\\xf4\\x7e\\x2d\\xf6\\xaf\\x36\\xbc\\x5f\\xbe\\xff\\x42\\x64\\x71\\x2a\\xb0\\x48\\x98\\x73\\x64\\x02\\x7b\\x9c\\x1f\\x71\\x5d\\x3e\\x84\\x5e\\x91\\xed\\x5f\\xd1\\x46\\x2f\\xe8\\xcc\\x3a\\x33\\x8d\\xa2\\x8d\\x7b\\xcc\\x7f\\xa3\\x1a\\xa7\\x2c\\xa3\\x34\\x75\\xbc\\x69\\xe5\\x60\\x54\\xe1\\x8d\\x9b\\x9b\\x41\\xa2\\xb1\\x40\\xf0\\x63\\x65\\x84\\x19\\xca\\x2f\\x68\\x7d\\x68\\x44\\xc9\\xd9\\x0b\\x57\\x68\\x8a\\xa6\\x17\\xef\\x88\\xb3\\xd3\\xb9\\x40\\x71\\x9c\\x64\\xfb\\xb5\\xbf\\x39\\xa2\\x72\\x9f\\x64\\xeb\\xa9\\x5f\\xdc\\x3b\\xbe\\xe3\\x53\\xb8\\x93\\x26\\xe7\\x34\\xa9\\x6a\\x97\\xc8\\x85\\x1e\\xab\\xa3\\x88\\x2e\\x4d\\xc5\\xac\\x03\\xbf\\xb8\\xdf\\xc4\\x49\\x55\\xa4\\xe8\\x61\\x4d\\x7a\\x9d\\x64\\xc4\\x64\\xaa\\x1a\\x45\\xef\\x5a\\x08\\x2b\\xdc\\xa6\\x79\\xf4\\x6e\\xf3\\x5b\\xde\\x54\\xdc\\x7c\\x2d\\x03\\xdb\\x16\\x1d\\xd4\\xb2\\x35\\x2f\\xee\\xdb\\x62\\x0f\\x91\\x6b\\xe4\\x9d\\x56\\xce\\xdb\\x69\\xf3\\xef\\xe2\\xed\\x0e\\xf3\\x28\\x77\\x9b\\x81\\xd3\\xd6\\x6b\\x7a\\xc1\\x19\\xad\\xf3\\x62\\x3d\\xc3\\x5d\\xd2\\x68\\x9b\\xdf\\xbb\\xd5\\x01\\xc5\\xf9\\xdd\\xda\\x9d\\x15\\xf7\\xce\\xb2\\xb8\\x77\\x66\\x8b\\xe2\\xde\\x09\\x8b\\x7b\\xa7\\xdc\\x6f\\x11\\x1d\\xcd\\x13\\x2f\\x78\\x45\\xd5\\x38\\xaa\\x42\\x3e\\x0a\\x7d\\x14\\xae\\x6c\\x92\\x17\\x3e\\x9c\\x1c\\x51\\x00\\x9f\\x79\\x27\\x2f\\x7f\\x38\\xe2\\x38\\x41\\x4e\\x15\\x95\\x18\\x67\\x0e\\xca\\x62\\xe7\\xe5\\x11\\xdd\\xbb\\x77\\x49\\x5c\\x1f\\xd6\\xcb\\xc5\\x4d\\x71\\xff\\xea\\x0c\\x29\\x3c\\x68\\x2c\\x45\\x34\\x05\\xe7\\x10\\x9e\\x6b\\x7c\\x2f\\xba\\xdd\\x53\\x51\\xe0\\x32\\x6a\\x46\\x4a\\x8a\\xeb\\x1a\\x97\\x6e\\x55\\xa0\\xa8\\xa9\\x1c\\x16\\xf7\\x82\\x5b\\x0b\\x3b\\xdb\\x59\\xfb\\x8e\\xef\\x10\\x5b\\x62\\x26\\xe7\\xfb\\xbe\\xd4\\x88\\x47\\x72\\x94\\x8d\\x56\\x8a\\xb3\\x3c\\x2e\\x9a\\x5a\\x26\\x54\\xa7\\x38\\x0b\\x5e\\x74\\xd6\\x91\\x5f\\xed\\x9a\\x7f\\x94\\x97\\x3b\\xea\\x9a\\xa6\\xe6\\x16\\x9d\\xa2\\x1b\\x0b\\x2a\\x63\\x29\\xda\\xe2\\xf4\\xac\\x10\\xda\\x28\\xad\\xf6\\xb7\\x13\\xe5\\x59\\x5d\\xe6\\xe9\\x59\\x71\\xfa\\x2a\\x5d\\xe6\\x46\\xe7\\x8d\\xa4\\x98\\x46\\xdc\\x14\\xef\\xea\\xb5\\xdf\\xfe\\x49\\xbe\\x2f\\xad\\xfd\\xcd\\x36\\x2f\\x63\\x5c\\x52\\x4f\\x42\\x7f\\xb7\\x9e\\xa4\\xb8\\x77\\xaa\\x3c\\x4d\\x62\\xcd\\xdc\\x74\\x9b\\x26\\xd5\\x55\\xbb\\xa5\\x85\\xb9\\x56\\xa4\\xa1\\xb4\\xf4\\x48\\xf3\\x25\\x8a\\x93\\x53\\xb5\\xf6\\x39\\x3d\\xb5\\xb0\\xd2\\xca\\xc0\\x8a\\x9f\\x88\\xb3\\x37\\xea\\x70\\xbd\\xe6\\xcd\\x25\\x59\\x71\\xaa\\xdd\\x22\\x45\\x11\\x3e\\xe4\\x69\\xdc\\x46\\x06\\x51\\xec\\xd3\\x57\\x1b\\xd3\\xe8\\xb1\\x36\\xd1\\x48\\xe2\\x7d\\x50\\x6e\\x44\\xf1\\x68\\xbe\\xa3\\xbc\\x78\\x20\\x76\\x58\\x51\\xd7\\x90\\x64\\x31\\xce\\xea\\xb5\\xbb\\x5a\\xad\\x56\\xc5\\x3d\\xb7\\x62\\x5f\\x9a\\xf2\\x88\\x83\\xc6\\xdf\\x34\\x71\\x74\\x97\\xe6\\x77\\x6c\\x6e\\x67\\x65\\xf8\\x3d\\x49\\x62\\x97\\x47\\xa7\\x6a\\x62\\x86\\xd3\\x28\\x79\\x1e\\x32\\xb6\\x66\\xaf\\x2e\\xde\\xb6\\xce\\xdc\\xa2\\x4c\\x8e\\xa8\\x7c\\x38\\x43\\xc3\\x98\\x8e\\xdb\\x50\\x1b\\xd9\\xa4\\x44\\x1a\\xcc\\x42\\x78\\x6a\\x66\\x40\\xc2\\xcc\\x0e\\x0a\\x4a\\x8d\\xef\\x6f\\xe6\\x0e\\x4e\\x43\\xc8\\x71\\x03\\x1e\\x0a\\xe6\\xc1\\x24\\xf4\\x67\\xe4\\x3f\\xde\\x0c\\x88\\x4d\\x43\\xeb\\xe5\\xd7\\xd4\\x1a\\x5f\\x45\\x12\\x20\\x9d\\x67\\x4d\\xa4\\x22\\xa6\\x2e\\xb1\\x88\\x69\\x08\\x9c\\xfa\\xae\\xbf\\x9c\\x2d\\xe3\\x20\\x0e\\x84\\x17\\x6b\\xf2\\x53\\xdd\\x18\\x24\\xbd\\xc4\\x80\\x8c\\x81\\x49\\x63\\x36\\xa8\\xc4\\xb2\\xf7\\xd7\\x8d\\xed\\x4b\\x84\\xd0\\xc5\\xfb\\xb5\\x72\\xf8\\x8b\\xd0\\x8d\\x4c\\x84\\x3d\\xad\\x5f\\x16\\xa8\\xac\\x93\\x28\\xc5\\x95\\xfb\\x6b\\x75\\x6e\\xa7\\xd7\\x68\\x5b\\xe5\\xe9\\xa9\\xc6\\x1b\\x1a\\x75\\x9b\\xc9\\xb1\\x38\\x51\\x36\\x4c\\xd4\\x9b\\x69\\x96\\xbf\\x61\\x5e\\xff\\x37\\x32\\xb6\\xee\\xd7\\x6e\\x40\\xd7\\x1a\\x5d\\x5f\\x95\\x07\\x7b\\xe4\\x65\\x40\\x18\\x34\\xff\\x84\\x57\\xab\\xfe\\x6f\\x00\\x00\\x00\\xff\\xff\\x71\\x15\\x71\\x5b\\x22\\xdb\\x02\\x00\")\n\nfunc assetsLoginDistAllMinCssBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_assetsLoginDistAllMinCss,\n\t\t\"assets/login/dist/all.min.css\",\n\t)\n}\n\nfunc assetsLoginDistAllMinCss() (*asset, error) {\n\tbytes, err := assetsLoginDistAllMinCssBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"assets/login/dist/all.min.css\", size: 187170, mode: os.FileMode(420), modTime: time.Unix(1570965576, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _assetsLoginDistAllMinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xcc\\xfd\\x0b\\x97\\xa3\\x36\\xb6\\x30\\x0c\\xff\\x95\\x32\\xd3\\x87\\xa0\\xf6\\xb6\\xcb\\xee\\x24\\xf3\\x3d\\x83\\x5b\\xc5\\xca\\x75\\x92\\x49\\xe7\\x72\\xd2\\x3d\\x93\\xcc\\xc1\\xf4\\x2c\\x01\\x02\\x53\\x85\\xc1\\x85\\xa9\\xae\\xea\\x18\\xe6\\xb7\\x7f\\x4b\\x5b\\x12\\x08\\x8c\\x3b\\x99\\xf3\\xbc\\xef\\x5a\\xef\\xea\\xd5\\x65\\x10\\xba\\x6b\\x6b\\xdf\\xb4\\xf7\\xd6\\xf5\\xf3\\xd9\\xed\\x7f\\x3f\\xf0\\xea\\xfd\\xd5\\xbb\\x17\\xcb\\xf5\\xf2\\x93\\xab\\xe6\\xca\\x89\\xc8\\xd5\\x8b\\xd5\\xea\\x53\\xb8\\x7a\\xb1\\x5a\\x7f\\x7a\\xa5\\x3e\\x7f\\x5d\\x3e\\x14\\x31\\xab\\xb3\\xb2\\x80\\xab\\x6f\\x8b\\x68\\x79\\xd5\\x5c\\xdd\\xde\\x8b\\x2f\\xcb\\xb2\\x4a\\xaf\\xf3\\x2c\\xe2\\xc5\\x91\\x3f\\xbf\\x9e\\x25\\x0f\\x45\\x24\\x72\\x39\\x0c\\x42\\x72\\xb2\\xca\\xf0\\x96\\x47\\xb5\\x45\\x69\\xfd\\xfe\\xc0\\xcb\\xe4\\x6a\\x5f\\xc6\\x0f\\x39\\xb7\\xed\\x0b\\x1f\\x96\\xfc\\xe9\\x50\\x56\\xf5\\xd1\\x1b\\xbe\\x52\\xb6\\x8c\\xcb\\xe8\\x61\\xcf\\x8b\\xda\\x0b\\x1d\\x06\\xb3\\x15\\x71\\xfb\\x86\\xc8\\x29\\x4b\\x9c\\x59\\x9f\\x85\\xd4\\xbb\\xaa\\x7c\\xbc\\x2a\\xf8\\xe3\\xd5\\x57\\x55\\x55\\x56\\x8e\\xa5\\xc6\\x50\\xf1\\xfb\\x87\\xac\\xe2\\xc7\\x2b\\x76\\xf5\\x98\\x15\\x71\\xf9\\x78\\xf5\\x98\\xd5\\xbb\\x2b\\x76\\xa5\\x4b\\x5a\\x64\\x53\\xf1\\xfa\\xa1\\x2a\\xae\\x42\\x87\\x91\\xd6\\xc5\\xbf\\x8e\\xf5\\x50\\xc4\\x3c\\xc9\\x0a\\x1e\\x5b\\x33\\xdd\\x5d\\x59\\xde\\x93\\x3f\\x6e\\xbd\\xcb\\x8e\\x30\\x1c\\xf9\\x3b\\x56\\x5d\\x45\\xd4\\x0f\\x20\\xa6\\xd1\\xf2\\x28\\xe6\\x07\\x38\\x8d\\x96\\x51\\x59\\x44\\xac\\x86\\x84\\x46\\xcb\\xc3\\xc3\\x71\\x07\\x29\\x8d\\x96\\x59\\x11\\xf3\\xa7\\x1f\\x13\\xd8\\xd1\\x53\\x0b\\x19\\xdd\\x2d\\xeb\\xf2\\x75\\x5d\\x65\\x45\\x0a\\xb7\\x74\\xb7\\xdc\\xb1\\xe3\\x8f\\x8f\\xc5\\x4f\\x55\\x79\\xe0\\x55\\xfd\\x1e\\xee\\x44\\xa6\\xdc\\x98\\x10\\xd8\\x53\\x0b\\x97\\xce\\x82\\x82\\x0e\\xfb\\xa0\\xc6\\x22\\x26\\xa2\\x58\\x26\\xc5\\x32\\x2b\\xb2\\x1a\\xbf\\xb4\\x50\\xd2\\xeb\\xb7\\xfe\\xf6\\xb8\\x7d\\xf8\\xfa\\xab\\xaf\\xbf\\xde\\x3e\\x7d\\xb6\\x0a\\xe6\\xcd\\xe8\\xfd\\xd9\\x75\\x0a\\x07\\x7a\\xfd\\x76\\xb1\\x3f\\x2e\\xae\\xe1\\x9e\\x5e\\x2f\\x1c\\x7f\\x1b\\xb3\\xc5\\x6f\\x01\\xb9\\x4e\\x33\\xa8\\xa6\\x1b\\x0b\\x97\\x75\\xf9\\xf7\\xc3\\x81\\x57\\x5f\\xb0\\x23\\x77\\x48\\xbb\\x11\\x2d\\xd3\\x62\\x79\\xa8\\xca\\xba\\x14\\x93\\x47\\x4f\\x12\\x6e\\xdc\\x3d\\x44\\x65\\x71\\xac\\xab\\x87\\xa8\\x2e\\x2b\\xb7\\x80\\x23\\xcf\\x39\\x3e\\x5a\\x16\\xe4\\xbc\\x48\\xeb\\x9d\\xbb\\x82\\xba\\xfc\\xac\\xaa\\xd8\\xfb\\x7e\\xb5\\xbb\\x86\\xe2\\x65\\xc4\\xf2\\xdc\\x11\\x53\\x4f\\x5a\\x48\\x79\\x3d\\x80\\x08\\x3d\\xf4\\x87\\x3c\\x9f\\x51\\xe6\\xad\\x6e\\x98\\x27\\x72\\xfa\\x6c\\x2e\\x7e\\x96\\xb2\\xfe\\xc0\\x95\\x69\\x81\\x3b\\xac\\x4c\\xac\\xcc\\xeb\\x9a\\x45\\x77\\x83\\x2a\\xc5\\x8a\\x86\\xb4\\x58\\xee\\x79\\x95\\x72\\xcc\\xba\\x34\\x06\\xe0\\x10\\x60\\x3d\\xf4\\x2c\\x0f\\x15\\x7f\\xf7\\x23\\x82\\x38\\x45\\xe0\\x08\\x45\\xde\\x9a\\x3f\\xc9\\x57\\xfd\\x02\\x61\\x0b\\x9c\\x45\\x3b\\x77\\x7a\\xdd\\x96\\xe2\\x1b\\xb6\\x04\\x72\\xd5\\xf6\\xec\\x30\\x35\\x4a\\xac\\xb2\\xeb\\xb4\\x53\\x2c\\xf7\\xec\\xe0\\x0c\\x61\\x32\\x84\\xa8\\xcb\\xce\\xe4\\x60\\x43\\x88\\x44\\xa5\\x84\\xb4\\x80\\xf0\\x39\\x31\\xc7\\xa3\\x8a\\xe3\\x25\\x3b\\x1c\\xf2\\xf7\\xaa\\x47\\x55\\x8a\\xf0\\x77\\x14\\x15\\x24\\x59\\x75\\xac\\x2f\\x55\\xc0\\xef\\x9d\\x15\\x69\\x21\\x67\\x1f\\xcc\\xb2\\x58\\x93\\x16\\xf8\\xfd\\xc4\\x94\\x1b\\x2b\\x06\\x11\\x9d\\xb3\\xb9\\x23\\x96\\x33\\x74\\x57\\xdd\\x7c\\x8f\\xfa\\x19\\xdd\\xd0\\x95\\x6d\\x87\\x37\\x91\\xe7\\xe3\\x02\\x47\\x41\\xe0\\xfa\\x81\\xa8\\xbe\\x88\\x2f\\x8e\\xb2\\x5b\\xb0\\xa6\\x39\\x5b\\x5b\\x01\\x46\\x0a\\x2e\\xdc\\x04\\x8e\\x65\\x55\\xbb\\xd1\\x52\\xfc\\xc0\\xf1\\x80\\x53\\x17\\x2d\\xe5\\x43\\x0b\\xc5\\x92\\x3f\\xd5\\xbc\\x88\\x29\\xee\\x38\\xf5\\x6c\\xb4\\x29\\x86\\xc4\\x40\\xcc\\x7d\\x0c\\x1c\\x12\\x48\\x69\\x37\\x91\\xfe\\x2a\\x68\\x9a\\x53\\x0b\\x3b\\xba\\x86\\xac\\x4f\\xd6\\x43\\xbf\\xa5\\xb3\\xf5\\x26\\x11\\xe8\\x2c\\x2c\\xcb\\x9c\\xb3\\xa2\\x47\\x9e\\xa9\\x6d\\x3b\\xb7\\x34\\x1d\\x54\\xb6\\x53\\x95\\xcd\\xe7\\x04\\xce\\xb0\\x6d\\xda\\x34\\xc5\\x32\\x3b\\x7e\\xad\\xfb\\x95\\x92\\xa6\\x71\\x52\\x7a\\x6a\\x09\\xec\\x28\\xa5\\x99\\x6d\\x3b\\xa9\\x04\\xdc\\xdd\\x62\\x41\\x36\\xd9\\xcd\\x6e\\x23\\x2a\\xca\\x12\\x47\\xee\\x28\\x87\\x0d\\x5a\\x22\\x44\\xf4\\x2b\\xbc\\xca\\x8a\\x2b\\x46\\x22\\x9a\\xfa\\xa1\\xc0\\x7b\\x4c\\xfc\\xa4\\x33\\x4a\\x63\\xd1\\x3d\\xdb\\x16\\x3f\\xa2\\xd5\\x9f\\x72\\x96\\x15\\x72\\xae\\x9d\\x58\\x34\\xcc\\xa9\\x48\\xc6\\x8d\\xee\\xc4\\x84\\x10\\xcf\\xe1\\x9e\\xc3\\xe9\\x6c\\x2d\\xf0\\xa4\\x6d\\xf7\\x1f\\x23\\xe2\\x45\\x62\\x25\\xdd\\x2e\\xdd\\xac\\x0b\\xbf\\x9e\\x5a\\x10\\xcd\\x53\\x3d\\xf7\\xce\\x2d\\x24\\x10\\x13\\xe2\\xbe\\x2b\\xb3\\xf8\\x6a\\xa5\\x7a\\x83\\x59\\x62\\xd2\\x01\\x50\\xda\\x2f\\x9c\\x73\\xe2\\x4f\\x07\\x56\\xc4\\xa5\\xab\\xc8\\x86\\x35\\x77\\xf6\\xf3\\xef\\x59\\xbd\\x5b\\x56\\x22\\x79\\xef\\x10\\xb2\\xac\\xf8\\x21\\x67\\x11\\x77\\xae\\xb7\\x5f\\x5e\\xa7\\x60\\x59\\x04\\xb2\\xe3\\xcf\\x9c\\xc5\\xef\\xdd\\xd9\\x0a\\xb8\\x20\\x3a\\x03\\x38\\x1e\\x13\\x24\\x46\\x5a\\x28\\xca\\xf2\\x60\\x02\\x63\\x0b\\xfd\\x7a\\x4c\\x6c\\x72\\x4b\\x27\\x59\\x94\\xd2\\x62\\x29\\xd6\\x11\\xab\\x51\\x53\\xe3\\xe2\\x5f\\x3d\\x51\\x90\\x1d\\x7f\\x91\\x94\\xe9\\x32\\x4e\\xb4\\x6d\\x46\\x29\\x65\\x4b\\x49\\xc2\\x44\\x45\\x3f\\x3c\\xec\\x79\\x95\\x45\\x13\\x65\\x66\\xfd\\x12\\x30\\x62\\xdb\\x6c\\x71\\x60\\xd5\\x91\\x7f\\x9d\\x97\\xac\\x76\\x18\\x99\\xaf\\x6f\\xe8\\x4a\\x54\\x60\\x2c\\xc6\\xd4\\x08\\x14\\x10\\xce\\x8c\\xfe\\x37\\x0d\\x5b\\x16\\x65\\xcc\\xdf\\xbc\\x3f\\x70\\x09\\x92\\xb2\\xdf\\x0e\\x23\\xde\\x6c\\xed\\x32\\x73\\x17\\xda\\xf6\\xec\\x56\\x62\\xae\\x41\\x72\\x4f\\x59\\xc0\\xca\\x8e\\x3f\\xe9\\x97\\x1f\\x13\\x0b\\xab\\x98\\x61\\xcf\\xbe\\xda\\x1f\\xea\\xf7\\x13\\x3d\\x43\\x04\\xb3\\x31\\x80\\x57\\x8d\\x77\\xad\\x00\\x43\\x94\\x16\\xb5\\x5d\\x9a\\x47\\x4a\\x99\\xc7\\xe6\\x96\\xe5\\x9e\\xed\\x30\\xd6\\x34\\xe6\\x92\\xe9\\x54\\x6f\\xe7\\x67\\x6a\\x10\\x24\\x68\\x1a\\x5d\\xcc\\xd5\\xdf\\x5b\\x48\\xf3\\x32\\x64\\xf9\\x57\\xef\\x58\\x7e\\xde\\x53\\x88\\x28\\x7f\\xc7\\xf2\\x0d\\x13\\x33\\x58\\x65\\x7b\\x87\\x11\\x60\\xb6\\xed\\xac\\x71\\x25\\x15\\x1f\\xe1\\x58\\x0f\\x47\\x7e\\x75\\xac\\xab\\x2c\\xaa\\x2d\\xe2\\x39\\x21\\xcd\\x97\\x51\\xc5\\x59\\xcd\\xbf\\xca\\xb9\\xd8\\xb1\\x8e\\x75\\x8c\\xaa\\xec\\x50\\x5b\\x04\\xc2\\x25\\xd2\\x24\\x06\\xf9\\x72\\xc7\\x19\\xe2\\x77\\x5e\\xc4\\x5f\\xec\\xb2\\x3c\\x76\\x42\\xb2\\x3c\\xb0\\x8a\\x17\\xf5\\x0f\\x65\\xcc\\x97\\x15\\xdf\\x97\\xef\\xb8\\xfe\\x42\\xdc\\xc8\\x61\\x02\\xf1\\x47\\x6c\\xcf\\x73\\x41\\xea\\xa7\\x66\\x88\\x75\\xfb\\xe4\\x00\\xd6\\xfe\\xb8\\xb0\\xfa\\x8d\\x73\\x0f\\x15\\xee\\x81\\x98\\xff\\xc0\\xf6\\x7c\\x9a\\xfe\\x49\\xd0\\x10\\xdf\\x6d\\xbb\\x7f\\x5e\\xd6\\xe5\\xab\\xf2\\x51\\xf3\\x17\\x94\\xd2\\x70\\x98\\x32\\x41\\x51\\x05\\xed\\x13\\xf3\\x17\\x03\\xa7\\x2b\\x48\\x28\\xd3\\x28\\x35\\xa5\\x47\\x87\\x91\\x4d\\x96\\x38\\x11\\x32\\x91\\x29\\x39\\x09\\x58\\xd8\\x24\\x37\\x7c\\xc3\\x25\\xbe\\x8b\\x69\\xa8\\xa8\\x1e\\xf3\\x79\\x00\\x11\\x81\\x98\\x52\\x3a\\x5b\\x93\\xb0\\xe2\\xec\\xae\\xe5\\xf9\\x91\\x5f\\x89\\x32\\x5c\\xc2\\xcf\\x1f\\x2c\\x71\\xb9\\x2d\\x09\\x1b\\xa2\\x20\\x07\\xf1\\xf3\\xc7\\xda\\xfb\\x70\\x29\\x8d\\xe5\\x58\\x0b\\x02\\x6a\\x3e\\x04\\xcc\\x96\\xe5\\x3a\\x02\\xa0\\xfb\\x95\\x2a\\x05\\x7a\\x13\\xac\\xc7\\x1d\\x1f\\xb1\\x62\\x06\\x9f\\x1b\\x36\\x8d\\x1f\\x6c\\xc6\\x08\\xc6\\x39\\x3a\\x0a\\x35\\x33\\x42\\x3c\\xcd\\x39\\x45\\x60\\x1d\\x91\\xbd\\x35\\xb7\\x85\\x60\\xc2\\x18\\x71\\x13\\x39\\x92\\x08\\x18\\x21\\x10\\xb5\\x90\\x15\\xe7\\x6d\\x1a\\x9c\\x8c\\xec\\x75\\xe8\\x2d\\xd6\\x6e\\xaa\\x99\\x1a\\x06\\x91\\xe8\\xae\\x68\\x6a\\xd4\\x55\\x31\\x6d\\xb2\\xbb\\xf3\\x50\\x43\\x40\\x4c\\x57\\xc0\\x3b\\x80\\xd8\\x44\\x37\\xf1\\x26\\x9e\\xcf\\x09\\xf3\\xf9\\x7c\\x1e\\xd0\\xd0\\x8f\\xbb\\x51\\xe9\\x3c\\x94\\x83\\xd8\\xa5\\x15\\x3f\\x9c\\xf5\\x4a\\x37\\x20\\xe0\\xcc\\x0f\\x20\\xa1\\x2b\\x41\\x91\\x75\\x53\\x3b\\x3a\\x8b\\x36\\xe9\\x4d\\xb2\\x49\\xe6\\x73\\x12\\xd3\\x59\\xe8\\x30\\x3f\\x09\\x20\\x21\\x10\\xcf\\x28\\xdd\\xd9\\x36\\x47\\x16\\x06\\x53\\x3b\\xc2\\xc4\\xc7\\x4c\\x9f\\x09\\xcd\\x67\\x0d\\x08\\x68\\x86\\x8c\\xfa\\x81\\x00\\xe9\\x1d\\x12\\x65\\xa3\\x45\\xdd\\xa0\\x00\\x49\\xb9\\x46\\xb1\\x6d\\x67\\xb2\\xd1\\x98\\x6c\\x3a\\xd0\\x4a\\x24\\x68\\xfd\\x6e\\x01\\xdd\\x45\\x05\\xed\\x7e\\x00\\x99\\xe0\\xc4\\x1f\\xb2\\xd8\\x5d\\xc3\\xa1\\x2a\\x9f\\x26\\x61\\x45\\x70\\x3d\\xaa\\xe8\\x19\\x1c\\x84\\xb6\\xed\\x44\\x92\\x6f\\x08\\x29\\x03\\x46\\x45\\xc3\\x26\\x9f\\xc2\\x04\\x6f\\x40\\x15\\xb7\\xde\\x71\\x20\\xf0\\x82\\x40\\x42\\xcf\\x19\\x3b\\xa6\\x7a\\x16\\x4a\\x96\\x0e\\xb8\\x12\\xbf\\x9c\\x71\\x05\\x04\\x79\\xd8\\xa5\\xe8\\x3a\\x65\\xe6\\x8f\\xa0\\x49\\xe2\\x77\\x3e\\x87\\x44\\xb3\\x10\\x02\\x6d\\x3d\\xba\\x5f\\xb2\\x9a\\x2f\\x8b\\xf2\\x11\\x8e\\x0f\\x07\\x21\\xa3\\xba\\x77\\xad\\xe8\\x2b\\x72\\xec\\xd6\\xe7\\x92\\x41\\xbb\\xfa\\xe1\\x61\\x1f\\xf2\\xea\\x4a\\x4a\\x73\\x57\\x7a\\x14\\x57\\x08\\xd3\\x57\\xa2\\x86\\xab\\x9f\\x79\\xfa\\xd5\\xd3\\xe1\\x4a\\x6e\\x13\\xc9\\x1d\\x58\\xc8\\x4b\\xd6\\x8e\\x75\\x65\\x91\\x91\\x50\\xb9\\xf3\\x2d\\x5f\\x52\\x8c\\x2b\\x6b\\x1e\\xce\\xad\\xc0\\x0a\\xce\\xd0\\x1f\\xd9\\xe8\\x32\\x57\\xc7\\x9e\\x87\\xb6\\x24\\x8c\\x58\\x62\\x65\\x05\\x36\\xed\\xd8\\xe9\\x8e\\x14\\x6f\\x26\\xf8\\x8c\\x68\\x82\\x26\\x4b\\x5a\\xa3\\x89\\xb6\\x6d\\x87\\xde\\x6c\\xe5\\x5a\\x4c\\x0c\\x49\\x15\\x59\\x09\\xa4\\xdc\\x34\\x56\\x81\\xa3\\x1f\\xac\\x6e\\x78\\x23\\x18\\xf3\\xc5\\x1a\\x21\\xac\\x15\\x5d\\xab\\xe9\\x04\\x95\\xd3\\xbc\\x31\\xec\\x20\\x83\\x5b\\xb8\\x83\\x1c\\xf6\\x50\\x40\\x09\\x07\\xb8\\x87\\x0a\\x8e\\x50\\xc3\\x03\\xb5\\x8e\\xd9\\x6f\\xbf\\xe5\\xdc\\x9a\\xaf\\x9f\\x0b\\xce\\x4a\\x4c\\x27\\xbc\\x33\\x05\\xe3\\x47\\xba\\x82\\x27\\xba\\x82\\xf7\\x74\\xc7\\x1c\\x02\\xbf\\xc9\\x9f\\xcf\\xe4\\xcf\\xe7\\xd3\\xe2\\xab\\xe0\\x89\\x04\\x14\\xe6\\x74\\xb6\\x22\\xb0\\x6a\\xe1\\x0b\\xba\\x7e\\xf9\\xf2\\xe3\\x35\\x7c\\x49\\x4f\\xed\\x58\\x16\\xff\\x4a\\xec\\xf2\\xaf\\xe9\\x57\\xcb\\x43\\x79\\x80\\xbf\\x8a\\x5f\\x21\\xd2\\x7f\\xa3\\x1f\\xbe\\xa5\\x5f\\x29\\xc9\\xff\\x6f\\xf4\\x12\\x26\\x5a\\x09\\x3e\\x59\\x63\\x9f\\xf8\\x26\\xda\\x44\\x92\\x14\\x30\\x3f\\x0a\\x44\\x57\\x14\\x43\\x72\\x15\\xa9\\xe5\\x59\\xac\\x5b\\xf8\\x8e\\x5a\\xd1\\x8e\\x47\\x77\\x3c\\x6e\\xa4\\xcc\\xcc\\xe3\\x86\\x1d\\xdf\\x17\\x51\\xc3\\x1e\\xea\\x32\\x29\\xa3\\x87\\x23\\x3e\\x1d\\x72\\xf6\\xbe\\x11\\x92\\x66\\x55\\xe6\\xc7\\x26\\xe6\\x09\\xaf\\x9a\\x38\\x3b\\xb2\\x30\\xe7\\x71\\xb3\\xcb\\xe2\\x98\\x17\\x4d\\x76\\xdc\\xb3\\x43\\x93\\x97\\xe5\\xa1\\xd9\\x3f\\xe4\\x75\\x76\\xc8\\x79\\x53\\x1e\\x78\\xd1\\x54\\x9c\\xc5\\x65\\x91\\xbf\\x6f\\x94\\xd2\\x24\\x6e\\x8e\\x51\\x79\\xe0\\xb1\\x05\\xaf\\xa8\\xe5\\x6f\\xb7\\x4f\\x2f\\x56\\xdb\\x6d\\xbd\\xdd\\x56\\xdb\\x6d\\xb1\\xdd\\x26\\x81\\x05\\xdf\\x53\\xcb\\xf1\\xdc\\xed\\x76\\xbb\\x5d\\x36\\xfe\\x76\\xfb\\xb8\\x08\\x1a\\xff\\xed\\x76\\xfb\\xb4\\x5a\\x2d\\xb6\\xdb\\x27\\xb6\\x0a\\xc8\\xdc\\x82\\x1f\\xe8\\xf7\\x1d\\x65\\xb1\\x1e\\x2d\\xb0\\x1e\\xff\\x64\\x11\\xf8\\x91\\x5a\\xdb\\xad\\x6f\\xcd\\x5f\\xcd\\xad\\xe7\\x8e\\x35\\xff\\x7e\\x6e\\x11\\xc7\\x73\\xd5\\xbb\\xff\\xfc\\xed\\xb3\\x66\\xf6\\xef\\xc0\\xa3\\x44\\xa5\\x78\\xee\\x47\\x4e\\xdf\\xd4\\x5b\\xf1\\xfb\\x51\\x40\\x9e\\x93\\x8f\\x9a\\xad\\x35\\xfe\\xb0\\xb5\\xc4\\x97\\xad\\xd5\\x38\\xd6\\xfc\\x87\\xb9\\x45\\x48\\xa3\\x6a\\xd9\\x6e\\x03\\x0b\\x7e\\xa2\\x96\\xdb\\x37\\xb8\\xdd\\x3a\\x8e\\xf3\\x9f\\x57\\x4d\\x9a\\xf1\\x17\\x87\\xf8\\xdb\\x6d\\x10\\x34\\xd6\\xfc\\xc7\\xb9\\x45\\x9e\\x93\\x66\\xf9\\x9c\\x6c\\xb7\\xa2\\x69\\xf8\\x6f\\x2a\\x80\\x55\\x6e\\x7b\\xe7\\xd5\\xdc\\x9a\\x5b\\x60\\xa5\\x16\\x81\\x9f\\xcd\\x74\\xeb\\x2d\\xf6\\x71\\x8e\\x15\\xbf\\x55\\x95\\x06\\x44\\xb7\\x42\\x9e\\xcb\\x31\\xcc\\x9f\\xa9\\xc2\\xaf\\x27\\x0a\\x3f\\x07\\xf9\\x63\\x11\\x78\\x33\\xf5\\xd9\\xf1\\x6f\\xe6\\xff\\x16\\x5d\\x7c\\x35\\xb7\\x48\\x97\\xf5\\xef\\x83\\xac\\x54\\x67\\x7d\\xbb\\xdd\\x06\\x1f\\x6d\\xad\\xe0\\xb9\\x67\\xce\\x1e\\xb6\\xfd\\x0f\\xb3\\xc4\\x4f\\x04\\x7e\\x19\\x37\\xf6\\xc3\\xdc\\x7a\\x66\\x11\\xf8\\x95\\x9e\\xbe\\xfd\\xd2\\x1d\\x7c\\xfb\\x93\\x9a\\x7a\\x8b\\xc0\\x17\\xaf\\x3e\\x7b\\xfd\\x7a\\xf8\\x75\\xbb\\x5d\\xf6\\xdf\\xdf\\x7c\\xf6\\xd7\\xe1\\x57\\xf1\\x69\\x04\\x49\\xcf\\x2d\\x22\\x33\\x7f\\xf6\\xe6\\xcd\\xcf\\xee\\xa8\\x17\\x3f\\x12\\xf8\\xe9\\xf5\\x57\\x7f\\xff\\xf2\\xc7\\xf1\\x87\\x9f\\x08\\x7c\\xf1\\xcd\\xb7\\xaf\\x46\\x5d\\x73\\x1d\\x04\\x7e\\xd4\\x6b\\x34\\x39\\x3b\\xd6\\x4d\\x51\\xef\\xc4\\xff\\x85\\x78\\x21\\x0b\\x27\\x12\\x9c\\x70\\x53\\x26\\x0b\\x81\\xdc\\x14\\xf0\\xa8\\xd9\\xe2\\xef\\x78\\xd1\\x94\\x71\\xdc\\x38\\x8e\\x3f\\x5f\\x04\\x0d\\x71\\xb6\\xdb\\xf8\\x39\\x29\\x9a\\x1e\\x7e\\xd5\\x07\\xf5\\xbe\\xdd\\xc6\\x73\\xd2\\x90\\x6e\\x6a\\x11\\x50\\xac\\x4c\\xf0\\xe7\\x65\\x99\\x8f\\xc6\\x2d\\xf6\\xc5\\x77\\x73\\x8b\\x3c\\x53\\x59\\x0a\\xce\\xe3\\xe3\\x17\\x52\\x9f\\x34\\x1e\\x9b\\xa8\\x4e\\x2e\\xb3\\xdb\\xf7\\x8a\\xdf\\x37\\x69\\xdd\\xe4\\x72\\x44\\xfd\\x00\\x87\\x63\\x70\\x3c\\x77\\xb1\\xdd\\xc6\\xc4\\xc3\\xae\\x1b\\x1d\\x73\\x3c\\xea\\xbf\\x5d\\x04\\xcd\\x33\\xd5\\xc5\\x16\\xfe\\x49\\xaf\\x45\\xaf\\xb2\\xe2\\xf0\\x50\\x2b\\x84\\xd4\\x88\\xce\\xb0\\x8a\\xb3\\x26\\x7c\\xa8\\xeb\\xb2\\x20\\xcf\\xae\\x33\\xf8\\x1f\\x7a\\xfd\\x76\\xb7\\x8d\\xc5\\xe3\\x33\\x7a\\xfd\\xd6\\x7f\\x7b\\x0a\\xe6\\xdb\\xd3\\xf6\\xf8\\x7c\\xeb\\x17\\xac\\xce\\xde\\xf1\\xab\\xed\\xe3\\x35\\xfc\\x4b\\xd6\\xf6\\x27\\xc7\\x17\\x18\\x64\\x4e\\x1a\\x67\\xfb\\x38\\x27\\xcd\\x76\\xa9\\x13\\xc8\\xb3\\x6b\\x60\\x8c\\x5e\\xfb\\xf3\\x7f\\x07\\xd7\\x10\\x32\\x7a\\xfd\\x51\\xb3\\xdd\\x5e\\xa7\\x10\\xb1\\x01\\xe4\\xe1\\x3e\\xf4\\xb7\\xdb\\x98\\x2d\\x92\\xe0\\xb4\\x86\\x3f\\xb7\\x38\\x0a\\xaf\\x91\\x43\\x24\\xcd\\x12\\x47\\x20\\x40\\x38\\x66\\x74\\x92\\xc1\\xa2\\xd6\\xea\\xc9\\x9a\\x87\\x8b\\x3f\\x7f\\xfa\\xe9\\xc7\\x7f\\xd6\\xec\\x8e\\x60\\xd6\\xe2\\xa6\\x89\\xbc\\xd0\\x5d\\xdd\\xc4\\x9e\\xa4\\xed\\xcb\\xa4\\x2a\\xf7\\x5f\\xec\\x58\\xf5\\x45\\x19\\x73\\x27\\x9e\\x63\\x09\\xe2\\x4e\\x7e\\xbc\\xb9\\x59\\xaf\\x9a\\x4f\\x3f\\x7d\\xf1\\x97\\x3f\\xc3\\x7a\\xf5\\xe2\\x63\\x3b\\x6e\\x3e\\xfd\\xf3\\xc7\\x2f\\x56\\x28\\xb8\\x98\\x4c\\xcc\\xde\\x21\\xed\\xa6\\xae\\xde\\x9f\\xbe\\x51\\x6c\\xcc\\x57\\xf4\\x5b\\xc9\\xb7\\xbc\\x5b\\x22\\xf4\\x09\\xb9\\xec\\x48\\x60\\xf8\\xf6\\x95\\x6f\\xbe\\x6b\\x45\\x67\\x47\\xaf\\xdb\\x88\\xd5\\xd1\\xce\\x49\\x18\\x39\\x7d\\x43\\x4f\\x58\\xaf\\xfb\\x95\\xca\\xe5\\x0d\\x89\\xd4\\x5f\\xb5\\x14\\x03\\xaa\\xd9\\x90\\x90\\x76\\x92\\xfb\\x67\\x06\\x37\\xbd\\x79\\xdc\\x65\\x39\\x17\\xf4\\x4b\\x31\\xd0\\xf3\\x79\\x40\\x36\\x1d\\xf3\\x1c\\x2d\\xd6\\x6d\\xdb\\x76\\x1c\\x4a\\xca\\x70\\xc2\\x63\\xe0\\xb2\\xae\\x04\\x76\\x8a\\xde\\x97\\x48\\xe7\\x1f\\xe1\\x49\\xb0\\xb2\\x4e\\xe8\\x85\\xcb\\xf2\\xb1\\xe0\\xd5\\x97\\x8a\\xb8\\x37\\x4d\\xe8\\xbe\\x23\\x33\\x4a\\x0b\\xdb\\xde\\x3b\\x21\\x81\\x50\\xb0\\x1c\\x05\\xc4\\x62\\x6d\\xfc\\x00\\xee\\x68\\xd8\\x8d\\xb9\\x93\\x37\\x66\\x86\\x70\\x3e\\x63\\x4d\\xb3\\x9e\\x51\\x7a\\x67\\xdb\\x7f\\x91\\x3f\\x6b\\x7c\\xd5\\x04\\x37\\x16\\xed\\xce\\xb8\\x6d\\x1f\\x50\\x32\\x5c\\xab\\xbc\\x4e\\x42\\xff\\xb5\\xe4\\x4f\\x1c\\xc5\\x5f\\x41\\xa8\\x6f\\x69\\xe2\\xaf\\x03\\xcc\\xf3\\x17\\x2a\\xca\\x8b\\xa7\\x1d\\x0d\\x97\\x29\\xaf\\x95\\xbc\\xfd\\xf9\\xfb\\x6f\\x63\\xe7\\x96\\xc0\\x6c\\xd7\\x34\\xb3\\x9d\\x21\\x54\\x0f\\xda\\xda\\x2d\\x33\\x21\\xb3\\xdd\\x76\\x89\\x92\\xcf\\xde\\x11\\x88\\x3b\\x99\\x71\\x34\\x09\\xb6\\x8d\\x2d\\x0d\\xd2\\xce\\xdb\\x25\\xb6\\x5d\\x3b\\x21\\xec\\x88\\x6d\\xff\\x5e\\x1b\\xa2\\xef\\x89\\xff\\x22\\xd0\\xdf\\x35\\xe4\\xc5\\x60\\x8e\\xe7\\xf8\\xf9\\xfb\\x37\\x2c\\x15\\xb2\\xb8\\x98\\x04\\xc0\\xde\\xe3\\x3c\\x7c\\x1c\\x10\\xdb\\x8e\\x86\\x39\\xbf\\xc8\\xd9\\xf1\\x28\\xf2\\xfe\\x6e\\x9d\\x5d\\x4e\\xd1\\x67\\x88\\x5b\\x21\\x95\\x2f\\xef\\x8f\\x42\\x8e\\x9c\\xdd\\x37\\xcd\\xec\\x7e\\x59\\xf3\\x23\\x8a\\x92\\x38\\xc7\\x47\\x5a\\xd1\\x07\\x78\\xa4\\x21\\x3c\\x51\\xb5\\x38\\x0c\\x04\\x73\\x7a\\xd7\\x9f\\x2e\\xcd\\xa8\\x02\\x83\\x73\\xc5\\x01\\x39\\x95\\x34\\x15\\xe2\\x92\\x53\\xc9\\xc5\\xfa\\xac\\xae\\xab\\x2c\\x7c\\xa8\\xb9\\x63\\x65\\xb1\\x45\\x88\\x77\\xa4\\x55\\x47\\x60\\x42\\x06\\xd6\\x76\\xfb\\xcc\\xb6\\x88\\x1b\\x2e\\x8f\\xe3\\xcc\\x70\\x24\\x70\\xa4\\x96\\x9f\\xc5\\xf4\\x23\\x6b\\x7e\\x9c\\x5b\\x1f\\x05\\x57\\x16\\xe4\\xb4\\xd4\\x8c\\x9d\\xdc\\x13\\xf9\\x62\\x41\\x4a\\x3f\\x0f\\xe8\\x71\\x5e\\x31\\x47\\x3c\\x91\\xcd\\x23\\x65\\x4c\\x8f\\xcb\\xb6\\x0f\\xcc\\x09\\x4d\\xf8\\x68\\x1a\\x31\\xba\\x72\\x79\\x5b\\x66\\x85\\x63\\x81\\x45\\xc4\\xa4\\x3c\\x11\\x81\\x14\\xce\\x66\\xf3\\x71\\x89\\xc7\\x2a\\xaf\\xd5\\x29\\xca\\x67\\x79\\xee\\x3c\\xe1\\x3c\\xca\\x1d\\xff\\x9e\\x9c\\xda\\x24\\x2b\\x58\\x9e\\xbf\\x3f\\x55\\x4d\\x13\\x2a\\x85\\xce\\x68\\xd4\\x6d\\xdb\\xaa\\x8a\\x33\\xa7\\xd7\\xde\\xfc\\x0c\\xd6\\xb3\\xb5\\xa0\\x46\\xb8\\x51\\xfb\\xdd\\x2b\\x18\\x69\\xa9\\xd0\\x16\\x22\\x67\\x97\\x1c\\x3a\\x91\\xd8\\xcf\\x9d\\x10\\x86\\x30\\x16\\xcd\\x85\\x3c\\x73\\x23\\x24\\xaf\\x68\\xc7\\x5f\\xe1\\xbc\\xd8\\x76\\xcc\\x73\\x5e\\xf3\\xab\\xd0\\x67\\xcb\\xe3\\x2e\\x4b\\x6a\\x87\\x04\\x10\\xfa\\x98\\x37\\xa0\\x5c\\xf7\\x25\\xec\\x9b\\xcc\\x98\\xa9\\x5f\\xf2\\x1f\\x02\\x3a\\x5b\\x01\\xeb\\xbf\\xdf\\x32\\xf3\\xa8\\x66\\xa4\\xf6\\x8a\\xb3\\x77\\x16\\xd9\\xf4\\xb3\\x37\\x9b\\x31\\x27\\x24\\x6a\\x82\\x3a\\xad\\xc2\\x6c\\xdd\\x4d\\x94\\xb9\\x18\\xb6\\x1d\\x5e\\xd6\\x87\\x41\\x48\\x85\\x80\\x6c\\x60\\xb6\\x3b\\x36\\xc4\\x90\\x4a\\xa6\\x6b\\x2c\\x62\\xea\\x1b\\x24\\x60\\xf0\\xc5\\x82\\xc4\\x4b\\x56\\xd7\\xd5\\x37\\xac\\x88\\x73\\xee\\x47\\x3e\\x0f\\x02\\x6a\\x0c\\x3b\\x1f\\xd4\\x16\\x0a\\x50\\x8f\\x69\\x64\\xdb\\x63\\x61\\x6c\\x4d\\xa9\\x81\\xf8\\x6c\\xdb\\xf9\\x77\\xb8\\x3c\\x96\\x0f\\x55\\xc4\\xbf\\x2d\\x62\\xfe\\xd4\\x34\\x5f\\x90\\x85\\xf3\\x6f\\x36\\x4e\\x13\\x3b\\x38\\x1e\\x60\\xa3\\x88\\xc8\\xae\\x45\\x34\\x5a\\x16\\xfc\\xa9\\x7e\\x9d\\x85\\x79\\x56\\xa4\\x02\\xe3\\x45\\x86\\x5c\\xb2\\x58\\x77\\xea\\x11\\x6f\\xed\\x2e\\xd6\\x7d\\x8f\\xf7\\xe6\\x42\\xf5\\xc7\\x50\\xdd\\x10\\x2e\\x6c\\x4b\\x2d\\x85\\x22\\x37\\x81\\xf2\\xa4\\x98\\x77\\x3c\\x37\\xa4\\x94\\x19\\xf3\\x5b\\xfc\\x5f\\xd5\\xef\\x18\\x0d\\x34\\x8d\\x25\\xb9\\x14\\x7c\\x23\\x17\\xda\\x2b\\xcd\\xf6\\x32\\xe6\\x98\\x4d\\x6a\\x30\\xa5\\xf3\\x10\\xcc\\x4f\\x11\\xc4\\xb2\\x3f\\x1c\\x12\\xca\\x1c\\x3f\\x80\\x48\\x53\\xca\\x90\\x40\\x4a\\x93\\x21\\x18\\xa4\\x8b\\x05\\x89\\x7c\\x4e\\x13\\x3f\\x0d\\x02\\xdb\\x76\\x04\\x14\\xd0\\x99\\x13\\x8b\\x1f\\xf1\\x4c\\x48\\x2b\\xfe\\x75\\x5d\\x3a\\x0c\\xf6\\x82\\x6d\\x4f\\x9d\\x53\\xb3\\x49\\xbc\\x6d\\xdb\\xac\\x8d\\x68\\xca\\x96\\x4a\\x79\\x41\\x4f\\x2d\\x24\\xe2\\x3d\\x3b\\xfe\\xfa\\xfd\\xab\\x73\\x89\\x1c\\x95\\x79\\x6c\\x4c\\x81\\x19\\xe9\\x64\\x6d\\xd5\\x42\\x77\\xfe\\xe9\\x59\\xdf\\xbc\\xf9\\xfe\\xd5\\x10\\xff\\xba\\xb3\\x75\\x0b\\x7b\\x6c\\x95\\xd7\\xba\\x96\\x09\\xe9\\x9f\\x43\\x4a\\x99\\x77\\xde\\x9a\\xfb\\xae\\x3b\\xad\\x91\\x74\\x5f\\xd0\\xdb\\xd4\\x00\\xf6\\x74\\xdc\\x1d\\xcf\\x29\\x68\\x0a\\x25\\x3d\\xfb\\x00\\x5c\\xa4\\xf1\\x84\\x3d\\xe4\\xf5\\x3f\\x32\\xfe\\x08\\xdc\\xb6\\xf9\\x8c\\x52\\x01\\x2c\\x07\\xdb\\x76\\xf8\\x92\\xc5\\xf1\\x57\\xef\\x78\\x51\\xbf\\xca\\x8e\\x35\\x2f\\x78\\xe5\\x9d\\x27\\x39\\xd6\\x43\\x91\\x97\\x2c\\xb6\\x80\\x33\\x98\\xad\\x89\\xcb\\xc5\\x16\\x66\\xd1\\x0e\\x73\\xd9\\xf6\\xe0\\xd5\\xb1\\xca\\xa2\\xcf\\x4e\\x08\\x1c\\xe8\\x2c\\x71\\x52\\x02\\x11\\xee\\x7b\\x44\\xc1\\x47\\x7a\\x6b\\x00\\x8f\\xa9\\x46\\x8f\\x34\\x69\\xa4\\x56\\x66\\xc1\\x8c\\x8d\\xe8\\x55\\xf7\\xd9\\x22\\xad\\xa8\\x71\\x6a\\xc9\\x2f\\xd6\\x6d\\xaa\\xfc\\x53\\x85\\x31\\xbf\\x28\\xf7\\x12\\x63\\x5a\\x84\\xa8\\xe6\\xce\\x69\\xbf\\x90\\x17\\x15\\x00\\x9f\\xb7\\xda\\x11\\x73\\xfa\\x4c\\x92\\xb7\\xf4\\x12\\x5b\\x20\\x4b\\x0a\\x5e\\xe5\\x42\\x17\\xcb\\x41\\x17\\x19\\x11\\x3c\\xcc\\x03\\xcc\\x46\\x15\\x8a\\xba\\x9a\\x66\\x2a\\xd5\\x79\\x18\\x77\\x53\\x34\\xe6\\x39\\xf1\\x32\\xc9\\x8a\\x78\\xf9\\xed\\x97\\x23\\xe5\\x4c\\x96\\x4c\\x5a\\x7c\\x8c\\x39\\x3a\\xe4\\x0c\\x35\\xb2\\x19\\x31\\x5d\\xbd\\x25\\x40\\x24\\x18\\xa2\\x9e\\x6c\\x78\\x7e\\x14\\xb8\\x7e\\xd0\\xb6\\x20\\x5a\\xcf\\x6b\\x5e\\x0d\\xdb\\xef\\xf6\\x5b\\x47\\x7b\\x23\\x06\\x71\\x5f\\xdd\\xe4\\x0a\\x9e\\x33\\x2f\\x02\\x43\\xb7\\x2d\\x71\\x1d\\x45\\x5f\\xbb\\xa1\\xfe\\x3f\\xd0\\xac\\x1c\\xf2\\x45\\x5c\\xd3\\xf5\\x44\\xd2\\xcc\\xf3\\x34\\xd9\\xc3\\xc1\\xfc\\xbc\\x63\\xf9\\x03\\x57\\x7d\\x06\\xd5\\xd7\\x37\\x9f\\xfd\\x95\\x4e\\x43\\xb2\\x37\\xa5\\xb8\\xfb\\xbd\\x15\\x33\\x8a\\x5f\\x64\\x65\\x5d\\x64\\x37\\xbd\\xf0\\x9c\\x91\\x62\\x9d\\xee\\x77\\x52\\xa3\\x1d\\x53\\x3f\\x50\\x47\\x4b\\x17\\x2b\\x17\\x44\\xd5\\x7a\\x2e\\x48\\x0c\\x23\\x27\\x4d\\x5b\\x13\\x3c\\x66\\x20\\x82\\x6a\\x47\\x06\\x22\\x53\\x6c\\x79\\xd4\\xcd\\x52\\xac\\x39\\xa1\\xa4\\xd5\\xf3\\x83\\x0a\\x93\\xf1\\x0c\\x75\\xbb\\xca\\xb6\\x27\\xb5\\x9b\\x87\\xf1\\xe0\\x7b\\x9e\\xbb\\x1f\\x22\\x54\\x62\\x38\\xf7\\xe2\\x8f\\x64\\xc0\\xfb\\x2d\\x3c\\x9e\\x18\\x21\\x5b\\x38\\xa3\\x5d\\x7b\\xbe\\x5d\\x8b\\x82\\x57\\x82\\x1c\\x50\\xeb\\x25\\xbb\\x92\\x3c\\xf2\\xc3\\xdc\\xfa\\xe8\\xe6\\xe5\\x35\\xbb\\x79\\x29\\x15\\x06\\x7d\\xf2\\x62\\x9b\\x04\\x1f\\x5d\\xed\\x8f\\x2c\\xcf\\xcb\\xc7\\x88\\x1d\\xea\\x87\\x8a\\xd3\\x8f\\x3e\\xba\\x79\\x59\\x1e\\xa4\\x4e\\x5b\\x69\\x3c\\x31\\xed\\x5a\\x26\\xde\\xbc\\xbc\\x96\\xc9\\x37\\x16\\xb0\\xf3\\xd5\\xb3\\xfc\\x61\\x75\\x6f\\xe9\\x47\\x1f\\x05\\x1d\\xee\\xb2\\xed\\x7b\\x39\\xdd\\x96\\xff\\xfc\\xed\\xb3\\x80\\xf6\\x3a\\xc6\\x8f\\x9a\\xad\\xb5\\x45\\x85\\xd2\\x64\\xa5\\xba\\x27\\x7d\\x55\\x4d\\xa3\\xab\\xea\\xb5\\x99\\x9e\\x8b\\xd0\\xdd\\x48\\xa5\\xcd\\xa5\\xba\\xb2\\xf8\\xdf\\x54\\x0e\\x7f\\xaa\\xb6\\x7f\\xd3\\x0b\\xe5\\x5c\\xa5\\x07\\x9e\\x28\\xd3\\x7f\\x9a\\x2c\\xc9\\xfe\\x84\\xcd\\xcd\\x9f\\x4f\\x14\\x5d\\xfe\\x69\\x39\\xf7\\xe7\\xff\\x0e\\x90\\x9a\\x8c\\x56\\x57\\xe2\\x89\\x74\\xcc\\x59\\x4b\\x6e\\x8a\\x6c\\xc6\\xc2\\x91\\xd8\\x89\\x16\\x58\\x52\\xd9\\x8c\\x5d\\x19\\x9d\\x30\\x0f\\xb3\\x17\\x82\\x86\\x81\\xf5\\xe5\\xa5\\x69\\x12\\xdf\\x69\\x3c\\xb5\\x76\\x58\\x52\\xea\\xbb\\x3a\\x75\\xf1\\xa5\\x49\\xe3\\x05\\xaa\\xc0\\xa7\\x26\\x4d\\x7f\\x02\\xcb\\xd5\\x9a\\xf2\\x0b\\xb5\\x3c\\x07\\xf7\\xc9\\x22\\xa0\\x4b\\xc2\\xf2\\xb9\\x2b\\xe6\\x8b\\x88\\x3d\\xb3\\x17\\x02\\x05\\x3f\\xea\\xfc\\x7a\\xff\\x1c\\x69\\xa9\\x3f\\x35\\x4d\\xb9\\x7c\\xe4\\xe1\\x5d\\x56\\x7f\\x3f\\xcc\\x2b\\x3e\\xec\\xcb\\xdf\\x26\\x52\\xcb\\xa9\\x9c\\xc7\\x51\\xa2\\xd8\\x90\\xa3\\x15\\x8b\\x96\\x71\\x76\\x8c\\xca\\xa2\\x40\\x60\\xc5\\xfc\\xf4\\xa8\\xce\\xbf\\x40\\x8a\\x44\\xd0\\xbf\\xfb\\xc7\\x99\\xd8\\x1d\\x38\\xb6\\x4a\\x8d\\x6d\\x46\\x2d\\xf8\\x49\\xc0\\xc2\\x3d\\xbd\\xef\\x26\\xde\\x50\\xb5\\xdd\\x2b\\xf9\\xb4\\x11\\xdc\\x42\\x45\\xab\\xa9\\x3c\\x95\\x99\\x27\\xd4\\x33\\x52\\x2e\\xa3\\x72\\x2f\\xa8\\xa3\\x66\\xf3\\x7e\\x2a\\x8f\\x99\\xe8\\x38\\x81\\x9a\\x86\\x4d\\x63\\x64\\x2b\\x6a\\x96\\x15\\x47\\xe2\\x4d\\xe9\\x9f\\xfe\\x32\\x90\\x82\\x3c\\x36\\x66\\xf7\\x5c\\x21\\x2d\\x85\\x43\\x01\\x6e\\x63\\x1c\\xf8\\xc4\\x4d\\x33\\x73\\x66\\xb1\\x54\\x08\\xc5\\x86\\x41\\xca\\xcc\\x89\\xba\\xa6\\xbd\\xfe\\xd1\\x89\\x09\\x9a\\xa6\\x4c\\x76\\xdd\\xb6\\xd7\\x7f\\xb6\\x2f\\x7e\\x45\\xfb\\xa6\\x31\\x15\\xc9\\x12\\x27\\x54\\xf2\\x56\\x48\\x07\\x0a\\x00\\xf1\\x05\\x49\\x86\\x36\\x47\\xd9\\x74\\x32\\x2a\\x7c\\x4e\\x43\\xef\\xac\\x1e\\x66\\x1e\\x1a\\xe5\\x42\\x38\\x5e\\x6d\\xa4\\x2e\\x73\\x76\\xb1\\x4f\\x8b\\x59\\x78\\xe9\\x53\\x47\\x80\\xbc\\xd8\\x75\\x62\\x3a\\x25\\x03\\x50\\x4a\\xc7\\x7a\\xa9\\xa6\\x09\\x89\\x77\\x79\\x0a\\x42\\xe2\\xae\\x61\\x6d\\x8b\\x59\\x97\\x56\\x74\\x5f\\x72\\xc1\\x27\\xf3\\x58\\xac\\xd0\\xa5\\x42\\xd8\\x50\\xec\\x89\\xf1\\xa5\\x4d\\x33\\xea\\x07\\xa5\\xf4\\x9d\\x6d\\xd7\\xce\\x3b\\x60\\xc4\\x5b\\xac\\xdd\\x50\\xe6\\x0a\\x2f\\xe5\\x0a\\x89\\xb7\\x76\\xef\\xbc\\xbf\\x39\\x77\\xc0\\xc8\\x42\\xfc\\x84\\xc4\\x5d\\xb9\\x9f\\xd8\\xb1\\x28\\xbd\\x9e\\x5a\\xa0\\x4b\\x13\\x1b\\x75\\x26\\x04\\xfd\\xb2\\x21\\x1f\\x60\\xbc\\xee\\xa8\\xcf\\x02\\xc8\\xa8\\x1f\\x06\\x52\\xab\\xd8\\x34\\xb3\\x84\\x18\\x00\\x98\\x76\\x9d\\xf6\\xd6\\x2e\\x17\\x2f\\xc9\\x54\\x07\\x45\\x61\\xc1\\x27\\x75\\x65\\x95\\x5a\\x60\\x13\\x51\\xb6\\xe9\\xe5\\x75\\x03\\x7e\\x76\\xcb\\x87\\x42\\x2a\\x56\\x22\\x91\\x2b\\x9c\\xce\\x95\\x99\\xb9\\x64\\x8e\\x9d\\x1f\\x07\\x94\\xd2\\xcc\\x8f\\x03\\x12\\xcf\\xe7\\x3d\\x1c\\xe4\\x0c\\xbf\\x01\\x7e\\x71\\x55\\xb6\\x77\\xa2\\xcb\\x99\\x7e\\x5e\\xbb\\xab\\x16\\x52\\xe2\\x16\\x2d\\xa4\\x4c\\x63\\xbc\\xe9\\xe3\\x56\\xd4\\xff\\x16\\x0f\\x79\\x2e\\xff\\x84\\xc4\\x2c\\xd2\\xe1\\xcf\\xb3\\xc5\\x98\\x82\\x43\\xad\\x0b\\x66\\xa8\\x0b\\xee\\x18\\xd9\\xbf\\x83\\x45\\x3f\\x7a\\xb6\\x16\\x04\\x1f\\x66\\xce\\xec\\x0c\\x39\\x37\\xcd\\xec\\xd0\\x34\\x95\\x6d\\x57\\x12\\xd7\\x84\\xa4\\x69\\xee\\x05\\x5d\\x51\\x6f\\x04\\xb5\\x6d\\x72\\x0b\\x75\\x68\\x32\\x94\\x1a\\x93\\xa6\\x99\\x40\\xae\\x02\\x38\\xe3\\x4e\\x41\\x8b\\x7a\\xe3\\x3e\\xa1\\xc3\\x2d\\x9d\\xb2\\x45\\x69\\x9f\\x38\\x39\\xb5\\xfd\\x9c\\x84\\x50\\xc8\\x09\\xf1\\x59\\xa0\\xa9\\xd4\\xcd\\x0a\\xe7\\x46\\xe3\\xa0\\xc9\\xf9\\xfc\\x9d\\x79\\xd1\\xc6\\xdf\\x29\\x43\\xa1\\x73\\x54\\xc5\\x87\\x0b\\x23\\xb0\\x73\\x3a\\x50\\x53\\x8d\\x4c\\x0f\\x02\\x48\\x28\\xb7\\xed\\x2f\\xe5\\x2c\\x99\\x39\\x61\\x94\\x93\\x78\\x1c\\xf5\\xfe\\xb3\\x83\\xe6\\x3a\\x35\\x80\\x75\\x56\\x9a\\x89\\x97\\xb8\\xa6\\x6c\\x2c\\xd6\\xc9\\x1b\\xc9\\x3a\\x21\\x71\\x9d\\x84\\x4e\\x88\\x18\\xa1\\xa0\\x83\\xc9\\xf2\\x78\\xe0\\x51\\x96\\x64\\x3c\\xf6\\x12\\x29\\x63\\xb8\\xa8\\xa4\\x13\\xe3\\x47\\x1b\\x4d\\xfa\\x21\\x1b\\x4d\\xeb\\xf5\\xfb\\xa2\\x66\\x4f\\x57\\x98\\x13\\xae\\x1e\\x8a\\x8a\\x47\\x65\\x5a\\x64\\xbf\\xf1\\xf8\\x8a\\x3f\\x1d\\x2a\\x7e\\x3c\\x66\\x65\\xe1\\x5e\\x59\\x73\\x26\\xa7\\xf4\\xa1\\xc8\\xee\\x1f\\xf8\\xeb\\xb2\\x9a\\x52\\x6a\\x18\\x22\\x02\\x6e\\xe3\\x9c\\xce\\xa2\\x65\\xcc\\x6b\\x1e\\xd5\\x5f\\x3e\\x1c\\xf2\\x2c\\x62\\x35\\x3f\\xc2\\x1d\\x55\\x18\\xf1\\x75\\x2d\\x78\\x0f\\x21\\x3e\\xa1\\x01\\x81\\xb3\\x12\\x4c\\x88\\xf8\\xe0\\x7c\\x4e\\x20\\xd7\\x02\\x44\\x48\\x99\\x9f\\x08\\x01\\x02\\x69\\x84\\x9f\\x04\\xb6\\x8d\\xd6\\x31\\x48\\xb6\\x13\\x42\\x0c\\xf5\\x22\\x53\\x06\\xca\\xa8\\x4d\\x82\\x35\\xd1\\xc0\\x76\\x87\\x7a\\x4b\\x60\\x2d\\x70\\x9a\\xe2\\x4c\\xbe\\xe1\\x4f\\x93\\x36\\x19\\xd4\\xb2\\x10\\xd5\\x25\\x06\\xa9\\x15\\x23\\x49\\xe4\\xf9\\x88\\x40\\x4b\\x4d\\xf3\\x17\\xf9\\xb3\\xc6\\x57\\x29\\x4a\\x9f\\xd9\\x7a\\xa1\\xc9\\x21\\x1e\\x58\\x16\\x75\\x87\\x04\\xcd\\x44\\xb4\\xc7\\x64\\x94\\x2d\\xf1\\x70\\x12\\x59\\xc5\\x0d\\xdb\\x88\\x04\\x53\\x13\\x19\\xcd\\x29\\x5a\\xc0\\xea\\xb3\\x91\\x8f\\x65\\xd3\\x9f\\x98\\xf8\\x51\\xf6\\xf4\\x1f\\x62\\xe9\\x65\\xbe\\x7e\\xde\\xf0\\x5c\\x0a\\xeb\\x08\\x7b\\x61\\xb4\\x85\\x58\\xea\\xa7\\x24\\x6e\\x38\\xd2\\x93\\xa1\\xad\\x76\\x3f\\x5d\\x81\\x64\\x7b\\x7f\\x3a\\xf2\\x87\\xb8\\x74\\x33\\x06\\x88\\x4c\\xdc\\x5f\\xa1\\x07\\x75\\xf7\\xd4\\x82\\x10\\xd0\\xc4\\x6f\\xc5\\x73\\x3c\\xd8\\x74\\x4f\\xd6\\x8d\\xe5\\x9e\\xe2\\xac\\x72\\xad\\x1e\\xed\\x5a\\xca\\x6a\\x7e\\xb6\\x6a\\xc1\\xba\\x9a\\xf8\\xde\\x82\\x35\\xef\\x92\\x2b\\xfe\\x2e\\x2b\\x1f\\x8e\\x6a\\xf4\\x83\\xb2\\xff\\xbe\\x94\\xa9\\x6d\\xe1\\x50\\xf1\\xaf\\x51\\xe0\\x77\\x4f\\x78\\x2a\\x3e\\xa5\\x40\\xf0\\xd7\\x01\\x15\\x7f\\x46\\xc2\\x3f\\x30\\xff\\xe3\\x80\\x3a\\xe2\\x6f\\xd3\\x30\\xff\\x13\\xfc\\xfb\\x69\\xd0\\x34\\xa6\\x75\\xa0\\xca\\x2a\\x44\\x14\\x84\\xc1\\x17\\x02\\x06\\xb1\\xa0\\x25\\x76\\x86\\xff\\x71\\x80\\x7a\\x7f\\xe8\\x00\\x19\\x3e\\x21\\xad\\x3a\\x70\\xff\\x60\\x5f\\x06\\xf8\\x02\\xac\\xa2\\xde\\xc9\\x06\\xd6\\x41\\x57\\xd3\\xc7\\xc4\\x53\\xbd\\xd3\\x1b\\xda\\x61\\xfe\\x2a\\x10\\x1d\\xff\\x24\\xa0\\x73\\x47\\xfc\\x78\\xa2\\xcb\\xe2\\xf1\\xcf\\x41\\xd3\\xac\\x89\\xfb\\xe2\\xb9\\x63\\xf1\\x77\\xbc\\x90\\x95\\x7d\\x8c\\x26\\xb8\\x71\\xac\\xdf\\x88\\x28\\xfb\\xa9\\x2c\\xfb\\xff\\x0b\\xe6\\xcc\\xff\\x3f\\x67\\x19\\x5c\\xf1\\x63\\xdb\\xe3\\x16\\x5b\\x6d\\x5d\\x30\\xb5\\x73\\x66\\xa2\\x79\\xdb\\x16\\xb3\\xa3\\x41\\xed\\xd7\\x25\\xce\\x81\\x3a\\xfa\\x11\\x75\\x78\\x62\\x23\\xba\\x38\\x20\\x4f\\xe4\\xa4\\xc3\\x29\\x77\\x23\\xdb\\xfe\\x87\\xcc\\x1e\\x09\\xa9\\x3b\\xa4\\xa9\\x13\\xc1\\x6c\\x45\\xe4\\x4b\\xd4\\x5b\\xff\\x12\\xab\\x53\\x33\\x2f\\x42\\xb2\\xd0\\xcf\\x04\\x17\\x66\\x25\\xea\\x5d\\xf5\\x73\\x18\\x8a\\x11\\xbf\\x08\\xb4\\x8f\\x12\\xa6\\x98\\xab\\xf5\\x31\\x21\\xad\\x00\\x68\\x09\\x42\\x6f\\x3e\\xfb\\xeb\\x84\\x7f\\xc6\\x58\\x6b\\x34\\xad\\xd1\\x97\\xba\\x0f\\xef\\xcc\\x4a\\x6f\\x36\\x50\\xaa\\xfc\\xc7\\xc6\\xbf\\x6d\\xab\\x6c\\x47\\xce\\xfb\\xf5\\xde\\x67\\x78\\x90\\xd4\\x69\\xa5\\x9b\\xc6\\x09\\x07\\x36\\x02\\xce\\xdb\\xce\\xfe\\x85\\xcd\\x2d\\x69\\x18\\xd0\\x3c\\x23\\x96\\x98\\xd4\\xf7\\x0e\\x83\\x89\\x7e\\x85\\x72\\x0d\\x26\\xd0\\x5a\\xd4\\x2b\\x5f\\x8c\\x97\\xa6\\xf9\\x7d\\x55\\xd9\\x58\\x4d\\xa6\\x34\\xba\\x16\\xc1\\xbd\\xd6\\x92\\x16\\x46\\x7b\\x77\\x60\\x04\\xdb\\x25\\xeb\\xc3\\x06\\xaa\\xe8\\xbb\\x13\\x1b\\x2e\\x49\\xd2\\x54\\x96\\x7b\\x42\\x9a\\x13\\xf3\\xe6\\x86\\x9e\\xc3\\xe7\\x02\\xa9\\x5b\\x32\\xc1\\x13\\x9c\\x65\\xe4\\xea\\xef\\x1e\\x9f\\xe1\\xeb\\x5b\\xf5\\x1a\\xd9\\xf6\\x8a\\x52\\xca\\x3b\\x38\\x8b\\x88\\x6b\\x3d\\xef\\x3f\\x9a\\x1f\\x6e\\x16\\x6b\\xd7\\x7a\\x66\\x7e\\x93\\xe0\\xd4\\xc3\\xa2\\x6c\\xea\\xdf\\x2a\\x8b\\x23\\x70\\x05\\xef\\xa0\\xe8\\xbf\\x05\\x3a\\x24\\x88\\x37\\xc6\\x95\\x36\\x66\\x5f\\x9b\\x86\\x77\\x70\\xaa\\x6b\\x9e\\xaf\\xb1\\xee\\xb9\\xb5\\xb0\\xdc\\xd9\\x9a\\x08\\x04\\x79\\x8e\\x6e\\xb4\\xfb\\x8d\\xb2\\x39\\xa0\\x88\\x5d\\x90\\x4f\\xeb\\xc1\\x1e\\x52\\x6a\\xe5\\xec\\x58\\x9b\\xe9\\x8b\\x4f\\x08\\xec\\xa8\\xa5\\x8c\\x7e\\xb0\\x27\\x7a\\x7a\\x05\\xc1\\x8b\\xd5\\x14\\x79\\x13\\x0e\\x14\\x33\\x53\\x3e\\x30\\x00\\x5e\\xf4\\x24\\x93\\xfd\\x18\\xd8\\x39\\xd2\\x64\\x26\\xa4\\x01\\xcb\\xa0\\x78\\xd6\\x04\\x15\\xb8\\x1f\\x0a\\x1a\\x15\\xdd\\x09\\x19\\x6a\\x7a\\xb7\\xc0\\x91\\xce\\x32\\xdb\\x9e\\xed\\x04\\xd5\\xbe\\x47\\xe2\\x9c\\x68\\x4e\\xe2\\x40\\x4e\\x79\\x27\\x1d\\xe4\\x34\\xf7\\x0f\\x81\\x90\\x3d\\x77\\x5e\\x7e\\x79\\xeb\\x55\\x68\\x0a\\x9a\\x8f\\x59\\xda\\xd9\\x7a\\x53\\xd2\\x03\\xb5\\xca\\x22\\x47\\x83\\x50\\x66\\xdb\\xb3\\xd2\\xb6\\x07\\x23\\x69\\xbb\\xad\\x9f\\x25\\x4e\\x49\\xfd\\xd4\\xbb\\x37\\x88\\xbd\\x7b\\xbf\\x14\\x33\\x8f\\xcf\\x01\\xa4\\xb6\\x7d\\x24\\xa7\\x3b\\x7a\\xef\\x3f\\x04\\x4d\\xe3\\x88\\x1f\\xf4\\x53\\xba\\xa5\\x77\\x3e\\x0b\\xd0\\xd8\\xa3\\xa0\\xb7\\x02\\xb1\\x51\\xfa\\x68\\xdb\\xb7\\xfe\\x3a\\x80\\xfd\\x20\\xe1\\x45\\x00\\xb9\\x60\\x63\\xef\\x0d\\xc3\\x18\\xbf\\x08\\xba\\xd1\\xce\\xe7\\x85\\x6d\\xe7\\xb6\\x2d\\x46\\xdd\\x34\\xce\\x9e\\x16\\x74\\x45\\x9a\\xa6\\x5c\\x1e\\xca\\x83\\x83\\x46\\x1e\\xc3\\x81\\xda\\xf6\\x7c\\xbe\\xb7\\xed\\x1c\\x25\\xc2\\x93\\xe8\\x05\\xf5\\x1f\\xa1\\x80\\x7d\\xb0\\x91\\x46\\xfa\\x1d\\x4f\\x72\\x44\\xbf\\x2c\\x27\\x94\\x5d\\x0f\\x55\\xd7\\x89\\xe0\\xea\\x45\\xc7\\x64\\x17\\x89\\xe8\\xed\\x3a\\xd8\\x18\\x0c\\xca\\x1f\\xe9\\xd3\\x7f\\xb8\\x38\\xaa\\xd3\\xd8\\x25\\x27\\x97\\x1d\\xca\\x8d\\x0e\\x89\\x21\\xec\\x03\\x02\\x72\\x54\\x43\\xbf\\x81\\xfd\\x82\\x72\\xd8\\x4b\\x45\\xc9\\xfe\\xbf\\x62\\x4a\\xe9\\xca\\xb6\\xf7\\xd7\\xf1\\x0d\\x5d\\xb5\\xed\\x04\\xe5\\x33\\x6c\\xbd\\x05\\x37\\x8a\\xdc\\xd2\\x11\\x17\\x2b\\x5e\\x1e\\x79\\x2d\\x19\\x92\\xa3\\xcf\\x46\\xe2\\x83\\x41\\xc7\\xad\\x87\\x42\\x1d\\x4d\\xf2\\xf8\\x4a\\x56\\x20\\x39\\xed\\xce\\xe8\\xdc\\x7f\\x08\\x3c\\x94\\x00\\xb8\\x96\\x8f\\xd6\\x9e\\x13\\x51\\x9f\\x01\\x03\\xcb\\x82\\x30\\x00\\xb3\\xad\\x91\\xe5\\xae\\xc3\\xc6\\xf2\\x88\\x79\\x6c\\xcb\\x4c\\x0b\\x7b\\x14\\x54\\x2e\\x1c\\xd6\\xc6\\xf4\\x6f\\x82\\x48\\xf8\\x29\\xf2\\x1c\\x71\\x40\\x67\\x4e\\x24\\x7e\\x30\\xa5\\x25\\x53\\x64\\x4d\\x54\\xb7\\x82\\x48\\x7c\\xe5\\x82\\x3d\\x93\\x73\\xe3\\x9e\\x8a\\xb2\\x76\\xb3\\x29\\x55\\xab\\x1f\\x80\\x72\\x23\\xde\\x9d\\x5b\\x64\\xf4\\x07\\x04\\x62\\x3a\\x86\\x63\\x10\\x98\\xa5\\xb3\\xaa\\x4a\\x69\\xac\\x05\\x6d\\x0e\\x7e\\x20\\xd0\\xd8\\xc8\\x06\\x61\\xb7\\x58\\x10\\x27\\xa1\\xa9\\xbf\\x0b\\x24\\xa7\\xb0\\x13\\xc3\\x09\\xc5\\x4f\\x42\\x86\\x83\\x01\\x0e\\x49\\x4f\\x0f\\x91\\xa5\\x80\\x58\\xc8\\xac\\xa2\\x7a\\x74\\x16\\xc0\\x44\\x7c\\x9d\\x45\\x12\\x62\\xdb\\x96\\xc0\\x8e\\x1d\\xc7\\x63\\x9c\\x38\\xbf\\x37\\x35\\x03\\xa1\\x21\\xfc\\xb6\\x04\\xb4\\xec\\x7b\\xa1\\x16\\x76\\xc6\\x89\\xc0\\x79\\xc5\\x4e\\x68\\x8a\\x1a\\x4d\\x13\\xca\\xf3\\x09\\x21\\xf5\\x34\\x0d\\x4a\\x8e\\x1d\\xcd\\x61\\x82\\xe6\\x88\\x76\\x73\\x56\\xa4\\x17\\xda\\xfc\\x45\\x71\\x70\\x48\\xa9\\x2f\\x01\\x30\\x96\\x47\\xf0\\x85\\xf3\\x3e\\x8e\\x90\\xf4\\x99\\x29\\xc3\\x26\\x2e\\xaf\\xd0\\xea\\xe2\\xe0\\x85\\x4b\\xac\\x69\\x6c\\xae\\xf4\\xb4\\xcf\\x5d\\xf1\\x41\\x74\\x60\\xfc\\x4d\\xa6\\x77\\x56\\xe4\\x34\\x1a\\x35\\x17\\x09\\x0c\\x2d\\x4d\\xf6\\x7b\\x16\\x92\\x09\\xf2\\xa9\\xa5\\xc7\\xb1\\x4a\\x72\\x6c\\x64\\x42\\x7a\\x95\\x64\\x4b\\xa0\\x66\\xd5\\xc0\\x15\\xdb\\xb4\\x11\\x2c\\x23\\x26\\x15\\xa4\\xfd\\xb3\\xd8\\x97\\xbb\\xc1\\x59\\xa0\\xa4\\xb4\\x6b\\xe9\\xd8\\x95\\xc5\\x2d\\x54\\x65\\x39\\xe9\\xda\\xcd\\x28\\xa5\\x65\\x0b\\x68\\xee\\x7e\\xe9\\x7b\\xb1\\x64\\x91\\x10\\xc0\\x94\\x1e\\xd8\\xb6\\x9d\\x19\\x36\\xf9\\x35\\xda\\xc8\\x37\\xfd\\xb3\\x23\\x38\\xbe\\xd9\\x4c\\xe0\\x05\\x54\\xfc\\xb2\\xe5\\xae\\xe2\\x49\\xd3\\xfc\\x9b\\x2d\\x6b\\x16\\xa2\\x9d\\x0c\\xba\\x0f\\xe3\\x89\\xc0\\x34\\xbb\\xaa\\xcf\\x0b\\xd0\\xef\\xaa\\x05\\xfd\\xfa\\xfb\\x99\\x57\\x2d\\xa8\\xb3\\x9a\\x49\\xde\\xfa\\x0f\\xda\\xc9\\x84\\xa2\\xff\\x6c\\xa9\\x1d\\x03\\x1a\\x4b\\x1e\\x8d\\x19\\x9f\\xf4\\x79\\x55\\x0b\\xfa\\x69\\xba\\x6f\\xa6\\xc9\\x93\\xf9\\xd6\\x55\\x80\\xd3\\x01\\x7d\\x85\\x6a\\x10\\x7c\\x7f\\xa8\\xdf\\x0f\\xaa\\xfc\\x43\\x72\\x7c\\x96\\x38\\xbd\\x42\\xe1\\xe5\\x9f\\xa7\\x3c\\x30\\x65\\x1f\\xa6\\xfc\\x52\\x3b\\xea\\xb2\\xc4\\xd6\\xd1\\x23\\x76\\xc7\\x59\\xcc\\xab\\xa9\\xb1\\xfd\\x8f\\xda\\xac\\xdd\\x9c\\x92\\x16\\x70\\x02\\xa7\\x32\\xff\\x73\\x22\\xb3\\xb4\\x13\\xfa\\xbf\\x5c\\x26\\xc3\\xda\\x48\\x83\\x9b\\x91\\x14\\xb6\\x80\\x96\\xdc\\xe7\\x5e\\xaa\\xe3\\xaa\\x2e\\xb5\\x69\\xdb\\x96\\xa8\\xa1\\xaf\\xdf\\xb6\\x1d\\xc9\\xfd\\x3b\\x21\\x1d\\x0b\\x1a\\xc8\\xc8\\x12\\x21\\x68\\xe8\\x32\\x63\\x55\\x9d\\x76\\xee\\x2f\\x0d\\xfc\\xa7\\x27\\xc9\\x5f\\x05\\x88\\x1e\\x47\\x9f\\x0d\\x8d\\xa4\\x1f\\x2e\\xd6\\x22\\x0f\\xbf\\x1f\\xe7\\xe8\\x25\\x18\\x7f\\x75\\x13\\x79\\xd1\\x3c\\x74\\x23\\xcc\\xf9\\x8e\\x17\\xe7\\xb5\\x19\\x1e\\x33\\x9b\\x10\\xdd\\x64\\xe8\\x0b\\xc2\\xc6\\xe7\\xe4\\xac\\x25\\x50\\xc6\\xf1\\x87\\x8a\\xaf\\x7f\\xa7\\x78\\x7e\\x36\\x94\\x81\\x67\\x1f\\xed\\xfa\\xba\\x59\\x2c\\x04\\x03\\xb4\\xd1\\xd5\\xc4\\x83\\x6a\\xd2\\x3f\\x5c\\xcd\\x7c\\x1e\\xbf\\x0c\\xa7\\x6b\\x41\\x33\\x11\\x0d\\xe0\\x45\\xbd\\xa3\\x06\\xb8\\xdf\\x77\\x5e\\xcb\\xa7\\x8a\\xc5\\x59\\xe9\\xce\\x56\\x12\\x8d\\x84\\xe5\\x93\\x78\\x4e\\xb2\\x9c\\x8b\\xdf\\x03\\x3b\\x1e\\x1f\\xcb\\x2a\\x16\\xcf\\xd9\\x9e\\xa5\\x22\\xb1\\x25\\x3d\\x57\\x16\\x06\\x74\\xcf\\x9c\\x90\\xf4\\xd5\\x1d\\x1f\\xc2\\x7d\\x56\\x8b\\xfc\\x15\\x3f\\xf2\\xfa\\x3c\\x7f\\x21\\xf3\\x6b\\x33\\xb4\\x7b\\xe6\\x90\\x53\\x7b\\xcf\\x8c\\x10\\x1f\\xda\\xca\\xe4\\xd8\\xf7\\x78\\xc0\\x8e\\xa1\\x10\\x7e\\xcf\\x20\\x15\\xa2\\x6a\\x5d\\xde\\xf1\\x22\\xfb\\x8d\\xd3\\x0b\\xce\\x82\\xbd\\x1b\\x18\\xfd\\x4d\\x4b\\xf4\\x59\\xe2\\x74\\x96\\xda\\xa1\\xb7\\x72\\xef\\x3a\\x3d\\xe9\\x66\\x47\\x19\\xba\\x40\\xc2\\xad\\x68\\x5c\\xab\\xbf\\x34\\x97\\x43\\x4e\\xce\\x2c\\xc2\\x90\\x03\\xaf\\xa5\\x19\\xf7\\x8e\\xa0\\x06\\x85\\xa3\\x2d\\xf5\\x4e\\x55\\xc3\\xfd\\x55\\xa0\\x45\\xd5\\xa6\\xd9\\x11\\x50\\x4e\\x8f\\x09\\xf5\\x03\\x22\\x88\\xe6\\x6c\\x0d\\x0e\\xa7\\x6f\\xba\\x2a\\xd0\\x6f\\x91\\x6b\\x1b\\x56\\x48\\x64\\xf6\\x93\\x54\\x3a\\x47\\xd2\\x85\\x1c\\x2b\\x35\\x18\\xb8\\x2b\\x3c\\x5f\\xef\\x1b\\xed\\x84\\x63\\xb9\\x16\\xe9\\x55\\x56\\x5c\\xe9\\x89\\x24\\x33\\x87\\xd3\\x5f\\xfd\\x34\\xe8\\x5a\\x6c\\x9a\\x5b\\x3f\\x0d\\x6c\\x5b\\x7c\\x10\\x4f\\x0e\\x17\\x69\\xbf\\xdf\\x8b\\x14\\xd4\\x01\\x88\\xcb\\x2f\\xb5\\x9e\\x25\\xce\\x2c\\x52\\xfe\\xc6\\xdd\\x1c\\xef\\xd4\\x77\\x77\\xe7\\xf5\\xba\\x2f\\xe2\\xfe\\xe6\\x30\\xc8\\x48\\x37\\xfb\\x6d\\x0f\\x16\\x15\\xd3\\x24\\x40\\xa2\\xc8\\x15\\x0c\\x1c\\x05\\x2c\\x6b\\x13\\xdd\\x84\\x9b\\x70\\x3e\\x27\\xf1\\x1c\\x5d\\x3e\\xa5\\x8a\\xbe\\x37\\x79\\xe9\\xdd\\x18\\xd9\\xd0\\x2b\\x23\\x5c\\xc6\\x59\\x05\\x9c\\x46\\xb6\\x6d\\xaa\\x4b\\x85\\x7c\\x02\\x09\\x7d\\xea\\x4f\\xab\\x42\\x49\\x79\\xbc\\x81\\xb4\\x9d\\xf4\\xda\\xf3\\xd0\\x8f\\x03\\x2d\\xde\\x85\\xc6\\xb1\\x6f\\x77\\x3a\\xc3\\x54\\x89\\x91\\xc0\\x9e\\xca\\x9e\\x20\\x54\\x0a\\xb9\\x29\\x41\\x80\\x4c\\xcf\\x2b\\x9e\\xa8\\xd9\\xb6\\x99\\xaa\\xa3\\x3b\\xd3\\x1d\\xaa\\xa6\\x2f\\x77\\x4a\\x48\\xec\\x19\\x1d\\x09\\x93\\xe0\\xec\\xe4\\x29\\x9d\\x6d\\xef\\x3a\\x99\\x77\\xe7\\xaf\\x03\\x53\\x0f\\x2e\\x64\\x60\\xba\\xf3\\x5f\\x60\\x3f\\xf1\\x9c\\xee\\x16\\x30\\xed\\xbc\\x2f\\x86\\xc9\\x6b\\x3d\\xb0\\x2f\\xed\\xc5\\xac\\xc1\\x5c\\x74\\x4a\\xa7\\x09\\x9b\\x66\\x0c\\xcb\\xe4\\xf3\\x40\\x65\\x9c\\x20\\xed\\x2e\\x13\\x24\\xa4\\x6b\\xf1\\x81\\x4d\\x60\\x4a\\xe0\\x54\\xbb\\x6b\\x6f\\xb8\\xf2\\xcf\\x96\\xd2\\x81\\x1f\\x07\\x10\\x19\\xda\\xfb\\xae\\x9e\\x77\\xcc\\x54\\xf2\\xe8\\xba\\x84\\x18\\xe4\\x07\\xb0\\xa3\\x2b\\xc8\\x7a\\x50\\xbc\\xa5\\xd2\\xb5\\x39\\xec\\xa2\\x9c\\x38\\x09\\x65\\x4a\\x0c\\x12\\xb8\\x22\\x72\\x12\\xac\\x47\\xbc\\xa7\\xfa\\x6c\\x05\\x6e\\xd1\\x9c\\x40\\x7a\\x4f\\x18\\x61\\x44\\xba\\x2e\\x3c\\x1a\\x5d\\x30\\xc4\\xa5\\xd8\\xb6\\x67\\x42\\x58\\xb3\\x6d\\x27\\xa6\\x8f\\xcc\\x89\\x09\\x01\\x6e\\xdb\\x33\\x2e\\xd3\\xb8\\x48\\x13\\xf9\\xc9\\xc0\\x90\\x58\\xe1\\xc0\\x81\\x9e\\x88\\xa2\\xe2\\xc3\\x0f\\xd0\\xbe\\x55\\x8d\\xe5\\x40\\x93\\xa6\\x79\\x60\\x4e\\xd8\\x34\\xd6\\x73\\x0b\\x76\\xbd\\x4d\\x84\\xbf\\x0b\\xdc\\x1d\\x4a\\x7e\\xf7\\x74\\xc6\\x9a\\x66\\x96\\xd8\\x76\\xe8\\x1d\\xdc\\x77\\xcc\\x39\\xc0\\x1e\\x18\\x56\\x0f\\x15\\x8d\\x3c\\xde\\x34\\x4e\\xe2\\x31\\xb7\\x6c\\x9a\\x98\\x78\\x7e\\xe0\\xa6\\xee\\x3d\\x5a\\x84\\xdb\\x76\\xe4\\xdc\\x43\\x25\\x73\\xc6\\xe4\\x74\\x4b\\xdf\\x31\\xa7\\x82\\x82\\x40\\xec\\xdc\\x82\\x98\\x58\\xf1\\xe1\\x8e\\xde\\x0e\\x01\\xe1\\x4e\\x08\\x96\\x39\\xbd\\xf5\\xef\\x70\\x46\\x2b\\xbf\\xf0\\xef\\x02\\x21\\x5b\\xde\\xab\\xa7\\x9c\\xa0\\x5b\\x83\\x3c\\x2e\\x12\\xbc\\xb7\\x7c\\x10\\x0d\\xa0\\x23\\x4f\\x35\\x59\\x5f\\x25\\xeb\\xbb\\x95\\x6b\\x70\\xef\\xdf\\x89\\x8a\\x36\\x1c\\x39\\x1d\\x69\\xc1\\x76\\x0b\\x19\\x69\\x7f\\xa7\\xb8\\x73\\x4b\\xb9\\xf7\\x37\\x27\\x81\\x9c\\xb8\\x7b\\x91\\x74\\xb3\\x58\\xdb\\xb6\\x93\\xf8\\xb7\\xa2\\x87\\xa9\\xf8\\x11\\xdd\\x93\\x3b\\xb4\\xc2\\x01\\xe3\\x29\\x7d\\xa5\\x8f\\xd3\\x4a\\xd0\\xf5\\x13\\xb7\\x22\\xc0\\x3d\\xd5\\x83\\x14\\x2a\\xc8\\x88\\xab\\xdd\\x33\\x52\\xa8\\x06\\xa6\\xdb\\x4f\\x43\\xe4\\x08\\x48\\xe8\\xcc\\xb8\\x14\\xf1\\x52\\x1f\\x1e\\xf9\\xa8\\xaf\\x17\\xb8\\x5b\\x80\\x6e\\xda\\x34\\xc6\\x27\\x41\\x0b\\x21\\x43\\xab\\x81\\x15\\xdc\\xd1\\xe3\\x05\\xb1\\x18\\xb9\\xca\\x1d\\xcc\\x56\\x04\\xf2\\x0b\\x99\\xfe\\xe6\\x84\\x20\\xe5\\x5d\\x95\\x71\\x4f\\x7d\\x53\\x21\\xd2\\xef\\xf3\\x59\\x2a\\x60\\xb7\\x69\\xa2\\x19\\xa5\\xb7\\x82\\xe4\\x38\\x21\\x8d\\x48\\x0f\\x69\\x77\\x2a\\xbb\\x9b\\xab\\x87\\x3e\\x2a\\x96\\x54\\x09\\xf0\\x36\\xd8\\x24\\x37\\xd9\\x26\\x93\\x9e\\xce\\xd1\\x70\\xac\\x99\\x1a\\x2b\\xd9\\x53\\xff\\xc8\\x9c\\x9a\\x39\\x7b\\x02\\x11\\x91\\xea\\xb1\\x93\\xca\\x2f\\x89\\xa2\\x91\\x5b\\x4d\\xb3\\x3c\\xcb\\x14\\xa9\\x8a\\xc8\\x11\\x88\\xfc\\x87\\x40\\xce\\x34\\xa7\\xf3\\x79\\x36\\x08\\xb7\\x61\\xb6\\xcb\\x75\\xbb\\x03\\xcd\\xd7\\x23\\x73\\xb2\\x9b\\xb5\\x6d\\xcb\\x6e\\xe0\\xa3\\xa0\\x6b\\x9d\\x9e\\x38\\x5b\\xac\\x89\\x0e\\x2a\\xa0\\xe8\\xac\\x75\\x25\\x0f\\x8b\\xb2\\xc5\\x0b\\x59\\xa5\\x67\\x3d\\xb7\\x5c\\xcb\\x6a\\x8d\\xb0\\x41\\xda\\xa1\\x26\\x02\\x7e\\x93\\xd9\\xf6\\x53\\x5f\\x65\\x26\\x10\\x0d\\x24\\x37\\x5c\\xa6\\x76\\xaa\\xe7\\x2e\\x15\\xc9\\x2a\\x69\\xf7\\x9a\\x77\\xd5\\x14\\x1a\\x7b\\xd8\\x03\\xd8\\xfb\\xa1\\xc3\\x48\\xa7\\x46\\x31\\x9c\\x4f\\x6e\\x56\\x66\\xd0\\x04\\xcd\\x66\\xdd\\xc9\\x32\\x39\\xec\\x51\\x0d\\xbd\\x82\\x7b\\x6a\\xad\\x2c\\xa8\\x68\\x62\\xdb\\x7e\\x00\\x47\\xb1\\xb3\\x6a\\x7a\\x0b\\x0f\\x02\\xd5\\xa0\\xad\\xaa\\x36\\xd7\\x75\\x04\\xca\\xb9\\x23\\xf0\\x8e\\x3e\\xce\\xa9\\x14\\x38\\x6a\\x6f\\xed\\x0e\\x22\\x27\\x35\\xcd\\x72\\x0d\\x4f\\xf4\\x41\\xef\\x49\\xb1\\x2e\\x77\\x32\\x78\\x95\\x34\\x35\\x48\\xc9\\xe6\\x7e\\x46\\xe9\\x93\\x6d\\xab\\x40\\x53\\x39\\x7d\\xf0\\xef\\x03\\xb2\\xb9\\x9f\\xcf\\x25\\x5e\\xb0\\xed\\x9c\\x9c\\xf6\\x9d\\xa3\\x61\\x49\\x99\\xbf\\x9f\\xcf\\x91\\x64\\x96\\x8e\\xd8\\x78\\x3b\\x42\\x4e\\x8a\\x5f\\xcb\\x89\\xd2\\xc8\\x8a\\x36\\x1e\\xe9\\x3b\\xd2\\x46\\xa8\\xfe\\xa4\\xb3\\x52\\x54\\x63\\xdb\\x87\\xc5\\x02\\x12\\xdb\\xae\\x74\\x76\\xc4\\x44\\x87\\x39\\xbd\\x87\\xc8\\xb6\\x45\\x47\\x0e\\xc3\\xb6\\x42\\xd9\\x56\\xe9\\x54\\x70\\xc4\\xa6\\xfa\\x13\\xf0\\xc3\\xcd\\x4a\\xd9\\x70\\xdd\\x2f\\x16\\xa4\\xf2\\xef\\x83\\xa6\\x39\\xe2\\x5f\\x47\\xfc\\xd0\\xaf\\xa5\\x59\\x44\\x46\\xc8\\xe6\\x28\\x10\\xc9\\x91\\xb4\\x1a\\x3b\\x64\\x70\\x24\\x70\\x67\\xdb\\x02\\x29\\x1f\\xbb\\xd5\\xb1\\xed\\x43\\x17\\xa7\\x44\\x00\\xde\\xc0\\xc4\\xc0\\xc9\\xfa\\x23\\x7c\\x39\\x36\\xb8\\xa5\\x35\\x81\\xaa\\xed\\xc8\\x21\\xea\\x03\\x89\\x9b\\xe8\\x7c\\x3b\\x9a\\x4a\\x9b\\xac\\x2c\\x9f\\xe6\\xb5\\x95\\x8d\\x02\\x46\\x2e\\xf9\\xcc\\xe0\\xb4\\x67\\x09\\x39\\xc9\\xb3\\xb3\\x14\\x1d\\xfe\\x7a\\x78\\xd2\\xe6\\x44\\x8b\\x05\\x49\\xe8\\x13\\x73\\x42\\x3f\\x0a\\x08\\x24\\xfe\\x43\\xe0\\x75\\x56\\x08\\x2e\\xd7\\x4f\\x9b\\x84\\x7e\\xe6\\x30\\x78\\x2f\\x28\\x9c\\xa0\\x7b\\x49\\x77\\xd0\\x4e\\x99\\x61\\xe0\\x9c\\xf5\\x47\\xf0\\x43\\xb7\\x5c\\xa4\\xa3\\xa2\\xab\\x46\\x4c\\x08\\x3a\\x15\\x64\\xc9\\xb6\\x19\\x94\\x54\\xcc\\x66\\xea\\x30\\x5a\\x74\\xcd\\x08\\xda\\x22\\x6d\\xa8\\x38\\x9e\\x1b\\x08\\x16\\x4b\\xfb\\xe8\\xe1\\x1a\\xde\\xd2\\x52\\xf0\\x50\\xa5\\x71\\x42\\x4a\\x40\\xd3\\xb3\\x9b\\x17\\xb6\\x6d\\x7d\\xfb\\xa5\\xd8\\xdd\\xce\\x1d\\x1e\\x30\\x10\\x25\\x5e\\x77\\x4e\\x05\\xd2\\x27\\xc5\\x74\\xc0\\x3a\\x88\\x1d\\xd2\\xa1\\x99\\x5b\\x3c\\xd9\\x46\\x34\\x83\\x46\\x7f\\xb4\\x77\\x42\\x70\\xee\\x34\\xce\\x32\\xc5\\x04\\xa5\\xc6\\x0c\\x89\\xe8\\x2f\\xf1\\x57\\x01\\xcc\\x3a\\x23\\x34\\xbe\\x29\\xf0\\xe8\\x77\\xa0\\x9d\\x83\\x1e\\x65\\xdc\\x6a\\x41\\x40\\x32\\xd6\\x7a\\x9c\\x6d\\x46\\x7f\\x5d\\x9a\\x4e\\xe3\\xda\\xfd\\xd0\\x5b\\xb9\\x23\\xd2\\x9d\\x2d\\x16\\xd8\\x4f\\x31\\xda\\x2c\\x00\\x63\\x20\\x39\\xbd\\x1b\\xa0\\x4b\\xc1\\xeb\\xee\\xa9\\x1c\\x8c\\x9f\\x23\\x65\\x4d\\xe8\\xfe\\x83\\x63\\xd2\\x7e\\x8f\\xb7\\x9a\\xbc\\x4d\\xfb\\x3f\\x2a\\x6f\\xcf\\x5b\\x4d\\x70\\x33\\x58\\x8b\\x41\\x26\\x9d\\x91\\x69\\xc5\\xd0\\xb7\\x96\\x8d\\xfd\\x4b\\x05\\xb4\\x00\\xd7\\x27\\x32\\x0a\\xbe\\x9c\\xa2\\x69\\x76\\x0e\\x83\\x92\\x10\\x27\\x41\\x03\\x24\\xe0\\xf0\\x3b\\x1e\\x98\\x04\\x78\\x0b\\xa6\\x59\\x0e\\x7d\\xd0\\xde\\x7c\\x16\\xd1\\x46\\x39\\xca\\xbc\\x15\\x5d\\x2f\\x1e\\xe0\\xdc\\xb4\\x87\\xce\\x66\\x39\\xec\\x1d\\x02\\x43\\x8b\\xc7\\x0b\\x2e\\x2f\\xeb\\x0f\\x18\\x90\\x4e\\x7b\\x35\\x4e\\x98\\x6a\\x77\\x8c\\xfb\\xd0\\x00\\x7f\\x57\\xf1\\x84\\x7e\\xf4\\x27\\x69\\x7e\\x6f\\x81\\xf5\\x27\\xa9\\x28\\xea\\x75\\x74\\x23\\x0d\\x91\\xc8\\x2f\\x24\\xd5\\xa6\\xb9\\x63\\x52\\x5f\\xd4\\xa0\\x6e\\x74\\xc7\\xb3\\x74\\x57\\x37\\x8f\\x59\\x5c\\xef\\x2c\\xb8\\x70\\x36\\x1d\\x79\\xd2\\xa0\\xcb\\x1d\\x5b\\x6e\\x81\\xd5\\x1d\\xa1\\x0e\\xf5\\x4d\\xde\\xda\\x7d\\x21\\xbd\\x98\\x7a\\xdb\\xaf\\x33\\x9b\\xe6\\xc9\\xa1\\xa1\\x62\\xec\\x1a\\x5d\\x00\\x8c\\xc1\\x0c\\x0d\\xcc\\x71\\x27\\x58\\x18\\xb0\\xcf\\xfa\\x9d\\x71\\xcb\\xac\\xdd\\xc0\\x55\\xc9\\x4b\\xe3\\x6c\\x1a\\xa5\\x98\\x9b\\x5d\\x56\\xcc\\xf5\\x73\\xa1\\x5d\\xcf\\xd0\\x30\\xe9\\xd2\\xc2\\xa9\\x90\\x5c\\xa3\\x6e\\xf5\\x66\\xe9\\xaa\\x67\\xdf\\x9d\\xf5\\x09\\xe5\\xa6\\xcd\\xd9\\x0a\\xf8\\x61\\x80\\x9a\\x5a\\x6f\\x34\\xe3\\xae\\x13\\x5f\\xb4\\xa1\\x8b\\x0d\\x1b\\xba\\xd8\\xb4\\xa1\\x23\\x90\\xb2\\xd6\\x61\\x64\\x53\\xe0\\x9e\\xa7\\x35\\xc6\\x4f\\x3c\\x54\\xb4\\xee\\xad\\xa7\\x54\\x92\\x6f\\xb9\\x96\\x8c\\xc7\\x78\\xa8\\x3a\\x6d\\x50\\xa1\\x68\\x19\\xad\\x0d\\xa2\\x06\\x85\\x0c\\x47\\x57\\x6b\\x3b\\x34\\x0c\\xfe\\xf4\\xeb\\xf7\\xaf\\xbe\\x2c\\x23\\x5a\\xcb\\x47\\x28\\x7a\\x13\\xc8\\xba\\x7b\\x44\\xeb\\xc4\\x07\\xdd\\x08\\x22\\x9d\\x01\\x8e\\x83\\x77\\xf4\\xfa\\xed\\x4b\\x0c\\x25\\xb1\\x3d\\x3e\\xdf\\x5e\\x7b\\x37\\x8e\\xe7\\xbe\\xdc\\x5e\\x6f\\xd7\\x37\\x0d\\x79\\x76\\x0d\\x8f\\xf4\\xfa\\xed\\xd2\\x7f\\xeb\\xfe\\x69\\xeb\\x6f\\x97\\x10\\x3c\\x7f\\x76\\xdd\\x2b\\x32\\x9e\\xf4\\xbc\\x66\\x89\\x33\\x08\\x46\\x15\\x76\\xe7\\x2a\\xc5\\x32\\xad\\xf8\\x61\\x60\\x30\\x22\\x18\\x66\\x7d\\xf6\\xaf\\xe3\\xb3\\x41\\x0c\\x68\\x52\\x19\\xb5\\x48\\x86\\xc2\\x33\\x6b\\xd0\\x89\\x7a\\x86\\x6c\\x7c\\x5f\\xf8\\x3c\\x76\\x16\\x76\\xf0\\xb1\\xb3\\x5b\\xed\\xaa\\x94\\xcc\\xb2\\x8a\\x8c\\xb6\\x09\\xa9\\x99\\xd2\\x31\\x11\\x1f\\x6a\\xb9\\x0f\\xad\\x46\\x6e\\xe8\\x4a\\x76\\xa1\\xd5\\xb5\\x5c\\x88\\x9c\\x11\\xfa\\xab\\xc0\\x38\\xd7\\x71\\x18\\xb5\\xdc\\xa2\\xac\\x1d\\x34\\xb4\\x21\\x16\\x01\\xa9\\xde\\xd0\\x48\\x1c\\xcd\\x27\\x7a\\x19\\x42\\x02\\xd5\\xd8\\x54\\x17\\xed\\x59\\x3c\\x3f\\x0e\\x5c\\x3f\\x70\\x87\\x59\\x1c\\x06\\x6a\\x04\\xe1\\xd4\\x08\\x86\\x6e\\xd2\\x18\\xf2\\xd6\\x08\\xcf\\xea\\x9c\\xd0\\x60\\x6f\\xca\\x72\\xcb\\x0c\\x3d\\xab\\xd8\\x23\\x91\\x64\\x2e\\x40\\x6f\\xd3\\xa3\\xa7\\x7c\\x1c\\x8e\\xd7\\x61\\x44\\x4f\\xb9\\xa1\\x41\\x47\\x7d\\x2b\\x5d\\x75\\x5a\\x30\\x84\\xae\\xce\\xc3\\x80\\xfb\\x61\\x00\\x18\\x8e\\xb8\\x57\\xcd\\x28\\xc5\\xa0\\x59\\x48\\xce\\x82\\xc3\\x00\\xf3\\xf7\\xca\\xe3\\x98\\x9e\\x85\\xc4\\x5d\\x7b\\x7a\\xcf\\x39\\x31\\x71\\x63\\x82\\x0a\\x59\\xc5\\x7e\\x61\\x66\\xfd\\xe6\\x0d\\xde\\xe6\\x68\\xc7\\xe7\\x32\\x88\\x3b\\x33\\xb0\\x89\\x09\\x1e\\xb5\\xf6\\xa4\\x42\\x04\\x23\\x97\\x35\\x5b\\xe3\\x7c\\x4f\\x9f\\xe2\\x7d\\xb0\\xe0\\x8a\\x60\\x80\\xd3\\xa9\\x83\\x9f\\x99\\xca\\x79\\x6e\\x87\\x65\\xdb\\x0f\\x1d\\x47\\x23\\x4a\\xb8\\x5d\\x2f\\xb4\\x17\\x68\\x2b\\x8d\\x99\\xdf\\xc3\\x6f\\x32\\xd6\\xcc\\xf6\\xf8\\xdc\\x79\\xe9\\x6f\\x1f\\xb7\\xbf\\x04\\xf3\\x1b\\xe2\\xbf\\xbd\\x09\\x9e\\x37\\x2a\\xfe\\xcc\\x73\\x0c\\x37\\xf3\\x19\\xed\\xc2\\x67\\x4f\\x33\\xce\\xc8\\x25\\x0f\\xd6\\x7f\\x72\\x8b\\x4a\\xcd\\x46\\x44\\xad\\x97\\x52\\x44\\x5c\\x05\\xb6\\x6d\\xdd\\xc8\\x67\\x2d\\x95\\x2d\\xd6\\x41\\x1f\\x9f\\xed\\x86\\x7e\\xec\\xf9\\x52\\xa8\\xc5\\xd3\\xf5\\xc0\\xfd\\x4d\\x07\\x1f\\x81\\x59\\xd4\\x34\\xb3\\xc8\\x17\\xd9\\x35\\x4b\\x38\\x0b\\x9b\\x26\\x5c\\xca\\xf0\\xda\\x9e\\x13\\x36\\xcd\\x7b\\xa2\\xe0\\x83\\xb8\\x67\\x31\\x8d\\xc3\\xee\\x1b\\x6a\\x77\\x74\\x10\\x93\\x90\\x86\\x57\\x59\\x71\\xac\\x59\\x11\\x89\\x2e\\x17\\x9e\\xd8\\xc9\\x6e\\x08\\x66\\xdc\\x6b\\x28\\x96\\x18\\x00\\x56\\x10\\x5e\\x2c\\x09\\xa1\\x36\\x3b\\xc2\\xed\\x3b\\x11\\xab\\x25\\xc7\\xd5\\x84\\x77\\xca\\x82\\x51\\xb4\\x76\\x1e\\xc0\\x37\\x94\\x71\\x84\\xa3\\xab\\xac\\xb8\\x0a\\xc9\\x00\\xd7\\xaa\\x38\\xce\\xc4\\x53\\x0f\\x52\\xd4\\x90\\xa3\\x42\\x5b\\xb7\\x08\\x30\\xc5\\x8c\\x08\\xdd\\x76\\x9b\\x21\\x1f\\x3b\\xe8\\x46\\xfe\\x8b\\x80\\x40\\x8c\\xae\\x96\\xc6\\x71\\xa7\\x63\\xec\\x77\\xba\\xc6\\xfd\\x27\\xe4\\x81\\x98\\x80\\x19\\xb5\\x9b\\xe6\\x30\\xd8\\x22\\x94\\x81\\xd9\\x9c\\xe1\\x89\\xe4\\x0c\\x8a\\xe9\\xea\\x64\\xf6\\x61\\x33\\xc4\\x1d\\xc7\\x39\\x9c\\x32\\x1b\\x7c\\xbf\\xac\\x38\\x8b\\xdf\\x7b\\xea\\x17\\xa1\\xdb\\x29\\x88\\xeb\\x74\\x66\\xf3\\xbd\\xf1\\xb2\\x1e\\x4d\\xdf\\xcb\\xee\\x71\\x38\\x1a\\xa6\\x9f\\x88\\x58\\x64\\x1d\\xe6\\xd3\\x61\\x0a\\xfd\\xb4\\x9b\\xcf\\x8c\\x93\\x1d\\xb1\\x11\\xe0\\x3d\\x2d\\x84\\x68\\x2d\\x80\\xff\\x73\\xb9\\x85\\xe4\\x24\\x1e\\x9b\\x43\\xc5\\xdf\\x39\\x9e\\xfb\\xf7\\xa2\\xce\\xf2\\x06\\x1d\\x44\\xaf\\xe1\\x0b\\x7a\\x42\\xbb\\xab\\x8a\\x17\\x78\\x48\\x25\\x2d\\x2f\\x8e\\xe2\\xb9\\xe0\\x4f\\x78\\xd0\\x24\\x8a\\xb9\\xb3\\x55\\xbb\\xe9\\x51\\x72\\x9c\\x55\\xd3\\x51\\x2f\\x25\\x16\\xee\\x06\\x1c\\x69\\x33\\x05\\x86\\x87\\x08\\x44\\x86\\xf3\\xe9\\xd7\\x40\\xab\\xd2\\x8d\\x14\\xa5\\x46\\x40\\xbc\\x9c\\x1d\\x9d\\x48\\x5b\\x3b\\x29\\x91\\xb5\\x27\\x8a\\x71\\x0b\\x47\\x79\\x4a\\x7d\\x31\\x92\\xa8\\x1f\\x4c\\x1c\\x69\\x8f\\xa3\\x72\\xb0\\x19\\x1e\\xfc\\x46\\xba\\xfe\\x5e\\x63\\x8d\\x31\\x23\\x0d\\x42\\xb4\\x63\\xc7\\xa9\\x98\\xf3\\x7a\\x31\\x4c\\xd1\\xdb\\x44\\xa0\\xd3\\xd4\\x45\\x46\\x66\\x11\\xc4\\x82\\x6d\\xd8\\x19\\x85\\x91\\x61\\xe9\\x7d\\x16\\x98\\x14\\xa6\\x85\\x28\\x2f\\x8f\\xdc\\x0c\\xd4\\x3e\\x1c\\xb0\\xf2\\x76\\x32\\xe9\\x62\\x22\\x56\\x24\\xa5\\x1d\\xd6\\x6d\\x9a\\x73\\xd2\\xe8\\x61\\x3d\\x7d\\x64\\x75\\x04\\x37\\x77\\xd5\\xe9\\xf3\\x71\\xdb\\xcb\\x0d\\x12\\x07\\x9b\\xc8\\xb6\\x23\\x31\\x65\\x9b\\xb1\\x9f\\x52\\xe2\\xf4\\x6e\\xd2\\x2f\\xd7\\x6b\\xdb\\x76\\x52\\x2f\\x95\\x66\\x2b\\xca\\x42\\x74\\xec\\x4a\\x7d\\x81\\x93\\xc0\\x00\\xb3\\xe4\\x94\\x74\\x27\\xc0\\x83\\xd3\\xae\\x11\\x51\\x4a\\xfa\\xa3\\x8f\\x8e\\x84\\x26\\xc4\\x4d\\xd0\\x7a\\x20\\xe6\\x4f\\x93\\x66\\x14\\xde\\x44\\x90\\x5b\\xc5\\x48\\x15\\xe8\\x8b\\x23\\x91\\x01\\xd1\\x81\\x6b\\x25\\xdd\\xd3\\xc8\\x5b\\xd0\\x06\\x57\\x61\\x6d\\x24\\x13\\xea\\xc1\\x0c\\x25\\xa0\\x56\\xbe\\x3a\\x0a\\x11\\x5f\\xec\\xa0\\xcf\\xf2\\xdc\\xd1\\x44\\xce\\x5d\\xac\\x5b\\x60\\x71\\x3c\\x1d\\x59\\xf9\\xec\\xc2\\x00\\x35\\xaa\\xc1\\xe5\\x06\\x29\\xaf\\x1d\\x02\\xb2\\x20\\x06\\x48\\x65\\x71\\xfc\\xf9\\xf8\\x52\\x04\\xb3\\x42\\x16\\xc7\\x8e\\x8e\\x23\\x3c\\x8a\\xa9\\xef\\x8e\\xde\\x35\\xc4\\x32\\x42\\x5a\\x33\\x62\\xe9\\x97\\xb2\\x9b\\xe3\\x2d\\xbd\\x1e\\x6e\\xe9\\xfe\\x88\\x5c\\x05\\x5c\\x3d\\x4d\\x58\\x88\\x68\\xc3\\x8c\\x73\\x97\\xcf\\x50\\xb9\\x65\\x99\\x14\\x4b\\x79\\x06\\x29\\x3c\\x36\\x19\\x21\\x79\\x19\\x67\\x95\\xc3\\xc0\\x3c\\x72\\x24\\x5d\\x09\\xc4\\x78\\x17\\xc3\\x14\\x4f\\x14\\xc5\\x28\\xc5\\xc5\\xd8\\xd2\\x43\\x15\\x10\\xd3\\x30\\x30\\x98\\x25\\xad\\xc4\\x91\\x97\\xf2\\x8e\\x0d\\x83\\x55\\xdd\\x9f\\xe5\\xf9\\x07\\x87\\x32\\xd1\\xc4\\xef\\x15\\xb9\\xd0\\xd2\\x1f\\x1b\\xbf\\xd9\\x1e\\x4e\\x80\\xa8\\xed\\x0f\\x4e\\xdd\\xd8\\xf4\\x59\\x14\\x57\\xd8\\xf9\\xc2\\x7a\\xa9\\xaf\\x8e\\x63\\x02\\x41\\xd3\\x9c\\x5a\\x62\\x48\\xfd\\x42\\x06\\x82\\x8e\\x3e\\x7d\\xb0\\x1e\\x53\\x59\\x20\\x0a\\x69\\x42\\x36\\xa9\\x99\\x50\\x5f\\x7b\\x1e\\x48\\xef\\x2d\\x3f\\x00\\x66\\x46\\xec\\x6b\\xdb\\x51\\x90\\x5f\\x41\\x10\\x7c\\x16\\xf4\\x9c\\xa6\\x71\\xf8\\x62\\x5c\\xed\\x11\\xf6\\x47\\x9f\\x16\\x4e\\xe1\\xc0\\x52\\xfd\\x53\\x82\\x27\\x8c\\x11\\x32\\x39\\x67\\xa8\\x28\\xc6\\xa3\\xc6\\x4e\\x10\\xc4\\xd3\\x4d\\x93\\x29\\xb9\\x11\\xa8\\xf5\\x0b\\xb4\\xd8\\xed\\x70\\x03\\x27\\xf0\\x79\\xaf\\x27\\xe3\\xcb\\x8a\\xbf\\xe3\\x15\\x5a\\x08\\xc1\\x08\\x9d\\x70\\xa2\\x59\\xec\\xaf\\xe8\\xf5\\xf6\\xf5\\xfc\\x3a\\x85\\xaf\\xe9\\xc9\\x30\\x0d\\xf8\\x6b\\xbf\\x3f\\xbf\\x16\\x23\\x3d\\x75\\x4a\\x6b\\xb5\\x9f\\x95\\x0b\\xa8\\xf3\\x15\\xea\\x3d\\x61\\x68\\x99\\x2b\\xf8\\x3c\\x2a\\x88\\x15\\x84\\x6d\\xb1\\xfc\\x82\\xe5\\x79\\xc8\\xa2\\xbb\\xe3\\xc0\\x67\\x8d\\xd1\\x09\\xf4\\xfb\\x35\\x0e\\x48\\x34\\xee\\xf6\\x14\\xb7\\x05\\xe5\\xdb\\x38\\x08\\x3b\\x2c\\x48\\x5a\\x46\\x67\\x6c\\x59\\x16\\x11\\xc7\\x83\\x8f\\xdb\\xbe\\xfe\\x5c\\x0b\\x6f\\x6c\\xb9\\xe7\\xfb\\xb2\\x7a\\x6f\\xdb\\x39\\x44\\x74\\xb6\\x82\\x94\\xf2\\xa6\\x59\\x29\\x3f\\xbf\\x5d\\x2f\\x38\\xce\\x56\\x9b\\x9d\\x6d\\x27\\x37\\xe9\\x26\\x95\\x74\\x78\\xe7\\xa7\\xfa\\xcc\\x2a\\xf7\\x57\\x01\\xe4\\x82\\x21\\x46\\xcb\\x41\\xf4\\xf9\\xab\\xcb\\xc3\\x8f\\xc5\\xd7\\x2c\\x3f\\x72\\x72\\x0a\\xe9\\x6c\\xad\\xc8\\x53\\x4c\\x67\\x6b\\xd8\\xd9\\xb6\\x93\\x79\\x59\\x27\\x3a\\xdf\\x3a\\x99\\x56\\xf4\\x12\\x37\\xf4\\x44\\xd7\\xdd\\x3b\\x6d\\x60\\x88\\xf6\\x5b\\x77\\xf4\\x34\\xa0\\x04\\x32\\x44\\xa1\\x3e\\x1b\\xd2\\xdd\\xdc\\x74\\x57\\x37\\x5d\\xa5\\x0e\\x82\\x21\\x2e\\x45\\x38\\xba\\x43\\x46\\xf2\\x60\\x2a\\x6a\\x74\\x44\\x36\\x83\\x78\\xd1\\xb1\\xa7\\xcf\\x28\\x6c\\xfb\\x6e\\xb9\\x63\\x82\\xb9\\x6a\\x9a\\x9d\\xa6\\xb2\\x2e\\x5a\\x78\\xea\\x8e\\xf7\\x5c\\x02\\x8d\\x6d\\x3b\\x75\\x22\\xd2\\x92\\xd6\\x88\\xc9\\x0d\\xb1\\xd7\\x4f\\xa2\\x1b\\x22\\xc8\\x46\\x70\\x8b\\x61\\x28\\x4d\\x2e\\x1f\\x64\\x28\\xb6\\x89\\x8b\\x5d\\x76\\x82\\xfe\\x4b\\x80\\xea\\x42\\x85\\x4f\\xc8\\x6f\\x9a\\x83\\x8c\\xa8\\x90\\xf1\\x24\\xf7\\x1b\\xc2\\x0e\\x22\\x22\\x58\\x0a\\xb2\\xd3\\xaa\\xe7\\x08\\xd6\\xb8\\x9d\\x9c\\xe4\\x86\\x46\\xb6\\x9d\\x2c\\x16\\x90\\xe2\\x53\\xba\\x58\\x90\\x56\\x6e\\x83\\x16\\xc6\\x2c\\x5c\\xc7\\x10\\xf4\\x95\\x33\\xd8\\x21\\xb3\\x32\\x73\\x54\\x48\\x48\\xad\\x9a\\x1f\\xdb\\x50\\xf6\\x23\\xd1\\xf1\\xe4\\x65\\x1b\\x6a\\x75\\x27\\x33\\x66\\x34\\x54\\xdc\\xf1\\x30\\xf3\\xc4\\xcd\\x37\\xb3\\x5d\\x0b\\x79\\x69\\x52\\xf4\\x3e\\xc2\\x99\\xae\\x23\\x6c\\x1a\\x03\\x9a\\x54\\x95\\xa2\\xd0\\x64\\x85\\x19\\x5a\\x0b\\xf2\\x5f\\xb2\\x7a\\xfa\\x4e\\x23\\x31\\xde\\xc8\\xb6\\x67\\x19\\x1e\\x27\\xe1\\xad\\x01\\x10\\x52\\x9f\\x41\\x28\\x11\\x97\\xa7\\x7e\\x1d\\xe2\\x86\\x01\\xc4\\x9e\\x3a\\xc7\\x0b\\x89\\x8b\\xeb\\xae\\x9a\\x17\\x4d\\x4c\\xf4\\xf9\\x6e\\xa9\\xdb\\x1e\\xdf\\x50\\x64\\x94\\x9b\\xea\\xf5\\x2c\\x6a\\x3b\\x0c\\x74\\x67\\xde\\x04\\xf3\\x25\\x4f\\x78\\x55\\x4d\\x1a\\xe6\\xfa\\xbe\\x55\\xf1\\x63\\x99\\xbf\\xe3\\x16\\x58\\x71\\x59\\x70\\x0b\\x0c\\x64\\xe4\\x58\\x02\\x71\\x5c\\x49\\xf4\\x60\\x11\\xd0\\x79\\x63\\x2b\\x00\\x51\\x10\\xa3\\x53\\x82\\x95\\xb0\\x2c\\xff\\xbd\\x72\\xb7\\x68\\x63\\x8b\\xe5\\x8a\\xb2\\xce\\x92\\xf7\\x96\\x20\\x86\\x65\\x5a\\xf1\\xe3\\x71\\x54\\x56\\x17\\x0b\\x02\\x88\\xa8\\x75\\xe0\\x45\\x8c\\x94\\x32\\xa6\\xa7\\x63\\xcd\\xea\\xa9\\x29\\x8b\\x5a\\x60\\xf9\\x23\\x7b\\x7f\\x9c\\xf8\\xc6\\x97\\x62\\x58\\xc6\\x86\\x5c\\x8a\\xee\\x3a\\x67\\xb3\\x5a\\xef\\x4c\\xc2\\xa9\\x03\\x42\\x76\\xd9\\x7a\\xd4\\xae\\x67\\xd3\\x08\\x90\\x37\\x8d\\x66\\xd4\\x31\\x5f\\x4a\\x87\\x32\\xb1\\xe4\\x05\\xc5\\xcf\\x86\\xfb\\x89\\xbf\\x0e\\x02\\xe7\\xac\\xd9\\xd4\\xb6\\xd3\\xe9\\x5b\\xaa\\x36\\x4c\\x2a\\x1c\\xfa\\xfa\\x84\\x58\\xbb\\xcf\\x8e\\x9c\\x78\\xdd\\xa3\\x43\\xe4\\xa0\\xa3\\xa5\\x5a\\x30\\x35\\x68\\xf1\\x2e\\x16\\x42\\x30\\xda\\x72\\xea\\x51\\x12\\x11\\xcb\\x41\\xdc\\xc8\\x4f\\xfc\\x55\\x30\\xb7\\x04\\xe4\\x59\\x01\\xb6\\x8b\\xb8\\x30\\xea\\x6b\\x95\\x37\\xc4\\xa5\\xf2\\x9a\\x8b\\xae\\x4b\\xad\\xc0\\x1a\\x4c\\x46\\x8e\\x24\\x7d\\x66\\xc1\\x16\\xe1\\xe3\\x87\\x6e\\x34\\xeb\\x80\\x94\\x41\\x4c\\xdc\\xb8\\x6d\\x81\\x1b\\x74\\x34\\x5e\\x1e\\x32\\xb4\\xc3\\x14\\x8b\\x03\\xe7\\x73\\xcc\\xfa\\x39\\x4e\\xfc\\x17\\x01\\xec\\x30\\x7a\\xeb\\x26\\x96\\xd3\\x4a\\x53\\xc1\\xcb\\x0b\\x4a\\x83\\x0f\\xe6\\x2c\\x47\\x74\\xd7\\x42\\xe8\\xaf\\xdf\\xb2\\xc0\\x7f\\x11\\x68\\xc4\\x00\\xa1\\xff\\x02\\xdf\\x05\\x62\\x20\\xc0\\x71\\x42\\x82\\x89\\x1b\\x19\\xf8\\xe4\\x54\\x71\\x2f\\x76\\xa7\\x77\\xec\\x30\\x3f\\x4d\\xbb\\x1d\\x8e\\x81\\xc2\\xf4\\x8c\\x71\\xbc\\x05\\x47\\x5d\\x6b\\xc6\\x81\\xe3\\x89\\xdd\\xe3\\x8e\\x4f\\x59\\x6a\\xaf\\x20\\x3a\\xbb\\x3f\\x82\\xe0\\xd5\\x7c\\x9d\\x38\\x2b\\x64\\x03\\xde\\x34\\x1f\\x80\\x17\\xee\\x0a\\x5a\\x8f\\x4e\\xee\\x1e\\x73\\x0d\\xc8\\x26\\x62\\x26\\xa7\\x39\\xd9\\x2e\\x59\\xd0\\x74\\xc1\\xf5\\xe0\\x88\\x23\\xf1\\x34\\xbe\\xea\\xeb\\x66\\xed\\x9d\\x75\\xd1\\xe5\\xe8\\xab\\x91\\x79\\xa9\\x82\\x3b\\xc4\\x73\\xa2\\x01\\x77\\xb1\\x48\\x9a\\x26\\xd5\\x10\\xdb\\xa5\\xb7\\xad\\xb4\\x9a\\xc5\\x13\\xef\\x9b\\x35\\xca\\xd8\\x19\\x5a\\xde\\x4a\\x2a\\xc4\\x09\\xdc\\x0e\\x5f\\xef\\x06\\xaf\\x1b\\xae\\x94\\xcc\\x91\\x1f\\x06\\xa3\\xb9\\x10\\x49\\xfd\\x74\\x98\\x6f\\x7a\\x07\\x89\\x3e\\xdc\\x09\\x12\\x2a\\x37\\x50\\x7a\\xbe\\x81\\x44\\x8e\\x5b\\xc8\\x08\\x0e\\xa0\\x8b\\x34\\x37\\x1e\\x89\\xa8\\x03\\x52\\x63\\x73\\x28\\xd6\\xf2\\x1b\\xbc\\x58\\x50\\xea\\xc1\\xe8\\x24\\xdb\\x8e\\x9f\\xc6\\xdd\\x62\\x1a\\xb2\\x7a\\x24\\xdf\\xdd\\xdc\\xb5\\x06\\x2c\\xf2\\x0b\\xcb\\x6a\\x77\\x0d\\xbb\\x32\\x8f\\xe5\\x87\\x01\\x63\\xe9\\xa9\\x8a\\x45\\xae\\xf9\\xdc\\x55\\x6f\\xce\\x6c\\x45\\x5a\\x59\\x7c\\x90\\x1d\\xc3\\xc6\\xcc\\x56\\xde\\x62\\x61\\x14\\x43\\x55\\x1f\\x56\\x4d\\x9a\\xc6\\xe9\\x5e\\x30\\x92\\xed\\x4c\\x64\\xb7\\xed\\x41\\xfe\\x9b\\x55\\xd3\\x38\\xdf\\x0c\\x66\\x25\\x07\\xbf\\x08\\x94\\xee\\xa8\\xae\\xb2\\x34\\xe5\\x2a\\xfc\\x40\\x65\\xdb\\x8e\\xe0\\x50\\x47\\xa9\\x8e\\x85\\xb5\\x59\\x42\\x9e\\xcf\\xc9\\xb2\\x4c\\x92\\x2e\\x85\\x8c\\x44\\xf0\\x6f\\x1d\\x72\\xca\\x55\\x78\\xdb\\x51\\xbc\\xcb\\x2f\\x7f\\xfc\\x5e\\xf9\\x4d\\xbd\\x2a\\x59\\xcc\\x63\\x0b\\xbe\\x85\\xd9\\x9a\\x00\\x9b\\xce\\x2e\\xa3\\x5d\\xca\\x2c\\x7a\\x9e\\x48\\x3b\\x5a\\x18\\x3a\\xe1\\xfb\\xf5\\x8d\\x18\\x2f\\x1d\\x6c\\x2b\\x2b\\x2a\\xf7\\x87\\x9c\\xd7\\x78\\x64\\x9c\\xcb\\x2a\\x5e\\x0b\\xa2\\xe6\\x1d\\x79\\xfd\\x26\\xdb\\xf3\\xf2\\xa1\\x76\\x54\\xd5\\xc4\\x75\\xf2\\x89\\x68\\x9d\\x97\\x7b\\x7f\\x9e\\xd7\\xe8\\x3a\\x21\\xf0\\x4d\\x07\\x45\\x21\\x9e\\x1c\\x8d\\x20\\x0b\\xe1\\xf1\\x6f\\xe8\\x6c\\x14\\xf1\\xe3\\x71\\x84\\x00\\xb4\\x50\\xa1\\x6c\\x86\\xa7\\x8c\\x4f\\x29\\x8d\\xf0\\xbc\\xa0\\xbb\\x43\\xac\\xe7\\xaf\\xc9\\x89\\x0b\\xe9\\x41\\xec\\xdd\\xdd\\x55\\x56\\x5c\\x45\\x44\\x37\\x83\\xb5\\xef\\x20\\xf2\\x77\\x01\\xcc\\x56\\xd8\\x42\\xe7\\x77\\x3a\\xb8\\xeb\\x4e\\x54\\x30\\xbc\\x45\\x27\\x96\\xb7\\xfd\\xcd\\x56\\x68\\xc6\\xea\\xa4\\x9e\\xd3\\x9f\\x50\\xea\\x50\\xc6\\xc4\\x75\\x6e\\x69\\x08\\xe1\\x25\\x74\\x76\\x6b\\xe8\\xb2\\x22\\x0c\\x7c\\xa6\\xb4\\xf7\\x9d\\x19\\x6d\\x88\\x4e\\x84\\x10\\x41\\xea\\xc5\\xfa\\x82\\x4d\\x4c\\xd9\\x81\\xfe\\x44\\x7a\\xe3\\x40\\xee\\x31\\xf7\\xd6\\xd3\\xfd\\x20\\x6e\\xe6\\x85\\x18\\xae\\x40\\x20\\xb8\\xa4\\xdd\\xc8\\x51\\x1f\\xea\\x2f\\x59\\xcd\\xa6\\xb6\\xfb\\x50\\xe5\\x2a\\x03\\x91\\x98\\xef\\xb3\\xb9\\x71\\xfe\\xd7\\x03\\xfb\\x77\\x0e\\x39\\x29\\x8d\\x94\\x54\\xb6\\x77\\x1e\\xa2\\x52\\x53\\xc9\\xa2\\x9d\\x20\\xab\\xb0\\x82\\xd3\\xc0\\xad\\x4d\\xb7\\x7b\\x6a\\x5b\\xc5\\xf8\\x2f\\xd5\\xad\\x81\\xf2\\x0c\\x5a\\x3c\\xcd\\xbf\\x5b\\xe2\\xcd\\x41\\x2d\\xfe\\xd2\\x35\\x7c\\xa7\\xc6\\x70\\xa4\\xe6\\x68\\xe0\\x3b\\xf3\\x6e\\xd4\\x3b\\xfe\\xfe\\xec\\x66\\xdb\\xae\\x9c\\xc3\\xba\\x63\\x5d\\x19\\x7c\\x2a\\x14\\x7d\\x8b\\x28\\xf3\\xcd\\x1e\\x04\\xca\\x80\\xff\\x14\\x51\\xd5\\x03\\x0c\\x79\\x1d\\x0e\\x33\\x51\\xed\\x16\\xd0\\xc2\\xd4\\x04\\x64\\x78\\xa6\\xda\\x05\\xc7\\x8e\\xc9\\x59\\xf9\\x08\\x0c\\x16\\x24\\x24\\xed\\x40\\x79\\x8a\\x13\\xe7\\x47\\x41\\xd3\\x38\\x83\\x77\\xb4\\x58\\x8f\\x5a\\x38\\xf2\\xfa\\xe2\\x0d\\x6d\\x58\\xe0\\x8e\\xbf\\x17\\x90\\x95\\x50\\xa3\\x38\\x0f\\x2e\\x1c\\x7c\\x27\\x7e\\x18\\xd0\\x68\\xa3\\xa1\\x5f\\xc0\\xba\\x71\\xe1\\x9f\\x93\\x10\\xd2\\x75\\x75\\x50\\x1d\\x84\\xc6\\xad\\x57\\xb1\\x3c\\x75\\x4a\\xfc\\x78\\x78\\xef\\x57\\x32\\xbe\\x5c\\xb6\\x37\\xab\\x34\\x2a\\x33\\x3a\\x1d\\x0c\\x63\\x19\\xc9\\x20\\x08\\xae\\xa0\\x91\\x2d\\xc8\\xad\\x3b\\x3d\\xf4\\xf3\\x62\\x4d\\x13\\x4e\\x28\\x6f\\x42\\xdb\\xee\\xb2\\x44\\x9e\\xa3\\x8e\\x7a\\x53\\x2e\\xa3\\x3b\\x41\\xbf\\xf7\\x15\\x57\\xa5\\x3e\\x15\\xcb\\xee\\xae\\x3e\\x0c\\x6b\\xe5\\xea\\xe3\\xa1\\x5a\\xf5\\xa2\\x2f\\x19\\x79\\x91\\x1b\\x92\\x73\\xc1\\xda\\x3c\\xf2\\x44\\x83\\x65\\x73\\xa9\\x52\\x73\\x3a\\xa4\\x47\\x44\\x3f\\x12\\x32\\xf8\\x26\\x18\\x55\\x34\\xe7\\xed\\xaf\\x95\\x0c\\x89\\x87\\xf7\\xd8\\x49\\x53\\xda\\x10\\xd5\\x5c\\x46\\x8f\\x45\\x77\\x39\\x1d\\x0e\\x01\\xf0\\xca\\xc6\\xd4\\x8b\\xa9\\x1f\\x02\\x0f\\x5c\\x27\\xa6\\x1c\\x62\\x1a\\xcb\\x54\\x3f\\x0e\\xdc\\x78\\xa0\\x46\\x42\\xcb\\xc5\\xf8\\xdc\\x72\\x51\\xc5\\xc8\\x4d\\xfd\\xd8\\x8f\\x82\\xa0\\x45\\x09\\x5e\\x6c\\xcc\\x4b\\xf7\\x60\\x9a\\xa0\\x65\\x0c\\x6b\\xb4\\x09\\xf1\\xf6\\x55\\x82\\xd2\\x77\\xc4\\xaa\\xa1\\x04\\x39\\xca\\xda\\x85\\xc1\\xff\\x40\\x6d\\x6d\\x8b\\x1b\\xfe\\x15\\x72\\x68\\xdf\\xc1\\xf7\\xea\\xf7\\x07\\x75\\x82\\x7d\\x92\\xc7\\xd7\\xcf\\xb7\\x6d\\xb3\\xf5\\xf5\\x73\\x40\\x9e\\x5d\\xc3\\x8f\\xf4\\xda\\xf1\\x3f\\x5b\\xfc\\x4f\\x40\\xae\\xd3\\x1e\\xef\\xfd\\x34\\x84\\x3c\\x73\\xad\\xce\\xa2\\xca\\xcb\\x3b\\x06\\xad\\x98\\xd5\\x6c\\x61\\xcd\\xfb\\xc8\\x6a\\x3f\\x82\\xb5\\x78\\xb6\\xb6\\xc6\\x0e\\xcc\\xd1\\xd8\\x64\\x29\\x26\\xe7\\xa7\\xf4\\x11\\x39\\x09\\x9c\\x14\\x51\\xab\\xae\\x1e\\x90\\xa6\\x47\\x78\\x8d\\x58\\xc2\\xf2\\xa3\\x7e\\x5d\\xbb\\x96\\x20\\x44\\xf2\\x0d\\x83\\xe3\\xcc\\xa3\\xb9\\x25\\x5f\\xe7\\x91\\xfb\\x83\\x0e\\x86\\xe3\\xa9\\xd3\\xe8\\xbf\\xbd\\xfe\\xf1\\x07\\x54\\x32\\x19\\x21\\xd5\\xbe\\x37\\xe0\\x5b\\x52\\xc7\\x88\\x0e\\x03\\x8e\\x45\\xed\\xe0\\xf4\\xed\\xc2\\xc2\\x5f\\x7d\\xbf\\x54\\x1f\\xf1\\x80\\xeb\\x95\\xf1\\xd6\\x42\\x3c\\x2c\\x33\\x20\\x93\\xdf\\x9b\\xd4\\x3a\\xea\\xf6\\xd4\\x97\\xe3\\x22\\xe4\\xf4\\xbd\\x62\\xa2\\x54\\x8c\\xb6\\x7f\\x7d\\xa8\\xd6\\x57\\xe3\\x5a\\xff\\x75\\xb1\\xda\\x57\\x83\\x6a\\xc7\\xe7\\x8d\\x67\\x8d\\x9c\\xef\\x6f\\x41\\x83\\x53\\x9a\\xd8\\x76\\x62\\x58\\xe4\\x0d\\x20\\x46\\x92\\x29\\x43\\x7d\\x8c\\x4c\\xc7\\xf7\\x88\\x77\\x12\\x69\\xe9\\x93\\x18\\x47\\x72\\xb3\\x57\\xf2\\x0b\\x58\\x6a\\x12\\x05\\xa8\\x1c\\x05\\x23\\x7a\\x8a\\x3a\\x57\\x16\\x63\\x7f\\xa6\\x7e\\x24\\xdd\\x65\\xc4\\xc3\\xb2\\x60\\x7b\\x0e\\x2b\\x34\\x17\\xea\\x22\\x1e\\x49\\xd0\\x94\\x1a\\x6f\\x13\\x47\\xc4\\x4a\\x99\\xf4\\x29\\x21\\xf0\\x93\\xf4\\xe2\\xf1\\xe3\\x40\\x30\\x1d\\xaf\\x10\\x2e\\xc6\\x5d\\x00\\xc1\\xc5\\x6b\\x7e\\x44\\x3d\\x9c\\x5f\\xec\\x2a\\xcf\\xb6\\x50\\xa2\\x36\\xf8\\x01\\x09\\x69\\x52\\x8a\\x25\\x2d\\x71\\xff\\x36\\xbe\\x80\\xbb\\xb7\\xb2\\x36\\xbb\\x28\\xad\\x2f\\x12\\x03\\xa5\\x87\\xca\\x48\\x44\\xcd\\x1f\\x30\\x13\\x31\\xf7\\xd7\\xc1\\x0d\\xf2\\xc4\\x1f\\xc8\\x23\\x07\\x2e\\x3f\\x4f\\x66\\x93\\xfb\\x62\\x72\\x50\\x92\\xcc\\xc9\\x56\\x70\\x38\\x31\\xd9\\x18\\x03\\x8d\\x05\\xbd\\x59\\xc8\\xc3\\xb9\\x6e\\x31\\x70\\x21\\xfa\\x66\\x6c\\xdb\\x9c\\x19\\xbc\\x70\\xbc\\x55\\xc1\\x1e\\xe1\\x5c\\xee\\x95\\x5f\\x94\\x30\\x35\\x01\\xd1\\xa3\\x5b\\xc3\\xcf\\xd6\\x40\\xc1\\x7a\\xb7\\x0c\\x12\\xe0\\x35\\xb4\\xdf\\x3f\\xf0\\x07\\xfe\\x61\\xe2\\xcb\\x3c\\x27\\xa4\\xe8\\x3f\\x95\\x3c\\x59\\x64\\x6e\\x61\\x11\\x0b\\x62\\xfa\\xaa\\xa7\\xb0\\x91\\x6d\\x63\\xb4\\xd8\\xc1\\xbd\\xd4\\x22\\x87\\xb1\\x29\\x4d\\x4b\\x8a\\x88\\x10\\xb7\\x0b\\xe9\\x4d\\x00\\x2f\\x28\\xea\\xa3\\x6d\\xc7\\xfc\\xbc\\x5b\\xe4\\x84\\xca\\x51\\xd1\\x07\\x19\\x64\\x94\\x16\\x4b\\xcc\\x25\\x3b\\x10\\xf7\\xda\\x0a\\x4e\\xa3\\xde\\xdf\\x93\\x16\\xcb\\x7f\\x61\\xb6\\x6f\\xca\\xf2\\xee\\xd8\\x05\\x2e\\xe9\\x27\\xa8\\x58\\xaa\\xd6\\x24\\x36\\xd8\\x58\\x59\\xd1\\xa9\\x12\\x29\\xa5\\x5c\\xea\\xd8\\xbb\\x0a\\xe3\\xc5\\x02\\xbd\\xd3\\x1c\\xd1\\x11\\xaa\\x6c\\x18\\x74\\xa8\\x50\\xb3\\x2c\\x01\\x45\\xc1\\x12\\x3c\\xbb\\x00\\xae\\xc5\\x89\\x14\\x5d\\xd9\\x66\\xb1\\x6d\\x23\\x02\\x41\\xf5\\x36\\xea\\x70\\x1c\\x81\\xb4\\xfa\\xbe\\x4e\\x5f\\x2a\\xab\\xa6\\x1f\\x73\\x58\\x9b\\x0e\\xf7\\xc9\\x85\\x88\\x10\\x0f\\x77\\x53\\x1e\\xc1\\x49\\x2a\\xcf\\x2f\\x6b\\x53\\xc7\\xba\\x2c\\x03\\x35\\xfa\\x61\\xb7\\xd4\\x51\\x20\\xaf\\xd9\\x18\\xa3\\xca\\xa9\\x55\\x92\\xfd\\x7c\\x31\\xba\\xce\\x74\\x66\\xd8\\xa2\\x39\\xf2\\x1e\\x53\\x31\\x81\\x20\\x90\\xd9\\x19\\xcc\\xbf\\x8c\\x3c\\xbd\\xb6\\x1a\\xdb\\x76\\xa1\\xd8\\x91\\x75\\x14\\xa9\\xee\\x07\\x76\\xa7\\x59\\x1a\\x37\\xd8\\x66\\x08\\x05\\x6a\\x2f\\x80\\x5a\\x43\\x66\\xdb\\xe6\\xca\\x89\\x2d\\x8a\\x06\\x06\\x3d\\x68\\xf4\\x9b\\x67\\x02\\x36\\x3f\\xbc\\x01\\x27\\x2b\\x89\\x72\\xce\\xaa\\xff\\xfe\\x60\\x3d\\x0a\\x26\\x25\\xc4\\x03\\x5e\\xd5\\x7f\\xae\\x02\\x35\\x1d\\x55\\xd6\\xc0\\x87\\xfa\\x01\\x49\\xab\\x34\\x13\\xda\\x5d\\x88\\x6b\\xf4\\x6d\\xb1\\x88\\x9b\\x86\\x0f\\xb4\\x28\\x09\\xf8\\x49\\x20\\xb6\\xc1\\xe5\\x85\\xd3\\x78\\x93\\x51\\xd5\\x3b\\xf3\\xae\\x16\\x85\\x14\\x12\\x3f\\x0d\\x80\\x0d\\x80\\x15\\x91\\x44\\x24\\xe1\\x5d\\x90\\xa5\\xf9\\x1c\\xd4\\x1b\\x02\\xa1\\xe1\\x32\\xba\\x73\\x08\\x70\\x53\\xbf\\xa0\\xf4\\x5b\\xff\\x4d\\xaf\\xfd\\xf9\\x22\\xf0\\x04\\x77\\x17\\x3f\\xdf\\x2e\\x1b\\xb2\\x8d\\xe7\\x8e\\xe7\\xfa\\xfc\\xab\\x00\\x3f\\x6c\\xe3\\x79\\x43\\xae\\xd5\\x4d\\x3e\\xf0\\x33\\xf5\\xad\\x37\\xe5\\xc1\\x02\\xeb\\xe7\\x2c\\xdd\\xd5\\x16\\x58\\x9f\\x97\\x75\\x5d\\xee\\x2d\\xb0\\x5e\\xf1\\xa4\\xb6\\x02\\x78\\x7d\\xe9\\xc2\\xd3\\xb0\\x69\\x18\\x58\\x45\\x59\\x70\\xa9\\x79\\x88\\x70\\x3f\\x59\\x71\\x76\\x3c\\xe4\\xec\\xbd\\x45\\x9a\\x66\\x66\\x98\\x0d\\x8d\\x82\\xc4\\xe2\\xf1\\xf9\\x1b\\xc9\\x85\\xea\\xf0\\x03\\x0d\\x06\\x24\\x20\\xcf\\xae\\xb3\\xfe\\x4c\\xb1\\x53\\xd0\\xeb\\xbb\\xc8\\x75\\x05\\x5f\\x57\\x2c\\x45\\x3f\\x06\\x02\\x21\\x1d\\x86\\x87\\x3f\\xbb\\xb6\\x5c\\x7a\\x3a\\x40\\x74\\x7e\\xa1\\xb9\\x8e\\x3f\\x1f\\x4d\\xc7\\x9f\\xc7\\x0e\\x59\\xe8\\x7c\\x31\\x0c\\xb3\\xa7\\x62\\xe4\\x83\\xd5\\x47\\xcb\\x1f\\xe7\\x51\\x31\\xe9\\xe5\\x6d\\xe9\\x66\\xf7\\x22\\x02\\x77\\x32\\xde\\xca\\x17\\x79\\x59\\x70\\x21\\xbd\\x88\\x5f\\x34\\x9e\\x9f\\xad\\xc8\\xe8\\xad\\x8b\\x68\\xa6\\x43\\xb4\\x40\\x38\\xf0\\x5e\\xd0\\x37\\x26\\xde\\x3c\\xbd\\xbc\\xee\\x9e\\x2d\\xb8\\x5b\\x16\\x25\\x56\\xff\\x85\\x2c\\x45\\xd1\\x9a\\xfc\\x42\\xcd\\x03\\xb7\\x02\\xa5\\x97\\xfa\\xbb\\x79\\x55\\xc7\\xe6\\x6e\\x89\\xf1\\x72\\xb2\\xe2\\xf3\\x87\\x30\\xcc\\xf9\\x91\\x5a\\x65\\xa1\\x52\\xf0\\x6a\\x60\\x2c\\xf2\\x0f\\x7a\\xfd\\xf6\\x8e\\xbf\\xbf\\x86\\x5f\\xe4\\xba\\xee\\xcb\\x87\\x23\\x6f\\x0e\\x65\\x56\\xd4\\xbc\\x6a\\x94\\xf5\\xd6\\x9e\\x17\\x0f\\xa4\\x89\\xf2\\x2c\\xba\\xbb\\x86\\x5f\\x65\\x46\\x55\\x93\\xbc\\x81\\x16\\xff\\x96\\x0f\\x75\\x98\\x3f\\x54\\x42\\x10\\xc1\\x6b\\x22\\xfd\\xb7\\xcb\\xe0\\x39\\xde\\x34\\xb9\\x74\\x96\\x73\\xd2\\x10\\xd3\\xd0\\xfe\\x7f\\xcc\\x98\\x90\\x5d\\xea\\x33\\xc7\\xbc\\x98\\x4b\\xa7\\xfe\\xcb\\x91\\x12\\x84\\x82\\xe2\\x7c\\x18\\xe8\\x47\\x49\\x00\\x8c\\x9c\\x5a\\xc1\\xde\\xbf\\xe3\\x45\\x4d\\x4f\\xf2\\x62\\x7d\\xf7\\x74\\x6e\\x17\\x35\\x88\\x06\\x38\\xba\\x75\\x58\\xdd\\x39\\xac\\xe9\\x3f\\xb2\\x6b\\x15\\x39\\x45\\xcb\\x5d\\xa7\\x6f\\x4d\\x68\\x04\\x11\\x4d\\x74\\x0a\\x70\\xda\\x7b\\xb6\\xe1\\x8d\\x33\\x78\\x91\\xb4\\x23\\x1f\\xa8\\xbe\\x50\\x9a\\x80\\x93\\xd1\\x4a\\x76\\xee\\x48\\x9a\\xc6\\x78\\x93\\x7e\\xfd\\x29\\xad\\x54\\x95\\x52\\x5d\\xa7\\xdf\\xa6\\x34\\xa6\\x0a\\x6f\\x15\\x33\\x4a\\xff\\x8e\\x87\\xde\\xa2\\x1e\\xad\\x03\\xe6\\x31\\x1a\\x3b\\xd5\\xd2\\xb2\\x5e\\x7e\\x12\\xbb\\x1b\\xbd\\x24\\xf4\\x1d\\x8f\\xc6\\x49\\x83\\xe2\\x4c\\xc4\\x86\\x44\\x4e\\xc8\\x22\\xa6\\x1c\\x6d\\x59\\x01\\xdc\\x8e\\x3d\\x00\\x6f\\x17\\x0b\\xb2\\xa3\\xff\\x94\\xc6\\xc9\\xa1\\x7f\\x1b\\x48\\xc3\\x8d\\x92\\xde\\xd3\\x9d\\xbf\\x0e\\xe0\\x40\\x9d\\x9d\\xff\\x42\\xc5\\x8e\\x55\\xce\\x53\\x4b\\xed\\x3d\\x45\\xa0\\xc4\\x1b\\x97\\x75\\xdf\\xd0\\xe5\\x84\\xe5\\x7e\\x89\\x32\\x34\\x94\\xd4\\xe1\\x5e\\xbe\\x14\\x1c\\x46\\xca\\x6a\\x14\\x22\\xdc\\x7c\\x19\\x66\\x45\\x8c\\xd2\\x69\\xd3\\x94\\x70\\xb1\\xec\\x1d\\xed\\x09\\x38\\x86\\xbf\\x28\\xa1\\xac\\xb2\\x14\\xeb\\xb8\\x97\\x82\\x5b\\x0c\\x6a\\xdd\\xdc\\x48\\xde\\x5d\\x2e\\xd7\\x09\\xf4\\x0a\\xba\\x7c\\x78\\xc5\\x2a\\x1a\\x15\\x5e\\x70\\x33\\x91\\x22\\x29\\x27\\x20\\x90\\xc6\\xf1\\xc0\\x22\\xee\\x1e\\x94\\x67\\xd8\\xd2\\x22\\x2d\\x24\\x04\\x9c\\x3d\\xcd\\xfc\\x52\\xcc\\x8f\\x7a\\xa2\\x7e\\x00\\xfb\\x6e\\x74\\x5f\\x94\\x0f\\x45\\x4d\\x57\\x90\\x0b\\x2c\\xf4\\x70\\xb0\\x6d\\xf5\\xd0\\x7b\\x90\\x1c\\x20\\x25\\x33\\x4a\\x67\\xeb\\xa6\\x39\\xd7\\x5c\\xdb\\xf6\\x84\\x36\\xbb\\x84\\x14\\x15\\xd9\\x80\\x5a\\x71\\x31\\xd5\\xe2\\x57\\xd7\\x78\\x27\\xd0\\x98\\x9a\\x02\\x0d\\xaa\\xc3\\x04\\x2a\\x67\\x84\\x10\\xe0\\xde\\x5e\\x1b\\x43\\x8c\\xba\\x3c\\x9f\\xc3\\x0a\\xee\\x88\\xab\\xfc\\x92\\xef\\x90\\xed\\xc6\\x15\\x91\\xdb\\x4e\\x0c\\x54\\xb0\\xf5\\x93\\x4a\\xa5\\x3f\\xb6\\xff\\x7a\\x91\\xdb\\xb6\\x07\\xbb\\xd1\\xb6\\xcd\\x9d\\x24\\x78\\xe7\\xff\\x04\\x6c\\xf1\\xba\\xce\\xff\\x3d\\xe4\\x92\\xd3\\x87\\x00\\x37\\xfe\\x1d\\xc0\\x95\\x20\\x80\\x2d\\xee\\x30\\x40\\xc7\\xe0\\xd2\\x0c\\xcb\\x79\\xdb\\x6c\\xb7\\x4b\\x62\\xcd\\x35\\x14\\x6d\\xb7\\x4b\\xc7\\x73\\x97\\xcf\\xb7\\x82\\x21\\x10\\xf2\\x89\\x23\\x9e\\x9e\\x11\\x0b\\x19\\x7d\\xba\\x1f\\x0e\\x2f\\x59\\x2c\\xc8\\x1d\\xdd\\xfb\\x49\\x00\\x33\\x2e\\xfd\\x99\\xef\\x96\\x1a\\xfe\\xd1\\x10\\x43\\xae\\x2c\\xa6\\xcb\\xa5\\xdf\\xd9\\xf6\\x6c\\x27\\xc1\\xf8\\x6e\\xd9\\x41\\x31\\x69\\x9a\\xd8\\xb6\\x65\\x3e\\xc3\\xbe\\xdc\\x7a\\xfe\\xdc\\x92\\xb7\\xe1\\xce\\xfa\\x74\\x84\\x6c\\x0d\\x25\\x09\\xac\\x05\\x78\\xf5\\x65\\x46\\x60\\xb3\\x58\\x80\\x3e\\x6b\\x12\\xa0\\x2e\\x9f\\x7a\\xc8\\x24\\x9b\\xd4\\xb6\\x67\\xfb\\x5e\\xad\\x90\\x2f\\x6b\\xce\\xaa\\xb8\\x7c\\x2c\\x44\\x76\\xfd\\xac\\x0b\\x1c\\xa0\\xc3\\x98\\x6a\\x87\\x14\\xe6\\xc9\\x94\\xc3\\xa0\\xec\\x73\\x68\\x91\\x05\\x77\\x63\\xdb\\xa9\\x81\\xcb\\xab\\xac\\xb8\\xca\\x88\\x5e\\xd2\\x4e\\x42\\x28\\xe7\\x02\\x38\\x10\\x52\\x67\\x2b\\xc1\\x63\\x0f\\x15\\x81\\x19\\x6a\\x1f\\x64\\x8d\\xba\\x09\\x30\\x04\\x0c\\x4b\\x42\\xa7\\x85\\xe1\\x94\\x15\\x5e\\x1e\\x06\\x95\\x39\\xdb\\x01\\x77\\xca\\x05\\xdf\\x8f\\x9b\\x26\\x0f\\xe0\\x9e\\xde\\x6a\\x3f\\x2c\\x15\\xb5\\xcb\\x93\\x38\\xdd\\x0d\\xa1\\x32\\xbe\\x75\\x8b\\x86\\x19\\xba\\x37\\x03\\x76\\x5d\\x5f\\xc6\\xab\\xa1\\x3b\\x8a\\xd7\\xe5\\xe6\\xf0\\xf1\\xe0\\xde\\x13\\xdb\\xfe\\x3f\\xa3\\xf7\\xd9\\xaf\\x12\\x24\\xee\\xe7\\x67\\xa4\\x45\\x8c\\xfb\\xbe\\x97\\xfe\\x97\\x16\\xb9\\xa1\\x2b\\xdb\\x76\\x2a\\x7a\\x6f\\x34\\x09\\xf7\\xb4\\xea\\xc4\\xca\\x4a\\x6d\\x1e\\x02\\x77\\xd4\\x28\\xea\\x5a\\xe4\\xe5\\xca\\xb6\\xad\\xb2\\xb0\\xe6\\xf7\\x10\\xd2\\xd0\\xef\\x8e\\x52\\x02\\x2f\\xc4\\xab\\xad\\x8b\\xa5\\x5c\\xc8\\x7b\\x38\\x53\\xcb\\x84\\xb6\\x1d\\x0a\\x0e\\x2d\\x3b\\xbe\\x91\\x5d\\xa3\\xdc\\x7b\\xe1\\x7e\\x0c\\xc6\\x14\\xd0\\xaa\\xc7\\xc5\\x66\\xfa\\xbf\\x2a\\xc1\\xbc\\x75\\xaf\\xde\\xe4\\x0e\\xac\\x7e\\x77\\x07\\xba\\x52\\xab\\x21\\x24\\x8c\\x87\\xbc\\xee\\xec\\xa7\\x96\\x32\\x24\\x62\\xd3\\x38\\xfa\\x91\\xc6\\x82\\x87\\x55\\x07\\x7f\\x9e\\x1f\\x06\\xee\\x40\\x5b\\x00\\x7e\\x18\\x10\\x28\\xcf\\xb0\\xca\\xbd\\xc4\\x2a\\xbc\\x69\\x66\\xa5\\x9e\\xff\\xa6\\xe9\\x1e\\xbb\\x8b\\x60\\x23\\x09\\xfc\\xd2\\x6f\\x5a\\xec\\xfb\\x59\\xb9\\x2c\\x4a\\xc9\\xf0\\xd9\\x36\\xaa\\xb0\\x7f\\xc9\\x8a\\xb8\\x7c\\x74\\x62\\x22\\x2d\\x19\\x33\\x5a\\x0e\\xb0\\x54\\xd3\\xdc\\x83\\x5a\\xf1\\x6c\\x7e\\x2f\\xb9\\x8f\\xd4\\x34\\xc4\\xdf\\xa4\\x9b\\x51\\xca\\x41\\xe2\\xfd\\x94\\xc0\\x8e\\xa6\\x9b\\x1d\\xa5\\xd4\\x89\\xc7\\x5e\\x40\\x18\\x70\\x41\\xc5\\xcc\\x31\\x6f\\x5f\\x44\\x0b\\x41\\xac\\x4a\\xf6\\xab\\x69\\x18\\x69\\x93\\x2e\\xea\\x82\\x93\\xd2\\x83\\xbc\\xe6\\xc0\\xb6\\x67\\x62\\x81\\x7f\\xaa\\xca\\x03\\x4b\\x31\\x7e\\xe4\\xeb\\xba\\x3c\\x1c\\x84\\x00\\x48\\xd4\\xa5\\x9d\\xc9\\xcd\\xda\\xcb\\xdc\\xb2\\xc3\\xb2\\x62\\x28\\x7b\\xea\\x48\\x7a\\x91\\xf6\\xdb\\x10\\xb5\\xf3\\xbe\\x2c\\x14\\x68\\x7a\\x92\\x82\\x25\\x77\\xae\\x45\\x60\\x2f\\x70\\x95\\x0e\\xde\\x12\\x11\\xd8\\xd3\\x3b\\xdb\\x4e\\xfd\\xbb\\xc0\\xf8\\x22\\x38\\x81\\xfe\\x20\\xcf\\x49\\x31\\x14\\xbb\\x5e\\xff\\x41\\xe9\\x2e\\x55\\x9a\\x78\\x86\\x68\\x0a\\xcf\\x8b\\xfa\\x4b\\x39\\x0b\\x8e\\x11\\x24\\x45\\x8e\\xe3\\x5e\\xac\\xb3\\x18\\xac\\xca\\xf1\\x93\\xcc\\x2f\\x86\\x2a\\xd6\\xfc\\x5f\\x6a\\xfa\\x6c\\xbb\\x7f\\x56\\xed\\x1d\\x64\\xc0\\x55\\x0d\\x06\\x28\\xbd\\x19\\x9d\\x8c\\x49\\xd3\\xdc\\x8d\\xac\\x39\\x62\\xff\\x1e\\x27\\x77\\x00\\x1a\\x18\\x10\\x2d\\x16\\x03\\x16\\x88\\x57\\x3c\\xc8\\x73\\x61\\x38\\x43\\x01\\xf4\\x1e\\x44\\x0d\\xce\\xd4\\x27\\xb5\\x0b\\xba\\x2a\\x76\\xa4\\x9f\\x8c\\x16\\x4f\\x47\\x90\\x0d\\x1d\\x1e\\x8f\\x74\\xa0\\x9f\\x64\\x4f\\x8e\\x61\\x9e\\x3b\\x30\\xce\\x3d\\x37\\xe2\\xb9\\xd5\\xeb\\x2c\\x3d\\x03\\x87\\x4b\\x2d\\x43\\x21\\x06\\xea\\x72\\xf0\\xf1\\xde\\xea\\xbe\\x9e\\x5a\\x19\\x22\\x0b\\xdd\\xb4\\x58\\xbf\\x2b\\xe4\\xc6\\xc5\\x8a\\x67\\x77\\x62\\xf5\\xbe\\x54\\x3d\\x6f\\x9a\\xc1\\xab\\xe9\\xcc\\xa1\\xf6\\xe1\\x69\\xd7\\x35\\xa7\\xb8\\xaa\\xa3\\x99\\x0b\\x6e\\x05\\xa3\\xdd\\x01\\x7b\\x42\\x77\\x7e\\xa8\\x80\\x9d\\x5d\\x02\\xf6\\x13\\x5b\\x46\\x0f\\x95\\xd8\\x31\\xaa\\x63\\xc9\\x92\\xe7\\x7c\\x0f\\x91\\xb9\\x69\\x3a\\x81\\xe4\\x88\\x77\\xb1\\xeb\\x0a\\xbf\\xdd\\xef\\x79\\x9c\\xb1\\x9a\\x4f\\xd6\\xec\\xcc\\xd8\\x00\\x31\\x0a\\x26\\xd3\\x7c\\xd7\\x37\\x01\\xf6\\xac\\x01\\x46\\x0b\\x56\\x4d\\xfd\\x18\\xde\\xd2\\x54\\x4c\\x1b\\xab\\x19\\x4d\\xf1\\x07\\x38\\x75\\x9c\\xf1\\x74\\xa7\\x1d\\x17\\x22\\x8f\\xc9\\x54\\xf1\\xa6\\x49\\x75\\x9f\\x89\\x82\\x66\\x35\\xb0\\xcc\\xd0\\x5c\\x73\\x6c\\x50\\xed\\x27\\xae\\xad\\xa6\\xd1\\x3c\\x6b\\xb8\\xa7\\x40\\x5a\\x52\\x1b\\xe3\\x74\\x48\\x6f\\x3b\\x7c\\xb7\\x3c\\x94\\xc7\\x5a\\xaf\\x9b\\x6d\\x0f\\xdf\\x07\\xeb\\x08\\xac\\x87\\x58\\x3d\\xa7\\x97\\x4f\\x4d\\x74\\x94\\xb1\\x70\\xc8\\xea\\xa0\\xd9\\x87\\x24\\x00\\x78\\xdd\\xbb\\x6d\\x67\\xe6\\x45\\xcd\\x33\\xb6\\x94\\x41\\x40\\x9b\\xc6\\x42\\xa9\\x5a\\x9a\\xf3\\x63\\x60\\x0c\\x65\\x57\\x31\\xa3\\xca\\xf9\\x98\\x66\\x03\\x87\\x06\\x74\\x0d\\x13\\x50\\xdb\\x85\\x95\\x45\\x2b\\xa2\\x89\\x8a\\x10\\xdb\\xc7\\x32\\xa6\\xf4\\x6a\\xb3\\xc3\\x40\\x98\\x73\\x92\\xd0\\xd0\\x8f\\x82\\x81\\xd8\\x3a\\xb7\\xae\\x2c\\xe8\\x94\\x90\\xb1\\xcf\\xf1\\x04\\xc6\\xe7\\x01\\x4d\\x06\\x02\\x8f\\x57\\x38\\x5c\\xba\\xa6\\x29\\x2f\\xac\\x4c\\x90\\x7f\\xe5\\x9c\\xad\\x3e\\xa9\\x9b\\x8c\\xb2\\xee\\x26\\x23\\x02\\xb2\\xc2\\x2e\\x44\\xcc\\x26\\xee\\x38\\x3c\\x15\\x60\\xed\\x24\\x56\\xdd\\xcd\\xfa\\xd9\\x8e\\xdb\\x6e\\xe1\\x76\\x2f\\xc3\\xe9\\xec\\xd8\\x58\\x57\\x42\\x5b\\x12\\xef\\x48\\x4b\\x20\\x45\\x85\\xe2\\xe1\\xe8\\x5a\\x2c\\xaf\\xbf\\xe3\\xef\\xaf\\x42\\xa9\\xff\\xb8\\x8a\\x58\\x11\\xf1\\x5c\\x4c\\xda\\x55\\x54\\x57\\xb9\\xf8\\x34\\xd8\\x59\\x57\\x08\\x52\\x3f\\xed\\xd8\\x91\\x5f\\xed\\x79\\xcd\\x44\\x06\\x8c\\x82\\xc2\\x63\\x95\\x01\\xb9\\x1a\\x91\\x2c\\xd7\\xf6\\xaa\\xce\\xf6\\xfc\\x75\\xcd\\xf6\\x87\\xab\\x77\\x19\\x7f\\xbc\\x7a\\xdc\\x65\\xd1\\xce\\xd2\\xac\\xd0\\x95\\x45\\x20\\xc9\\x9e\\xa4\\xce\\x5b\\xc8\\xa7\\xfc\\xbd\\x7a\\x56\\xdd\\x8b\\x76\\x02\\x90\\x76\\xac\\xfa\\xa2\\x8c\\xf9\\xd5\\x1d\\x7f\\x2f\\xfe\\x8b\\xe7\\x51\\x15\\x23\\x47\\x6c\\x43\\xa1\\xa7\\xc3\\x46\\x60\\xc3\\xb8\\x2f\\xf0\\x49\\x47\\xb9\\x5b\\xea\\xca\\xbd\\xfe\\xd1\\x0d\\x97\\xaa\\x15\\x02\\xac\\x6d\\x01\\x15\\x3e\\xc3\\x7e\\x49\\xd8\\xbc\\x92\\x3f\\xc7\\xab\\x28\\xcf\\x78\\x51\\xff\\xaa\\x7e\\xff\\x79\\x55\\x26\\xc9\\x91\\xd7\\xbf\\xaa\\xdf\\x7f\\x5e\\x1d\\x58\\xca\\x7f\\xc5\\xbf\\xff\\xbc\\x3a\\x46\\x15\\xe7\\xc5\\xaf\\xea\\xf7\\x9f\\x57\\x75\\xa9\\xb4\\x34\\xbf\\x3f\\x24\\xf3\\x2c\\x32\\x54\\xfb\\x63\\x33\\x1a\\x27\\x36\\xa5\\xc3\\x45\\x85\\x4b\\xd5\\x33\\x0c\\xc8\\xa9\\xf7\\xdb\\x19\\x23\\x82\\x27\\x28\\xe7\\x77\\x42\\x47\\xcb\\xb0\\x8c\\xdf\\x83\\xaa\\xb3\\xaf\\x6c\\xee\\xa0\\xa7\\xf0\\x31\\xaa\\xca\\x3c\\x7f\\xc5\\x93\\x1a\\x23\\x5f\\xf1\\x41\\xc2\\x8a\\x2c\\x64\\x2e\\x59\\xc6\\xc8\\x65\\x26\\xe0\\x3d\\x4e\\x38\\x2d\\x5d\\xed\\xff\\x1c\\xd4\\xfe\\xa6\\x3c\\x0c\\x2a\\xc7\\xf7\\x51\\xdd\\x7d\\x1e\\xe3\\x7d\\x85\\xd7\\xb6\\xe0\\x52\\x37\\x4d\\xb7\\x73\\x93\\xa6\\xe9\\x00\\x60\\x6d\\x27\\xde\\xda\\x7d\\x61\\x27\\xde\\xc7\\xee\\x27\\x76\\xe2\\xbd\\x70\\x57\\x72\\xb9\\x93\\xec\\x69\\x6c\\x73\\xc4\\x0c\\xde\\xbb\\x0b\\x86\\x69\\xba\\xc9\\x28\\x8c\\x02\\x09\\x65\\x5a\\xe9\\xae\\xe1\\xda\\xe7\\xc1\\x26\\xd5\\x86\\x3f\\x46\\x22\\x4d\\xe9\\x2f\\x5a\\x41\\x22\\xcf\\x50\\x0d\\x38\\xfb\\xc7\\xf0\\x4b\\xbf\\x2f\\x5a\\x02\\x31\\x45\\xfb\\xcf\\xc3\\x51\\x7b\\x15\\x96\\x87\\xa3\\xb6\\x14\\x51\\x5f\\x88\\xdb\\x7f\\x02\\x46\\x4d\\x59\\x21\\x11\\xe4\\x75\\x64\\xf6\\x11\\xa2\\xf6\\x3e\\xf6\\xc3\\x00\\x98\\x1f\\x05\\x34\\xf1\\xa3\\xce\\x6a\\x87\\xf5\\x0c\\xbb\\x7e\\xa4\\x39\\x81\\x8f\\x65\\x38\\x65\\x09\\x4f\\x06\\xde\\xee\\xf2\\x74\\x1f\\xcd\\x68\\x4c\\xa9\\x72\\xb1\\xf2\\xd2\\xce\\xe3\\x11\\x12\\xe2\\xb2\\x16\\x14\\x29\\x74\\x4f\\x79\\xc9\\x62\\xf7\\xa4\\x19\\x74\\xbc\\xd1\\x49\\xc6\\x34\\x3f\\x9d\\x89\\x89\\x83\\x43\\x93\\x19\\xa5\\xff\\x72\\x88\\xf4\\x0c\\x95\\x5a\\x5d\\xe5\\x6e\\x9e\\xc8\\x80\\xe6\\x78\\x25\\x79\\x7f\\xc8\\x68\\xe8\\x20\\x2c\\xad\\xf1\\x6d\\x21\\xcc\\x1f\\xaa\\xdf\\x6b\\x88\\x9a\\x0d\\x89\\x02\\xaa\\x1d\\xf1\\xf8\\xfb\\xcd\\x94\\x0f\\xb5\\xd5\\x02\\x12\\xa2\\x0f\\x34\\x64\\xe9\\xb3\\x03\\x8b\\x4a\\x22\\xa7\\x22\\x6b\\x49\\x8b\\x18\\x51\\x58\\xb0\\xac\\x3a\\xac\\x8e\\x62\\xf0\\x94\\xd2\\x5f\\x7b\\xd9\\x8b\\x5c\\xa3\\xfe\\x68\\xd6\\x78\\xda\\xaf\\xaf\\xab\\x4e\\x2f\\x1d\\x58\\xcc\\x12\\xf2\\x79\\xc8\\x93\\xb2\\xe2\\xf2\\xba\\x76\\xf7\\x64\\xb2\\x05\\x43\\x83\\xf2\\xde\\xe9\\x5e\\xb2\\x07\\xb6\\xcd\\x90\\xb1\\xc9\\x0a\\x96\\xab\\x4b\\xe0\\x9d\\x51\\xca\\x52\\xb6\\x8e\\x2a\\xfa\\xae\\x1c\\x69\\xdb\\x16\\x8e\\xd9\\xfe\\x21\\x1f\\x78\\x69\\x28\\xcd\\x58\\xef\\xfb\\xa7\\x34\\x99\\x06\\x74\\x43\\x04\\x52\\xaf\\xc9\\x20\\x3b\\xbe\\x56\\x35\\x60\\xac\\xe7\\x41\\xab\\xee\\xa9\\x6d\\xc9\\x26\\xf6\\x46\\xfc\\xb9\\xc3\\xf5\\xb5\\x8b\\xee\\x99\\x5e\\x58\\xa9\\x13\\x38\\x01\\x3e\\x29\\x85\\xa0\\x3b\\xfb\\x88\\xe1\\x6a\\xa5\\x71\\x6c\\xa7\\x70\\x39\\xb3\\x1d\\x9d\\x34\\x14\\x16\\xb3\\x36\\x65\\x3f\\x2c\\x06\\x3f\\x5b\\xa3\\xc1\\xed\\x79\\x6d\\x03\\x08\\x1d\\x04\\xac\\x90\\x99\\x3d\\x07\\x3d\\x02\\xea\\x3e\\x0a\\xc3\\x60\\x42\\x74\\x0c\\x06\\x94\\xb5\\x14\\x2a\\xc3\\x84\\xf3\\xa1\\xd2\\x2e\\x5c\\x53\\x97\\x64\\x20\\xd8\\xf3\\x8f\\x72\\x38\\xfd\\x22\\x0b\\xf6\\xd4\\xfb\\x1f\\xf7\\x99\\x42\\x51\\xb2\\x45\\x08\\xa5\\x16\\xb9\\xb3\\x49\\x84\\x50\\x99\\x91\\x76\\xec\\x03\\x95\\x03\\xd0\\xaf\\x4d\\x23\\x00\\xf6\\xd1\\x91\\x8c\\xb0\\x3c\\x2b\\xee\\x71\\x34\\x9d\\xad\\x08\\x19\\xa8\\x48\\xa4\\x15\\x91\\x7a\\x33\\x2d\\x4c\\xcf\\x47\\xe8\\x3e\\x83\\x29\\x39\\x03\\x93\\x3f\\x20\\x2d\\xb8\\xcf\\x60\\x08\\x00\\xe7\\x4e\\x40\\xe7\\x13\\xbf\\xb9\\x34\\xcb\\xff\\x23\\x5d\\x38\\x86\\x35\\x9e\\xa7\\x38\\xa4\\x85\\x11\\x53\\xff\\x9f\\x34\\x7b\\x3e\\x0a\\xdd\\xf0\\xa8\\xd2\\x89\\x24\\xdd\\xf4\\xd4\\x94\\xfc\\x27\\x7d\\xf8\\xc0\\x94\\x9a\\x9d\\x99\\xca\\xf6\\xa1\\x6f\\xca\\x39\\x6f\\xa2\\xd7\\xad\\x76\\x00\\x3a\\x21\\xc1\\x15\\xf3\\x5d\\xb9\\x16\\x3e\\x97\\xef\\x78\\x65\\x49\\x7e\\x2f\\xe7\\xec\\x1d\\xd7\\xc9\\x0f\\xb5\\x05\\xea\\xc0\\x4f\\x65\\x57\\x6f\\xb2\\x80\\x7a\\x51\\x45\\xf4\\x27\\xc4\\xf4\\x63\\x5f\\xe6\\x91\\x9c\\x1d\\xd0\\xd3\\x80\\x48\\x84\\xa0\\x35\\x35\\x6e\\xa8\\x78\\xf7\\x33\\xa7\\x9d\\x08\\xa4\\x8d\\x2b\\x48\\x8c\\x69\\x30\\xdf\\x18\\x33\\xb7\\x13\\x3d\\x15\\x05\\xc7\\xfb\\x75\\xb9\\x34\\x7e\\x37\\x4f\\xae\\x75\\x0c\\x67\\xa6\\x34\\x45\\x9d\\x0c\\x6a\\x1e\\xde\\x4d\\xfb\\x8e\\x81\\x2a\\x13\\x12\\x88\\xd0\\xe2\\x7b\\x7c\\x8e\\x2a\\x76\\xa7\\x9c\\x62\\x49\\xbb\\x3b\\x12\\x2b\\x29\\xac\\x49\\x0a\\xa7\\x2c\\x48\\xcc\\x11\\x77\\x53\\xa6\\xb0\\xb9\\x13\\x42\\x47\\x9f\\x86\\x7a\\x11\\xb4\\x93\\xda\\x8c\\xa7\\x38\\x0c\\xe8\\x09\\x8f\\x8c\\xc6\\x30\\xa9\\x0c\\x85\\x47\\xbc\\xb0\\x9a\\xd8\\xce\\x92\\x26\\x46\\xa3\\xe8\\xa6\\x89\\xcf\\xcf\\x91\\x18\\xe0\\x85\\x83\\x60\\xe6\\x05\\x87\\x0b\\xde\\x73\\x2e\\xf0\\xb4\\x56\\xc7\\xff\\xef\\x1b\\x5e\\xac\\x37\\xdc\\x1b\\x54\\xcf\\x89\\x8b\\x71\\x7a\\xcf\\xc9\\x43\\xdf\\x1b\\xa5\\x64\\x17\\x15\\x90\\xf6\\xcc\\x6e\\x67\\x70\\x5f\\xc7\\xd9\\x59\\xd3\\xd0\\xef\\xa2\\x8f\\xd3\\x74\\x66\\x12\\x12\\xa2\\x44\\x11\\x35\\x4d\\x08\\xda\\xbf\\xd6\\x88\\xd3\\xcf\\xa4\\x81\\x73\\x59\\x38\\x29\\x36\\xc1\\xfc\\x34\\x00\\x3e\\x8c\\x46\\x94\\x25\\x2a\\x3a\\x46\\x24\\xa5\\x15\\x4a\\x63\\xcf\\x89\\x69\\x08\\x51\\xe7\\xb1\\x2b\\x75\\xc8\\xd2\\x6d\\xe3\\xdc\\xee\\x5b\\xe4\\x8e\\x20\\xea\\xf2\\xaa\\x57\\xa3\\x43\\x82\\x57\\x46\\x9d\\x53\\x4c\\x9f\\x75\\xe6\\xf0\\xb3\\x78\\x10\\x98\\xca\\x70\\x98\\xe0\\x78\\x78\\x1d\\x43\\x3c\\xe9\\x40\\xe5\\x48\\x3f\\x21\\x46\\x20\\x99\\xde\\x15\\x2d\\xc4\\xf2\\x7c\\x30\\xd1\\xe7\\x86\\xc9\\xe8\\x88\\x5b\\xbb\\x46\\x9c\\x99\\x09\\x49\\x90\\x65\\x71\\xac\\x95\\x60\\x31\\x44\\xca\\x36\\xb0\\x2c\\xa6\\x58\\x20\\xd3\\x5a\\xc8\\x58\\x48\\x01\\x76\\x65\\x92\\x5c\\xf2\\x25\\x10\\xab\\x7b\\x81\\xac\\x74\\x58\\xa3\\xbb\\x89\\xd9\\x44\\x25\\x50\\x38\\x63\\xe5\\x9f\\x9c\\x8d\\xd8\\x38\\x27\\x88\\x3b\\x0c\\x32\\xb7\\x96\\xd6\\xdc\\xf8\\xe4\\xf6\\x9f\\x8c\\x30\\x6b\\x10\\x77\\xda\\x2d\\xa8\\x75\\x8c\\xb0\\x09\\xd8\\xc3\\x60\\xd5\\x26\\x54\\x25\\x89\\xc3\\x21\\x04\\xe6\\xf3\\xc9\\x00\\x57\\x78\\x45\\xfc\\x6c\\xdd\\x34\\x13\\xb1\\x70\\x43\\x79\\x35\\x85\\x01\\x23\\xe8\\x46\\x88\\x1a\\xb3\\x88\\x3e\\xfb\\x9d\\x05\\x1a\\x98\\x53\\x76\\x2b\\x74\\xc6\\xc5\\x9f\\x85\\x96\\xb9\\x54\\x9f\\xe6\\x3b\\xc5\\x2a\\xa1\\xd6\\xc8\\xa8\\x4e\\x79\\xaa\\x5d\\x74\\xb4\\x30\\x03\\x0a\\x9e\\x31\\xb2\\x12\\x1e\\x66\\xab\\x8e\\xf5\\x57\\x56\\x54\\x8c\\xd1\\xeb\\x97\\x8e\\x37\\x63\\x15\\x67\\x4d\\x58\\x35\\x51\\x99\\x37\\x7c\\x1f\\xf2\\xb8\\xd9\\x55\\x4d\\xb6\\x4f\\x1b\\x94\\x21\\x9a\\x3c\\x2b\\xee\\x9a\\x3d\\xaf\\x59\\x73\\x60\\x15\\xdb\\x13\\xc7\\xf1\\xb7\\x8f\\x6e\\x30\\x97\\xc1\\xe0\\xc8\\xf6\\xfa\\xe6\\x3a\\xcd\\x20\\xc4\\xca\\xd4\\x97\\x6b\\x88\\xc4\\x6b\\x63\\xff\\xc9\\xdb\\x3e\\xce\\x37\\xd7\\x10\\xcb\\xa6\\xdc\\x63\\x54\\x65\\x87\\xba\\x39\\xd6\\xef\\x73\\x8e\\x15\\x93\\xeb\\x0c\\x38\\xa3\\xd7\\xca\\xee\\x67\\x7b\\x7c\\xee\\x78\\xae\\xff\\x96\\x06\\x0d\\xdd\\x1e\\x9f\\x6b\\x73\\xa0\\xa5\\xc8\\x96\\x30\\x7a\\xfd\\xf6\\x59\\xb3\\xbd\\x76\\x3c\\xf7\\x96\\xbd\\x63\\x0d\\x8f\\xf6\\x8c\\xc8\\x1a\\xaf\\x33\\x48\\xc5\\xe7\\xba\\x7a\\xe0\\xdb\\x6b\\x67\\xf9\\x9c\\x5c\\xc3\\x4e\\x24\\x6c\\x8f\\xcf\\x5f\\xce\\x1c\\xcf\\xdd\\xfa\\x5f\\x7c\\xf9\\xd9\\x9b\\xcf\\xb6\\x7e\\xb3\\x58\\x90\\x46\\x24\\x04\\xdb\\x40\\x3c\\xdf\\x6c\\x8f\\xcf\\x9f\\x5d\\xa7\\x90\\x31\\x7a\\x92\\xb7\\x42\\xb9\\xfe\\x1a\\xac\\x97\\x12\\x2e\\xaf\\xf6\\x0f\\x79\\x9d\\x1d\\x72\\x4e\\x3f\\xd2\\x4f\\x1f\\xdd\\x58\\x60\\xbd\\xbc\\x96\\xdf\\x6f\\xac\\x00\\xea\\x1d\\x67\\xb1\\x2c\\x84\\x11\\x70\\xe5\\x77\\xf5\\x18\\x40\\x54\\xe6\\xae\\xff\\xa2\\xfb\\xf8\\x32\\x2a\\xf3\\xb4\\x2a\\x1f\\x0e\\x32\\x5b\\xf7\\x66\\x94\\xa8\\xab\\x41\\x81\\x3a\\x2c\\xe3\\xf7\\xaa\\x52\\x7c\\x34\\xb3\\xc6\\xae\\xff\\xf1\\x38\\xeb\\xcb\\xba\\x52\\xd9\\xab\\x9b\\x89\\x32\\x9d\\xdc\\xe7\\xaf\\xc0\\xb2\\xc0\\xb2\\x82\\x76\\x93\\xb1\\x65\\x79\\xa8\\xb1\\x27\\x54\\x3e\\x67\\x65\\x01\\x19\\x5b\\x62\\x69\\x91\\x54\\x27\\x65\\x59\\x8b\\x07\\xdd\\x63\\x7c\\x66\\x98\\x11\\xbf\\x8b\\x59\\xc0\\x12\\x3b\\x7c\\x8d\\x7b\\xd3\\xa5\\x5b\\x36\\xd4\\xc1\\x19\\xb2\\x25\\x58\\xd8\\x2d\\x8b\\x0c\\x24\\xd8\\xf3\\x00\\x44\\xa1\\x19\\x94\\xc6\\xaa\\x2b\\x8b\\xc8\\xeb\\xce\\x95\\x7a\\xea\\xf8\\xf9\\xfb\\x37\\x2c\\xc5\\xb2\\x16\\xf6\\xd8\\x22\\xfe\\x2a\\x40\\x1b\\x10\\xc3\\x26\\x6d\\x64\\x9d\\x37\\x36\\x93\\x53\\x05\\x89\\xcb\\x7a\\x4b\\xaa\\xbb\\xe1\\x2d\\x1f\\xc8\\xe7\\x38\\x52\\x9b\\x76\\xe9\\xb6\\xa8\\xb9\\x75\\x6d\\xcd\\x95\\xd4\\x64\\xd4\\x94\\xb3\\xde\\xcd\\x3a\\x65\\x2a\\x50\\xa1\\x54\\x3c\\x77\\xa7\\x5b\\x9e\\xe6\\xa4\\xfc\\x75\\xe0\\x6a\\xb9\\xef\\xac\\x05\\xb3\\xd6\\x3d\\x3b\\xbb\\x01\\x0a\\xe2\\xfe\\xb6\\x91\\x58\\x29\\xb1\\xa5\\x45\\x3f\\xf3\\xa3\\x00\\x2c\\x69\\x72\\xf2\\xd5\\x3b\\x96\\x5b\\x30\\x0b\\x9b\\x46\\x9e\\x0a\\x85\\xe3\\x6f\\xc4\\x88\\x97\\x5f\\xb0\\x09\\x3d\\xbe\\x34\\x44\\xd9\\x9c\\x5d\\xc6\\x82\\x2a\\xb2\\xa1\\x41\\x8a\\x93\\x18\\xf6\\xdf\\x04\\x52\\x2a\\xfb\\x13\\x42\\x42\\xe0\\x96\\x26\\xbd\\x71\\x8a\\xf6\\x36\\xd2\\x36\\x02\\x69\\x6f\\xf3\\xb5\\xe9\\x10\\xff\\xad\\x0a\\x88\\x26\\x46\\x7a\\xeb\\xf3\\x60\\x3c\\x58\\x93\\x80\\x86\\xc0\\x41\\xe4\\xf1\\xa3\\x80\\xb4\\xdf\\x0f\\x3b\\xb5\\xa3\\xdf\\x1b\\x9d\\xca\\xa8\\x19\\xf6\\x66\\x47\\xe0\\x7b\\xd5\\xc7\\x4c\\xf0\\x4d\\xdd\\x54\\x94\\x83\\xab\\x03\\xa6\\x61\\xf0\\x12\\x68\\xca\\x8b\\x47\\x88\\xcb\\x96\\x18\\xc7\\x4c\\xc7\\x5b\\xfb\\x2c\\xcf\\xbd\\xf3\\xa4\\x2e\\xb7\\x3f\\xe1\\x32\\x87\\xbe\\x6f\\x83\\x7d\\x14\\x12\\xaf\\x8b\\xa1\\xc4\\xd0\\x2f\\xd4\\xb8\\xf1\\xe5\\x30\\xba\\xef\\xe0\\xc2\\x75\\x6c\\xfd\\xed\\x69\\x91\\x6d\\xbf\\xd1\\x37\\xbc\\x21\\x88\\xa2\\x3e\\x5c\\xda\\x58\\x76\\xd7\\xe8\\xb9\\x8e\\x51\\x40\\xdd\\x91\\x26\\x48\\x09\\xbe\\xcb\\xd3\\x5e\\xd3\\xe6\\x92\\x0e\\x23\\x3b\\x13\\xc3\\xb5\\x08\\x4d\\x36\\x2f\\xb1\\x29\\xea\\x58\\x93\\x0d\\x0d\\x3b\\x71\\xbd\\x3e\\x60\\x77\\x8b\\x6e\\x9e\\xce\\xd8\\x40\\xb4\\x69\\x86\\xc1\\xd2\\x54\\xac\\x33\\xd3\\x17\\xb6\\x0f\\xaa\\xec\\x30\\x22\\x0f\\x97\\x52\\x5a\\x32\\x67\\x47\\x20\\x11\\xbf\\x8c\\xa8\\x28\\x7f\\xc9\\xf8\\xda\\x9d\\x03\\x73\\x12\\x3f\\x0e\\x20\\xf5\\xe3\\x40\\x86\\x30\\xc6\\x98\\x7c\\x58\\x45\\x42\\x93\\xa6\\x91\\xa5\\x53\\x9a\\xe2\\xe3\\xee\\x62\\x45\\xc5\\xa0\\x22\\xe4\\x54\\x71\\x07\\xee\\xfa\\xab\\x74\\xb0\\x47\\x60\\x49\\xe2\\x67\\x11\\x48\\x8d\\x8b\\x11\\xf6\\xcc\\x49\\x61\\x96\\xd9\\x36\\xc2\\x6a\\x97\\x87\\xc0\\xae\\x85\\xf0\\x21\\xcb\\x63\\x6d\\x55\\x3c\\xc1\\x49\\x6a\\x3c\\x32\\xbc\\x59\\x2c\\xbc\\x6c\\x96\\x9c\\xa3\\x85\\x1e\\x5d\\x41\\xd9\\x63\\x9d\\xf2\\x66\\xbf\\xd9\\xcb\\x50\\x4e\\x9c\\x32\\x7f\\x1f\\x00\\x97\\x97\\x68\\xa2\\xb7\\xdc\\xb9\\x23\\x37\\x27\\x44\\xc3\\x6e\\x0e\\xdc\\xb8\\x96\\x87\\x07\\x2e\\x27\\x1d\\xab\\x1e\\x31\\xad\\x06\\x27\\x27\\x9c\\xcf\\xbb\\x01\\x76\\x0f\\x2f\\x18\\x44\\xa7\\xd4\\x09\\x15\\xbe\\xe5\\xd2\\xd6\\x4d\\x90\\x3c\\x72\\x7e\\x8d\\xbe\\xa0\\x5b\\x7e\\x1a\\x34\\x4d\\xc6\\x3a\\xb3\\x01\\x48\\x0c\\x3b\\xe4\\x9d\\xbf\\x0e\\x8c\\x9b\\xb8\\x19\\x03\\xeb\\xe5\\xb3\\xf5\\xcd\\xcb\\xeb\\x67\\x2f\\x6e\\x2c\\x32\\xdf\\xf9\\x2f\\x02\\xb8\\xa5\\x3b\\xc1\\x8b\\xf5\\x16\\x74\\x89\\x58\\x5f\\x6d\\x84\\xbc\\xe9\\xc7\\x99\\x98\\x61\\xce\\x20\\xa1\\x77\\x26\\x85\\x4b\\xcc\\x6b\\x58\\xa9\\x65\\x49\\x0b\\xac\\x5c\\xc5\\xfb\\x51\\x03\\x7d\\xc3\\x9f\\x50\\x91\\x2e\\x26\\x64\\x73\\x37\\x2a\\x01\\xfd\\xc5\\x1c\\x9c\\xe6\\xdd\\x25\\x20\\xe8\\x9a\\xb3\\x58\\xe3\\xdc\\xeb\\x80\\x4b\\x78\\xdf\\x04\\x9a\\x09\\x9a\\x21\\x96\\x47\\x3b\\x8a\\x2b\\xf0\\x1f\\xce\\x39\\x27\\x06\\x0c\\x66\\x08\\x7a\\x09\\x81\\x88\\x90\\xd3\\xad\\xd1\\x7c\\xe2\\xdf\\x8a\\xe6\\x13\\xbd\\x7e\\xfa\\x5e\\x47\\x8b\\x74\\x61\\x3f\\x79\\x7f\\xf2\\x2c\\x7d\\x22\\x8a\\x33\\xdf\\x26\\xf3\\x3e\\x20\\x79\\xe8\\x35\\x12\\xee\\x21\\xa5\\xab\\x4d\\xa7\\x76\\x76\\x22\\x2a\\x56\\x93\\x60\\x50\\x31\\x19\\x9d\\xdc\\x30\\xf4\\x40\\xfc\\xc4\\x69\\xe4\\xbf\\xea\\xb4\\x84\\xe8\\xcb\\x13\\xd2\\x57\\x9d\\x03\\xb4\\xba\\x5c\\x21\\xd4\\xe4\\xa9\\xf7\\x83\\xee\\x52\\xfc\\x38\\xf0\\x46\\xe2\\x00\\xde\\xee\\x33\\xb4\\xac\\x13\\xfd\\x0d\\xb5\\x65\\xdd\\xa6\\x6f\\xa0\\x73\\x6d\\xed\\x93\\x5a\\x95\\xf2\\xbd\\x76\\x0a\\xf7\\xbf\\x37\\xdd\\x5c\\xc7\\xe2\\xfb\\xd9\\x65\\x98\\x6a\\x12\\xc7\\xfe\\x75\\xfd\\x97\\x5e\\x37\\xeb\\xc9\\x78\\xf2\\x98\\x53\\xa9\\x5f\\xe5\\x35\\xa1\\xe4\\x4c\\x42\\x41\\x0a\\x8f\\x39\\x7a\\x3c\\xb9\\x9e\\x48\\xfb\\xcb\\x38\\x89\\xe8\\x38\\xbb\\x26\\x70\\xb2\\xde\\xcb\\x8d\\x9d\\x79\\xfc\\x90\\x16\\x24\\x80\\x5d\\x38\\x6f\\x59\\xc6\\xe5\\xfe\\x7b\\x56\\x64\\x87\\xc9\\xa8\\x65\\xb8\\x60\\xff\\xeb\\xce\\x2a\\xee\\xec\\x96\\x69\\xd3\\x86\\xcd\\xd0\\xa7\\x81\\x91\\xb6\\x95\\x61\\x19\\xff\\x3f\\xd4\\xc1\\xac\\x38\\xf2\\xaa\\xfe\\x1c\\x0f\\x65\\x04\\x1e\\x1f\\x84\\x61\\x14\\xdd\\x95\\xe7\\x35\\xff\\xcb\\xde\\xca\\x83\\x43\\x23\\x08\\xf4\\x28\\x61\\xdc\\x7c\\x27\\xb7\\xb2\\xa4\\xbe\\x78\\x66\\xf6\\xff\\x46\\xa3\\x83\\x10\\xc3\\xed\\x25\\xf7\\x7c\\x33\\x52\\x2f\\xf3\\x8a\\xfe\\xd8\\xb1\\xdf\\x04\\xc0\\xe9\\x6a\\xa3\\xae\\x57\\x8a\\xd0\\xb8\\x83\\xe0\\x95\\x58\\xa1\\xe4\\x1d\\xa2\\x01\\xab\\xd0\\x61\\x2a\\xa7\\x64\\xe8\\xbe\\x18\\x0d\\x23\\x66\\x23\\x97\\xd6\\xe1\\xd4\\x68\\x84\\x53\\x05\\x12\\xda\\xcb\\xa2\\x26\\x99\\x36\\xeb\\x50\\x78\\x44\\xfb\\xd4\\x0c\\x15\\x1c\\xe7\\x01\\xf1\\xba\\xc0\\xc6\\x68\\x34\\xa5\\x46\\x21\\xd5\\xed\\x7e\\x18\\x10\\x0c\\x58\\x34\\x8e\\xbf\\xec\\x8c\\x86\\xc1\\xa4\\x39\\x3c\\x1b\\x11\\x94\\x51\\xd3\\xe7\\x2c\\x9b\\xe1\\x34\\xa5\\xe3\\xdc\\xce\\xd6\\x2e\\x53\\x11\\x53\\x28\\x0d\\x3d\\xe6\\x4a\\xc5\\x06\\xc6\\x2f\\x38\\x07\\x8d\\x42\\x72\\x78\\x43\\x67\\xd8\\x5d\\xbd\\x9f\\x0c\\xb9\\x3a\\x81\\xe1\\xe4\\xe6\\x50\\xda\\x10\\xb4\\x06\\x95\\x32\\x82\\xe1\\xf4\\x36\\xf4\\xcc\\x3e\\xbb\\xac\\xbb\\xb3\\x32\\xec\\x68\\xfe\\x74\\xa4\\x7a\\xdb\\x9e\\xc5\\xc6\\xb5\\x38\\xb3\\x8c\\xf9\\x1d\\x8f\\xc1\\x3e\\xc4\\x63\\x04\\xe4\\x64\\xde\\x71\\x3e\\xe2\\x20\\x30\\x12\\x09\\x5a\\x33\\x69\\x51\\x46\\x0d\\x27\\x92\\xc3\\x59\\x8f\\xae\\x4f\\x1a\\xaf\\x5c\\x28\\x57\\xce\\x74\\x9d\\x12\\x28\\x82\\xae\\x0c\\x9f\\xff\\x36\\x54\\xdb\\x49\\xe3\\x7a\\x89\\xe0\\xd0\\x55\\xff\\x32\\x4a\\x56\\x1d\\x1e\\x46\\x2e\\x3c\\x0b\\x66\\x67\\x28\\xa1\\x7e\\x77\\x9b\\x87\\x62\\x26\\x46\\xfb\\x1a\\x46\\xe3\\xc1\\x4d\\xa9\\xa2\\x97\\xa9\\x1e\\x28\\x56\\x4f\\xe3\\x19\\xf1\\xcd\\xd1\\x7c\\x27\\x5a\\xe3\\xe9\\xa5\\x34\\x3c\\x43\\x15\\x61\\x46\\x8f\\xcd\\x9a\\x8d\\x8e\\xa9\\xcd\\xfe\\x76\\xf6\\xe8\\xe8\\x62\\xad\\x7b\\x3f\\x02\\x72\\x46\\xb9\\x52\\xf8\\xfa\\x81\\x8e\\x8e\\x2a\\x08\\x7c\\xc7\\x2f\\xd3\\x15\\xe4\\x03\\x47\\xcb\\xbd\\x3c\\x9f\\x29\\x69\\xbe\\x58\\xc3\\x01\\x6f\\x36\\x80\\xfb\\x61\\xf4\\xbe\\x03\\xca\\x0b\\xf7\\x4d\\x93\\xdf\\xac\\x27\\x82\\x9a\\x1c\\x6c\\x7b\\x66\\x7a\\xd3\\xd9\\x36\\x57\\xe0\\x77\\x20\\xe4\\xb2\\x6a\\xb1\\x0b\\x48\\xba\\x5f\\xf2\\x7b\\x27\\x22\\x9b\\x7b\\x31\\x5b\\xfe\\x2a\\xa0\\x07\\xc3\\x82\\x2f\\x82\\x78\\x29\\x76\\x99\\x43\\x08\\x81\\xd8\\x58\\x34\\xdc\\x81\\xa2\\x5f\\x39\\xaa\\x43\\x8b\\xe5\\x40\\x78\\x50\\x48\\xd3\\x5f\\x05\\x23\\xac\\x36\\x53\\x31\\xfb\\xd1\\x8c\\xc8\\xe0\\x69\\x65\\xf0\\xf1\\x9e\\xe9\\xed\\xfd\\x16\\x22\\x1a\\x13\\xd0\\xe6\\xd6\\x89\\x0a\\xe3\\x3b\\xc4\\x8a\\x70\\x87\\x92\\x53\\x27\\x2a\\xe5\\x37\\xb7\\x9b\\xdb\\xf9\\x9c\\xec\\x68\\x04\\xb7\\x33\\x4a\\x4b\\x94\\xe7\\x35\\x06\\xd9\\xc1\\x6c\\x85\\xc7\\x1f\\xa9\\xc0\\xbf\\x92\\xe3\\x4e\\x60\\x28\\x32\\xe1\\x46\\xe9\\x66\\xc1\\xbf\\x0d\\x60\\x07\\xb7\\x44\\x5e\\x55\\x2b\\xcd\\xbe\\x13\\x3f\\xe9\\xaf\\x9d\\x18\\x0d\\x52\\xf6\\x31\\x81\\x9c\\x11\\xb1\\xe2\\x9b\\xb4\\xeb\\x4f\\x22\\xaa\\xd2\\xac\\xee\\xce\\x64\\x75\\x67\\x9d\\x0e\\x64\\x37\\xd4\\xb4\\x0c\\x88\\x44\\x06\\x3b\\x54\\x4e\\x2c\\x8f\\x55\\xe4\\x15\\xcb\\x7f\\xf1\\x77\\x2c\\xff\\x7b\\x95\\x8b\\x3c\\xfa\\x59\\x7e\\x14\\x5c\\x66\\x5f\\x8b\\x68\\xaa\\xc7\\xd7\\x1d\\x86\\xd9\\x31\\xb0\\x2c\\x32\\x8a\\x09\\x2b\\xdd\\xfe\\xf1\\x40\\x4e\\xee\\xfe\\x37\\xa5\\x6b\\xc9\\x27\\x4b\\x73\\x37\\x22\\x49\\x3d\\x5a\\x60\\xd2\\x5b\\xd7\\x92\\x0c\\x85\\x4e\\xfd\\x0c\\x09\\xbd\\x85\\xf4\\xde\\xd2\\x88\\xe2\\xb3\\x3c\\x77\\x2d\\x03\\x69\\x4c\\x1c\\x7d\\x8e\\xc2\\x38\\xb3\\x21\\x71\\xc6\\x6b\\x0c\\x0a\\x29\\x2e\\xf3\\x6e\\x15\\x60\\x87\\x53\\x4d\\x65\\x08\\xad\\x88\\xee\\xf0\\xba\\xd1\\x7e\\xa7\\xcb\\xd5\\x17\\x0b\\x5f\\x38\\xdc\\xdf\\x05\\xc4\\x0f\\x03\\x27\\xea\\x8f\\x68\\x62\\x88\\x64\\xe0\\xf6\\x01\\x31\\x33\\x82\\x33\\xc7\\x9d\\x87\\xf1\\x3d\\x83\\x8a\\x0d\\xe2\\x32\\x1f\\x99\\x33\\x88\\xc4\\x54\\x38\\xd1\\x48\\xe2\\x0c\\x89\\x46\\xa7\\x6f\\x4a\\x47\\x9a\\xcb\\x11\\x3c\\x84\\x4d\\xb9\\x3e\\x5c\\xf9\\xa2\\xdc\\x1f\\x1e\\x6a\\x1e\\xbf\\xae\\xdf\\xe7\\x1c\\x43\\x72\\x5c\\xfc\\x8a\\xf7\\x6c\\x13\\xe2\\xc5\\x4b\\xe5\\x6c\\xec\\x4a\\xef\\x63\\x91\\x6c\\x38\\x20\\x6f\\xfa\\x80\\xa4\\x88\\xdd\\x1c\\x02\\xc9\\xf8\\x96\\x62\\x49\\x19\\x73\\x88\\x68\\xc5\\x7c\\xd6\\x9f\\x14\\xe0\\x95\\xd8\\xf2\\x02\\x69\\xa2\\x9c\\x9c\\x65\\x54\\x0a\\xf1\\xe5\\x9e\\x51\\xe7\\x9e\\x35\\x4d\\xe1\\x58\\x2f\\xb3\\xa4\\x62\\x7b\\x7e\\x85\\x7f\\xc3\\xb2\\x8a\\x79\\x45\\x3f\\x5a\\x7d\\x74\\x85\\xd7\\x9b\\xe1\\x93\\xbc\\xef\\x4c\\x3c\\x5e\\xdf\\x58\\xe6\\x34\\x84\\x63\\x4b\\x42\\x02\\x21\\xbd\\xc7\\x5b\\x5b\\x47\\x41\\xc0\\x21\\x5c\\x3e\\x56\\x59\\x2d\\x24\\x71\\x74\\xe2\\x55\\xf1\\x72\\x74\\xf7\\xee\\x59\\x37\\x40\\x02\\x38\\x0c\\x1a\\x11\\x88\\x5a\\xbc\\xdb\\x8a\\xd1\\xeb\\xb7\\x7b\\x56\\xa5\\x59\\x71\\x0d\\xef\\xa4\\x85\\x9b\\xf6\\x51\\x79\\xeb\\x58\\xf3\\xff\\x9e\\x5b\\xc4\\xf1\\x66\\x87\\x27\\xe2\\xb3\\xc5\\x6f\\xff\\x15\\xcc\\x9f\\x59\\x60\\x65\\x16\\x81\\x47\\x36\\xe5\\x2f\\x3a\\xba\\xa1\\xc5\\xf4\\xc6\\x58\\x96\\x07\\x5e\\xf0\\x6a\\x7c\\x89\\xcb\\x20\\x4b\\xca\\x47\\x0b\\x19\\x82\\x8c\\x19\\xc7\\x2e\\x7e\\x32\\xc0\\xec\\x89\\x5d\\xd2\\x7f\\xe1\\xa1\\x49\\xb7\\x76\\x34\\x6a\\x9a\\x47\\x54\\x28\\x45\\xb6\\xed\\xa4\\x14\\x21\\x5b\\x07\\x68\\x43\\x0d\\x9b\\x13\\x92\\xa6\\x89\\xd0\\x5f\\x46\\x64\\xb1\\xc4\\xda\\xa6\\xc8\\xb5\\x5e\\x56\\x9b\\xa1\\x37\\x4b\\x21\\x9b\\x92\\x77\\x1b\\xc0\\x3b\\x85\\xcb\\x52\\x62\\xdb\\x0f\\x4c\\xdf\\xa0\\x85\\xb0\\xbb\\x5b\\x22\\x04\\x00\\xa7\\xbb\\xe5\\x3e\\x2b\\x7e\\xc1\\x97\\x44\\xbc\\xb0\\x27\\xf9\\xd2\\xa7\\x1b\\xa9\\xba\\x1c\\x4d\\x41\\xf4\\xfb\\x51\\xe5\\x94\\x69\\xb1\\x59\\x86\\x83\\x51\\x2a\\x21\\x86\\x9d\\x7b\\xea\\xa5\\x73\\xcb\\x72\\xd3\\xf3\\x4b\\x5d\\x55\\xec\\xb9\\xc9\\x88\\x74\\x57\\x4c\\x5f\\x34\\x67\\x06\\x95\\x12\\x59\\xbb\\x5b\\x1d\\x68\\x48\\x2e\\x1c\\xe8\\xb6\\xed\\xd8\\x61\\x1f\\x55\\x11\\x34\\x9f\\x30\\x96\\x9d\\xf6\\xce\\x87\\xe4\\xc2\\x07\\x0c\\x73\\x23\\x67\\x9d\\x9c\\xd4\\xc3\\x32\\x64\\xd1\\x5d\\x5a\\x95\\x0f\\x45\\xfc\\x45\\x9e\\x1d\\xa8\\xa5\\xf6\\xcb\\x22\\x2c\\x9f\\x2c\\x48\\x46\\x7e\\xee\\xd3\\x45\\x2c\\xb8\\x43\\x96\\xaa\\x42\\xb6\\x01\\x41\\x6e\\x58\\x0f\\x46\\x1f\\x9a\\x2a\\x0b\\x5c\\x25\\x47\\xc7\\xe3\\x1b\\xfe\\x54\\x53\\x4b\\xee\\x7b\\x77\\xb5\\xc1\\x75\\x72\\x57\\x1b\\xb9\\xe7\\xdd\\xd5\\xa6\\x2e\\x0f\\xee\\x6a\\x93\\xf3\\xa4\\x76\\x17\\x7f\\xf9\\xcb\\x5f\\xfe\\x72\\x78\\xda\\xc8\\xcd\\xb8\\x10\\x5f\\xd6\\x87\\xa7\\xcd\\x41\\xdd\\xcf\\xe8\\xb2\\xf0\\x58\\xe6\\x0f\\x35\\xb7\\x80\\x0f\\x44\\xeb\\xc4\\x88\\xb1\\x99\\x3a\\xfd\\x1c\\x74\\xad\\x2f\\x1e\\x79\\x78\\x97\\x61\\xa7\\x17\\xc7\\xec\\xb7\\xac\\x48\\x5d\\xd9\\x21\\x91\\xb2\\x59\\xec\\xcb\\xdf\\x2e\\x7c\\x9a\\x4e\\xd5\\x28\\x35\\xcc\\xcb\\xe8\\x6e\\xd0\\xdb\\xff\\xda\\xa8\\x1f\\x35\\x5e\\xec\\x3e\\x8b\\x63\\x51\\x81\\x78\\x96\\xa3\\xff\\x64\\x7a\\x50\\xa6\\xb6\\xd0\\xb2\\x20\\x1e\\x29\\xcb\\x36\\x32\\xa8\\xf0\\x04\\x1e\\x48\\x24\\x1e\\xd8\\x84\\xd4\\x5a\\xff\\x17\\x6e\\xd4\\x65\\x5d\\x1e\\x20\\xa2\\xd6\\x27\\x07\\x5c\\xa5\\x54\\x6d\\x93\\x78\\x20\\x11\\x72\\xd2\\x9e\\x57\\x66\\x18\\xcf\\xdd\\xc1\\xe9\\x90\\x3d\\xf1\\x5c\\xdf\\x8f\\x39\\xb1\\x23\\x52\\x81\\x6f\\x5b\\x08\\xcb\\xa7\\xd7\\x38\\x4b\\x3f\\xf3\\x3c\\xbb\\x10\\x3e\\xbd\\x33\\xd0\\x10\\x65\\x22\\x21\\x15\\xc8\\xac\\xdf\\xe3\\xf4\\x61\\x68\\x8d\\xb1\\x74\\x10\\xa2\\xf9\\xd0\\x1f\\x88\\x5b\\xd1\\xe1\\xb5\\xd1\\xc2\\xff\\x11\\x40\\x30\\x00\\xfa\\x0c\\x12\\xcc\\x6f\\x17\\x92\\xa7\\x60\\xc1\\x5d\\x6d\\x3a\\x78\\xd7\\xab\\xbf\\xb2\\x40\\xf7\\x6e\\xdf\\x8f\\x98\\xea\\x34\\x89\\xbe\\xac\\x95\\x80\\x82\\x41\\xca\\xfa\\xf0\\x74\\x0e\\x0a\\x10\\xd2\\x19\\x06\\x66\\xfb\\x3a\\x2f\\x59\\xed\\x4c\\x80\\x44\\x24\\x41\\xc2\\x6c\\x8b\\x9c\\x2d\\x3f\\x24\\x23\\x0d\\x01\\x84\\x6d\\x4b\\xda\\x16\\xdd\\xcd\\x8e\\x8f\\xec\\x70\\x16\\x6f\\x55\\x19\\xcc\\xa2\\x27\\x8e\\x3a\\x55\\x4b\\x64\\x70\\xc7\\xd4\\x4f\\x02\\x4d\\x66\\xfc\\x24\\x80\\xfe\\x91\\x86\\x7e\\x12\\x6c\\x38\\x8d\\xba\\x80\\x08\\x32\\x4c\\x93\\x59\\xda\\xc8\\x2d\\x2a\\xea\\xd8\\x12\\x19\\x9a\\xef\\x37\\x41\\xa1\\x1d\\xc1\\x61\\x34\\x78\\xe0\\xeb\\x78\\xb3\\x45\\xe4\\x73\\x16\\x90\\xe5\\x9c\\x5c\\xc3\\x67\\x17\\x68\\xf6\\xf2\\x39\\xd1\\xa4\\xfa\\xf3\\x71\\x16\\x7f\\xbe\\x08\\x08\\x55\\x39\\x55\\xa6\\x2f\\x18\\x3d\\x75\\xdb\\xd2\\xea\\xf7\\xe5\\xbb\\xec\\x98\\x85\\x59\\x9e\\xd5\\xef\\x5d\\x6b\\x97\\xc5\\x31\\x2f\\x2c\\xd0\\xcb\\x6e\\xe1\\xba\\x5b\\x2d\\x7c\\xc9\\xe8\\x29\\xe7\\x75\\xcd\\xab\\xd7\\x07\\x16\\x89\\x15\\xc7\\xc5\\x2c\\x8b\\xfa\\x17\\x89\\xe9\\xac\\x4f\\x56\\x2b\\xab\\x85\\xaf\\x18\\xf5\\xad\\x5f\\x10\\x0a\\x2d\\xb0\\x7e\\xb4\\xc0\\xfa\\xbe\\xfc\\xcd\\x02\\x6b\\x7f\\xb4\\x82\\x1e\\x8b\\x7d\\xad\\xc8\\x51\\x96\\x38\\xa1\\x34\\x57\\xd1\\xdc\\x85\\x0a\\x5a\\x15\\xe2\\xd5\\xbe\\xe5\\xdf\\x0f\\x07\\xad\\x1d\\x98\\x6b\\xaf\\x9c\\xb5\\x10\\x9e\\x42\\xe0\\xf4\\x2b\\x36\\x34\\xcd\\xe7\\xd2\\x25\\x3f\\xa4\\x5f\\x31\\x9f\\x07\\xf3\\x08\\xc6\\x55\\x6b\\x73\\x9d\\x9e\\x2c\\xfe\\x75\\xc8\\x4f\\xd0\\xcf\\x94\\x9e\\x22\\xec\\xaf\\x43\\xf4\\xf0\\x16\\xf2\\x3d\\x7b\\x72\\x56\\x10\\xfb\\xeb\\x60\\xe1\\x44\\xe8\\x32\\x31\\x77\\x62\\xe9\\xdc\\x7f\\x78\\xb2\\x88\\x1b\\xf6\\x75\\x7e\\xc3\\x4c\\x63\\x31\\xcd\\xb7\\x27\\x34\\x42\\xcf\\x56\\x4f\\x91\\x0a\\xcb\\xd5\\xa4\\xc6\\x22\\xde\\x27\\xae\\x25\\x2f\\xc3\\xc5\\xb0\\x4d\\x6b\\x0c\\x11\\xbe\\xda\\x7c\\x72\\x93\\x6c\\x92\\x39\\x7d\\x41\\x2c\\x09\\xe5\\xea\\xec\\xd1\\x49\\xe7\\x5d\\xa8\\x9d\\x68\\xfe\\x33\\xba\\xe8\\xaf\\xf0\\x1a\\x96\\xd8\\x73\\xba\\x4a\\x75\\xde\\x45\\x1f\\x96\\x47\\x6d\\x55\\x6b\\x50\\x46\\xd7\\x3d\\x3b\\xcf\\xaf\\x3a\\x8a\\xd9\\xe7\\xd6\\x2f\\xf2\\xb6\\x5e\\x59\\x8c\\xb8\\x66\\x2f\\xa6\\x6a\\xee\\x13\\x67\\x67\\xbd\\xfe\\x60\\xcd\\xdd\\x29\\x5e\\x3f\\xa3\\xdf\\x8e\\x56\\x49\\xe4\\xa4\\xe6\\x8c\\xb1\\xa5\\xf4\\x1e\\xc2\\x9a\\x5c\\xfd\\xf6\\x0d\\x02\\x26\\x24\\xf4\\x51\\x1d\\x2d\\x5a\\x3d\\x8d\\x1b\\xc4\\x2b\\xea\\xd0\\xbb\\x25\\xe4\\xf3\\x04\\x19\\x8e\\xd5\\x0d\\xe5\\x4d\\x23\\x91\\xba\\xba\\xf7\\x8d\\x2a\\xee\\x33\\x21\\xe0\\xac\\x6e\\x8c\\xaf\\x78\\x5a\\xa2\\xb7\\xb8\\xe0\\x28\\xdf\\xf5\\x87\\x71\\x7a\\xa7\\x6f\\x62\\x9a\\xda\\xb6\\x73\\xb7\\x3c\\xa3\\x25\\x0e\\x69\\x1a\\x8e\\x6a\\xc7\\xbe\\x02\\x4e\\x0d\\xf4\\xc7\\x49\\xd3\\xac\\xba\\xe0\\x82\\x73\\x0d\\x5f\\x82\\x1b\\x9d\\x82\\x26\\x88\\x21\\x21\\x73\\x01\\x96\\xfd\\x0c\\xfe\\x6d\\x6c\\x09\\xa1\\x0e\\x89\\xf0\\xfa\\xb5\\x15\\x32\\xd0\\x6a\\x2b\\xed\\xd4\\x4d\\x33\\x31\\x1e\\x10\\x41\\x2c\\x3b\\x65\\xdb\\x18\\xaa\\x4a\\x85\\xb2\\x89\\xc1\\x2a\\xf3\\xb8\\x13\\xb2\\x30\\x36\\xaa\\x44\\xea\\x2a\\x0d\\x42\\x0f\\xf3\\x37\\x4d\\x2f\\x37\\x35\\x8d\\x33\\xca\\x45\\xbb\\xbb\\x94\\x47\\x1f\\x6c\\xfb\\xb5\\xf4\\x22\\x56\\x6d\\x76\\x46\\x9d\\x66\\xb3\\x50\\x33\\x27\\xee\\x0e\\xeb\\x09\\x91\\x71\\x5e\\x5f\\x63\\xcc\\x50\\x1d\\x91\\x2a\\xb2\\x6d\\xde\\x34\\xd2\\x9e\\x62\\x54\\x9a\\x7b\\x91\\x12\\x19\\x63\\x43\\x5e\\x24\\xea\\xa2\\xd4\\x14\\x7d\\x1c\\x2f\\xcc\\x44\\x68\\xdb\\xdd\\xb0\\xce\\x7a\\x6e\\x4d\\xa4\\x4e\\x0c\\x3d\\xf4\\xd4\\xfc\\x58\\xae\\xac\\x8b\\x0c\\xaf\\x26\\xd3\\x67\\xff\\xc7\\xa3\\x72\\x66\\x2a\\x05\\xd6\\xad\\xdf\\xbb\\xa7\\xf3\\x88\\xc2\\x78\\x98\\xae\\xcc\\x17\\x10\\x44\\x2d\\x95\\xb9\\x93\\x7f\\x55\\xe8\\x53\\x6b\\x6d\\xb9\\x51\\xdb\\xb6\\x2d\\x44\\xc7\\xe3\\x0f\\x0f\\xfb\\x90\\x57\\xee\\x29\\x2a\\xf3\\x87\\x7d\\x81\\x7e\\xa6\\xee\\x6c\\x05\\x49\\x96\\xe7\\x3f\\xaa\\xb6\\xc4\\x6b\\xce\\x9f\\xfe\\x5a\\x95\\x8f\\xfa\\xf9\\xf5\\xae\\xca\\x8a\\x3b\\x7c\\xeb\\x51\\xff\\x6c\\x05\\x79\\x56\\xf0\\x6f\\xba\\xb7\\xb2\\xaf\\x40\\xf2\\x09\\xf8\\x70\\xd8\\xb1\\x02\\xef\\x6e\\x7c\\xcc\\xe2\\xf2\\x11\\x9f\\x7e\\xfb\\x16\\x6f\\xc1\\x13\\x4f\\x65\\xb9\\x47\\x0f\\xa6\\xe8\\x88\\xa6\\xf6\\x47\\xf7\\x64\\x25\\x02\\xfc\\x05\\x68\\x1f\\x8f\\xb8\\x13\\xac\\x16\\x70\\x16\\x27\\x8e\\xe6\\xa5\\xb5\\xe6\\xc7\\x23\\xfb\\x85\\xff\\x33\\x7a\\x67\\x5a\\x8a\\x30\\x4e\\xf1\\xc7\\xa1\\x81\\xb3\\xb1\\x30\\x19\\x4a\\x44\\x81\\x9d\\xf2\\x77\\x01\\xc6\\xdd\\x37\\xde\\xe9\\xd7\\x0c\\xd5\\x52\\x02\\xc1\\xe0\\x07\\xe9\\xb4\\x16\\xe2\\x05\\x58\\xdd\\xeb\\x2e\\x00\\x23\\xf2\\x72\\x6a\\xdb\\x56\\xca\\x6b\\x2b\\x2b\\xae\\x52\\x23\\xe2\\xa5\\xc3\\x69\\xaa\\x42\\x14\\xce\\xd6\\x10\\x13\\xe2\\x71\\x37\\xf3\\xc3\\xc0\\x75\\x92\\x2e\\xfa\\xad\\x11\\x10\\x97\\x26\\x88\\x78\\x3e\\x57\\x34\\x2b\\x22\\xd2\\x60\\xd3\\xe1\\xfe\\x3a\\x98\\xaf\\xc9\\x73\\xee\\xbf\\x08\\xe6\\x06\\x1e\\xd1\\xf8\\x4e\\xc8\\xad\\x09\\xb5\\x0a\\x04\\x00\\x8b\\x80\\x3c\\x09\\x89\\x6c\\x3b\\x52\\x44\\x43\\x7f\\x9a\\xa1\\x17\\x20\\x16\\x93\\xd0\\x22\\x87\\x1f\\xcd\\x29\\x12\\xbd\\x73\\xf1\\x49\\xc0\\xb3\\xdc\\xeb\\x2b\\xb4\\x51\\xeb\\x02\\x74\\xf4\\xe2\\x93\\x85\\xf1\\xaa\\xfc\\x30\\xa0\\x56\\x56\\xec\\x78\\x95\\xa1\\x81\\x86\\x6d\\x5b\\xc7\\xd1\\x7c\\x50\\x3c\\xa5\\x4e\\x55\\x14\\x5e\\xb1\\xc8\\x5d\\xc9\\xa8\\x93\\x75\\x89\\x84\\xe5\\x4b\\x8e\\x4f\\x93\\x2b\\xfc\\x1f\\xac\\xab\\x82\\x84\\x3f\\xb2\\xba\\xc3\\x25\\x35\\x57\\x72\\x05\\x7d\\x7f\\xbb\\x48\\x99\\x8a\\x94\\xc4\\x04\\xb1\\x55\\xb5\\x67\\xb9\\x8a\\xa2\\x89\\x3c\\xcb\\x97\\x0c\\x33\\x7d\\x89\\xf7\\xd6\\x48\\x14\\x19\\x35\\x4d\\xe4\\x39\\xc9\\x90\\x2e\\x48\\x83\\xdc\\x95\\xb4\\xcb\\xf9\\xe1\\x61\\xcf\\xab\\x2c\\x72\\x12\\xe2\\x25\\x4d\\xb3\\x72\\x39\\x71\\xb9\\xa1\\xcd\\xf4\\x2d\\x29\\x92\\x5a\\xa0\\x28\\x67\\x70\\xa6\\x75\\x34\\x86\\x47\\xc7\\x78\\xc6\\x34\\xa5\\x8e\\xbc\\xdf\\x14\\x81\\x3b\\x0f\\xf9\\x47\\x6c\\x5b\\x3a\\x37\\x19\\x14\\xd9\\x93\\xdc\\xb6\\xc3\\xe0\\x0b\\xe3\\x96\\xf0\\xae\\xba\\x6f\\xf5\\x5c\\xb4\\xc4\\xed\\x9e\\x3b\\x47\\xbc\\xe3\\x44\\x3f\\xa4\\x57\\x5b\\x6c\\xdb\\x48\\xd9\\xf5\\x82\\x22\\x33\\x17\\x41\\xec\\x29\\x0a\\x19\\xc3\\x1f\\x23\\xf8\\x9c\\x00\\x27\\xee\\x4a\\x3b\\x00\\xe8\\x59\\x18\\xc8\\x31\\xef\\x99\\x73\\xb7\\x9c\\x10\\xe9\\x60\\xf2\\x90\\x2f\\xec\\x47\\x7c\\xea\\x38\\xe9\\xac\\x10\\x48\\x72\\xa1\\x19\\xea\\x27\\x06\\x3e\\xd3\\xec\\x97\\x8c\\xbc\\x18\\x18\\x01\\xd4\\x3a\\xbf\\x1b\\x29\\x71\\x59\\x16\\x68\\x49\\xcb\\xb2\\x40\\x49\\x5f\\x8a\\x73\\x3a\\x57\\x1f\\x77\\x0b\\xc9\\xe6\\x62\\x29\\xa5\\x8d\\x84\\x6b\\x1e\\x7d\\x68\\x46\\x40\\x1a\\x59\\x9d\\x5a\\x81\\x10\\xce\\x22\\x6d\\x7b\\x91\\xe1\\x66\\xed\\xfa\\x51\\xb0\\xf9\\x44\\x19\\x61\\x71\\x9f\\xcd\\x7f\\xf6\\xe3\\x40\\x54\\x9f\\xf8\\x71\\xd0\\x34\\x89\\x1f\\x2f\\x5e\\xe0\\xef\\xca\\x10\\x6f\\x5a\\x78\\x60\\xfd\\xe5\\xae\\xce\\xa8\\x67\\x62\\x6f\\xd3\\xbf\\x32\\x32\\x36\\xdc\\x18\\xef\\xe8\\xcb\\xe7\\x9a\\x23\\x5d\\xa0\\x18\\x88\\x20\\xdd\\x2a\\x92\\xbf\\x8e\\x0f\\xaf\\x83\\x17\\x48\\x3e\\x90\\xf7\\xa1\\xbc\\xb8\\x22\\xf1\\x89\\x1f\\xfa\\x69\\x10\\x74\\x00\\x22\\xde\\x24\\x0a\\xee\\x43\\xf9\\x0f\\x4c\\x44\\x30\\xd2\\xbd\\xa1\\x09\\x04\\x3c\\x70\\xd0\\xe8\\xb5\\x05\\x36\\x19\\xa2\\x98\\xb4\\x70\\xdc\\x95\\x8f\\x13\\xca\\x83\\xbf\\x29\\xa3\\x05\\x3c\\x5b\\xdb\\x65\\xf1\\x94\\x82\\x41\\xe5\\x21\\x2d\\xd4\\x65\\x9a\\xe6\\x53\\x21\\x51\\xad\\xb0\\x2c\\x73\\xce\\x0a\\x33\\xe4\\xb4\\x0a\\x3a\\x2d\\x1a\\x56\\x97\\x49\\x2d\\x45\\x03\\xfa\\x79\\x6c\\xcd\\xf2\\x5a\\x36\\xe2\\xc9\\x7b\\xb3\\x89\\x2e\\xa7\\x5f\\x65\\xd1\\x76\\x78\\xef\\xcb\\x77\\x03\\x89\\x47\\xeb\\x43\\xf8\\xe3\\xd5\\x77\\xac\\x77\\x1f\\xc4\\x3b\\xd0\\x8d\\x7c\\x6d\\xb1\\x7c\\xf3\\xc8\\x79\\x41\\xbf\\x63\\x60\\xe6\\xa3\\x27\\xe3\\xaa\\x71\\xf7\\x3b\\x06\\xa2\\xdc\\x84\\x1f\\x0e\\x24\\xca\\x16\\x82\\xe7\\x7c\\xaf\\x9d\\x32\\x0f\\x55\\x79\\xa0\\x91\\xf6\\x4c\\x38\\x66\\x05\\x5e\\xab\\x68\\x1d\\x1f\\x71\\xaf\\x4b\\x97\\x08\\x34\\xca\\x3e\\xd2\\x50\\xfb\\xbc\\xb1\\xaa\\xd6\\x96\\x24\\x8f\\xea\\x22\\x02\\xf4\\x4e\\x96\\x95\\x14\\x31\\x8d\\xe5\\xe3\\x03\\xde\\xe1\\xae\\xa1\\x58\\x11\\xc4\\x28\\xf0\\x04\\x0b\\x27\\xc8\\x61\\x0b\\xd1\\x43\\x75\\x7e\\x00\\x2c\\xc7\\x76\\x90\\x50\\xdf\\x75\\xb2\\xf7\\x19\\x17\\x5c\\x49\\xca\\x6b\\x69\\x16\\xab\\xec\\x8d\\xcc\\x32\\x7d\\x90\\x9e\\xee\\x7b\\x0b\\xd5\\xc3\\xc4\\x05\\x55\\x10\\xfd\\x5e\\x63\\xe6\\x04\\x2c\\xe3\\x87\\x0a\\xdd\\xfc\\x94\\x6b\\x7c\\x79\\xa4\\x82\\x22\\xca\\x59\\xf3\\x8d\\x19\\x0c\\xb4\\x11\\xc9\\xb8\\xe0\\x73\\x06\\x2b\\x58\\x4f\\x7f\\xd3\\x5e\\xf5\\x58\\xab\\x36\\x42\\x29\\x1f\\xa9\\xa3\\x67\\x75\\xd1\\xcf\\x3e\\x79\\x1e\\xce\\xfb\\xb7\\x61\\x7d\\xc7\\x9a\\x1f\\xd4\\x99\\xbc\\x99\\xd4\\x9f\\x4d\\xca\\x20\\x2f\\xba\\x7e\\x7d\\xd7\\xb5\\x6d\\x63\\x2c\\x56\\x2f\\xea\\x02\\x88\\x5f\\x9a\\xd4\\xee\\xbb\\xbc\\xdc\\xa9\\x85\\x33\\x98\\x35\\x40\\xd3\\xfc\\x06\\x66\\x7d\\xf4\\xd4\\xf9\\x0d\\x8c\\x08\\xa7\\x5a\\x9b\\x71\\xe8\\x09\\xd1\\x6b\\x5f\\x56\\x80\\x96\\xf8\\xe2\\x5d\\x0b\\x18\\xea\\x9e\\x36\\x23\\x4d\\xe7\\xf4\\x9c\\x50\\xe3\\x28\\x39\\x6e\\x99\\x0e\\x42\\x90\\x12\\x52\\x09\\x7b\\xa8\\x4b\\xc1\\x80\\x85\\x5e\\xe8\\xae\\x88\\x3b\\x6c\\x66\\x4c\\x4a\\xf1\\x9c\\xf1\\x09\\xa7\\xb3\\xab\\xff\\x2c\\x05\\xef\\x89\\x1f\\xf4\\xce\\x99\\xe8\\x9e\\xc1\\x38\\xa9\\x72\\x43\\xfe\\x48\\x25\\x92\\x1e\\x65\\x0e\\xba\\x2f\\x58\\xf4\\xc7\\x39\\xde\\xff\\x59\\x8f\\x7b\\x8d\\xfc\\xfb\\x63\\xdb\\x2d\\x8c\\x5a\\xbf\\x2e\\xc4\\x05\\x9d\\x48\\x7e\\xc5\\x93\\x1a\\x3d\\x19\\x87\\xb1\\xa1\\x64\\x8f\\x4d\\x69\\x00\\x13\\x06\\x36\\x49\\x53\\x8d\\x6b\\x37\\x58\\x44\\x27\\x27\\x41\\xc4\\x59\\x35\\x79\\x4f\\x67\\x0b\\x88\\x68\\x26\\xbe\\x2d\\x3f\\x5d\\xa0\\x1a\\x29\\x2a\\x8f\\x0e\\x7b\\x8e\\x8f\\x3f\\x7d\\x4b\\xae\\x5f\\x60\\xcd\\xc9\\x13\\x3d\\x03\\x3a\\xe8\\x56\\x82\\x9e\\xd4\\xfd\\x1d\\x0c\\xbe\\x67\\xf0\\x03\\x93\\xf1\\x72\\x25\\x09\\x68\\x04\\x76\\x6e\\x04\\x4e\\xc6\\xfb\\x3a\\xc6\\x4a\\x40\\xcf\\x55\\x7a\\xc0\\x86\\x68\\x9d\\xa1\\x3c\\xe2\\xeb\\x15\\x87\\x3f\\x31\\x7a\\xdd\\x07\\x9f\\x7e\\x76\\x0d\\xff\\xcd\\xa8\\xff\\x0f\\x16\\xc0\\xcf\\x8c\\x9e\\xac\\xe7\\x96\\xeb\\x5f\\x72\\xaa\\xd2\\x76\\xb6\\x02\\x87\\xf7\\xb1\\xe5\\x25\\xea\\xe4\\xf4\\xc7\\x4e\\x91\\x06\\x89\\x60\\x6b\\xb9\\xff\\x71\\x30\\x42\\x9d\\xac\\x47\\x9d\\x90\\xd2\\xd1\\x27\\xa9\\x57\\x9b\\xa1\\x8c\\x33\\x8f\\x89\\x6d\\xeb\\x0a\\x25\\xf8\\x47\\x0a\\x7e\\x08\\x81\\x1d\\x5d\\x43\\x46\\x5f\\x20\\xd1\\x4f\\x6d\\x3b\\xf5\\x3f\\x0e\\x44\\x31\\x65\\x05\\x2d\\x5e\\x81\\x0b\\x22\\x80\\xaa\\x8e\\x79\\xdc\\x34\\xeb\\x4d\\x5c\\x5e\\xed\\xe8\\xae\\x69\\xac\\xe5\\xa7\\x16\\xa4\\xd7\\x74\\x07\\x1a\\x2e\\x75\\xbd\\x90\\xce\\x13\\xa2\\xd4\\x8a\\x3b\\x21\\x99\\xed\\xf4\\xd8\\xae\\x63\\x75\\xa9\\xf8\\xce\\xb6\\x17\\x8b\\xac\\xbf\\xf4\\x41\\x9d\\x33\\x4a\\x7a\\x32\\x4f\\x9b\\x46\\xb4\\xb5\\x82\\x48\\xd1\\x0d\\x88\\x90\\x96\\x08\\xd9\\xcc\\x4b\\xe7\\x03\\x19\\xcd\\x9d\\x8b\\xbf\\x04\\xa2\\x36\\x30\\x8e\\x3a\\x5f\\xb3\\x9e\\xf4\\x1b\\x17\\x95\\x99\\x41\\xe8\\x75\\x8c\\xf1\\x96\\xc0\\x2b\\x46\\x95\\x93\\x7f\\xaf\\xf4\\x79\\x33\\x74\\x4c\\x91\\x9c\\x9e\\x3a\\x97\\x62\\x52\\xb9\\x1d\\x4a\\x75\\xa3\\xe2\\xeb\\xe8\\x8b\\x45\\x48\\x22\\x2a\\x18\\x3b\\xe0\\xbe\\xd6\\x0c\\xce\\xa3\\x80\\x72\\xbf\\xd7\\xf1\\x45\\x01\\x65\\xc6\\x7d\\xe8\\x0e\\x5f\\x2a\\x71\\x9f\\x6a\\xa5\\xbe\\x60\\xb2\\xfa\\x6e\\xfc\\xbd\\xd3\\xde\\x75\\x4c\\x27\\x70\\xea\\xfc\\xcc\\x50\\x8a\\xf2\\x03\\xa2\\x03\\xb2\\xfc\\xcc\\x7c\\xeb\\xb9\\x15\\x10\\xbc\\xad\\xb6\\xb7\\x6c\\xd8\\xa4\\xa8\\x07\\x9d\\xcb\\xcb\\x64\\xb8\\x9f\\x04\\x12\\xfb\\x47\\x82\\xc7\\xea\\x14\\x6c\\x86\\x52\\xf7\\x1f\\xd3\\x87\\xc4\\x3a\\x32\\xac\\x34\\x38\\xda\\x53\\x0c\\xb3\\xaa\\x25\\xbc\\xc3\\x40\\x4f\\xf0\\x5a\\xf0\\x89\\xf7\\xdd\\xc5\\x0d\\x56\\xf2\\x24\\x36\\x1a\\x06\\x09\\xc7\\xcd\\xd2\\x34\\x68\\x4f\\x33\\xbc\\x31\\x01\\xaf\\x7d\\x00\\x89\\xe0\\x77\\xcb\\x87\\x02\\x3f\\xc6\\x68\\xad\\xa2\\x5f\\xf0\\x06\\xb7\\x9d\\x71\\x97\\x01\\x98\\x2f\\x66\\xc8\\xf9\\xbe\\x4c\\xd3\\x64\\x82\\xe1\\x82\\x3e\\x65\\x3e\\x87\\x7c\\x29\\xef\\x5e\\x35\\xc1\\x61\\x2a\\xad\\x2f\\xb4\\x58\\x40\\x7f\\x11\\x04\\x76\\xb5\\x33\\x0c\\xdb\\x0d\\x2f\\x57\\xc0\\x1b\\xd9\\xce\\xec\\x20\\xb5\\xf4\\x98\\x15\\x57\\x61\\xd3\\x28\\x11\\x12\\xcf\\x36\\x6c\\xdb\\x89\\x96\\xe5\\x3b\\x5e\\x25\\x79\\xf9\\x48\\xfd\\xb2\\x7b\\x86\\xfe\\xf1\\x57\\xe3\\xf9\\x9f\\x01\\xdc\\x4e\\xc4\\x8a\\x87\\x3b\\xda\\xe9\\xed\\x6e\\xbd\\x6e\\xea\\x4d\\x45\\x63\\xd3\\xd4\\x42\\x26\\xef\\x74\\x7e\\xee\\x2d\\x28\\xa9\\x4a\\x14\\xba\\xd3\\x6a\\x39\\x53\\xd2\\x93\\x2a\\x24\\xd1\\xc7\\xb2\\x57\\x3b\\x0e\\x24\\x31\\xb4\\x29\\xd5\\x7d\\xc3\\x7c\\xdd\\x58\\xba\\xd3\\x90\\xa9\\xa9\\x35\\xf2\\xf5\\xe5\\xfd\\x55\\x60\\x8e\\xda\\xfc\\xb2\\x36\\xbf\\xfc\\xd3\\xfc\\xf2\\x22\\x68\\x95\\xda\\x51\\x5d\\x24\\x86\\xca\\xe6\\x50\\xec\\xc2\\x1f\\x3a\\xdf\\x0c\\x54\\x71\\xa9\\x73\\x79\\xfc\\x84\\xe8\\xcd\\x92\\x74\\x00\\x75\\x07\\xc0\\x29\\xa5\\xce\\xc1\\x13\\xbd\\xe6\\x96\\x6b\\x49\\x90\\xc5\\x72\\xf2\\x59\\xde\\x4d\\x3a\\xbb\\x37\\x62\\x90\\xdc\\xfb\\x71\\x40\\xa2\\xb2\\xa8\\xb3\\xe2\\x81\\x6f\\x0e\\x74\\xb6\\x6a\\xf7\\x7e\\x1c\\xd0\\x7b\\xdb\\xbe\\x47\\xb1\\xae\\x97\\x71\\x62\\x15\\xe9\\xf6\\x56\\xdf\\x82\\x34\\x71\\x5d\\xda\\x9e\\x10\\x63\\x41\\x1c\\x63\\x3d\\xc7\\x0b\\x37\\x5c\\x91\\x5b\\xe9\\xc7\\x72\\xba\\xf7\\xf4\\x94\\x67\\xc5\\xd5\\xbd\\x6d\\x3b\\x07\\x7a\\xbf\\x94\\x29\\xc4\\xbd\\x37\\xaf\\x49\\xd1\\x5b\\x12\\x4e\\x2d\\x81\\x04\\x03\\xc9\\xca\\x7c\\x74\\x76\\x20\\xf0\\xff\\xe7\\xee\\x4f\\xdb\\x1c\\xb7\\xb1\\x43\\x71\\xfc\\x7d\\x3e\\x85\\x44\\x3b\\x32\\x51\\x82\\x54\\x52\\xb5\\xc7\\x99\\x50\\xcd\\xd2\\xdf\\xeb\\x4c\\xcf\\xf5\\x16\\x77\\x3b\\xf1\\x44\\xd6\\xf4\\x05\\x49\\x50\\x62\\x95\\x8a\\x94\\x49\\xd6\\x36\\x25\\xdd\\xcf\\xfe\\x7f\\x70\\x0e\\x56\\x2e\\xaa\\x6a\\x4f\\x92\\x27\\xcf\\xef\\x45\\x77\\x89\\x20\\x00\\x62\\x39\\x38\\x38\\xfb\\xd9\\x2f\\xc5\\xdd\\xab\\x78\\x97\\x1d\\xe6\\xef\\xb4\\x9d\\x8a\\xc5\\x5b\\xc5\\xca\\xd0\\xf6\\x7b\\x24\\xd9\\xec\\x18\\xbc\\x1a\\x03\\x00\\xd6\\x14\\xdb\\x74\\x43\\x6c\\xfe\\xef\\x66\\x15\\xad\\xc9\\xd1\\xda\\xc5\\x1b\\xb2\\x09\\x7f\\x66\\xfe\\x7e\\x29\\xd6\\x31\\x98\\xd1\\x84\\xee\\x08\\x85\\x37\\xbf\\x1d\\x0e\\xbe\\x28\\x0c\\x37\\x92\\xe0\\xdd\\x8b\\xab\\x03\\x6e\\x07\\x55\\x22\\xff\\x5a\\x3a\\x8e\\xe4\\x70\\x50\\x27\\x10\\x12\\x04\\xcf\\x83\\x99\\xe3\\x79\\xf7\\x1f\\x5d\\x4e\\x88\\x30\\x9a\\x18\\x95\\x60\\x80\\x3c\\x6d\\x41\\x58\\x0c\\x9c\\x30\\x42\\x12\\xf8\\x3e\\x1a\\x8e\\x39\\x45\\x8d\\x46\\x2a\\x60\\x16\\x5f\\x86\\x82\\xad\\x27\\x34\\x96\\x79\\x21\\x99\\x18\\x7e\\xaa\\xc2\\x20\\x8b\\x0a\\x0d\\xf9\\x58\\x82\\x02\\x31\\x14\\x3c\\x80\\x4c\\x4c\\xdc\\xc7\\x1b\\xe9\\xad\\xe1\\xa7\\xc4\\xb4\\x4d\\xd6\\x66\\x98\\x29\\xc1\\xd1\\x1e\\x0e\\xbe\\x0e\\xae\\x45\\x21\\x69\\x3f\\x97\\xd0\\x27\\x06\\x1c\\x5a\\x97\\xcb\\x2f\\x6d\\x5c\\x0f\\x97\\xc7\\xbf\\x31\\x93\\xc9\\xc3\\xce\\xf6\\xd1\\x71\\x90\\x55\\x30\\x67\\xb8\\xfa\\x8f\\x84\\x66\\x36\\x1e\\x16\\x47\\x91\\xa8\\x1c\\x02\\x0b\\xed\\x65\\x13\\x7e\\xcb\\x0e\\x07\\x71\\x43\\xd3\\x38\\xb4\\xf4\\x83\\x57\\xb8\\x6f\\xe2\\xae\\x1e\\x5f\\x69\\x5e\\x68\\x82\\xb4\\xd1\\xb9\\x29\\x11\\x84\\x41\\x1a\\xce\\x27\\x09\\x68\\x5f\\xb2\\xf0\\x6a\\x5a\\x0b\\x32\\xca\\x18\\x62\\x4b\\xb9\\x84\\x2a\\x5f\\x6d\\xd6\\xd3\\xf2\\x36\\xf7\\x53\\x93\\xfb\\xc3\\x4e\\xe5\\xcb\\xe8\\xea\\x8a\\xa6\\x54\\xec\\xc2\\xfc\\x32\\x1d\\x8d\\xb2\\x65\\x1c\\xf8\\x5b\\x27\\x5f\\x89\\xa8\\xb2\\x26\\x18\\x14\\xe9\\x2a\\xdc\\xea\\xac\\x21\\x18\\xfe\\x90\\xc9\\x10\\x87\\xb6\\x93\\x67\\x44\\x68\\xb1\\xaf\\xad\\xb2\\xe1\\x8c\\x3e\\x49\\x67\\xa2\\xaf\\x81\\x16\\x0e\\x9e\\x8e\\x47\\x1a\\x13\\x1d\\x2f\\xca\\xe4\\x7f\\x0c\\x22\\x5d\\xf8\\x03\\x72\\x6d\\x41\\x4c\\xf5\\xd2\\x04\\x7a\\xf1\\xd4\\x7a\\x04\\xb1\\x5e\\x1a\\x8a\\x33\\x0e\\x56\\x6b\\x6a\\x11\\x98\\x4e\\xbc\\x6b\\xa5\\x06\\x94\\x02\\x04\\x9f\\xd1\\x2b\\xc1\\x1c\\x56\\x20\\x19\\xc0\\x9f\\x53\\x67\\xa0\\x40\\x68\\xc8\\x17\\x48\\xc6\\xeb\\x75\\xd4\\x2b\\x0f\\x8e\\x56\\x09\\xa1\\x09\\x46\\xea\\x09\\x6c\\xcb\\x37\\xe3\\x3b\\x1c\\x2d\\x1b\\x5b\\x15\\x00\\x1e\\xe4\\x4e\\x98\\x0c\\xf0\\xc5\\x0d\\x87\\x33\\x6d\\xa8\\xae\\xb7\\x31\\xc6\\x6d\\x9c\\x5b\\x4e\\xcd\\xed\\x6d\\xa2\\xd1\\x9a\\x04\\x5b\\x99\\xf4\\xd8\\x29\\xa5\\xca\\x40\\xf5\\x3a\\xbc\\xc2\\x80\\x75\\xf0\\xad\\xff\\x60\\xfe\\x75\\xe7\\xbc\\x89\\x4b\\x3a\\xfd\\x1b\\xd3\\xb4\\xd3\\x15\\x65\\x54\\xb5\\x31\\x24\\x94\\xc9\\xb7\\x7e\\xc3\\xf6\\xfe\\x35\\xfd\\x19\\x22\\xcc\\x3a\\xb6\\xd8\\xea\\x33\\xc0\\xb7\\x8f\\x46\\xf6\\xa3\\x0a\\xa5\\x0e\\x4d\\xd2\\x07\\x88\\x3f\\x55\\xfa\\x1a\\x7c\\x32\\xaa\\x60\\x8d\\xe5\\xd9\\x4d\\x70\\x45\\x31\\x3f\\x90\\xec\\x01\\x1e\\x04\\xe1\\x71\\x65\\xb2\\x3c\\xcb\\x57\\xea\\x59\\xa6\\x61\\x96\\xa5\\xe2\\xb7\\x9a\\xb4\\x4a\\xf0\\x2b\\x13\\x46\\xcb\\x52\\xf1\\x5b\\x9f\\x77\\x59\\x86\\x4f\\xe4\\x98\\x4f\\x3f\\xcf\\xb3\\x1b\\x00\\x38\\xe3\\xd9\\xfc\\x0b\\xa3\\x4f\\xb0\\x51\\xad\\x50\\x12\\x6e\\x32\\x6f\\xb2\\x94\\x19\\x7e\\x90\\x5c\\x0d\\x98\\xa0\\x22\\xb5\\x9c\\x74\\x61\\x5b\\xea\\xce\\x20\\xf0\\x50\\xc3\\x83\\x35\\x0e\\x05\\xd6\\xa3\\x3f\\x01\\x8a\\x83\\xff\\x81\\x3b\\x81\\x5f\\x3a\\x47\\x56\\x84\\xbe\\x54\\x9d\\xb1\\x2d\\xa3\\xe5\\xbf\\x31\\x5d\\x91\\x91\\xe0\\xdf\\x18\\x82\\x2f\\x93\\xa9\\xa7\\xaa\\x3d\\xe7\\x49\\x2b\\x82\\x1a\\x1e\\x1a\\x36\\x1a\\x75\\xe4\\xa5\\xb3\\x0f\\x3e\\x23\\xc1\\x93\\x5a\\xd1\\x20\\x3e\\x1c\\x86\\xf1\\x68\\x14\\xa1\\x8a\\xc1\\x5a\\x83\\xd1\\x88\\x99\\xe3\\xcb\\x28\\x1e\\xab\\x00\\xab\\x46\\x32\\x20\\xf4\\x37\\xe6\\x0c\\x8d\\x46\\x91\\x95\\x61\\x5e\\x35\\x0c\\x01\\x50\\x8a\\x34\\x5d\\xce\\x02\\xa5\\x74\\xd2\\xa3\\x32\\xd5\\x96\\xe6\\x67\\x60\\x7e\\x8a\\x9b\\x02\\xb9\\x64\\x31\\xdd\\x6a\\x69\\xfd\\x5e\\x99\\x5a\\xeb\\xc0\\x2a\\x37\\x9e\\xab\\x32\\x9e\\x4e\\xa2\\xe8\\x79\\xf9\\x03\\xd4\\x29\\x60\\xbe\\x29\\x9f\\x91\\xa8\\x4f\\xa6\\xc5\\x2e\\x09\\x13\\x0d\\x68\\xd4\\xfc\\x74\\x73\\xa4\\xd9\\x91\\xb1\\x45\\x1b\\x32\\x1a\\xc1\\x5f\\x23\\xaf\\x12\\x9d\\x41\\xd7\\xad\\xbc\\x59\\xb2\\x9c\\x1c\\x05\\x0e\\x72\\xe4\\xe1\\x29\\x4b\\xf8\\xbb\\xe2\\x99\\xd0\\x36\\xd2\\x5b\\xeb\\x2d\\x01\\xd2\\x57\\xab\\x80\\xe9\\x4c\\xd1\\x41\\x82\\xc2\\x10\\x17\\x20\\x00\\x3e\\xf7\\xb5\\x46\\x39\\x3a\\x52\\x54\\xab\\x1c\\xa9\\x7c\\x77\\x22\\x8e\\xa0\\x4b\\xef\\x31\\xcc\\x1c\\x07\\x8b\\x8b\\x99\\x08\\x1a\\x59\\xe3\\xf0\\xb2\\xfc\\x45\\x4a\\xb7\\x5d\\x28\\xa3\\x29\\x59\\xf8\\x5c\\x85\\x58\\x80\\x0a\\x5e\\x9a\\xe5\\x59\\xb5\\x05\\x2d\\x52\\x04\\xe1\\xc8\\x20\\x3b\\xba\\x36\\x09\\x99\\xe2\\xfb\\x70\\x43\\xf9\\xe1\\x90\\x9a\\x2d\\x9b\\x5b\\x89\\x15\\x37\\x52\\xf4\\x88\\x2b\\x2b\\x2b\\xd1\\x0d\\x69\\xe2\\x75\\xe7\\x54\\xb4\\x3d\\xa5\\x30\\x5a\\xda\\x42\\x91\\x29\\x98\\x9c\\x2e\\xf2\\x63\\x3d\\x9a\\xce\\xcc\\x5f\\x18\\x2e\\xc7\\xce\\xfe\\x15\\x8d\\x46\\x90\\x99\\x7d\\x2e\\xa5\\x98\\xad\\x7c\\x65\\xdd\\x61\\x74\\x70\\x10\\x60\\xe8\\x22\\xe5\\x6d\\xa3\\x91\\x9b\\x27\\x0c\\x56\\x1e\\x70\\x6c\\x05\\x31\\x23\\xb4\\x74\\x18\\x2f\\xa4\\x0d\\xb8\\xd0\\x8a\\xff\\x61\\xe8\\xa3\\x51\\xe2\\x6f\\xd0\\x5d\\x4f\\xa5\\xab\\x80\\x70\\x11\\x9b\\x76\\xc5\\x1f\\xb5\\xf1\\x8a\\x69\\x84\\x57\\x9a\\xf1\\xc5\\x9f\\x4c\\x16\\x24\\x15\\x4d\\x04\\x4a\\x97\\xc1\\xa5\\xd1\\x1e\\x06\\x46\\x0a\\xaf\\x60\\xac\\xc3\\x30\\x14\\xd4\\x1c\\x14\\x08\\xe8\\xc2\\x4d\\x8d\\xc1\\xc2\\x6f\\x4e\\x53\\x95\\xec\\x83\\xd3\\x39\\x21\\x0b\\x3f\\x12\\xd8\\x86\\xf4\\x64\\x94\\xc3\\xbd\\xef\\x14\\xbc\\x0d\\x55\\x20\\x6f\\x95\\x6a\\xed\\xd4\\xaa\\xd2\\xd8\\x5e\\x2d\\x41\\x99\\xad\\xd4\\xca\\x7a\\x6b\\xca\\xad\\x47\\x5c\\xe8\\xb5\\xbb\\xd2\\xc9\\x32\\x31\\x77\\x3f\\x50\\xae\\x0a\\x2a\\x21\\x57\\xba\\x93\\x51\\x4f\\x6c\\x2f\\x46\\xe4\\x85\\x95\\xc5\\xbf\\x96\\x77\\xd1\\x50\\x00\\x88\\x59\\xd6\\x08\\x97\\x35\\xc2\\x65\\x95\\x0e\\xae\\x62\\x35\\xa3\\xb5\\x86\\x75\\x06\\x66\\x31\\x91\\xbd\\x9a\\xa2\\x17\\xbd\\x92\\x11\\xac\\x24\\xca\\x76\\x66\\x8b\\xcd\\x65\\x04\\x6e\\x8d\\xc9\\x2a\\x5a\\x8f\\x46\\xe2\\x7f\\x39\\x58\\xe7\\xc1\\xc2\\x4e\\x0a\\xe0\\xd5\\xa4\\x74\\x1e\\x4c\\x54\\x21\\x4b\\x76\\x93\\x22\\x43\\x49\\x91\\xd5\\x6c\\x2a\\x92\\x55\\x72\\xc1\\x34\\x5f\\x45\\xeb\\x85\\xfc\\x6b\\x5f\\x47\\x8e\\x9a\\x08\\x05\\xe2\\x87\\x43\\x97\\xee\\x2a\\xee\\x36\\x36\\xc7\\x03\\xae\\x10\\xd9\\x3b\\xf0\\xed\\x9b\\x11\\x8a\\x1d\\xdb\\x0e\\x3c\\xd5\\x2e\\x4b\\xf8\\x57\\xc5\\x7d\\x1e\\xbc\\x63\\x92\\x09\\x26\\x14\\x0a\\x7f\\xde\\x43\\x11\\x8c\\x5f\\x16\\xbd\\x43\\xad\\x9a\\x28\\x96\\xd3\\x24\\x54\\x60\\xde\\x37\\xb9\\xb1\\xbe\\xc1\\x3e\\x8e\\x50\\xfe\\xc3\\x6d\\x6d\\xbd\\x80\\x9e\\xf0\\x85\\xec\\xc8\\xbc\\x93\\xdd\\x1d\\x9f\\xf7\\xf3\\x69\\xa3\\x75\\x35\\xcb\\x48\\x21\\x69\\x98\\x1e\\x42\\x63\\xb8\\x5a\\x2b\\x52\\x2b\\xbe\\x6e\\xa2\\x5d\\xf0\\x72\\xa5\\xb1\\x06\\x5d\\x80\\x09\\x23\\x26\\x5c\\x44\\xaf\\x63\\x0d\\x77\\xe3\\x31\\x61\\x61\\x0c\\x31\\x8d\\x7d\\xe9\\x16\\x81\\x07\\x37\\xd6\\x60\\x35\\x99\\xd0\\x39\\x59\\xc4\\x5a\\x68\\x24\\xe5\\xd3\\x90\\x2f\\xc2\\x08\\x22\\x2d\\xca\\xaf\\x11\\x99\\x10\\x07\\xa1\\xe8\\x14\\xf1\\x1d\\xa5\\x6c\\x60\\x65\\xed\\x93\\xc0\\xd4\\x10\\x5d\\xca\\x8e\\x20\\x38\\xe4\\x1d\\xdb\\x85\\xf3\\x57\\xd4\\xd4\\xb6\\x67\\xfa\\x9d\\xc0\\x2e\\xdf\\xb1\\xb0\\xe2\\xf5\\x1b\\x59\\xd9\\xd7\\x4b\\xe2\\x76\\x42\\x54\\xaf\\x62\\xd4\\x76\\x1f\\x60\\xc4\\xa2\\x5b\\x7f\\xc7\\x08\\xfd\\x0e\\xbd\\x74\\x55\\x7d\\xa0\\x1d\\xc2\\xa7\\x6a\\x57\\xdc\\x07\\x9f\\xcd\\x66\\x34\\x65\\x55\\x1d\\x5c\\xcc\\x66\\x26\\x58\\xd4\\xa7\\xb3\\x99\\xbc\\xb3\\x13\\xbe\\x63\\x8f\\x7d\\xf9\\x12\\x45\\x77\\x0e\\x9d\\xc2\\xd6\\x87\\x03\\x03\\x37\\x60\\x99\\xb3\\x95\\x5a\\x97\\x44\\x44\\xbb\\xb8\\x1e\\x4b\\x16\\x1c\\x51\\x06\\x79\\x0b\\xbb\\xe6\\xa3\\xea\\x48\\x3f\\xf7\\x96\\x5a\\xb2\\x2f\\x0f\\x22\\x8d\\xda\\xaf\\x30\\x9a\\x17\\x18\\xfa\\x45\\xa7\\xcd\\xd5\\x51\\x47\\xe7\\x11\\xb2\\x90\\xc1\\x9a\\x4c\\x74\\x66\\x95\\xf1\\xf0\\x87\\x3c\\xf4\\x30\\xaf\\xc0\\x1d\\xdb\\xdd\\x72\\x7a\\x2d\\x28\\x73\\x0c\\xed\\xc3\\x93\\x30\\x96\\x21\\xef\\x20\\xc9\\xa1\\xca\\x49\\x20\\x30\\x2b\\x54\\xfb\\x4a\\x17\\xc4\\xfa\\x25\\x3d\\x31\\x17\\xf9\\x8d\\xd0\\xab\\x3d\\x15\\x87\\x53\\x26\\x74\\xa4\\xd7\\x53\\xf8\\xf1\\xef\\xea\\x7d\\xa8\\x47\\xa4\\xd2\\x1f\\xfe\\x95\\xd1\\xff\\x64\\xf4\\x63\\x48\\x29\\xf2\\xb0\\x2f\\x21\\x85\\x35\\x46\\x9a\\x5b\\x38\\xd4\\x99\\x28\\x3f\\x69\\xae\\x90\\x43\\xd3\\x7e\\x9b\\x00\\x13\\xc9\\xea\\x03\\xb2\\xa5\\x9a\\x46\\x7d\\x29\\x8b\\x5b\\xe3\\x72\\xa5\\x24\\x46\\xba\\xbb\\x30\\xc6\\x73\\x29\\xda\\xcc\\xa5\\xa3\\xd1\\x05\\x28\\x51\\xdc\\x1c\\x81\\x6e\\x4c\\xaf\\x30\\x0c\\x7f\\x5e\\xe6\\xc0\\x87\\x2a\\x13\\x08\\x08\\xde\\x90\\x62\\x8a\\x18\\x1d\\x26\\xe8\\x70\\xf0\\xa3\\x30\\x6a\\x84\\x93\\x11\\xdc\\x3b\\x2c\\xa8\\x36\\xa7\\xf2\\x9d\\xd4\\x78\\xe2\\x32\\x50\\xde\\x54\\xcb\\xff\\x64\\xc1\\x5f\\x99\\x6d\\x43\\x15\\x2f\\x13\\x63\\x6e\\x95\\x28\\x8d\\x69\\xe8\\xf3\\x30\\xd1\\xb9\\x96\\xc9\\x92\\x63\\xe2\\xff\\x34\\xcb\\x13\\xf8\\x16\\x6a\\xa9\\xa4\\xd1\\x2e\\x3a\\x3a\\x81\\x95\\x94\\x6c\\x8d\\x9d\\x56\\xba\\x53\\xdb\\x2c\\x2f\\xd1\\x66\\x68\\xb2\\x63\\xe6\\xa6\\xfa\\x8c\\x68\\x3c\\xf6\\xc4\\x01\\x91\\x16\\x3c\\xce\\xfe\\xc0\\x68\\x7a\\xb6\\xd9\\x91\\xd9\\x85\\x33\\x9a\\x86\\x91\\x20\\x7d\\x55\\xf6\\x39\\x99\\xe1\\xbb\\x91\\x55\\x5f\\x26\\x38\\x0f\\xd3\\x15\\x1f\\x8f\\xd7\\x44\\xac\\xa5\\xd8\\x85\\x6f\\xb2\\x07\\xe0\\x25\\x63\\xda\\xb3\\x94\\x10\\xd7\\x05\\x64\\x77\\xc3\\x39\\x66\\x26\\x71\\x43\\xa8\\xc5\\x82\\x05\\x50\\x9b\\x12\\x60\\x74\\xf0\\x86\\x1a\\x55\\xda\\x9b\\x0e\\xed\\xe3\\x33\\x1a\\xc9\\x43\\x85\\x79\\x9e\\xdd\\x08\\x76\\xf2\\x28\\x9a\\x98\\x60\\x70\\xc6\\x4c\\xc4\\xfc\\xae\\xa4\\xab\\x32\\x51\\xb6\\x3a\\xbd\\xe8\\xb7\\x01\\xd6\\x59\\xff\\xc9\\x9a\\x7a\\x5d\\x27\\xb9\\x3d\\x46\\xb3\\x5c\\x36\\x56\\x3f\\x26\\x41\\xe3\\x3b\\x31\\x05\\xef\\x48\\x1d\\xdd\\xb8\\xbd\\x5e\\x98\\x1b\\x57\\xee\\xc3\\xf9\\xaf\\xf7\\xe3\\xf3\\x0d\\xe9\\x24\\x73\\x3e\\x66\\xd2\\x18\\x50\\x83\\xd9\\x02\\x8a\\x5c\\xf6\\xdb\\x18\\x24\\x6a\\x26\\x58\\x50\\xc5\\xd8\\x9a\\x62\\x03\\xae\\x69\\xfd\\x58\\xb6\\x59\\x36\\x4e\\x0d\\xa6\\x09\\x93\\xdd\\x13\\xca\\x95\\x3b\\xee\\x7b\\xa9\\x14\\xc6\\x88\\x94\\x88\\x40\\x0f\\x2a\\xe0\\xd8\\x01\\x73\\x5f\\x40\\x4e\\x5d\\x07\\x6f\\x09\\x90\\x79\\x06\\x6f\\xa1\\x76\\xfe\\x34\\xde\\xfa\\xd1\\xed\\xe6\\x34\\xde\\xb2\\x1c\\x0b\\x57\\x06\\x68\\xe1\\x16\\x5c\\x37\\xf1\\x97\\x7c\\x1b\\x3c\\x79\\x69\\x51\\x7a\\x81\\xb7\\xad\\x6f\\x76\\xdf\\x14\\xa5\\x47\\xbd\\x78\\xc7\\xaa\\xca\\x0b\\xf0\\xaf\\x00\\x34\\x0f\\x73\\xb4\\x9c\\x0a\\x92\\xd6\\x8d\\xef\\x36\\x88\\xef\\x36\\x88\\xef\\x36\\x0a\\xdf\\xa5\\xe1\\x1c\\xdd\\x41\\x87\\x0e\\x26\\x03\\x45\\x43\\x64\\x9d\\x36\\xb1\\xf3\\x11\\xe4\\x93\\x36\\x56\\x37\\x60\\xff\\x6f\\x8c\\xc4\\xb8\\xc1\\x29\\xdc\\xc6\\x29\\x49\\xc8\\x1d\\x9c\\x92\\x04\\xb0\\xad\\x71\\xc0\\x0d\\x66\\xe3\\x06\\xb3\\x89\\xea\\x06\\xb3\\x61\\x65\\x9c\\xb4\\x3a\\xac\\x2c\\x42\\x5b\\xea\\x96\\xfd\\x89\\x3e\\x6a\\x5b\\x56\\xd9\\x47\\x8d\\x45\\x60\\x9e\\xeb\\x91\\xc3\\xe1\\xbd\\x32\\xd2\\x33\\x2a\\x9a\\xc3\\x81\\x4d\\xb7\\x25\\x4f\\x97\\x6c\\xaa\\xbb\\x9e\\xcc\\x8f\\x32\\x84\\xb5\\x75\\x65\\x03\\xe6\\xb6\\x2c\\x30\\xd4\\x4d\\xde\\x6d\\x07\\x03\\x59\\x57\\x94\\xbd\\x85\\xa5\\x45\\x8e\\x1c\\x33\\x0c\\xfb\\x49\\xf7\\x08\\x63\\x00\\xf4\\xed\\xb2\\x24\\x72\\x74\\x1e\\xf5\\x4a\\xce\\x92\\x1f\\xf2\\xdd\\xa3\\x47\\xbd\\x1b\\xf6\\xf0\\x2d\\x40\\xaa\\x00\\x17\\xbe\\xdb\\x49\\xa7\\x25\\xf9\\xf4\\xa3\\xd4\\x65\\x53\\xaf\\x2c\\xee\\xdf\\xee\\x59\\x2e\\xca\\x8b\\x9d\\xfc\\x75\\x5b\\xf1\\xef\\xd8\\xde\\xa3\\x1e\\x78\\x74\\x7f\\x81\\x0e\\x16\\x54\\x39\\x58\\x7c\\x9d\\x64\\x18\\x95\\x73\\x4d\\x9d\\x0b\\x59\\xc1\\x04\\x46\\x74\\x72\\xe2\\x9a\\x00\\x1f\\xa7\\xc2\\xca\\x46\\xe1\\xf9\\xea\\xd7\\xfa\\xd7\\xf2\\xd7\\xfc\\xd7\\x74\\x7d\\xbe\\x69\\xd0\\x12\\x49\\xf2\\xa5\\x00\\xea\\x2e\\xe3\\x2e\\x13\\x5a\\xb2\\x6d\\xaa\\xc9\\x46\\x23\\x46\\xb3\\x70\\x46\\xaf\\x9a\\x01\\x5d\\x1a\\x62\\xbb\\x13\\x01\\x31\\x04\\x43\\x22\\xad\\xfc\\xd4\\x30\\x7c\\x66\\x31\\xab\\xd2\\x60\\x4e\\x1f\\x3a\\x22\\x03\\x60\\x6c\\x09\\x72\\x9b\\x20\\xd4\\x70\\x33\\xa7\\xae\\x17\\x57\\x97\\xd9\\x22\\x43\\x01\\xb4\\x8c\\xc5\\x9b\\xad\\x69\\x12\\x62\\xb8\\x0b\\x4b\\xbd\\x1c\\x9b\\x7e\\x97\\xbe\\x37\\xf0\\xc6\\x56\\xc1\\xd8\\x1b\\x78\\xc4\\x84\\x85\\x89\\x28\\x98\\xa3\\x8a\\xff\\xc8\\x53\\x6a\\x45\\x52\\x8b\\x30\\xd5\\x5f\\x62\\xcc\\xce\\x07\\xde\\x18\\x5b\\xbf\\x9e\\x41\\x2a\\xf5\\x10\\x9f\\x16\\x1b\\xc1\\x15\\x95\\xd9\\x8d\\x9f\\x10\\x6a\\x7d\\x08\\x31\\x81\\x3d\\x96\\x70\\xe3\\x06\\x87\\x90\\x38\\xef\\x25\\x7b\\x04\\x56\\xd0\\x0d\\xb4\\x79\\x38\\xfc\\x77\\xef\\x9c\\x35\\xbe\\xff\\xd5\\x9b\\xd7\\xb3\\x77\\xf8\\xd8\\xb5\\x83\\x97\\xe1\\x8c\\x24\\x61\\xa2\\x7b\\xd2\\x6f\\xa8\\xdc\\x51\\x08\\xd9\\x86\\x7b\\x1a\\x78\\xde\\x07\\x6e\\x2b\\x72\\xe8\\xcd\\x6d\\xb5\\x0c\\x9e\\xe4\\x66\\x2d\\xfa\\xec\\x6c\\x23\\x3b\\x30\\x4d\\x18\\x2f\\x23\\x94\\x48\\x9a\\x83\\x44\\xec\\x70\\x3b\\x6e\\x99\\x24\\x41\\x5c\\x15\\x83\\x6d\\xac\\xad\\x36\\xd7\\x1a\\xa5\\xb3\\xb9\\x71\\x63\\x73\\x05\\x01\\x15\\x91\\x63\\xe0\\xea\\x31\\xed\\xf1\\x29\\x80\\x45\\x0d\\x85\\xec\\x1f\\x98\\x02\\x07\\x00\\x64\\xca\\xa3\\x30\\x5d\\x25\\x62\\x77\\xb8\\xb8\\x42\\xf0\\xf3\\x11\\x59\\x72\\x67\\x32\\x11\\x09\\xb8\\x99\\x6e\\x84\\xea\\x5a\\x3f\\x16\\x4c\\x82\\x23\\xdb\\xc1\\xe0\\xa7\\xee\\x78\\x47\\xa3\\x6f\\xb5\\x1d\\x26\\xf5\\xde\\xbf\\xd7\\x2f\\xde\\xbf\\xf7\\x9a\\x70\\xdb\\x78\\x0e\\xdd\\xc7\\xc3\\x81\\x21\\x09\\xe8\\x79\\x81\\x2d\\x57\\x76\\xfb\\x24\\x00\\xeb\\x10\\x40\\x4b\\xce\\xa7\\x3b\\x96\\x62\\x28\\x80\\x8c\\x01\\x90\\xb5\\x83\\x65\\x29\\xe5\\x9e\\x15\\xb2\\x6e\\x15\\xaf\\x1d\\x93\\x99\\x81\\x37\\x56\\xc5\\xa7\\xcf\\x83\\x86\\xf7\\x08\\xe0\\x5c\\x65\\xb2\\x5f\\xe8\\xe4\\xf5\\xf2\\xf2\\x88\\xa2\\xf0\\xfc\\xd7\\xb2\\x79\\x69\\xdc\\xb1\\x5d\\x1f\\x2e\\xd2\\xe1\\xcf\\xc1\\x41\\xaa\\x19\\xba\\x4a\\x87\\xaf\\x6f\\x00\\x5f\\x97\\xf0\\x54\\x82\\x0c\\x5f\\xb4\\x62\\xf1\\x81\\xad\\x40\\xb2\\x74\\x01\\x52\\x81\\xec\\x1d\\xdb\\xf9\\x84\\x04\\x4c\\xb3\\x5d\\x3c\\x04\\x97\\xb7\\x86\\xae\\x87\\x2f\\xf9\\x58\\xbc\\x30\\x36\\x08\\xd2\\xab\\x12\\x55\\x91\\xbc\\x2b\\x58\\xa3\\x8a\\xa3\\xe6\\x79\\x01\\x1b\\x7b\\xde\\x91\\x10\\x2a\\x68\\xb3\\x3b\\xb6\\xb3\\xcc\\x9f\\x65\\x6e\\xce\\x66\\x71\\x77\\x8c\\xdf\\x35\\x18\\xd1\\x4a\\x6a\\x2d\\xb2\\xa8\\xb5\\xc8\\x80\\x27\\xa7\\x1e\\x70\\x25\\xe0\\xc7\\x04\\x7d\\x21\\x93\\xa2\\x31\\xaa\\x09\\x94\\x66\\x0f\\x86\\x77\\x8c\\x84\\x9f\\x1c\\xc6\\xa6\\x3d\\x0c\\x3f\\x0e\\x23\\x00\\x6a\\x33\\x08\\xb2\\x8c\\x03\\x3f\\x0e\\xb9\\x14\\xa6\\x74\\xfa\\x70\\x28\\x60\\x8b\\x22\\xea\\x79\\x2a\\x4f\\x44\\x2c\\xd6\\x2d\\x56\\x3e\\x2f\\x16\\x28\\x69\\x7f\\x43\\x50\\xb7\\xf5\\x50\\x71\\x2e\\x57\\xad\\x06\\x63\\x1b\\x39\\x0f\\xc1\\x08\\x59\\xa2\\x64\\x19\\x4c\\x93\\x41\\x0a\\x6b\\xa4\\xe7\\xda\\x3d\\x3b\\x21\\x4c\\x43\\x15\\x66\\x1d\\x53\\xb7\\xb8\\x34\\x60\\x1a\\x4a\\x91\\xd4\\x44\\xda\\x17\\x31\\x19\\x49\\x6a\\x76\\xc9\\xe9\\x26\\x4c\\x97\\x62\\x00\\x01\\x64\\xd2\\x4c\\x97\\x7c\\x3c\\x0f\\x94\\xc4\\x5e\\x5c\\xb4\\x97\\x7c\\xb9\\x0d\\xd2\\x25\\x0f\\x66\\x8b\\xad\\x7d\\xbf\\x25\\xe2\\x72\\x1b\\xfa\\x43\\x23\\x81\\x1a\\x8d\\x32\\x34\\x99\\xf2\\x1d\\xe1\\xd3\\xd2\\xc8\\x9e\\xb4\\xe8\\xa0\\x11\\xec\\x5c\\xbd\\xf7\\x08\\x39\\x1c\\x9c\\x88\\x85\\xea\\x8d\\xc3\\x26\\xdb\\x35\\xa8\\xa7\\x42\\xcd\\x7b\\x2a\\xc4\\x6a\\x28\\x4e\\x1f\\x9e\\x24\\x9a\\x1a\\x6f\\x76\\x99\\xc0\\x32\\xd2\\x57\\xd9\\xa6\\xe5\\x2c\\xe5\\x08\\x17\\xcc\\x8a\\x62\\x14\\x31\\x95\\x35\\x3a\\xb2\\xc3\\x48\\x49\\x94\\xbf\\x99\\x4c\\x48\\x12\\xf2\\xd5\\x66\\x4d\\xfd\\xc4\\xd0\\xf4\\x26\\x2c\\x6e\\x22\\x01\\x2e\\x05\\x84\\x05\\x9a\\xaf\\xe1\\x8c\\xd8\\xb1\\x93\\x1a\\x9b\\x16\\x4e\\xe6\\x84\\xa6\\xc7\\xa3\\x43\\xbb\\x4b\\x59\\x9c\\x11\\x12\\x36\\x68\\x6a\\xe7\\xd0\\xae\\xdb\\xac\\xbf\\x15\\x1d\\xd1\\x78\\xfb\\x2c\\x75\\x0c\\x6e\\x6b\\xbc\\x60\\xf1\\x85\\x4b\\x08\\x38\\x56\\x27\\x7b\\x30\\x62\\x49\\x60\\x64\\xdc\\x2f\\x42\\xc8\\x9b\\x5e\\xd4\\xd3\\x8a\\x71\\x2f\\x8f\\xc1\\xd2\\x2b\\x72\\x2f\\x50\\xd2\\x44\\x62\\x26\\xec\\x45\\xbb\\xdb\\x72\\x00\\x09\\x7d\\x06\\x32\\xcb\\xcf\\x40\\xa5\\xf7\\x19\\xec\\x0a\\x96\\x0c\\x4a\\x5e\\x65\\x7f\\xe7\\x03\\x34\\x63\\x1f\\x60\\x1a\\xb9\\x01\\xa4\\xa7\\x1b\\x24\\xd1\\x0e\\x7f\\x40\\x9a\\xa5\\xa4\\xb8\\xcf\\xf1\\xd7\\xed\\x1e\\xff\\x8a\\xab\\x78\\xa0\\x33\\x33\\x0d\\x54\\x32\\xa6\\x81\\x49\\xdc\\x34\\x30\\xc9\\x9a\\x06\\xf1\\x96\\xe5\\x1b\\x3e\\x90\\x79\\x1c\\xaa\\xdb\\xe8\\x26\\xab\\x07\\xd7\\xfc\\x11\\xfa\\xbd\\xe6\\x8f\\xfb\\x92\\x57\\x95\\xf8\\x71\\xbb\\x1f\\xf0\\xb2\\x2c\\xca\\x41\\x8c\\x69\\x5b\\x6f\\x78\\x7e\\xeb\\x66\\xdf\\x6c\\xab\\x34\\x5c\\xe9\\x87\\x11\\xcf\\xb4\\xa4\\x08\\x33\\xa4\\x92\\x40\\xc0\\x2d\\xe3\\x2b\\xc6\\x2a\\xd9\\x99\\x4c\\xcf\\x11\\x91\\x56\\x5c\\xdf\\xad\\x98\\xe0\\x89\\x14\\x22\\x66\\xc6\\x62\\xd3\\xcd\\xa4\\xfd\\x08\\xd2\\x83\\x43\\xda\\xa8\\x3e\\x09\\x52\\xad\\xb3\\xc4\\x60\\x7a\\x3b\\x1a\\x93\\x23\\xbd\\xcd\\x5b\\x4d\\x1a\\x0d\\xd2\\x54\\xb7\\x20\\x26\\x97\\xe1\\xf3\\xc9\\x68\\xb4\\x56\\x87\\xde\\xe6\\x3d\\xad\\x74\\x9b\\x79\\x07\\x43\\xb1\\xb4\\x3e\\xef\\x9d\\x9d\\x79\\x72\\xf1\\x44\\x41\\x44\\x05\\x49\\x7f\\x76\\xe6\\x89\\x29\\x48\\xfa\\x21\\x8e\\x94\\xfa\\x87\\x26\\x82\\x94\\x58\\x9e\\x2f\\xf2\\x29\\x78\\x94\\xfe\\xe5\\xed\\x0f\\xdf\\x77\\x41\\xba\\x28\\xc7\\x1a\\xbe\\xb8\\x64\\x41\\x85\\x02\\x8f\\xbf\\x7c\\xf7\\x6d\\x5b\\x6b\\x4e\\x63\\x88\\x2c\\xcf\\x0c\\x9f\\x63\\xb4\\xe3\\xc4\\x3a\\x3b\\x10\\xcb\\x33\\x06\\x6f\\x85\\xaf\\x7e\\xf8\\xee\\x47\\xd1\\x5f\\x49\\xa3\\x30\\xc6\\xae\\xbf\\x29\\x8b\\x9b\\xb7\\xd0\\x1c\\x52\\x60\\xf0\\x87\\xfa\\xfc\\xe1\\x66\\xe7\\x11\\x19\\xa8\\x33\\x21\\x4f\\x2a\\x23\\x8d\\xca\\x62\\x33\\x8c\\x0e\\x87\\xa8\\x27\\xe3\\x05\\x74\\x59\\x02\\x0c\\x6b\\x9b\\x67\\x50\\x31\\x43\\x91\\xef\\xbd\\xc9\\xef\\xd8\\x2e\\x4b\\x06\\xbf\\x7c\\xf7\\x6d\\x20\\xc8\\x3d\\x42\\x23\\x74\\xb8\\xe0\\x51\\x78\\xfe\\xd1\\xf4\\xec\\xe3\\x73\\x9a\\x46\\xe1\\xb9\\xbf\\x5a\\x8e\\xd6\\xe4\\x7d\\xb8\\xfa\\xdb\\x68\\x7d\\x76\\x4e\\x37\\x51\\x78\\xfe\\x37\\x7f\\x7a\\xb6\\x24\\xc1\\x6a\\xf0\\x6b\\xbd\\x3e\\xf3\\x57\\x7f\\x13\\x3c\\xfd\\xfa\\x8c\\x7c\\x7c\\xbe\\xb9\\xa1\\xdb\\x08\\x45\\x72\\x2c\\x2a\\x6e\\xeb\\x03\\xdb\\xef\\xc5\\xbf\\x49\\x55\\x17\\x25\\xdb\\xf0\\xc3\\x74\\x3c\\x01\\x60\\xae\\xb2\\x22\\x3f\\xa4\\xd9\\x8e\\x1f\\x4a\\x5e\\x1d\\xee\\xb3\\x64\\xc3\\x6b\\x12\\x7c\\x7c\\x4e\\x33\\xd9\\xfc\\x4f\\x5f\\xbf\\x3b\\xfc\\xf9\\xeb\\xcf\\xbf\\x22\\x1f\\x9f\\xd3\\x2b\\x51\\xf6\\xeb\\xf9\\xaf\\xe7\\xe7\\xf4\\x1a\\x5e\\xaf\\x7e\\xbd\\x9f\\x8e\\x27\\xeb\\x71\\x40\\xfc\\x65\\x20\\x5e\\x40\\x72\\x98\\x5f\\xcf\\x97\\x1f\\xad\\xcf\\xfe\\x7f\\x07\\xe2\\xe3\\xef\\x60\\x7d\\x26\\xde\\x07\\xfe\\xaf\\xc9\\x98\\x1c\\xc8\\x81\\x9c\\xd3\\x5d\\x14\\x3e\\x1d\\xe9\\x0d\\xfc\\x9f\\x47\\xa1\\x77\\x76\\xee\\x29\\x1b\\x7c\\xef\\xcc\\x23\\xb4\\x88\\x42\\x36\\xdd\\x15\\x31\\x18\\xd0\\x80\\x14\\x88\\xee\\xa3\\xf0\\x3a\\x42\\x5b\\xe4\\xa2\\x21\\x95\\x44\\x56\\x41\\x5b\\x64\\xfe\\x16\\x59\\xe0\\xe3\\x2a\\xb0\\x7a\\x32\\x63\\x45\\x54\\x8c\\xc1\\x43\\x10\\xd5\\x62\\x70\\xf7\\x23\\x2e\\x5f\\xd2\\xe4\\x8e\\x63\\xa2\\x38\\x47\\x25\\x13\\xf7\\xc6\\x60\\x27\\xbb\\x9a\\xad\\x97\\xbe\\x60\\x1b\\x55\\xe8\\x18\\x48\\x1b\\x41\\x51\\x08\\xce\\xc0\\xc2\\x79\\xb5\\x26\\xda\\x96\\x2a\\x26\\x24\\x68\\xbe\\x83\\x4b\\x36\\xb6\\x6d\\x6d\\xcb\\xa8\\x69\\x17\\x03\\xfe\\xb3\\x82\\xf3\\xb8\\x89\\xec\\x48\\x5d\\x5b\\x7c\\x9f\\x69\\x7f\\xd8\\xd5\\x76\\x8d\\x56\\x02\\x70\\x1d\\x30\\xf0\\x3a\\x5f\\x39\\xea\\x73\\xd9\\xe4\\x2a\\xdc\\x4a\\x7b\\x9a\\x3e\\x6b\\x93\\xab\\xc3\\x21\\x3d\\x1c\\xf8\\xea\\x6a\\xbd\\x4c\\x97\\x43\\x3f\\x0b\\xaf\\x94\\xf3\\x70\\xe0\\x47\\x90\\x3e\\x5d\\xd0\\xe6\\x95\\x9e\\xda\\x15\\xa1\\x1b\\xf1\\xdf\\x70\\x2e\\x2e\\xa4\\x4c\\xd3\\x0c\\x76\\xe5\\xd5\\x6c\\x4d\\x0e\\x87\\x21\\x07\\xbb\\xb6\\xd1\\x68\\x03\\xd0\\x60\\xe6\\x5d\\x45\\x4d\\x92\\x22\\x9f\\xb2\\x2b\\xf6\\xf0\\x96\\xd7\\x75\\x96\\x6f\\xaa\\x69\\xba\\x63\\xb5\\xb4\\xf7\\x84\\x74\\xf8\\xda\\xae\\x37\\x22\\x86\\x94\\x5e\\xc5\\xeb\\xd1\\xc8\\xf7\\xf9\\x2a\\x5e\\x2f\\x59\\x90\\x1c\\x0e\\x7e\\x12\\x3e\\x1d\\x09\\x59\\xc5\\x6b\\x78\\x69\\x22\\xef\\x58\\xa1\\xba\\x86\\x33\\xca\\x68\\xe2\\x24\\x77\\xa9\\xa3\\xde\\x54\\x18\\x28\\xa8\\xab\\x20\\x94\\x83\\x9e\\x9c\\xa4\\x6c\\xbc\\x33\\x01\\x18\\x99\\x98\\x6a\\x36\\xc5\\xa5\\xb1\\x14\\x4b\\x89\\x8c\\x3a\\x79\\x93\\xdd\\xc8\\x30\\xd6\\x80\\x56\\x7e\\xe2\\xd5\\xbe\\xc8\\x2b\\xfe\\x67\\xce\\x12\\x5e\\xfa\\x9e\\x0c\\x24\\x3a\\x79\\x87\\x49\\x6d\\x04\\x3c\\x26\\x44\\xdb\\xd4\\x6c\\x05\\x41\\xb9\\x05\\xb3\\x1a\\xf1\\x3f\\x8a\\x56\\x13\\x41\\xcc\\xe9\\xdd\\xe0\\x64\\x11\\x95\\x9c\\x5d\\x1f\\xb3\\xd4\\x17\\x63\\xc9\\xf2\\x41\\x4c\\x52\\x18\\x16\\x5a\\xc2\\xeb\\xce\\x62\\xd4\\xb7\\x64\\x32\\x63\\x4f\\x5c\\xe4\\x77\\xbc\\xac\\x79\\x59\\xad\\x80\\x95\\x1c\\x8b\\x17\\x6b\\xf2\\x94\\x86\\x5c\\xf6\\xb8\\x81\\x28\\x85\\x9c\\x1c\\xd1\\xff\\x49\\x6d\\x74\\xba\\xf4\\xd3\\x21\\x4e\\x7c\\x34\\x32\\x03\\x49\\x09\\x8d\\x57\\xa9\\x71\\x3c\\xd7\\xcb\\x7b\\xdb\\x04\\x72\\x2b\\x86\\xef\\xd3\\x91\\x5e\\xdb\\x4b\\x2b\\x4f\\x17\\xac\\xc3\\xf5\\x6a\\xbe\\x26\\x26\\xb9\\x9d\\x35\\x60\\x72\\xb5\\xda\\x34\\x05\\xa3\\xce\\x84\\x36\\xeb\\x45\\x1a\\x5e\\xab\\x4d\\x91\\xfb\\x95\\x8a\\xc5\\x84\\x6c\\xb7\\xb0\\x03\\xdf\\x64\\x7c\\x97\\x54\\xab\\x54\\xc0\\x50\\xbc\\xea\\x28\\x5f\\x87\\x11\\x81\\xfc\\x1e\\x90\\x4d\\x55\\x0c\\xf1\\x1b\\x30\\x8c\\x03\\xc9\\xbd\\x5d\\x00\\xc9\\x11\\xd5\\x14\\x08\\x98\\x7d\\x53\\xeb\\xf3\\x90\\x8c\\x03\\x60\\x25\\x15\\x1b\\xa3\\xf3\\x6c\\x78\\x67\\x9e\\x58\\x46\\xe4\\x0d\\x52\\xd8\\x9c\\x4d\\x78\\xb5\\xca\\x60\\x33\\xd2\\xf5\\xe1\\x70\\xb5\\xf2\\xce\\xe0\\x27\\x1d\\x6e\\x88\\x95\\x96\\x47\\xc0\\x44\\xc8\\x6d\\xca\\x69\\xbb\\x9a\\xaf\\x65\\x14\\x0f\\xd3\\xc5\\x56\\xec\\xa7\\xee\\x05\\x9e\\x08\\x79\\xda\\x80\\x61\\xe2\\x72\\x03\\x29\\x7d\\x02\\xf1\\x1f\\xe4\\xe9\\x87\\xe4\\x41\\xa2\\x0e\\xbd\\xd6\\x3b\\x2a\\x7a\\x25\\x16\\x78\\x6d\\xa0\\x26\\x41\\xef\\x38\\xb6\\xf2\\xea\\x6d\\x59\\xdc\\x57\\xde\\x9a\\x44\\xe1\\xc6\\x8f\\xa4\\x3d\\x98\\xb8\\x8f\\xf1\\x59\\x5e\\xb2\\x3b\\x1d\\x2a\\xb2\\xaa\\x05\\x4d\\xe2\\x5c\\xa3\\x14\\xfe\\x04\\x9b\\xe5\\x2e\\xf0\\xbe\\x2f\\x06\\xb8\\x85\\xe2\\x2e\\x1b\\xa4\\x65\\x71\\x23\\x80\\x72\\xec\\x0d\\xea\\x42\\xac\\xc2\\xf1\\x78\\x74\\xfb\\xa9\\x6e\\xc1\\x85\\xc3\\xa3\\x62\\xe9\\x83\\xe8\\x68\\x05\\xbb\\x61\\x71\\x9d\\xdd\\xf1\\x60\\x46\\x77\\xac\\xaa\\xbf\\x2b\\x92\\x2c\\xcd\\x78\\x12\\x3c\\x1d\\x29\\xaf\\xd9\\x46\\xfc\\xb5\\x91\\x4d\\xf0\\x74\\x5b\\xee\\x82\\x22\\xa2\\xa0\\xa5\\xf4\\xfe\\xf4\\xf5\\x3b\\x8f\\x66\\xd5\\xb7\\x45\\xcc\\x76\\xc1\\x36\\x92\\xf1\\x9f\\x23\\xb1\\x16\\x14\\xe3\\x00\\x07\\xc3\\x19\\xdd\\x97\\x85\\xf8\\x38\\x64\\xcf\\x10\\x28\\xa5\\x7a\\xcc\\x63\\xf1\\x43\\x62\\x0c\\xcc\\x3d\\xcd\\xf6\\xfb\\x5d\\x86\\x77\\xdf\\xf9\\xc3\\xe4\\xfe\\xfe\\x7e\\x92\\x16\\xe5\\xcd\\xe4\\xb6\\xdc\\xf1\\x3c\\x2e\\x12\\x9e\\x2c\\x20\\xcb\\x7e\\xc5\\xeb\\xf0\\xe7\\x77\\xdf\\x4c\\xfe\\xe8\\x51\\x4c\\x9d\\x51\\x05\\xe0\\x30\\x99\\x47\\x14\\x12\\x4f\\x20\\xe1\\xb2\\xdf\\xb1\\x2c\\xf7\\x30\\x50\\x3b\\x96\\x88\\x9f\\x1e\\x7d\\x10\\xcf\\xce\\x97\\x6e\\x76\\x74\\xa0\\x69\\x1d\\x7a\\x55\\x41\\x8c\\x36\\xab\\x82\\x28\\x91\\x35\\xae\\xd8\\x1d\\x93\\x91\\x9a\\x8f\\x6a\\xec\\x55\\xf0\\x24\\xfa\\x14\\xad\\xcf\\xf1\\x73\\xf0\\xa5\\x73\\xec\\x09\\x5a\\x9f\\x1f\\xa9\\x7b\\x5c\\xb0\\x89\\xa7\\x0a\\x7f\\xf9\\xee\\x5b\\x4f\\x8e\\x5d\\x15\\xbd\\xe3\\x0f\\xb5\\x1a\\x8c\\x2a\\x13\\x24\\x21\\x7e\\x57\\x1e\\x5c\\x31\\x6f\\x18\\x98\\x17\\x20\\xd9\\x86\\x44\\xdb\\x00\\x66\\x2a\\x96\\x17\\x1f\\x45\\x2f\\x5e\\x60\\xd1\\x9b\\xb2\\x5c\\xcc\\x37\\x30\\x54\\xe5\\x91\\x5a\\xd7\\x08\\xee\\xb2\\xda\\xa1\\x87\\x3a\\x18\\x0a\\x96\\x4d\\xc2\\xc1\\x6d\\x8f\\xfa\\x32\\x5a\\x56\\x91\\x0f\\x97\\x95\\x7b\\x3f\\x09\\xd6\\x2f\\xa8\\x22\\xdf\\x2d\\xa5\\x82\\x25\\x10\\x05\\x3f\\x6a\\x6b\\xeb\\xdf\\x22\\x7f\\x17\\x11\\x28\\x7c\\x57\\xb2\\xbc\\xda\\x17\\x65\\x2d\\x0a\\x6f\\x64\\x61\\xe3\\xb3\\x6d\\x7b\\x6a\\x44\\x36\\xb6\\x15\\x68\\x18\\xc1\\x8d\\xd8\\x91\\x23\\x8c\\x5e\\x9b\\x6b\\xf4\\x76\\x2f\\x3d\\x2f\\x76\\xe1\\xf5\\x54\\x4e\\xf9\\x70\\xb8\\xa6\\x37\\xe6\\x71\\x34\\xf2\\x77\\x56\\x96\\x85\\xdd\\xf4\\x0a\\x72\\x63\\x91\\x65\\xee\\xef\\x74\\x2e\\x6e\\x5a\\x38\\x4e\\x2f\\x74\\x1f\\xe6\\xd3\\x2f\\xd9\\x6e\\x17\\xb1\\xf8\\xba\\xf2\\xbd\\x22\\x8f\\xf9\\xe0\\x86\\xdf\\x14\\xe5\\xa3\\x47\\xe8\\x6f\\x02\\xe9\\xd5\\xac\\xbe\\xad\\xbe\\x2c\\x12\\x0e\\xb1\\xf4\\x4b\\x81\\xe2\\x2b\\xf1\\x5f\\x1d\\xce\\xe8\\x6d\\xe8\\xc5\\x2c\\x8f\\xf9\\x8e\\x27\\x1e\\xbd\\x0b\\x9f\\x4a\\xce\\x92\\xc7\\xb7\\x70\\x9c\\x67\\xb4\\x75\\x3b\\x76\\xf8\\xbe\\x67\\xa9\\x7f\\x11\\x86\\x61\\x8d\\x57\\x19\\xb8\\xe6\\x3e\\x1d\\xb5\\x70\\x79\\x13\\x69\\x1f\\xb7\\x74\\x15\\xb5\\xb3\\x02\\x84\\xd1\\xea\\x62\\x7d\\x8c\\xc2\\x74\\xc5\\x1a\\x6f\\x8e\\x0e\\x3b\\x1e\\xa1\\xd8\\x27\\x3a\\x8a\\x31\\x7d\\xbe\\xdb\\xb9\\xc3\\xaa\\x3a\\x22\\x6a\\xc0\\xa0\\x96\\x3c\\x40\\x5b\\xaf\\x4a\\xcc\\xe4\\xb7\\x5b\\x5e\\xd5\\xad\\x89\\xd8\\x39\\xcd\\xdc\\xac\\x60\\x8a\\x9f\\x3b\\x1c\\x7c\\x16\\x56\\x82\\x86\\xc1\\x84\\x04\\x8c\\x96\\x2b\\x06\\x77\\x11\\x2a\\x18\\x04\\xcb\\x5a\\x66\\x09\\xff\\x4e\\x12\\x16\\x9d\\x1a\\x73\\x90\\x34\\x29\\xd2\\x23\\x64\\xaa\\xad\\xd9\\x9c\\xee\\xb5\\x05\\xe7\\xae\\x8b\\xcb\\x9a\\x68\\xdf\\x34\\x46\\x7e\\x13\\x4c\\xf8\\xea\\x37\\x30\\xe9\\x5b\\x45\\x6b\\xa4\\x2a\\x06\\x77\\xca\\x1d\\x82\\xad\\xee\\xe4\\x9e\\x37\\xd2\\x82\\x52\\x16\\x09\\x60\\xef\\xd0\\xdb\\x1e\\x0e\\xb7\\x5a\\xbc\\x33\\x1a\\xc5\\x53\\xa8\\xe8\\x47\\x84\\x3e\\xf8\\x33\\x95\\x82\\xfc\\x78\\x14\\xe3\\x29\\xb4\\x77\\xd1\\x1d\\x31\\x76\\xf2\\xfb\\x29\\x4b\\x12\\x7a\\x37\\x95\\x17\\x40\\x78\\x87\\x2e\\x1c\\x77\\xc8\\x87\\x85\\x77\\xe0\\xaf\\x21\\xee\\xb1\\x72\\x17\\xfa\\x3e\\x3b\\x1c\\xe0\\xe7\\xe1\\x50\\x44\\x44\\x30\\x9e\\x5a\\x8a\\xc9\\x41\\x8a\\xa9\\x1f\\xaf\\x22\\x0a\\x68\\x7e\\xec\\x9d\\x9f\\x43\\x48\\x2a\\xcc\\x11\\x38\\xbd\\xe1\\xf5\\xb6\\x48\\x04\\xfd\\x86\\xa2\\xc1\\x6b\\x5d\\x82\\x55\\xe8\\xb5\\xa1\\x5f\\x94\\x36\\xd0\\x14\\x61\\x76\\xb9\\x7e\\x16\\xc4\\xf3\\xd6\\x52\\xa2\\x7d\\x3d\\x8d\\xcb\\xa2\\xaa\\xbe\\x2a\\x6e\\x58\\x96\\x43\\x9c\\x7d\\xc5\\x27\\xc1\\xf8\\x1b\\xac\\x12\\x75\\xaa\\x87\\x43\\x7f\\xb8\\x3d\\x1c\\x24\\x1d\\x00\\xd3\\x10\\x24\\xe3\\x85\\x7c\\xba\\x10\\x44\\xce\\x16\\x1d\\xe7\\xbd\\x6d\\x5d\\xef\\x03\\x41\\x8e\\x88\\xda\\x4b\\xef\\x8f\\x33\\x2f\\xf0\\x3e\\xfd\\xf4\\x95\\x47\\x08\\x78\\x7d\\x46\\xcd\\x6a\\xd0\\x9b\\x53\\x0f\\xbe\\x2e\\x26\\x38\\x1a\\x5d\\x4f\\xad\\x9b\\xd0\\x68\\xae\\x34\\x73\\xa1\\xea\\xc9\\x15\\x09\\x01\\x3b\\x33\\xb5\\x40\\x62\\x91\\x4b\\x96\\x40\\x1c\\x51\\xb6\\x23\\x84\\x96\\x02\\x5f\\xd2\\x6b\\x1a\\xd1\\x3b\\x42\\xf1\\xa4\\xab\\x68\\x39\\x8b\\x4c\\x25\\xa2\\x12\\x5f\\xc5\\x9b\\x98\\x66\\x18\\x23\\x2a\\x9f\\xe2\\x8d\\x3f\\x1e\\x03\\xa5\\xef\\x64\\x65\\xf5\\x00\\x23\\xd6\\xac\\xac\\xcd\\xa6\\xe2\\x1f\\x37\\x2a\\x28\\xbd\\x06\\x9d\\x94\\x4c\\xc4\\x32\\xcc\\xe4\\xcd\\x8f\\x55\\x09\\x4d\\x42\\xd8\\x05\\xa7\\x16\\x9c\\x32\\x39\\x3f\\xf9\\x7e\\x1c\\xfa\\x49\\xa4\\xe8\\xf4\\xa5\\x37\\xf2\\x02\\x6f\\xe9\\x91\\xb1\\x9c\\xae\\x34\\x5a\\xc1\\x27\\xd8\\x42\\x16\\x6f\\xb9\\x4a\\x85\\x8b\\x10\\x9b\\x9a\\xe6\\x46\\x47\\x99\\x46\\xd4\\xfb\\x78\\xfe\\x3e\\xf4\\xc6\\x71\\x34\\x1e\\x93\\x20\\x19\\x77\\x7e\\xc6\\xd3\\x35\\x44\\xe7\\x59\\xaa\\x48\\x1f\\xc8\\x61\\x62\\xd3\\x42\\xab\\x64\\x3d\\x1a\\xdd\\x4d\\x9b\\x88\\xca\\xf7\\xde\\xa4\\x13\\x55\\x67\\xf2\\x36\\xcb\\x63\\xee\\xd1\\x56\\x4b\\x90\\x42\\xd6\\x6c\\x73\\xaa\\x93\\xef\\x8b\\x9c\\x4f\\xbe\\x13\\x60\\xee\\x99\\xda\\x84\\x50\\xdf\\x00\\x8e\\x59\\x47\\xf1\\x64\\x11\\x4e\\x43\\x4c\\x24\\x1c\\xd9\\x65\\xa4\\xfb\\x4b\\x0e\\xfb\\x44\\x9d\\x5e\\x08\\xed\\x6a\\xf0\\x39\\x10\\x58\\x9e\\x7d\\x66\\x81\\x8f\\xb9\\x96\\x59\\xcb\\xaa\\x95\\xfb\\x66\\xbd\\xec\\x7d\\x33\\x96\\x14\\xbc\\x5b\\xbc\\xf4\\xe8\\xc0\\x1b\\xe7\\xd1\\xd8\\x5b\\x0c\\x7e\\x0b\\x67\\xd3\\xd9\\xdc\\x0b\\x3c\\x8f\\x04\\xa6\\x1b\\x70\\xf5\\x02\\x8e\\xf6\\x4a\\x60\\xd8\\xeb\\xe9\\x16\\xaf\\x15\\xd2\\x31\\xde\\x2b\\xaa\\x5f\\xaf\\xae\\x30\\xdb\\xe1\\xf5\\x14\\x13\\x43\\xbc\\xe5\\x79\\x82\\x61\\x40\\xf5\\x23\\xea\\xcd\\x76\\xf4\\x8e\\x5e\\x13\\x99\\x8d\\x19\\xcf\\x90\\x3e\\x44\\x12\\xd7\\x92\\xc5\\x6d\\xe8\\xc1\\x4f\\x4f\\x0f\\xe4\\x49\\xa2\\xd3\\x60\\x2e\\x89\\xf2\\x39\\xd5\\xbe\\x5b\\xf3\\x23\\xb9\\x5b\\x5d\\xad\\xfd\\x6b\\x35\\x88\\x38\\x2c\\x05\\x11\\x23\\x4f\\x2a\\x79\\xba\\x9b\\x9a\\xab\\x3c\\x9c\\x43\\x8a\\xba\\xc6\\x01\\x84\\x04\\x17\\xab\\x3b\\x7a\\xbd\\x16\\xa0\\x09\\xf4\\xb2\\x58\\xf5\\x1a\\x8d\\x8b\\x2f\\x67\\xc0\\xba\\x74\\x47\\xa7\\x50\\xa3\\xf6\\x64\\x65\\x8f\\x1c\\xa9\\x6e\\x49\\x30\\x9d\\x4f\\x1d\\xce\\x69\\x3c\\xad\\x04\\xf5\\x5f\\xd2\\x07\\xc5\\x7b\\xdc\\x23\\x9d\\x00\\x57\\x1a\\x01\\x76\\x65\\x70\\xbf\\x78\\xf0\\x27\\x73\\x7a\\x4f\\x8e\\xe8\\x06\\x0c\\x4f\\x82\\xf7\\xd0\\xf4\\x99\\x67\\xc5\\xa3\\x7a\\xc0\\x30\\xad\\x5a\\x98\\x42\\x4b\\x5a\\xd1\\x5b\\x7a\\x4f\\x1f\\xc2\\x68\\x71\\x31\\x0c\\x43\\x41\\x45\\xd5\\xe1\\x05\\xdd\\x8c\\x46\\x8e\\xb1\\xf4\\x86\\xe8\\x1c\\xe9\\x94\\x43\\x84\\x10\\x8f\\x3a\\x8b\\xc4\\x2e\\x67\\xcb\\x4f\\x83\\x19\\xbd\\x0a\\xd9\\x65\\x78\\x31\\x9b\\x8d\\x46\\xaf\\x66\\xb3\\x4b\\x76\\x38\\xbc\\x9a\\x7d\\x1a\\x86\\x21\\x03\\x0b\\xb1\\xdb\\xb0\\x8e\\xfc\\x6b\\x7a\\x47\\x53\\x42\\xe8\\x6d\\x78\\x2b\\x1e\\x6e\\xe9\\x1d\\xbd\\x22\\xf4\\x6a\\xe9\\x37\\x4e\\xf8\\x7d\\x78\\xd7\\x25\\x61\\xf8\\x96\\x55\\xb5\\x3e\\xd3\\x1e\\xa1\\xf7\\x5d\\xc8\\x20\\xbc\\x27\\xb4\\xa7\\xbd\\x38\\xbb\\xba\\x99\\x3c\\xc8\\xe1\\x3d\\x21\\xf4\\x02\\x07\\x7a\\x38\\x78\\x7f\\xfe\\xfa\\xf3\\xaf\\x20\\x6e\\x02\\xe0\\xca\\xe5\\x43\\xe8\\xe5\\x85\\x0a\\x22\\x1b\\xc8\\xf9\\x60\\x69\\x7d\\xa3\\x06\\x12\\xf8\\x0f\\xe1\\x2d\\x50\\x0e\\x9c\\x96\\xe1\\x2d\\xe2\\xc7\\x2a\\xbc\\xc5\\x4b\\x9c\\x5e\\x85\\xc3\\x8a\\x90\\xc0\\xaf\\xc2\\x07\\x2a\\xae\\xf0\\xe1\\x03\\x19\\x8d\\xfc\\x87\\xd0\\x93\\x7c\\xe3\\xec\\x12\\x52\\x12\\x85\\x33\\x71\\x19\\x29\\x0a\\x24\\x64\\xfa\\x27\\x04\\x31\\xf7\\xa3\\xc3\\xe1\\x41\\xdc\\xf9\\xf4\\x6a\\x59\\x38\\xde\\xb1\\x3b\\xba\\x2a\\xe9\\x03\\xbd\\x5b\\x93\\xa0\\xb0\\xfd\\x63\\x77\\x02\\x44\\x1f\\x68\\xb5\\x36\\x9d\\x0a\\x6a\\xc9\\xff\\x4d\\x10\\xb7\\x72\\x3b\\x1d\\xe0\\xbe\\x5a\\x22\\x78\\x4b\\x5e\\x34\\x80\\xa7\\xaf\\x71\\x8c\\x02\\xda\\xe9\\xd5\\xb2\\x0c\\x44\\x77\\x7b\\x08\\x8a\\x61\\x7d\\x64\\x0d\\x99\\x1c\\xfd\\xc6\\x39\\xf9\\x52\\x1e\\x39\\x7d\\x56\\x26\\x13\\x75\\xb9\\x1d\\x0e\\x3d\\x57\\x5b\\xb1\\xb7\\x53\\xcf\\xdc\\x01\\xd5\\x2a\\xb8\\xa2\\x3e\\xf1\\x7f\\xae\\xec\\xff\\x68\\x4c\\x3d\\xe0\\xa5\\x08\\xb4\\x79\\x0b\\x8c\\x60\\x9f\\x5a\\x0c\\xdb\\xc8\\x35\\x88\\x4c\\x82\\x1f\\x47\\x0d\\xb7\\xe1\\xb5\\x47\\xbd\\x7d\\x51\\xd5\\xed\\xa0\\x90\\x4d\\x65\\x8e\\xeb\\xbc\\xe3\\x0a\\x61\\x41\\x63\\xcf\\x0f\\x87\\x84\\x26\\x61\\xac\\x4f\\x12\\x91\\x6c\\x98\\x0f\\xbc\\x1c\\x43\\x86\\x3d\\xa2\\x0a\\xfd\\x06\\x1c\\x45\\x01\\x31\\x55\\xa8\\x2c\\x51\\x96\\xa0\\x2a\\xa5\\x4f\\xa7\\x0a\\xae\\xdd\\x27\\x0a\\x01\\x74\\xbf\\x6a\\xae\\x8a\\xcd\\x9f\\x6b\\x41\\xc0\\x9c\\x2a\\x29\\x88\\xe0\\x27\\x49\\xc3\\xdb\\xf2\\xbe\\x64\\xfb\\xcf\\x77\\x1d\\x26\\x15\\x8b\\xae\\x59\\x33\\xb2\\x3c\\x6d\\x91\\x25\\xbb\\x73\\xad\\xb1\\x08\\x39\\x12\\xcc\\xaa\\x01\\xf7\\x18\\xe8\\x78\\x7b\\x52\\x46\\x91\\x29\\xff\\xcd\\x9f\\x11\\x2b\\x7d\\x8f\\xaa\\xe6\\x5a\\x4c\\x3a\\x69\\xff\\x64\\x15\\x42\\xa3\\x66\\x3a\\x39\\xf4\\xfe\\x00\\x3f\\x75\\x64\\xc0\\x18\\xa6\\xa1\\x92\\x9a\\x13\\x4c\\x8d\\xc8\\xc2\\x8e\\x52\\x13\\x9f\\x58\\xe7\\x45\\xab\\x31\\x07\\x99\\x0c\\x4a\\x27\\x66\\xfa\\x26\\xcf\\xf9\\x33\\x6e\\x0c\\xbd\\x96\\x4e\\x8d\\x45\\x83\\xae\\x5a\\xcb\\xd6\\xca\\xa1\\xa0\\xad\\x97\\xe2\\x50\\xd3\\x1e\\x95\\x6f\\x5c\\x95\\x96\\xb1\\xd9\\x02\\x12\\x44\\x56\\x4a\\x37\\x39\\xe4\\x4e\\xf3\\x06\\x67\\x88\\x8b\\x93\\x59\\xc4\\x9a\\x1b\\x1d\\xb9\\xa6\\x30\\x24\\xc0\\x4f\\xdd\\xe6\\xee\\xc7\\xdc\\x95\\xc1\\xbd\\xec\\xc8\\x2e\\x6a\\x99\\x09\\xa0\\x29\\x13\\xe6\\x61\\x3f\\x1c\\x8c\\xc5\\x9f\\x4e\\x24\\x25\\xcd\\xaa\\x4c\\xe6\\xdc\\xa3\\x74\\xfa\\x55\\x46\\x1e\\xfb\\x52\\xba\\x09\\x57\\x2a\\x5a\\x4a\\xa7\\xa1\\xb0\\x15\\xba\\xf5\\x75\\x38\\x1b\\x8d\\xdc\\x80\\xea\\xaf\\x43\\xf0\\x75\\x72\\x7a\\x83\\x14\\x02\\x3b\\xde\\xd1\\xdd\\xb0\\xf3\\xbb\\x62\\xf9\\x41\\x18\\x72\\x17\\x85\\xe7\\xff\\x7c\\x31\\x3b\\xdf\\xd0\\xfb\\x28\\x3c\\xff\\x75\\xf5\\xeb\\xfa\\xe3\\x73\\xfa\\x00\\x66\\x4e\\xcb\\x5f\\xf3\\xf3\\x0d\\x7d\\x94\\x9a\\x30\\x54\\x51\\x4b\\x63\\xf6\\x43\\x76\\xc3\\x36\\xa0\\x34\\xe3\\x35\\xe8\\xcf\\xc8\\xc7\\xe7\\x19\\xfd\\x7b\\x74\\xca\\x0c\\xfe\\x9a\\x3f\\x6e\\x78\\x4e\\xce\\x33\\x43\\x27\\x7c\\xde\\x94\\x71\\xb7\\x02\\x87\\x4a\\x14\\xe9\\x78\\x62\\x71\\xf2\\x14\\x1f\\x0e\\xf7\\x91\\x8a\\x6b\\xba\\x4c\\x7c\\x46\\x39\\x09\\x44\\x6f\\x63\\x6f\\xe5\\x8d\\xfd\\x96\\x40\\x88\\x2f\\x23\\x41\\x4e\\x8e\\xbd\\xb5\\x47\\x39\\x2a\\x7c\\xad\\xcc\\xcd\\x87\\x83\\x6a\\x30\\xd4\\x59\\x9f\\x23\\x42\\x12\\xc0\\xc0\\x0d\\x7f\\xdd\\x88\\xe8\\xcf\\x70\\xe8\\x2e\\x5a\\xf1\\x35\\xf6\\x28\\x99\\xb4\\xb0\\xd3\\xfe\\x03\\x73\\x86\\x35\\xc2\\x08\\x84\\x0d\\x27\\xfd\\x65\\xe4\\x2b\\xf3\\xa0\\x68\\xe9\\x79\\x02\\x49\\xaf\\x94\\xe9\\xcc\\x3a\\x44\\xe9\\xe7\\xcf\\x3f\\xbd\\x11\\xb7\\x5d\\x91\\x43\\x96\\x3b\\x32\\xf6\\x42\\x6f\\xdc\\xf1\\x26\\x22\\x47\\x27\\x9d\\x64\\x24\\x2d\\xe7\\x6d\\xc9\\x9b\\xe0\\xfa\\x1c\\xfd\\x91\\xcd\\x55\\x5a\\xe1\\x68\\x18\\x18\\xa3\\xa3\\x9c\\x4b\\x46\\x16\\xf8\\x71\\xc7\\xb2\\x5c\\x3b\\xa1\\xab\\x6d\\x72\\x82\\x0b\\xe3\\x79\\x99\\xe6\\xec\\x86\\x53\\x63\\xa7\\xa5\\x17\\xde\\x0a\\x8d\\xf3\\x79\\xe4\\xc7\\x14\\x42\\xe0\\x88\\xcd\\x35\\x51\\x0a\\xae\\x8a\\x2c\\xf7\\xbd\\x91\\x25\\x6c\\xb8\\x8b\\xa8\\x37\\xf6\\x9a\\x17\\x46\\xc5\\xcb\\x8c\\xed\\xb2\\xbf\\x77\\x66\\x85\\x91\\x9c\\x33\\xc6\\xb7\\x54\\x15\\x71\\x5e\\x84\\x1c\\xa9\\x5b\\xd4\\x87\\x1d\\x3a\\x71\\xb8\\x74\\xbd\\x42\\xac\\xc0\\xa5\\xe2\\xdb\\x18\\x61\\xb1\\xa5\\x6d\\xe4\\x23\\x6d\\x4d\\x8f\\x44\\xc5\\x09\\xe8\\xbc\\x12\\x00\\xf6\\x1c\\x6c\\x97\\x83\\x79\\xe6\\x50\\x21\\x9b\\xac\\xf2\\xbd\\xc0\\x58\\x37\\x8d\\x46\\x7f\\x97\\xc7\\xc0\\xb1\\xaa\\x23\\xa3\\xd1\\xf0\\x31\\x32\\x29\\x40\\x15\\x5e\\x92\\x59\\xe6\\x87\\x2a\\x7b\\xbe\\xb8\\x05\\xdd\\xb9\\xd9\\xfe\\xc3\\xb6\\x05\\xa1\\x1b\\x3e\\x33\\x46\\x49\\x9f\\x81\\x90\\x18\\xf2\\xfb\\xb3\\xbd\\x1f\\x77\\x18\\x0a\\x3e\\x89\\x39\\x04\\x11\\x42\\x02\\x00\\x41\\x60\\x92\\x8c\\x3e\\x44\\xd4\\xfb\\xb5\\xfc\\x35\\x07\\x8a\\x28\\xe8\\xa8\\x1a\\x77\\x57\\xc5\\x4c\\x79\\x88\\x57\\x1d\\x18\\x7e\\xd8\\x96\\xb6\\x2f\\xa6\\xe0\\x72\\xac\\x80\\xb8\\xbf\\x7c\\xf7\\xed\\x9f\\xeb\\x7a\\x2f\\xd9\\x45\\xc9\\xef\\x30\\xf2\\x74\\x44\\x6c\\xf8\\x45\\x14\\xce\\xe8\\x97\\xa0\\x97\\xff\\x2a\\x0a\\x9f\\x66\\xe0\\x64\\x3a\\xbf\\xb8\\x78\\x15\\x5c\\xcc\\x3e\\x3d\\xd2\\xaf\\x9b\\x27\\x48\\x7c\\xcd\\x27\\x0b\\x36\\x65\\x75\\xcd\\xe2\\xed\\xd7\\x28\\x67\\x71\\x1e\\x7d\\xaf\\xc8\\xd1\\x8e\\xc8\\xb3\\x4f\\x87\\xce\\x85\\x2b\\x8e\\xc0\\x97\\x11\\xf9\\x32\\x5a\\xb1\\x35\\x44\\xc3\\x12\\xec\\x78\\x59\\x85\\xc3\\xe1\\xd7\\xd1\\x68\\xe4\\xdd\\x67\\xf5\\xf6\\xcb\\x92\\x27\\x3c\\xaf\\x33\\xb6\\xab\\xbc\\x2c\\x1f\\x7c\\x1d\\x09\\x56\\xf0\\x8a\\x3d\\x84\\x5f\\x47\\x50\\x4d\\x2e\\x81\\x66\\xc5\\xfc\\x5e\\xca\\x09\\xfb\\x3e\\x1c\\x44\\xd7\\x43\\x66\\x8b\\xc2\\x96\\x4f\\x95\\x93\\x35\\xda\\xd6\\x3b\\x86\\x0c\\xe7\\x49\\x37\\xe1\\x78\\xfc\\x45\\x84\\xe9\\xc0\\x8a\\xbd\\xb8\\x45\\x50\\x94\\xc7\\x40\\xc6\\xc3\\x90\\x3f\\x15\\x4f\\x15\\x2f\\x61\\x0b\\xd9\\x74\\xcf\\xaa\\xea\\xbe\\x28\\x13\\x42\\xa1\\x13\\xd4\\x7b\\x18\\xb5\\x9c\\x53\\xb8\\xe2\\xeb\\xd0\\x2a\\x58\\xf1\\xf5\\xc2\\x68\\x82\\x47\\xa3\\x74\\xda\\x14\\xe2\\x76\\x95\\xf9\\xa6\\x89\\xf8\\xa6\\x35\\xc5\\xc3\\x21\\x5e\\x79\\xbf\\x4c\\xe4\\xde\\xf3\\x64\\x02\\xb9\\x1f\\x21\\xa0\\x7e\\x57\\x79\\xe8\\xb9\\xc0\\x22\\x23\\xcb\\x48\\xa5\\x70\\xda\\x96\\x3a\\x70\\x1a\\x43\\xac\\x86\\xa8\\xeb\\x52\\xb7\\xb6\\x5e\\xa0\\x62\\x29\\xd2\\xfa\\x12\\x02\\x5d\\x47\\x61\\x3a\\x2d\\x00\\x44\\xe0\\x07\\xca\\x63\\xc1\\x98\\x49\\x4a\\x1b\\x80\\x13\\x4c\\x95\\x14\\x22\\x90\\xdc\\x1c\\x94\\x26\\x90\\x99\\x4d\\x70\\x5c\\x34\\xb5\\x98\\x38\\x12\\x24\\xfe\\x57\\xd1\\x4a\\x15\\xad\\x0f\\x87\\xce\\x6a\\x6d\\x7b\\xd5\\x74\\x6a\\xab\\x9e\\x96\\x32\\x87\\xbb\\x53\\x78\\x94\\xba\\x6a\\x9a\\x4e\\x3b\\x05\\xfd\\x3e\\x01\\x33\\x53\\x3d\\xa7\\xc8\\x27\\xd4\\xcc\\x2b\\xf2\\xe5\\xf0\\x09\\x8d\\x42\\x98\\xbf\\x28\\xc2\\x79\\xca\\x1c\\xc3\\x28\\x90\\x60\\x8e\\xa8\\x0b\\x55\\xc5\\x18\\xe2\\x42\\xc9\\x29\\xb6\\x32\\xf5\\x06\\x8a\\x28\\xb6\\xc7\\x96\\xf0\\x1c\\xd6\\x3a\\x12\\x68\\xc2\\x8e\\xeb\\x6e\\xe9\\x7a\\xb4\\xe2\\x10\\x59\\x15\\xa9\\x21\\x34\\xea\\x3d\\x3a\\x70\\x34\\x80\\x3d\\xe5\\x3c\\xbe\\xe9\\x2c\\x7f\\x98\\x98\\x37\\x8e\\xa2\\x50\\x7e\\xed\\xdc\\x5f\\x06\\xa2\\xcf\\x83\\xa8\\x46\\xb0\\xf0\\xbc\\xa1\\xd8\\x03\\x0d\\x9d\\xec\\xa2\\x8b\\xac\\x77\\xb2\\xac\\x32\\x42\\xd9\\xd1\\xe0\\x44\\xad\\x50\\xf3\\x35\\x2b\\xe6\\x60\\x06\\x9d\\x6a\\x1a\\x05\\xaa\\xe0\\xf1\\x89\\xa2\\x55\\x74\\x4f\\x75\\x05\\xeb\\xca\\x7f\\x5b\\x30\\x79\\x44\\x7f\\xc3\\x20\\x9d\\xce\\x6f\\x80\\xed\\x80\\xd5\\x8f\\xb1\\x53\\x53\\x5a\\x69\\x07\\xeb\\x00\\x6f\\x2b\\x38\\x0a\\xef\\x35\\xf6\\x76\\xe9\\x11\\xbc\\x65\\x9f\\x8c\\xae\\x18\\x75\\xbf\\x01\\x9b\\x62\\x95\\x2f\\xf1\\x99\\x56\\x65\\x1c\\x00\\x22\\x3a\\x92\\x69\\x91\\xfb\\x1e\\x98\\x6e\\x4a\\xb9\\x47\\xec\\x1c\\xc9\\x48\\x27\\x5d\\xa6\\x31\\x9e\\x33\\x36\\x1a\\x71\\xdf\\x3a\\x56\\x28\\x91\\xf9\\x74\\xf6\\x29\\x5c\\x00\\xf8\\x88\\x91\\x0a\\xb7\\x9c\\xb9\\xc9\\xd2\\x22\\xc1\\xe6\\x75\\x40\\x5e\\x3c\\x1a\\xc5\\x02\\xf2\\x94\\xe9\\xdf\\x37\\x91\\x20\\x01\\xff\\x14\\x85\\xe7\\x7e\\x48\\x7e\\x5d\\xfa\\xcb\\x70\\x74\\xf8\\x98\\x1c\\x7e\\x5d\\xa2\\x11\\xa0\\x05\\x94\\x57\\x55\\x91\\xef\\x03\\x2f\\x96\\xfa\\x42\\x54\\xff\\xee\\x95\\xfa\\xb0\\x1d\\xe0\\xfc\\x9b\\x08\\x63\\x36\\x80\\xa4\\x03\\xe2\\xfb\\x15\\x63\\xef\\x3d\\x4a\\xb4\\x6d\\x5a\\x62\\xc5\\xc0\\xf8\\x89\\x75\\x02\\x88\\xf8\\x06\\x68\\x88\\xf7\\x9e\\x13\\xf5\\xa0\\x99\\xca\\x23\\x9a\\x42\\x25\\x15\\xf0\\xe5\\x4f\\x92\\xca\\x88\\xc4\\xc2\\x93\\xa5\\x77\\x5b\\xee\\xbc\\xa0\\x85\\x54\\x22\\x29\\xbd\\x1e\\xfa\\x8e\\x74\\x1a\\x3d\\x9e\\xb4\\xab\\xd1\\xb3\\x7a\\x7f\\x41\\xef\\x98\\x0f\\x82\\x32\\x60\\x34\\xf2\\xc4\\x5f\\x43\\x75\\x6d\\x0f\\x07\\x0f\\xa7\\x01\\xe9\\xc8\\x1d\\x19\\xb3\\xcf\\xd5\\xf0\\xd5\\x62\\x36\\x08\\x70\\xf7\\x25\\x59\\x36\\x0a\\x7c\\xc1\\xbe\\x3a\\x25\\x74\\xbb\\x8c\\x56\\xdb\\x75\\x28\\xfe\\xd3\\x74\\xca\\x9f\\x40\\xeb\\xe0\\x8d\\xb9\\xae\\xae\\x56\\x2b\\x6a\\xe8\\x3a\\xd4\\xaa\\x29\\x45\\x84\\xac\\x8e\\x34\\x3d\\x24\\x9a\\x35\\xc6\\x39\\xf2\\x78\\xa1\\x16\\x7f\\x1d\\xb6\\x09\\x55\\x48\\x9e\\x8a\\x36\\x95\\x7c\\xec\\x0d\\xee\\x59\\x35\\xc8\\x8b\\x7a\\x20\\xc0\\x08\\x24\\x98\\x9b\\xd5\\x6c\\x7d\\xa4\\xee\\x92\\x84\\x28\\xc8\\x82\\x20\\x93\\x7c\\x4d\\xc5\\x7f\\x76\\xcf\\x1b\\x63\\xef\\x7a\\xa4\\x49\\x47\\xe8\\x46\\x6c\\x00\\x3c\\x10\\x4c\\xcf\\x5d\\xdc\\xb8\\xb1\\x58\\x02\\x50\\x6f\\xab\\xad\\xcf\\x89\\xcc\\x7d\\x6d\\xad\\x7d\\x4a\\x46\\xa3\\xd4\\xdf\\x80\\xcc\\x64\\x13\\xa6\\x26\\xb0\\xb2\\x96\\x98\\xd9\\x28\\x1c\\x6c\\x15\\x20\\x8f\\x65\\x53\\x58\\xf7\\x32\\xf3\\xd7\\x4e\\xff\\x31\\x69\\x09\\x29\\x70\\x1f\\x98\\x0b\\xec\\xd0\\x1e\\x32\\xbc\\x53\\xa9\\xf3\\x29\\x0f\\x87\\xf1\\x68\\xb4\\x5a\\x9b\\xdc\\x74\\xab\\xa8\\x11\\xfa\\x22\\x59\\xcd\\xd7\\x64\\x1d\\x40\\xac\\x4f\\x37\\x23\\xf9\\x8a\\x21\\x7f\\x83\\x01\\x89\\x54\\x7a\\xf1\\xdc\\xe7\\xc4\\xa0\\x23\\x95\\x0e\\x7c\\xb5\\xa6\\x89\\x2d\\x47\\x90\\xcc\\xfa\\x9f\\xc1\\xf1\\x23\\x9f\\x0a\\xd4\\xb6\\xd0\\xbf\\xba\\xd6\\xa0\\x2b\\x38\\xd6\\x9f\\x23\\xb5\\x06\\x7f\\x8e\\xba\\xe3\\xfa\\x2c\\x6c\\x7f\\x6d\\x78\\xb7\\x0d\\x99\\xed\\x0b\\x68\\x8e\\xd9\\x65\\x08\\x1e\\x9d\\x4a\\x73\\xcb\\xa4\\x09\\xda\\x96\\x10\\x0a\\xe1\\xf8\\xe0\\x69\\x06\\x89\\x7b\\x9a\\x4c\\xae\\x5c\\x67\\x29\\x9c\\x0c\\xa2\\x8e\\x80\\x78\\x10\\xd6\\x3a\\xf4\\x7e\\xfc\\xe1\\xed\\x3b\\x01\\xb9\\xda\\x5c\\x5d\\x71\\xac\\x8e\\xd8\\x91\\x5b\\x22\\x47\\x34\\xee\\x91\\xa6\\x4d\\xa4\\x11\\x57\\x96\\x91\\xa7\\xd4\\x40\\x34\\xdd\\x60\\x62\\xf9\\x64\\x29\\xae\\x9b\\x24\\xbb\\x13\\x77\\x8d\\x14\\x4e\\x59\\x10\\x26\\xb8\\x24\\x70\\xb6\\xf1\\x13\\x94\\x24\\x69\\x8d\\xba\\x1f\\x8f\\x46\\x2e\\xe3\\xb4\\x41\\x36\\x38\\xa6\\xe9\\xe1\\x60\\xd9\\xc6\\x01\\xa5\\x15\\x51\\xb6\\x16\\x57\\x08\\x6a\\xf9\\xb5\\xe8\\xd7\\xa8\\x59\\xa9\\x91\\x4b\\xd3\\x86\\x50\\xdb\\x16\\x8f\\x3b\\x82\\x73\\x6a\\xb4\\x44\\xed\\x6c\\x42\\x4d\\x47\\x80\\x2e\\xe3\\xf7\\x2e\\xc9\\x94\\x8c\\x78\\x94\\x74\\x4b\\x7d\\x37\\x25\\xdf\\xfb\\x3a\\x1c\\x97\\x2d\\x3b\\xd4\\x51\\x76\\x04\\xe2\\xc5\\x58\\xae\\x72\\xe3\\x10\\x7a\\xdf\\x80\\xfd\\x9f\\xce\\x49\\xed\\x66\\x25\\x36\\x42\\xa1\\xbf\\x44\\xce\\xf7\\xb2\\xea\\x3f\\xb2\\x3c\\x29\\xee\\x7d\\x46\\x96\\x2c\\xf8\\xd7\\xb0\\x99\\x50\\xcc\\xca\\x6d\\x7d\\xcc\\xa5\\x9c\\x0c\\x1c\\x55\\x7e\\x80\\x9f\\xa7\\x42\\x12\\x58\\xf6\\x3f\\x2a\\x8f\\xa2\\xcc\\xce\\xe9\\x11\\xba\\xc3\\x04\\xef\\x37\\xe1\\xd3\\x71\\xe1\\x09\\x8a\\x39\\x8b\\x65\\x90\\x6b\\x95\\x95\\x6a\\xaa\\x6a\\x87\\x5e\\xc9\\x77\\xac\\xce\\xee\\xb8\\x47\\xe8\\x36\\xdc\\xc9\\x51\\xf8\\x18\\x9c\\x4f\\x76\\x0d\\xfa\\x06\\x9a\\x99\\x82\\x1d\\x4f\\x6b\\x8f\\xd0\\xab\\xd0\\x37\\xa9\\x40\\xc5\\x07\\x0e\\x07\\x2f\\xcd\\x1e\\x78\\x02\\x0f\\x90\\x84\\x6f\\x9c\\xd9\\xb7\\xe4\\x6d\\x5d\\x78\\xe4\\x72\\x32\\xa7\\x57\\x4b\\x3f\\x09\\x77\\x7a\\x14\\xc0\\x9f\\x25\\x90\\x98\\x97\\x87\\xc9\\x54\\x74\\x4f\\x02\\x7f\\x63\\x27\\xac\\x4a\\xc9\\xe1\\x30\\x73\\x73\\x1b\\x66\\xa2\\xa8\\x75\\x46\\x41\\x58\\x14\\xa9\\x80\\xa2\\x31\\x1e\\x63\\x74\\x2a\\x9b\\x42\\x24\\x35\\xff\\x46\\xfc\\xc5\\xa7\\xc9\\x56\\xfc\\x3f\\xde\\x98\\x2a\\xe2\\xdb\\x50\\x47\\xfc\\x90\\xcf\\x93\\x2d\\xfc\\x11\\xf7\\x9a\\x77\\x5b\\x09\\xdc\\x94\\xe5\\x83\\x68\\x19\\x4d\\xe1\\x41\\x7d\\xea\\x86\\x04\\x3b\\x58\\xa0\\x1b\\x4c\\xfa\\x60\\x49\\x79\\x8a\\xe6\\x7e\\x92\\x53\\x3e\\x95\\x86\\xb8\\xb5\\x32\\xf0\\xb7\\x75\\x04\\x72\\xab\\xa6\\x1a\\x5e\\x54\\xe4\\xb8\\x88\\x28\\x97\\x4f\\xf0\\x86\\x93\\xf2\\x7c\\xca\\xc3\\x27\\xc8\\x27\\x4d\\x21\\x9f\\xf4\\xec\\x48\\xd3\\x30\\x81\\x10\\x93\\xb6\\xc6\\x00\\x18\\x64\\xe3\\x85\\x98\\xb6\\x32\\x70\\x5b\\x49\\xce\\x21\\xcc\\x88\\xaf\\x23\\x6e\\x6e\\x78\\xfd\\x45\\x71\\x9b\\x27\\x59\\xbe\\xf9\\x72\\x97\\xf1\\xbc\\xfe\\x89\\xc7\\xf5\\x30\\x0c\\x7f\\x46\\x27\\xcf\\xee\\xf7\\x3e\\x11\\x84\\xec\\x5f\\x22\\x3f\\x25\\x14\\x86\\xc7\\x61\\x43\\xe2\\xe9\\x9e\\x6d\\xf8\\x5f\\x71\\x5e\\x93\\x68\\x1a\\x43\\x83\\x77\\xc5\\x1e\\x07\\xcf\\x71\\x3f\\xb0\\xd6\\x2f\\x8d\\x5a\\xdf\\xf2\\xb4\\x3e\\x92\\x80\\x1f\\xe9\\xbe\\x23\\x39\\x73\\x96\\x6a\\x05\\x87\\x0a\\x75\\x46\\x63\\xbd\\x46\\x49\\x63\\x8d\\x94\\x05\\xbd\\x86\\x6a\\x99\\x42\\xc2\\x3e\\x6e\\xcb\\x08\\x7d\\xf8\\xba\\x26\\x17\\xf8\\x52\\x38\\x86\\x7b\\xf5\\xa3\\x94\\xd4\\xd3\\xc8\\x2e\\x85\\xcb\\xd3\\xc4\\xbd\\x11\\xe3\\xc0\\xcb\\x80\\x80\\x81\\x3b\\xd3\\xd5\\x08\\x85\\x33\\xa2\\x93\\xa1\\x42\\x4d\\xcc\\xe7\\xf5\\xae\\xd8\\xeb\\x54\\xa8\\xa2\\x1a\\xac\\x4f\\x47\\x3d\\xb1\\x38\\xa6\\xa2\\x5c\\x73\\x3c\\x0a\\xd0\\xf7\\x44\\x4f\\x10\\x33\\x38\\xbc\\x13\\x28\\x5d\\x74\\x09\\x0b\\x22\\x8f\\x03\\x76\\xdf\\xac\\x2a\\xba\\x86\\xba\\xc7\\xe3\\x91\\xda\\xf3\\xfd\\x20\\xc9\\x64\\x6b\\xb5\\x0e\\x87\\x37\\x91\\x52\\x37\\x81\\x04\\xd7\\x8e\\x10\\x84\\xcb\\x04\\x56\\x48\\x0a\\xcb\\x75\\x20\\x44\\xd0\\x49\\xd9\\x7d\\x6a\\x39\\xa7\\xe8\\xfc\\xe8\\x86\\xfd\\xd3\\x59\\x60\\x02\\xcf\\x82\\x2e\\x8f\\xea\\xac\\x31\\x58\\x2e\\x61\\xd3\\x4e\\xa0\\x66\\x05\\x5a\\x73\\xaa\\x84\\x61\\x18\\xb7\\x43\\x19\\xf2\\xde\\xcc\\x64\\x11\\x26\\xa8\\xc2\\x94\\xe6\\x7f\\x89\\xac\\xb4\\x83\\x1a\\x33\\xa4\\xcb\\xcd\\x72\\xb3\\x8a\\xd7\\x81\\x20\\x5f\\x81\\xba\\xf4\\x37\\xcb\\x8d\\xce\\x6c\\xe3\\x27\\x4b\\x66\\x9f\\x8d\\x20\\xa5\\xc9\\x32\\x0d\\x98\\x7d\\xaa\\x08\\xb4\\x0d\\x53\\x72\\x14\\xa4\\x5d\\x2b\\x4a\\x0f\\xe6\\xc8\\x6e\\x04\\x70\\x14\\xd7\\x3b\\xe0\\xfe\\xd3\\xf9\\xff\\x20\\xe1\\x9d\\x93\\x1e\\x9d\\x76\\xfa\\xf4\\xc5\\x82\\x9e\\xc2\\x6c\\x86\\x26\\xef\\x6d\\x4c\\x30\\x00\\xbf\\xb9\\x1b\\x56\\xd1\\x1a\\x52\\xd2\\x06\\xb1\\x21\\xa4\\xad\\x1d\\x93\\xa9\\x43\\x75\\x8a\\x42\\x4c\\xe4\\x2b\\xc3\\xdf\\xb7\\xc3\\x26\\x62\\x23\\x9d\\x10\\x0f\\xd2\\xca\\x7b\\x63\\xa6\\x44\\x1c\\x41\\x44\\x3d\\x2f\\xf0\\x8a\\xdb\\x1a\\x8a\\xad\\xf6\\xc0\\x4f\\xc2\\x36\\x26\\xd6\\x36\\x02\\xdb\\x8f\\x49\\x9a\\x9b\\x4b\\x28\\xc8\\x72\\x2b\\x7e\\x81\\xa6\\x67\\x21\\xd0\\x2d\\xe4\\xb4\\x95\\x19\\x18\\x31\\x74\\xf0\\x52\\x25\\x4d\\x09\\x54\\x62\\x5e\\xbd\\xef\\x6d\\x08\\xb1\\xf4\\x4e\\x6d\\x72\\x23\\x12\\xec\\x5f\\x1f\\xb5\\xb2\\xf2\\x10\\x4d\\x7a\\x63\\xb6\\x06\\x9a\\x24\\xd2\\x34\\x09\\x72\\x99\\x4d\\x8c\\xaf\\x63\\xd4\\x47\\xd3\\xa8\\x48\\x1e\\x81\\x9b\\x2b\\x76\\x3b\\xd1\\x9e\\x72\\xe7\\x49\\x55\\xc0\\xa3\\xa6\\x2a\\xb8\\x4f\\xe6\\xe3\\x44\\xed\\x26\\x24\\x25\\xc0\\x63\\x2b\\x26\\xb6\\x21\\x81\\xca\\x8e\\x80\\x91\\x08\\x36\\x00\\xa2\\xe9\\x32\\xd1\\xc2\\x3b\\x0d\\x9c\\xca\\xbd\\xb3\\xca\\xfe\\xce\\x3b\\xf8\\x4a\\x2b\\xe6\\x82\\xbc\\x91\\x59\\x9e\\xbc\\xe5\\xbb\\x14\\x79\\x11\\x96\\x24\\x5f\\x08\\xe6\\xce\\x53\\x2d\\xad\\x00\\xd2\\x3c\\xcd\\x72\\x3e\\x1a\\xe1\\xdf\\x29\\xbb\\x49\\xd4\\x6f\\xdf\\x43\\x6d\\x92\\x47\\x57\\xeb\\x8e\\x84\\x94\\xb9\\xbc\\x7b\\xff\\x8f\\xa0\\x18\\xaf\\xfe\\x4d\\xd4\\xa4\\xdf\\x8a\\xdf\\x1f\\x9b\\x8d\\xca\\x8b\\x2f\\x8b\\x3c\\xdd\\x65\\xb1\\xe5\\x20\\x6c\\x11\\xa1\\xd3\\x8f\\x05\\x1a\\x03\\x62\\xed\\xe3\\xf0\\xdb\\x08\\xe3\\x00\\xcb\\xbe\\xf4\\x1b\\xf9\\xf8\\x7f\\x22\\x42\\xf3\\x23\\x55\\xbc\\x47\\x88\\xd7\\xad\\x7e\\x2d\\x7a\\xc8\\x45\\x0d\\xb2\\x38\\x3f\\x1b\\xfe\\xd3\\xd9\\xe0\\x8b\\xa2\\xa8\\xab\\xba\\x64\\xfb\\xc1\\xdd\\xab\\xe9\\xab\\xe9\\xbf\\x0c\\x7c\\xb0\\xfa\\x3c\\x3f\\xdf\\xf0\\x3a\\x52\\xef\\x04\\x9b\\x40\\xfe\\xe9\\x6c\\xf0\\x65\\xb1\\x7f\\x2c\\xc5\\xa1\\x1a\\x5c\\xcc\\xe6\\xf3\\xc9\\xc5\\x6c\\xfe\\xd9\\xe0\\xdd\\x7d\\x56\\xd7\\xbc\\xa4\\x83\\x37\\x79\\x3c\\xfd\\xa7\\xb3\\xc1\\xb7\\x59\\xcc\\xf3\\x8a\\x27\\x83\\xdb\\x3c\\xe1\\xe5\\xa0\\xde\\xf2\\xc1\\x77\\x6f\\xde\\x0d\\x76\\x58\\xfc\\x4f\\x67\\xe7\\x82\\xa3\\x13\\xef\\xc4\\xda\\x25\\x66\\x81\\x71\\x80\\x52\\xfe\\x99\\xf3\\xfb\\xc1\\xd7\\xe8\\x52\\xa9\\x07\\xf8\\x49\\x35\\xf8\\x0b\\xbb\\x63\\x68\\xa2\\x32\\x28\\xf9\\x6f\\xb7\\x59\\xc9\\x2b\\xd9\\xce\\x23\\x8b\\xb1\\x4d\\x4d\\x79\\xb7\\x15\\x1f\\x08\\xbe\\x31\\xae\\xbd\\x85\\x0a\\x16\\x95\\xe6\\x52\\xf1\\x67\\x39\\xce\\xac\\x66\\x6b\\xf5\\x34\\xf5\\xc0\\xb0\\x2d\\x5a\\xcd\\xd6\\xaf\\x2f\\x46\\xa3\\x68\\x35\\x5f\\xbf\\xfe\\xd7\\xc3\\x61\\x1e\\x42\\x02\\xf9\\xd1\\xe8\\x5f\\xc5\\x8f\\xf9\\x5a\\xbc\\xb9\\x58\\xbf\\x9e\\x1f\\x0e\\xa2\\xf8\\xf2\\xd5\\xef\\x1d\\xf2\\x40\\xf9\\xb9\\xcc\\xa7\\xff\\x3a\\x9d\\x0f\\x8a\\x72\\xb0\\xcd\\x36\\x5b\\xb1\\x92\\x11\\x78\\x70\\xdf\\xc3\\xea\\xb1\\x5c\\xd7\\xfb\\xd4\\x23\\x47\\x5f\\x2e\\x13\\xed\\x9f\\xad\\x66\\x3e\\x22\\x7d\\x87\\xea\\xa3\\xdf\\x08\\x6d\\xa9\\x37\\x18\\x04\\xd8\\x4f\\x98\\x69\\x1f\\xa4\\xa0\\x32\\xaf\\xff\\x7d\\xa3\\xe4\\xeb\\x3c\\xf1\\xe8\\x77\\xc5\\xdf\\xed\\x3a\\xb5\\xfe\\x0d\\x06\\x7e\\x3f\\xd8\\xef\\x0a\\xa7\\xe9\\xa0\\x68\\xd4\\xad\\x7b\\xbb\\x39\\x9a\\xc8\\xf7\\x3a\\x8d\\x8d\\x76\\xfb\\x53\\xc9\\xcd\\xe3\\xb5\\x24\\x4c\\x9f\\x78\\x9e\\x04\\xd1\\x2a\\x5e\\x1f\\x4d\\x94\\x13\\xd8\\x6e\\x7e\\x73\\xbb\\x63\\x35\\x77\\x46\\xe1\\x1c\\x31\\x54\\x0f\\x0e\\xe7\\x92\\x2c\\x5e\\xc8\\xb4\\x98\\x53\\xc1\\x6b\\x7b\\x51\\xd5\\x98\\xb9\\x2d\\x12\\x0d\\x87\\x33\\x79\\xb2\\x1d\\x44\\x13\\x1f\\x0e\\xcc\\x4f\\x88\\x36\\xd0\\x62\\xd3\\xea\\x76\\xbf\\x2f\\xca\\x7a\\x6a\\x26\\x38\\xe5\\x79\\x62\\x02\\x91\\x5b\\x16\\x8f\\x5c\\xdb\\xbe\\x53\\xe6\\x88\\xa6\\x3a\\x3a\\x01\\x55\\x44\\xd7\\x0b\\x4c\\x3c\\x07\\x56\\x62\\x32\\x81\\xc3\\xb4\\x31\\x91\\xf0\\x29\\xca\\xf2\\x04\\x84\\x0c\\x7d\\xc3\\xd3\\x6e\\xe7\\xa7\\x6b\\x6d\\x21\\x84\\xa9\\x93\\xdf\\x42\\xf0\\x31\\x7e\\x34\\xad\\x59\\xb9\\xe1\\x35\\x28\\x79\\xd1\\xb0\\x47\\xb1\\x10\\x53\\x6c\\xf3\\x43\\x74\\x25\\x7f\\x95\\xdd\\xf2\\x1b\\x40\\xe6\\x1f\\x08\\xef\\xd1\\xe9\\x80\\x81\\xd2\\xeb\\x42\\x9a\\xf8\\xf0\\x30\\x06\\xf9\\xa1\\xd8\\xe7\\x29\\xdb\\x71\\xd0\\xd9\\xf0\\xc3\\xa1\\x55\\x4a\\x39\\x38\\x97\\x6b\\x0b\\xa5\\xb6\\x48\\x78\\x34\\xe2\\xab\\x48\\x65\\x12\\x13\\xc3\\xc6\\x2f\\x7d\\xb2\\x12\\x3d\\x4d\\x92\\xac\\xba\\xc9\\xaa\\x2a\\xf4\\xb0\\xbb\\xf5\\x27\\xd4\\x85\\x41\\xe6\\x47\\x28\\xe5\\x87\\x90\\x0c\\x9e\\x89\\xc0\\x54\\x54\\x9c\\x1c\\x17\\xc9\\xf4\\xdf\\xbf\\xfe\\xe9\\xed\\x9b\\x1f\\xbe\\x0f\\x3d\\xc0\\xd0\\x1e\\x4d\\xa6\\xef\\x7e\\xfa\\xfc\\xfb\\xb7\\x6f\\xde\\xbd\\xf9\\xe1\\xfb\\xf7\\x5f\\xfd\\xfc\\xd3\\xe7\\xe2\\x47\\x38\\xff\\xc3\\x8c\\x26\\x56\\xe6\\x3f\\x68\\xef\\x7c\\x48\\xaf\\x54\\xec\\x93\\xa7\\xcd\\x34\\xe1\\xb5\\x58\\x20\\x03\\xab\\x1e\\x34\\x49\\xa6\\x66\\x3d\\xb4\\x34\\xef\\x88\\x80\\xce\\x74\\x70\\x27\\x8e\\xf1\\x5a\\x40\\x62\\x3d\\xc1\\xcd\\xf6\\xc8\\x22\\x85\\x40\\x94\\xea\\xdd\\xb6\\xe4\\xa9\\x27\\x2a\\xa7\\xa3\\x51\\xaa\\x45\\xca\\xe7\\xd3\\x33\\x7f\\x19\\x7e\\xb4\\xfa\\xdb\\xaf\\xd5\\xfa\\xec\\x63\\x72\\x4e\\x3d\\x8f\\xe0\\x41\\xda\\x84\\xcc\\xf7\\x3e\\x02\\x37\\xc9\\xe5\\x6a\\x1d\\xa4\\x64\\x81\\xc1\\xfc\\x4a\\x80\\xe6\\xaf\\x50\\x38\\xe2\\x1b\\x19\\x1a\\x3a\\xa7\\xe2\\x44\\x2b\\x81\\xc0\\xe5\\xa8\\x45\\x0d\\x1d\\xf2\\x21\\x64\\x53\\xa9\\xbb\\x86\\x7a\\xd6\\xe4\\x08\\x8d\\xa6\\x59\\x25\\xbb\\xfd\\x11\\x3f\\xc2\\x13\\x5f\\x30\\x59\\x1b\\x27\\x1c\\x95\\x97\\xe5\\x5e\\xdf\\x59\\xdb\\x98\\x30\\x56\\x5e\\xca\\x12\\xee\\x91\\xe5\\xa6\\x07\\x7b\\xc4\\xa4\\x13\\x1f\\xf9\\x9d\\xdb\\x49\\x82\\xd8\\x57\\xa2\\x52\\x8e\\x77\\x17\\x0c\\x7b\\x61\\x7e\\x86\\x11\\x35\\x0f\\xd3\\x2f\\x4d\\xa2\\xdb\\x30\\xb1\\x5f\\x74\\x11\\x17\\x16\\x6d\\xa1\\x7b\\xe3\\x1a\\xf3\\x24\\xda\\x5a\\x50\\x43\\xa5\\x5e\\x36\\x38\\x1c\\x13\\xb6\\xcf\\x04\\x9c\\xb6\\xc0\\xed\\xbf\\xe1\\xc0\\x26\\xd6\\x81\\x4d\\xcc\\xd1\\x44\\xdb\\x2d\\x80\\xae\\x2e\\x89\\x6b\\xb4\\x80\\x3c\\x1c\\xcd\\xea\\xf2\\x28\\xc7\\x92\\x7c\\x16\\x87\\x59\\x27\\x3d\\x8b\\x96\\x5c\\x06\\x45\\xf3\\x41\\x90\\x0b\\x21\\x35\\xc1\\x52\\xdb\\x8f\\xcc\\x99\\xb6\\x48\\xee\\x44\\xe6\\x0c\\xfe\\x58\\xda\\xcb\\x84\\xe2\\x20\\xbb\\x79\\x81\\x99\\x95\\xa4\\x22\\x9e\\x7e\\xf5\\xf5\\x37\\x9f\\xff\\xfc\\xed\\xbb\\xb7\\x34\\x91\\xd5\\xb2\\xea\\xdb\\x82\\x09\\xb6\\x23\\x1c\\xce\\x8f\\x8b\\xb8\\x75\\xd0\\x4d\\x93\\xf0\\x69\\x87\\x35\\xdf\\x81\\x4b\\xa5\\x7c\\x98\\x4e\\xa7\\x9e\\xe8\\xd8\\xec\\x82\\x1a\\x72\\xc7\\x25\\x67\\x02\\x09\\xa9\\xe0\\x63\\x6a\\xe0\\xb0\\xb2\\x59\\xa5\\x43\\x5d\\x2f\\xbd\\x3b\\xb6\\xf3\\x94\\x00\\x3a\\x55\\xcb\\x4e\\x16\\xd1\\x38\\xf4\\xd0\\x8b\\x13\\x6d\\x67\\x40\\x97\\xce\\xeb\\x77\\xe0\\x4a\\xa8\\x56\\x5b\\x17\\x79\\x34\\x59\\xf1\\xb5\\x4f\\x08\\xb5\\xae\\x38\\xc8\\x4d\\xfa\\xf0\\xe8\\xc4\\x71\\x15\\xb5\\x64\\x87\\xab\\x68\\xbd\\xb4\\x57\\x70\\x15\\xad\\x83\\x14\\x13\\xd7\\x5b\\x0b\\x00\\xbb\\xe5\\x37\\x97\\x50\\xa0\\x3f\\x1d\\x34\\x2e\\x26\\x88\\x84\\x62\\x71\\xec\\x40\\xeb\\x1a\\x83\\x80\\x23\\x70\\x5b\\x29\\x7b\\x22\\x7b\\x27\\x68\\xe2\\x9c\\xfe\\x98\\xd8\\x11\\x80\\xad\\xde\\xe6\\x84\\x1c\\x65\\x8e\\xe0\\x19\\x71\\xb7\\x01\\xe1\\xa8\\x15\\x45\\x5f\\x8c\\x31\\x72\\xd7\\x5e\\x63\\x2f\\x79\\x59\\xc8\\x96\\x1e\\x02\\x6c\\xe5\\xad\\x3f\\x41\\xa2\\x54\\x89\\x04\\xed\\xa4\\xa9\\xba\\x0f\\x10\\xe9\\xab\\xdd\\x5b\\xe8\\x00\\xca\\x31\\x0e\\x15\\x03\\x21\\x93\\xa5\\xaf\\x9e\\xa5\\xf1\\x14\\x64\\x32\\x64\\xa8\\x23\\x92\\x5d\\x48\\x3b\\x73\\xcf\\x8d\\xfd\\xe8\\xa9\\x52\\xea\\x7e\\x56\\x2f\\xb6\\xae\\x40\\x02\\x13\\x7e\\xa9\\xf9\\x7d\\x88\\x9a\\xd8\\x18\\x80\\xcc\\xf6\\x61\\xba\\x34\\xc8\\x54\\x75\\xa9\\xc7\\xe8\\x56\\xb4\\xc3\\x17\\x9a\\xcf\\xd3\\xe6\\x17\\xe8\\x73\\xdd\\x13\\xca\\x46\\xa3\\xd8\\xba\\x02\\x21\\x96\\x91\\x27\\x33\\xc4\\x35\\xe6\\x0b\\xb7\\x1a\\x2b\\x33\\x36\\x81\\x90\\x46\\xa2\\xff\\xe1\\xf3\\x1f\\x78\\xc1\\xc0\\x8f\\x52\\x3d\\x07\\xe8\\x18\\xb7\\x7e\\x61\\xfd\\x56\\x98\\x1e\\x9f\\x1c\\x54\\x1f\\x3b\\x6f\\x9e\\xc7\\xf5\\xb2\\xc3\\xe4\\x39\\x64\\x2f\\x3b\\x34\\xd8\\xde\\x81\\xcf\\xbf\\x29\\x00\\x15\\xd4\\x8c\\x6d\\xbf\\xac\\x30\\x76\\xac\\x09\\x40\\x73\\x3b\\x47\\x75\\xee\\x91\\x85\\x94\\xc4\\x27\\xd4\\x24\\xc6\\xb0\\xab\\x67\\x95\\xff\\x09\\x00\\xf2\\xca\\x8e\\xb0\\xbf\\xa6\\x03\\xbb\\xd0\\x84\\xf8\\xfa\\x44\\xdc\\xd6\\x71\\x9b\\x44\\xb0\\xf0\\x19\\x55\\x57\\xc5\\x32\\x31\\xdb\\x0c\\x91\\xb2\\x3c\\x12\\x24\\xf6\\xd9\\x09\\xa4\\xe5\\xb1\\x6c\\xa1\\x1e\\x3d\\x82\\xf6\\xeb\\x36\\xa5\\x24\\xdb\\x13\\x69\\x9f\\x01\\x8f\\x1d\\xcb\\x36\\x88\\x76\\xb7\\xe5\\xef\\x5d\\x4e\\x24\\x0d\\xfb\\x16\\xd2\\x05\\x24\\x1c\\x0f\\x3d\\xff\\x1b\\xfc\\xf0\\xb3\\x9c\\x2c\\x3f\\x3e\\x57\\x8a\\x79\\xb0\\xf8\\xf8\\x6f\\xa1\\xa6\\x7b\\x2e\\xe7\\x98\\x95\\x10\\x28\\xcb\\xc3\\x30\\xa0\\xdd\\x77\\xa0\\xbc\\x54\\x68\\xe7\\xf5\\x4d\\xe8\\xa6\\x1d\\x98\\x38\\x5a\\x46\\x41\\x3a\\x85\\xfc\\x2a\\x8d\\xeb\\x5d\\x7f\\xb0\\xe3\\x82\\x6f\\x86\\x87\\xc4\\x7b\\xde\\x8f\\x48\\xb0\\x59\\xf2\\xd5\\x66\\xed\\x93\\x20\\xd5\\x79\\x3d\\xc4\\xb5\\xbf\\x67\\xb7\\xe0\\xa2\\x1b\\x3f\\xc6\\x3b\\xcc\\x61\\xdb\\xba\\xfa\\xe3\\xfe\\xab\\xff\\xe3\\x2c\\x4f\\xb2\\x98\\xd5\\x45\\x59\\x75\\x62\\x69\\x3d\\xd6\\x89\\xa9\\xe8\\x35\\xc8\\x06\\xc9\\x01\\xc0\\x40\\x12\\xb4\\xea\\x41\\x9b\\xdf\\x5d\\x06\\x77\\x94\\x29\\xd1\\x49\\x4d\\x4c\\xd1\\xc7\\x88\\x54\\xec\\x92\\xac\\xe6\\x37\\x95\\x55\\xa0\\xb2\\xdf\\x5f\\xf3\\xc7\\xa8\\x60\\x65\\x22\\xd3\\x49\\xe9\\x91\\x0a\\x90\\x96\\xf1\\xdb\\xa6\\xce\\xea\\xaa\\xdb\\x1b\\xaa\\xcb\\x1a\\x54\\xb1\\x45\\x10\\x4a\\xcd\\x93\\x18\\x5d\\x7d\\x02\\xe6\\x30\\x1a\\x0d\\x7d\\xaf\\xc8\\xeb\\xe2\\x36\\xde\\x42\\xd6\\x15\\xc8\\x8a\\xd0\\x23\\x8f\\x24\\x5d\\xa3\\x31\\x61\\xd8\\x4e\\x0c\\x08\\xbe\\x25\\x87\\x63\\x5a\\x41\\xb8\\xb6\\x13\\xad\\x60\\x9b\\x65\\xab\\x6e\\x22\\xac\\x8b\\xdb\\xfa\\x6c\\x36\\x73\\xc8\\x33\\xb5\\x11\\xc1\\x1f\\xf8\\x2b\\x0a\\x03\\x09\\xe4\\x82\\xa0\\x5f\\xc8\\x70\\x46\\xd5\\x6a\\x07\\xc3\\x99\\x4b\\x2d\\xc8\\x85\\x0c\\x1b\\xea\\xc0\\xe1\\x39\\x3a\\x1f\\x28\\xaf\\x83\\xf3\\x4c\\x05\\x56\\x47\\x94\\x30\\xad\\x31\\x2c\\x19\\x21\\x4f\\xd5\\x7d\\x06\\xc6\\xbf\\xd3\\xfb\\x6d\\x16\\x6f\\xc9\\x53\\xcc\\x2a\\x3e\\x78\\xf5\\x2f\\x48\\xec\\x08\\xe4\\xe8\\xcb\\x20\\x2e\\x0b\\x7c\\xf3\\xaf\\xf8\\x26\\xe7\\x0f\\xb5\\x7e\\xa3\\xd2\\xcf\\xe0\\x99\\x3f\\xb2\\x16\\x52\\x3d\\xba\\xa3\\x86\\x75\\xeb\\x92\\x57\\x46\\x2a\\x98\\xa9\\x84\\x5f\\x7d\\x79\\x9b\\x43\\xe6\\x66\\xc9\\x71\\x5e\\xba\\x47\\xc1\\x6a\\x33\\xb4\\xfa\\xd4\\x64\\x9b\\x02\\x7f\\x3b\\x65\\x8f\\xb3\\xbb\\x62\\x8a\\x92\\x48\\xeb\\xec\\x97\\x28\\x81\\x8b\\x3d\\xb5\\x0d\\xaf\\xdf\\xd4\\xfc\\x06\\x63\\x4d\\xf6\\x19\\x1d\\xc8\\x53\\xc5\\x8c\\xbb\\x0d\\x18\\xb9\\x94\\x3c\\xf7\\xbd\\xa9\\x78\\xa7\\xe9\\x25\\xa8\\x88\\x5a\\x6f\\x9f\\x1d\\x0e\\xf6\\x29\\x25\\x9d\\x1f\\xfe\\xa6\\x28\\xbf\\xca\\x4a\\x0e\\x9f\\xed\\x72\\xc1\\xc0\\x23\\x66\\x8f\\xd2\\x87\\xb4\\xb0\\x9e\\xd8\\x32\\x0f\\xf2\\x7a\\x41\\x66\\x93\\xc3\\xc1\\xcb\\x91\\x5c\\x16\\x44\\x8e\\xa2\\xb5\\x70\\x38\\x48\\x4f\\x4e\\xe6\\x10\\x6f\\x4a\\xad\\xae\\x5a\\x1d\\x01\\xb2\\x26\\x38\\x28\\xf2\\xa0\\xba\\xf3\\xe5\\x64\\x1e\\xcc\\x69\\x1a\\xfa\\xf1\\x98\\x93\\x7f\\x6e\\xf7\\xb9\\x68\\xaf\\xd2\\x94\\xff\\xe6\\xa7\\x2d\\x1a\\xb9\\x23\\x53\\x1e\\xba\\x39\\x75\\xcc\\xcf\\x41\\x6d\\x9d\\x78\\x55\\x7c\\x48\\xd3\\xaf\\x40\\x34\\x0f\\x7d\\x76\\xd9\\x35\\xe5\\xc3\\x81\\xbd\\x9e\\xb9\\x31\\xd0\\x25\\x66\\x5d\\x36\\x31\\x0f\\xf7\\x3d\\xf1\\xca\\x45\\x1f\\xb6\\x4d\\xae\\xb8\\x4a\\x18\\x39\\x92\\x20\\x56\\xea\\xf9\\xe6\\xfd\\x11\\xe8\\x0f\\x70\\x9f\\x5d\\xc6\\x4b\\xdc\\x92\\x00\\x97\\x93\\x36\\x16\\x89\\x91\\xc6\\x2a\\x41\\x67\\x2f\\x3a\\x65\\xb3\\x26\\xa5\\x29\\xd7\\x05\\x4e\\xc0\\x00\\x4e\\xb3\\x8e\\x59\\x38\\x1a\\xf5\\x48\\x0e\\x1b\\xb4\\xea\\x73\\x42\\x4c\\x6a\\x30\\xa8\\x0f\\xea\\x63\\xf7\\x54\\x3e\\x7b\\xcc\\xdd\\xb9\\x8a\\x91\\x36\\xf2\\x25\\x0f\\xed\\xdd\\x69\\xed\\x18\\xf7\\x71\\x31\\x9b\\x6b\\x56\\xf2\\xbb\\x0f\\xed\\x07\\x97\\xa7\\xc1\\x4c\\x8b\\x57\\x0d\\x8e\\x1f\\xcf\\xc2\\xf3\\x00\\x28\\xd8\\x66\\x79\\xd4\\x3b\\x0e\\x35\\x78\\x7e\\x49\\xbb\\x34\\xbd\\x24\\x74\\x1b\\xaa\\xe3\\x1a\\x2d\\x51\\xad\\x1a\\x78\\x25\\xea\\x30\\x33\\x14\\x4f\\x83\\xb7\\x42\\x07\\x8f\\xd1\\x01\\xca\\xe1\\x70\\xbe\\xc0\\xe8\\x7f\\x29\\xc4\\xf4\\x32\\x72\\x30\\x98\\x96\\x0b\\xd1\\x4f\\x60\\xf4\\xc3\\x93\\x77\\x70\\xb1\\x04\\x57\\x34\\x51\\x23\\x0d\\xb6\\x18\\x89\\xba\\x1b\\x30\\xae\\x09\\x1d\\x5e\\x77\\x0a\\xd1\\xb4\\x61\\x85\\x19\\xcf\\x8c\\x6e\\xe4\\xd5\\x2e\\x4f\\x48\\x8b\\x60\\xd2\\x4c\\x6e\\xeb\\xc5\\x8b\\xd8\\x53\\x98\\xef\\x4e\\x92\\xa4\\x4e\\x73\\x8d\\x99\\xc9\\xaa\\x8d\\x5a\\x52\\xb2\\x26\\x8b\\xdd\\x68\\xb4\\xeb\\x60\\x68\\x81\\xf4\\xbb\\x71\\xd7\\xee\\x83\\x96\\xce\\xe4\\x26\\xea\\x38\\x6e\\x7d\\xbc\\x23\\xec\\x90\\xe0\\xd8\\x53\\x3b\\x0a\\x3e\\x4d\\xc1\\x9f\\xd7\\xf8\\x53\\x52\\x2b\\x48\\xfe\\x96\\xd0\\xd4\\x79\\xe2\\xcf\\xeb\\x30\\x52\\x67\\x19\\x57\\x11\\xdd\\xae\\xa5\\x9f\\xda\\xc0\\x23\\xa4\\x63\\x35\\xa8\\x1b\\xa6\\x7f\\xa5\\x5e\\xb8\\x0d\\x69\\x66\\xc1\\x20\\xed\\x0e\\xe8\\x90\\xb5\\x61\\xe9\\x86\\x1c\\xe9\\x0c\\xbc\\x4c\\xbb\\x84\\xa4\\x9d\\x54\\x18\\x21\\x81\\xcf\\x7b\\x44\\x15\\x69\\xd7\\xf8\\x1b\\x07\\xa4\\xc9\\x9a\\xeb\\x91\\x10\\x0d\\xaa\\x12\\x89\\xab\\x88\\x44\\x16\\x9b\\xae\\x40\\x60\\xe1\\x3c\\x29\\x56\\x5d\\x3d\\x77\\x31\\xeb\\xfa\\xdd\\xf3\\xec\\xba\\xee\\x56\\x32\\xec\\x4d\\x85\\x93\\x31\\x02\\xb4\\x64\\xf3\\xcc\\xef\\x94\\xce\\x83\\x81\\x81\\x2b\\x9b\\x87\\x94\\xc2\\x5d\\x82\\xf9\\xb1\\x16\\xcc\\x37\\x50\\x8e\\x61\\xed\\x94\\x41\\x8a\\xcd\\xdf\\xa5\\x8a\\xa9\\xe3\\xf2\\x07\\xa1\\x5b\\x57\\x55\\x00\\xa0\\x3d\\xa9\\x0b\\x8f\\x2c\\xb6\\xa3\\x91\\xbf\\x31\\x97\\x05\\xca\\xa1\\x40\\x38\\x90\\xd2\\x0d\\xa1\\xdb\\xd1\\x28\\xed\\x62\\x29\\xc5\\x8d\\xbb\\x45\\x49\\x4f\\x93\\x3e\\x5d\\xf4\\x8a\\x33\\xf4\\x92\\x1b\\x0e\\xdc\\x5b\\x99\\x01\\xad\\x3d\\xca\\x3f\\xac\\xc5\\xa4\\x2e\\xa0\\x11\\x65\\xfe\\x3d\\x18\\x59\\x18\\x47\\x0d\\xe7\\x8c\\x31\\x25\\xd8\\x2b\\xc5\\x5d\\x62\\x96\\x6f\\xfd\\x49\\xdb\\x3d\\xdb\\xd1\\x4f\\x29\\x41\\x49\\x4c\\x63\\xb5\\x96\\xbf\\x4f\\x23\\xa6\\x9c\\x76\\xa3\\x1e\\x98\\x88\\xf5\\x1b\\x0d\\x13\\xf1\\x49\\x98\\xd0\\x38\\xcd\\x4f\\xac\\x80\\xae\\xf1\\x3f\\xa0\\x7d\\x8b\\x8b\\xdd\\x8e\\xed\\x2b\\xde\\x92\\x17\\x24\\x46\\x5e\\x10\\x9f\\x96\\x17\\x2c\\x86\\xe0\\x41\\x87\\x42\\x91\\xd1\\xe8\\xbc\\xda\\x16\\xf7\\x87\\x6d\\x96\\x70\\x25\\x05\\x01\\xeb\\x53\\x25\\x98\\x15\\xb0\\xe6\\xaa\\xfa\\xf4\\x10\\x1c\\x6d\\x1f\\x4a\\x10\\x7a\\xf4\\x7d\\x5a\\x34\\x90\\xbc\\x50\\x34\\xd0\\xa5\\x15\\xb0\\x67\\xa8\\x2e\\x44\\x89\\x87\\x42\\xd6\\x14\\x0a\\xeb\\x41\\xae\\x57\\x62\\xaf\\x42\\xef\\xa3\\x4f\\xc6\\xd1\\x34\\x4b\\xc6\\x9f\\x78\\x6b\\xda\\x5b\\xd5\\xda\\x70\\xa7\\xc5\\x27\\xf2\\x7b\\xe6\\x46\\x72\\x65\\x0b\\x86\\x85\\x17\\xfc\\x8d\\x24\\x8d\\xf1\\x41\\x13\\xe8\\xca\\x80\\x51\\x66\\xd1\\x4d\\x92\\xcf\\xcb\\x8c\\x7d\\x9e\\x27\\x5f\\xca\\xcf\\x4b\\x0c\\xec\\xaa\\x1b\\x9c\\x59\\x36\\xf8\\x32\\xb5\\x81\\x38\\x32\\xa9\\x8e\\x79\\xb9\\x12\\xf4\\x15\\x28\\x41\\x0d\\x5b\\x8e\\x3d\\x00\\xc7\\x6d\\x2b\\xab\\x92\\xec\\x06\\x03\\x66\\xb7\\x45\\xf4\\x7d\\x77\\x32\\x9a\\x8f\\x59\\x1e\\xd1\\xb2\\x44\\xdb\\x99\\xb9\\x5f\\x10\\xf0\\xd7\\x49\\x83\\x3a\\xab\\xad\\xf8\\xae\\x8e\\xef\\x65\\xb9\\x42\\xb1\\x11\\x55\\x04\\x27\\x2e\\xbe\\xa2\\x1b\\xf0\\xc9\\xe6\\x3a\\xf7\\x2c\\x07\\x0c\\x69\\x33\\xa2\\x39\\x1d\\x28\\xe0\\x16\\x40\\x2c\\x19\\x23\\xc7\\x6f\\xc3\\x8f\\x42\\xde\\x79\\x18\\x41\\xfd\\xea\\x0c\\x98\\x10\\x6d\\xdc\\xa6\\x49\\xa2\\x6d\\x71\\x3f\\x75\\xda\\xf5\\xd3\\x8b\\x29\\xa1\\xc3\\xb4\\x87\\x5e\\x74\\x87\\x14\\x23\\xf6\\xe3\\x54\\xa5\\x55\\x8e\\x0e\\x87\\xae\\x41\\xa2\\xe5\\x97\\xd2\\x1f\\xc3\\x57\\xf5\\xe6\\xfa\\x64\\xe1\\x0e\\xc3\\xa1\\x14\\xcc\\x78\\x2d\\x4a\\xc1\\x5e\\xa9\\xd5\\x66\\xed\\xcf\\x88\\x2d\\xf5\\x47\\x8f\\x34\\x10\\xfb\\xcf\\x1a\\x87\\xb5\\xbb\\xef\\xc4\\x7b\\xae\\xbd\\x7b\\xf8\\x90\\x64\\xdf\\x3a\\x4e\\xdf\\xcf\\xce\\x00\\x06\\xdb\\x9e\\x03\\x1f\\x08\\x10\\x12\\x93\\xf0\\xbc\\xce\\x8f\\xcd\\x7a\\xc8\\x1f\\xd8\\xd1\\xdc\\xdd\\xd2\\x23\\xc6\\xe2\\xef\\xa0\\x62\\x15\\xef\\xe1\\x24\\xfe\\x86\\x48\\xe5\\xe0\\x8b\\x79\\xc3\\x77\\x10\\x5c\\x4f\\xdb\\x05\\xd2\\x8d\\xa2\\x15\\x27\\x82\\xbc\\xe8\\x60\\xb8\\x5b\\x24\\xab\\x12\\xe8\\x6c\\x95\\x6c\\xef\\x03\\xd4\\xe8\\x62\\xfe\\xce\\x37\\x56\\xb3\\xf5\\x2a\\x5b\\x83\\x33\\xa3\\x73\\x60\\xb7\\x0e\\xaf\\xd7\\x7f\\x60\\x5f\\x70\\x5e\\xcd\\xd9\\xd8\\x2a\\x4e\\xeb\\x05\\x67\\x23\\x22\\x74\\xd8\\x6d\\x90\\xe0\\x48\\x7d\\x7a\\xa1\\x7b\\x15\\x37\\x67\\x1a\\xaf\\x7d\\x42\\x0c\\xcf\\x80\\x76\\xb1\\xbd\\x3a\\x3c\\x07\\x9a\\x3a\\xa1\\x19\\x00\\xaa\\x07\\x9e\\xe7\\xcd\\xf3\\xd0\\x86\\xc7\\xfe\\xc3\\x30\\x3f\\x71\\x18\\x78\\xeb\\x30\\x9c\\x86\\xe2\\x0f\\x39\\x21\\x9e\\xa5\\xd1\\xc1\\x58\\x32\\x4d\\xa8\\x3f\\xc1\\xbe\\x61\\xd2\\xdf\\xd6\\x8a\\xcf\\xfa\\x8c\\xc7\\x14\\x14\\xf3\\xdf\\x01\\xc5\\x01\\xb7\\x4e\\x57\\x13\\x72\\xdb\\xca\\x66\\x51\\x6d\\x75\\x0a\\x50\\x97\\x88\\x55\\x65\\x0a\\x7a\\x41\\xc9\\x38\\x3d\\xea\\x8b\\xbd\\x8b\\x2d\\xf1\\x3b\\x88\\x03\\xe9\\x55\\xd6\\x4f\\xae\\x40\\xb9\\xa4\\x1d\\xbc\\x4f\\xc6\\x1d\\x5d\\x20\\x45\\x22\\x63\\xaf\\x34\\x8d\\x04\\xac\\xf4\\x08\\x82\\xea\\x5c\\x9c\\xa6\\x36\\x22\\x9f\\x13\\xca\\x95\\x72\\x5e\\x85\\x2d\\x72\\x66\\xd8\\xd7\\xb6\\x53\\xda\\xca\\x1a\\xab\\x87\\x31\\x32\\xda\\x70\\x1c\\x0b\\x06\\xc6\\x51\\xcb\\x19\\xd0\\xa7\\xc3\\xb8\\x07\\xfa\\x63\\xd7\\xca\\x47\\x35\\x59\\x38\\x4f\\x9a\\x75\\x94\\xcf\\x5d\\xe6\\x3e\\xfa\\xdd\\x0b\\xd8\\x4a\\xd5\\xed\\xb3\\x46\\x3f\\xba\\xd3\\x1e\\xd5\\xa5\\xbd\\xcb\\x96\\xee\\xd2\\xda\\x2e\\xbc\\x11\\x7a\\x38\\xd2\\xa4\\xc5\\xc5\\x2d\\x90\\xbc\\x80\\x3d\\xdc\\x84\\x69\\x27\\x5d\\xb2\\x0d\\x37\\x4b\\xa5\\x3e\\x0e\\x14\\xab\\xb9\\x88\\x15\\xf3\\xb8\\xfd\\xfd\\x7c\\x52\\x37\\x97\\xb4\\x88\\x3b\\xf8\\x24\\x1a\\x87\\xf1\\x68\\x74\\xfe\\xd1\\xea\\xf3\\xc9\\x7f\\xb2\\xc9\\xdf\\xd7\\xe7\\x26\\x2f\\x76\\x37\\xff\\xe4\\x1a\\xbb\\x25\\xa2\\x35\\xf3\\x63\\x3b\\x45\\x85\\x8a\\x8f\\xb4\\x4c\\x82\\x48\\xab\\x15\\x6c\\x16\\x2b\\x06\\x5f\\xfc\\x57\\x90\\x33\\x13\\x54\\x3d\\x87\\x83\\xcf\\x1c\\xaf\\x5b\\xe6\\xa7\\xdd\\x8c\\xa5\\xad\\xaa\\x8d\\xfc\\x44\\x70\\x5a\\x0d\\xd1\\x15\\x0a\\x18\\xac\\xbc\\x8c\\x5e\\xb1\\xe7\\x39\\x1a\\x6e\\x8c\\x46\\xd2\\x3a\\x51\\x7c\\xb9\\x06\\x77\\xc5\\x1e\\xed\\x54\\xdc\\xd4\\x4e\\x8d\\x46\\xcc\\xb8\\x88\\xf1\\xd5\\x6c\\x4d\\xb5\\xb6\\xff\\x70\\xf0\\xb9\\xc6\\xc0\\x71\\xfb\\xda\\x4c\\xca\\x62\\x9f\\x14\\xf7\\xb9\\x07\\x7c\\x58\\xdc\\x67\\xad\\x97\\x74\\x1f\\x2c\\x2f\\x65\\xbb\\xaa\\x2d\\xb5\\x92\\xb3\\xb2\\x84\\xdb\\xe6\\xab\\xf2\\x06\\x70\\xbe\\x4b\\x04\\xe3\\x6d\\xed\\x42\\xf2\\x61\\x8c\\x6e\\x62\\x33\\xba\\xba\\x63\\xb2\\x48\\x1c\\xf6\\xd3\\x7c\\x31\\x01\\xf6\\x73\\x73\\xca\\xd8\\x34\\x69\\x1b\\x9b\\xf2\\xd0\\xd3\\x7d\\x4c\\x22\\x16\\x5f\\x8b\\x07\\x8f\\xa6\\x61\\xe3\\xb0\\xea\\xef\\xac\\x3f\\x11\\xa7\\xab\\xd7\\x0a\\xd5\\x5d\\x05\\x8b\\x19\\x23\\xc7\\xc5\\xa6\\xc5\\x8b\\x6d\\x4e\\xdc\\x46\\x2d\\x4c\\x20\\x08\\x2b\\x0e\\xe6\\x19\\x3a\\x81\\x1d\\x1d\\x58\\x71\\xa0\\x14\\x83\\xa1\\x31\\x40\\x13\\x1e\\x21\\xfa\\xac\\x4f\\xe8\\x70\\x43\\x9e\\x5e\\xac\\x55\\x1e\\x8d\\x86\\xa9\\x65\\x42\\x91\\xb3\\xbb\\x88\\x95\\x93\\x9c\\x39\\x3a\\x11\\xbf\\xcf\\x50\\x3e\\xc9\\xee\\x5c\\x89\\x68\\x7b\\xad\\x89\\x0c\\x9a\\xf8\\x79\\x0a\\xb9\\xc2\\x7c\\x4b\\x0d\\xad\\xec\\x7a\\x89\\xa4\\xee\\x3b\\xcf\\x1d\\xc8\\xd9\\x14\\x4c\\x26\\x6d\\xf6\\xca\\xec\\xc6\\x96\\xa0\\x7d\\x4b\\x07\\xa1\\x88\\x60\\xb9\\xe0\\x2d\\x43\\x95\\x9e\\x13\\x52\\x97\\xb7\\x28\\x2b\\x75\\x6e\\xad\\xbe\\x03\\xa2\\xf9\\x02\\x67\\x2c\\x47\\x93\\x58\\xd4\\x01\\x84\\x96\\x56\\x1b\\xbd\\xf9\\xcf\\xfd\\x57\\x7f\\x3c\\x7c\\x3a\\x3b\\x5c\\xfc\\xcb\\xe1\\xd5\\x05\\x51\\x48\\x53\\x2a\\xae\\x47\\xa3\\x3e\\xa5\\x77\\x0b\\xad\\x34\\xb0\\x1a\\x00\\x45\\xdb\\x0e\\x28\\x9e\\x56\\x75\\xb1\\xff\\xb1\\x2c\\xf6\\x6c\\xc3\\xf0\\x7c\\xd2\\x61\\xf2\\x2c\\xf4\\x49\\x14\\xb9\\x09\\xdb\\xd8\\x10\\xe0\\x77\\x33\\x1a\\x5d\\xfc\\xcb\\xd0\\x20\\x61\\x78\\xd6\\x48\\x59\\xb1\\x44\\x56\\x91\\xe0\\x6d\\x81\\x44\\x4a\\xdb\\x46\\x44\\x34\\xb1\\x2d\\xb0\\x05\\xa8\\x28\\x40\\xf1\\x06\\xbb\\x2c\\xc8\\x8b\\xda\\xd7\\x63\\x25\\xca\\x28\\x69\\xc0\\x3c\\x9a\\x85\\x5c\\x29\\x46\\x34\\x3c\\x42\\x4a\\xbd\\xf1\\x16\\x86\\x99\\x39\\x46\\x83\\x57\\x61\\x26\\x75\\xd0\\x1a\\xff\\x2e\\x5e\\xfd\\xd1\\x1a\\xe1\\xd5\\xe5\\x6c\\x34\\xba\\x9a\\x4c\\xe8\\xa7\\x33\\xbb\\xf4\\x75\\xa6\\x15\\xa7\\xa3\\xd1\\xd5\\x78\\x4c\\xff\\xdf\\xd5\\xe1\\xe0\\x5f\\x85\\x33\\x42\\xb3\\x29\\xff\\xcd\\xbf\\x6a\\xcf\\x48\\x30\\x57\\x72\\x0a\\x40\\x6e\\xa8\\xd1\\x2d\\x9c\\x27\\x45\\xb7\\xa8\\x67\\x87\\xa6\\xd9\\x34\\xde\\x3d\\x4f\\xd3\\xe8\\x6e\\xb7\\xcf\\xd1\\x34\\xba\\x53\\xcb\\x96\\xf9\\xf9\\x2a\\x66\\x91\\x07\\x69\\x51\\xde\\xb8\\xb1\\x81\\x58\\x1b\\xce\\x8e\\xcf\\x77\\x99\\x76\\x60\\x4e\\xd2\\xb4\\xbe\\x79\\xb6\\x9d\\xac\\xfb\\x92\\x86\\x4d\\x40\\xe9\\xec\\xe7\\x43\\x49\\xa7\\x66\\x2a\\xc2\\xae\\xfb\\xd0\\x75\\x1d\\xd0\\xd7\\xde\\x4d\\x91\\xb0\\x9d\\x27\\x0e\\x5a\\x8f\\x95\\x18\\x7f\\x46\\xea\\x9b\\x3a\\x52\\x21\\xec\\x8e\\xa6\\xb6\\x0d\\xd8\\xa6\\xf3\\x12\\x5d\\xa6\\xab\\x68\\xed\\x27\\x24\\xd8\\x80\\xa4\\x6e\\x34\\x4a\\xe1\\xaf\\x9f\\x9c\\x34\\xf7\\x6a\\xd8\\x67\\x7d\\x1c\\x15\\xc9\\x63\\x68\\xdd\\x1a\\xe2\\xb9\\xa1\\x85\\xb7\\x2d\\xc3\\x92\\x8c\\xed\\x8a\\x4d\\xb7\\xf2\\x18\\x86\\x3e\\xc1\\x1a\\xda\\x70\\x44\\x5d\\x2e\\xb6\\xc1\\x57\\xf5\\x56\\x60\\x61\\x5b\\x4c\\x5b\\x66\\x9b\\x2c\\x67\\xbb\\x2f\\x8a\\xe4\\xf1\\x47\\xe6\\x98\\x8b\\x81\\xc4\\x25\\x62\\x25\\x68\\x0b\\x15\\xa7\\x9c\\x6d\\xf2\\xa2\\xe4\\x5f\\xc8\\xae\\xbf\\x14\\xe0\\xa9\\x55\\x61\\x8a\\x25\\x13\\xf4\\x52\\xcd\\x9b\\xc2\\x0e\\x67\\xa8\\x2a\\xba\\x37\\x81\\xb8\\x2d\\x7e\\x47\\x73\\xda\\x61\\xeb\\xdd\\x23\\x71\\x12\\x5d\\xa0\\xe3\\x89\\x84\\x88\\xe3\\x07\\x1b\\x64\\xbd\\x02\\x83\\xac\\x2f\\x3e\\xff\\xf2\\xff\\x7c\\xf5\\xd3\\x0f\\x3f\\xbe\\xef\\xf3\\x90\\xb1\\x6d\\xb6\\xd4\\xf2\\x36\\x8c\\xb3\\xa8\\x80\\x84\\x96\\x91\\x56\\x93\\xae\\x69\\x58\\x03\\xc9\\x7d\\x41\\x29\\xb9\\xa0\\x5f\\xb5\\xe1\\xc7\\x16\\xe2\\x7d\\x34\\x2c\\x0b\\x1c\\xe9\\x70\\xa4\\xee\\x32\\x00\\x58\\xde\\xbe\\xfb\\x25\\x5c\\x37\\xe8\\x86\\xe8\\xd8\\x14\\x9f\\xa9\\xf5\\xe4\\xc4\\x01\\x16\\x71\\x46\\x7a\\x48\\x67\\x07\\xa6\\x86\\x12\\x42\\xc0\\xbc\\xf6\\xad\\x02\\x1e\\xa5\\xa7\\xaf\\x20\\x3c\\xb8\\x5b\\x06\\x27\\xc0\\x22\\x8b\\x10\\x34\\xf0\\xa2\\x94\\x89\\xbf\\xab\\x98\\xed\\xb5\\xae\\x1f\\x53\\xd2\\xfa\\x4d\\x4b\\x15\\x83\\x27\\xa5\\xaf\\x94\\x35\\xe9\\xa6\\x13\\x15\\x16\\xaf\\x3f\\x71\\x8d\\xf8\\xc4\\x8a\\x2b\\x43\\x44\\xfb\\xb0\\x19\\x33\\x40\\xc4\\x84\\xad\\xee\\x6d\\x3f\\x84\\x86\\x1c\\x52\\x66\\xc4\\x3d\\xd5\\xa8\\x61\\xa2\\x9b\\x55\\xbe\\xe9\\x44\\xf0\\x4d\\x49\\xf7\\x69\\x9b\\x81\\x2a\\x0f\\x07\\xaa\\x80\\xb0\\x03\\x63\\x76\\xda\\x0c\\x24\\x5d\\x32\\x1d\\xf4\\x3c\\x5a\\x58\\xef\\xb4\\x51\\x9a\\x72\\x95\\xb2\\xde\\x61\\x60\\xa0\\x77\\x85\\x18\\x2c\\xa2\\x2c\\xeb\\x25\\xc0\\x2b\\xd1\\x91\\x03\\xf6\\x3e\\x84\\x8f\\x60\\xc9\\xd5\\x6d\\x55\\x7f\\x05\\x6b\\xea\\x43\\xd8\\xa7\\xc4\\x96\\xa8\\x3a\\x56\\x09\\x49\\x97\\x74\\x11\\x5c\\xa8\\x92\\x29\\xcf\\xd3\\xa2\\x8c\\xf9\\x37\\x60\\xa5\\xac\\x78\\xfd\\x36\\x81\\xd9\\x0f\\xf0\\x7c\\x99\\x58\\x7b\\xfb\\x8c\\x81\\x43\\xd2\\x81\\x6a\\x14\\x41\\x6c\\x54\\x12\\x1f\\x66\\x72\\x10\\xbc\\xb4\\xd3\\xc6\\x91\\x77\\xe5\\xcb\\x11\\x86\\x73\\x6c\\x13\\xac\\x1d\\xc2\\x63\\x75\\x49\\xf6\\x8a\\x8d\\xed\\x43\\x3c\\x1a\\xf5\\x08\\x91\\x8d\\xa7\\x8b\\x3c\\xec\\xf3\\x93\\x07\\xd4\\x21\\x9e\\xd2\\x54\\x4e\\x31\\xcb\\xfb\\x07\\xd4\\xf2\\x98\\xc3\\x76\\x3d\\xe7\\x5a\\xbe\\xed\\x3d\\x63\\xcd\\x63\\xac\\x2b\\x77\\x9f\\xe3\\x3e\\xf7\\xbc\\x3e\\x21\\xa8\\x74\\xd5\\xfb\\x10\\xed\\x83\\xc6\\x33\\xdf\\x89\\x2f\\x9e\\x14\\xe2\\xf6\\x40\\x8e\\xdb\\x83\\xdf\\x84\\x10\\xfb\\x6c\\x84\\x8e\\x09\\xc1\\xb3\\x5b\\x61\\x9c\\x10\\xec\\xe2\\xf6\\x05\\xcc\\xc8\\x93\\xea\\x0b\\x43\\x43\\xc2\\xc1\\x52\\x26\\xa9\\xe6\\x3c\\xf7\\xbf\\x14\\x6b\\xa8\\x2d\\x90\\x0d\\x76\\xe9\\xb9\\xd7\\x15\\x3f\\xa0\\x6e\\x73\\x77\\xbe\\x00\\x79\\x2d\\xf1\\xbe\\x06\\x64\\x87\\xa4\\x50\\xf7\\x73\\x6b\\xcb\\x0c\\xc9\\xdb\\xc6\\xd3\\x5d\\xf3\\x17\\x4c\\x19\\x53\\xcc\\x8d\\x75\\x5b\\xab\\x31\\x06\\xee\\xcd\\xd9\\xf8\\x9c\\x58\\xfe\\xde\\xef\\x35\\xe6\\x87\\x67\\xa9\\x6f\\x7e\\x4b\\xd7\\x70\\x04\\x2b\\x77\\x8c\\x1d\\x87\\x08\\x9e\\xd2\\x3f\\xef\\x13\\x56\\xab\\x6b\\x2e\\xb0\\xda\\x8b\\x51\\x35\\x3b\\xe8\\x40\\x3f\\x00\\x76\\xdd\\x1a\\xef\\x06\\x21\\x81\\x4b\\xd2\\x7f\\x41\\x31\\x79\\xf3\\x3b\\x67\\xde\\xb9\\xfc\\x19\\xba\\x06\\x7e\\x0e\\xf7\\xc6\\x0d\\xa6\\x51\\x50\\x85\\x36\\x19\\xc1\\x3a\\xa0\\xc6\\x08\\xe2\\xd4\\x54\\x5a\\x2b\\x2b\\x3e\\xab\\x2e\\xd5\\xb6\\xb6\\x54\\x0d\\x59\\x9d\\x7f\\xf5\\x6c\\xc4\\xa4\\x1d\\xf4\\xb5\\xfb\\x89\\xa8\\xd5\\x79\\x93\\x4a\\x7b\\x06\\xb5\\xe0\\xdf\\xc0\\xf3\\xb4\\xc6\\xaf\\x1b\\xb0\\xd5\\x87\\x8c\\x5e\\xbd\\x0b\\x8f\\x71\\xa3\\x37\\xd4\\x23\\xfb\\x00\\x71\\x15\\x6e\\x8d\\x6a\\x39\\xf0\\xc6\\x9c\\x18\\x2a\\xc0\\x50\\x72\\x1f\\x42\\x97\\x75\\x9d\\x2d\\x87\\x20\\x6e\\x13\\x3e\\xa0\\x31\\xf3\\x4f\\x30\\x21\\x18\\x00\\x46\\xa3\\x17\\x0c\\xe7\\x7b\\x5b\\x0a\\x4a\\x06\\x49\\x80\\xd1\\xc8\\x37\\x91\\x9d\\x3a\\x97\\x71\\xd9\\x44\\x65\\x53\\xf4\\x88\\xb2\\xb0\\x2f\\xc4\\x74\\x56\\xc4\\x62\\xda\\x84\\x91\\x26\\x35\\xd3\\x80\\xa0\\x06\\x45\\x33\\x54\\x71\\x28\\x17\\xe9\\xb2\\x51\\xb3\\xfb\\x36\\x89\\x7a\\xaf\\x8c\\x53\\xac\\x0b\\x09\\x22\\x5f\\xba\\x24\\x6a\\xbd\\xb4\\x0b\\x4e\\x1f\\x1b\\x38\\xea\\x84\\x79\\x5b\\x7d\\x85\\xb6\\x12\\x0e\\x9d\\xe4\\x9e\\x28\\x1f\\x4d\\x3f\\x7c\\x72\\x5c\\xfc\\x03\\xd7\\xea\\x33\\x2b\\xb1\\xf9\\x9d\\x2b\\xb1\\x51\\x2b\\x21\\x87\\xe8\\xa2\\x39\\x0b\\x51\\xb6\\xf0\\x82\\x4b\\xc4\\xba\\x0d\\xed\\x77\\xcf\\x18\\x05\\x41\\xc8\\x18\\x40\\x61\\xa8\\x51\\xbf\\xec\\x93\\x39\\xcb\\xf8\\x73\\x58\\xab\\x81\\x61\\xe3\\xaa\\xd2\\x41\\xa7\\x20\\xb8\\x18\\x6e\\xaa\\x38\\x85\\x6f\\xaa\\x1f\\xee\\x78\\x99\\xee\\x8a\\x7b\\x30\\x38\\x90\\x5e\\x05\\x2e\\x33\\x1f\\x78\\x1e\\x95\\xad\\x7f\\x82\\x68\\x57\\x7d\\xad\\x87\\x7d\\xcd\\xdb\\x38\\xd5\\x45\\xd7\\xfd\\x36\\x28\\xad\\xa1\\x37\\xc7\\xd2\\xee\\xdc\\xe5\\x28\\xdb\\xeb\\x8b\\x37\\xd9\\x14\\x62\\x6f\\xc1\\x00\\xd1\\xdc\\x44\\xd9\\x53\\xf4\\x2e\\x70\\x4f\\x94\\xbd\\x05\\x0b\\xa3\\x29\\x58\\xce\\x4f\\x20\\x58\\x15\\x8b\\x2a\\x1f\\x43\\xd5\\x91\\x63\\xf7\\x42\\x85\\x8e\\x0c\\x47\\x6e\\x1c\\x26\\xad\\x61\\x9d\\xc2\\x14\\x28\\xbb\\xe1\\xac\\xba\\x2d\\xb9\\x75\\x9f\\xb5\\xbd\\xf1\\xfb\\x27\\x0d\\x91\\x2b\\xdf\\xe4\\xb5\\x85\\x80\\x61\\x6d\\x3d\\xb9\\x98\\x13\\xb4\\xfd\\x87\\x38\\x97\\xf3\\x99\\xe4\\xf5\\x9b\\xd2\\x1e\\x77\\xdc\\x32\\x96\\xa7\\xb5\\x19\\x90\\x76\\xae\\x0f\\x38\\x4e\\x7f\\x98\\xb2\\x71\\xc7\\xcc\\xbb\\xc0\\xa6\\x73\\x92\\xcf\\x74\\xde\\x35\\x9b\\x46\\xdf\\xcd\\xe5\\x6d\\x2f\\xe1\\xc9\\x0b\\x70\\xc1\\xa6\\xb1\\x40\\x4b\\xdf\\xb3\\x1b\\x2e\\xe5\\x06\\x13\\x3d\\x97\\x89\\xec\\xdc\\x73\\x04\\x19\\x2a\\x9d\\x93\\x0e\\x19\\x65\\xdd\\x04\\x13\\x66\\x83\\x85\\xeb\\xe4\\x04\\x61\\xce\\x66\\x6b\\x85\\x6b\\x21\\x98\\x3a\\x23\\x34\\x72\\x0c\\xc6\\x61\\x04\\x0b\\xf3\\x53\\x99\\x8a\\xc3\\x43\\x97\\x9d\\x38\\xbe\\x78\\x5e\\xf2\\x8d\\xbd\\x3d\\xeb\\xd2\\x8d\\xdd\\xf5\\xea\\xf1\\xb5\\x60\\xa5\\xcb\\x9f\\xbb\\xd6\\x4e\\xbe\\x8d\\xd0\\x2e\\x4c\\x6b\\x5f\\x1b\\x9a\\x7d\\x30\\xe7\\x3b\\x69\\x5a\\xee\\xaa\\xf7\\x25\\xa9\\x67\\xf4\\xfa\\x46\\x22\\x8c\\xe2\\xc4\\x60\\x78\\xfe\\x91\\x54\\x17\\x71\\x32\\x1a\\x71\\xcb\\xda\\x5c\\xf9\\x12\\x93\\x05\\xaa\\x76\\x98\\x07\\x4a\\xf8\\x16\\x73\\x9d\\x4a\\x8f\\x2e\\x57\\xac\\xe6\\xca\\xf1\\xbb\\x05\\x65\\xb2\\x65\\x93\\x32\\x75\\x85\\x0d\\x90\\xd0\\x46\\x3b\\x8d\\x8f\\x46\\x6d\\x7f\\x73\\x10\\xfb\\x18\\x23\\x77\\x99\\xec\\xec\\x7f\\xce\\x31\\xbb\\x2e\\x8a\\x5d\\x9d\\xed\\x4f\\x84\\x4d\\x19\\xf2\\xd1\\xe8\\x3c\\xe1\\x55\\x5d\\x16\\x8f\\xae\\xfd\\xf4\\xe1\\xe0\\xbb\\x4e\\xd7\\xaa\\xb3\\x0e\\x9f\\xeb\\x5e\\x8b\\xe9\\x0e\\xf1\\x3a\\x18\\xda\\xa0\\x86\\xf9\\x71\\xcf\\xdb\\xf6\\xc7\\x56\\x09\\xcf\\x41\\x09\\x66\\x95\\xc8\\x14\\xa0\\x56\\x09\\x38\\xdd\\x62\\x0c\\x14\\xcb\\x03\\x5a\\x49\\xe3\\x6d\\xcf\\xe9\\x66\\xa5\\x2c\\xcf\\x6a\\xdf\\xd3\\xb3\\x82\\xb8\\xb9\\x2f\\x16\\x3f\\x37\\x65\\xcb\\x18\\x78\\x3a\\x2b\\xf2\\x60\\x38\\xa3\\x70\\x08\\xc4\\xf7\\x03\\x8c\\x99\\x89\\xe9\\xc4\\x8a\\x32\\x18\\xce\\x69\\xcd\\x6f\\xf6\\x82\\x08\\x0a\\x3e\\x79\\x9d\\x64\\x77\\x03\\xc0\\x58\\xa1\\x1e\\xc5\\xa0\\x2c\\xc4\\xd9\\x54\\x8f\\x97\\x1d\\x75\\x26\\xac\\x2c\\x8b\\x7b\\xef\\xf2\\xf5\\x79\\x92\\xdd\\x75\\x56\\xc0\\x90\\x96\\xaa\\x02\\xfc\\xff\\x09\\x95\\xa0\\x29\\xbd\\x94\\x07\\x32\\x80\\x40\\x9d\\xd5\\x3b\\x2e\\x2e\\xf4\\x84\\xef\\xd8\\x63\\x30\\xc3\\xec\\xff\\xc3\\x39\\x95\\x16\\x1c\\x1c\\xc6\\x7c\\x97\\xf1\\x7b\\xc8\\x63\\xff\\xa4\\x67\\x82\\xa9\\xe4\\x14\\x1d\\x10\\xcc\\x1a\\xce\\xc2\\x62\\x6d\\xc3\\x66\\xb8\\x4a\\xc5\\xd2\\xa8\\x6d\\x55\\xf2\\x67\\xcc\\xba\\xdd\\xd2\\xa3\\xc4\\x0d\\x33\\x7a\\x78\\xd8\\x70\\x95\\xde\\xdf\\x57\\xee\\x88\\x1f\\xab\\xe1\\xb9\\x1c\\x82\\x2a\\x1d\\x8d\\x98\\xcf\\xec\\x10\\xd1\\x9d\\xb5\\xc8\\xb2\\xb3\\xd8\\x4a\\xc6\\xe7\\x0c\\x4f\\xb2\\x17\\xad\\xea\\x6a\\x7d\\xa4\\x20\\xa1\\xf5\\x15\\x17\\x16\\x9f\\x00\\x57\\x8b\\x15\\x86\\x4d\\x11\\x3f\\x60\\x5f\\x82\\xe1\\xfc\\x48\\x9b\\x34\\x68\\x96\\x57\\x35\\xcb\\x63\\x08\\x4e\\xa9\\xaf\\x41\\x73\\x89\\x34\\x5d\\x7a\\xd5\\x48\\xda\\xe1\\x0a\\xff\\xaf\\x7a\\xf5\\x7f\\x07\\x58\\x79\\x70\\x73\\x5b\\xd5\\x83\\x88\\x0f\\x20\\x7e\\x5c\\x9a\\xf1\\x64\\x70\\xbf\\xe5\\xf9\\x40\\x6c\\x22\\x24\\x18\\xcb\\xf2\\xcd\\xc0\\x1b\\xeb\\xbd\\x1a\\x7b\\x83\\x22\\x87\\x48\\x8f\\x92\\x8e\\x53\\xe3\\x19\\x20\\x8a\\x19\\xca\\x74\\x43\\x96\\xef\\xa4\\x36\\xf7\\x97\\xd6\\xa2\\x26\\x20\\x23\\x28\\x08\\xa5\\x23\\x71\\x3a\\x99\\x2c\\x94\\x9b\\x11\\x5f\\xa5\\x6b\\x41\\x15\\x6a\\x3b\\xa4\\x0d\\xe9\\x63\\x56\\xad\\xa1\\xd1\\xce\\x35\\x70\\x85\\x2b\\x78\\xe1\\x48\\x86\\x50\\x67\\xd2\\xf3\\x6e\\x58\\x7e\\xcb\\x76\\xde\\x30\\xdc\\xe0\\x10\\xb6\\xa1\\x8e\\x70\\xb0\\x59\\x5a\\x01\\x09\\xbc\\x40\\x49\\xde\\x3c\\x9a\\xb5\\xeb\\x40\\xf8\\x01\\x55\\xa7\\xb8\\xad\\xbd\\x96\\xc9\\xb3\\xbf\\x1d\\x7b\\x1f\\x3a\\x66\\xf8\\xb2\\xab\\xf0\\xb0\\x3a\\xcc\\x3e\\xbc\\x43\\x18\\xa6\\x12\\xd3\\x1d\\x3b\\x1b\\xe0\\x89\\x78\\xdf\\xe5\\xc5\\x62\\xd7\\xa7\\x4f\\x1a\\xb5\\xc8\\x25\\x34\\xf8\\x4e\\x70\\x06\\x78\\x52\\xd2\\xec\\xe1\\x9d\\xc0\\x35\\x4d\\x92\\x79\\xc3\\xd5\\x7d\\x5d\\x75\\x90\\x3b\\x06\\xc3\\xb6\\x5a\\x49\\x2c\\xd0\\xe9\\x2a\\xdd\\x1e\\xab\\xf5\\x99\\x96\\x36\\x4a\\x12\\x15\\x91\\xb8\\xa9\\x01\\x0d\\x8e\\x46\\xed\\x20\\x22\\xea\\x8d\\x2f\\x7f\\x85\\x4f\\xa0\\x35\\x94\\x4f\\x54\\xdc\\x9c\\xea\\x41\\x5c\\xf9\\x1d\\x93\\xc4\\xf8\\x8a\\xad\\x61\\x2b\\x9e\\xe7\\xe9\\x68\\xf9\\xc1\\x9b\\xb1\\x3a\\x74\\xa7\\xda\\x8b\\xd1\\x88\\x21\\x15\\xe0\\x94\\xda\\x91\\x8e\\x13\\xf2\\x14\\xaf\\xd8\\x7a\\x18\\x26\\x62\\xc8\\x2b\\xb6\\x0e\\x13\\xd2\\x1e\\x17\\x40\\x55\\x47\\xe8\\xb0\\x68\\x60\\x21\\x1b\\xf8\\x86\\x85\\x68\\x96\\x51\\xc0\\xfc\\xc8\\x95\\xd3\\x10\\x43\\x25\\x58\\x70\\xa8\\x07\\x8f\\xe6\\x94\\x02\\x05\\x35\\x3b\\x6b\\x76\\x64\\xed\\x96\\xb3\\x5e\\x3e\\x21\\xf4\\x85\\x5f\\xa5\\x31\\x21\\xd4\\x99\\x81\\xd4\\xb0\\x80\\x97\\x89\\x44\\xbd\\x2b\\x7d\\x86\\xc3\\x10\\x03\\xe6\\x2c\\x25\\xcd\\xa6\\xc2\\x78\\xac\\xc1\\xc3\\x3e\\x9e\\xd6\\xd9\\xde\\x27\\x0d\\x83\\xe0\\xc3\\xc1\\x83\\x96\\xb1\\x45\\x7d\\xa0\\xb0\\xcb\\x2e\\x09\\xa1\\x6e\\xe0\\x3b\\x59\\xc2\\x63\\x9d\\xc5\\x9c\\xb6\\xea\\xd2\\x58\\x9f\\x41\\x09\\x6d\\x8d\\x02\\x50\\xd6\\xa9\\x0f\\x29\\x52\\xa8\\xdb\\xe1\\xb6\\x3d\\x40\\xd1\\x1b\\x2a\\xfb\\x8e\\xcd\\x0f\\x41\\x39\\x21\\x81\\xaa\\xd0\\x38\\xa3\\x59\\xf5\\x06\\x57\\xed\\x5d\\x79\\xeb\\x48\\x59\\x9c\\x44\\x80\\xf6\\xcd\\x46\\xb4\\x0c\\x54\\x2e\\x37\\x53\\xa1\\x5b\\x87\\x33\\x13\\xb2\\xd5\\xf9\\x08\\x20\\xa4\\xff\\x4e\\x58\\xc4\\x6c\\xa9\\xff\\x3b\\xe1\\x50\\xdc\\x13\\x27\\x00\\x71\\x4e\\xe8\\x30\\x76\\xb7\\x41\\x1b\\xff\\x0d\\x5e\\x06\\x5e\\xe2\\x0b\\xcf\\xc3\\x97\\x40\\x63\\x2f\\x84\\x2f\\x1c\\x72\\x13\\xc0\\x94\\x6e\\xa5\\xab\\x63\\x00\\x30\\x53\\xa1\\xdf\\x77\\xae\\xe1\\x54\\xa3\\xd8\\xb7\\xe6\\x6e\\x4a\\x4d\\x89\\xca\\xb3\\xe7\\xab\\x40\\x42\\x92\\xbc\\xec\\x33\\x3e\\x89\\x88\\x66\\xd2\\xb5\\x99\\x72\\x4b\\xde\\xe7\\xe4\\xc4\\x68\\x45\\x44\\x6f\\x56\\x97\\x21\\xfb\\xba\\x59\\xc9\\x61\\xa2\\x44\\xc6\\x86\\x1e\\xa2\\xa9\\x4c\\x99\\x2a\\x90\\x8b\\x8a\\x0b\\xb1\\xe1\\xf5\\xcf\\x6f\\xbe\\xf2\\xad\\x49\\xa2\\x38\\x86\\xd7\\x7a\\x86\\x34\\x95\\xcc\\x77\\x06\\x02\\xd5\\xa6\\x6f\\x8f\\xb1\\xf9\\x4c\\x78\\x15\\x97\\x59\\xc4\\x93\\xe8\\xd1\\x54\\x54\\x5b\\xa2\\x79\\x95\\xd1\\xc8\\xf6\\x9a\\x97\\x46\\x05\\x92\\xf6\\x69\\x87\\x44\\x77\\xfa\\xd0\\x2c\\xce\\xb2\\xbb\\xd8\\x22\\x9c\\x21\\x1e\\x45\\x6b\\xc9\\x82\\xee\\x76\\x34\\x0b\\xcf\\x7f\\xad\\x96\\xec\\xb6\\x2e\\x96\\xbf\\x56\\xcb\\xf3\\x8c\\x5e\\x85\\xd2\\x24\\x74\\x4b\\x16\\x57\\xa3\\x91\\xbf\\x0d\\xb7\\x5a\\xce\\x90\\x51\\x0f\\xb0\\x31\\x26\\xa8\\x49\\x4d\\x88\\x5b\\x90\\x59\\xda\\x99\\x3c\\x68\\x92\\x55\\x7b\\xc1\\xe2\\x78\\xd1\\xae\\x88\\xaf\\xbd\\x23\\xb1\\xa3\\x27\\x74\\x1f\\xe0\\xba\\x1d\\x46\\x48\\xb3\\x45\\xcb\\xb4\\xa1\\x50\\x69\\xd5\\xc0\\x30\\x63\\xc6\\x44\\xd8\\xe5\\x1f\\xfa\\x7c\\xf1\\xb0\\x05\\xda\\x46\\x39\\x00\\x2f\\xb6\\xe5\\xda\\xf8\\xe1\\x9a\\xc4\\x39\\xbb\\xb0\\x15\\x27\\xe2\\xc6\\x2e\\x92\\xe2\\xe8\\x2c\\xf5\\xaf\\xf0\\x68\\xe5\\xe1\\x96\\x16\\xed\\x9e\\x5c\\x5e\\x8a\\x2c\\xb6\\xa1\\x17\\x15\\x75\\x5d\\xdc\\x78\\x61\\xb8\\x1d\\x8d\\xae\\xa7\\xf8\\x34\\xbe\\xb9\\x2c\\xe4\\xcf\\x25\\xac\\x3b\\xf2\\xb8\\xb2\\x4e\\x5d\\xec\\x27\\x37\\xaf\\x0b\\xf1\\x77\\xa9\\x9a\\xab\\xa0\\x26\\xb2\\x0a\\x3c\\x8c\\x77\\x97\\xc5\\x14\\x1c\\x6a\\x75\\xe4\\x13\\xf8\\x23\\xeb\\x40\\x7a\\x91\\xdd\\xeb\\x02\\x7e\\x2c\\x65\\xfb\\x60\\x4b\\xdd\\x08\\x16\\xb9\\xb3\\x87\\x20\\x67\\xd8\\xeb\\x79\\x7d\\xc9\\x76\\x31\\x68\\x1b\\x12\\x99\\x1c\\x67\\x4b\\xaf\\xe9\\x8e\\xde\\x28\\x67\\xa2\\xfd\\x7e\\xf7\\xf8\\xa3\\x82\\x3a\\x7f\\x4f\\xb7\\xb8\\xc4\\xbf\\xb5\\x85\\x8e\\xdc\\xc2\\x71\\x0b\\x7e\\xca\\x7f\\xd2\\x1b\\x73\\xdc\\x2d\\xca\\x5b\\x72\\x09\\x89\\x30\\x19\\x7a\\xbd\\xb2\\x3b\\xee\\xf3\\x67\\xd4\\x2d\\x75\\xb6\\x6f\\xab\\x5a\\xd2\\x1e\\xed\\xca\\x6f\\x1f\\x66\\x9a\\xf0\\x5b\\x2b\\xbc\\x97\\xbb\\x20\\x0d\\x6b\\x48\\xa3\\x08\\x95\\x28\\x8b\\x87\\x49\\x13\\xe8\\x52\\xbb\\x48\\xfa\\x1e\\x6e\\x8c\\xd0\\x3b\\x41\\xa9\\x30\\xa6\\xb8\\x98\\xe0\\x81\\x9d\\xcf\\x08\\xdd\\xf6\\x55\\x91\\x39\\xa6\\xe6\\x33\\xb2\\xc8\\xaa\\xef\\xd9\\xf7\\xfe\\x86\\x8c\\x46\\xfe\\x06\\xec\\x90\\xe1\\x79\\x4b\\x00\\x1b\\xcc\\xd0\\x0b\\x6b\\x3f\\x0e\\x37\\x34\\x92\\x79\\x6f\\xb6\\x94\\xb5\\xb3\\x23\\x89\\xe1\\x51\\xc3\\x19\\x40\\xee\\x26\\x27\\x25\\x53\\x62\\xd0\\x06\\xa8\\x11\\xca\\xe2\\x16\\x72\\xb9\\xd6\\xc5\\x5e\\xe6\\xbf\\x71\\x8a\\x51\\xbf\\x20\\xd6\\x31\\x22\\x54\\x5a\\x4d\\x25\\x4d\\xbd\\x5b\\xd6\\x5e\\xa8\\xab\\xf6\\x42\\x2d\\xe4\\x19\\x8a\\x47\\xa3\\xab\\x61\\x98\\x02\\x9b\\xa1\\x73\\x54\\x8d\\xd3\\xc9\\x55\\xf3\\xfc\\xff\\xbb\\x3c\\xa6\\xa8\\xc0\\xe1\\xc9\\x57\\x7c\\x57\\x33\\x3f\\xa6\\x11\\xcd\\xe8\\x15\\x59\\xe0\\x09\\x5a\\xaa\\xe5\\xc0\\xc7\\x40\\x2e\\x13\\x9c\\x52\\x19\\x3b\\xe7\\xbc\\x2e\\xf6\\x07\\x3c\\xa7\\xda\\x9f\\x89\\xde\\x84\\xbb\\xe5\\xc5\\x99\\x3c\\x85\\x7c\\x9c\\x05\\xe2\\x41\\x9c\\xec\\x74\\x7c\\x45\\xf3\\x70\\xb7\\xf4\\xac\\xe9\\x78\\x81\\x67\\xcf\\xc4\\x5b\\x24\\x2a\\x5d\\x51\\xa4\\x6d\\x8c\\x00\\x59\\x7f\\x5e\\x96\\xc5\\xbd\\x7f\\x43\\xc5\\xe4\\x57\\xf9\\x9a\\xee\\x5a\\x9a\\x05\\x53\\xad\\x95\\x16\\x10\\xcf\\x2c\\xf4\\x80\\xc8\\x3d\\xd6\\x78\\x03\\x24\\x6c\\x7f\\x98\\x9d\\xf9\\xf3\\x09\\x3b\\x8f\\xc8\\xd8\\xfb\\x67\\x4f\\x57\\x41\\xfc\\x04\\x15\\xc5\\x4d\\xd1\\xd2\\xd6\\xc8\\x8b\\xb5\\x47\\x01\\x88\\xa0\\x1e\\xe9\\x45\\x97\\x0c\\xec\\x82\\x29\\xcb\\x58\\x57\\xe0\\x26\\x63\\x0d\\xa9\\x8b\\x60\\x5b\\xdf\\xec\\x96\\x18\\x53\\x19\\x73\\xf3\\x7a\\x6b\\xb1\\x24\\xcc\\x55\\xd0\\x8a\\x63\\x0d\\xd4\\x73\\xb1\\x1f\\xe0\\x3e\\x0c\\xc4\\x70\\x07\\x52\\x17\\xf4\\x8c\\x4d\\x99\\xe5\\xa4\\x84\\x24\\xff\\xd0\\xc1\\x56\\x10\\x51\\x45\\x5e\\x89\\xd4\\x60\\x2e\\x81\\x82\\x1a\\x66\\x5c\\x9f\\x77\\x93\\x0e\\x9d\\xfe\\xb2\\x06\\xcb\\x49\\x8d\\xac\\x43\\xd7\\xa8\\x68\\x4c\\x75\\xb6\\x47\\x3b\\xef\\x86\\x75\\x5b\\x27\\x15\\xd7\\xc2\\xa9\\x1b\\x42\\x87\\x9b\\x53\\x3e\\x2f\\x83\\xf4\\xc5\\x21\\xdb\\xd3\\x97\\x63\\xd1\\xe4\\x03\\x4d\\x03\\x95\\x2c\\xa1\\x4b\\x08\\xed\\x6e\\x9d\\x92\\x7f\\x3c\\xa3\\x6b\\x5e\\xf8\\xca\\xd7\\x14\\x24\\xb3\\x40\\xdc\\xb4\\xd2\\x61\\xda\\x0a\\x18\\xa5\\x51\\x9b\\xc8\\xfa\\x44\\xa6\\x70\\xef\\x79\\x4f\\xdb\\xdd\\x6b\\x67\\x21\\x59\\xa3\\x75\\x4e\\x0c\\x89\\xdd\\x97\\x61\\xc7\\x9c\\x8d\\x96\\xdc\\x43\\x91\\x17\\xae\\x29\\x64\\x18\\x35\\x2c\\xad\\x16\\x92\\xd9\\xc3\\x1c\\x6c\\xde\\x17\\x3f\\x7c\\xf5\\x57\\x74\\x3d\\x44\\xef\\x1f\\x08\\x1f\\xd3\\xa7\\xfc\\xc5\\x50\\xe2\\x1c\\xc9\\x09\\xc8\\x35\\x67\\x8b\\x7f\\x38\\x7d\\x82\\x17\\x01\\x97\\x1a\\x62\\xcc\\x1d\\x47\\x31\\x8a\\x47\\xc0\\x25\\x2d\\x33\\x81\\xbc\\x73\\x47\\xa2\\x6c\\x54\\xa5\\x64\\xf3\\xed\\xbf\\xff\\x49\\x3b\\x94\\xc5\\x36\\x2f\\xd7\\x7a\\x4f\\x37\\x61\\xb2\\x74\\x93\\xc7\\x05\\xe9\\x52\\x8c\\x2d\\x88\\x4c\\x9e\\xb7\\x6d\\x28\\x13\\x8c\\x05\\xc9\\xb2\\x57\\xcb\\xad\\x6d\\x71\\x0f\\x87\\x86\\xba\\x57\\xa7\\x20\\x8b\\x2c\\x83\\x5d\\x72\\xa4\\x99\\xf8\\x36\\x4e\\xd3\\x98\\x89\\xc1\\xb3\\xf8\\x26\\xce\\xd4\\xbc\\xc0\\x02\\x9f\\x1c\\x03\\x48\\x28\\xab\\x55\\x8b\\xf6\\xa2\\x6d\\x69\\x06\\x79\\x97\\x1a\\xdb\\xd9\\xa4\\xaa\\x1a\\x88\\xda\\xb8\\x86\\x18\\xda\\x91\\x2d\\x4d\\x8e\\xb9\\x71\\x24\\x3f\\x6e\\xa7\\x93\\x1b\\x47\\x38\\xd4\\xf3\\x8b\\x49\\x7c\\x7e\\x71\\x54\\xf4\\xa4\\xdd\\x6e\\x92\\x9c\\x6c\\x20\\x49\\xc7\\xce\\x2f\\x9d\\x5f\\x4c\\x92\\xf3\\x0b\\x27\\x7d\\x5d\\x7c\\x0c\\x5e\\x54\\x51\\x7d\\xe7\\xd8\\x5a\\x86\\xce\\xeb\\xb7\\x63\\x2d\\x10\\x33\\x36\\x52\\x0a\\x6a\\x8b\\x1e\\x43\\x6c\\xcb\\x2d\\xe0\\x12\\xf8\\x7a\\xf4\\x18\\xdd\\x2a\\x07\\xa9\\x82\\x39\\x1c\\x66\\x16\\x23\\xd9\\x4b\\xd5\\x67\\xa9\\x7f\\x0e\\xe7\\xe0\\x20\\x86\\x23\\xef\\x7c\\x46\\x94\\xc8\\x1b\\x57\\x3b\\x9d\\xa8\\x54\\x72\\x34\\xd3\\x34\\x88\\x2a\\x1a\\x27\\x8b\\xed\\xeb\\x0d\\x50\\xf8\\x70\\x66\\xc2\\x0d\\x26\\xd2\\x0c\\xb2\\xcb\\x0d\\x26\\xd3\\x94\\x0b\\x2a\\x8e\\xa2\\xa9\\xa0\\x8b\\x27\\x19\\xda\\xf3\\x48\\x27\\x35\\xb9\\x27\\x29\\xbd\\x96\\x3f\\xc7\\xe9\\x38\\x5e\\x5c\\xbd\\xde\\x20\\x09\\x83\\xa7\\x35\\xc4\\xa7\\xc9\\x55\\x70\\x7d\\xb9\\xc1\\x73\\x0c\\xbd\\x5b\\xef\\xc6\\x1b\\xdc\\xac\\xc9\\xb5\\xf2\\x50\\x1c\\xf0\\xd6\\xbe\\x75\\xa3\\xe0\\x66\\x8c\\x7e\\x25\\x88\\x95\\x4b\\xad\\x0f\\x88\\xeb\\x2c\\xde\\xc4\\xbc\\x87\\x83\\xdf\\xc1\\x34\\xc7\\x53\\x78\\xbd\\x94\\x7f\\x91\\x2d\\x86\\xbc\\xeb\\x81\\x2c\\x6a\\x1f\\xb2\\x9f\\xdf\\x7c\\x15\\xba\\x26\\xbc\\x03\\x36\\x0e\\xff\\xdf\\xff\\xf3\\xe7\\xfc\\xb3\\x33\\x24\\x41\\x59\\x9e\\x14\\x37\\x3e\\x21\\x32\\x31\\xa2\\x46\\x13\\x1b\\xae\\xb0\\xc8\\x17\\x8f\\x6f\\x12\\xb1\\xb1\\x7a\\xf4\\x0d\\xf7\\x96\\x6c\\xdf\\x19\\xfd\\x44\\xdc\\xdb\\x3a\\x2e\\xa8\\xa8\\xd4\\x88\\xff\\xa0\\xd4\\x97\\x84\\xce\\x87\\xa1\\xe1\\x53\\xa4\\xe3\\x61\\x4b\\xd9\\x64\\xeb\\x8c\\xfe\\xaf\\x6a\\xeb\\xea\\x9d\\xe2\\x22\\xaf\\xb2\\xaa\\x1e\\x14\\xe9\\x80\\x3f\\xb0\\xb8\\xde\\x3d\\x0e\\xe6\\x82\\x1c\\x9a\\xec\\xf8\\x1d\\xdf\\x0d\\xe4\\x9e\\x0c\\x3d\\x57\\x14\\x2e\\xbe\\xda\\x60\\x60\\x5c\\xc2\\xb1\\x11\\xbc\\x17\\xdf\\x5a\\xbf\\xe5\\x05\\x84\\xe2\\xdd\\x06\\x3d\\x87\\x1a\\xd6\\x96\\xb9\\x36\\x8b\\xda\\x61\\x37\\x2c\\x65\\xa6\\x5b\\x5d\\x7a\\x70\\xf6\\xd7\\x9f\\x77\\xf9\\x1b\\x7d\\x2d\\xdf\\xf6\\xb6\\xb2\\x9f\\x4e\\x3b\\x2c\\x39\\xc1\\x83\\x17\\x98\\x23\\xfc\\xa5\\xc2\\x52\\xfa\\x3f\\x2e\\x29\\x25\\x34\\x5a\\x1a\\xb1\\xe8\\x34\\x46\\x0b\\xd1\\x46\\x01\\x6d\\x09\\x41\\x97\\x31\\x2a\\x31\\xfc\\x58\\x9c\\x27\\xe4\\xab\\x63\\x82\\x67\\xab\\x2d\\xb7\\x5f\\x9a\\x2a\\x81\\x69\\xd8\\xd8\\x37\\xb4\\x85\\xe8\\x31\\x9b\\x76\\x84\\xad\\xb5\\x65\\x91\\xa0\\x08\\xc1\\x2c\\xe1\\x0d\\xc3\\x69\\xc7\\x96\\x7c\\xea\\x8d\\x19\\x2e\\xb1\\x24\\x5f\\xbf\\x32\\xeb\\x21\\x5f\\x50\\x26\\x0f\\x21\\xfe\\x35\\x04\\x3c\\x3e\\x23\\x81\\xc9\\x14\\x44\\xab\\x27\\xad\\x03\\x57\\x05\\xb6\\x05\\xc4\\xd1\\x4d\\x38\\x21\\xc1\\x7c\\x61\\x3f\\x28\\xe3\\x24\\xf9\\xd8\\x65\\x9e\\xa4\\x5e\\x3d\\x6f\\xa0\\xa4\\xfa\\x94\\x26\\x4a\\xff\\x63\\xe6\\x2e\\xfb\\x62\\x0f\\x22\\xf3\\xff\\x12\\x73\\x17\\xd5\\xd9\\x7f\\x99\\xb9\\x0b\\xda\\x9b\\xe8\\x6e\\xd1\\xde\\x04\\xc3\\x6c\\x99\\x35\\x6b\\xab\\xeb\\x7f\\xc4\\x06\\x26\\x9d\\xa0\\xda\\x87\\xab\\xca\\x23\\xa7\\x93\\x08\\xd9\\x24\\x5d\\xdf\\xee\\x1a\\xdf\\xdb\\x27\\xcb\\x6c\\x45\\x19\\xed\\x29\\xcd\\xae\\x0a\\x69\\x20\\x73\\xa4\\x7a\\x5e\\x8f\\x1d\\x8b\\x9a\\xdd\\x29\\x3b\\x16\\xd7\\x7e\\x65\\xfb\\xaa\\xd1\\x56\\xde\\xa7\\x97\\xaf\\xcf\\xb7\\xaf\\x2e\\x3b\\xfa\\xd6\\x9e\\xa8\\xae\\x81\\xcb\\x91\\xd8\\xc7\\xf8\\x65\\x53\\xd7\\xd5\\x89\\x6b\\xbd\\xea\\xc0\\xfe\\x3f\\xae\\xad\\xfe\\xbd\\x82\\x06\\x4b\\x21\\xac\\x35\\x00\\x46\\xf8\\xe0\\x2e\\xd7\\x4b\\x85\\x0f\\x8d\\xc6\\xc6\\xab\\xd7\\x84\\x4c\\x36\\x52\\x74\\x08\\xa4\\xd4\\xd5\\x71\\xf3\\x00\\xc4\\xfa\\x5b\\x28\\x14\\x37\\x1f\\x8d\\xbb\\x25\\x1e\\x9d\\xe2\\x8e\\x81\\x64\\xe2\\xbb\\x27\\x08\\x9f\\xf6\\xc9\\xe1\\xd0\\x5f\\xa1\\x43\\xb7\\xf4\\x21\\xcc\\xab\\x89\\xdf\\xad\\x97\\xbb\\xcd\\x00\\x9d\\xdc\\x48\\x4d\\x41\\x46\\xdd\\x14\\xa4\\x4d\\x3f\\xea\\xa5\\xef\\x26\\x1c\\xa3\\xa9\\xac\\xb0\\xd4\\xbf\\x64\\xa2\\x79\\x20\\x1e\\x75\\x61\\xd3\\xae\\xfd\\x1f\\xa7\\x82\\x14\\xf5\\x63\\x5f\\x19\\x72\\xa9\\x17\\xf6\\x83\\xba\\x32\\xe4\\x63\\xd7\\x95\\xa1\\x5e\\x3d\\x7f\\x65\\xa8\\x3e\\x7f\\xdf\\x95\\x11\\x9b\\xe4\\x6c\\xa7\\x7c\\xf4\\x91\\x81\\xf9\\x5a\\x5b\\x98\\x31\\x3f\\x46\\x27\\x5e\\xa7\\xf2\\x12\\xf9\\xe4\\xa0\\x69\\x7f\\x66\\xa3\\x94\\xa8\\x9d\\xdc\\x4d\\x19\\xbd\\x84\\x0d\\x82\\x59\\x7a\\xd5\\x79\\x1e\\x19\\x7b\\x83\\x69\\xce\\xee\\x06\\xbb\\x6c\\x70\\x39\\x60\\xca\\x24\\x1a\\xf8\\xe8\\x2a\\x5c\\x49\\x1d\\x19\\xd6\\x37\\xcf\\x18\\xcb\\x1a\\xc9\\xa7\\x96\\xaf\\x3f\\xca\\x5c\\x75\\x4c\\x3c\\x67\\x7e\\x60\\x20\\x85\\x25\\xd3\\x48\\x35\\xa8\\xf6\\x8f\\xcd\\x24\\x2a\\x65\\x11\\xf3\\xaa\\x72\\x6c\\x8b\\x4a\\x9e\\x96\\xbc\\xda\\x2a\\xe9\\x96\\xac\\xd2\\x0a\\x4d\\xf5\\x3b\\x6f\\x69\\x33\\x92\\xce\\x7b\\x3a\\x1e\\x8d\\xe2\\x46\\xba\\x1f\\x6b\\xec\\x78\\x19\\x47\\x27\\x2e\\xe3\\x58\\x5c\\xc6\\x31\\x46\\xeb\\x8d\\x5a\\xb7\\x63\\x64\\xd9\\x6c\\xe2\\xd2\\x07\\xf3\\x99\\xd8\\x4f\\xe7\\x94\\xbf\\xb5\\x57\\xb7\\xef\\x30\\x39\\xab\\xdd\\x74\\x12\\x39\\x1c\\x74\\xda\\x6c\\x03\\x97\\xcd\\x4a\\xf4\\x19\\x11\\x10\\xd6\\x22\\xee\\xf0\\xe4\\xe6\\xb4\\x15\\xe6\\x35\\xe6\\xd2\\x50\\xf9\\xb6\\x69\\x12\\xce\\x16\\x2f\\x02\\x31\\x07\\x96\\x14\\x0a\\xb4\\x97\\x00\\x88\\x4f\\x9d\\x5d\\xbc\\x7b\\xf6\\x18\\x5a\\xda\\x24\\xdd\\xd7\\x49\\x07\\x5d\\xa0\\xb4\\xc4\\x56\\x4e\\x4c\\x01\\xc0\\x3d\\xce\\x39\\x22\\xd3\\x1b\\xd6\\xf2\\x92\\x8f\\xec\\xa8\\x66\\x12\\x40\\x8c\\x0d\\x7a\\xd4\\xb4\\x56\\x3f\\xff\\xdb\\x47\\x53\\xcb\\x86\\x9c\\xf9\\xc6\\x26\\x09\\x72\\x94\\xaa\\x48\\x50\\x69\\xcb\\x96\\x7b\\xb5\\x4a\\x01\\x88\\x40\\x74\\x91\\x50\\xbe\\x5e\\x1f\\x0e\\x48\\x4a\\x4f\\xab\\xa2\\xb4\\x4c\\x21\\x80\\xbe\\x53\\x98\\x6c\\x35\\x5b\\x4f\\x04\\x73\\x7f\\x6c\\xc7\\x64\\x53\\x42\\xc0\\x6a\\xba\\xbf\\xad\\xd0\\x72\\x4b\\xac\\x1a\\x55\\xd1\\x04\\xec\\xf2\\xf9\\x1a\\x5c\\x20\\x23\\x27\\xc7\\x05\\x9c\\xc1\\x7e\\xd9\\x45\\xef\\x32\\xbb\\xc1\\x17\\x71\\x10\\x16\\x65\\xd1\\xd8\\xe7\\x24\\xec\\xa8\\x3e\\x8e\\x27\\x5d\\x1f\\x51\\x72\\x44\\xe5\\x1c\\x29\\x27\\xa8\\x8d\\x1b\\x70\\x5e\\x4a\\x2a\\x65\\x23\\x32\\x2d\\xf8\\xb7\\x41\\x6f\\x18\\xc6\\x52\\xc6\\x65\\xf0\\x4f\\x74\\x19\\x2a\\xf3\\x89\\xc1\\x66\\x18\\xfa\\x2c\\x4c\\x57\\xa9\\x8e\\x4f\\xb4\\x56\\x26\\x1f\\xd0\\x37\\xab\\xb9\\xcf\\x40\\xc2\\xb5\\x19\\x8d\\xa2\\xd7\\x5c\\x2c\\xaf\\x7d\\x60\\x7b\\x30\\x29\\xb0\\x74\\x3e\\x5a\\xac\\x32\\x63\\x8b\\xca\\x26\\x93\\x05\\xd9\\x0c\\xc3\\x74\\xc5\\xd6\\xa3\\x51\\x74\\x19\\x72\\xf8\\xe1\\xeb\\x94\\xf5\\x7c\\xc5\\xc6\\xf3\\xf5\\xe1\\x20\\xbe\\x24\\x7e\\xb5\\xc6\\x22\\x5a\\x36\\x76\\x51\\xbd\\x73\\xb8\\xf4\\xf6\\xe0\\x22\\x77\\x64\\x56\\x34\\x58\\x75\\x38\\xc6\\x9f\\xb8\\x61\\xbe\\x3f\\x19\\x47\\x10\\x14\\x5c\\x86\\xda\\xb4\\xaa\\x61\\xe0\\x70\\xf9\\xfe\\x13\\x0a\\xc9\\xfa\\x88\\x0c\\x17\\x51\\xf9\\xde\\x2e\\xf3\\xba\\x32\\x3f\\x2c\\x12\\x15\\x51\\xa2\\x19\\x42\\xc8\\x84\\x4f\\xf3\\x93\\x30\\x31\\x21\\xd6\\x76\\x99\\x15\\xed\\xae\\x2b\\x55\\xa4\\x1d\\xf6\\x4a\\xad\\x83\\x7b\\x31\\x35\\x16\\x0b\\xa6\\xef\\x3a\\xc6\\x37\\x10\\x84\\x9c\\xc5\\xcf\\x79\\x9d\\xed\\xba\\x6e\\x5d\\xfa\\x5c\\x06\\x11\\x87\\xc6\\xd1\\x03\\x59\\xb8\\x8f\\x8a\\x98\\xd1\\x05\\x0e\\xa5\\x13\\x35\\x5f\\x3e\\x4f\\xeb\\x98\\x9e\\x8d\\x0f\\x4f\\x33\\xa9\\x80\\xb3\\x32\\x76\\x28\\xa8\\x8e\\x54\\x03\\xa2\\x27\\x15\\x6e\\xb9\\x2f\\xcf\\x80\\x46\\x9c\\x2a\\x6c\\x66\\x44\\xa3\\x7f\\x2c\\xcf\\xc0\\xef\\x75\\x49\\x61\\x11\\xe6\\xdd\\x6e\\x94\\x39\\x6c\\xf6\\x4b\\xa2\\xf0\\xc7\\xed\\x43\\x64\\xc7\\x60\\xfa\\x50\\x57\\x8e\\xe7\\xcc\\xd1\\xec\\x0f\\xd0\\x38\\x8c\\x0c\\xe4\\xdf\\xee\\x64\\xcc\\x36\\xfb\\x9c\\x10\\x8f\\x40\\x0e\\x06\\xf7\\x8a\\x82\\xe4\\x5b\\x90\\x97\\xa3\\x71\\x55\\x25\\x61\\xd2\\x97\\x9a\\x43\\x87\\x11\\xa5\\x43\\x1d\\x24\\x14\\x8f\\x6d\\x47\\x62\\x20\\xa9\\x71\\x88\\xdd\\x04\\x3a\\xc1\\x8e\\x55\\xf5\\x80\\xc9\\x74\\x0b\\x0d\\x85\\x2c\\x2c\\x7e\\x33\\xf2\\x0a\\xdc\\x61\\xb6\\xfa\\x56\\x19\\xe1\\x75\\xd5\\xe6\\x50\\x5b\\xcc\\x8d\\xdb\\x91\\xdf\\xa3\\x17\\x68\\x73\\x21\\x4c\\x63\\x7f\\x0c\\xec\\xad\\x1d\\xfe\\x57\\xe1\\xd5\\xc8\\x46\\x3a\\x1e\\xd1\\x79\\x14\\x74\\x85\\x2d\\xdd\\xea\\x78\\x38\\xf6\\x81\\x31\\xa3\\x7b\\x12\\x1b\\x1d\\x58\\x3a\\x6d\\x98\\x56\\xe7\\x1a\\x44\\xcd\\x46\\xda\\xda\\xa7\\xa3\\x0d\\xae\\xc4\\x11\\x42\\x36\\xc7\\xa7\\xf1\\x3e\\x4d\\x28\\xb7\\x14\\xf8\\x29\\xa4\\x68\\xef\\x44\\x52\\x72\\x2f\\x2f\\x07\\x2e\\x84\\x0d\\x2e\\x07\\xcf\\x60\\x37\\xe4\\xdf\\x3b\\x43\\x35\\x8b\\xb1\\x0b\\x54\\xd1\\x1b\\x9f\\x3b\\xea\\x40\\xe1\\xbf\\xa3\\xa7\\x19\\xa1\\xdb\\x25\\xe8\\x3b\\x1c\\x13\\x98\\xa8\\x61\\x2a\\x23\\xf8\\xd9\\x96\\x90\\xc0\\x13\\xa3\\x78\\xf6\\x16\\x8a\\x5e\\x7e\\x05\\xfd\\xee\\xf5\\x98\\x41\\x04\\x24\\x95\\x16\\x7f\\x13\\x26\\x66\\x4b\\x74\\xaa\\xa1\\x6d\\xc8\\x7b\\xb3\\xac\\x6d\\xf4\\x68\\xdb\\xe9\\xe3\\x0f\\x87\\xe1\\xd0\\xea\\x0f\\x0b\\x95\\x3e\\x65\\x61\\x5a\\x6e\\x7b\\xf3\\xcc\\xa7\\x1f\\x66\\xb4\\x90\\x42\\x46\\xfd\\x96\\xf1\\x84\\x2b\\x21\\x66\\xd1\\x42\\xfd\\xd0\\x92\\x61\\x16\\x75\\x4a\\x85\\x59\\xf4\\x12\\x89\\x30\\x8b\\x4e\\xa4\\x34\\xea\\x70\\xdd\\x94\\x4e\\x93\\xea\\x0a\\xc1\\xc0\\xe5\\xe4\\x44\\xc6\\x1f\\x31\\x8e\\x5e\\x5f\\x57\\xdc\\xde\\x56\\xce\\x9f\\x93\\x6d\\xf6\\x19\\x5c\\xa7\\xf4\\x7f\\x30\\xc9\\x3d\\x4b\\xd3\\xec\\xe1\\xc5\\x39\\xee\\xb1\\xf6\\x87\\x88\\xa7\\x4f\\x65\\xb5\\x7f\\x61\\x0a\\xfb\\x8f\\x25\\xc5\\xd9\\x54\\x0b\\x4a\\xf5\\x8e\\x2b\\x73\\x80\\x11\\x5a\\x2b\\xec\\xe6\\x61\\xdd\\xf2\\xf8\\x5a\\xe9\\xa9\\x55\\x78\\x25\\x67\\x7b\\x5e\\xde\\xfc\\x3f\\xb2\\x7a\\x0b\\x17\\xd5\\xb7\\x45\\xb1\\xef\\x74\\x93\\xb2\\xe2\\x32\\x42\\xb7\\x8e\\x57\\xe9\\x6d\\xbe\\xcf\\xec\\x10\\x8b\\xfb\\x2c\\xcf\\xb5\\x85\\x83\\xc5\\x29\\xd8\\x9f\\xf4\\x7b\\x28\\x8c\\x9f\\xbe\\x7e\\xfb\\xf5\\xbb\\xd0\\x83\\x8f\\x0c\\xe0\\xff\\x49\\x5d\\xec\\xe5\\x2f\\x69\\x14\\xe1\\x78\\x8e\\x4a\\x29\\xc4\\x8c\\xe2\\x1a\\x06\\x48\\x09\\xb6\\x04\\x8f\\x8d\\x34\\xff\\x0d\\x13\\x03\\x7b\\x6f\\x6c\\xe6\\x4f\\xf1\\x62\\xb6\\x16\\x0a\\x2d\\x51\\x36\\x6e\\x1b\\xc5\\xcb\\x89\\x5b\\x5c\\xcc\\x18\\x98\\x31\\x69\\x89\\x61\\xaf\\x9a\\x36\\x55\\x78\\xad\\xde\\x83\\x93\\x9e\\xb6\\xf6\\xe8\\xaa\\x2b\\xfb\\x5b\\x0e\\x7d\\x3e\\x36\\xeb\\xfd\\x3a\\x4c\\xc1\\xb2\\x72\\x34\\xd2\\x86\\xc2\\xa2\\xc2\\xe6\\x75\\xc8\\x26\\x89\\x55\\x2a\\x0d\\xd2\\xd1\\xca\\xc7\\xee\\x9e\\x66\\xe1\\x76\\xc9\\x03\\xe8\\x85\\x5e\\x85\\xdb\\xe5\\x26\\x88\\x16\\xee\\x27\\x47\\x23\\xfe\\x3a\\x54\\x76\\x80\\x58\\x96\\x8c\\x46\\xd9\\xf8\\xea\\x52\\x7c\\xc4\\x7c\\xa3\\x6d\\xb6\\x64\\x43\\x80\\xab\\x27\\x6f\\x41\\x88\\xc3\\x64\\xda\\x2f\\x4e\\x64\\xa3\\x91\\x70\\xe2\\xdc\\x52\\x78\\xf8\\x17\\xb6\\x38\\xb9\\x63\\x43\\xa3\\x9e\\x0d\\x5d\\xf4\\x8d\\x42\\xda\\x74\\xb0\\x8e\\x08\\x1d\\x9d\\xc7\\xc7\\x9e\\xae\\xe5\\xfb\\xf1\\xdc\\xd9\\xa5\\xf3\\xae\\x18\\x20\\x6d\\xf3\\x2f\\xb3\\x86\\x7a\\x0a\\xae\\xec\\xc5\\x21\\xb8\\x4d\\xcc\\x99\\x93\\x02\\x0a\\x40\\xa3\\x02\\x0c\\xd2\\x30\\x91\\x06\\x5d\\x74\\x13\\x6a\\x09\\x9c\\x7d\\x69\\xe8\\x8e\\x9a\\x32\\x62\\xfd\\x86\\x2c\\x14\\xf6\\xd5\\x26\\x77\\xc9\\x68\\xe4\\xa7\\x21\\x0f\\x13\\x42\\x3b\\x44\\xf5\\x1c\\x8c\\xce\\x60\\x00\\x0d\\x2b\\xff\\xce\\xea\\x29\\x74\\xa6\\xc6\\xd9\\x6c\\x21\\xc1\\x5d\\x8b\\x67\\xc4\\xb1\\xf7\\x37\\x34\\xa2\\x9c\\xa6\\xc6\\x60\\x52\\x1e\\x81\\x61\\xb8\\x25\\x4f\\x08\\xd7\\xe6\\x60\\x35\\xc3\\xf5\\x80\\x51\\x35\\x58\\xc9\\x7a\\xda\\x28\\x59\\x42\\xdb\\xd8\\xdf\\x2e\\xbd\\x89\\x37\\xde\\x06\\x9e\\x47\\xe8\\x95\\x26\\xf7\\xb3\\xb1\\x37\\x35\\xf7\\x51\\xbf\\x99\\xe6\\x15\\xa1\\x57\\x27\\x23\\x93\\x3b\\x08\\x77\\x6b\\x63\\x5b\\xcb\\xb9\\x60\\xa9\\x26\\x6b\\x9f\\x3a\\x9f\\x04\\x6d\\x7f\\xfe\\x67\\xce\\x50\\x66\\xec\\x55\\x33\\xcd\\x4b\\xc9\\xa9\\x52\\x4f\\x0e\\xc3\\x23\\xce\\xe4\\x8e\\x8e\\x97\\x43\\xe7\\xd9\\x02\\xfb\\xad\\xcd\\x24\\x9a\\xa4\\x82\\xb2\\xb7\\xe9\\x24\\xe8\\x63\\x61\\x7e\\x2a\\x5a\\x09\\x6f\\xae\\x0e\\x6a\\x09\\x5f\\x3c\\x4f\\x2f\\x61\\x6f\\xfd\\xe2\\x81\\x13\\x82\\x00\\x9c\\xd7\\xb3\\xf9\\x06\\x4d\\xa2\\x02\\xa2\\x4d\\xb6\\x43\\xf5\\xe3\\x70\\x78\\x3a\\x52\\x89\\x2f\\x65\\xd1\\x17\\xb0\\x4a\\x10\\xe3\\x54\\x5a\\xd6\\xe3\\xba\\x35\\x2a\\x90\\x46\\xb3\\x77\\xc5\\xde\\x6e\\x53\\x17\\x7b\\xfb\\x95\\xa6\\xf3\\xc4\\x55\\xe6\\x88\\x21\\x0c\\x41\\xb5\\xe5\\x0f\\xef\\x8a\\x9f\\x36\\x91\\xcf\\x95\\xaa\\xed\\xfc\\x6f\\x1f\\x2d\\xfd\\x15\\x9b\\xa4\\xbf\\x26\\x6b\\xd2\\xfe\\xf1\\xf1\\x79\\xb6\\xe0\\xa1\\x09\\x46\\xc2\\xcc\\x5a\\x71\\xca\\x68\\x4d\\x33\\xb3\\xd6\\x63\\x36\\xae\\xc7\\xf5\\x38\\x1b\\x67\\x47\\x3c\\x1a\\xb5\\xd3\\xfb\\xd3\\xc5\\x91\\xf4\\xfd\\xfe\\xf8\\x3c\\x9b\\xf2\\x07\\x1e\\x5b\\x32\\xe5\\x7a\\xf9\\x54\\x06\\x26\\xcc\\xcf\\x6a\\xbe\\xa6\\xf3\\xcf\\x08\\xdd\\xd8\\x65\\x17\\x58\\x16\\xd9\\x65\\xaf\\xa0\\x0c\\xcd\\x31\\x2d\\x1d\\xcb\\x8e\\xdd\\xec\\x71\\xc8\\x7a\\xc0\\x88\\xd2\\xb2\\xdc\\xd7\\xb8\\x8d\\x53\\x46\\x68\\x6d\\xa9\\x66\\xb2\\xea\\x4d\\xfe\\x79\\x59\\xb2\\x47\\x78\\x65\\xa0\\x0a\\x62\\xc1\\xff\\x90\\xfa\\x9c\\x5c\\x4e\\xe6\\xe8\\x2c\\xf3\\x97\\xb7\\xa1\\xbd\\x34\\xb8\\xbe\\xb5\\x89\\xb2\\xf3\\x9b\\xd8\\x8a\\xb7\\x52\\xdc\\xe6\\x7b\\x1f\\x79\\x63\\x3e\\xf6\\x04\\xdf\\xb9\\x67\\x65\\x9d\\xc5\\x3b\\x5e\\x4d\\xae\\xaa\\x49\\xcc\\xf2\\x3b\\x56\\x4d\\xf8\\xce\\x93\\x9c\\xba\\xe8\\xf7\\x09\\x4b\\x83\\x27\\xbe\\x0b\\x6a\\x7a\\x1f\\xd4\\x0e\\xff\\xb7\\xd5\\xcf\\x28\\xfa\\x3d\\x52\\xdd\\x63\\xf0\\x84\\xbe\\xd7\\xc1\\xd3\\x1d\\xdb\\xdd\\xf2\\xe0\\xd3\\xd9\\x8c\\x26\\x5c\\xb0\\x35\\x8f\\xc1\\x13\\x1a\\x3e\\x05\\xc3\\x19\\x85\\x97\\xef\\x59\\xc9\\x59\\xf0\\xc7\\x19\\x44\\x9f\\x28\\x76\\x85\\x6e\\xe4\\x7d\\x94\\xa6\\xa9\\x77\\xa4\\xd5\\x96\\xed\\x79\\x20\\x19\\xf7\\x38\\x2b\\xe3\\x1d\\xf7\\x68\\x55\\x97\\xc5\\x35\\x0f\\xa4\\xbd\\xec\\x4c\\xb6\\x14\\x4d\\x66\\xb3\\xd9\\xcc\\x3b\\xd2\\x7d\\xb1\\x7b\\xdc\\x14\\x79\\xf0\\x94\\x47\\xef\\xab\\x2c\\xe1\\x55\\xf0\\x87\\x23\\xcd\\x6e\\xd8\\x86\\x07\\x4f\\x55\\x19\\x07\\x9e\\x47\\xb1\\xed\\x7c\\x36\\x53\\xd6\\xb5\\x73\\x18\\x44\\xb1\\x67\\x31\\x0c\\x14\\x87\\x31\\xa7\\x68\\xa8\\x17\\x0c\\xe7\\x94\\xe5\\xd9\\x8d\\x99\\xc0\\x9c\\x56\\x7b\\xce\\x93\\xe0\\x42\\x35\\x79\\x7f\\x93\\xe5\\xc1\\x8c\\x56\\x8f\\x79\\x1c\\x40\\x6a\\x85\\x2a\\xfb\\x3b\\x57\\xfd\\x5c\\xcc\\x9e\\xef\\x68\\x06\\x2d\\x5a\\xdd\\xec\\xb2\\x9c\\xbf\\xdf\\x65\\xf9\\x35\\x4f\\xec\\xe5\\x4b\\x32\\xb4\\x64\\x86\\x29\\x98\\x05\\x48\\x3d\\x3d\\x85\\xb9\\x9a\\xe3\\x91\\x0a\\x94\\x6b\\x37\\x56\\x43\\x37\\x99\\x8f\\xbd\\xbc\\xc8\\xb9\\x67\\x0d\\xb2\\xaa\\x4b\\x06\\xeb\\x32\\x9c\\xd3\\xe2\\xb6\\x7e\\x7f\\x53\\x24\\x3c\\x40\\x27\\xd4\\xa8\\xb8\\x15\\x1f\\x16\\x33\\xa9\\xeb\\x92\\xc5\\xb5\\x3d\\x99\\xb2\\x10\\xf7\\xdd\\x2f\\xc1\\x2b\\xfe\\x4a\\xfe\\xfe\\xab\\xf8\\x7d\\x3c\\x52\\x26\\x40\\x3a\\x58\\xad\\x8f\\x14\\x32\\xc8\\x02\\xdf\\x0d\\x4b\\x9d\\xf0\\x9a\\xc7\\xf5\\x7b\\x31\\x0a\\x84\\x39\\x8f\\xc2\\x35\\x54\\x05\\x4f\\x45\\x8e\\x71\\x35\\xac\\xb1\\xe3\\x40\\x36\\x25\\x8b\\xbc\\x23\\x2d\\x72\\x0c\\xc0\\xd1\\x7a\\xbf\\xbf\\xad\\xb6\\xde\\x91\\x62\\x8c\\x4d\\x08\\x0d\\x2e\\xca\\xab\\xe0\\x49\\x34\\x0c\\x9e\\x9c\\xd5\\x73\\x56\\x58\\xaf\\xde\\xf1\\x48\\xa3\\xdb\\x48\\x74\\x6a\\x6a\\x5f\\xcc\\x70\\x93\\x82\\x3f\\xce\\x68\\x72\\x5b\\x62\\xb8\\x98\\xe9\\xa7\\xe2\\x3b\\xfb\\xdb\\x5d\\xd5\\xac\\xea\\x54\\x11\\x23\\x0a\\x9e\\xf4\\x29\\x79\\x9f\\x47\\x01\\x34\\xc4\\xbd\\x71\\xca\\x2f\\x8e\\x62\\xb8\\xb7\\xa2\\xbf\\xa3\\xa8\\x52\\x67\\x39\\x7b\\x8f\\xab\\x04\\x11\\x46\\xf2\\xe0\\x49\\x2d\\x61\\xf0\\xa4\\x67\\x76\\xa4\\x77\\x3c\\x4f\\x8a\\xb2\\x82\\x56\\xf5\\xcd\\x5e\\xfc\\x95\\xd4\\x82\\x3a\\xd5\\x0b\\x36\\x1a\\xfd\\x00\\xa4\\xd1\\x34\\xe1\\x7c\\xff\\x35\\x32\\x8a\\x99\\xc0\\x40\\xd9\\xb4\\xbe\\xd9\\x4f\\x8b\\xe8\\x2a\\x7c\\x02\\x38\\x44\\xc0\\xcd\\x0c\\xa6\\x98\\x42\\xb8\\x52\\x28\\x46\\x48\\x15\\x70\\xfc\\x1e\\x41\\xa9\\x55\\x4d\\xbc\\x9b\\xc2\\x3b\\x00\\xbe\\x8e\\x6a\\xa2\\x58\\xd6\\xb0\\x36\\xe0\\xbd\\x5e\\x40\\xbb\\xae\\x55\\x61\\xaa\\x2a\\x38\\xad\\x10\\xd2\\xfb\\x9a\\xdc\\xa3\\x4f\\x65\\x91\\xf0\\xf7\\x62\\xfb\\xed\\x6f\\x38\\xa0\\x38\\x85\\x95\\x9c\\x8a\\x3a\\xe6\\x33\\xd0\\x0c\\x21\\xe1\\xb9\\x86\\x58\\xab\\xbb\\x29\\x80\\xcd\\xc9\\x66\\xa2\\x06\\x36\\x91\\xd0\\xf4\\xdc\\xe7\\x64\\x35\\xfd\\xbd\\x23\\xcd\\x04\\xe5\\x81\\xf0\\xf2\\xc6\\x89\\xdf\\x43\\x9e\\xb2\\xa9\\x03\\x47\\xa3\\x91\\x8a\\xfc\\xc2\\xef\\xb2\\x98\\xff\\x98\\x3d\\xf0\\xdd\\x4f\\x02\\x58\\x2f\\xe7\\x4b\\x3f\\x9b\\xe2\\x39\\x9c\\xee\\x1f\\x00\\x80\\xc3\\x9e\\xba\\x12\\x66\\xb0\\xe3\\x70\\x38\\x23\\x41\\xbb\\xe9\\xbc\\x51\\x69\\x2e\\x20\\x4d\\xd6\\xb9\\x0f\\xf5\\x4f\\xbe\\xb3\\xaf\\x97\\xb3\\x66\\x37\\xa6\\xcd\\xb6\\xa3\\x0d\\x5e\\x41\\x5d\\x8d\\xba\\x80\\x37\\xd4\\x90\\x3e\\x35\\x80\\xfe\\x82\\xc6\\x06\\xa4\\x9b\\x3d\\x98\\x83\\x70\\xba\\x1b\\x03\\xf2\\x56\\x0f\\xe6\\x78\\x9c\\x6e\\xdc\\x75\\x06\\xac\\x6e\\xba\\xce\\x50\\x57\\x87\\xcf\\x02\\xbc\\x33\\xb4\\xe6\\x89\\x79\\x69\\x8f\\x8d\\x93\\xd0\\xec\\xb3\\x71\\x9c\\x5e\\x3e\\x71\\x38\\xc9\\x3d\\xb3\\xbe\\xef\\x83\\x9c\\x67\\xce\\x5c\\xcf\\xe0\\xc4\\xab\\x97\\xf6\\xd6\\x3c\\x89\\xcd\\x2e\\x9b\\x07\\xba\\xd5\\xaf\\x3c\\xba\\x58\\xd8\\x3e\\xba\\xb2\\x72\\x5c\\x3f\\x38\\xd0\\xaf\\xac\\xd9\\x1e\\x6a\\xdf\\xbb\\x48\\x3c\\xe2\\xf4\\xf2\\xb6\\x11\\xca\\xda\\x6e\\xa8\\x96\\x51\\x9d\\x43\\x6a\\xbf\\x44\\x7a\\xc8\\xbc\\xdd\\xd2\\x6c\\x34\\x6a\\xce\\x1b\\x2f\\x68\\x19\\x31\\x5b\\x23\\x13\\x96\\x24\\x28\\x85\\xc8\\xaa\\x9a\\xe7\\xbc\\x54\\x41\\xae\\x1d\\x66\\xe7\\xf9\\xe3\\xff\\x92\\xd3\\xee\\xa0\\x95\\xd1\\xc8\\x20\\x9e\\xfb\\xb3\\xf0\\x04\\xf6\\x68\\xbf\\x24\\xf4\\x1f\\x59\\x99\\xe6\\xe9\\x46\\x3a\\xe4\\x70\\xf0\\x61\\x27\\xf4\\xcb\\xaf\\x6f\\xf6\\xf5\\xa3\\x4f\\xa8\\x5b\\xfa\\x25\\xc4\\xc0\\x6c\\x15\\x7f\\x55\\xb2\\x7b\\x55\\x28\\xaf\\xf4\\xa9\\x24\\xa0\\x3f\\xbf\\xad\\x8b\\x1f\\x55\\x3d\\x9f\\xbc\\xa8\\xd2\\xd1\\x85\\x8b\\x1f\\x59\\x96\\xf7\\x82\\xd7\\x34\\xcd\\x76\\x3b\\xf0\\xca\\x9b\\xd1\\x19\\xed\\x5a\\x86\\xad\\xdb\\xdb\\x97\\x4d\\x15\\xbf\\xd3\\x1b\\x18\\x00\\xbc\\xac\\x3b\\x35\\xfb\\xd0\\x65\\xf5\\x8c\\xb0\\xa9\\x64\\x49\\x76\\x5b\\x85\\x7e\\x0b\\x2f\\x23\\xcd\\xba\\x74\\xdc\\x6a\\x82\\x39\\x39\\xeb\\x21\\x5d\\xba\\xf1\\x3a\\xee\\x9b\\xf2\\x9b\\x01\\xac\\x5e\\xd5\\xac\\xbe\\xad\\x74\\xda\\x85\\xbb\\x2a\\x3c\\x71\\x25\\x9c\\x0b\\x42\\xb2\\xe7\\xfd\\x63\\x1e\\xab\\xc4\\x2d\\x77\\x32\\x08\\xde\\x5d\\xd5\\x70\\x03\\x92\\x92\\xed\\x87\\xb0\\x5e\\xd6\\xd3\\x87\\xc0\\x79\\x79\\x66\\x2d\\x1c\\xd4\\x7a\\x84\\x5a\\x8f\\x7d\\xb5\\xa4\\x94\\xe6\\xe1\\xd2\\xb4\\x9b\\x5c\\x9c\\x59\\x8b\\xb8\\x54\\xdf\\x82\\x3f\\x13\\xeb\\x0d\\xc6\\xf4\\x78\\x78\\xed\\x54\\x57\\xab\\xa2\\x1a\\x8c\\xad\\x77\\x72\\xdc\\x8f\\xe6\\x5b\\xdb\\xae\\x6f\\x3d\\x62\\xd3\\xc7\\xf6\\xb7\\x1e\\xbb\\xbf\\xa5\\x1a\\xb8\\xdf\\x6a\\x1d\\x37\\x64\\x45\\x04\\x7a\\xb2\\x8e\\x01\\xc8\\x2d\\x7f\\xb8\\xe3\\xe5\\x8e\\xed\\x65\\xe4\\x3f\\x39\\x4c\\xe0\\x93\\xc2\\xa7\\x63\\x3b\\x39\\x95\\x84\\x0e\\x02\\x2a\\x70\\xf8\\x69\\xfb\\x8a\\x02\\x37\\x8e\\xcc\\x75\\x15\\xca\\xf7\\x2b\\x58\\xfd\\x74\\x57\\x14\\xa5\\xdf\\xdc\\x08\\x33\\x4a\\xf8\\x22\\x36\\x50\\x2a\\xc1\\xf5\\xc2\\x8c\\x65\\x5a\\x6e\\xa2\\x50\\xcb\\x47\\x2a\\x19\\x27\\x1b\\x2d\\x94\\x86\\xea\\x4b\\xd3\\x72\\x34\\x6a\\x16\\x6d\\xda\\x45\\x91\\x5a\\x3b\\xd3\\xf3\\x53\\x19\\xe8\\x3e\\xe8\\x46\\xff\\xde\\xd0\\x48\\xff\\x8e\\x8e\\x84\\x36\\x7b\\xda\\xb6\\x3b\\xaf\\xda\\x45\\x3b\\xf7\\x7b\\xdb\\x6a\\x17\\x3e\\x6d\\x75\\xbf\\x5b\\x5a\\xe9\\xdf\\x15\\xdd\\xe9\\xdf\\xbb\\x23\\x46\\xec\\xf3\\x70\\xb9\\xbc\\x50\\xf5\\xb7\\x6c\\x8f\\xdd\\x5a\\xe1\\x8b\\x3f\\x34\\x1d\\xe7\\xc6\\x33\\xba\\x79\\xb6\\x46\\xf4\\x5c\\x8d\\x63\\xd0\\x52\\xb6\\xc9\\xf1\\x38\\xb3\\x93\\x69\\x77\\xbb\\x36\\xcd\\x2a\\x47\\x10\\x52\\x71\\x9f\\x91\\x91\\x74\\x11\\x96\\x2c\\x7c\\x11\\xce\\x52\\x75\\xdb\\x68\\x4b\\xbd\\xe9\\xc0\\x5c\\x4a\\x18\\xd1\\x44\\x5e\\x45\\xd8\\xdb\\x41\\x37\\xfe\\x72\\xab\\xd8\\x28\\x4c\\x46\\x9e\\xb9\\x2b\\x9a\\x28\\x6c\\x81\\xb1\\x69\\x9e\\x8e\\x8b\\xea\\x3e\\xab\\xe3\\xad\\xdf\\x3a\\xae\\x5a\\xde\\x40\\x9e\\x62\\x56\\x71\\xa9\\xd5\\x09\\x9f\\x1e\\x82\\x19\\x7d\\x0c\\x26\\xf3\\xe3\\x22\\x2a\\x39\\xbb\\x5e\\xa8\\x97\\x32\\xf4\\x34\\x56\\x99\\xfe\\x41\\xd4\\x99\\xfe\\xc1\\xa9\\x64\\x57\\x98\\x8b\\xf7\\x33\\xe7\\xb5\\x74\\x0d\\x6f\\x75\\xd3\\xe8\\x45\\xa9\\xaf\\xf4\\x50\\xe6\\x5d\\xbd\\x60\\xb8\\x0a\\xa8\\x33\\x81\\x5e\\xdc\\x5a\\xf6\\x6b\\x31\\x94\\x59\\x6b\\x36\\xad\\x0e\\xac\\xd9\\x24\\x28\\x81\\x37\\x43\\x98\\x1d\\x8f\\x6d\\xde\\x41\\x0a\\x65\\x96\\x72\\x2b\\x1e\\xc2\\x7c\\xfa\\x20\\x77\\xf8\\x31\\xcc\\xa7\\x8f\\x6d\\x0c\\x89\\xdb\\xa3\\xc0\\xe3\\x4e\\xe2\\xf0\\xbb\\x07\\x77\\xf3\\x74\\x1f\\xf2\\x6f\\x73\\x6b\\x03\\xfb\\x83\\x63\\xe7\\xa5\\x98\\x89\\x35\\x82\\xd6\\x4b\\xd5\\xf7\\xc3\\xfb\\x4c\\x7d\\x5b\\xd5\\xd7\\x25\\x8f\\x00\\x3a\\xa5\\x7b\\xc1\\x6e\\xd9\\x1e\\xc3\\x54\\x80\\x7e\\xb2\\x89\\xb0\\x4b\\xa0\\x0c\\xca\\x1e\\x2c\\x1d\\x87\\x65\\x3f\\x7e\\x2e\\x1b\\x98\\x18\\xbe\\x14\\xc6\\x47\\x44\\xbe\\x56\\x51\\x09\\x5f\\x06\\xb9\\xa1\\x52\\x8c\\xc2\\x0b\\xfc\\x46\\xd1\\x1e\\x2e\\xf6\\x97\\xdd\\x6c\\x42\\x10\\x33\\x16\\x53\\x68\\x3b\\xad\\xca\\x98\\x02\\xad\\xa9\\x4b\\xd0\\xfb\\x5d\\x3d\\x6d\\xa5\\x08\\x55\\xb5\\x9e\\x42\\x65\\x9d\\xec\\x4d\\x15\\x84\\x73\\x42\\xbd\\xea\\x4e\\xa0\\x2a\\x24\\x7e\\xb3\\x9b\\xcd\\x7b\\x4c\\xed\\xac\\x70\\x33\\x96\\x57\\xc5\\x6d\\x19\\xf3\\xf7\\xd5\\xdd\\x06\\x08\\x63\\xfb\\x6a\\x04\\x8a\\xf3\\xed\\xdd\\xe6\\xcd\\x8d\\x4c\\x58\\x2c\\xe9\\xe8\\xfd\\x6d\\xb5\\x85\\x08\\xf3\\xe6\\x9b\\x98\\xe2\\x4f\\x70\\xec\\xe4\\xd8\\x20\\xd2\\x6c\\x6f\\xcb\\x92\\x39\\xb6\\x76\\x5a\\x8a\\xcd\\x9b\\xc4\\xa0\\xa8\\xf9\\x46\\xcc\\xd7\\x2f\\x29\\x13\\x64\\x07\\x65\\x82\\x20\\xa0\\x17\\x67\\xf0\\xef\\x9c\\x99\\x99\\xa2\\x95\\x83\\xf4\\xd8\\xcc\\x52\\x5f\\x4d\\x8f\\x49\\x4a\\x40\\xf2\\x68\\x04\\xa5\\xdd\\x8d\\x52\\x0c\\x08\\xeb\\xbe\\x72\\x3b\\x51\\x48\\xd2\\xea\\xa5\\x6a\\x15\\x9b\\x6e\\xac\\x77\\xa2\\x1f\\x66\\x6e\\x01\\x82\\x18\\xcf\\x2b\\x37\\x11\\xf3\\xbd\\xb1\\xf5\\x66\\x5a\\x8e\\x3d\\xea\\x96\\x6c\\x5a\\x25\\x11\\x94\\x54\\x63\\x8f\\x78\\xe6\\x6b\\x79\\xe8\\x6d\\xab\\x9d\\xdd\\xdd\\xb6\\xda\\x4d\\xb7\\x4e\\x63\\x51\\x52\\x8d\\xbd\\x7f\\x6e\\x14\\xed\\xb0\\x08\\x3b\\xd4\\x38\\xb8\\x41\\xdd\\xbf\\xad\\x1f\\x77\\x3c\\xcc\\xa9\\xf3\\x22\\xe2\\x9b\\x2c\\xff\\x91\\xd5\\xe8\\xa5\\x2a\\x81\\x1c\\xf0\\x96\\x94\\xb9\\x07\\x4e\\x75\\x56\\xc6\\x3e\\x9b\\x3e\\x88\\x0d\\xa4\\x35\\x9d\\xd1\\x0b\\xc4\\x17\\x3f\\xbe\\xa1\\xc3\\x39\\xb1\\xb1\\x1e\\x4f\\x36\\xcd\\xb6\\xe2\\x06\\xf0\\x3b\\xf6\\xdf\\x69\\x57\\x97\\x19\\xcb\\x37\\xf8\\x5d\\x9b\\xc1\\x29\\xd9\\xfd\\x5b\\x31\\x38\\x67\\x5a\\x06\\x9a\\xc6\\xf5\\xf9\\x7c\\xfa\\xd9\\x67\\xd0\\xe5\\x2b\\x7a\\xe1\\x74\\x29\\x75\\x02\\x1f\\xd0\\xe3\\xb9\\xdf\\xc6\\x47\\xb2\\x97\\xa9\\x52\\x2c\\x9c\\xbf\\x12\\x18\\x0e\\x26\\x72\\x3e\\xfd\\x97\\xcf\\xe8\\xc5\\xf4\\xb3\\xcf\\xce\\x5e\\xd8\\xd2\\xa5\\x67\\xbb\\x6b\\x51\\x77\\x3d\\xab\\x9a\\x95\\x2f\\x9f\\xc1\\xc5\\x0b\\x47\\xf2\\xa9\\x9a\\xc1\\x7c\\xfa\\x87\\x0b\\xb1\\x78\\x67\\x62\\x1a\\xff\\x85\\x93\\x70\\x77\\x02\\x11\\x6a\\x20\\x70\\x6b\\x17\\x36\\x23\\x78\\x17\\x20\\x3a\\x28\\xa2\\x2b\\x73\\x34\\x4a\\xab\\xa6\\x78\\x51\\xa2\\x49\\x5f\\x83\\xe5\\x2c\\x2a\\x2e\\x21\\xb9\\x3d\\x32\\xd4\\x1c\\x21\\xfa\\xbd\\x9c\\xd9\\x62\\x03\\xd1\\x16\\xdf\\xe2\\x01\\xe9\\x6d\\x0b\\xc7\\xcd\\x3d\\x3d\\xbb\\x2c\\xe7\\xff\\x21\\x05\\x07\\xa7\\xbe\\x48\\x3b\\xbe\\x86\\x4c\\x7c\\xe3\\x8c\\xfa\\x4d\\xae\\x58\\x8a\\x0a\\xba\\x42\\xb7\\xf2\\x70\\xb6\\xe0\\xaf\\xed\\x0f\\xa3\\xfa\\x0d\\xe9\\xc6\\x05\\x1f\\x8f\\x89\\xfd\\x12\\xb4\\x30\\xe8\\xa9\\x92\\xf3\\xfb\\x81\\xf3\\x15\\xbf\\xc5\\xb9\\x74\\x92\\x84\\x92\\xcc\\x6d\\x0e\\xb1\\x9d\\xc3\\xa7\\x7f\\x88\\x38\\x0a\\xe9\\xa8\\x21\\x86\\x28\\x15\\xc3\\xad\\x3a\\x2b\\xbe\\xc6\\xc4\\xd8\\x9d\\x72\\x16\\xa5\\xef\\xec\\x16\\xb2\\x9e\\x5f\\x2c\\xd8\\xf4\\x61\\x1c\\x32\\x41\\xee\\x20\\x7e\\x10\\xbf\\x1f\\xcf\\xea\\x63\\xa3\\xcb\\x6e\\x82\\x7a\\x1e\\x5a\\x97\\x02\\x12\\xd4\\x4b\\x5f\\x97\\x5c\\x76\\x52\\xd4\\x8a\\x75\\x68\\x36\\x04\\xc1\\xb7\\x2e\\x84\\x71\\x14\\x24\\x30\\xd5\\x5e\\xf7\\xd3\\xe7\\x96\\x7e\\xb1\\xb3\\xe3\\x99\\xd5\\xf1\\x04\\x3b\\x36\\x05\\xaf\\x67\\x76\\x9b\\x70\\x46\\xc8\\x73\\x02\\x10\\x98\\xb5\\x25\\x00\\x11\\x53\\xc6\\x4b\\xf4\\xb2\\x2d\\x00\\x31\\xd3\\x75\\x45\\x26\\xe0\\x33\\x0c\\x8d\\x60\\xaa\\x15\\x4c\\x15\\x0b\\x5e\\xf7\\x89\\x51\\xa4\\xf2\\xb3\\xdd\\xdb\\xcc\\xf4\\x36\\xc1\\xde\\xf4\\xb3\\x9c\\x9e\\x94\\x0d\\x89\\xd9\\x79\\x28\\x12\\x00\\xac\\xd2\\x00\\x0a\\xa5\\xc6\\x94\\x17\\xfe\\xd3\\xc3\\x7b\\x08\\xe8\\xa3\\x9a\\xd3\\x87\\xf7\\xc0\\x27\\x04\\x96\\xb8\\xe5\\xf1\\x7d\\x5d\\xec\\x4d\\x8d\\xc7\\xf7\\xc8\\x0a\\x98\\x2a\\xdb\\xa3\\x4d\\x27\\xa8\\x2e\\x27\\x27\\xfa\\x1c\\x5b\\xbd\\x89\\xce\\x27\\xa7\\x7a\\xd7\\x95\\x35\\x4f\\x25\\xf0\\xba\\xde\\x10\\xd3\\xab\\xd8\\xa5\\x87\\xb0\\x9a\\xe2\\x00\\x04\\xac\\x87\\x7d\\xd2\\x21\\x12\\x88\\x53\\xd1\\x58\\x41\\x6c\\x0b\\x63\\x3d\\xdd\\x18\\x6e\\x8a\\xf6\\x00\\xb6\\x62\\x00\\x8f\\x61\\x35\\x85\\x49\\x89\\xdb\\xa7\\xaf\\x8b\\x7b\\xf1\\xfd\\xc7\\xe6\\xf7\\xb1\\xa9\\x34\\xfc\\x3a\\xd9\\xba\\xcd\\xe2\\xe8\\x7d\\x7d\\x92\\xdc\\x1a\\x00\\x80\\x33\\x4b\\x7b\\xa5\\x04\\x3a\\x08\\x27\\xe2\\xff\\xc0\\x5e\\x4c\\x39\\x10\\xf5\\x0e\\x26\\xda\\xd1\\x7e\\x2b\\xda\\x3f\\x42\\x9d\\xc7\\xc0\\x5e\\x0b\\xd5\\x5e\\xbe\\x23\\x80\\x63\\xb4\\x25\\x07\\x2a\\xac\\x5b\\xea\\x03\\x29\\x46\\x97\\x6a\\x6e\\x50\\x16\\x10\\x29\\xcd\\x32\\xaa\\x19\\x25\\xcb\\xf5\\x19\\xa1\\x76\\x97\\x48\\xa7\\xbe\\xac\\xd3\\xc3\\xe1\\x43\\x1a\\xa2\\x01\\x2f\\x34\\x74\\x87\\x83\\x2d\\xfb\\x06\\x24\\xd5\\x1c\\xbf\\x63\\x44\\xcf\\xb7\\xec\\x1d\\x92\\x6c\\x6a\\x8f\\xa9\\x4f\\x7b\\xa4\\x84\\xf3\\x2d\\x08\\x92\\x76\\x0c\\xea\\x56\\x51\\xf7\\x56\\x1e\\xf2\\xf1\\x7c\\x91\\xf7\\xdf\\x5c\\xb9\\xba\\xb9\\xca\\x8e\\x9b\\x2b\\x5f\\x2f\\x4e\\x0f\\x44\\x4e\\x43\\x4d\\x58\\xd4\\xb8\\x36\\x72\\x7b\\x46\\xcb\\x0e\\x58\\x77\\x47\\xda\\xec\\x41\\xbe\\x7d\\xae\\x13\\x47\\x6a\\xaa\\x1b\\x63\\xa9\\xdb\\xf6\\xd8\\xe4\\xfc\\x40\\x39\\xf1\\x0f\\xc9\\xfb\\x3b\\xa9\\x06\\xdf\\xce\\x37\\xf2\\x0f\\x11\\x0b\\x0c\\x08\\x62\\xbf\\xc5\\xb2\\xa2\\x0a\\xc6\\x1d\\x79\\xa3\\x79\\x08\\xb6\\x29\\x4e\\xa3\\x9f\\xda\\xae\\xda\\x31\\xcb\\x63\\xbe\\xfb\\x89\\xff\\x76\\xcb\\xab\\xfa\\xf3\\x3c\\xbb\\xf9\\xa6\\x64\\x37\\x1c\\xd9\\x6c\\x90\\x3c\\xeb\\x32\\x42\\x4f\\xd5\\x15\\xc3\\xb4\\xaa\\x36\\x39\\xf7\\x10\\xd9\\x55\\xea\\x50\\xbc\\x6e\\x61\\x5c\\xdc\\xe6\\x35\\xd4\\x9d\\x75\\xcd\\x55\\xa9\\x90\\x2c\\x45\\x4d\\x53\\xab\\x24\\xd8\\x89\\x5a\\x13\\x9b\\xdd\\x80\\xd8\\x69\\x60\\xc6\\x01\\x71\\x3e\\xd0\\x2a\\xe4\\x80\\x02\\x1f\\x69\\x8e\\x18\\xbb\\xfa\\xad\\xac\\xfd\\xfa\\xac\\x1e\\x57\\x67\\x15\\x9a\\xa2\\xbb\\xf7\\x7d\\x97\\x16\\xbb\\xeb\\x08\\xd9\\xf5\\x14\\x6d\\x93\\x9f\\xfb\\xf3\\xf3\\x67\\x2a\\x91\\xde\\x0a\\xea\\x6b\\x62\\x50\\xe5\\xe5\\x4c\\xc9\\x89\\xfa\\xaa\\x03\\xf9\\xfb\\xbe\\xdc\\x44\\xa2\\x80\\x2f\\x7a\\xf9\\x04\\xc5\\xfb\\xc7\\x92\\xe3\\x8f\\x25\\x9f\\x1f\\x4b\\xee\\xbe\\x14\\xcc\\xf8\\x4b\\xd8\\x85\\xb6\\xc1\\x4a\\x2f\\x87\\xee\\xbc\\x10\\x27\\xfa\\x5d\\xe1\\xf3\\xe9\\x03\\xe5\\xd3\\x47\\xd2\\xfe\\xd4\\xbb\\x42\\xf1\\xea\\xa4\\x9b\\x01\\xa1\\x7d\\x0c\\x94\\x3e\\xfd\\xbd\\x08\\xe6\\x7f\\x0e\\x38\\xea\\x73\\x7f\\xce\\x5f\\x9d\\xf5\\x22\\x44\\x69\\x77\\x46\\x68\\x1c\\x56\\x2f\\xaa\\xfa\\x57\\xb2\\xe0\\xd3\\xbb\\x87\\x49\\x58\\x52\\x3e\\xbd\\x7b\\x9c\\x80\\x81\\xef\\xdd\\xc3\\x38\\x2c\\xc5\\xdf\\xc7\\x71\\x18\\xb7\\x66\\xdf\\xc0\\x90\\x27\\x27\\x9f\\xe9\\xc9\\x57\\x8d\\xc9\\x67\\x67\\x19\\xa1\\x79\\xc8\\x15\\x81\\xac\\x65\\x54\\xf9\\x65\\x58\\x41\\x50\\x44\\x41\\x83\\x88\\xff\\x61\\x60\\xf0\\xf3\\x91\\x1a\\xca\\x84\\xda\\x44\\x06\\xb5\\x6e\\x42\\xc1\\xd4\\xf5\\x0d\\xce\\x91\\xf2\\x85\\xc3\\x99\\x46\\xb7\\xb5\\x40\\xb7\\x97\\xf5\\xa2\\xfe\\x6f\\xe2\\x13\\xe9\\xd3\\x43\\xc0\\x96\\x6c\\xba\\x2f\\xaa\\xf7\\x27\\xf4\\x9a\\x8f\\xba\\x52\\xbf\\x5a\\xf3\\x48\\x08\\xad\\xc3\\x90\\x4f\\xe6\\xc0\\xb8\\xf7\\x68\\xde\\x7b\\x74\\xe9\\xce\\xf4\\xe7\\xee\\xc2\\xa1\\x11\\x5e\\xd7\\xd2\\x75\\xdc\\x12\\x90\\xf9\\x2a\\xe6\\xfe\\x8c\\xf2\\x8e\\xab\\xf5\\xd4\\x28\\x9c\\x6f\\xba\\x94\\x94\\xf3\\x49\\x2d\\x42\\x65\\xe0\\xf2\\xea\\x8a\\x25\\x43\\x5d\\x40\\xb9\\x2b\\xf7\\xd4\\x10\\x65\\x2c\\x89\\x6b\\x9f\\xd1\\x9a\\x56\\x34\\xa7\\x31\\x88\\xcb\\xd9\\x30\\xac\\x09\\xf0\\xbe\\x62\\x39\\x94\\x15\\x8e\\xb4\\x52\\x7c\\xcf\\x73\\x4c\\xf1\\xa6\\x04\\xa5\\x95\\x92\\x73\\xe7\\x93\\xfd\\x99\\x9f\\x4f\\x98\\x40\\xae\\xa7\\xac\\x7d\\x64\\x47\\x74\\x17\\xb2\\x49\\xb1\\x48\\x42\\x36\\xde\\x51\\x0f\\xec\\x3f\\x20\\x30\\xba\\xdf\\x1c\\x70\\x42\\xa8\\x27\\x27\\xa3\\x6b\\x34\\x66\\x9b\\x90\\xa3\\xce\\xa2\\x5c\\x0a\\x6c\\xf1\\x02\\x6b\\xa3\\xc6\\x24\\xc4\\x1c\\xee\\xc2\\xca\\xf0\\x69\\x77\\x61\\x0e\\xf2\\xe0\\x61\\xc8\\x94\\x33\\xdf\\x07\\xce\\x70\\xf1\\x5f\\x34\\xab\\x53\\xdd\\xe0\\x04\\x9e\\xef\\x4b\\xd6\\x43\\x91\\xc6\\x49\\xb2\\x5b\\xd3\\x8c\\xbf\\x8f\\x85\\x30\\xfa\\xef\\x87\\x49\\x7b\\x95\\x6e\\x2b\\x8e\\x67\\x1c\\x50\\xdb\\xe3\\x89\\x1a\\x8f\\xb4\\xb4\\x30\\x62\\x75\\x56\\x8d\\xf3\\xb3\\x5c\\xe0\\xed\\xf9\\xa4\\x7c\\x66\\xf9\\xed\\x2b\\xfc\\x43\\x80\\x21\\xbe\\x0c\\x67\\xa3\\x11\\xa6\\x77\\x13\\xc7\\x14\\xa4\\x03\\x6e\\x63\\x14\\x36\\x40\\xed\\x67\\x2d\\xc6\\x86\\x3d\\x82\\x10\\xf2\\x92\\xc6\\x97\\x3d\\x6d\\xe5\\x59\\xd3\\xd7\\xc2\\xb3\\x1d\\x9d\\xc5\\x8b\\x02\\xe6\\xd5\\x02\\x9d\\xc2\\x8a\\xcf\\xbb\\xd3\\x3d\\x76\\x6c\\x49\\xd3\\xfa\\xd4\\x7c\\x7e\\xb2\\x83\\xee\\x67\\xcb\\x56\\xdf\\x41\\xb3\\x64\\xd6\\x05\\x7a\\x4e\\xdf\\x12\\x62\\x87\\xfd\\x12\\xb3\\x67\\x57\\x4e\\x09\\xdd\\xfa\\x7b\\x78\\xc2\\xa3\\xfd\\x92\\x5e\\xce\\xe2\\xc5\\xdd\\xa5\\x7e\\x1a\\x8d\\xee\\x9e\\x81\\x25\\x5d\\xb1\\xe3\\xf4\\x59\\x4b\\x7d\\x67\\x70\\xf3\\xa4\\x53\\xbc\\x08\\x03\\x3d\\xbd\\x0d\\x8a\\x8c\\x15\\x43\\x7c\\x6d\\x0f\\xf1\\xf2\\x1f\\x19\\xa2\\xc4\\xa1\\xcc\\x27\\x0b\\x3b\\xc7\\x61\\xdf\\x29\\x18\\x8d\\x98\\x95\\xbc\\xfe\\x19\\x96\\xfc\\xf7\\x60\\x15\\x9b\\x99\\x7f\\x6a\\xde\\x47\\xf0\\x32\\xcb\\x37\\xcf\\xe3\\x1b\\xa8\\xf9\\xfe\\x79\\xac\\x63\\xea\\xf5\\xe0\\x9e\\x7d\\xe8\\x03\\x95\\xf3\\x15\\xab\\x39\\xc1\\x78\\x82\\x37\\xdc\\x27\\x27\\xbb\\xab\\xb3\\x1b\\x4e\\xce\\xe7\\xfc\\xd5\\x62\\x7f\\xf9\\xa2\\x4b\\x03\\x88\\x96\\x9e\\x7b\\x17\\x84\\x9c\\xfb\\xcb\\x8b\\xb3\\xdf\\xd5\\x93\\x5a\\xb1\\x70\\xa8\\xac\\xad\\x3b\\x3f\\x31\\x27\\xc7\\xce\\x66\\xa3\\x91\\x5f\\x3f\\x8f\\xb7\\x7a\\xac\\xa9\\x9b\\x54\\x88\\x7e\\x96\\x37\\x3f\\xa1\\xcf\\xf4\\xad\\xa8\\x99\\x7e\\x0a\\xb2\\x09\\xd1\\xa6\\xc0\\x5c\\x8e\\x46\\x47\\xdd\\x29\\x15\\xea\\xa7\\xaf\\x50\\x94\\x80\\x49\\xe7\\x6b\\x96\\x5f\\xf8\\x09\\xdd\\xcb\\x48\\x28\\x77\\x0f\\xe1\\x2d\\x2a\\x36\\xe3\\xa2\\xf2\\x19\\x41\\x72\\x5c\\x16\\x55\\x59\\x2e\\x8a\\x5e\\x22\\x6e\\x96\\x9c\\xc1\\xd3\\x43\\xc0\\xa7\\x0f\\x63\\x20\\xec\\x1f\\x03\\x3e\\x7d\\x14\\x3f\\x1f\\x8f\\x8b\\x1a\\x0a\\xdb\\x72\\x4a\\xc3\\x07\\x04\\xf5\\xf4\\x61\\xc2\\x6d\\x39\\xa3\\x79\\x47\\x68\\x0d\\x3d\\xb5\\xe5\\x94\\x86\\x79\\x08\\xea\\xe9\\x63\\xab\\xbd\\x7c\\x47\\x8e\\xbf\\x8f\\x72\\xf8\\x20\\x59\\xdf\\x0b\\xef\\x5e\\xc3\\x41\\x9d\\xa2\\x2f\\xaa\\x67\\xe9\\x8b\\x2e\\x76\\x93\\x96\\x62\\x03\\xea\\xf3\\x9c\\x3e\\x06\\xd5\\x79\\x7e\\xa4\\x71\\x0f\\x42\\x6d\\xda\\x72\\xd3\\x22\\x04\\x27\\xa1\\x10\\xbd\\xf9\\xe6\\xe7\\xf1\\x99\\x3f\\x99\\x23\\x10\\xec\\x8b\\x7b\\x3f\\x3f\\x8f\\xe9\\x05\\x19\\xcf\\xc9\\x59\\x7c\\x56\\xd0\\x19\\xfd\\xc3\\x8c\\xd0\\x3b\\xb5\\xd9\\xe5\\xf4\\xe1\\x6c\\x27\\x77\\xbb\\x9c\\x3e\\x9e\\xed\\x8e\\x8b\\x17\\x40\\xcc\\xd2\\xbf\\xb3\\x36\\xfc\\x72\\x36\\x1a\\xdd\\x59\\x30\\xf2\\xda\\xc0\\x08\\xec\\xe4\\x43\\x78\\x37\\x7d\\x20\\xf4\\xce\\xda\\x63\\x6c\\xf2\\xd8\\xd1\\x04\\xd2\\x6b\\x4c\\x1f\\xc3\\xbb\\xe9\\x23\\x21\\x81\\x6a\\x4d\\x55\\xd1\\x3f\\x80\\xf4\\x3f\\x4c\\x84\\xab\\x91\\xbe\\x32\\x8d\\x4f\\xb3\\x3c\\xab\\xb6\\x60\\x38\\x6d\\x17\\x83\\x8c\\x6b\\x3c\\xa6\\x1d\\xa5\\x61\\x5b\\x00\\x68\\x22\\x9b\\x75\\x75\\x2e\\x90\\x2c\\x69\\xf6\\xe4\\x5c\\x36\\x71\\xa8\\xb7\\xf5\\x65\\xc0\\x71\\xfe\\x19\\x7d\\x25\\xae\\x8f\\x67\\xef\\xa7\\x09\\x9f\\x3e\\xd0\\xe4\\xd9\\x7a\\x62\\x0b\\x1f\\xe9\\x4d\\xb8\\x3f\\xdb\\x8f\\x93\\xb3\\x84\\xde\\x86\\x93\\xf8\\xfc\\xe6\\x6c\\xbe\\x88\\x2f\\xc3\\x1b\\xeb\\x5a\\x9e\\x29\\xa5\\x79\\x73\\x1e\\x0a\\x37\\x70\\x30\\xb8\\x42\\x8c\\xc5\\xc1\\xd4\\xca\\x65\\x3f\\x6d\\xbd\\x82\\xcb\\xef\\xbe\\x18\\x19\\xbc\\xf8\\x48\\xb3\\x67\\x8f\\x74\\xfd\\xec\\x91\\xb6\\x85\\x28\\xec\\x8c\\x8d\\xeb\\x33\\x4c\\x85\\x51\\xf5\\x91\\x6e\\x8e\\x4f\\x8b\\x4a\\x9b\\x77\\xa2\\x6a\\x97\\xc0\\xb1\\x42\\x81\\xe3\\x87\\xb4\\xe9\\x63\\x20\\x9d\\xe1\\x80\\xe8\\x4b\\x89\\x20\\xfb\\xe5\\x9e\\x1f\\x2a\\x82\\x2c\\xa5\\x08\\xb2\\x94\\x22\\xc8\\x52\\x8a\\x20\\xf3\\xff\\x0d\\x22\\xc8\\x53\\xdb\\x7f\\x62\\xe3\\x7f\\x87\\xc8\\xf2\\xe8\\xca\\xb8\\x11\\x7a\\x95\\x47\\x8a\\x13\\x7f\\xd3\\x43\\xb7\\x95\\x0e\\xf0\\xd5\\x2e\\xa9\\xcb\\xd6\\x61\\xd8\\x49\\x6f\\xb8\\x96\\x53\\x1e\\xdf\\xd9\\xce\\x2a\\xf4\\x65\\xc7\\xe8\\x70\\x78\\x11\\xa6\\x25\\x80\\xd2\\x9a\\xdf\\xeb\\xf0\\xb7\\x31\\x67\\x92\\x3e\\x77\\xaa\\x77\\xa1\\x9c\\x09\\x51\\x87\\x34\\x86\\xa4\\x4c\\xbf\\xc0\\x71\\xc4\\xdf\\x7f\\x35\\x52\\x13\\x51\\x01\\x1d\\x70\\x7e\\x39\\x1c\\xdc\\xba\\x58\\xfc\\x57\\x53\\xfc\\xd7\\xc5\\x89\\xed\\x0e\\xd9\\xa9\\x0d\\x0f\\x3b\\x3c\\x7b\\x7a\\xbb\\xea\\x74\\xf5\\xe9\\xed\\xba\\xdb\\xf7\\xa7\\x0b\\x6f\\x85\\xd6\\x3a\\x1e\\xdb\\x95\\xfa\\x57\\x1e\\xf9\\x2a\\x77\\xe9\\x4f\\xac\\x04\\xc4\\xc7\\x38\\xb5\\x18\\x9d\\x15\\x9c\\x31\\xe2\\x17\\x8f\\xa4\\x63\\x94\\x3d\\x57\\xf6\\x4b\\x26\\x23\\xb3\\x05\\xb8\\x31\\x5f\\x9e\\xbd\\xe4\\x7a\\xae\\xb7\\x53\\x87\\xdc\\xba\\xfa\\x4e\\xb4\\x7e\\x3c\\xd9\\x5a\\x70\\x62\\x61\\x17\\xff\\xf6\\xb2\\x25\\x21\\xda\\x52\\xf2\\x79\\xba\\x05\\x2d\\x0c\\xc0\\xb9\\xbc\\xed\\xcc\\x8c\\xdd\\x2d\\xfb\\x24\\xf2\\x3d\\x24\\x85\\xa8\\x33\\xb5\\xdd\\xbf\\xbb\\xe7\\x4a\\x82\\x79\\x1b\\x4d\\xf5\\xf4\\xf0\\xdf\\x36\\x84\\x17\\x36\\xbf\\x9c\\x3b\\x1a\\xfa\\xdf\\x35\\x04\\xc7\\x62\\x10\\x05\\xf4\\xd2\\xf0\\xb1\\x53\\x66\\xdf\\x4b\\xaf\\xc1\\xce\\xf4\\x76\\x2c\\x25\\x15\\x41\\x0f\\x3b\\x3d\\x73\\x07\\x81\\x04\\x6e\\xd0\\x4d\\x79\\x85\\xc3\\x59\\x27\\x95\\xda\\x2c\\x55\\xb4\\xe8\\x9c\\x76\\xe7\\xe5\\xee\\xeb\\x7d\\x7e\\xa4\\xa8\\xd5\\x3a\\x49\\x97\\x4a\\x86\\x9f\\x1c\\xb5\\xd7\\xdf\\x29\\xe7\\xc0\\xb0\\x79\\xc0\\x5b\\x46\\x84\\xb2\\x95\\x63\\x6f\\xc7\\xc3\\x96\\xc7\\xe4\\x59\\xdb\\x4d\\x12\\x44\\x23\\x0d\\x54\\xce\\xcf\\xc3\\x8b\\x96\\xef\\xab\\x0a\\x98\\xc5\\xcf\\xfa\\x8c\\x18\\xcf\\x4f\\x0c\\xcc\\x84\\x11\\xa1\\x75\\x2f\\x43\\x30\\x61\\x8b\\xd9\\x65\\xdd\\x7f\\x2c\\x90\\xfd\\x8f\\x2a\\xbf\\x26\\xe4\\x14\\x90\\xd5\\xa4\\x49\\x5d\\xd8\\xbe\\x66\\x0d\\x95\\x9b\\xad\\x61\\xab\\xfb\\x0d\\x1a\\x6a\\x65\\xd0\\x50\\x75\\x18\\x34\\xd4\\x6b\\x10\\x6c\\x3d\\x4c\\xaa\\xe9\\x03\\x2d\\x81\\x4a\\xae\\xa6\\x8f\\x34\\xb6\\xa8\\xe1\\xfc\\x2c\\x1f\\x97\\x67\\x25\\x59\\xc4\\xaf\\x8d\\xf0\\xd8\\x72\\xa7\\x13\\x2c\\x1e\\x5b\\xb2\\x53\\x4e\\x85\\x82\\xfb\\x13\\x55\\x4e\\x78\\x14\\xf6\\x3b\\xd8\\x71\\xd2\\x5e\\x14\\xcb\\xcb\\xc0\\x61\\x2e\\x94\\xdd\\x86\\x6b\\xea\\x40\\xeb\\xf0\\xfc\\x23\\x7f\\x35\\x9b\\xfc\\xeb\\xe7\\x93\\x6f\\xd6\\x4f\\xaf\\xe8\\x67\\x47\\x72\\xbe\\xc9\\x68\\x15\\x32\\x1d\\x02\\xa8\\xa6\\x56\\xe0\\xbc\\x9a\\x66\\x14\\x45\\xf5\\xbc\\xd7\\x16\\x9f\\xb7\\x6c\\xf1\\x79\\xcb\\x16\\x9f\\xb7\\x6c\\xf1\\xb5\\x64\\xa9\\xcf\\x26\\x9f\\xb7\\x6c\\xf2\\x79\\xdb\\x26\\x9f\\xb7\\x6d\\xf2\\xdd\\x8e\\x55\\x8c\\xbb\\x23\\xa1\\x39\\x04\\x7f\\xfc\\x62\\x57\\x44\\xfe\\xaa\\x5a\\x53\\x19\\xe9\\x06\\x4c\\xa4\\xcf\\xab\\xbb\\xcd\\xf8\\xe1\\x66\\xb7\\x88\\xb7\\xac\\xac\\x78\\x1d\\xde\\xd6\\xe9\\xe4\\x8f\\x82\\x20\\x29\\x55\\x44\\x86\\x9f\\x7f\\xfa\\xf6\\x70\\x90\\xbf\\xef\\x79\\x74\\x9d\\xd5\\x56\\x09\\x8d\\xc3\\x52\\xee\\x05\\xc6\\xfc\\xf8\\xf9\\xa7\\x6f\\xfd\\x9c\\xd0\\x02\\x3e\\x09\\xae\\x18\\x8b\\xa2\\xe3\\xf2\\x6f\\x85\\xa7\\xe2\\xca\\x14\\x3b\\x2c\\x28\\x77\\x7c\\x43\\x66\\xb4\\x9c\\x96\\xfc\\xae\\xb8\\xb6\\xbe\\x10\\x93\\xa6\\x7d\\xca\\x78\\x7c\\x24\\xb4\\x98\\x56\\x65\\x1c\\xc6\\x2d\\xac\\x04\\x99\\x9c\\x9c\\x40\\x46\\xca\\xc6\\xe6\\x73\\x95\\xe5\\xbe\\xdf\\x6a\\x46\\xc5\\x13\\xf3\\x09\\xdd\\xff\\xe5\\xed\\x57\\xc5\\x0d\\x66\\xcb\\xa2\\xdd\\x16\\xf2\\x61\\x33\\x8c\\x14\\xad\\x68\\xae\\xb8\\xb0\\xea\\x2c\\x07\\xdb\\x81\\x9c\\x16\\xe1\\xfc\\x8f\\xb3\\x33\\x3f\\x9e\\x5c\\x90\\xf3\\x98\\xee\\x42\\xe9\\xdb\\x30\\x91\\x7f\\xcf\\x8a\\xf3\\xf9\\x1f\\x67\\x0b\\x3e\\xad\\x18\\x7c\\x98\\x3b\\x8c\\x11\\xc7\\xc0\\xb1\\x3b\\x88\\x65\\x4f\\x6b\\x51\\x20\\xd9\\xa3\\x19\\x9d\\x19\\x2b\\xa7\\xbb\\x70\\xb6\\x28\\x2f\\xef\\x16\\x77\\xe3\\x31\\xe1\\x9a\\x47\\xa2\\x33\\xb7\\x03\\x59\\x80\\x06\\x0b\\xfe\\x8e\\x2c\\xb8\\x34\\x0f\\x17\\x85\\xbc\\xaa\\x8b\\x92\\xfb\\x4d\\x3c\\xcf\\x1f\\xf6\\x45\\x59\\x3b\\x27\\x8f\\x3c\\x49\\x10\\x29\\xf6\\x3c\\xf7\\x6d\\x54\\x5d\\x17\\x5f\\xb1\\x9a\\x89\\x5d\\x93\\x20\\xb7\\xcf\\x37\\x1e\\xa1\\xde\\xfb\\x68\\xc7\\xf2\\x6b\\xaf\\xd9\\xb7\\xd8\\xf6\\xe6\\x99\\xd6\\x92\\x9c\\xec\\x66\\xf3\\x9e\\x97\\x65\\x51\\x2a\\x2b\\x25\\xcf\\x1b\\x76\\x18\\xc4\\x6b\\x97\\x28\\x62\\x1c\\x00\\x34\\x6a\\x10\\x80\\xf9\\xcb\\x77\\xdf\\xfe\\xb9\\xae\\xf7\\xd2\\x6a\\x6a\\xc1\\x70\\xd4\\xde\\x9f\\xbe\\x7e\\xe7\\x75\\x58\\xf4\\x9b\\xee\\x28\\x9b\\x16\\x79\\xc9\\x59\\xf2\\x28\\x08\\x64\\x1e\\x6f\\x59\\xbe\\x71\\x65\\x1b\\x9f\\x86\\x80\\x51\\x58\\xf2\\x28\\x93\\x2b\\xfb\\x17\\xb3\\x19\\x98\\x3b\\x4b\\x4b\\xe7\\x96\\x11\\x16\\x77\\xb3\\xdf\\x89\\x45\\xdf\\x17\\x79\\xc5\\x3b\\xf0\\xe1\\x17\\x3c\\x2d\\x4a\\x8e\\x9a\\x7e\\x12\\xf8\\x71\\x91\\x57\\xc5\\x8e\\x4f\\x77\\xc5\\xc6\\xf7\\x20\\x11\\xd8\\x60\\xff\\x97\\xb7\\x83\\x09\\x9e\\xbb\\x41\\x5e\\xd4\\x83\\xb4\\xb8\\xcd\\x13\\x8f\\xd0\\xe6\\xf2\\x0d\\x67\\x84\\x1c\\x29\\x9b\\x56\\x10\\xed\\xd8\\xe8\\x97\\x6a\\xeb\\xdc\\xd6\\x2f\\x39\\xb7\\xae\\xed\\x58\\xfd\\xcc\\xa0\\x8f\\xe2\\x38\\x89\\x33\\x7a\\x62\\x91\\x51\\xfa\\xd4\\x3b\\xb7\\xef\\x8b\\x81\\xae\\xda\\x39\\xb1\\x8e\\x93\\xe9\\x30\\xe4\\xca\\xd7\\xae\\xdb\\x11\\x70\\xd9\\xe9\\x2f\\xb2\\x6c\\x60\\x1b\\xd7\\x4c\\xdd\\xa6\\x23\\x96\\x7e\\x8f\\x71\\xc8\\x09\\x42\\xde\\x41\\x38\\x61\\xd9\\x69\\xca\\x67\\x4f\\x87\\x04\\x2f\\x37\\xfa\\x23\\x41\\x63\\x85\\x54\\xdc\\x88\\x0f\\xfe\\x28\\x09\\x5c\\x0f\\x40\\xb9\\xe7\\xff\\x5f\\x9e\\xf0\\xff\\xb6\\xa9\\x75\\x11\\x86\\xe6\\x78\\xfd\\xc3\\x50\\xae\\x7c\\x3c\\xc3\\x16\\xf9\\xa4\\xe0\\xdf\\xb1\\x3d\\x6d\\xcf\\x0e\\xde\\x0b\\xc4\\xd4\\x37\\xa5\\x76\\x27\\xad\\x13\\xac\\xb6\\x4b\\x4d\\x12\\x12\\x22\\x36\\x83\\x90\\x20\\x06\\x54\\x1b\\xf4\\x82\\xaa\\x8d\\x95\\xcb\\x5a\\xe1\\x6f\\x9c\\xa0\\x56\\xae\\x59\\x6b\\xbb\\xe4\\x6d\\xf6\\x77\\xee\\x96\\x40\\xc4\\x93\\x67\\x82\\xaf\\x9c\\x0e\\xa1\\xd2\\x6b\\x51\\xee\\x8a\\x68\\x4d\\x50\\x80\\x93\\xf5\\x9b\\x13\\x06\\x2b\\x5c\\x67\\xc6\\x46\\xab\\x82\\xa0\\xd2\\x71\\xef\\x81\\xa7\\xdc\\xd2\\x77\\x81\\xe4\\x14\\xea\\x9e\\x56\\xb7\\x51\\x55\\x97\\x1d\\x4e\\x7d\\xa6\\x8a\\xe4\\x96\\x5e\\x91\\xce\\x6b\\xbf\\xf1\\x31\\xc5\\x2a\\xf5\\x5f\\x28\\x27\\x05\\xb1\\x7d\\xb6\\xc8\\x8b\\x56\\x7c\\xba\\x3e\\xbe\\x6a\\x90\\xe5\\x03\\x46\\xd8\\xaa\\x5e\\x8f\\x46\\xe2\\x7f\\x3b\\xed\\x63\\xbb\\x24\\x0c\\x43\\xec\\x79\\xe9\\xf3\\x55\\xbd\\x0e\\xc5\\x7f\\x10\\x25\\x95\\x95\\x1b\\x08\\x96\\x59\\x41\\x20\\x53\\xce\\xe1\\x35\\x15\\xcd\\x09\\x09\\xa0\\xaa\\xf8\\xbd\\x30\\x29\\xa9\\x25\\x31\\xd5\\x3c\\x61\\x1d\\x91\\x60\\xdb\\x35\\x0d\\x3d\\xdb\\xa0\\xdb\\x7f\\x3a\\x59\\xe7\\xa6\\xf8\\xfb\\xe9\\x0a\\xc5\\x33\\xed\\xab\\x9e\\xf7\\x36\\x79\\x24\\xeb\\x5a\\x62\\x09\\x4e\\xe7\\xfc\\xd5\\xf9\\x67\\x33\\x72\\x3c\\xfa\\x44\\xcd\\xbb\\x1b\\x81\\xf4\\xcf\\xbe\\x8b\\x98\\x6f\\x4c\\xfe\\xcb\\x66\\x97\\xdd\\x4b\\xf0\\x92\\x6a\\xc5\\x8b\\xfa\\xaa\\x4e\\xd6\\xb2\\x73\\x04\\x5b\\x13\\x97\\x1c\\xc6\\x6a\\xad\\x0b\\xd4\\x41\\x6a\\x85\\x61\\x55\\x41\\x45\\x86\\x76\\x84\\x69\\x16\\x72\\xca\\x43\\x4f\\xb7\\x9a\\x5c\\x55\\x1e\\xa1\\xfc\\x70\\xf0\\x5b\\xa5\\x8b\\x46\\x1c\\xd7\\x46\\x56\\x70\\x81\\x99\\xdd\\x26\\x56\\x0c\\x57\\x5a\\x85\\x76\\x83\\xea\\x8b\\x47\\x88\\xad\\xfc\\x3d\\x60\\x79\\x54\\x9a\\xa9\\x00\\x08\\xe2\\x28\\x2d\\xd4\\xd3\\xe5\\x6c\\x41\\x74\\x7c\\xe6\\x6d\\xb6\\x4b\\x7c\\xc8\\x6f\\x26\\xa3\\x7a\\xe8\\xa1\\x20\\x43\\x29\\x3b\\xf7\\x55\\xc4\\x4e\\xb2\\xc8\\xa7\\xb1\\xfa\\x4c\\x98\\xd1\\x7c\\x5a\\xd5\\x8f\\x3b\\xe9\\xf7\\x1a\\x7a\\xf3\\xd9\\xec\\x9f\\x3d\\x5d\\x28\\xe3\\x68\\x61\\xa9\\x0c\\xfd\\xd0\\x3f\\xd5\\x29\\x66\\x24\\xc5\\x21\\xe5\\x64\\x81\\xe1\\x89\\xcb\\xd1\\x08\\xf7\\xc3\\xd8\\x28\\xef\\xff\\xf2\\x16\\x56\\x9f\\x1c\\x3b\\x36\\x08\\x90\\x58\\x2b\\xb8\\x14\\x46\\xc7\\xec\\xe0\\x3a\\x32\\x9b\\xeb\\x00\\x97\\xa2\\x53\\xbc\\x05\\x03\\x36\\xe8\\x53\\x71\\x37\\x1b\\xf6\\x42\\xf0\\x37\\xc0\\x5f\\x64\\x8e\\x36\\xb4\\x0a\\xff\\xf2\\xf6\\x87\\xef\\xa7\\x10\\x3c\\xd8\\x67\\x3d\\xfc\\x05\\x59\\xb4\\x67\\xe0\\x73\\x5a\\x11\\x5a\\x8f\\x46\\xb5\\xd2\\x02\\xf7\\xd2\\xe1\\xee\\x64\\x06\\xf8\\xf9\\x60\\xe0\\x8d\\xf5\\x50\\x68\\x6f\\xdb\\x6f\\xb2\\x1d\\xf4\\x9c\\x66\\x1b\\x9b\\x4b\\x11\\xc8\\x5c\\x32\\x24\\x0b\\x7b\\x50\\x9f\\xd8\\x50\\xf8\\x09\\x7d\\x32\\x50\\xe9\\x05\\x4f\\x1e\\x52\\xdf\\xe2\\x17\\x10\\xe0\\x5e\\xf0\\xc7\\x19\\xf5\\xe4\\x1d\\x2b\\x4a\\x91\\x3a\\xf3\\x82\\xba\\xbc\\xe5\\xd4\\x33\\xb2\\x3c\\x4f\\xc6\\x04\\xf6\\xe0\\xc2\\xb4\\xda\\x43\\x8c\\x5b\\x0c\\x0d\\xec\\xc1\\xed\\x25\\xde\\x89\\x33\\xe6\\x99\\xf0\\xc0\\x1e\\x6a\\x09\\xc5\\x1b\\x00\\x3f\\x2f\\x98\\xe9\\x8e\\xbc\\x8f\\x66\\x33\\x19\\x24\\xd8\\x44\\x04\\x78\\xf2\\x94\\xa7\\xba\\x17\\xfc\\xe1\\xff\\xcf\\xd7\\xd5\\xee\\x44\\x08\\x03\\xc1\\x57\\x31\\x93\\xf8\\xc3\\xa4\\x62\\x8b\\x40\\xb4\\x3e\\x0c\\xe1\\x4b\\x8e\\x28\\x68\\xb8\\xf3\\x87\\x31\\xbc\\xbb\\xd9\\x76\\xb7\\x14\\xf0\\xfc\\x77\\xe9\\xd2\\xdd\\x76\\xa6\\x70\\x3d\\xb6\\x3b\\xb7\\x28\\x29\\x50\\xff\\x01\\xfd\\x8c\\xb1\\x18\\xc6\\xfe\\xa1\\x1f\\x2e\\xa7\\xaf\\x3a\\xa1\\x9d\\x99\\x12\\xaf\\x46\\x6b\\x05\\xbf\\x96\\xc1\\xf2\\xc1\\xe1\\x3c\\xd2\\x3a\\x62\\x9d\\xe4\\x4a\\xc4\\x8e\\xec\\x6b\\xf5\\x7e\\xee\\x14\\xaa\\x69\\x18\\xe3\\xe9\\x73\\xb3\\xab\\x5a\\x86\\x35\\xc1\\x4d\\x39\\x0e\\x13\\x79\\x30\\x0a\\xe7\\xef\\xa9\\xe1\\x0b\\x29\\x8e\\x3b\\x5b\\xb5\\x06\\x89\\x42\\x78\\x28\\xff\\x8f\\x90\\x69\\xef\\xe1\\xba\\xff\\x68\\xd3\\x72\\xe4\\x49\\xf2\\xd8\\xb0\\x26\\x8f\\xa1\\x65\\x6a\\x22\\x14\\x74\\x92\\xad\\x70\\x2d\\x0a\\xfe\\x35\\xfe\\xde\\x1f\\x8f\\xaa\\x20\\xcf\\x2c\\x10\\x04\\x51\\x24\\xde\\x43\\x27\\x12\\x38\\xa1\\x41\\x0e\\xcd\\x80\\xd5\\x89\\xc1\\x65\\x1e\\x7f\\xcc\\x9e\\x6b\\x44\\x60\\x0b\\x62\\x8e\\xcb\\x40\\x60\\x4d\\x4a\\xdc\\x11\\xef\\xf1\\x9b\\x75\\xea\\x1f\\xd2\\xc0\\x58\\xa5\\x89\\xe1\\xf7\\x31\\x64\\xe6\\x54\\xee\\x71\\x42\\x3c\\x1e\\xc9\\x18\\xd0\\xba\\xf0\\x59\\xa4\\xab\\x97\\xb2\\x5e\\xb1\\xe8\\x25\\x3a\\xe3\\xe2\\xad\\x2e\\x94\\x2b\\x1f\\xa5\\x11\\x05\\xe8\\x33\\x9a\\xc3\\x8e\\xa6\\x80\\xbb\\xa1\\xe9\\x48\\x72\\xe3\\xd0\\xcb\\x87\\xa0\\x45\\x20\\xf9\\x02\\xd8\\x34\\x62\\xed\\x29\\x50\\xf2\\xe8\\x86\\xc4\\x79\\x8f\\xd8\\x0f\\x41\\xa6\\x38\\x11\\x16\\xdd\\xf3\\xe5\\x54\\xc3\\x66\\xae\\x93\\x50\\xbd\\xb5\\xa5\\x0e\\xe8\\x8d\\x14\\xad\\x20\\xe1\\x9f\\x39\\x65\\xdb\\x8d\\x1f\\xd4\\xef\\x34\\xb4\\x5d\\xd9\\x54\\x73\\x1b\\xe8\\xab\\xab\\xe6\\xad\\x9f\\xe9\\x71\\x54\\x86\\x25\\x57\\x17\\xe6\\x39\\xcd\\xb0\\x31\\xf2\\xed\\x8b\\x6d\\x6b\\xf8\\x5f\\x53\\x8b\\x5c\\xdf\\xde\\xe4\\xf4\\x85\\x14\\xdb\\xe7\\xee\\xb3\\xab\\x2e\\x6e\\xdd\\xdd\\xf3\\xe7\\x8d\\xdd\\x83\\x86\\xc6\\x31\\xbe\\x2c\\x77\\x2f\\xbf\\x01\\x00\\x00\\xff\\xff\\x0d\\xcc\\x2b\\xb4\\x02\\x39\\x02\\x00\")\n\nfunc assetsLoginDistAllMinJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_assetsLoginDistAllMinJs,\n\t\t\"assets/login/dist/all.min.js\",\n\t)\n}\n\nfunc assetsLoginDistAllMinJs() (*asset, error) {\n\tbytes, err := assetsLoginDistAllMinJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"assets/login/dist/all.min.js\", size: 145666, mode: os.FileMode(420), modTime: time.Unix(1571033118, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _assetsLoginDistRespondMinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x94\\x57\\x6d\\x73\\xdb\\xb8\\xf1\\x7f\\x7f\\x9f\\x82\\xe2\\x3f\\x7f\\x06\\xb0\\x20\\x50\\x72\\xf2\\xa6\\xe4\\xc1\\xba\\xc4\\x71\\x7a\\xd7\\x49\\xee\\xae\\x67\\x4f\\x7b\\x53\\x49\\x99\\x01\\xc1\\xa5\\x44\\x89\\x24\\x68\\x02\\xd4\\x83\\x45\\x7e\\xf7\\x0e\\x48\\xea\\xc9\\x8e\\xa7\\xed\\x1b\\x09\\x58\\x2c\\x16\\xfb\\xf8\\xdb\\xa5\\x7b\\xd5\\xb3\\xfe\\x00\\x95\\xcb\\x2c\\xa4\\x4b\\x65\\xad\\x47\\xf4\\x3d\\xbd\\xf6\\xac\\x34\\xce\\xdc\\x94\\x6f\\x07\\x9b\\x38\\xd4\\x0b\\x2b\\x85\\x30\\xe6\\xd6\\x63\\x09\\xc5\\xce\\xca\\x65\\xb2\\x8b\\xe2\\x24\\xb1\\xae\\xac\\x5b\\x99\\xef\\x8a\\x78\\xbe\\xd0\\xd6\\xf5\\x70\\xf4\\xce\\xba\\x17\\x52\\x6b\\xeb\\x6f\\xb0\\x48\\x7e\\xb0\\xae\\xac\\x2f\\xb1\\x80\\x4c\\x41\\x68\\x95\\x59\\x08\\x85\\xb5\\xd0\\x3a\\x57\\x9e\\xeb\\xce\\x63\\xbd\\x28\\x03\\x2a\\x64\\xea\\x2a\\xc3\\xbf\\x84\\x45\\xe2\\x76\\x0a\\xb8\\x41\\x22\\x03\\x37\\xe5\\x4a\\x43\\xe1\\x7e\\xf9\\xe5\\xf6\\xee\\xd7\\xfb\\xbb\\xc1\\xd7\\x5f\\x1e\\x8c\\x38\\xeb\\xca\\xfd\\xe1\\x87\\x5e\\x54\\x66\\x42\\xc7\\x32\\x43\\x1c\\xef\\xed\\x52\\x81\\xa5\\x74\\x11\\x0b\\x6d\\xfb\\x9c\\xa6\\x5c\\x8b\\xc5\\x57\\xa3\\x28\\x3b\\xdf\\x54\\xd5\\xf9\\x9d\\x35\\x2f\\xac\\x80\\x08\\xc6\\x69\\x28\\x45\\x99\\x42\\xa6\\xef\\x12\\x30\\x7f\\x24\\x64\\x82\\x46\\x71\\xa1\\x0e\\x84\\xdb\\x45\\x9c\\x84\\x55\\xd5\\x11\\x9b\\x1d\\x01\\xc6\\xa9\\x28\\x80\\x6b\\xe8\\x98\\x90\\x1d\\xc8\\x70\\x67\\x63\\x12\\xbd\\x3c\\x09\\xe3\\xb5\\x8d\\xfd\\x02\\x74\\x59\\x64\\x56\\x44\\xe3\\x90\\xd9\\xe9\\xe3\\x40\\x83\\xd2\\x83\\x91\\x4d\\x22\\xaa\\xf4\\x2e\\x01\\x2a\\x94\\x7a\\x80\\xad\\x66\\x76\\x2e\\x55\\x6c\\xb4\\xf4\\x78\\xa0\\x64\\x52\\x6a\\xf0\\xb5\\xcc\\xbd\\xc1\\x68\\x38\\x84\\xd4\\x26\\xd0\\xb1\\x07\\x5c\\xac\\xe6\\x85\\x2c\\xb3\\x90\\xd9\\x99\\xcc\\xc0\\x9c\\xf0\\x3c\\x87\\x2c\\x6c\\x34\\x44\\x11\\x26\\xe7\\xe6\\x9e\\x5e\\xcf\\x32\\x28\\x7e\\x7e\\xf8\\xfa\\x85\\xbd\\x75\\xd4\\x62\\xe7\\xff\\xd8\\x88\\x6b\\xe3\\xca\\xec\\xb7\\x7d\\xde\\x7f\\x6b\\xdf\\x58\\xff\\x77\\x54\\xd0\\xda\\x5b\\x4d\\xe4\\x3d\\xeb\\xfd\\x75\\xbe\\xf5\\xad\\xfa\\x47\\xb7\\xb9\\x71\\xf3\\x96\\x08\\x1a\\x67\\x0a\\x0a\\xfd\\x11\\x22\\x59\\x00\\x02\\x12\\x62\\x12\\xb0\\xf7\\xd7\\x8c\\xb1\\x88\\xca\\x28\\x52\\xa0\\xff\\x69\\xae\\x12\\x41\\x0b\\x48\\xe5\\x1a\\x5a\\xcd\\x00\\x93\\x7d\\x13\\x15\\x50\\x5e\\x40\\x9a\\x87\\x3d\\x5e\\xd7\\x35\\x3a\\x85\\x02\\xd7\\x48\\x2f\\x62\\x75\\x69\\xc2\\x45\\x94\\x0f\\x07\\x56\\x80\\xf0\\xbe\\x44\\xbd\\x21\\xae\\x4d\\x44\\x05\\xdb\\xd7\\x3e\\xa7\\x45\\x9b\\x45\\x4c\\x10\\x41\\xcb\\x3c\\xe4\\x1a\\xd8\\x51\\x12\\xde\\xd7\\xbe\\x61\\x0d\\xd9\\x64\\x46\\x2e\\xe8\\x4d\\x4a\\xb0\\xde\\xc8\\xd7\\xc5\\x6e\\x1f\\xb0\\x0c\\x36\\x16\\xa7\\x7f\\x7e\\xfd\\xf2\\xb3\\xd6\\xf9\\x1f\\xf0\\x58\\x82\\xd2\\xb5\\x30\\x8a\\x23\\x81\\x8f\\xe7\\x1f\\x84\\x8e\\xd7\\xf0\\xe7\\x6f\\xc1\\x12\\x84\\x46\\xf6\\xd7\\x58\\x14\\x52\\xc9\\x48\\x37\\x17\\x1f\\x1e\\x7e\\xb7\\x71\\x7d\\xf0\\xfd\\xe9\\xa5\\x8e\\x12\\xd4\\x35\\x32\\x19\\x73\\xb2\\x92\\x04\\xad\\x1a\\x82\\x01\\xc2\\xbe\\x70\\x1c\\x24\\xa8\\xcc\\x21\\x43\\xf6\\x5f\\xef\\x1e\\x6c\\xc2\\x49\\x6f\\x88\\x89\\xa0\\x32\\x2b\\x80\\x87\\x3b\\xa5\\xb9\\x06\\xb1\\xe0\\xd9\\xfc\\xc2\\x8e\\xf7\\x3d\\xc6\\x8c\\xcb\\x79\\xb8\\xbb\\x37\\x1c\\x55\\x75\\x3d\\x1c\\x36\\x34\\x73\\xa1\\x54\\x8e\\xf3\\x6e\\xf8\\xfe\\x6c\\x5f\\x55\\x01\\x12\\x9d\\xcf\\x14\\x98\\x24\\xc4\\x35\\x79\\x2e\\xc4\\x71\\x04\\x55\\x90\\x85\\x28\\x2b\\x93\\x04\\xe3\\xda\\x8f\\x23\\x24\\x28\\x5f\\xf2\\x2d\\x8b\\x88\\xa0\\x8f\\x25\\x94\\xc0\\xc2\\x26\\xd4\\x73\\xd8\\xb2\\x7d\\x1b\\x57\\xf7\\xa7\\xe6\\x7f\\xf2\\x6d\\xba\\x9f\\xf5\\xa7\\x7b\\x64\\x16\\xd3\\x7a\\x76\\x35\\xdd\\x4f\\xbe\\x4d\\xeb\\xe9\\x7e\\x76\\x35\\xad\\x71\\xdf\\x9d\\xc7\\x64\\x05\\xbb\\xa8\\xe0\\x29\\x28\\xcf\\xfd\\x09\\x8d\\xbd\\xe9\\x00\\x8d\\x3d\\x59\\xa5\\xf2\\xa9\\xda\\x40\\xb0\\x8a\\x35\\x9e\\x0e\\xf0\\xf8\\xc8\\x74\\x14\\x38\\xf6\\xbe\\x2f\\xd2\\xac\\xcd\\xca\\x88\\x2e\\x8b\\x44\\x79\\x2e\\x2a\\x8b\\x64\\x8a\\xf0\\xe4\\xad\\x3d\\x1b\\x1b\\x3d\\xdc\\x29\\x7e\\x6b\\xcf\\x26\\xdf\\xbc\\xe6\\xbf\\xdf\\x1d\\x4c\\x31\\x76\\xe7\\x24\\x8a\\xb3\\xf0\\xde\\x64\\xb9\\x3a\\x58\\x60\\x5d\\xa1\\xf6\\x4d\\x6c\\xac\\x98\\xde\\x4f\\xd5\\xac\\x3f\\xc6\\x6f\\x5c\\x22\\xb3\\x64\\xe7\\xb9\\xc8\\xfc\\x4d\\x55\\x1f\\x8f\\xd1\\x84\\x0f\\x9e\\x3e\\x0c\\xfe\\x65\\x38\\xd5\\xd8\\x25\\x69\\x9c\\x6d\\x3c\\x77\\x8a\\x26\\x53\\x35\\xbb\\x4a\\xe3\\x6c\\xda\\x02\\xe9\\x54\\x5d\\x79\\x0d\\xa9\\x3d\\x98\\x0c\\x07\\x7f\\x99\\xd2\\x59\\x1f\\xa3\\x7c\\x5b\\x41\\x8a\\x1b\\xe2\\x14\\xbb\\x24\\xe5\\xdb\\xb3\\xeb\\x7c\\xfb\\xbf\\x5d\\xaf\\x89\\xa0\\x8d\\xfa\\x7f\\x2f\\xa1\\x88\\x41\\xdd\\x97\\x79\\x2e\\x0b\\x0d\\xe1\\x05\\x30\\x3a\\x8e\\x89\\x69\\x8f\\x5d\\x10\\x91\\x6d\\x4c\\xb2\\x78\\x92\\xd8\\xd8\\x71\\x5e\\x3b\\xa1\\x5d\\x21\\x93\\xde\\x2b\\x0f\\xb5\\xe9\\x3c\\x27\\x0b\\x12\\x93\\xe5\\x19\\xd8\\x92\\x15\\x5b\\xbe\\x40\\xde\\xc4\\x94\\x64\\x6a\\x7e\\x32\\xf3\\x23\\xd9\\xbe\\x26\\x39\\x7b\\x37\\x24\\x8f\\x6c\\x49\\xe7\\x70\\xe0\\x53\\x1f\\x77\\x0f\\x7c\\xfe\\x2b\\x4f\\x01\\xd9\\x0b\\xe0\\xa1\\x8d\\x27\\xc3\\x59\\x55\\xad\\x48\\xf1\\x2a\\x5b\\xc0\\x15\\x34\\x6c\\x44\\xb1\\xc7\\x57\\x78\\x92\\x38\\x5b\\xd9\\x98\\xe8\\xe7\\x90\\xc0\\x49\\xc0\\x96\\xdf\\xc5\\x74\\x22\\xd8\\x92\\x1a\\xdc\\x27\\x21\\x5b\\x75\\xb8\\x1c\\xc9\\x4c\\xdf\\xc7\\x4f\\x40\\x80\\x89\\xa6\\x66\\x2e\\xa9\\x91\\xc1\\x97\\x43\\xf9\\xff\\x67\\xe4\\x37\\xf7\\x06\\x2a\\x7e\\x02\\x6f\\x04\\xa9\\xdf\\x02\\xf1\\xc8\\xb4\\x01\\x51\\x55\\x48\\xb0\\xe8\\xa5\\x62\\x5d\\x1b\\x12\\xaf\\xb5\\x09\\x4c\\x9e\\x6b\\xca\\xec\\xd1\\x70\\xf8\\xff\\x36\\x79\\xae\\xeb\\x89\\x7e\\xde\\x57\\x02\\x4c\\x22\\xc7\\x59\\x5d\\x42\\xbf\\x20\\xab\\xb3\\xee\\x88\\x09\\x67\\xc1\\x45\\x03\\x88\\xc6\\xab\\x8b\\x16\\x20\\xb0\\x77\\xd9\\x13\\x82\\xef\\xa8\\x15\\x12\\x68\\xf0\\xef\\x19\\x19\\x8c\\xf8\\x98\\xe5\\xbc\\x50\\xf0\\x39\\x91\\x5c\\x23\\x8e\\x6b\\x52\\x9e\\xa2\\x76\\x84\\x50\\x5b\\x24\\x31\\x64\\xad\\x0a\\xb6\\x09\\xd1\\x44\\x18\\xc4\\xb7\\x6f\\xef\\xef\\x47\\xb7\\x32\\xcd\\xb9\\xb6\\x19\\x33\\x1e\\x6c\\xd6\\x5f\\x65\\x08\\x8e\\x13\\x56\\x55\\x1b\\xd2\\x89\\x98\\x55\\x55\\x48\\x22\\x93\\x83\\x92\\xa9\\x89\\xa2\\x09\\x64\\x73\\xbd\\x18\\x8c\\x66\\xa4\\x60\\xc8\\x80\\xff\\x27\\xae\\x01\\x9b\\x64\\x7a\\x88\\x53\\x03\\xd7\\x71\\x84\\x02\\xc7\\x99\\x3b\\x4e\\x7e\\x53\\x0c\\xe6\\xb8\\x8b\\x32\\xa7\\x22\\x01\\x5e\\x18\\x1e\\x59\\x6a\\xb4\\xc0\\x64\\xc1\\x38\\x55\\xed\\x2d\\x43\\x29\\x49\\x8e\\xc9\\x5a\\xc6\\xa1\\x35\\xf4\\xe7\\xac\\xf0\\x23\\x59\\x20\\x63\\xc0\\xda\\x8a\\x33\\x2b\\xc1\\x71\\x84\\x12\\xba\\xe0\\xea\\xb7\\x4d\\xf6\\x7b\\x21\\x73\\x28\\xf4\\x0e\\xad\\x71\\x6b\\xe3\\x86\\x25\\x93\\xf5\\x8c\\x6c\\xd9\\x86\\x1a\\x9c\\x21\\x3b\\xb3\\xe0\\xdb\\x0d\\x79\\x62\\xa6\\xa4\\x19\\x63\\x5b\\xf2\\xe1\\xb0\\xdc\\x91\\x8f\\xcc\\x86\\xd4\\xf6\\xb7\\x8e\\x83\\xb6\\xe7\\x0e\\xdc\\xe2\\x2b\\xb4\\xa5\\x71\\x16\\xc2\\xf6\\xb7\\x08\\x7d\\xc4\\x37\\x83\\xd1\\x38\\xae\\x2a\\x8d\\xb0\\x37\\xc2\\x98\\xec\\x1c\\x07\\xed\\xce\\xf9\\x77\\xf8\\x0a\\xed\\x5e\\xe7\\xdf\\x18\\x75\\x9b\\x11\\xd1\\x71\\xd0\\x93\\xe3\\x7c\\xa8\\xaa\\x1e\\x7a\\xaa\\x2a\\xb8\\x61\\x5b\\x6c\\xd6\\x1f\\xaa\\x6a\\x77\\xc3\\x00\\xe3\\xaa\\x42\\xd1\\x64\\xd3\\x22\\xc7\\xec\\x62\\xc3\\x26\\x33\\x4c\\x4e\\x5b\\x9a\\x97\\x6a\\x81\\xd2\\xc9\\x86\\x16\\x65\\x02\\x6a\\x86\\x71\\x7d\\x70\\xd3\\xad\\x71\\x53\\x86\\xb3\\xe7\\x3e\\xba\\xc5\\x8e\\x93\\x4d\\x6e\\x67\\xed\\x2f\\xcd\\x79\\x01\\x99\\xfe\\x55\\x86\\xc0\\x18\\x7b\\x74\\x9c\\xc7\\x8b\\xfc\\x33\\x2c\\xd8\\xcf\\xba\\x18\\xb3\\xe1\\x31\\x08\\x9f\\x8c\\xf4\\xc8\\x04\\x21\\x7a\\xfe\\xc0\\xa7\\x2e\\x08\\x77\\x2f\\x8b\\xb0\\x49\\x59\\x1b\\x93\\xcf\\x2c\\x9a\\x7c\\x9a\\xd1\\xa5\\x8c\\x33\\x64\\x4f\\x33\\x1b\\xfb\\x77\\x54\\xef\\x72\\x60\\xb6\\x86\\xad\\x76\\x85\\x52\\x36\\xb9\\x6b\\x4d\\x64\\x9f\\xc8\\xe3\\x65\\x51\\xdd\\x11\\x49\\x33\\xd8\\xea\\xfb\\x38\\x48\\xe2\\x6c\\x8e\\xc9\\x5d\\x5b\\x0a\\xf7\\x0b\\x00\\x3d\\x3e\\xdf\\x1c\\x11\\xe4\\xb3\\x77\\x77\\x51\\xac\\x07\\xc5\\xcc\\xa1\\x31\\x1d\\x7d\\xc6\\x98\\x64\\xad\\x33\\xef\\x70\\x5d\\x93\\xf5\\xc5\\xec\\x41\\x3a\\xb8\\x36\\xd3\\x6d\\x01\\x79\\xc2\\x05\\xa0\\xae\\xa1\\xd3\\x63\\xeb\\x25\\xf6\\x01\\xf6\\x8f\\x67\\x8d\\x01\\x66\\x90\\x01\\xc7\\x81\\xce\\x87\\x55\\x35\\xf4\\x03\\x16\\x50\\x55\\x06\\x66\\x66\\xcb\\xe6\\x68\\x48\\x02\\x9a\\x70\\xa5\\x7f\\xe9\\xf2\\xc6\\x76\\x6d\\x8c\\x9b\\x51\\x6c\\xce\\xbe\\x33\\xaa\\xbe\\x54\\xc1\\xf4\\x71\\x62\\xbf\\x19\\xd9\\xfd\\xa0\\x6f\\xbf\\xb9\\x7e\\xf3\\xce\\xc6\\x35\\x59\\xb0\\x5e\\xe4\\x38\\xa1\\x1f\\x74\\xef\\x3a\\x0e\\x0a\\xfa\\xcc\\xc8\\x26\\x66\\x1d\\xb1\\x11\\x3e\\x06\\x33\\x36\\x81\\xbd\\x89\\xfd\\xb8\\xdf\\x6f\\x0d\\x5d\\x92\\x15\\xc9\\x88\\xf4\\x17\\x63\\xb4\\x64\\x21\\x49\\x5b\\xcf\\xcc\\x11\\xc7\\x18\\x7b\\x68\\xc9\\x60\\x12\\xcf\\x9e\\xd9\\x7a\\x1a\\x0d\\xb0\\xe3\\xfc\\x01\\xf3\\xbb\\x6d\\x4e\\xdf\\x8c\\x0e\\x57\\x0f\\x84\\x6b\\xc7\\x99\\x9f\\x36\\xd8\\x78\\x9d\\x2d\\xa9\\xca\\x93\\x58\\x23\\x9b\\xd8\\x98\\x48\\x76\\x48\\xb6\\xa3\\x76\\x39\\x1b\\xfa\\xf2\\x26\\xf7\\xf3\\x7e\\x1f\\xaf\\x58\\x36\\xc9\\x67\\x24\\x69\\xa5\\x76\\xc3\\xd4\\xea\\x20\\x00\\x35\\xad\\xec\\x99\\x62\\xa6\\x29\\x9f\\xa9\\x74\\x5d\\x55\\xb6\\x69\\xd1\\xa4\\x29\\x18\\x2f\\x3d\\xc2\\x17\\x39\\x14\\xa7\\xb7\\x3a\\x96\\xb0\\x91\\x78\\x33\\x18\\xb5\\xc3\\xca\\xea\\x79\\x74\\xe3\\x6c\\x83\\x1d\\xe7\\xac\\xfe\\x8f\\x66\\xe3\\x3e\\x3a\\x7f\\xcf\\xc6\\xed\\xbc\\xf2\\x42\\x02\\xdf\\xfe\\xd7\\x12\\x6a\\x5c\\x97\\x08\\xd7\\x64\\x73\\xde\\x86\\xe3\\x08\\x85\\x9d\\x01\\x87\\x31\\x3d\\xa4\\x6a\\x11\\x47\\x1a\\x61\\x3f\\x42\\x01\\x5d\\x14\\x10\\x9d\\x3e\\x16\\x04\\xde\\xaf\\x91\\x20\\x1d\\x39\\x38\\xe4\\xa7\\x9c\\xb4\\x94\\x19\\xeb\\x0d\\xc9\\x05\\x04\\x9f\\x3d\\xb5\\x31\\x8f\\x0f\\x8d\\x1a\\x35\\xd9\\x9e\\xeb\\x70\\x08\\x53\\xc0\\x86\\x7e\\xf0\\xe3\\xa1\\x1d\\xf8\\xc1\\x21\\x97\\x04\\x53\\x93\\xc0\\xf4\\x17\\xd1\\x69\\xc3\\xba\\x91\\x88\\xcc\\x9b\\x41\\x3a\\x71\\x9c\\x16\\x17\\x94\\x29\\x59\\xd3\\x79\\x1a\\x2a\\xd5\\xf2\\x8b\\xdc\\x40\\x71\\xcb\\x95\\xe9\\x21\\xd0\\x34\\x90\\x9e\\x9c\\xc0\\xec\\xd4\\xfc\\x9a\\x22\\x3f\\x0e\\x13\\x6d\\xc9\\x17\\x7c\\x73\\xdb\\x56\\xfd\\x18\\xad\\xd1\\x2b\\x47\\x04\\x48\\x64\\xec\\x06\\x63\\x32\\xf6\\x50\\xcf\\xfd\\x76\\x98\\x4f\\xbd\\xd9\\xd5\\xd4\\x9d\\xba\\xd8\\xa5\\xe6\\x3b\\x0f\\x01\\x76\\x9c\\x5e\\x51\\x55\\x70\\xac\\xba\\x53\\x6e\\x9b\\x82\\xef\\x32\\xcf\\x6d\\x32\\x8f\\x99\\x51\\x31\\x91\\x82\\x1b\\xd7\\xd0\\x85\\x54\\x1a\\x3b\\x0e\\xb2\\x5d\\xd7\\x58\\x05\\x17\\x25\\x7f\\x6d\\x4e\\xe0\\x9c\\x3d\\x2f\\xa4\\x96\\x42\\x26\\x7d\\xc0\\x24\\xec\\xf2\\xdb\\x38\\xcc\\x83\\xee\\x5b\\x30\\xaa\\x31\\xc6\\xb5\\x89\\x83\\xbf\\x45\\xf8\\xf4\\x05\\xb7\\x25\\xa2\\x99\\xdc\\xd2\\x7f\\xf0\\xa4\\x04\\xa6\\x09\\xa7\\x3c\\x0c\\xef\\xd6\\x90\\xe9\\x2f\\xb1\\xd2\\x90\\x41\\x31\\x7e\\x49\\x42\\x76\\x01\\x66\\x80\\xb2\\x49\\x40\\x7a\\x23\\xec\\x71\\xca\\xb5\\xe6\\x62\\xd1\\x30\\x99\\xc1\\xf6\\x6c\\x6b\\x26\\xdb\\x23\\x37\\xae\\xbb\\x8f\\x50\\xff\\xdf\\x01\\x00\\x00\\xff\\xff\\xed\\x16\\x16\\x7b\\x19\\x11\\x00\\x00\")\n\nfunc assetsLoginDistRespondMinJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_assetsLoginDistRespondMinJs,\n\t\t\"assets/login/dist/respond.min.js\",\n\t)\n}\n\nfunc assetsLoginDistRespondMinJs() (*asset, error) {\n\tbytes, err := assetsLoginDistRespondMinJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"assets/login/dist/respond.min.js\", size: 4377, mode: os.FileMode(420), modTime: time.Unix(1570872928, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n\tcannonicalName := strings.ReplaceAll(name, \"\\\\\", \"/\")\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.bytes, nil\n\t}\n\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n\ta, err := Asset(name)\n\tif err != nil {\n\t\tpanic(\"asset: Asset(\" + name + \"): \" + err.Error())\n\t}\n\n\treturn a\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n\tcannonicalName := strings.ReplaceAll(name, \"\\\\\", \"/\")\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.info, nil\n\t}\n\treturn nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n\tnames := make([]string, 0, len(_bindata))\n\tfor name := range _bindata {\n\t\tnames = append(names, name)\n\t}\n\treturn names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n\t\"assets/login/dist/all.min.css\":    assetsLoginDistAllMinCss,\n\t\"assets/login/dist/all.min.js\":     assetsLoginDistAllMinJs,\n\t\"assets/login/dist/respond.min.js\": assetsLoginDistRespondMinJs,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"}\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"}\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n\tnode := _bintree\n\tif name != \"\" {\n\t\tcannonicalName := strings.ReplaceAll(name, \"\\\\\", \"/\")\n\t\tpathList := strings.Split(cannonicalName, \"/\")\n\t\tfor _, p := range pathList {\n\t\t\tnode = node.Children[p]\n\t\t\tif node == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t\t\t}\n\t\t}\n\t}\n\tif node.Func != nil {\n\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t}\n\trv := make([]string, 0, len(node.Children))\n\tfor childName := range node.Children {\n\t\trv = append(rv, childName)\n\t}\n\treturn rv, nil\n}\n\ntype bintree struct {\n\tFunc     func() (*asset, error)\n\tChildren map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n\t\"assets\": &bintree{nil, map[string]*bintree{\n\t\t\"login\": &bintree{nil, map[string]*bintree{\n\t\t\t\"dist\": &bintree{nil, map[string]*bintree{\n\t\t\t\t\"all.min.css\":    &bintree{assetsLoginDistAllMinCss, map[string]*bintree{}},\n\t\t\t\t\"all.min.js\":     &bintree{assetsLoginDistAllMinJs, map[string]*bintree{}},\n\t\t\t\t\"respond.min.js\": &bintree{assetsLoginDistRespondMinJs, map[string]*bintree{}},\n\t\t\t}},\n\t\t}},\n\t}},\n}}\n\n// RestoreAsset restores an asset under the given directory\nfunc RestoreAsset(dir, name string) error {\n\tdata, err := Asset(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo, err := AssetInfo(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// RestoreAssets restores an asset under the given directory recursively\nfunc RestoreAssets(dir, name string) error {\n\tchildren, err := AssetDir(name)\n\t// File\n\tif err != nil {\n\t\treturn RestoreAsset(dir, name)\n\t}\n\t// Dir\n\tfor _, child := range children {\n\t\terr = RestoreAssets(dir, filepath.Join(name, child))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc _filePath(dir, name string) string {\n\tcannonicalName := strings.ReplaceAll(name, \"\\\\\", \"/\")\n\treturn filepath.Join(append([]string{dir}, strings.Split(cannonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "template/login/assets_list.go",
    "content": "package login\n\nvar AssetsList = []string{\n\t\"/login/dist/all.min.css\",\n\t\"/login/dist/all.min.js\",\n\t\"/login/dist/respond.min.js\",\n}\n"
  },
  {
    "path": "template/login/login.go",
    "content": "package login\n\nimport (\n\t\"bytes\"\n\t\"html/template\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n)\n\ntype Login struct {\n\tName string\n}\n\nfunc GetLoginComponent() *Login {\n\treturn &Login{\n\t\tName: \"login\",\n\t}\n}\n\nvar DefaultFuncMap = template.FuncMap{\n\t\"lang\":     language.Get,\n\t\"langHtml\": language.GetFromHtml,\n\t\"link\": func(cdnUrl, prefixUrl, assetsUrl string) string {\n\t\tif cdnUrl == \"\" {\n\t\t\treturn prefixUrl + assetsUrl\n\t\t}\n\t\treturn cdnUrl + assetsUrl\n\t},\n\t\"isLinkUrl\": func(s string) bool {\n\t\treturn (len(s) > 7 && s[:7] == \"http://\") || (len(s) > 8 && s[:8] == \"https://\")\n\t},\n\t\"render\": func(s, old, repl template.HTML) template.HTML {\n\t\treturn template.HTML(strings.ReplaceAll(string(s), string(old), string(repl)))\n\t},\n\t\"renderJS\": func(s template.JS, old, repl template.HTML) template.JS {\n\t\treturn template.JS(strings.ReplaceAll(string(s), string(old), string(repl)))\n\t},\n\t\"divide\": func(a, b int) int {\n\t\treturn a / b\n\t},\n}\n\nfunc (l *Login) GetTemplate() (*template.Template, string) {\n\ttmpl, err := template.New(\"login_theme1\").\n\t\tFuncs(DefaultFuncMap).\n\t\tParse(loginTmpl)\n\n\tif err != nil {\n\t\tlogger.Error(\"Login GetTemplate Error: \", err)\n\t}\n\n\treturn tmpl, \"login_theme1\"\n}\n\nfunc (l *Login) GetAssetList() []string               { return AssetsList }\nfunc (l *Login) GetAsset(name string) ([]byte, error) { return Asset(name[1:]) }\nfunc (l *Login) IsAPage() bool                        { return true }\nfunc (l *Login) GetName() string                      { return \"login\" }\n\nfunc (l *Login) GetContent() template.HTML {\n\tbuffer := new(bytes.Buffer)\n\ttmpl, defineName := l.GetTemplate()\n\terr := tmpl.ExecuteTemplate(buffer, defineName, l)\n\tif err != nil {\n\t\tlogger.Error(\"login ComposeHtml Error:\", err)\n\t}\n\treturn template.HTML(buffer.String())\n}\n\nfunc (l *Login) GetJS() template.JS            { return \"\" }\nfunc (l *Login) GetCSS() template.CSS          { return \"\" }\nfunc (l *Login) GetCallbacks() types.Callbacks { return make(types.Callbacks, 0) }\n"
  },
  {
    "path": "template/login/login.tmpl",
    "content": "{{define \"login_theme1\"}}\n    <!DOCTYPE html>\n    <!--[if lt IE 7]>\n    <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\">\n    <![endif]-->\n    <!--[if IE 7]>\n    <html class=\"no-js lt-ie9 lt-ie8\">\n    <![endif]-->\n    <!--[if IE 8]>\n    <html class=\"no-js lt-ie9\">\n    <![endif]-->\n    <!--[if gt IE 8]><!-->\n    <html class=\"no-js\">\n    <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <title>{{.Title}}</title>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <link rel=\"stylesheet\" href=\"{{link .CdnUrl .UrlPrefix \"/assets/login/dist/all.min.css\"}}\">\n\n        <!--[if lt IE 9]>\n        <script src=\"{{link .CdnUrl .UrlPrefix \"/assets/login/dist/respond.min.js\"}}\"></script>\n        <![endif]-->\n\n    </head>\n    <body>\n\n    <div class=\"container\">\n        <div class=\"row\" style=\"margin-top: 80px;\">\n            <div class=\"col-md-4 col-md-offset-4\">\n                <form action=\"##\" onsubmit=\"return false\" method=\"post\" id=\"sign-up-form\" class=\"fh5co-form animate-box\"\n                      data-animate-effect=\"fadeIn\">\n                    <h2>{{.Title}}</h2>\n                    <div class=\"form-group\">\n                        <label for=\"username\" class=\"sr-only\">Username</label>\n                        <input type=\"text\" class=\"form-control\" id=\"username\" placeholder=\"{{lang \"username\"}}\"\n                               autocomplete=\"off\">\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"password\" class=\"sr-only\">Password</label>\n                        <input type=\"password\" class=\"form-control\" id=\"password\" placeholder=\"{{lang \"password\"}}\"\n                               autocomplete=\"off\">\n                    </div>\n                    <div class=\"form-group\">\n                        <button class=\"btn btn-primary\" onclick=\"submitData()\">{{lang \"login\"}}</button>\n                    </div>\n                </form>\n            </div>\n        </div>\n        <div class=\"row\" style=\"padding-top: 60px; clear: both;\">\n            <div class=\"col-md-12 text-center\">\n                <p>\n                    <small>&copy; All Rights Reserved. GoAdmin</small>\n                </p>\n            </div>\n        </div>\n    </div>\n\n    <div id=\"particles-js\">\n        <canvas class=\"particles-js-canvas-el\" width=\"1606\" height=\"1862\" style=\"width: 100%; height: 100%;\"></canvas>\n    </div>\n\n    <script src=\"{{link .CdnUrl .UrlPrefix \"/assets/login/dist/all.min.js\"}}\"></script>\n\n    <script>\n        function submitData() {\n            $.ajax({\n                dataType: 'json',\n                type: 'POST',\n                url: '{{.UrlPrefix}}/signin',\n                async: 'true',\n                data: {\n                    'username': $(\"#username\").val(),\n                    'password': $(\"#password\").val()\n                },\n                success: function (data) {\n                    location.href = data.data.url\n                },\n                error: function (data) {\n                    alert('{{lang \"login fail\"}}');\n                }\n            });\n        }\n    </script>\n\n    </body>\n    </html>\n{{end}}"
  },
  {
    "path": "template/login/template.go",
    "content": "package login\n\nconst loginTmpl = `{{define \"login_theme1\"}}\n    <!DOCTYPE html>\n    <!--[if lt IE 7]>\n    <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\">\n    <![endif]-->\n    <!--[if IE 7]>\n    <html class=\"no-js lt-ie9 lt-ie8\">\n    <![endif]-->\n    <!--[if IE 8]>\n    <html class=\"no-js lt-ie9\">\n    <![endif]-->\n    <!--[if gt IE 8]><!-->\n    <html class=\"no-js\">\n    <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <title>{{.Title}}</title>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <link rel=\"stylesheet\" href=\"{{link .CdnUrl .UrlPrefix \"/assets/login/dist/all.min.css\"}}\">\n\n        <!--[if lt IE 9]>\n        <script src=\"{{link .CdnUrl .UrlPrefix \"/assets/login/dist/respond.min.js\"}}\"></script>\n        <![endif]-->\n\n    </head>\n    <body>\n\n    <div class=\"container\">\n        <div class=\"row\" style=\"margin-top: 80px;\">\n            <div class=\"col-md-4 col-md-offset-4\">\n                <form action=\"##\" onsubmit=\"return false\" method=\"post\" id=\"sign-up-form\" class=\"fh5co-form animate-box\"\n                      data-animate-effect=\"fadeIn\">\n                    <h2>{{.Title}}</h2>\n                    <div class=\"form-group\">\n                        <label for=\"username\" class=\"sr-only\">Username</label>\n                        <input type=\"text\" class=\"form-control\" id=\"username\" placeholder=\"{{lang \"username\"}}\"\n                               autocomplete=\"off\">\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"password\" class=\"sr-only\">Password</label>\n                        <input type=\"password\" class=\"form-control\" id=\"password\" placeholder=\"{{lang \"password\"}}\"\n                               autocomplete=\"off\">\n                    </div>\n                    <div class=\"form-group\">\n                        <button class=\"btn btn-primary\" onclick=\"submitData()\">{{lang \"login\"}}</button>\n                    </div>\n                </form>\n            </div>\n        </div>\n        <div class=\"row\" style=\"padding-top: 60px; clear: both;\">\n            <div class=\"col-md-12 text-center\">\n                <p>\n                    <small>&copy; All Rights Reserved. GoAdmin</small>\n                </p>\n            </div>\n        </div>\n    </div>\n\n    <div id=\"particles-js\">\n        <canvas class=\"particles-js-canvas-el\" width=\"1606\" height=\"1862\" style=\"width: 100%; height: 100%;\"></canvas>\n    </div>\n\n    <script src=\"{{link .CdnUrl .UrlPrefix \"/assets/login/dist/all.min.js\"}}\"></script>\n\n    <script>\n        function submitData() {\n            $.ajax({\n                dataType: 'json',\n                type: 'POST',\n                url: '{{.UrlPrefix}}/signin',\n                async: 'true',\n                data: {\n                    'username': $(\"#username\").val(),\n                    'password': $(\"#password\").val()\n                },\n                success: function (data) {\n                    location.href = data.data.url\n                },\n                error: function (data) {\n                    alert('{{lang \"login fail\"}}');\n                }\n            });\n        }\n    </script>\n\n    </body>\n    </html>\n{{end}}`\n"
  },
  {
    "path": "template/template.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage template\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"html/template\"\n\t\"path\"\n\t\"plugin\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\tc \"github.com/GoAdminGroup/go-admin/modules/config\"\n\terrors2 \"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/modules/system\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n\t\"github.com/GoAdminGroup/go-admin/template/login\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"golang.org/x/text/cases\"\n\ttextLang \"golang.org/x/text/language\"\n)\n\n// Template is the interface which contains methods of ui components.\n// It will be used in the plugins for custom the ui.\ntype Template interface {\n\tName() string\n\n\t// Components\n\n\t// layout\n\tCol() types.ColAttribute\n\tRow() types.RowAttribute\n\n\t// form and table\n\tForm() types.FormAttribute\n\tTable() types.TableAttribute\n\tDataTable() types.DataTableAttribute\n\n\tTreeView() types.TreeViewAttribute\n\tTree() types.TreeAttribute\n\tTabs() types.TabsAttribute\n\tAlert() types.AlertAttribute\n\tLink() types.LinkAttribute\n\n\tPaginator() types.PaginatorAttribute\n\tPopup() types.PopupAttribute\n\tBox() types.BoxAttribute\n\n\tLabel() types.LabelAttribute\n\tImage() types.ImgAttribute\n\n\tButton() types.ButtonAttribute\n\n\t// Builder methods\n\tGetTmplList() map[string]string\n\tGetAssetList() []string\n\tGetAssetImportHTML(exceptComponents ...string) template.HTML\n\tGetAsset(string) ([]byte, error)\n\tGetTemplate(bool) (*template.Template, string)\n\tGetVersion() string\n\tGetRequirements() []string\n\tGetHeadHTML() template.HTML\n\tGetFootJS() template.HTML\n\tGet404HTML() template.HTML\n\tGet500HTML() template.HTML\n\tGet403HTML() template.HTML\n}\n\ntype PageType uint8\n\nconst (\n\tNormalPage PageType = iota\n\tMissing404Page\n\tError500Page\n\tNoPermission403Page\n)\n\nfunc GetPageTypeFromPageError(err errors2.PageError) PageType {\n\tif err == nil {\n\t\treturn NormalPage\n\t} else if err == errors2.PageError403 {\n\t\treturn NoPermission403Page\n\t} else if err == errors2.PageError404 {\n\t\treturn Missing404Page\n\t} else {\n\t\treturn Error500Page\n\t}\n}\n\nconst (\n\tCompCol       = \"col\"\n\tCompRow       = \"row\"\n\tCompForm      = \"form\"\n\tCompTable     = \"table\"\n\tCompDataTable = \"datatable\"\n\tCompTree      = \"tree\"\n\tCompTreeView  = \"treeview\"\n\tCompTabs      = \"tabs\"\n\tCompAlert     = \"alert\"\n\tCompLink      = \"link\"\n\tCompPaginator = \"paginator\"\n\tCompPopup     = \"popup\"\n\tCompBox       = \"box\"\n\tCompLabel     = \"label\"\n\tCompImage     = \"image\"\n\tCompButton    = \"button\"\n)\n\nfunc HTML(s string) template.HTML {\n\treturn template.HTML(s)\n}\n\nfunc CSS(s string) template.CSS {\n\treturn template.CSS(s)\n}\n\nfunc JS(s string) template.JS {\n\treturn template.JS(s)\n}\n\n// The templateMap contains templates registered.\nvar templateMap = make(map[string]Template)\n\n// Get the template interface by theme name. If the\n// name is not found, it panics.\nfunc Get(ctx *context.Context, theme string) Template {\n\tif ctx != nil {\n\t\tqueryTheme := ctx.Theme()\n\t\tif queryTheme != \"\" {\n\t\t\tif temp, ok := templateMap[queryTheme]; ok {\n\t\t\t\treturn temp\n\t\t\t}\n\t\t}\n\t}\n\tif temp, ok := templateMap[theme]; ok {\n\t\treturn temp\n\t}\n\tpanic(\"wrong theme name\")\n}\n\n// Default get the default template with the theme name set with the global config.\n// If the name is not found, it panics.\nfunc Default(ctx ...*context.Context) Template {\n\tif len(ctx) > 0 && ctx[0] != nil {\n\t\tqueryTheme := ctx[0].Theme()\n\t\tif queryTheme != \"\" {\n\t\t\tif temp, ok := templateMap[queryTheme]; ok {\n\t\t\t\treturn temp\n\t\t\t}\n\t\t}\n\t}\n\tif temp, ok := templateMap[c.GetTheme()]; ok {\n\t\treturn temp\n\t}\n\tpanic(\"wrong theme name\")\n}\n\nvar (\n\ttemplateMu sync.Mutex\n\tcompMu     sync.Mutex\n)\n\n// Add makes a template available by the provided theme name.\n// If Add is called twice with the same name or if template is nil,\n// it panics.\nfunc Add(name string, temp Template) {\n\ttemplateMu.Lock()\n\tdefer templateMu.Unlock()\n\tif temp == nil {\n\t\tpanic(\"template is nil\")\n\t}\n\tif _, dup := templateMap[name]; dup {\n\t\tpanic(\"add template twice \" + name)\n\t}\n\ttemplateMap[name] = temp\n}\n\n// CheckRequirements check the theme and GoAdmin interdependence limit.\n// The first return parameter means that whether GoAdmin version meets the requirement of the theme used or not.\n// The second return parameter means that whether the version of theme used meets the requirement of GoAdmin or not.\nfunc CheckRequirements() (bool, bool) {\n\tif !CheckThemeRequirements() {\n\t\treturn false, true\n\t}\n\t// The theme which is not in the default official themes will be ignored.\n\tif !utils.InArray(DefaultThemeNames, Default().Name()) {\n\t\treturn true, true\n\t}\n\treturn true, VersionCompare(Default().GetVersion(), system.RequireThemeVersion()[Default().Name()])\n}\n\nfunc CheckThemeRequirements() bool {\n\treturn VersionCompare(system.Version(), Default().GetRequirements())\n}\n\nfunc VersionCompare(toCompare string, versions []string) bool {\n\tfor _, v := range versions {\n\t\tif v == toCompare || utils.CompareVersion(v, toCompare) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc GetPageContentFromPageType(ctx *context.Context, title, desc, msg string, pt PageType) (template.HTML, template.HTML, template.HTML) {\n\tif c.GetDebug() {\n\t\treturn template.HTML(title), template.HTML(desc), Default(ctx).Alert().SetTitle(errors2.MsgWithIcon).Warning(msg)\n\t}\n\n\tif pt == Missing404Page {\n\t\tif c.GetCustom404HTML() != template.HTML(\"\") {\n\t\t\treturn \"\", \"\", c.GetCustom404HTML()\n\t\t} else {\n\t\t\treturn \"\", \"\", Default(ctx).Get404HTML()\n\t\t}\n\t} else if pt == NoPermission403Page {\n\t\tif c.GetCustom404HTML() != template.HTML(\"\") {\n\t\t\treturn \"\", \"\", c.GetCustom403HTML()\n\t\t} else {\n\t\t\treturn \"\", \"\", Default(ctx).Get403HTML()\n\t\t}\n\t} else {\n\t\tif c.GetCustom500HTML() != template.HTML(\"\") {\n\t\t\treturn \"\", \"\", c.GetCustom500HTML()\n\t\t} else {\n\t\t\treturn \"\", \"\", Default(ctx).Get500HTML()\n\t\t}\n\t}\n}\n\nvar DefaultThemeNames = []string{\"sword\", \"adminlte\"}\n\nfunc Themes() []string {\n\tnames := make([]string, len(templateMap))\n\ti := 0\n\tfor k := range templateMap {\n\t\tnames[i] = k\n\t\ti++\n\t}\n\treturn names\n}\n\nfunc AddFromPlugin(name string, mod string) {\n\n\tplug, err := plugin.Open(mod)\n\tif err != nil {\n\t\tlogger.Error(\"AddFromPlugin err\", err)\n\t\tpanic(err)\n\t}\n\n\ttempPlugin, err := plug.Lookup(cases.Title(textLang.Und).String(name))\n\tif err != nil {\n\t\tlogger.Error(\"AddFromPlugin err\", err)\n\t\tpanic(err)\n\t}\n\n\tvar temp Template\n\ttemp, ok := tempPlugin.(Template)\n\tif !ok {\n\t\tlogger.Error(\"AddFromPlugin err: unexpected type from module symbol\")\n\t\tpanic(errors.New(\"AddFromPlugin err: unexpected type from module symbol\"))\n\t}\n\n\tAdd(name, temp)\n}\n\n// Component is the interface which stand for a ui component.\ntype Component interface {\n\t// GetTemplate return a *template.Template and a given key.\n\tGetTemplate() (*template.Template, string)\n\n\t// GetAssetList return the assets url suffix used in the component.\n\t// example:\n\t//\n\t// {{.UrlPrefix}}/assets/login/css/bootstrap.min.css => login/css/bootstrap.min.css\n\t//\n\t// See:\n\t// https://github.com/GoAdminGroup/go-admin/blob/master/template/login/theme1.tmpl#L32\n\t// https://github.com/GoAdminGroup/go-admin/blob/master/template/login/list.go\n\tGetAssetList() []string\n\n\t// GetAsset return the asset content according to the corresponding url suffix.\n\t// Asset content is recommended to use the tool go-bindata to generate.\n\t//\n\t// See: http://github.com/jteeuwen/go-bindata\n\tGetAsset(string) ([]byte, error)\n\n\tGetContent() template.HTML\n\n\tIsAPage() bool\n\n\tGetName() string\n\n\tGetJS() template.JS\n\tGetCSS() template.CSS\n\tGetCallbacks() types.Callbacks\n}\n\nvar compMap = map[string]Component{\n\t\"login\": login.GetLoginComponent(),\n}\n\n// GetComp gets the component by registered name. If the\n// name is not found, it panics.\nfunc GetComp(name string) Component {\n\tif comp, ok := compMap[name]; ok {\n\t\treturn comp\n\t}\n\tpanic(\"wrong component name\")\n}\n\nfunc GetComponentAsset() []string {\n\tassets := make([]string, 0)\n\tfor _, comp := range compMap {\n\t\tassets = append(assets, comp.GetAssetList()...)\n\t}\n\treturn assets\n}\n\nfunc GetComponentAssetWithinPage() []string {\n\tassets := make([]string, 0)\n\tfor _, comp := range compMap {\n\t\tif !comp.IsAPage() {\n\t\t\tassets = append(assets, comp.GetAssetList()...)\n\t\t}\n\t}\n\treturn assets\n}\n\nfunc GetComponentAssetImportHTML(ctx *context.Context) (res template.HTML) {\n\tres = Default(ctx).GetAssetImportHTML(c.GetExcludeThemeComponents()...)\n\tassets := GetComponentAssetWithinPage()\n\tfor i := 0; i < len(assets); i++ {\n\t\tres += getHTMLFromAssetUrl(assets[i])\n\t}\n\treturn\n}\n\nfunc getHTMLFromAssetUrl(s string) template.HTML {\n\tswitch path.Ext(s) {\n\tcase \".css\":\n\t\treturn template.HTML(`<link rel=\"stylesheet\" href=\"` + c.GetAssetUrl() + c.Url(\"/assets\"+s) + `\">`)\n\tcase \".js\":\n\t\treturn template.HTML(`<script src=\"` + c.GetAssetUrl() + c.Url(\"/assets\"+s) + `\"></script>`)\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n\nfunc GetAsset(path string) ([]byte, error) {\n\tfor _, comp := range compMap {\n\t\tres, err := comp.GetAsset(path)\n\t\tif err == nil {\n\t\t\treturn res, nil\n\t\t}\n\t}\n\treturn nil, errors.New(path + \" not found\")\n}\n\n// AddComp makes a component available by the provided name.\n// If Add is called twice with the same name or if component is nil,\n// it panics.\nfunc AddComp(comp Component) {\n\tcompMu.Lock()\n\tdefer compMu.Unlock()\n\tif comp == nil {\n\t\tpanic(\"component is nil\")\n\t}\n\tif _, dup := compMap[comp.GetName()]; dup {\n\t\tpanic(\"add component twice \" + comp.GetName())\n\t}\n\tcompMap[comp.GetName()] = comp\n}\n\n// AddLoginComp add the specified login component.\nfunc AddLoginComp(comp Component) {\n\tcompMu.Lock()\n\tdefer compMu.Unlock()\n\tcompMap[\"login\"] = comp\n}\n\n// SetComp makes a component available by the provided name.\n// If the value corresponding to the key is empty or if component is nil,\n// it panics.\nfunc SetComp(name string, comp Component) {\n\tcompMu.Lock()\n\tdefer compMu.Unlock()\n\tif comp == nil {\n\t\tpanic(\"component is nil\")\n\t}\n\tif _, dup := compMap[name]; dup {\n\t\tcompMap[name] = comp\n\t}\n}\n\ntype ExecuteParam struct {\n\tUser       models.UserModel\n\tTmpl       *template.Template\n\tTmplName   string\n\tIsPjax     bool\n\tPanel      types.Panel\n\tLogo       template.HTML\n\tConfig     *c.Config\n\tMenu       *menu.Menu\n\tAnimation  bool\n\tButtons    types.Buttons\n\tNoCompress bool\n\tIframe     bool\n}\n\nfunc updateNavAndLogoJS(logo template.HTML) template.JS {\n\tif logo == template.HTML(\"\") {\n\t\treturn \"\"\n\t}\n\treturn `$(function () {\n\t$(\".logo-lg\").html(\"` + template.JS(logo) + `\");\n});`\n}\n\nfunc updateNavJS(isPjax bool) template.JS {\n\tif !isPjax {\n\t\treturn \"\"\n\t}\n\treturn `$(function () {\n\tlet lis = $(\".user-menu .dropdown-menu li\");\n\tfor (i = 0; i < lis.length - 2; i++) {\n\t\t$(lis[i]).remove();\n\t}\n\t$(\".user-menu .dropdown-menu\").prepend($(\"#navbar-nav-custom\").html());\n});`\n}\n\ntype ExecuteOptions struct {\n\tAnimation         bool\n\tNoCompress        bool\n\tHideSideBar       bool\n\tHideHeader        bool\n\tUpdateMenu        bool\n\tNavDropDownButton []*types.NavDropDownItemButton\n}\n\nfunc GetExecuteOptions(options []ExecuteOptions) ExecuteOptions {\n\tif len(options) == 0 {\n\t\treturn ExecuteOptions{Animation: true}\n\t}\n\treturn options[0]\n}\n\nfunc Execute(ctx *context.Context, param *ExecuteParam) *bytes.Buffer {\n\n\tbuf := new(bytes.Buffer)\n\terr := param.Tmpl.ExecuteTemplate(buf, param.TmplName,\n\t\ttypes.NewPage(ctx, &types.NewPageParam{\n\t\t\tUser:       param.User,\n\t\t\tMenu:       param.Menu,\n\t\t\tAssets:     GetComponentAssetImportHTML(ctx),\n\t\t\tButtons:    param.Buttons,\n\t\t\tIframe:     param.Iframe,\n\t\t\tUpdateMenu: param.IsPjax,\n\t\t\tPanel: param.Panel.\n\t\t\t\tGetContent(append([]bool{param.Config.IsProductionEnvironment() && !param.NoCompress},\n\t\t\t\t\tparam.Animation)...).AddJS(param.Menu.GetUpdateJS(param.IsPjax)).\n\t\t\t\tAddJS(updateNavAndLogoJS(param.Logo)).AddJS(updateNavJS(param.IsPjax)),\n\t\t\tTmplHeadHTML: Default(ctx).GetHeadHTML(),\n\t\t\tTmplFootJS:   Default(ctx).GetFootJS(),\n\t\t\tLogo:         param.Logo,\n\t\t}))\n\tif err != nil {\n\t\tlogger.Error(\"template execute error\", err)\n\t}\n\treturn buf\n}\n\nfunc WarningPanel(ctx *context.Context, msg string, pts ...PageType) types.Panel {\n\tpt := Error500Page\n\tif len(pts) > 0 {\n\t\tpt = pts[0]\n\t}\n\tpageTitle, description, content := GetPageContentFromPageType(ctx, msg, msg, msg, pt)\n\treturn types.Panel{\n\t\tContent:     content,\n\t\tDescription: description,\n\t\tTitle:       pageTitle,\n\t}\n}\n\nfunc WarningPanelWithDescAndTitle(ctx *context.Context, msg, desc, title string, pts ...PageType) types.Panel {\n\tpt := Error500Page\n\tif len(pts) > 0 {\n\t\tpt = pts[0]\n\t}\n\tpageTitle, description, content := GetPageContentFromPageType(ctx, msg, desc, title, pt)\n\treturn types.Panel{\n\t\tContent:     content,\n\t\tDescription: description,\n\t\tTitle:       pageTitle,\n\t}\n}\n\nvar DefaultFuncMap = template.FuncMap{\n\t\"lang\":     language.Get,\n\t\"langHtml\": language.GetFromHtml,\n\t\"link\": func(cdnUrl, prefixUrl, assetsUrl string) string {\n\t\tif cdnUrl == \"\" {\n\t\t\treturn prefixUrl + assetsUrl\n\t\t}\n\t\treturn cdnUrl + assetsUrl\n\t},\n\t\"isLinkUrl\": func(s string) bool {\n\t\treturn (len(s) > 7 && s[:7] == \"http://\") || (len(s) > 8 && s[:8] == \"https://\")\n\t},\n\t\"render\": func(s, old, repl template.HTML) template.HTML {\n\t\treturn template.HTML(strings.ReplaceAll(string(s), string(old), string(repl)))\n\t},\n\t\"renderJS\": func(s template.JS, old, repl template.HTML) template.JS {\n\t\treturn template.JS(strings.ReplaceAll(string(s), string(old), string(repl)))\n\t},\n\t\"divide\": func(a, b int) int {\n\t\treturn a / b\n\t},\n\t\"renderRowDataHTML\": func(id, content template.HTML, value ...map[string]types.InfoItem) template.HTML {\n\t\treturn template.HTML(types.ParseTableDataTmplWithID(id, string(content), value...))\n\t},\n\t\"renderRowDataJS\": func(id template.HTML, content template.JS, value ...map[string]types.InfoItem) template.JS {\n\t\treturn template.JS(types.ParseTableDataTmplWithID(id, string(content), value...))\n\t},\n\t\"attr\": func(s template.HTML) template.HTMLAttr {\n\t\treturn template.HTMLAttr(s)\n\t},\n\t\"js\": func(s interface{}) template.JS {\n\t\tif ss, ok := s.(string); ok {\n\t\t\treturn template.JS(ss)\n\t\t}\n\t\tif ss, ok := s.(template.HTML); ok {\n\t\t\treturn template.JS(ss)\n\t\t}\n\t\treturn \"\"\n\t},\n\t\"changeValue\": func(f types.FormField, index int) types.FormField {\n\t\tif len(f.ValueArr) > 0 {\n\t\t\tf.Value = template.HTML(f.ValueArr[index])\n\t\t}\n\t\tif len(f.OptionsArr) > 0 {\n\t\t\tf.Options = f.OptionsArr[index]\n\t\t}\n\t\tif f.FormType.IsSelect() {\n\t\t\tf.FieldClass += \"_\" + strconv.Itoa(index)\n\t\t}\n\t\treturn f\n\t},\n}\n\ntype BaseComponent struct {\n\tName      string\n\tHTMLData  string\n\tCSS       template.CSS\n\tJS        template.JS\n\tCallbacks types.Callbacks\n}\n\nfunc (b *BaseComponent) IsAPage() bool                        { return false }\nfunc (b *BaseComponent) GetName() string                      { return b.Name }\nfunc (b *BaseComponent) GetAssetList() []string               { return make([]string, 0) }\nfunc (b *BaseComponent) GetAsset(name string) ([]byte, error) { return nil, nil }\nfunc (b *BaseComponent) GetJS() template.JS                   { return b.JS }\nfunc (b *BaseComponent) GetCSS() template.CSS                 { return b.CSS }\nfunc (b *BaseComponent) GetCallbacks() types.Callbacks        { return b.Callbacks }\nfunc (b *BaseComponent) BindActionTo(ctx *context.Context, action types.Action, id string) {\n\taction.SetBtnId(id)\n\tb.JS += action.Js()\n\tb.HTMLData += string(action.ExtContent(ctx))\n\tb.Callbacks = append(b.Callbacks, action.GetCallbacks())\n}\nfunc (b *BaseComponent) GetContentWithData(obj interface{}) template.HTML {\n\tbuffer := new(bytes.Buffer)\n\ttmpl, defineName := b.GetTemplate()\n\terr := tmpl.ExecuteTemplate(buffer, defineName, obj)\n\tif err != nil {\n\t\tlogger.Error(b.Name+\" GetContent error:\", err)\n\t}\n\treturn template.HTML(buffer.String())\n}\n\nfunc (b *BaseComponent) GetTemplate() (*template.Template, string) {\n\ttmpl, err := template.New(b.Name).\n\t\tFuncs(DefaultFuncMap).\n\t\tParse(b.HTMLData)\n\n\tif err != nil {\n\t\tlogger.Error(b.Name+\" GetTemplate Error: \", err)\n\t}\n\n\treturn tmpl, b.Name\n}\n"
  },
  {
    "path": "template/template_test.go",
    "content": "package template\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestVersionCompare(t *testing.T) {\n\tassert.Equal(t, true, VersionCompare(\"v1.2.8\", []string{\"v1.2.7\"}))\n\tassert.Equal(t, true, VersionCompare(\"v1.2.8\", []string{\"v1.2.8\"}))\n\tassert.Equal(t, true, VersionCompare(\"v1.2.8\", []string{\"v1.2.5\", \"v1.2.8\"}))\n\tassert.Equal(t, false, VersionCompare(\"v1.2.7\", []string{\"v1.2.8\"}))\n\tassert.Equal(t, true, VersionCompare(\"v0.0.30\", []string{\"v0.0.30\"}))\n\tassert.Equal(t, true, VersionCompare(\"v0.0.30\", []string{\">=v0.0.30\"}))\n\tassert.Equal(t, true, VersionCompare(\"v0.0.30\", []string{\">=v0.0.29\"}))\n\tassert.Equal(t, false, VersionCompare(\"v0.0.30\", []string{\">=v0.1.1\"}))\n\tassert.Equal(t, true, VersionCompare(\"v0.0.30\", []string{\"<=v0.1.1\"}))\n}\n"
  },
  {
    "path": "template/types/action/ajax.go",
    "content": "package action\n\nimport (\n\t\"encoding/json\"\n\t\"html/template\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype AjaxAction struct {\n\tBaseAction\n\tUrl         string\n\tMethod      string\n\tData        AjaxData\n\tAlert       bool\n\tAlertData   AlertData\n\tSuccessJS   template.JS\n\tErrorJS     template.JS\n\tParameterJS template.JS\n\tEvent       Event\n\tHandlers    []context.Handler\n}\n\ntype AlertData struct {\n\tTitle              string `json:\"title\"`\n\tType               string `json:\"type\"`\n\tShowCancelButton   bool   `json:\"showCancelButton\"`\n\tConfirmButtonColor string `json:\"confirmButtonColor\"`\n\tConfirmButtonText  string `json:\"confirmButtonText\"`\n\tCloseOnConfirm     bool   `json:\"closeOnConfirm\"`\n\tCancelButtonText   string `json:\"cancelButtonText\"`\n}\n\nfunc Ajax(id string, handler types.Handler) *AjaxAction {\n\tif id == \"\" {\n\t\tpanic(\"wrong ajax action parameter, empty id\")\n\t}\n\treturn &AjaxAction{\n\t\tUrl:    URL(id),\n\t\tMethod: \"post\",\n\t\tData:   NewAjaxData(),\n\t\tSuccessJS: `if (data.code === 0) {\n                                    swal(data.msg, '', 'success');\n                                } else {\n                                    swal(data.msg, '', 'error');\n                                }`,\n\t\tErrorJS: `if (data.responseText !== \"\") {\n\t\t\t\t\t\t\t\t\tswal(data.responseJSON.msg, '', 'error');\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tswal('error', '', 'error');\n\t\t\t\t\t\t\t\t}`,\n\t\tHandlers: context.Handlers{handler.Wrap()},\n\t\tEvent:    EventClick,\n\t}\n}\n\nfunc (ajax *AjaxAction) WithAlert(data ...AlertData) *AjaxAction {\n\tajax.Alert = true\n\tif len(data) > 0 {\n\t\tajax.AlertData = data[0]\n\t} else {\n\t\tajax.AlertData = AlertData{\n\t\t\tTitle:              \"\",\n\t\t\tType:               \"warning\",\n\t\t\tShowCancelButton:   true,\n\t\t\tConfirmButtonColor: \"#DD6B55\",\n\t\t\tConfirmButtonText:  language.Get(\"yes\"),\n\t\t\tCloseOnConfirm:     false,\n\t\t\tCancelButtonText:   language.Get(\"cancel\"),\n\t\t}\n\t}\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) AddData(data map[string]interface{}) *AjaxAction {\n\tajax.Data = ajax.Data.Add(data)\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) SetData(data map[string]interface{}) *AjaxAction {\n\tajax.Data = data\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) SetUrl(url string) *AjaxAction {\n\tajax.Url = url\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) SetSuccessJS(successJS template.JS) *AjaxAction {\n\tajax.SuccessJS = successJS\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) ChangeHTMLWhenSuccess(identify string, text ...string) *AjaxAction {\n\tdata := template.JS(\"data.data\")\n\tif len(text) > 0 {\n\t\tif len(text[0]) > 5 && text[0][:5] == \"data.\" {\n\t\t\tdata = template.JS(text[0])\n\t\t} else {\n\t\t\tdata = `\"` + template.JS(text[0]) + `\"`\n\t\t}\n\t}\n\tselector := template.JS(identify)\n\tif !strings.Contains(identify, \"$\") {\n\t\tselector = `$(\"` + template.JS(identify) + `\")`\n\t}\n\tajax.SuccessJS = `\n\tif (data.code === 0) {\n\t\tif (` + selector + `.is(\"input\")) {\n\t\t\t` + selector + `.val(` + data + `);\n\t\t} else if (` + selector + `.is(\"select\")) {\n\t\t\t` + selector + `.val(` + data + `);\n\t\t} else {\n\t\t\t` + selector + `.html(` + data + `);\n\t\t}\n\t} else {\n\t\tswal(data.msg, '', 'error');\n\t}`\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) SetEvent(event Event) *AjaxAction {\n\tajax.Event = event\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) SetErrorJS(errorJS template.JS) *AjaxAction {\n\tajax.ErrorJS = errorJS\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) SetParameterJS(parameterJS template.JS) *AjaxAction {\n\tajax.ParameterJS += parameterJS\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) SetMethod(method string) *AjaxAction {\n\tajax.Method = method\n\treturn ajax\n}\n\nfunc (ajax *AjaxAction) GetCallbacks() context.Node {\n\treturn context.Node{\n\t\tPath:     ajax.Url,\n\t\tMethod:   ajax.Method,\n\t\tHandlers: ajax.Handlers,\n\t\tValue:    map[string]interface{}{constant.ContextNodeNeedAuth: 1},\n\t}\n}\n\nfunc (ajax *AjaxAction) Js() template.JS {\n\n\tajaxStatement := `$.ajax({\n                            method: '` + ajax.Method + `',\n                            url: \"` + ajax.Url + `\",\n                            data: data,\n                            success: function (data) { \n                                ` + string(ajax.SuccessJS) + `\n                            },\n\t\t\t\t\t\t\terror: function (data) {\n\t\t\t\t\t\t\t\t` + string(ajax.ErrorJS) + `\n\t\t\t\t\t\t\t},\n                        });`\n\n\tif ajax.Alert {\n\t\tb, _ := json.Marshal(ajax.AlertData)\n\t\tajaxStatement = \"swal(\" + string(b) + `,\n                    function () {\n\t\t\t\t\t\t` + ajaxStatement + `\n\t\t\t\t\t});`\n\t}\n\n\treturn template.JS(`$('`+ajax.BtnId+`').on('`+string(ajax.Event)+`', function (event) {\n\t\t\t\t\t\tlet data = `+ajax.Data.JSON()+`;\n\t\t\t\t\t\t`) + ajax.ParameterJS + template.JS(`\n\t\t\t\t\t\tlet id = $(this).attr(\"data-id\");\n\t\t\t\t\t\tif (id && id !== \"\") {\n\t\t\t\t\t\t\tdata[\"id\"] = id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t`+ajaxStatement+`\n            \t\t});`)\n}\n\nfunc (ajax *AjaxAction) BtnAttribute() template.HTML { return template.HTML(`href=\"javascript:;\"`) }\n"
  },
  {
    "path": "template/types/action/base.go",
    "content": "package action\n\nimport (\n\t\"encoding/json\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype AjaxData map[string]interface{}\n\nfunc NewAjaxData() AjaxData {\n\treturn AjaxData{\"ids\": \"{{.Ids}}\"}\n}\n\nfunc (a AjaxData) Add(m map[string]interface{}) AjaxData {\n\tfor k, v := range m {\n\t\ta[k] = v\n\t}\n\treturn a\n}\n\nfunc (a AjaxData) JSON() string {\n\tb, _ := json.Marshal(a)\n\treturn utils.ReplaceAll(string(b), `\"{%id}\"`, \"{{.Id}}\",\n\t\t`\"{%ids}\"`, \"{{.Ids}}\",\n\t\t`\"{{.Ids}}\"`, \"{{.Ids}}\",\n\t\t`\"{{.Id}}\"`, \"{{.Id}}\")\n}\n\ntype BaseAction struct {\n\tBtnId   string\n\tBtnData interface{}\n\tJS      template.JS\n}\n\nfunc (base *BaseAction) SetBtnId(btnId string) {\n\tif btnId[0] != '.' && btnId[0] != '#' {\n\t\tbase.BtnId = \".\" + btnId\n\t} else {\n\t\tbase.BtnId = btnId\n\t}\n}\nfunc (base *BaseAction) Js() template.JS              { return base.JS }\nfunc (base *BaseAction) BtnClass() template.HTML      { return \"\" }\nfunc (base *BaseAction) BtnAttribute() template.HTML  { return \"\" }\nfunc (base *BaseAction) GetCallbacks() context.Node   { return context.Node{} }\nfunc (base *BaseAction) ExtContent(ctx *context.Context) template.HTML    { return template.HTML(``) }\nfunc (base *BaseAction) FooterContent(ctx *context.Context) template.HTML { return template.HTML(``) }\nfunc (base *BaseAction) SetBtnData(data interface{})  { base.BtnData = data }\n\nvar _ types.Action = (*AjaxAction)(nil)\nvar _ types.Action = (*PopUpAction)(nil)\nvar _ types.Action = (*JumpAction)(nil)\nvar _ types.Action = (*JumpSelectBoxAction)(nil)\n\nfunc URL(id string) string {\n\treturn config.Url(\"/operation/\" + utils.WrapURL(id))\n}\n"
  },
  {
    "path": "template/types/action/event.go",
    "content": "package action\n\ntype Event string\n\nconst (\n\tEventBlur        Event = \"blur\"\n\tEventFocus       Event = \"focus\"\n\tEventFocusin     Event = \"focusin\"\n\tEventFocusout    Event = \"focusout\"\n\tEventLoad        Event = \"load\"\n\tEventResize      Event = \"resize\"\n\tEventScroll      Event = \"scroll\"\n\tEventUnload      Event = \"unload\"\n\tEventClick       Event = \"click\"\n\tEventDblclick    Event = \"dblclick\"\n\tEventMousedown   Event = \"mousedown\"\n\tEventMouseup     Event = \"mouseup\"\n\tEventMousemove   Event = \"mousemove\"\n\tEventMouseover   Event = \"mouseover\"\n\tEventMouseout    Event = \"mouseout\"\n\tEventMouseenter  Event = \"mouseenter\"\n\tEventMouseleave  Event = \"mouseleave\"\n\tEventChange      Event = \"change\"\n\tEventSelect      Event = \"select\"\n\tEventSubmit      Event = \"submit\"\n\tEventKeydown     Event = \"keydown\"\n\tEventKeypress    Event = \"keypress\"\n\tEventKeyup       Event = \"keyup\"\n\tEventError       Event = \"error\"\n\tEventContextmenu Event = \"contextmenu\"\n)\n"
  },
  {
    "path": "template/types/action/fieldfilter.go",
    "content": "package action\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype FieldFilterAction struct {\n\tBaseAction\n\tField string\n}\n\nfunc FieldFilter(field string) *FieldFilterAction {\n\treturn &FieldFilterAction{Field: field}\n}\n\nfunc (jump *FieldFilterAction) ExtContent(ctx *context.Context) template.HTML {\n\n\toptions := jump.BtnData.(types.FieldOptions)\n\n\tcm := ``\n\tfor _, obejct := range options {\n\t\tcm += `if (e.params.data.text === \"` + obejct.Text + `\") {\n\t\t$.pjax({url: setURL(\"` + jump.Field + `\", \"` + obejct.Value + `\"), container: '#pjax-container'});\n\t}`\n\t}\n\n\treturn template.HTML(`<script>\n$(\"select` + jump.BtnId + `\").on(\"select2:select\",function(e){\n\n\tlet setURL = function(field, value) {\n\t\tlet vars = window.location.search.substring(1).split(\"&\");\n\t\tlet params = \"\";\n\t\tlet has = false;\n\t\tfor (let i = 0; i < vars.length; i++) {\n\t\t\tpair = vars[i].split(\"=\");\n\t\t\tif (pair[0] == \"` + parameter.Page + `\") {\n\t\t\t\tcontinue\n\t\t\t} else if (pair[0] === field) {\n\t\t\t\thas = true\n\t\t\t\tparams += field + \"=\" + value + \"&\"\n\t\t\t} else if (pair[0] !== \"` + form.NoAnimationKey + `\") {\n\t\t\t\tparams += vars[i] + \"&\"\n\t\t\t}\n\t\t}\n\n\t\tif (!has) {\n\t\t\tparams += field + \"=\" + value + \"&` + form.NoAnimationKey + `=true\"\n\t\t} else {\n\t\t\tparams +=  \"` + form.NoAnimationKey + `=true\"\n\t\t}\n\n\t\treturn window.location.pathname + \"?\" + params\n\t}\n\t\n\t` + cm + `\n})\nvv = \"\"\nquery = window.location.search.substring(1);\nvars = query.split(\"&\");\nfor (let i = 0; i < vars.length; i++) {\n\tpair = vars[i].split(\"=\");\n\tif (pair[0] === \"` + jump.Field + `\") {\n\t\tvv = pair[1];\n\t}\n}\nif (vv !== \"\") {\n\t$(\"` + jump.BtnId + `\").val(vv).select2()\n}\n</script>`)\n}\n"
  },
  {
    "path": "template/types/action/file_upload.go",
    "content": "package action\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype FileUploadAction struct {\n\tBaseAction\n\tUrl      string\n\tMethod   string\n\tFileName string\n\tHandlers []context.Handler\n}\n\nfunc FileUpload(id string, handler types.Handler) *FileUploadAction {\n\tif id == \"\" {\n\t\tpanic(\"wrong file upload action parameter, empty id\")\n\t}\n\treturn &FileUploadAction{\n\t\tUrl:      URL(id),\n\t\tMethod:   \"post\",\n\t\tFileName: \"file\",\n\t\tHandlers: context.Handlers{handler.Wrap()},\n\t}\n}\n\nfunc (file *FileUploadAction) SetUrl(url string) *FileUploadAction {\n\tfile.Url = url\n\treturn file\n}\n\nfunc (file *FileUploadAction) SetMethod(method string) *FileUploadAction {\n\tfile.Method = method\n\treturn file\n}\n\nfunc (file *FileUploadAction) GetCallbacks() context.Node {\n\treturn context.Node{\n\t\tPath:     file.Url,\n\t\tMethod:   file.Method,\n\t\tHandlers: file.Handlers,\n\t\tValue:    map[string]interface{}{constant.ContextNodeNeedAuth: 1},\n\t}\n}\n\nfunc (file *FileUploadAction) Js() template.JS {\n\n\treturn template.JS(`$('` + file.BtnId + `').on('click', function(){\n  $('` + file.BtnId + `_input').click();\n});\n\n$(\"` + file.BtnId + `_input\").on(\"change\", function () {\n  var files = $('` + file.BtnId + `_input').prop('files');\n\n  var data = new FormData();\n  data.append('` + file.FileName + `', files[0]);\n  NProgress.start();\n\n  $.ajax({\n\t\turl: '` + file.Url + `',\n\t\ttype: '` + file.Method + `',\n\t\tdata: data,\n\t\tcache: false,\n  \t\tprocessData: false,\n  \t\tcontentType: false,\n\t\tsuccess: function (data) { \n\t\t  \tNProgress.done();\n\t\t\tif (data.code === 0) {\n\t\t\t\tswal(data.msg, '', 'success');\n\t\t\t\t$.pjax.reload('#pjax-container');\n\t\t\t} else {\n\t\t\t\tswal(data.msg, '', 'error');\n\t\t\t}\n\t\t},\n\t\terror: function (data) {\n\t\t\tNProgress.done();\n\t\t\tif (data.responseText !== \"\") {\n\t\t\t\tswal(data.responseJSON.msg, '', 'error');\t\t\t\t\t\t\t\t\n\t\t\t} else {\n\t\t\t\tswal('error', '', 'error');\n\t\t\t}\n\t\t},\n  });\n});`)\n}\n\nfunc (file *FileUploadAction) BtnAttribute() template.HTML {\n\treturn template.HTML(`href=\"javascript:;\"`)\n}\n\nfunc (file *FileUploadAction) FooterContent(ctx *context.Context) template.HTML {\n\treturn template.HTML(`<input class=\"` + file.BtnId[1:] + `_input\" type=\"file\" multiple=\"multiple\" style=\"display:none\" />`)\n\n}\n"
  },
  {
    "path": "template/types/action/jump.go",
    "content": "package action\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n)\n\ntype JumpAction struct {\n\tBaseAction\n\tUrl         string\n\tTarget      string\n\tExt         template.HTML\n\tNewTabTitle string\n}\n\nfunc Jump(url string, ext ...template.HTML) *JumpAction {\n\turl = utils.ReplaceAll(url, \"{%id}\", \"{{.Id}}\", \"{%ids}\", \"{{.Ids}}\")\n\tif len(ext) > 0 {\n\t\treturn &JumpAction{Url: url, Ext: ext[0]}\n\t}\n\treturn &JumpAction{Url: url, NewTabTitle: \"\"}\n}\n\nfunc JumpInNewTab(url, title string, ext ...template.HTML) *JumpAction {\n\turl = utils.ReplaceAll(url, \"{%id}\", \"{{.Id}}\", \"{%ids}\", \"{{.Ids}}\")\n\tif len(ext) > 0 {\n\t\treturn &JumpAction{Url: url, NewTabTitle: title, Ext: ext[0]}\n\t}\n\treturn &JumpAction{Url: url, NewTabTitle: title}\n}\n\nfunc JumpWithTarget(url, target string, ext ...template.HTML) *JumpAction {\n\turl = utils.ReplaceAll(url, \"{%id}\", \"{{.Id}}\", \"{%ids}\", \"{{.Ids}}\")\n\tif len(ext) > 0 {\n\t\treturn &JumpAction{Url: url, Target: target, Ext: ext[0]}\n\t}\n\treturn &JumpAction{Url: url, Target: target}\n}\n\nfunc (jump *JumpAction) GetCallbacks() context.Node {\n\treturn context.Node{Path: jump.Url, Method: \"GET\"}\n}\n\nfunc (jump *JumpAction) BtnAttribute() template.HTML {\n\thtml := template.HTML(`href=\"` + jump.Url + `\"`)\n\tif jump.NewTabTitle != \"\" {\n\t\thtml += template.HTML(` data-title=\"` + jump.NewTabTitle + `\"`)\n\t}\n\tif jump.Target != \"\" {\n\t\thtml += template.HTML(` target=\"` + jump.Target + `\"`)\n\t}\n\treturn html\n}\n\nfunc (jump *JumpAction) BtnClass() template.HTML {\n\tif jump.NewTabTitle != \"\" {\n\t\treturn \"new-tab-link\"\n\t}\n\treturn \"\"\n}\n\nfunc (jump *JumpAction) ExtContent(ctx *context.Context) template.HTML {\n\treturn jump.Ext\n}\n"
  },
  {
    "path": "template/types/action/jump_selectbox.go",
    "content": "package action\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n)\n\ntype JumpSelectBoxAction struct {\n\tBaseAction\n\tOptions     JumpOptions\n\tNewTabTitle string\n}\n\ntype JumpOptions []JumpOption\n\ntype JumpOption struct {\n\tValue string\n\tUrl   string\n}\n\nfunc SelectBoxJump(options JumpOptions) *JumpSelectBoxAction {\n\treturn &JumpSelectBoxAction{Options: options}\n}\n\nfunc (jump *JumpSelectBoxAction) ExtContent(ctx *context.Context) template.HTML {\n\n\tcm := ``\n\tfor _, obejct := range jump.Options {\n\t\tcm += `if (e.params.data.text === \"` + obejct.Value + `\") {\n\t\t$.pjax({url: \"` + obejct.Url + `\", container: '#pjax-container'});\n\t}`\n\t}\n\n\treturn template.HTML(`<script>\n$(\"select` + jump.BtnId + `\").on(\"select2:select\",function(e){\n\t` + cm + `\n})\n</script>`)\n}\n"
  },
  {
    "path": "template/types/action/popup.go",
    "content": "package action\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\ttemplate2 \"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype PopUpAction struct {\n\tBaseAction\n\tUrl         string\n\tMethod      string\n\tId          string\n\tTitle       string\n\tDraggable   bool\n\tWidth       string\n\tHeight      string\n\tHasIframe   bool\n\tHideFooter  bool\n\tBtnTitle    template.HTML\n\tParameterJS template.JS\n\tData        AjaxData\n\tHandlers    []context.Handler\n\tEvent       Event\n}\n\nfunc PopUp(id, title string, handler types.Handler) *PopUpAction {\n\tif id == \"\" {\n\t\tpanic(\"wrong popup action parameter, empty id\")\n\t}\n\treturn &PopUpAction{\n\t\tUrl:      URL(id),\n\t\tTitle:    title,\n\t\tMethod:   \"post\",\n\t\tBtnTitle: \"\",\n\t\tData:     NewAjaxData(),\n\t\tId:       \"info-popup-model-\" + utils.Uuid(10),\n\t\tHandlers: context.Handlers{handler.Wrap()},\n\t\tEvent:    EventClick,\n\t}\n}\n\nfunc (pop *PopUpAction) SetData(data map[string]interface{}) *PopUpAction {\n\tpop.Data = pop.Data.Add(data)\n\treturn pop\n}\n\nfunc (pop *PopUpAction) SetDraggable() *PopUpAction {\n\tpop.Draggable = true\n\treturn pop\n}\n\nfunc (pop *PopUpAction) SetWidth(width string) *PopUpAction {\n\tpop.Width = width\n\treturn pop\n}\n\nfunc (pop *PopUpAction) SetHeight(height string) *PopUpAction {\n\tpop.Height = height\n\treturn pop\n}\n\nfunc (pop *PopUpAction) SetParameterJS(parameterJS template.JS) *PopUpAction {\n\tpop.ParameterJS += parameterJS\n\treturn pop\n}\n\nfunc (pop *PopUpAction) SetUrl(url string) *PopUpAction {\n\tpop.Url = url\n\treturn pop\n}\n\ntype IframeData struct {\n\tWidth          string\n\tHeight         string\n\tSrc            string\n\tAddParameterFn func(ctx *context.Context) string\n}\n\nfunc PopUpWithIframe(id, title string, data IframeData, width, height string) *PopUpAction {\n\tif id == \"\" {\n\t\tpanic(\"wrong popup action parameter, empty id\")\n\t}\n\tif data.Width == \"\" {\n\t\tdata.Width = \"100%\"\n\t}\n\tif data.Height == \"\" {\n\t\tdata.Height = \"100%\"\n\t}\n\tif strings.Contains(data.Src, \"?\") {\n\t\tdata.Src = data.Src + \"&\"\n\t} else {\n\t\tdata.Src = data.Src + \"?\"\n\t}\n\tmodalID := \"info-popup-model-\" + utils.Uuid(10)\n\tvar handler types.Handler = func(ctx *context.Context) (success bool, msg string, res interface{}) {\n\t\tparam := \"\"\n\t\tif data.AddParameterFn != nil {\n\t\t\tparam = data.AddParameterFn(ctx)\n\t\t}\n\t\treturn true, \"ok\", fmt.Sprintf(`<iframe style=\"width:%s;height:%s;\" \n\t\t\tscrolling=\"auto\" \n\t\t\tallowtransparency=\"true\" \n\t\t\tframeborder=\"0\"\n\t\t\tsrc=\"%s__goadmin_iframe=true&__go_admin_no_animation_=true&__goadmin_iframe_id=%s`+param+`\"><iframe>`,\n\t\t\tdata.Width, data.Height, data.Src, modalID)\n\t}\n\treturn &PopUpAction{\n\t\tUrl:        URL(id),\n\t\tTitle:      title,\n\t\tMethod:     \"post\",\n\t\tBtnTitle:   \"\",\n\t\tHeight:     height,\n\t\tHasIframe:  true,\n\t\tHideFooter: isFormURL(data.Src),\n\t\tWidth:      width,\n\t\tDraggable:  true,\n\t\tData:       NewAjaxData(),\n\t\tId:         modalID,\n\t\tHandlers:   context.Handlers{handler.Wrap()},\n\t\tEvent:      EventClick,\n\t}\n}\n\ntype PopUpData struct {\n\tId     string\n\tTitle  string\n\tWidth  string\n\tHeight string\n}\n\ntype GetForm func(panel *types.FormPanel) *types.FormPanel\ntype GetCtxForm func(ctx *context.Context, panel *types.FormPanel) *types.FormPanel\n\nvar operationHandlerSetter context.NodeProcessor\n\nfunc InitOperationHandlerSetter(p context.NodeProcessor) {\n\toperationHandlerSetter = p\n}\n\nfunc PopUpWithForm(data PopUpData, fn GetForm, url string) *PopUpAction {\n\tif data.Id == \"\" {\n\t\tpanic(\"wrong popup action parameter, empty id\")\n\t}\n\tmodalID := \"info-popup-model-\" + utils.Uuid(10)\n\n\tvar handler types.Handler = func(ctx *context.Context) (success bool, msg string, res interface{}) {\n\t\tcol1 := template2.Default(ctx).Col().GetContent()\n\t\tbtn1 := template2.Default(ctx).Button().SetType(\"submit\").\n\t\t\tSetContent(language.GetFromHtml(\"Save\")).\n\t\t\tSetThemePrimary().\n\t\t\tSetOrientationRight().\n\t\t\tSetLoadingText(icon.Icon(\"fa-spinner fa-spin\", 2) + language.GetFromHtml(\"Save\")).\n\t\t\tGetContent()\n\t\tbtn2 := template2.Default(ctx).Button().SetType(\"reset\").\n\t\t\tSetContent(language.GetFromHtml(\"Reset\")).\n\t\t\tSetThemeWarning().\n\t\t\tSetOrientationLeft().\n\t\t\tGetContent()\n\t\tcol2 := template2.Default(ctx).Col().SetSize(types.SizeMD(8)).\n\t\t\tSetContent(btn1 + btn2).GetContent()\n\t\tpanel := fn(types.NewFormPanel())\n\n\t\toperationHandlerSetter(panel.Callbacks...)\n\n\t\tfields, tabFields, tabHeaders := panel.GetNewFormFields()\n\n\t\treturn true, \"ok\", template2.Default(ctx).Box().\n\t\t\tSetHeader(\"\").\n\t\t\tSetBody(template2.Default(ctx).Form().\n\t\t\t\tSetContent(fields).\n\t\t\t\tSetTabHeaders(tabHeaders).\n\t\t\t\tSetTabContents(tabFields).\n\t\t\t\tSetAjax(panel.AjaxSuccessJS, panel.AjaxErrorJS).\n\t\t\t\tSetPrefix(config.PrefixFixSlash()).\n\t\t\t\tSetUrl(url).\n\t\t\t\tSetOperationFooter(col1 + col2).GetContent()).\n\t\t\t\tSetStyle(template.HTMLAttr(`overflow-x: hidden;overflow-y: hidden;`)).\n\t\t\tGetContent()\n\t}\n\treturn &PopUpAction{\n\t\tUrl:        URL(data.Id),\n\t\tTitle:      data.Title,\n\t\tMethod:     \"post\",\n\t\tBtnTitle:   \"\",\n\t\tHideFooter: true,\n\t\tHeight:     data.Height,\n\t\tWidth:      data.Width,\n\t\tDraggable:  true,\n\t\tData:       NewAjaxData(),\n\t\tId:         modalID,\n\t\tHandlers:   context.Handlers{handler.Wrap()},\n\t\tEvent:      EventClick,\n\t}\n}\n\nfunc PopUpWithCtxForm(data PopUpData, fn GetCtxForm, url string) *PopUpAction {\n\tif data.Id == \"\" {\n\t\tpanic(\"wrong popup action parameter, empty id\")\n\t}\n\tmodalID := \"info-popup-model-\" + utils.Uuid(10)\n\n\tvar handler types.Handler = func(ctx *context.Context) (success bool, msg string, res interface{}) {\n\t\tcol1 := template2.Default(ctx).Col().GetContent()\n\t\tbtn1 := template2.Default(ctx).Button().SetType(\"submit\").\n\t\t\tSetContent(language.GetFromHtml(\"Save\")).\n\t\t\tSetThemePrimary().\n\t\t\tSetOrientationRight().\n\t\t\tSetLoadingText(icon.Icon(\"fa-spinner fa-spin\", 2) + language.GetFromHtml(\"Save\")).\n\t\t\tGetContent()\n\t\tbtn2 := template2.Default(ctx).Button().SetType(\"reset\").\n\t\t\tSetContent(language.GetFromHtml(\"Reset\")).\n\t\t\tSetThemeWarning().\n\t\t\tSetOrientationLeft().\n\t\t\tGetContent()\n\t\tcol2 := template2.Default(ctx).Col().SetSize(types.SizeMD(8)).\n\t\t\tSetContent(btn1 + btn2).GetContent()\n\t\tpanel := fn(ctx, types.NewFormPanel())\n\n\t\toperationHandlerSetter(panel.Callbacks...)\n\n\t\tfields, tabFields, tabHeaders := panel.GetNewFormFields()\n\n\t\treturn true, \"ok\", template2.Default(ctx).Box().\n\t\t\tSetHeader(\"\").\n\t\t\tSetBody(template2.Default(ctx).Form().\n\t\t\t\tSetContent(fields).\n\t\t\t\tSetTabHeaders(tabHeaders).\n\t\t\t\tSetTabContents(tabFields).\n\t\t\t\tSetAjax(panel.AjaxSuccessJS, panel.AjaxErrorJS).\n\t\t\t\tSetPrefix(config.PrefixFixSlash()).\n\t\t\t\tSetUrl(url).\n\t\t\t\tSetOperationFooter(col1 + col2).GetContent()).\n\t\t\tGetContent()\n\t}\n\treturn &PopUpAction{\n\t\tUrl:        URL(data.Id),\n\t\tTitle:      data.Title,\n\t\tMethod:     \"post\",\n\t\tBtnTitle:   \"\",\n\t\tHideFooter: true,\n\t\tHeight:     data.Height,\n\t\tWidth:      data.Width,\n\t\tDraggable:  true,\n\t\tData:       NewAjaxData(),\n\t\tId:         modalID,\n\t\tHandlers:   context.Handlers{handler.Wrap()},\n\t\tEvent:      EventClick,\n\t}\n}\n\nfunc (pop *PopUpAction) SetBtnTitle(title template.HTML) *PopUpAction {\n\tpop.BtnTitle = title\n\treturn pop\n}\n\nfunc (pop *PopUpAction) SetEvent(event Event) *PopUpAction {\n\tpop.Event = event\n\treturn pop\n}\n\nfunc (pop *PopUpAction) SetMethod(method string) *PopUpAction {\n\tpop.Method = method\n\treturn pop\n}\n\nfunc (pop *PopUpAction) GetCallbacks() context.Node {\n\treturn context.Node{\n\t\tPath:     pop.Url,\n\t\tMethod:   pop.Method,\n\t\tHandlers: pop.Handlers,\n\t\tValue:    map[string]interface{}{constant.ContextNodeNeedAuth: 1},\n\t}\n}\n\nfunc (pop *PopUpAction) Js() template.JS {\n\treturn template.JS(`$('`+pop.BtnId+`').on('`+string(pop.Event)+`', function (event) {\n\t\t\t\t\t\tlet data = `+pop.Data.JSON()+`;\n\t\t\t\t\t\t`) + pop.ParameterJS + template.JS(`\n\t\t\t\t\t\tlet id = $(this).attr(\"data-id\");\n\t\t\t\t\t\tif (id && id !== \"\") {\n\t\t\t\t\t\t\tdata[\"id\"] = id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata['popup_id'] = \"`+pop.Id+`\"\n\t\t\t\t\t\t$.ajax({\n                            method: '`+pop.Method+`',\n                            url: \"`+pop.Url+`\",\n                            data: data,\n                            success: function (data) {\n                                if (typeof (data) === \"string\") {\n                                    data = JSON.parse(data);\n                                }\n                                if (data.code === 0) {\n                                    $('#`+pop.Id+` .modal-body').html(data.data);\n                                } else {\n                                    swal(data.msg, '', 'error');\n                                }\n                            },\n\t\t\t\t\t\t\terror: function (data) {\n\t\t\t\t\t\t\t\tif (data.responseText !== \"\") {\n\t\t\t\t\t\t\t\t\tswal(data.responseJSON.msg, '', 'error');\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tswal('error', '', 'error');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\t$('#`+pop.Id+`').hide();\n\t\t\t\t\t\t\t\t\t$('.modal-backdrop.fade.in').hide();\n\t\t\t\t\t\t\t\t}, 500)\n\t\t\t\t\t\t\t},\n                        });\n            \t\t});`)\n}\n\nfunc (pop *PopUpAction) BtnAttribute() template.HTML {\n\treturn template.HTML(`data-toggle=\"modal\" data-target=\"#` + pop.Id + ` \" data-id=\"{{.Id}}\" style=\"cursor: pointer;\"`)\n}\n\nfunc (pop *PopUpAction) FooterContent(ctx *context.Context) template.HTML {\n\tup := template2.Default(ctx).Popup().SetID(pop.Id).\n\t\tSetTitle(template.HTML(pop.Title)).\n\t\tSetFooter(pop.BtnTitle).\n\t\tSetWidth(pop.Width).\n\t\tSetHeight(pop.Height).\n\t\tSetBody(template.HTML(``))\n\n\tif pop.Draggable {\n\t\tif pop.HideFooter {\n\t\t\tup = up.SetHideFooter()\n\t\t}\n\t\treturn up.SetDraggable().GetContent()\n\t}\n\n\treturn up.GetContent()\n}\n\nfunc isFormURL(s string) bool {\n\treg, _ := regexp.Compile(\"(.*)info/(.*)/(new|edit)(.*?)\")\n\treturn reg.MatchString(s)\n}\n"
  },
  {
    "path": "template/types/button.go",
    "content": "package types\n\nimport (\n\t\"html/template\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n)\n\ntype Button interface {\n\tContent(ctx *context.Context) (template.HTML, template.JS)\n\tGetAction() Action\n\tURL() string\n\tMETHOD() string\n\tID() string\n\tType() string\n\tGetName() string\n\tSetName(name string)\n\tIsType(t string) bool\n}\n\ntype BaseButton struct {\n\tId, Url, Method, Name, TypeName string\n\tTitle                           template.HTML\n\tAction                          Action\n}\n\nfunc (b *BaseButton) Content() (template.HTML, template.JS) { return \"\", \"\" }\nfunc (b *BaseButton) GetAction() Action                     { return b.Action }\nfunc (b *BaseButton) ID() string                            { return b.Id }\nfunc (b *BaseButton) URL() string                           { return b.Url }\nfunc (b *BaseButton) Type() string                          { return b.TypeName }\nfunc (b *BaseButton) IsType(t string) bool                  { return b.TypeName == t }\nfunc (b *BaseButton) METHOD() string                        { return b.Method }\nfunc (b *BaseButton) GetName() string                       { return b.Name }\nfunc (b *BaseButton) SetName(name string)                   { b.Name = name }\n\ntype DefaultButton struct {\n\t*BaseButton\n\tColor     template.HTML\n\tTextColor template.HTML\n\tIcon      string\n\tDirection template.HTML\n\tGroup     bool\n}\n\nfunc GetDefaultButton(title template.HTML, icon string, action Action, colors ...template.HTML) *DefaultButton {\n\treturn defaultButton(title, \"right\", icon, action, false, colors...)\n}\n\nfunc GetDefaultButtonGroup(title template.HTML, icon string, action Action, colors ...template.HTML) *DefaultButton {\n\treturn defaultButton(title, \"right\", icon, action, true, colors...)\n}\n\nfunc defaultButton(title, direction template.HTML, icon string, action Action, group bool, colors ...template.HTML) *DefaultButton {\n\tid := btnUUID()\n\taction.SetBtnId(\".\" + id)\n\n\tvar color, textColor template.HTML\n\tif len(colors) > 0 {\n\t\tcolor = colors[0]\n\t}\n\tif len(colors) > 1 {\n\t\ttextColor = colors[1]\n\t}\n\tnode := action.GetCallbacks()\n\treturn &DefaultButton{\n\t\tBaseButton: &BaseButton{\n\t\t\tId:     id,\n\t\t\tTitle:  title,\n\t\t\tAction: action,\n\t\t\tUrl:    node.Path,\n\t\t\tMethod: node.Method,\n\t\t},\n\t\tGroup:     group,\n\t\tColor:     color,\n\t\tTextColor: textColor,\n\t\tIcon:      icon,\n\t\tDirection: direction,\n\t}\n}\n\nfunc GetColumnButton(title template.HTML, icon string, action Action, colors ...template.HTML) *DefaultButton {\n\treturn defaultButton(title, \"\", icon, action, true, colors...)\n}\n\nfunc (b *DefaultButton) Content(ctx *context.Context) (template.HTML, template.JS) {\n\n\tcolor := template.HTML(\"\")\n\tif b.Color != template.HTML(\"\") {\n\t\tcolor = template.HTML(`background-color:`) + b.Color + template.HTML(`;`)\n\t}\n\ttextColor := template.HTML(\"\")\n\tif b.TextColor != template.HTML(\"\") {\n\t\ttextColor = template.HTML(`color:`) + b.TextColor + template.HTML(`;`)\n\t}\n\n\tstyle := template.HTML(\"\")\n\taddColor := color + textColor\n\n\tif addColor != template.HTML(\"\") {\n\t\tstyle = template.HTML(`style=\"`) + addColor + template.HTML(`\"`)\n\t}\n\n\th := template.HTML(\"\")\n\tif b.Group {\n\t\th += `<div class=\"btn-group pull-` + b.Direction + `\" style=\"margin-right: 10px\">`\n\t}\n\n\th += `<a ` + style + ` class=\"` + template.HTML(b.Id) + ` btn btn-sm btn-default ` + b.Action.BtnClass() + `\" ` + b.Action.BtnAttribute() + `>\n                    <i class=\"fa ` + template.HTML(b.Icon) + `\"></i>&nbsp;&nbsp;` + b.Title + `\n                </a>`\n\tif b.Group {\n\t\th += `</div>`\n\t}\n\treturn h + b.Action.ExtContent(ctx), b.Action.Js()\n}\n\ntype ActionButton struct {\n\t*BaseButton\n}\n\nfunc GetActionButton(title template.HTML, action Action, ids ...string) *ActionButton {\n\n\tid := \"\"\n\tif len(ids) > 0 {\n\t\tid = ids[0]\n\t} else {\n\t\tid = \"action-info-btn-\" + utils.Uuid(10)\n\t}\n\n\taction.SetBtnId(\".\" + id)\n\tnode := action.GetCallbacks()\n\n\treturn &ActionButton{\n\t\tBaseButton: &BaseButton{\n\t\t\tId:     id,\n\t\t\tTitle:  title,\n\t\t\tAction: action,\n\t\t\tUrl:    node.Path,\n\t\t\tMethod: node.Method,\n\t\t},\n\t}\n}\n\nfunc (b *ActionButton) Content(ctx *context.Context) (template.HTML, template.JS) {\n\th := template.HTML(`<li style=\"cursor: pointer;\"><a data-id=\"{{.Id}}\" class=\"`+template.HTML(b.Id)+` `+\n\t\tb.Action.BtnClass()+`\" `+b.Action.BtnAttribute()+`>`+b.Title+`</a></li>`) + b.Action.ExtContent(ctx)\n\treturn h, b.Action.Js()\n}\n\ntype ActionIconButton struct {\n\tIcon template.HTML\n\t*BaseButton\n}\n\nfunc GetActionIconButton(icon string, action Action, ids ...string) *ActionIconButton {\n\n\tid := \"\"\n\tif len(ids) > 0 {\n\t\tid = ids[0]\n\t} else {\n\t\tid = \"action-info-btn-\" + utils.Uuid(10)\n\t}\n\n\taction.SetBtnId(\".\" + id)\n\tnode := action.GetCallbacks()\n\n\treturn &ActionIconButton{\n\t\tIcon: template.HTML(icon),\n\t\tBaseButton: &BaseButton{\n\t\t\tId:     id,\n\t\t\tAction: action,\n\t\t\tUrl:    node.Path,\n\t\t\tMethod: node.Method,\n\t\t},\n\t}\n}\n\nfunc (b *ActionIconButton) Content(ctx *context.Context) (template.HTML, template.JS) {\n\th := template.HTML(`<a data-id=\"{{.Id}}\" class=\"`+template.HTML(b.Id)+` `+\n\t\tb.Action.BtnClass()+`\" `+b.Action.BtnAttribute()+`><i class=\"fa `+b.Icon+`\" style=\"font-size: 16px;\"></i></a>`) + b.Action.ExtContent(ctx)\n\treturn h, b.Action.Js()\n}\n\ntype Buttons []Button\n\nfunc (b Buttons) Add(btn Button) Buttons {\n\treturn append(b, btn)\n}\n\nfunc (b Buttons) Content(ctx *context.Context) (template.HTML, template.JS) {\n\th := template.HTML(\"\")\n\tj := template.JS(\"\")\n\n\tfor _, btn := range b {\n\t\thh, jj := btn.Content(ctx)\n\t\th += hh\n\t\tj += jj\n\t}\n\treturn h, j\n}\n\nfunc (b Buttons) Copy() Buttons {\n\tvar c = make(Buttons, len(b))\n\tcopy(c, b)\n\treturn c\n}\n\nfunc (b Buttons) FooterContent(ctx *context.Context) template.HTML {\n\tfooter := template.HTML(\"\")\n\n\tfor _, btn := range b {\n\t\tfooter += btn.GetAction().FooterContent(ctx)\n\t}\n\treturn footer\n}\n\nfunc (b Buttons) CheckPermission(user models.UserModel) Buttons {\n\tbtns := make(Buttons, 0)\n\tfor _, btn := range b {\n\t\tif btn.IsType(ButtonTypeNavDropDown) {\n\t\t\titems := make([]Button, 0)\n\t\t\tfor _, navItem := range btn.(*NavDropDownButton).Items {\n\t\t\t\tif user.CheckPermissionByUrlMethod(btn.URL(), btn.METHOD(), url.Values{}) {\n\t\t\t\t\titems = append(items, navItem)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif len(items) > 0 {\n\t\t\t\tbtns = append(btns, btn)\n\t\t\t}\n\t\t} else if user.CheckPermissionByUrlMethod(btn.URL(), btn.METHOD(), url.Values{}) {\n\t\t\tbtns = append(btns, btn)\n\t\t}\n\t}\n\treturn btns\n}\n\nfunc (b Buttons) CheckPermissionWhenURLAndMethodNotEmpty(user models.UserModel) Buttons {\n\tbtns := make(Buttons, 0)\n\tfor _, b := range b {\n\t\tif b.URL() == \"\" || b.METHOD() == \"\" || user.CheckPermissionByUrlMethod(b.URL(), b.METHOD(), url.Values{}) {\n\t\t\tbtns = append(btns, b)\n\t\t}\n\t}\n\treturn btns\n}\n\nfunc (b Buttons) AddNavButton(ico, name string, action Action) Buttons {\n\tif !b.CheckExist(name) {\n\t\treturn append(b, GetNavButton(language.GetFromHtml(template.HTML(name)), ico, action, name))\n\t}\n\treturn b\n}\n\nfunc (b Buttons) RemoveButtonByName(name string) Buttons {\n\tif name == \"\" {\n\t\treturn b\n\t}\n\n\tfor i := 0; i < len(b); i++ {\n\t\tif b[i].GetName() == name {\n\t\t\tb = append(b[:i], b[i+1:]...)\n\t\t}\n\t}\n\treturn b\n}\n\nfunc (b Buttons) CheckExist(name string) bool {\n\tif name == \"\" {\n\t\treturn false\n\t}\n\tfor i := 0; i < len(b); i++ {\n\t\tif b[i].GetName() == name {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (b Buttons) Callbacks() []context.Node {\n\tcbs := make([]context.Node, 0)\n\tfor _, btn := range b {\n\t\tcbs = append(cbs, btn.GetAction().GetCallbacks())\n\t}\n\treturn cbs\n}\n\nconst (\n\tNavBtnSiteName = \"site setting\"\n\tNavBtnInfoName = \"site info\"\n\tNavBtnToolName = \"code generate tool\"\n\tNavBtnPlugName = \"plugins\"\n)\n\nfunc (b Buttons) RemoveSiteNavButton() Buttons {\n\treturn b.RemoveButtonByName(NavBtnSiteName)\n}\n\nfunc (b Buttons) RemoveInfoNavButton() Buttons {\n\treturn b.RemoveButtonByName(NavBtnInfoName)\n}\n\nfunc (b Buttons) RemoveToolNavButton() Buttons {\n\treturn b.RemoveButtonByName(NavBtnToolName)\n}\n\nfunc (b Buttons) RemovePlugNavButton() Buttons {\n\treturn b.RemoveButtonByName(NavBtnPlugName)\n}\n\ntype NavButton struct {\n\t*BaseButton\n\tIcon string\n}\n\nfunc GetNavButton(title template.HTML, icon string, action Action, names ...string) *NavButton {\n\n\tid := btnUUID()\n\taction.SetBtnId(\".\" + id)\n\tnode := action.GetCallbacks()\n\tname := \"\"\n\n\tif len(names) > 0 {\n\t\tname = names[0]\n\t}\n\n\treturn &NavButton{\n\t\tBaseButton: &BaseButton{\n\t\t\tId:     id,\n\t\t\tTitle:  title,\n\t\t\tAction: action,\n\t\t\tUrl:    node.Path,\n\t\t\tMethod: node.Method,\n\t\t\tName:   name,\n\t\t},\n\t\tIcon: icon,\n\t}\n}\n\nfunc (n *NavButton) Content(ctx *context.Context) (template.HTML, template.JS) {\n\n\tico := template.HTML(\"\")\n\ttitle := template.HTML(\"\")\n\n\tif n.Icon != \"\" {\n\t\tico = template.HTML(`<i class=\"fa ` + n.Icon + `\"></i>`)\n\t}\n\n\tif n.Title != \"\" {\n\t\ttitle = `<span>` + n.Title + `</span>`\n\t}\n\n\th := template.HTML(`<li>\n    <a class=\"`+template.HTML(n.Id)+` `+n.Action.BtnClass()+` dropdown-item\" `+n.Action.BtnAttribute()+`>\n      `+ico+`\n      `+title+`\n    </a>\n</li>`) + n.Action.ExtContent(ctx)\n\treturn h, n.Action.Js()\n}\n\ntype NavDropDownButton struct {\n\t*BaseButton\n\tIcon  string\n\tItems []*NavDropDownItemButton\n}\n\ntype NavDropDownItemButton struct {\n\t*BaseButton\n}\n\nfunc GetDropDownButton(title template.HTML, icon string, items []*NavDropDownItemButton, names ...string) *NavDropDownButton {\n\tid := btnUUID()\n\tname := \"\"\n\n\tif len(names) > 0 {\n\t\tname = names[0]\n\t}\n\n\treturn &NavDropDownButton{\n\t\tBaseButton: &BaseButton{\n\t\t\tId:       id,\n\t\t\tTitle:    title,\n\t\t\tName:     name,\n\t\t\tTypeName: ButtonTypeNavDropDown,\n\t\t\tAction:   new(NilAction),\n\t\t},\n\t\tItems: items,\n\t\tIcon:  icon,\n\t}\n}\n\nfunc (n *NavDropDownButton) SetItems(items []*NavDropDownItemButton) {\n\tn.Items = items\n}\n\nfunc (n *NavDropDownButton) AddItem(item *NavDropDownItemButton) {\n\tn.Items = append(n.Items, item)\n}\n\nfunc (n *NavDropDownButton) Content(ctx *context.Context) (template.HTML, template.JS) {\n\n\tico := template.HTML(\"\")\n\ttitle := template.HTML(\"\")\n\n\tif n.Icon != \"\" {\n\t\tico = template.HTML(`<i class=\"fa ` + n.Icon + `\"></i>`)\n\t}\n\n\tif n.Title != \"\" {\n\t\ttitle = `<span>` + n.Title + `</span>`\n\t}\n\n\tcontent := template.HTML(\"\")\n\tjs := template.JS(\"\")\n\n\tfor _, item := range n.Items {\n\t\tc, j := item.Content(ctx)\n\t\tcontent += c\n\t\tjs += j\n\t}\n\n\tdid := utils.Uuid(10)\n\n\th := template.HTML(`<li class=\"dropdown\" id=\"` + template.HTML(did) + `\">\n    <a class=\"` + template.HTML(n.Id) + ` dropdown-toggle\" data-toggle=\"dropdown\" style=\"cursor:pointer;\">\n      ` + ico + `\n      ` + title + `\n    </a>\n\t<ul class=\"dropdown-menu\"  aria-labelledby=\"` + template.HTML(did) + `\">\n    \t` + content + `\n\t</ul>\n</li>`)\n\n\treturn h, js\n}\n\nconst (\n\tButtonTypeNavDropDownItem = \"navdropdownitem\"\n\tButtonTypeNavDropDown     = \"navdropdown\"\n)\n\nfunc GetDropDownItemButton(title template.HTML, action Action, names ...string) *NavDropDownItemButton {\n\tid := btnUUID()\n\taction.SetBtnId(\".\" + id)\n\tnode := action.GetCallbacks()\n\tname := \"\"\n\n\tif len(names) > 0 {\n\t\tname = names[0]\n\t}\n\n\treturn &NavDropDownItemButton{\n\t\tBaseButton: &BaseButton{\n\t\t\tId:       id,\n\t\t\tTitle:    title,\n\t\t\tAction:   action,\n\t\t\tUrl:      node.Path,\n\t\t\tMethod:   node.Method,\n\t\t\tName:     name,\n\t\t\tTypeName: ButtonTypeNavDropDownItem,\n\t\t},\n\t}\n}\n\nfunc (n *NavDropDownItemButton) Content(ctx *context.Context) (template.HTML, template.JS) {\n\n\ttitle := template.HTML(\"\")\n\n\tif n.Title != \"\" {\n\t\ttitle = `<span>` + n.Title + `</span>`\n\t}\n\n\th := template.HTML(`<li><a class=\"dropdown-item `+template.HTML(n.Id)+` `+\n\t\tn.Action.BtnClass()+`\" `+n.Action.BtnAttribute()+`>\n      `+title+`\n</a></li>`) + n.Action.ExtContent(ctx)\n\treturn h, n.Action.Js()\n}\n"
  },
  {
    "path": "template/types/components.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage types\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\ntype FormAttribute interface {\n\tSetHeader(value template.HTML) FormAttribute\n\tSetContent(value FormFields) FormAttribute\n\tSetTabContents(value []FormFields) FormAttribute\n\tSetTabHeaders(value []string) FormAttribute\n\tSetFooter(value template.HTML) FormAttribute\n\tSetPrefix(value string) FormAttribute\n\tSetUrl(value string) FormAttribute\n\tSetPrimaryKey(value string) FormAttribute\n\tSetHorizontal(value bool) FormAttribute\n\tSetId(id string) FormAttribute\n\tSetAjax(successJS, errorJS template.JS) FormAttribute\n\tSetHiddenFields(fields map[string]string) FormAttribute\n\tSetFieldsHTML(html template.HTML) FormAttribute\n\tSetMethod(value string) FormAttribute\n\tSetHeadWidth(width int) FormAttribute\n\tSetInputWidth(width int) FormAttribute\n\tSetTitle(value template.HTML) FormAttribute\n\tSetLayout(layout form.Layout) FormAttribute\n\tSetOperationFooter(value template.HTML) FormAttribute\n\tGetDefaultBoxHeader(hideBack bool) template.HTML\n\tGetDetailBoxHeader(editUrl, deleteUrl string) template.HTML\n\tGetBoxHeaderNoButton() template.HTML\n\tGetContent() template.HTML\n}\n\ntype BoxAttribute interface {\n\tSetHeader(value template.HTML) BoxAttribute\n\tSetBody(value template.HTML) BoxAttribute\n\tSetNoPadding() BoxAttribute\n\tSetFooter(value template.HTML) BoxAttribute\n\tSetTitle(value template.HTML) BoxAttribute\n\tWithHeadBorder() BoxAttribute\n\tSetIframeStyle(iframe bool) BoxAttribute\n\tSetAttr(attr template.HTMLAttr) BoxAttribute\n\tSetStyle(value template.HTMLAttr) BoxAttribute\n\tSetHeadColor(value string) BoxAttribute\n\tSetClass(value string) BoxAttribute\n\tSetTheme(value string) BoxAttribute\n\tSetSecondHeader(value template.HTML) BoxAttribute\n\tSetSecondHeadColor(value string) BoxAttribute\n\tWithSecondHeadBorder() BoxAttribute\n\tSetSecondHeaderClass(value string) BoxAttribute\n\tGetContent() template.HTML\n}\n\ntype ColAttribute interface {\n\tSetSize(value S) ColAttribute\n\tSetContent(value template.HTML) ColAttribute\n\tAddContent(value template.HTML) ColAttribute\n\tGetContent() template.HTML\n}\n\ntype ImgAttribute interface {\n\tSetWidth(value string) ImgAttribute\n\tSetHeight(value string) ImgAttribute\n\tWithModal() ImgAttribute\n\tSetSrc(value template.HTML) ImgAttribute\n\tGetContent() template.HTML\n}\n\ntype LabelAttribute interface {\n\tSetContent(value template.HTML) LabelAttribute\n\tSetColor(value template.HTML) LabelAttribute\n\tSetType(value string) LabelAttribute\n\tGetContent() template.HTML\n}\n\ntype RowAttribute interface {\n\tSetContent(value template.HTML) RowAttribute\n\tAddContent(value template.HTML) RowAttribute\n\tGetContent() template.HTML\n}\n\ntype ButtonAttribute interface {\n\tSetContent(value template.HTML) ButtonAttribute\n\tSetOrientationRight() ButtonAttribute\n\tSetOrientationLeft() ButtonAttribute\n\tSetMarginLeft(int) ButtonAttribute\n\tSetMarginRight(int) ButtonAttribute\n\tSetThemePrimary() ButtonAttribute\n\tSetSmallSize() ButtonAttribute\n\tAddClass(class string) ButtonAttribute\n\tSetID(id string) ButtonAttribute\n\tSetMiddleSize() ButtonAttribute\n\tSetHref(string) ButtonAttribute\n\tSetThemeWarning() ButtonAttribute\n\tSetTheme(value string) ButtonAttribute\n\tSetLoadingText(value template.HTML) ButtonAttribute\n\tSetThemeDefault() ButtonAttribute\n\tSetType(string) ButtonAttribute\n\tGetContent() template.HTML\n}\n\ntype TableAttribute interface {\n\tSetThead(value Thead) TableAttribute\n\tSetInfoList(value []map[string]InfoItem) TableAttribute\n\tSetType(value string) TableAttribute\n\tSetName(name string) TableAttribute\n\tSetMinWidth(value string) TableAttribute\n\tSetHideThead() TableAttribute\n\tSetSticky(sticky bool) TableAttribute\n\tSetLayout(value string) TableAttribute\n\tSetStyle(style string) TableAttribute\n\tGetContent() template.HTML\n}\n\ntype DataTableAttribute interface {\n\tGetDataTableHeader() template.HTML\n\tSetThead(value Thead) DataTableAttribute\n\tSetInfoList(value []map[string]InfoItem) DataTableAttribute\n\tSetEditUrl(value string) DataTableAttribute\n\tSetDeleteUrl(value string) DataTableAttribute\n\tSetNewUrl(value string) DataTableAttribute\n\tSetPrimaryKey(value string) DataTableAttribute\n\tSetStyle(style string) DataTableAttribute\n\tSetAction(action template.HTML) DataTableAttribute\n\tSetIsTab(value bool) DataTableAttribute\n\tSetActionFold(fold bool) DataTableAttribute\n\tSetHideThead() DataTableAttribute\n\tSetLayout(value string) DataTableAttribute\n\tSetButtons(btns template.HTML) DataTableAttribute\n\tSetSticky(sticky bool) DataTableAttribute\n\tSetHideFilterArea(value bool) DataTableAttribute\n\tSetHideRowSelector(value bool) DataTableAttribute\n\tSetActionJs(aj template.JS) DataTableAttribute\n\tSetNoAction() DataTableAttribute\n\tSetInfoUrl(value string) DataTableAttribute\n\tSetDetailUrl(value string) DataTableAttribute\n\tSetHasFilter(hasFilter bool) DataTableAttribute\n\tSetSortUrl(value string) DataTableAttribute\n\tSetExportUrl(value string) DataTableAttribute\n\tSetUpdateUrl(value string) DataTableAttribute\n\tGetContent() template.HTML\n}\n\ntype TreeAttribute interface {\n\tSetTree(value []menu.Item) TreeAttribute\n\tSetEditUrl(value string) TreeAttribute\n\tSetOrderUrl(value string) TreeAttribute\n\tSetUrlPrefix(value string) TreeAttribute\n\tSetDeleteUrl(value string) TreeAttribute\n\tGetContent() template.HTML\n\tGetTreeHeader() template.HTML\n}\n\ntype TreeViewAttribute interface {\n\tSetTree(value TreeViewData) TreeViewAttribute\n\tSetUrlPrefix(value string) TreeViewAttribute\n\tSetID(id string) TreeViewAttribute\n\tGetContent() template.HTML\n}\n\ntype PaginatorAttribute interface {\n\tSetCurPageStartIndex(value string) PaginatorAttribute\n\tSetCurPageEndIndex(value string) PaginatorAttribute\n\tSetTotal(value string) PaginatorAttribute\n\tSetPreviousClass(value string) PaginatorAttribute\n\tSetPreviousUrl(value string) PaginatorAttribute\n\tSetPages(value []map[string]string) PaginatorAttribute\n\tSetPageSizeList(value []string) PaginatorAttribute\n\tSetNextClass(value string) PaginatorAttribute\n\tSetNextUrl(value string) PaginatorAttribute\n\tSetOption(value map[string]template.HTML) PaginatorAttribute\n\tSetUrl(value string) PaginatorAttribute\n\tSetExtraInfo(value template.HTML) PaginatorAttribute\n\tSetEntriesInfo(value template.HTML) PaginatorAttribute\n\tGetContent() template.HTML\n}\n\ntype TabsAttribute interface {\n\tSetData(value []map[string]template.HTML) TabsAttribute\n\tGetContent() template.HTML\n}\n\ntype AlertAttribute interface {\n\tSetTheme(value string) AlertAttribute\n\tSetTitle(value template.HTML) AlertAttribute\n\tSetContent(value template.HTML) AlertAttribute\n\tWarning(msg string) template.HTML\n\tGetContent() template.HTML\n}\n\ntype LinkAttribute interface {\n\tOpenInNewTab() LinkAttribute\n\tSetURL(value string) LinkAttribute\n\tSetAttributes(attr template.HTMLAttr) LinkAttribute\n\tSetClass(class template.HTML) LinkAttribute\n\tNoPjax() LinkAttribute\n\tSetTabTitle(value template.HTML) LinkAttribute\n\tSetContent(value template.HTML) LinkAttribute\n\tGetContent() template.HTML\n}\n\ntype PopupAttribute interface {\n\tSetID(value string) PopupAttribute\n\tSetTitle(value template.HTML) PopupAttribute\n\tSetDraggable() PopupAttribute\n\tSetHideFooter() PopupAttribute\n\tSetWidth(width string) PopupAttribute\n\tSetHeight(height string) PopupAttribute\n\tSetFooter(value template.HTML) PopupAttribute\n\tSetFooterHTML(value template.HTML) PopupAttribute\n\tSetBody(value template.HTML) PopupAttribute\n\tSetSize(value string) PopupAttribute\n\tGetContent() template.HTML\n}\n\ntype PanelInfo struct {\n\tThead    Thead    `json:\"thead\"`\n\tInfoList InfoList `json:\"info_list\"`\n}\n\ntype Thead []TheadItem\n\ntype TheadItem struct {\n\tHead       string       `json:\"head\"`\n\tSortable   bool         `json:\"sortable\"`\n\tField      string       `json:\"field\"`\n\tHide       bool         `json:\"hide\"`\n\tEditable   bool         `json:\"editable\"`\n\tEditType   string       `json:\"edit_type\"`\n\tEditOption FieldOptions `json:\"edit_option\"`\n\tWidth      string       `json:\"width\"`\n}\n\nfunc (t Thead) GroupBy(group [][]string) []Thead {\n\tvar res = make([]Thead, len(group))\n\n\tfor key, value := range group {\n\t\tvar newThead = make(Thead, 0)\n\n\t\tfor _, info := range t {\n\t\t\tif modules.InArray(value, info.Field) {\n\t\t\t\tnewThead = append(newThead, info)\n\t\t\t}\n\t\t}\n\n\t\tres[key] = newThead\n\t}\n\n\treturn res\n}\n\ntype TreeViewData struct {\n\tData              TreeViewItems `json:\"data,omitempty\"`\n\tLevels            int           `json:\"levels,omitempty\"`\n\tBackColor         string        `json:\"backColor,omitempty\"`\n\tBorderColor       string        `json:\"borderColor,omitempty\"`\n\tCheckedIcon       string        `json:\"checkedIcon,omitempty\"`\n\tCollapseIcon      string        `json:\"collapseIcon,omitempty\"`\n\tColor             string        `json:\"color,omitempty\"`\n\tEmptyIcon         string        `json:\"emptyIcon,omitempty\"`\n\tEnableLinks       bool          `json:\"enableLinks,omitempty\"`\n\tExpandIcon        string        `json:\"expandIcon,omitempty\"`\n\tMultiSelect       bool          `json:\"multiSelect,omitempty\"`\n\tNodeIcon          string        `json:\"nodeIcon,omitempty\"`\n\tOnhoverColor      string        `json:\"onhoverColor,omitempty\"`\n\tSelectedIcon      string        `json:\"selectedIcon,omitempty\"`\n\tSearchResultColor string        `json:\"searchResultColor,omitempty\"`\n\tSelectedBackColor string        `json:\"selectedBackColor,omitempty\"`\n\tSelectedColor     string        `json:\"selectedColor,omitempty\"`\n\tShowBorder        bool          `json:\"showBorder,omitempty\"`\n\tShowCheckbox      bool          `json:\"showCheckbox,omitempty\"`\n\tShowIcon          bool          `json:\"showIcon,omitempty\"`\n\tShowTags          bool          `json:\"showTags,omitempty\"`\n\tUncheckedIcon     string        `json:\"uncheckedIcon,omitempty\"`\n\n\tSearchResultBackColor  string `json:\"searchResultBackColor,omitempty\"`\n\tHighlightSearchResults bool   `json:\"highlightSearchResults,omitempty\"`\n}\n\ntype TreeViewItems []TreeViewItem\n\ntype TreeViewItemState struct {\n\tChecked  bool `json:\"checked,omitempty\"`\n\tDisabled bool `json:\"disabled,omitempty\"`\n\tExpanded bool `json:\"expanded,omitempty\"`\n\tSelected bool `json:\"selected,omitempty\"`\n}\n\ntype TreeViewItem struct {\n\tText         string            `json:\"text,omitempty\"`\n\tIcon         string            `json:\"icon,omitempty\"`\n\tSelectedIcon string            `json:\"selected_icon,omitempty\"`\n\tColor        string            `json:\"color,omitempty\"`\n\tBackColor    string            `json:\"backColor,omitempty\"`\n\tHref         string            `json:\"href,omitempty\"`\n\tSelectable   bool              `json:\"selectable,omitempty\"`\n\tState        TreeViewItemState `json:\"state,omitempty\"`\n\tTags         []string          `json:\"tags,omitempty\"`\n\tNodes        TreeViewItems     `json:\"nodes,omitempty\"`\n}\n"
  },
  {
    "path": "template/types/display/base.go",
    "content": "package display\n"
  },
  {
    "path": "template/types/display/bool.go",
    "content": "package display\n\nimport (\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/html\"\n)\n\ntype Bool struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"bool\", new(Bool))\n}\n\nfunc (b *Bool) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tparams := args[0].([]string)\n\t\tpass := icon.IconWithStyle(icon.Check, html.Style{\n\t\t\t\"color\": \"green\",\n\t\t})\n\t\tfail := icon.IconWithStyle(icon.Remove, html.Style{\n\t\t\t\"color\": \"red\",\n\t\t})\n\t\tif len(params) == 0 {\n\t\t\tif value.Value == \"0\" || strings.ToLower(value.Value) == \"false\" {\n\t\t\t\treturn fail\n\t\t\t}\n\t\t\treturn pass\n\t\t} else if len(params) == 1 {\n\t\t\tif value.Value == params[0] {\n\t\t\t\treturn pass\n\t\t\t}\n\t\t\treturn fail\n\t\t} else {\n\t\t\tif value.Value == params[0] {\n\t\t\t\treturn pass\n\t\t\t}\n\t\t\tif value.Value == params[1] {\n\t\t\t\treturn fail\n\t\t\t}\n\t\t}\n\t\treturn \"\"\n\t}\n}\n"
  },
  {
    "path": "template/types/display/carousel.go",
    "content": "package display\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Carousel struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"carousel\", new(Carousel))\n}\n\nfunc (c *Carousel) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tfn := args[0].(types.FieldGetImgArrFn)\n\t\tsize := args[1].([]int)\n\n\t\twidth := \"300\"\n\t\theight := \"200\"\n\n\t\tif len(size) > 0 {\n\t\t\twidth = strconv.Itoa(size[0])\n\t\t}\n\n\t\tif len(size) > 1 {\n\t\t\theight = strconv.Itoa(size[1])\n\t\t}\n\n\t\timages := fn(value.Value)\n\n\t\tindicators := \"\"\n\t\titems := \"\"\n\t\tactive := \"\"\n\n\t\tfor i, img := range images {\n\t\t\tindicators += `<li data-target=\"#carousel-value-` + value.ID + `\" data-slide-to=\"` +\n\t\t\t\tstrconv.Itoa(i) + `\" class=\"\"></li>`\n\t\t\tif i == 0 {\n\t\t\t\tactive = \" active\"\n\t\t\t} else {\n\t\t\t\tactive = \"\"\n\t\t\t}\n\t\t\titems += `<div class=\"item` + active + `\">\n            <img src=\"` + img + `\" alt=\"\" \nstyle=\"max-width:` + width + `px;max-height:` + height + `px;display: block;margin-left: auto;margin-right: auto;\" />\n            <div class=\"carousel-caption\"></div>\n        </div>`\n\t\t}\n\n\t\treturn template.HTML(`\n<div id=\"carousel-value-` + value.ID + `\" class=\"carousel slide\" data-ride=\"carousel\" width=\"` + width + `\" height=\"` + height + `\" \nstyle=\"padding: 5px;border: 1px solid #f4f4f4;background-color:white;width:` + width + `px;\">\n    <ol class=\"carousel-indicators\">\n\t\t` + indicators + `\n    </ol>\n    <div class=\"carousel-inner\">\n       ` + items + `\n    </div>\n    <a class=\"left carousel-control\" href=\"#carousel-value-` + value.ID + `\" data-slide=\"prev\">\n        <span class=\"fa fa-angle-left\"></span>\n    </a>\n    <a class=\"right carousel-control\" href=\"#carousel-value-` + value.ID + `\" data-slide=\"next\">\n        <span class=\"fa fa-angle-right\"></span>\n    </a>\n</div>\n`)\n\t}\n}\n"
  },
  {
    "path": "template/types/display/copy.go",
    "content": "package display\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Copyable struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"copyable\", new(Copyable))\n}\n\nfunc (c *Copyable) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\treturn template.HTML(`\n<a href=\"javascript:void(0);\" class=\"grid-column-copyable text-muted\" data-content=\"` + value.Value + `\" \ntitle=\"Copied!\" data-placement=\"bottom\">\n<i class=\"fa fa-copy\"></i>\n</a>&nbsp;` + value.Value + `\n`)\n\t}\n}\n\nfunc (c *Copyable) JS() template.HTML {\n\treturn template.HTML(`\n$('body').on('click','.grid-column-copyable',(function (e) {\n\tvar content = $(this).data('content');\n\t\n\tvar temp = $('<input>');\n\t\n\t$(\"body\").append(temp);\n\ttemp.val(content).select();\n\tdocument.execCommand(\"copy\");\n\ttemp.remove();\n\t\n\t$(this).tooltip('show');\n}));\n`)\n}\n"
  },
  {
    "path": "template/types/display/date.go",
    "content": "package display\n\nimport (\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Date struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"date\", new(Date))\n}\n\nfunc (d *Date) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tformat := args[0].(string)\n\t\tts, _ := strconv.ParseInt(value.Value, 10, 64)\n\t\ttm := time.Unix(ts, 0)\n\t\treturn tm.Format(format)\n\t}\n}\n"
  },
  {
    "path": "template/types/display/dot.go",
    "content": "package display\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Dot struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"dot\", new(Dot))\n}\n\nfunc (d *Dot) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\ticons := args[0].(map[string]types.FieldDotColor)\n\t\tdefaultDot := types.FieldDotColor(\"\")\n\t\tif len(args) > 1 {\n\t\t\tdefaultDot = args[1].(types.FieldDotColor)\n\t\t}\n\t\tfor k, style := range icons {\n\t\t\tif k == value.Value {\n\t\t\t\treturn template.HTML(`<span class=\"label-`+style+`\"\n\t\t\t\t\tstyle=\"width: 8px;height: 8px;padding: 0;border-radius: 50%;display: inline-block;\">\n\t\t\t\t\t</span>&nbsp;&nbsp;`) +\n\t\t\t\t\ttemplate.HTML(value.Value)\n\t\t\t}\n\t\t}\n\t\tif defaultDot != \"\" {\n\t\t\treturn template.HTML(`<span class=\"label-`+defaultDot+`\"\n\t\t\t\t\tstyle=\"width: 8px;height: 8px;padding: 0;border-radius: 50%;display: inline-block;\">\n\t\t\t\t\t</span>&nbsp;&nbsp;`) +\n\t\t\t\ttemplate.HTML(value.Value)\n\t\t}\n\t\treturn value.Value\n\t}\n}\n"
  },
  {
    "path": "template/types/display/downloadable.go",
    "content": "package display\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Downloadable struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"downloadable\", new(Downloadable))\n}\n\nfunc (d *Downloadable) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tparam := args[0].([]string)\n\n\t\tu := value.Value\n\n\t\tif len(param) > 0 {\n\t\t\tu = param[0] + u\n\t\t}\n\n\t\treturn template.HTML(`\n<a href=\"` + u + `\" download=\"` + value.Value + `\" target=\"_blank\" class=\"text-muted\">\n\t<i class=\"fa fa-download\"></i> ` + value.Value + `\n</a>\n`)\n\t}\n}\n"
  },
  {
    "path": "template/types/display/filesize.go",
    "content": "package display\n\nimport (\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype FileSize struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"filesize\", new(FileSize))\n}\n\nfunc (f *FileSize) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tsize, _ := strconv.ParseUint(value.Value, 10, 64)\n\t\treturn utils.FileSize(size)\n\t}\n}\n"
  },
  {
    "path": "template/types/display/icon.go",
    "content": "package display\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Icon struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"icon\", new(Icon))\n}\n\nfunc (i *Icon) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\ticons := args[0].(map[string]string)\n\t\tdefaultIcon := \"\"\n\t\tif len(args) > 1 {\n\t\t\tdefaultIcon = args[1].(string)\n\t\t}\n\t\tfor k, iconClass := range icons {\n\t\t\tif k == value.Value {\n\t\t\t\treturn icon.Icon(iconClass)\n\t\t\t}\n\t\t}\n\t\tif defaultIcon != \"\" {\n\t\t\treturn icon.Icon(defaultIcon)\n\t\t}\n\t\treturn value.Value\n\t}\n}\n"
  },
  {
    "path": "template/types/display/image.go",
    "content": "package display\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Image struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"image\", new(Image))\n}\n\nfunc (image *Image) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\tparam := args[2].([]string)\n\treturn func(value types.FieldModel) interface{} {\n\t\tif value.Value == \"\" {\n\t\t\treturn \"\"\n\t\t}\n\t\tif len(param) > 0 {\n\t\t\treturn template.Default(ctx).Image().SetWidth(args[0].(string)).SetHeight(args[1].(string)).\n\t\t\t\tSetSrc(template.HTML(param[0] + value.Value)).GetContent()\n\n\t\t} else {\n\t\t\treturn template.Default(ctx).Image().SetWidth(args[0].(string)).SetHeight(args[1].(string)).\n\t\t\t\tSetSrc(template.HTML(value.Value)).GetContent()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "template/types/display/label.go",
    "content": "package display\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Label struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"label\", new(Label))\n}\n\nfunc (label *Label) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tparams := args[0].([]types.FieldLabelParam)\n\t\tif len(params) == 0 {\n\t\t\treturn template.Default(ctx).Label().\n\t\t\t\tSetContent(template.HTML(value.Value)).\n\t\t\t\tSetType(\"success\").\n\t\t\t\tGetContent()\n\t\t} else if len(params) == 1 {\n\t\t\treturn template.Default(ctx).Label().\n\t\t\t\tSetContent(template.HTML(value.Value)).\n\t\t\t\tSetColor(params[0].Color).\n\t\t\t\tSetType(params[0].Type).\n\t\t\t\tGetContent()\n\t\t}\n\t\treturn \"\"\n\t}\n}\n"
  },
  {
    "path": "template/types/display/link.go",
    "content": "package display\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Link struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"link\", new(Link))\n}\n\nfunc (l *Link) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\tprefix := \"\"\n\topenInNewTabs := false\n\tif len(args) > 0 {\n\t\tprefix = args[0].(string)\n\t}\n\tif len(args) > 1 {\n\t\tif openInNewTabsArr, ok := args[1].([]bool); ok {\n\t\t\topenInNewTabs = openInNewTabsArr[0]\n\t\t}\n\t}\n\treturn func(value types.FieldModel) interface{} {\n\t\tif openInNewTabs {\n\t\t\treturn template.Default(ctx).Link().SetURL(prefix + value.Value).OpenInNewTab().GetContent()\n\t\t} else {\n\t\t\treturn template.Default(ctx).Link().SetURL(prefix + value.Value).GetContent()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "template/types/display/loading.go",
    "content": "package display\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Loading struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"loading\", new(Loading))\n}\n\nfunc (l *Loading) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tparam := args[0].([]string)\n\n\t\tfor i := 0; i < len(param); i++ {\n\t\t\tif value.Value == param[i] {\n\t\t\t\treturn template.HTML(`<i class=\"fa fa-refresh fa-spin text-primary\"></i>`)\n\t\t\t}\n\t\t}\n\n\t\treturn value.Value\n\t}\n}\n"
  },
  {
    "path": "template/types/display/progressbar.go",
    "content": "package display\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype ProgressBar struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"progressbar\", new(ProgressBar))\n}\n\nfunc (p *ProgressBar) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\t\tparam := args[0].([]types.FieldProgressBarData)\n\t\tstyle := \"primary\"\n\t\tsize := \"sm\"\n\t\tmax := 100\n\t\tif len(param) > 0 {\n\t\t\tif param[0].Style != \"\" {\n\t\t\t\tstyle = param[0].Style\n\t\t\t}\n\t\t\tif param[0].Size != \"\" {\n\t\t\t\tsize = param[0].Size\n\t\t\t}\n\t\t\tif param[0].Max != 0 {\n\t\t\t\tmax = param[0].Max\n\t\t\t}\n\t\t}\n\t\tbase, _ := strconv.Atoi(value.Value)\n\t\tper := fmt.Sprintf(\"%.0f\", float32(base)/float32(max)*100)\n\t\treturn template.HTML(`\n<div class=\"row\" style=\"min-width: 100px;\">\n\t<span class=\"col-sm-3\" style=\"color:#777;width: 60px\">` + per + `%</span>\n\t<div class=\"progress progress-` + size + ` col-sm-9\" style=\"padding-left: 0;width: 100px;margin-left: -13px;\">\n\t\t<div class=\"progress-bar progress-bar-` + style + `\" role=\"progressbar\" aria-valuenow=\"1\" \n\t\t\taria-valuemin=\"0\" aria-valuemax=\"` + strconv.Itoa(max) + `\" style=\"width: ` + per + `%\">\n\t\t</div>\n\t</div>\n</div>`)\n\t}\n}\n"
  },
  {
    "path": "template/types/display/qrcode.go",
    "content": "package display\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n)\n\ntype Qrcode struct {\n\ttypes.BaseDisplayFnGenerator\n}\n\nfunc init() {\n\ttypes.RegisterDisplayFnGenerator(\"qrcode\", new(Qrcode))\n}\n\nfunc (q *Qrcode) Get(ctx *context.Context, args ...interface{}) types.FieldFilterFn {\n\treturn func(value types.FieldModel) interface{} {\n\n\t\tsrc := `https://api.qrserver.com/v1/create-qr-code/?size=150x150&amp;data=` + value.Value\n\n\t\treturn template.HTML(`\n<a href=\"javascript:void(0);\" class=\"grid-column-qrcode text-muted\" \n\tdata-content=\"<img src='` + src + `' \nstyle='height:150px;width:150px;'/>\" data-toggle=\"popover\" tabindex=\"0\" data-original-title=\"\" title=\"\">\n<i class=\"fa fa-qrcode\"></i>\n</a>&nbsp;` + value.Value + `\n`)\n\t}\n}\n\nfunc (q *Qrcode) JS() template.HTML {\n\treturn template.HTML(`\n$('.grid-column-qrcode').popover({\n\thtml: true,\n\tcontainer: 'body',\n\ttrigger: 'focus'\n});\n`)\n}\n"
  },
  {
    "path": "template/types/display.go",
    "content": "package types\n\nimport (\n\t\"fmt\"\n\t\"html\"\n\t\"html/template\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n\t\"golang.org/x/text/cases\"\n\t\"golang.org/x/text/language\"\n)\n\ntype DisplayFnGenerator interface {\n\tGet(ctx *context.Context, args ...interface{}) FieldFilterFn\n\tJS() template.HTML\n\tHTML() template.HTML\n}\n\ntype BaseDisplayFnGenerator struct{}\n\nfunc (base *BaseDisplayFnGenerator) JS() template.HTML   { return \"\" }\nfunc (base *BaseDisplayFnGenerator) HTML() template.HTML { return \"\" }\n\nvar displayFnGens = make(map[string]DisplayFnGenerator)\n\nfunc RegisterDisplayFnGenerator(key string, gen DisplayFnGenerator) {\n\tif _, ok := displayFnGens[key]; ok {\n\t\tpanic(\"display function generator has been registered\")\n\t}\n\tdisplayFnGens[key] = gen\n}\n\ntype FieldDisplay struct {\n\tDisplay              FieldFilterFn\n\tDisplayProcessChains DisplayProcessFnChains\n}\n\nfunc (f FieldDisplay) ToDisplay(value FieldModel) interface{} {\n\tval := f.Display(value)\n\n\tif len(f.DisplayProcessChains) > 0 && f.IsNotSelectRes(val) {\n\t\tvalStr := fmt.Sprintf(\"%v\", val)\n\t\tfor _, process := range f.DisplayProcessChains {\n\t\t\tvalStr = fmt.Sprintf(\"%v\", process(FieldModel{\n\t\t\t\tRow:   value.Row,\n\t\t\t\tValue: valStr,\n\t\t\t\tID:    value.ID,\n\t\t\t}))\n\t\t}\n\t\treturn valStr\n\t}\n\n\treturn val\n}\n\nfunc (f FieldDisplay) IsNotSelectRes(v interface{}) bool {\n\tswitch v.(type) {\n\tcase template.HTML:\n\t\treturn false\n\tcase []string:\n\t\treturn false\n\tcase [][]string:\n\t\treturn false\n\tdefault:\n\t\treturn true\n\t}\n}\n\nfunc (f FieldDisplay) ToDisplayHTML(value FieldModel) template.HTML {\n\tv := f.ToDisplay(value)\n\tif h, ok := v.(template.HTML); ok {\n\t\treturn h\n\t} else if s, ok := v.(string); ok {\n\t\treturn template.HTML(s)\n\t} else if arr, ok := v.([]string); ok && len(arr) > 0 {\n\t\treturn template.HTML(arr[0])\n\t} else if arr, ok := v.([]template.HTML); ok && len(arr) > 0 {\n\t\treturn arr[0]\n\t} else if v != nil {\n\t\treturn template.HTML(fmt.Sprintf(\"%v\", v))\n\t} else {\n\t\treturn \"\"\n\t}\n}\n\nfunc (f FieldDisplay) ToDisplayString(value FieldModel) string {\n\tv := f.ToDisplay(value)\n\tif h, ok := v.(template.HTML); ok {\n\t\treturn string(h)\n\t} else if s, ok := v.(string); ok {\n\t\treturn s\n\t} else if arr, ok := v.([]string); ok && len(arr) > 0 {\n\t\treturn arr[0]\n\t} else if arr, ok := v.([]template.HTML); ok && len(arr) > 0 {\n\t\treturn string(arr[0])\n\t} else if v != nil {\n\t\treturn fmt.Sprintf(\"%v\", v)\n\t} else {\n\t\treturn \"\"\n\t}\n}\n\nfunc (f FieldDisplay) ToDisplayStringArray(value FieldModel) []string {\n\tv := f.ToDisplay(value)\n\tif h, ok := v.(template.HTML); ok {\n\t\treturn []string{string(h)}\n\t} else if s, ok := v.(string); ok {\n\t\treturn []string{s}\n\t} else if arr, ok := v.([]string); ok && len(arr) > 0 {\n\t\treturn arr\n\t} else if arr, ok := v.([]template.HTML); ok && len(arr) > 0 {\n\t\tss := make([]string, len(arr))\n\t\tfor k, a := range arr {\n\t\t\tss[k] = string(a)\n\t\t}\n\t\treturn ss\n\t} else if v != nil {\n\t\treturn []string{fmt.Sprintf(\"%v\", v)}\n\t} else {\n\t\treturn []string{}\n\t}\n}\n\nfunc (f FieldDisplay) ToDisplayStringArrayArray(value FieldModel) [][]string {\n\tv := f.ToDisplay(value)\n\tif h, ok := v.(template.HTML); ok {\n\t\treturn [][]string{{string(h)}}\n\t} else if s, ok := v.(string); ok {\n\t\treturn [][]string{{s}}\n\t} else if arr, ok := v.([]string); ok && len(arr) > 0 {\n\t\treturn [][]string{arr}\n\t} else if arr, ok := v.([][]string); ok && len(arr) > 0 {\n\t\treturn arr\n\t} else if arr, ok := v.([]template.HTML); ok && len(arr) > 0 {\n\t\tss := make([]string, len(arr))\n\t\tfor k, a := range arr {\n\t\t\tss[k] = string(a)\n\t\t}\n\t\treturn [][]string{ss}\n\t} else if v != nil {\n\t\treturn [][]string{{fmt.Sprintf(\"%v\", v)}}\n\t} else {\n\t\treturn [][]string{}\n\t}\n}\n\nfunc (f FieldDisplay) AddLimit(limit int) DisplayProcessFnChains {\n\treturn f.DisplayProcessChains.Add(func(value FieldModel) interface{} {\n\t\tif limit > len(value.Value) {\n\t\t\treturn value.Value\n\t\t} else if limit < 0 {\n\t\t\treturn \"\"\n\t\t} else {\n\t\t\treturn value.Value[:limit]\n\t\t}\n\t})\n}\n\nfunc (f FieldDisplay) AddTrimSpace() DisplayProcessFnChains {\n\treturn f.DisplayProcessChains.Add(func(value FieldModel) interface{} {\n\t\treturn strings.TrimSpace(value.Value)\n\t})\n}\n\nfunc (f FieldDisplay) AddSubstr(start int, end int) DisplayProcessFnChains {\n\treturn f.DisplayProcessChains.Add(func(value FieldModel) interface{} {\n\t\tif start > end || start > len(value.Value) || end < 0 {\n\t\t\treturn \"\"\n\t\t}\n\t\tif start < 0 {\n\t\t\tstart = 0\n\t\t}\n\t\tif end > len(value.Value) {\n\t\t\tend = len(value.Value)\n\t\t}\n\t\treturn value.Value[start:end]\n\t})\n}\n\nfunc (f FieldDisplay) AddToTitle() DisplayProcessFnChains {\n\treturn f.DisplayProcessChains.Add(func(value FieldModel) interface{} {\n\t\treturn cases.Title(language.Und).String(value.Value)\n\t})\n}\n\nfunc (f FieldDisplay) AddToUpper() DisplayProcessFnChains {\n\treturn f.DisplayProcessChains.Add(func(value FieldModel) interface{} {\n\t\treturn strings.ToUpper(value.Value)\n\t})\n}\n\nfunc (f FieldDisplay) AddToLower() DisplayProcessFnChains {\n\treturn f.DisplayProcessChains.Add(func(value FieldModel) interface{} {\n\t\treturn strings.ToLower(value.Value)\n\t})\n}\n\ntype DisplayProcessFnChains []FieldFilterFn\n\nfunc (d DisplayProcessFnChains) Valid() bool {\n\treturn len(d) > 0\n}\n\nfunc (d DisplayProcessFnChains) Add(f FieldFilterFn) DisplayProcessFnChains {\n\treturn append(d, f)\n}\n\nfunc (d DisplayProcessFnChains) Append(f DisplayProcessFnChains) DisplayProcessFnChains {\n\treturn append(d, f...)\n}\n\nfunc (d DisplayProcessFnChains) Copy() DisplayProcessFnChains {\n\tif len(d) == 0 {\n\t\treturn make(DisplayProcessFnChains, 0)\n\t} else {\n\t\tvar newDisplayProcessFnChains = make(DisplayProcessFnChains, len(d))\n\t\tcopy(newDisplayProcessFnChains, d)\n\t\treturn newDisplayProcessFnChains\n\t}\n}\n\nfunc chooseDisplayProcessChains(internal DisplayProcessFnChains) DisplayProcessFnChains {\n\tif len(internal) > 0 {\n\t\treturn internal\n\t}\n\treturn globalDisplayProcessChains.Copy()\n}\n\nvar globalDisplayProcessChains = make(DisplayProcessFnChains, 0)\n\nfunc AddGlobalDisplayProcessFn(f FieldFilterFn) {\n\tglobalDisplayProcessChains = globalDisplayProcessChains.Add(f)\n}\n\nfunc AddLimit(limit int) DisplayProcessFnChains {\n\treturn addLimit(limit, globalDisplayProcessChains)\n}\n\nfunc AddTrimSpace() DisplayProcessFnChains {\n\treturn addTrimSpace(globalDisplayProcessChains)\n}\n\nfunc AddSubstr(start int, end int) DisplayProcessFnChains {\n\treturn addSubstr(start, end, globalDisplayProcessChains)\n}\n\nfunc AddToTitle() DisplayProcessFnChains {\n\treturn addToTitle(globalDisplayProcessChains)\n}\n\nfunc AddToUpper() DisplayProcessFnChains {\n\treturn addToUpper(globalDisplayProcessChains)\n}\n\nfunc AddToLower() DisplayProcessFnChains {\n\treturn addToLower(globalDisplayProcessChains)\n}\n\nfunc AddXssFilter() DisplayProcessFnChains {\n\treturn addXssFilter(globalDisplayProcessChains)\n}\n\nfunc AddXssJsFilter() DisplayProcessFnChains {\n\treturn addXssJsFilter(globalDisplayProcessChains)\n}\n\nfunc addLimit(limit int, chains DisplayProcessFnChains) DisplayProcessFnChains {\n\tchains = chains.Add(func(value FieldModel) interface{} {\n\t\tif limit > len(value.Value) {\n\t\t\treturn value\n\t\t} else if limit < 0 {\n\t\t\treturn \"\"\n\t\t} else {\n\t\t\treturn value.Value[:limit]\n\t\t}\n\t})\n\treturn chains\n}\n\nfunc addTrimSpace(chains DisplayProcessFnChains) DisplayProcessFnChains {\n\tchains = chains.Add(func(value FieldModel) interface{} {\n\t\treturn strings.TrimSpace(value.Value)\n\t})\n\treturn chains\n}\n\nfunc addSubstr(start int, end int, chains DisplayProcessFnChains) DisplayProcessFnChains {\n\tchains = chains.Add(func(value FieldModel) interface{} {\n\t\tif start > end || start > len(value.Value) || end < 0 {\n\t\t\treturn \"\"\n\t\t}\n\t\tif start < 0 {\n\t\t\tstart = 0\n\t\t}\n\t\tif end > len(value.Value) {\n\t\t\tend = len(value.Value)\n\t\t}\n\t\treturn value.Value[start:end]\n\t})\n\treturn chains\n}\n\nfunc addToTitle(chains DisplayProcessFnChains) DisplayProcessFnChains {\n\tchains = chains.Add(func(value FieldModel) interface{} {\n\t\treturn cases.Title(language.Und).String(value.Value)\n\t})\n\treturn chains\n}\n\nfunc addToUpper(chains DisplayProcessFnChains) DisplayProcessFnChains {\n\tchains = chains.Add(func(value FieldModel) interface{} {\n\t\treturn strings.ToUpper(value.Value)\n\t})\n\treturn chains\n}\n\nfunc addToLower(chains DisplayProcessFnChains) DisplayProcessFnChains {\n\tchains = chains.Add(func(value FieldModel) interface{} {\n\t\treturn strings.ToLower(value.Value)\n\t})\n\treturn chains\n}\n\nfunc addXssFilter(chains DisplayProcessFnChains) DisplayProcessFnChains {\n\tchains = chains.Add(func(value FieldModel) interface{} {\n\t\treturn html.EscapeString(value.Value)\n\t})\n\treturn chains\n}\n\nfunc addXssJsFilter(chains DisplayProcessFnChains) DisplayProcessFnChains {\n\tchains = chains.Add(func(value FieldModel) interface{} {\n\t\treplacer := strings.NewReplacer(\"<script>\", \"&lt;script&gt;\", \"</script>\", \"&lt;/script&gt;\")\n\t\treturn replacer.Replace(value.Value)\n\t})\n\treturn chains\n}\n\nfunc setDefaultDisplayFnOfFormType(f *FormPanel, typ form.Type) {\n\tif typ.IsMultiFile() {\n\t\tf.FieldList[f.curFieldListIndex].Display = func(value FieldModel) interface{} {\n\t\t\tif value.Value == \"\" {\n\t\t\t\treturn \"\"\n\t\t\t}\n\t\t\tarr := strings.Split(value.Value, \",\")\n\t\t\tres := \"[\"\n\t\t\tfor i, item := range arr {\n\t\t\t\tif i == len(arr)-1 {\n\t\t\t\t\tres += \"'\" + config.GetStore().URL(item) + \"']\"\n\t\t\t\t} else {\n\t\t\t\t\tres += \"'\" + config.GetStore().URL(item) + \"',\"\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn res\n\t\t}\n\t}\n\tif typ.IsSelect() {\n\t\tf.FieldList[f.curFieldListIndex].Display = func(value FieldModel) interface{} {\n\t\t\treturn strings.Split(value.Value, \",\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "template/types/display_test.go",
    "content": "package types\n"
  },
  {
    "path": "template/types/form/form.go",
    "content": "package form\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n)\n\ntype Type uint8\n\nconst (\n\tDefault Type = iota\n\tText\n\tSelectSingle\n\tSelect\n\tIconPicker\n\tSelectBox\n\tFile\n\tMultifile\n\tPassword\n\tRichText\n\tDatetime\n\tDatetimeRange\n\tRadio\n\tCheckbox\n\tCheckboxStacked\n\tCheckboxSingle\n\tEmail\n\tDate\n\tDateRange\n\tUrl\n\tIp\n\tColor\n\tArray\n\tCurrency\n\tRate\n\tNumber\n\tTable\n\tNumberRange\n\tTextArea\n\tCustom\n\tSwitch\n\tCode\n\tSlider\n)\n\nvar AllType = []Type{Default, Text, Array, SelectSingle, Select, IconPicker, SelectBox, File, Multifile, Password,\n\tRichText, Datetime, DatetimeRange, Checkbox, CheckboxStacked, Radio, Table, Email, Url, Ip, Color, Currency, Number, NumberRange,\n\tTextArea, Custom, Switch, Code, Rate, Slider, Date, DateRange, CheckboxSingle}\n\nfunc CheckType(t, def Type) Type {\n\tfor _, item := range AllType {\n\t\tif t == item {\n\t\t\treturn t\n\t\t}\n\t}\n\treturn def\n}\n\ntype Layout uint8\n\nconst (\n\tLayoutDefault Layout = iota\n\tLayoutTwoCol\n\tLayoutThreeCol\n\tLayoutFourCol\n\tLayoutFiveCol\n\tLayoutSixCol\n\tLayoutFlow\n\tLayoutTab\n\tLayoutFilter\n)\n\nfunc (l Layout) Col() int {\n\tif l == LayoutTwoCol {\n\t\treturn 2\n\t}\n\tif l == LayoutThreeCol {\n\t\treturn 3\n\t}\n\tif l == LayoutFourCol {\n\t\treturn 4\n\t}\n\tif l == LayoutFiveCol {\n\t\treturn 5\n\t}\n\tif l == LayoutSixCol {\n\t\treturn 6\n\t}\n\treturn 0\n}\n\nfunc (l Layout) Filter() bool {\n\treturn l == LayoutFilter\n}\n\nfunc (l Layout) Flow() bool {\n\treturn l == LayoutFlow\n}\n\nfunc (l Layout) Default() bool {\n\treturn l == LayoutDefault\n}\n\nfunc (l Layout) String() string {\n\tswitch l {\n\tcase LayoutDefault:\n\t\treturn \"LayoutDefault\"\n\tcase LayoutTwoCol:\n\t\treturn \"LayoutTwoCol\"\n\tcase LayoutThreeCol:\n\t\treturn \"LayoutThreeCol\"\n\tcase LayoutFourCol:\n\t\treturn \"LayoutFourCol\"\n\tcase LayoutFiveCol:\n\t\treturn \"LayoutFiveCol\"\n\tcase LayoutSixCol:\n\t\treturn \"LayoutSixCol\"\n\tcase LayoutFlow:\n\t\treturn \"LayoutFlow\"\n\tcase LayoutTab:\n\t\treturn \"LayoutTab\"\n\tdefault:\n\t\treturn \"LayoutDefault\"\n\t}\n}\n\nfunc GetLayoutFromString(s string) Layout {\n\tswitch s {\n\tcase \"LayoutDefault\":\n\t\treturn LayoutDefault\n\tcase \"LayoutTwoCol\":\n\t\treturn LayoutTwoCol\n\tcase \"LayoutThreeCol\":\n\t\treturn LayoutThreeCol\n\tcase \"LayoutFourCol\":\n\t\treturn LayoutFourCol\n\tcase \"LayoutFiveCol\":\n\t\treturn LayoutFiveCol\n\tcase \"LayoutSixCol\":\n\t\treturn LayoutSixCol\n\tcase \"LayoutFlow\":\n\t\treturn LayoutFlow\n\tcase \"LayoutTab\":\n\t\treturn LayoutTab\n\tdefault:\n\t\treturn LayoutDefault\n\t}\n}\n\nfunc (t Type) Name() string {\n\tswitch t {\n\tcase Default:\n\t\treturn \"Default\"\n\tcase Text:\n\t\treturn \"Text\"\n\tcase SelectSingle:\n\t\treturn \"SelectSingle\"\n\tcase Select:\n\t\treturn \"Select\"\n\tcase IconPicker:\n\t\treturn \"IconPicker\"\n\tcase SelectBox:\n\t\treturn \"SelectBox\"\n\tcase File:\n\t\treturn \"File\"\n\tcase Table:\n\t\treturn \"Table\"\n\tcase Multifile:\n\t\treturn \"Multifile\"\n\tcase Password:\n\t\treturn \"Password\"\n\tcase RichText:\n\t\treturn \"RichText\"\n\tcase Rate:\n\t\treturn \"Rate\"\n\tcase Checkbox:\n\t\treturn \"Checkbox\"\n\tcase CheckboxStacked:\n\t\treturn \"CheckboxStacked\"\n\tcase CheckboxSingle:\n\t\treturn \"CheckboxSingle\"\n\tcase Date:\n\t\treturn \"Date\"\n\tcase DateRange:\n\t\treturn \"DateRange\"\n\tcase Datetime:\n\t\treturn \"Datetime\"\n\tcase DatetimeRange:\n\t\treturn \"DatetimeRange\"\n\tcase Radio:\n\t\treturn \"Radio\"\n\tcase Slider:\n\t\treturn \"Slider\"\n\tcase Array:\n\t\treturn \"Array\"\n\tcase Email:\n\t\treturn \"Email\"\n\tcase Url:\n\t\treturn \"Url\"\n\tcase Ip:\n\t\treturn \"Ip\"\n\tcase Color:\n\t\treturn \"Color\"\n\tcase Currency:\n\t\treturn \"Currency\"\n\tcase Number:\n\t\treturn \"Number\"\n\tcase NumberRange:\n\t\treturn \"NumberRange\"\n\tcase TextArea:\n\t\treturn \"TextArea\"\n\tcase Custom:\n\t\treturn \"Custom\"\n\tcase Switch:\n\t\treturn \"Switch\"\n\tcase Code:\n\t\treturn \"Code\"\n\tdefault:\n\t\tpanic(\"wrong form type\")\n\t}\n}\n\nfunc (t Type) String() string {\n\tswitch t {\n\tcase Default:\n\t\treturn \"default\"\n\tcase Text:\n\t\treturn \"text\"\n\tcase SelectSingle:\n\t\treturn \"select_single\"\n\tcase Select:\n\t\treturn \"select\"\n\tcase IconPicker:\n\t\treturn \"iconpicker\"\n\tcase SelectBox:\n\t\treturn \"selectbox\"\n\tcase File:\n\t\treturn \"file\"\n\tcase Table:\n\t\treturn \"table\"\n\tcase Multifile:\n\t\treturn \"multi_file\"\n\tcase Password:\n\t\treturn \"password\"\n\tcase RichText:\n\t\treturn \"richtext\"\n\tcase Rate:\n\t\treturn \"rate\"\n\tcase Checkbox:\n\t\treturn \"checkbox\"\n\tcase CheckboxStacked:\n\t\treturn \"checkbox_stacked\"\n\tcase CheckboxSingle:\n\t\treturn \"checkbox_single\"\n\tcase Date:\n\t\treturn \"datetime\"\n\tcase DateRange:\n\t\treturn \"datetime_range\"\n\tcase Datetime:\n\t\treturn \"datetime\"\n\tcase DatetimeRange:\n\t\treturn \"datetime_range\"\n\tcase Radio:\n\t\treturn \"radio\"\n\tcase Slider:\n\t\treturn \"slider\"\n\tcase Array:\n\t\treturn \"array\"\n\tcase Email:\n\t\treturn \"email\"\n\tcase Url:\n\t\treturn \"url\"\n\tcase Ip:\n\t\treturn \"ip\"\n\tcase Color:\n\t\treturn \"color\"\n\tcase Currency:\n\t\treturn \"currency\"\n\tcase Number:\n\t\treturn \"number\"\n\tcase NumberRange:\n\t\treturn \"number_range\"\n\tcase TextArea:\n\t\treturn \"textarea\"\n\tcase Custom:\n\t\treturn \"custom\"\n\tcase Switch:\n\t\treturn \"switch\"\n\tcase Code:\n\t\treturn \"code\"\n\tdefault:\n\t\tpanic(\"wrong form type\")\n\t}\n}\n\nfunc (t Type) IsSelect() bool {\n\treturn t == Select || t == SelectSingle || t == SelectBox || t == Radio || t == Switch ||\n\t\tt == Checkbox || t == CheckboxStacked || t == CheckboxSingle\n}\n\nfunc (t Type) IsArray() bool {\n\treturn t == Array\n}\n\nfunc (t Type) IsTable() bool {\n\treturn t == Table\n}\n\nfunc (t Type) IsSingleSelect() bool {\n\treturn t == SelectSingle || t == Radio || t == Switch || t == CheckboxSingle\n}\n\nfunc (t Type) IsMultiSelect() bool {\n\treturn t == Select || t == SelectBox || t == Checkbox || t == CheckboxStacked\n}\n\nfunc (t Type) IsMultiFile() bool {\n\treturn t == Multifile\n}\n\nfunc (t Type) IsRange() bool {\n\treturn t == DatetimeRange || t == NumberRange\n}\n\nfunc (t Type) IsFile() bool {\n\treturn t == File || t == Multifile\n}\n\nfunc (t Type) IsSlider() bool {\n\treturn t == Slider\n}\n\nfunc (t Type) IsDateTime() bool {\n\treturn t == Datetime\n}\n\nfunc (t Type) IsDateTimeRange() bool {\n\treturn t == DatetimeRange\n}\n\nfunc (t Type) IsDate() bool {\n\treturn t == Date\n}\n\nfunc (t Type) IsDateRange() bool {\n\treturn t == DateRange\n}\n\nfunc (t Type) IsCode() bool {\n\treturn t == Code\n}\n\nfunc (t Type) IsRichText() bool {\n\treturn t == RichText\n}\n\nfunc (t Type) IsTextarea() bool {\n\treturn t == TextArea\n}\n\nfunc (t Type) IsEditor() bool {\n\treturn t == TextArea || t == Code || t == RichText\n}\n\nfunc (t Type) IsCustom() bool {\n\treturn t == Custom\n}\n\nfunc (t Type) FixOptions(m map[string]interface{}) map[string]interface{} {\n\tif t == Slider {\n\t\tif _, ok := m[\"type\"]; !ok {\n\t\t\tm[\"type\"] = \"single\"\n\t\t}\n\t\tif _, ok := m[\"prettify\"]; !ok {\n\t\t\tm[\"prettify\"] = false\n\t\t}\n\t\tif _, ok := m[\"hasGrid\"]; !ok {\n\t\t\tm[\"hasGrid\"] = true\n\t\t}\n\t\treturn m\n\t}\n\treturn m\n}\n\nfunc (t Type) SelectedLabel() []template.HTML {\n\tif t == Select || t == SelectSingle || t == SelectBox {\n\t\treturn []template.HTML{\"selected\", \"\"}\n\t}\n\tif t == Radio || t == Switch || t == Checkbox || t == CheckboxStacked || t == CheckboxSingle {\n\t\treturn []template.HTML{\"checked\", \"\"}\n\t}\n\treturn []template.HTML{\"\", \"\"}\n}\n\nfunc (t Type) GetDefaultOptions(field string) (map[string]interface{}, map[string]interface{}, template.JS) {\n\tswitch t {\n\tcase File, Multifile:\n\t\treturn map[string]interface{}{\n\t\t\t\"overwriteInitial\":     true,\n\t\t\t\"initialPreviewAsData\": true,\n\t\t\t\"browseLabel\":          language.Get(\"Browse\"),\n\t\t\t\"showRemove\":           false,\n\t\t\t\"previewClass\":         \"preview-\" + field,\n\t\t\t\"showUpload\":           false,\n\t\t\t\"allowedFileTypes\":     []string{\"image\"},\n\t\t}, nil, \"\"\n\tcase Slider:\n\t\treturn map[string]interface{}{\n\t\t\t\"type\":     \"single\",\n\t\t\t\"prettify\": false,\n\t\t\t\"hasGrid\":  true,\n\t\t\t\"max\":      100,\n\t\t\t\"min\":      1,\n\t\t\t\"step\":     1,\n\t\t\t\"postfix\":  \"\",\n\t\t}, nil, \"\"\n\tcase DatetimeRange:\n\t\top1, op2 := getDateTimeRangeOptions(DatetimeRange)\n\t\treturn op1, op2, \"\"\n\tcase Datetime:\n\t\treturn getDateTimeOptions(Datetime), nil, \"\"\n\tcase Date:\n\t\treturn getDateTimeOptions(Date), nil, \"\"\n\tcase DateRange:\n\t\top1, op2 := getDateTimeRangeOptions(DateRange)\n\t\treturn op1, op2, \"\"\n\tcase Code:\n\t\treturn nil, nil, `\n\ttheme = \"monokai\";\n\tfont_size = 14;\n\tlanguage = \"html\";\n\toptions = {useWorker: false};\n`\n\t}\n\n\treturn nil, nil, \"\"\n}\n\nfunc getDateTimeOptions(f Type) map[string]interface{} {\n\tformat := \"YYYY-MM-DD HH:mm:ss\"\n\tif f == Date {\n\t\tformat = \"YYYY-MM-DD\"\n\t}\n\tm := map[string]interface{}{\n\t\t\"format\":           format,\n\t\t\"locale\":           \"en\",\n\t\t\"allowInputToggle\": true,\n\t}\n\tif config.GetLanguage() == language.CN || config.GetLanguage() == \"cn\" {\n\t\tm[\"locale\"] = \"zh-CN\"\n\t}\n\treturn m\n}\n\nfunc getDateTimeRangeOptions(f Type) (map[string]interface{}, map[string]interface{}) {\n\tformat := \"YYYY-MM-DD HH:mm:ss\"\n\tif f == DateRange {\n\t\tformat = \"YYYY-MM-DD\"\n\t}\n\tm := map[string]interface{}{\n\t\t\"format\": format,\n\t\t\"locale\": \"en\",\n\t}\n\tm1 := map[string]interface{}{\n\t\t\"format\":     format,\n\t\t\"locale\":     \"en\",\n\t\t\"useCurrent\": false,\n\t}\n\tif config.GetLanguage() == language.CN || config.GetLanguage() == \"cn\" {\n\t\tm[\"locale\"] = \"zh-CN\"\n\t\tm1[\"locale\"] = \"zh-CN\"\n\t}\n\treturn m, m1\n}\n\nfunc GetFormTypeFromFieldType(typeName db.DatabaseType, fieldName string) string {\n\n\tif fieldName == \"password\" {\n\t\treturn \"Password\"\n\t}\n\n\tif fieldName == \"id\" {\n\t\treturn \"Default\"\n\t}\n\n\tif fieldName == \"ip\" {\n\t\treturn \"Ip\"\n\t}\n\n\tif fieldName == \"Url\" {\n\t\treturn \"Url\"\n\t}\n\n\tif fieldName == \"email\" {\n\t\treturn \"Email\"\n\t}\n\n\tif fieldName == \"color\" {\n\t\treturn \"Color\"\n\t}\n\n\tif fieldName == \"money\" {\n\t\treturn \"Currency\"\n\t}\n\n\tswitch typeName {\n\tcase db.Int, db.Tinyint, db.Int4, db.Integer, db.Mediumint, db.Smallint,\n\t\tdb.Numeric, db.Smallserial, db.Serial, db.Bigserial, db.Money, db.Bigint:\n\t\treturn \"Number\"\n\tcase db.Text, db.Longtext, db.Mediumtext, db.Tinytext:\n\t\treturn \"RichText\"\n\tcase db.Datetime, db.Date, db.Time, db.Timestamp, db.Timestamptz, db.Year:\n\t\treturn \"Datetime\"\n\t}\n\n\treturn \"Text\"\n}\n\nfunc DefaultHTML(value string) template.HTML {\n\treturn template.HTML(`<div class=\"box box-solid box-default no-margin\"><div class=\"box-body\" style=\"min-height: 40px;\">` +\n\t\tvalue + `</div></div>`)\n}\n\nfunc HiddenInputHTML(field, value string) template.HTML {\n\treturn template.HTML(`<input type=\"hidden\" name=\"` + field + `\" value=\"` + value + `\" class=\"form-control\">`)\n}\n"
  },
  {
    "path": "template/types/form/form_test.go",
    "content": "package form\n"
  },
  {
    "path": "template/types/form/select/select.go",
    "content": "package selection\n\nimport \"fmt\"\n\ntype Data struct {\n\tResults    Options    `json:\"results\"`\n\tPagination Pagination `json:\"pagination\"`\n}\n\ntype Pagination struct {\n\tMore bool `json:\"more\"`\n}\n\ntype Options []Option\n\ntype Option struct {\n\tID       interface{} `json:\"id\"`\n\tText     string      `json:\"text\"`\n\tSelected bool        `json:\"selected,omitempty\"`\n\tDisabled bool        `json:\"disabled,omitempty\"`\n}\n\n// TODO: make clear\n\ntype Configuration struct {\n\tAdaptContainerCssClass string                 `json:\"adaptContainerCssClass,omitempty\"`\n\tAdaptDropdownCssClass  string                 `json:\"adaptDropdownCssClass,omitempty\"`\n\tAjax                   map[string]interface{} `json:\"ajax,omitempty\"`\n\tAllowClear             bool                   `json:\"allowClear,omitempty\"`\n\tAmdBase                string                 `json:\"amdBase,omitempty\"`\n\tAmdLanguageBase        string                 `json:\"amdLanguageBase,omitempty\"`\n\tCloseOnSelect          bool                   `json:\"closeOnSelect,omitempty\"`\n\tContainerCss           map[string]interface{} `json:\"containerCss,omitempty\"`\n\tContainerCssClass      string                 `json:\"containerCssClass,omitempty\"`\n\tData                   Options                `json:\"data,omitempty\"`\n\tDebug                  bool                   `json:\"debug,omitempty\"`\n\tDisabled               bool                   `json:\"disabled,omitempty\"`\n\n\tDropdownAutoWidth bool                   `json:\"dropdownAutoWidth,omitempty\"`\n\tDropdownCss       map[string]interface{} `json:\"dropdownCss,omitempty\"`\n\tDropdownCssClass  string                 `json:\"dropdownCssClass,omitempty\"`\n\tDropdownParent    string                 `json:\"dropdownParent,omitempty\"`\n\n\tEscapeMarkup  func()      `json:\"escapeMarkup,omitempty\"`\n\tInitSelection func()      `json:\"initSelection,omitempty\"`\n\tLanguage      interface{} `json:\"language,omitempty\"`\n\tMatcher       func()      `json:\"matcher,omitempty\"`\n\n\tMaximumInputLength      int `json:\"maximumInputLength,omitempty\"`\n\tMaximumSelectionLength  int `json:\"maximumSelectionLength,omitempty\"`\n\tMinimumInputLength      int `json:\"minimumInputLength,omitempty\"`\n\tMinimumResultsForSearch int `json:\"minimumResultsForSearch,omitempty\"`\n\n\tMultiple      bool        `json:\"multiple,omitempty\"`\n\tPlaceholder   interface{} `json:\"placeholder,omitempty\"`\n\tQuery         func()      `json:\"query,omitempty\"`\n\tSelectOnClose bool        `json:\"selectOnClose,omitempty\"`\n\tSorter        func()      `json:\"sorter,omitempty\"`\n\tTags          bool        `json:\"tags,omitempty\"`\n\n\tTemplateResultFns    []Function\n\tTemplateResult       string `json:\"templateResult,omitempty\"`\n\tTemplateSelectionFns []Function\n\tTemplateSelection    string `json:\"templateSelection,omitempty\"`\n\n\tTheme             string   `json:\"theme,omitempty\"`\n\tTokenizer         func()   `json:\"tokenizer,omitempty\"`\n\tTokenSeparators   []string `json:\"tokenSeparators,omitempty\"`\n\tWidth             string   `json:\"width,omitempty\"`\n\tScrollAfterSelect bool     `json:\"scrollAfterSelect,omitempty\"`\n}\n\ntype Function struct {\n\tFormat string\n\tArgs   []Arg\n\tNext   *Function\n\tP      func(f string, args []Arg, next *Function) string\n}\n\ntype ArgType int\n\nconst (\n\tArgInt ArgType = iota\n\tArgString\n\tArgOperation\n)\n\ntype Arg interface {\n\tType() ArgType\n\tString() string\n\tWrap(string) string\n}\n\ntype BaseArg string\n\nfunc (b BaseArg) String() string {\n\treturn string(b)\n}\n\nfunc (b BaseArg) Wrap(s string) string {\n\treturn s\n}\n\ntype StringArg BaseArg\n\nfunc (s StringArg) Type() ArgType {\n\treturn ArgString\n}\n\nfunc (s StringArg) Wrap(ss string) string {\n\treturn `\"` + ss + `\"`\n}\n\ntype IntArg BaseArg\n\nfunc (s IntArg) Type() ArgType {\n\treturn ArgInt\n}\n\ntype OperationArg BaseArg\n\nfunc (s OperationArg) Type() ArgType {\n\treturn ArgOperation\n}\n\nfunc If(operation, arg Arg, next *Function) Function {\n\treturn Function{\n\t\tFormat: `if (%s ` + operation.Wrap(\"%s\") + \" \" + arg.Wrap(\"%s\") + `) {\n\t%s\n}\n`,\n\t\tNext: next,\n\t\tArgs: []Arg{operation, arg},\n\t\tP: func(f string, args []Arg, next *Function) string {\n\t\t\treturn fmt.Sprintf(f, args[0], args[1], args[2],\n\t\t\t\tnext.P(next.Format, append([]Arg{args[0]}, next.Args...), next.Next))\n\t\t},\n\t}\n}\n\nfunc Return() Function {\n\treturn Function{\n\t\tFormat: `return %s`,\n\t\tP: func(f string, args []Arg, next *Function) string {\n\t\t\treturn fmt.Sprintf(f, args[0])\n\t\t},\n\t}\n}\n\nfunc Add(arg Arg) Function {\n\treturn Function{\n\t\tFormat: `%s += ` + arg.Wrap(\"%s\"),\n\t\tArgs:   []Arg{arg},\n\t\tP: func(f string, args []Arg, next *Function) string {\n\t\t\treturn fmt.Sprintf(f, args[0], args[1])\n\t\t},\n\t}\n}\n\nfunc AddFront(arg Arg) Function {\n\treturn Function{\n\t\tFormat: `%s = ` + arg.Wrap(\"%s\") + ` + %s`,\n\t\tArgs:   []Arg{arg},\n\t\tP: func(f string, args []Arg, next *Function) string {\n\t\t\treturn fmt.Sprintf(f, args[0], args[1], args[0])\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "template/types/form.go",
    "content": "package types\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"html\"\n\t\"html/template\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/file\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\tform2 \"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\ntype FieldOption struct {\n\tText          string            `json:\"text\"`\n\tValue         string            `json:\"value\"`\n\tTextHTML      template.HTML     `json:\"-\"`\n\tSelected      bool              `json:\"-\"`\n\tSelectedLabel template.HTML     `json:\"-\"`\n\tExtra         map[string]string `json:\"-\"`\n}\n\ntype FieldOptions []FieldOption\n\nfunc (fo FieldOptions) Copy() FieldOptions {\n\tnewOptions := make(FieldOptions, len(fo))\n\tcopy(newOptions, fo)\n\treturn newOptions\n}\n\nfunc (fo FieldOptions) SetSelected(val interface{}, labels []template.HTML) FieldOptions {\n\n\tif valArr, ok := val.([]string); ok {\n\t\tfor k := range fo {\n\t\t\ttext := fo[k].Text\n\t\t\tif text == \"\" {\n\t\t\t\ttext = string(fo[k].TextHTML)\n\t\t\t}\n\t\t\tfo[k].Selected = utils.InArray(valArr, fo[k].Value) || utils.InArray(valArr, text)\n\t\t\tif fo[k].Selected {\n\t\t\t\tfo[k].SelectedLabel = labels[0]\n\t\t\t} else {\n\t\t\t\tfo[k].SelectedLabel = labels[1]\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor k := range fo {\n\t\t\ttext := fo[k].Text\n\t\t\tif text == \"\" {\n\t\t\t\ttext = string(fo[k].TextHTML)\n\t\t\t}\n\t\t\tfo[k].Selected = fo[k].Value == val || text == val\n\t\t\tif fo[k].Selected {\n\t\t\t\tfo[k].SelectedLabel = labels[0]\n\t\t\t} else {\n\t\t\t\tfo[k].SelectedLabel = labels[1]\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fo\n}\n\nfunc (fo FieldOptions) SetSelectedLabel(labels []template.HTML) FieldOptions {\n\tfor k := range fo {\n\t\tif fo[k].Selected {\n\t\t\tfo[k].SelectedLabel = labels[0]\n\t\t} else {\n\t\t\tfo[k].SelectedLabel = labels[1]\n\t\t}\n\t}\n\treturn fo\n}\n\nfunc (fo FieldOptions) Marshal() string {\n\tif len(fo) == 0 {\n\t\treturn \"\"\n\t}\n\teo, err := json.Marshal(fo)\n\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\n\treturn string(eo)\n}\n\ntype (\n\tOptionInitFn              func(val FieldModel) FieldOptions\n\tOptionArrInitFn           func(val FieldModel) []FieldOptions\n\tOptionTableQueryProcessFn func(sql *db.SQL) *db.SQL\n\tOptionProcessFn           func(options FieldOptions) FieldOptions\n\n\tOptionTable struct {\n\t\tTable          string\n\t\tTextField      string\n\t\tValueField     string\n\t\tQueryProcessFn OptionTableQueryProcessFn\n\t\tProcessFn      OptionProcessFn\n\t}\n)\n\n// FormField is the form field with different options.\ntype FormField struct {\n\tField          string          `json:\"field\"`\n\tFieldClass     string          `json:\"field_class\"`\n\tTypeName       db.DatabaseType `json:\"type_name\"`\n\tHead           string          `json:\"head\"`\n\tFoot           template.HTML   `json:\"foot\"`\n\tFormType       form2.Type      `json:\"form_type\"`\n\tFatherFormType form2.Type      `json:\"father_form_type\"`\n\tFatherField    string          `json:\"father_field\"`\n\n\tRowWidth int\n\tRowFlag  uint8\n\n\tDefault                template.HTML  `json:\"default\"`\n\tDefaultArr             interface{}    `json:\"default_arr\"`\n\tValue                  template.HTML  `json:\"value\"`\n\tValue2                 string         `json:\"value_2\"`\n\tValueArr               []string       `json:\"value_arr\"`\n\tValue2Arr              []string       `json:\"value_2_arr\"`\n\tOptions                FieldOptions   `json:\"options\"`\n\tOptionsArr             []FieldOptions `json:\"options_arr\"`\n\tDefaultOptionDelimiter string         `json:\"default_option_delimiter\"`\n\tLabel                  template.HTML  `json:\"label\"`\n\tHideLabel              bool           `json:\"hide_label\"`\n\n\tPlaceholder string `json:\"placeholder\"`\n\n\tCustomContent template.HTML `json:\"custom_content\"`\n\tCustomJs      template.JS   `json:\"custom_js\"`\n\tCustomCss     template.CSS  `json:\"custom_css\"`\n\n\tEditable         bool `json:\"editable\"`\n\tNotAllowEdit     bool `json:\"not_allow_edit\"`\n\tNotAllowAdd      bool `json:\"not_allow_add\"`\n\tDisplayButNotAdd bool `json:\"display_but_not_add\"`\n\tMust             bool `json:\"must\"`\n\tHide             bool `json:\"hide\"`\n\tCreateHide       bool `json:\"create_hide\"`\n\tEditHide         bool `json:\"edit_hide\"`\n\n\tWidth int `json:\"width\"`\n\n\tInputWidth int `json:\"input_width\"`\n\tHeadWidth  int `json:\"head_width\"`\n\n\tJoins Joins `json:\"-\"`\n\n\tDivider      bool   `json:\"divider\"`\n\tDividerTitle string `json:\"divider_title\"`\n\n\tHelpMsg template.HTML `json:\"help_msg\"`\n\n\tTableFields FormFields\n\n\tStyle  template.HTMLAttr `json:\"style\"`\n\tNoIcon bool              `json:\"no_icon\"`\n\n\tOptionExt       template.JS     `json:\"option_ext\"`\n\tOptionExt2      template.JS     `json:\"option_ext_2\"`\n\tOptionInitFn    OptionInitFn    `json:\"-\"`\n\tOptionArrInitFn OptionArrInitFn `json:\"-\"`\n\tOptionTable     OptionTable     `json:\"-\"`\n\n\tFieldDisplay `json:\"-\"`\n\tPostFilterFn PostFieldFilterFn `json:\"-\"`\n}\n\nfunc (f *FormField) GetRawValue(columns []string, v interface{}) string {\n\tisJSON := len(columns) == 0\n\treturn modules.AorB(isJSON || modules.InArray(columns, f.Field),\n\t\tdb.GetValueFromDatabaseType(f.TypeName, v, isJSON).String(), \"\")\n}\n\nfunc (f *FormField) UpdateValue(id, val string, res map[string]interface{}, sql *db.SQL) *FormField {\n\treturn f.updateValue(id, val, res, PostTypeUpdate, sql)\n}\n\nfunc (f *FormField) UpdateDefaultValue(sql *db.SQL) *FormField {\n\tf.Value = f.Default\n\treturn f.updateValue(\"\", string(f.Value), make(map[string]interface{}), PostTypeCreate, sql)\n}\n\nfunc (f *FormField) setOptionsFromSQL(sql *db.SQL) {\n\tif sql != nil && f.OptionTable.Table != \"\" && len(f.Options) == 0 {\n\n\t\tsql.Table(f.OptionTable.Table).Select(f.OptionTable.ValueField, f.OptionTable.TextField)\n\n\t\tif f.OptionTable.QueryProcessFn != nil {\n\t\t\tf.OptionTable.QueryProcessFn(sql)\n\t\t}\n\n\t\tqueryRes, err := sql.All()\n\t\tif err == nil {\n\t\t\tfor _, item := range queryRes {\n\t\t\t\tf.Options = append(f.Options, FieldOption{\n\t\t\t\t\tValue: fmt.Sprintf(\"%v\", item[f.OptionTable.ValueField]),\n\t\t\t\t\tText:  fmt.Sprintf(\"%v\", item[f.OptionTable.TextField]),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif f.OptionTable.ProcessFn != nil {\n\t\t\tf.Options = f.OptionTable.ProcessFn(f.Options)\n\t\t}\n\t}\n}\n\nfunc (f *FormField) isBelongToATable() bool {\n\treturn f.FatherField != \"\" && f.FatherFormType.IsTable()\n}\n\nfunc (f *FormField) isNotBelongToATable() bool {\n\treturn f.FatherField == \"\" && !f.FatherFormType.IsTable()\n}\n\nfunc (f *FormField) allowAdd() bool {\n\treturn !f.NotAllowAdd\n}\n\nfunc (f *FormField) updateValue(id, val string, res map[string]interface{}, typ PostType, sql *db.SQL) *FormField {\n\n\tm := FieldModel{\n\t\tID:       id,\n\t\tValue:    val,\n\t\tRow:      res,\n\t\tPostType: typ,\n\t}\n\n\tif f.isBelongToATable() {\n\t\tif f.FormType.IsSelect() {\n\t\t\tif len(f.OptionsArr) == 0 && f.OptionArrInitFn != nil {\n\t\t\t\tf.OptionsArr = f.OptionArrInitFn(m)\n\t\t\t\tfor i := 0; i < len(f.OptionsArr); i++ {\n\t\t\t\t\tf.OptionsArr[i] = f.OptionsArr[i].SetSelectedLabel(f.FormType.SelectedLabel())\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\tf.setOptionsFromSQL(sql)\n\n\t\t\t\tif f.FormType.IsSingleSelect() {\n\t\t\t\t\tvalues := f.ToDisplayStringArray(m)\n\t\t\t\t\tf.OptionsArr = make([]FieldOptions, len(values))\n\t\t\t\t\tfor k, value := range values {\n\t\t\t\t\t\tf.OptionsArr[k] = f.Options.Copy().SetSelected(value, f.FormType.SelectedLabel())\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvalues := f.ToDisplayStringArrayArray(m)\n\t\t\t\t\tf.OptionsArr = make([]FieldOptions, len(values))\n\t\t\t\t\tfor k, value := range values {\n\t\t\t\t\t\tf.OptionsArr[k] = f.Options.Copy().SetSelected(value, f.FormType.SelectedLabel())\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tf.ValueArr = f.ToDisplayStringArray(m)\n\t\t}\n\t} else {\n\t\tif f.FormType.IsSelect() {\n\t\t\tif len(f.Options) == 0 && f.OptionInitFn != nil {\n\t\t\t\tf.Options = f.OptionInitFn(m).SetSelectedLabel(f.FormType.SelectedLabel())\n\t\t\t} else {\n\t\t\t\tf.setOptionsFromSQL(sql)\n\t\t\t\tf.Options.SetSelected(f.ToDisplay(m), f.FormType.SelectedLabel())\n\t\t\t}\n\t\t} else if f.FormType.IsArray() {\n\t\t\tf.ValueArr = f.ToDisplayStringArray(m)\n\t\t} else {\n\t\t\tf.Value = f.ToDisplayHTML(m)\n\t\t\tif f.FormType.IsFile() {\n\t\t\t\tif f.Value != template.HTML(\"\") {\n\t\t\t\t\tf.Value2 = config.GetStore().URL(string(f.Value))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn f\n}\n\nfunc (f *FormField) FillCustomContent() *FormField {\n\t// TODO: optimize\n\tif f.CustomContent != \"\" {\n\t\tf.CustomContent = template.HTML(f.fillCustom(string(f.CustomContent)))\n\t}\n\tif f.CustomJs != \"\" {\n\t\tf.CustomJs = template.JS(f.fillCustom(string(f.CustomJs)))\n\t}\n\tif f.CustomCss != \"\" {\n\t\tf.CustomCss = template.CSS(f.fillCustom(string(f.CustomCss)))\n\t}\n\treturn f\n}\n\nfunc (f *FormField) fillCustom(src string) string {\n\tt := template.New(\"custom\")\n\tt, err := t.Parse(src)\n\tif err != nil {\n\t\tlogger.Error(err)\n\t\treturn \"\"\n\t}\n\tbuf := new(bytes.Buffer)\n\terr = t.Execute(buf, f)\n\tif err != nil {\n\t\tlogger.Error(err)\n\t\treturn \"\"\n\t}\n\treturn buf.String()\n}\n\n// FormPanel\ntype FormPanel struct {\n\tFieldList         FormFields `json:\"field_list\"`\n\tcurFieldListIndex int\n\n\t// Warn: may be deprecated in the future. `json:\"\"\n\tTabGroups  TabGroups  `json:\"tab_groups\"`\n\tTabHeaders TabHeaders `json:\"tab_headers\"`\n\n\tTable       string `json:\"table\"`\n\tTitle       string `json:\"title\"`\n\tDescription string `json:\"description\"`\n\n\tValidator    FormPostFn       `json:\"validator\"`\n\tPostHook     FormPostFn       `json:\"post_hook\"`\n\tPreProcessFn FormPreProcessFn `json:\"pre_process_fn\"`\n\n\tCallbacks Callbacks `json:\"callbacks\"`\n\n\tprimaryKey primaryKey\n\n\tUpdateFn FormPostFn `json:\"update_fn\"`\n\tInsertFn FormPostFn `json:\"insert_fn\"`\n\n\tIsHideContinueEditCheckBox bool `json:\"is_hide_continue_edit_check_box\"`\n\tIsHideContinueNewCheckBox  bool `json:\"is_hide_continue_new_check_box\"`\n\tIsHideResetButton          bool `json:\"is_hide_reset_button\"`\n\tIsHideBackButton           bool `json:\"is_hide_back_button\"`\n\n\tLayout form2.Layout `json:\"layout\"`\n\n\tHTMLContent template.HTML `json:\"html_content\"`\n\n\tHeader template.HTML `json:\"header\"`\n\n\tInputWidth int `json:\"input_width\"`\n\tHeadWidth  int `json:\"head_width\"`\n\n\tFormNewTitle    template.HTML `json:\"form_new_title\"`\n\tFormNewBtnWord  template.HTML `json:\"form_new_btn_word\"`\n\tFormEditTitle   template.HTML `json:\"form_edit_title\"`\n\tFormEditBtnWord template.HTML `json:\"form_edit_btn_word\"`\n\n\tAjax          bool        `json:\"ajax\"`\n\tAjaxSuccessJS template.JS `json:\"ajax_success_js\"`\n\tAjaxErrorJS   template.JS `json:\"ajax_error_js\"`\n\n\tResponder Responder `json:\"responder\"`\n\n\tWrapper ContentWrapper `json:\"wrapper\"`\n\n\tHideSideBar bool `json:\"hide_side_bar\"`\n\n\tprocessChains DisplayProcessFnChains\n\n\tHeaderHtml template.HTML `json:\"header_html\"`\n\tFooterHtml template.HTML `json:\"footer_html\"`\n\n\tPageError     errors.PageError `json:\"page_error\"`\n\tPageErrorHTML template.HTML    `json:\"page_error_html\"`\n\n\tNoCompress bool `json:\"no_compress\"`\n}\n\ntype Responder func(ctx *context.Context)\n\nfunc NewFormPanel() *FormPanel {\n\treturn &FormPanel{\n\t\tcurFieldListIndex: -1,\n\t\tCallbacks:         make(Callbacks, 0),\n\t\tLayout:            form2.LayoutDefault,\n\t\tFormNewTitle:      \"New\",\n\t\tFormEditTitle:     \"Edit\",\n\t\tFormNewBtnWord:    language.GetFromHtml(\"Save\"),\n\t\tFormEditBtnWord:   language.GetFromHtml(\"Save\"),\n\t}\n}\n\nfunc (f *FormPanel) AddLimitFilter(limit int) *FormPanel {\n\tf.processChains = addLimit(limit, f.processChains)\n\treturn f\n}\n\nfunc (f *FormPanel) AddTrimSpaceFilter() *FormPanel {\n\tf.processChains = addTrimSpace(f.processChains)\n\treturn f\n}\n\nfunc (f *FormPanel) AddSubstrFilter(start int, end int) *FormPanel {\n\tf.processChains = addSubstr(start, end, f.processChains)\n\treturn f\n}\n\nfunc (f *FormPanel) AddToTitleFilter() *FormPanel {\n\tf.processChains = addToTitle(f.processChains)\n\treturn f\n}\n\nfunc (f *FormPanel) AddToUpperFilter() *FormPanel {\n\tf.processChains = addToUpper(f.processChains)\n\treturn f\n}\n\nfunc (f *FormPanel) AddToLowerFilter() *FormPanel {\n\tf.processChains = addToLower(f.processChains)\n\treturn f\n}\n\nfunc (f *FormPanel) AddXssFilter() *FormPanel {\n\tf.processChains = addXssFilter(f.processChains)\n\treturn f\n}\n\nfunc (f *FormPanel) AddXssJsFilter() *FormPanel {\n\tf.processChains = addXssJsFilter(f.processChains)\n\treturn f\n}\n\nfunc (f *FormPanel) SetPrimaryKey(name string, typ db.DatabaseType) *FormPanel {\n\tf.primaryKey = primaryKey{Name: name, Type: typ}\n\treturn f\n}\n\nfunc (f *FormPanel) HideContinueEditCheckBox() *FormPanel {\n\tf.IsHideContinueEditCheckBox = true\n\treturn f\n}\n\nfunc (f *FormPanel) HideContinueNewCheckBox() *FormPanel {\n\tf.IsHideContinueNewCheckBox = true\n\treturn f\n}\n\nfunc (f *FormPanel) HideResetButton() *FormPanel {\n\tf.IsHideResetButton = true\n\treturn f\n}\n\nfunc (f *FormPanel) HideBackButton() *FormPanel {\n\tf.IsHideBackButton = true\n\treturn f\n}\n\nfunc (f *FormPanel) AddFieldTr(ctx *context.Context, head, field string, filedType db.DatabaseType, formType form2.Type) *FormPanel {\n\treturn f.AddFieldWithTranslation(ctx, head, field, filedType, formType)\n}\n\nfunc (f *FormPanel) AddFieldWithTranslation(ctx *context.Context, head, field string, filedType db.DatabaseType,\n\tformType form2.Type) *FormPanel {\n\treturn f.AddField(language.GetWithLang(head, ctx.Lang()), field, filedType, formType)\n}\n\nfunc (f *FormPanel) AddField(head, field string, filedType db.DatabaseType, formType form2.Type) *FormPanel {\n\n\tf.FieldList = append(f.FieldList, FormField{\n\t\tHead:        head,\n\t\tField:       field,\n\t\tFieldClass:  field,\n\t\tTypeName:    filedType,\n\t\tEditable:    true,\n\t\tHide:        false,\n\t\tTableFields: make(FormFields, 0),\n\t\tPlaceholder: language.Get(\"input\") + \" \" + head,\n\t\tFormType:    formType,\n\t\tFieldDisplay: FieldDisplay{\n\t\t\tDisplay: func(value FieldModel) interface{} {\n\t\t\t\treturn value.Value\n\t\t\t},\n\t\t\tDisplayProcessChains: chooseDisplayProcessChains(f.processChains),\n\t\t},\n\t})\n\tf.curFieldListIndex++\n\n\t// Set default options of different form type\n\top1, op2, js := formType.GetDefaultOptions(field)\n\tf.FieldOptionExt(op1)\n\tf.FieldOptionExt2(op2)\n\tf.FieldOptionExtJS(js)\n\n\t// Set default Display Filter Function of different form type\n\tsetDefaultDisplayFnOfFormType(f, formType)\n\n\tif formType.IsEditor() {\n\t\tf.NoCompress = true\n\t}\n\n\treturn f\n}\n\ntype AddFormFieldFn func(panel *FormPanel)\n\nfunc (f *FormPanel) AddTable(head, field string, addFields AddFormFieldFn) *FormPanel {\n\tindex := f.curFieldListIndex\n\taddFields(f)\n\tfor i := index + 1; i <= f.curFieldListIndex; i++ {\n\t\tf.FieldList[i].FatherFormType = form2.Table\n\t\tf.FieldList[i].FatherField = field\n\t}\n\tfields := make(FormFields, f.curFieldListIndex-index)\n\tcopy(fields, f.FieldList[index+1:f.curFieldListIndex+1])\n\tf.FieldList = append(f.FieldList, FormField{\n\t\tHead:        head,\n\t\tField:       field,\n\t\tFieldClass:  field,\n\t\tTypeName:    db.Varchar,\n\t\tEditable:    true,\n\t\tHide:        false,\n\t\tTableFields: fields,\n\t\tFormType:    form2.Table,\n\t\tFieldDisplay: FieldDisplay{\n\t\t\tDisplay: func(value FieldModel) interface{} {\n\t\t\t\treturn value.Value\n\t\t\t},\n\t\t\tDisplayProcessChains: chooseDisplayProcessChains(f.processChains),\n\t\t},\n\t})\n\tf.curFieldListIndex++\n\treturn f\n}\n\nfunc (f *FormPanel) AddRow(addFields AddFormFieldFn) *FormPanel {\n\tindex := f.curFieldListIndex\n\taddFields(f)\n\tif f.curFieldListIndex != index+1 {\n\t\tfor i := index + 1; i <= f.curFieldListIndex; i++ {\n\t\t\tif i == index+1 {\n\t\t\t\tf.FieldList[i].RowFlag = 1\n\t\t\t} else if i == f.curFieldListIndex {\n\t\t\t\tf.FieldList[i].RowFlag = 2\n\t\t\t} else {\n\t\t\t\tf.FieldList[i].RowFlag = 3\n\t\t\t}\n\t\t}\n\t}\n\treturn f\n}\n\n// Field attribute setting functions\n// ====================================================\n\nfunc (f *FormPanel) FieldDisplay(filter FieldFilterFn) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Display = filter\n\treturn f\n}\n\nfunc (f *FormPanel) SetTable(table string) *FormPanel {\n\tf.Table = table\n\treturn f\n}\n\nfunc (f *FormPanel) FieldMust() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Must = true\n\treturn f\n}\n\nfunc (f *FormPanel) FieldHide() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Hide = true\n\treturn f\n}\n\nfunc (f *FormPanel) FieldPlaceholder(placeholder string) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Placeholder = placeholder\n\treturn f\n}\n\nfunc (f *FormPanel) FieldWidth(width int) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Width = width\n\treturn f\n}\n\nfunc (f *FormPanel) FieldInputWidth(width int) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].InputWidth = width\n\treturn f\n}\n\nfunc (f *FormPanel) FieldHeadWidth(width int) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].HeadWidth = width\n\treturn f\n}\n\nfunc (f *FormPanel) FieldRowWidth(width int) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].RowWidth = width\n\treturn f\n}\n\nfunc (f *FormPanel) FieldHideLabel() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].HideLabel = true\n\treturn f\n}\n\nfunc (f *FormPanel) FieldFoot(foot template.HTML) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Foot = foot\n\treturn f\n}\n\nfunc (f *FormPanel) FieldDivider(title ...string) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Divider = true\n\tif len(title) > 0 {\n\t\tf.FieldList[f.curFieldListIndex].DividerTitle = title[0]\n\t}\n\treturn f\n}\n\nfunc (f *FormPanel) FieldHelpMsg(s template.HTML) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].HelpMsg = s\n\treturn f\n}\n\nfunc (f *FormPanel) FieldOptionInitFn(fn OptionInitFn) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].OptionInitFn = fn\n\treturn f\n}\n\n// FieldOptionExt set the option extension js of the field.\nfunc (f *FormPanel) FieldOptionExt(m map[string]interface{}) *FormPanel {\n\n\tif m == nil {\n\t\treturn f\n\t}\n\n\tif f.FieldList[f.curFieldListIndex].FormType.IsCode() {\n\t\tf.FieldList[f.curFieldListIndex].OptionExt = template.JS(fmt.Sprintf(`\n\ttheme = \"%s\";\n\tfont_size = %s;\n\tlanguage = \"%s\";\n\toptions = %s;\n`, m[\"theme\"], m[\"font_size\"], m[\"language\"], m[\"options\"]))\n\t\treturn f\n\t}\n\n\tm = f.FieldList[f.curFieldListIndex].FormType.FixOptions(m)\n\n\ts, _ := json.Marshal(m)\n\n\tif f.FieldList[f.curFieldListIndex].OptionExt != template.JS(\"\") {\n\t\tss := string(f.FieldList[f.curFieldListIndex].OptionExt)\n\t\tss = strings.Replace(ss, \"}\", \"\", strings.Count(ss, \"}\"))\n\t\tss = strings.TrimRight(ss, \" \")\n\t\tss += \",\"\n\t\tf.FieldList[f.curFieldListIndex].OptionExt = template.JS(ss) + template.JS(strings.Replace(string(s), \"{\", \"\", 1))\n\t} else {\n\t\tf.FieldList[f.curFieldListIndex].OptionExt = template.JS(string(s))\n\t}\n\n\treturn f\n}\n\nfunc (f *FormPanel) FieldOptionExt2(m map[string]interface{}) *FormPanel {\n\n\tif m == nil {\n\t\treturn f\n\t}\n\n\tm = f.FieldList[f.curFieldListIndex].FormType.FixOptions(m)\n\n\ts, _ := json.Marshal(m)\n\n\tif f.FieldList[f.curFieldListIndex].OptionExt2 != template.JS(\"\") {\n\t\tss := string(f.FieldList[f.curFieldListIndex].OptionExt2)\n\t\tss = strings.Replace(ss, \"}\", \"\", strings.Count(ss, \"}\"))\n\t\tss = strings.TrimRight(ss, \" \")\n\t\tss += \",\"\n\t\tf.FieldList[f.curFieldListIndex].OptionExt2 = template.JS(ss) + template.JS(strings.Replace(string(s), \"{\", \"\", 1))\n\t} else {\n\t\tf.FieldList[f.curFieldListIndex].OptionExt2 = template.JS(string(s))\n\t}\n\n\treturn f\n}\n\nfunc (f *FormPanel) FieldOptionExtJS(js template.JS) *FormPanel {\n\tif js != template.JS(\"\") {\n\t\tf.FieldList[f.curFieldListIndex].OptionExt = js\n\t}\n\treturn f\n}\n\nfunc (f *FormPanel) FieldOptionExtJS2(js template.JS) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].OptionExt2 = js\n\treturn f\n}\n\nfunc (f *FormPanel) FieldEnableFileUpload(data ...interface{}) *FormPanel {\n\n\turl := f.OperationURL(\"/file/upload\")\n\n\tif len(data) > 0 {\n\t\turl = data[0].(string)\n\t}\n\n\tfield := f.FieldList[f.curFieldListIndex].Field\n\n\tf.FieldList[f.curFieldListIndex].OptionExt = template.JS(fmt.Sprintf(`\n\t%seditor.customConfig.uploadImgServer = '%s';\n\t%seditor.customConfig.uploadImgMaxSize = 3 * 1024 * 1024;\n\t%seditor.customConfig.uploadImgMaxLength = 5;\n\t%seditor.customConfig.uploadFileName = 'file';\n`, field, url, field, field, field))\n\n\tvar fileUploadHandler context.Handler\n\tif len(data) > 1 {\n\t\tfileUploadHandler = data[1].(context.Handler)\n\t} else {\n\t\tfileUploadHandler = func(ctx *context.Context) {\n\t\t\tif len(ctx.Request.MultipartForm.File) == 0 {\n\t\t\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\t\t\"errno\": 400,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\terr := file.GetFileEngine(config.GetFileUploadEngine().Name).Upload(ctx.Request.MultipartForm)\n\t\t\tif err != nil {\n\t\t\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\t\t\"errno\": 500,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar imgPath = make([]string, len(ctx.Request.MultipartForm.Value[\"file\"]))\n\t\t\tfor i, path := range ctx.Request.MultipartForm.Value[\"file\"] {\n\t\t\t\timgPath[i] = config.GetStore().URL(path)\n\t\t\t}\n\n\t\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\t\"errno\": 0,\n\t\t\t\t\"data\":  imgPath,\n\t\t\t})\n\t\t}\n\t}\n\n\tf.Callbacks = f.Callbacks.AddCallback(context.Node{\n\t\tPath:     url,\n\t\tMethod:   \"post\",\n\t\tValue:    map[string]interface{}{constant.ContextNodeNeedAuth: 1},\n\t\tHandlers: []context.Handler{fileUploadHandler},\n\t})\n\n\treturn f\n}\n\nfunc (f *FormPanel) FieldDefault(def string) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Default = template.HTML(def)\n\treturn f\n}\n\n// FieldNotAllowEdit means when update record the field can not be edited but will still be displayed and submitted.\n// Deprecated: Use FieldDisplayButCanNotEditWhenUpdate instead.\nfunc (f *FormPanel) FieldNotAllowEdit() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Editable = false\n\treturn f\n}\n\n// FieldDisplayButCanNotEditWhenUpdate means when update record the field can not be edited but will still be displayed and submitted.\nfunc (f *FormPanel) FieldDisplayButCanNotEditWhenUpdate() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Editable = false\n\treturn f\n}\n\n// FieldDisableWhenUpdate means when update record the field can not be edited, displayed and submitted.\nfunc (f *FormPanel) FieldDisableWhenUpdate() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].NotAllowEdit = true\n\treturn f\n}\n\n// FieldNotAllowAdd means when create record the field can not be edited, displayed and submitted.\n// Deprecated: Use FieldDisableWhenCreate instead.\nfunc (f *FormPanel) FieldNotAllowAdd() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].NotAllowAdd = true\n\treturn f\n}\n\n// FieldDisableWhenCreate means when create record the field can not be edited, displayed and submitted.\nfunc (f *FormPanel) FieldDisableWhenCreate() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].NotAllowAdd = true\n\treturn f\n}\n\n// FieldDisplayButCanNotEditWhenCreate means when create record the field can not be edited but will still be displayed and submitted.\nfunc (f *FormPanel) FieldDisplayButCanNotEditWhenCreate() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DisplayButNotAdd = true\n\treturn f\n}\n\n// FieldHideWhenCreate means when create record the field can not be edited and displayed, but will be submitted.\nfunc (f *FormPanel) FieldHideWhenCreate() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].CreateHide = true\n\treturn f\n}\n\n// FieldHideWhenUpdate means when update record the field can not be edited and displayed, but will be submitted.\nfunc (f *FormPanel) FieldHideWhenUpdate() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].EditHide = true\n\treturn f\n}\n\nfunc (f *FormPanel) FieldFormType(formType form2.Type) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].FormType = formType\n\treturn f\n}\n\nfunc (f *FormPanel) FieldValue(value string) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Value = template.HTML(value)\n\treturn f\n}\n\n// FieldOptionsFromTable set options for a filterable field to select. The options is from other table.\n// For example,\n//\n//\t`FieldOptionsFromTable(\"roles\", \"name\", \"id\")`\n//\n// will generate the sql like:\n//\n//\t`select id, name from roles`.\n//\n// And the `id` will be the value of options, `name` is the text to be shown.\nfunc (f *FormPanel) FieldOptionsFromTable(table, textFieldName, valueFieldName string, process ...OptionTableQueryProcessFn) *FormPanel {\n\tvar fn OptionTableQueryProcessFn\n\tif len(process) > 0 {\n\t\tfn = process[0]\n\t}\n\tf.FieldList[f.curFieldListIndex].OptionTable = OptionTable{\n\t\tTable:          table,\n\t\tTextField:      textFieldName,\n\t\tValueField:     valueFieldName,\n\t\tQueryProcessFn: fn,\n\t}\n\treturn f\n}\n\nfunc (f *FormPanel) FieldOptionsTableProcessFn(fn OptionProcessFn) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].OptionTable.ProcessFn = fn\n\treturn f\n}\n\n// FieldOptions set options for a filterable field to select. It will work when you set the\n// FormType of the field to SelectSingle/Select/SelectBox.\nfunc (f *FormPanel) FieldOptions(options FieldOptions) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].Options = options\n\treturn f\n}\n\nfunc (f *FormPanel) FieldDefaultOptionDelimiter(delimiter string) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DefaultOptionDelimiter = delimiter\n\treturn f\n}\n\nfunc (f *FormPanel) FieldPostFilterFn(post PostFieldFilterFn) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].PostFilterFn = post\n\treturn f\n}\n\nfunc (f *FormPanel) FieldNow() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].PostFilterFn = func(value PostFieldModel) interface{} {\n\t\treturn time.Now().Format(\"2006-01-02 15:04:05\")\n\t}\n\treturn f\n}\n\nfunc (f *FormPanel) FieldNowWhenUpdate() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].PostFilterFn = func(value PostFieldModel) interface{} {\n\t\tif value.IsUpdate() {\n\t\t\treturn time.Now().Format(\"2006-01-02 15:04:05\")\n\t\t}\n\t\treturn value.Value.Value()\n\t}\n\treturn f\n}\n\nfunc (f *FormPanel) FieldNowWhenInsert() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].PostFilterFn = func(value PostFieldModel) interface{} {\n\t\tif value.IsCreate() {\n\t\t\treturn time.Now().Format(\"2006-01-02 15:04:05\")\n\t\t}\n\t\treturn value.Value.Value()\n\t}\n\treturn f\n}\n\n// FieldLimit limit the field length.\nfunc (f *FormPanel) FieldLimit(limit int) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DisplayProcessChains = f.FieldList[f.curFieldListIndex].AddLimit(limit)\n\treturn f\n}\n\n// FieldTrimSpace trim space of the field.\nfunc (f *FormPanel) FieldTrimSpace() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DisplayProcessChains = f.FieldList[f.curFieldListIndex].AddTrimSpace()\n\treturn f\n}\n\n// FieldSubstr intercept string of the field.\nfunc (f *FormPanel) FieldSubstr(start int, end int) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DisplayProcessChains = f.FieldList[f.curFieldListIndex].AddSubstr(start, end)\n\treturn f\n}\n\n// FieldToTitle update the field to a string that begin words mapped to their Unicode title case.\nfunc (f *FormPanel) FieldToTitle() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DisplayProcessChains = f.FieldList[f.curFieldListIndex].AddToTitle()\n\treturn f\n}\n\n// FieldToUpper update the field to a string with all Unicode letters mapped to their upper case.\nfunc (f *FormPanel) FieldToUpper() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DisplayProcessChains = f.FieldList[f.curFieldListIndex].AddToUpper()\n\treturn f\n}\n\n// FieldToLower update the field to a string with all Unicode letters mapped to their lower case.\nfunc (f *FormPanel) FieldToLower() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DisplayProcessChains = f.FieldList[f.curFieldListIndex].AddToLower()\n\treturn f\n}\n\n// FieldXssFilter escape field with html.Escape.\nfunc (f *FormPanel) FieldXssFilter() *FormPanel {\n\tf.FieldList[f.curFieldListIndex].DisplayProcessChains = f.FieldList[f.curFieldListIndex].DisplayProcessChains.\n\t\tAdd(func(value FieldModel) interface{} {\n\t\t\treturn html.EscapeString(value.Value)\n\t\t})\n\treturn f\n}\n\nfunc (f *FormPanel) FieldCustomContent(content template.HTML) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].CustomContent = content\n\treturn f\n}\n\nfunc (f *FormPanel) FieldCustomJs(js template.JS) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].CustomJs = js\n\treturn f\n}\n\nfunc (f *FormPanel) FieldCustomCss(css template.CSS) *FormPanel {\n\tf.FieldList[f.curFieldListIndex].CustomCss = css\n\treturn f\n}\n\n// FieldOnSearch set the url and the corresponding handler which has some backend logic and\n// return the options of the field.\n// For example:\n//\n//\tFieldOnSearch(\"/search/city\", func(ctx *context.Context) (success bool, msg string, data interface{}) {\n//\t\treturn true, \"ok\", selection.Data{\n//\t\t\tResults: selection.Options{\n//\t\t\t\t{Text: \"GuangZhou\", ID: \"1\"},\n//\t\t\t\t{Text: \"ShenZhen\", ID: \"2\"},\n//\t\t\t\t{Text: \"BeiJing\", ID: \"3\"},\n//\t\t\t\t{Text: \"ShangHai\", ID: \"4\"},\n//\t\t\t}\n//\t\t}\n//\t}, 1000)\nfunc (f *FormPanel) FieldOnSearch(url string, handler Handler, delay ...int) *FormPanel {\n\text, callback := searchJS(f.FieldList[f.curFieldListIndex].OptionExt, f.OperationURL(url), handler, delay...)\n\tf.FieldList[f.curFieldListIndex].OptionExt = ext\n\tf.Callbacks = f.Callbacks.AddCallback(callback)\n\treturn f\n}\n\n// FieldOnChooseCustom set the js that will be called when filter option be selected.\nfunc (f *FormPanel) FieldOnChooseCustom(js template.HTML) *FormPanel {\n\tf.FooterHtml += chooseCustomJS(f.FieldList[f.curFieldListIndex].Field, js)\n\treturn f\n}\n\ntype LinkField struct {\n\tField   string\n\tValue   template.HTML\n\tHide    bool\n\tDisable bool\n}\n\n// FieldOnChooseMap set the actions that will be taken when filter option be selected.\n// For example:\n//\n//\tmap[string]types.LinkField{\n//\t     \"men\": {Field: \"ip\", Value:\"127.0.0.1\"},\n//\t     \"women\": {Field: \"ip\", Hide: true},\n//\t     \"other\": {Field: \"ip\", Disable: true}\n//\t}\n//\n// mean when choose men, the value of field ip will be set to 127.0.0.1,\n// when choose women, field ip will be hidden, and when choose other, field ip will be disabled.\nfunc (f *FormPanel) FieldOnChooseMap(m map[string]LinkField) *FormPanel {\n\tf.FooterHtml += chooseMapJS(f.FieldList[f.curFieldListIndex].Field, m)\n\treturn f\n}\n\n// FieldOnChoose set the given value of the given field when choose the value of val.\nfunc (f *FormPanel) FieldOnChoose(val, field string, value template.HTML) *FormPanel {\n\tf.FooterHtml += chooseJS(f.FieldList[f.curFieldListIndex].Field, field, val, value)\n\treturn f\n}\n\nfunc (f *FormPanel) OperationURL(id string) string {\n\treturn config.Url(\"/operation/\" + utils.WrapURL(id))\n}\n\n// FieldOnChooseAjax set the url and handler that will be called when field be choosed.\n// The handler will return the option of the field. It will help to link two or more form items.\n// For example:\n//\n//\tFieldOnChooseAjax(\"city\", \"/search/city\", func(ctx *context.Context) (success bool, msg string, data interface{}) {\n//\t\treturn true, \"ok\", selection.Data{\n//\t\t\tResults: selection.Options{\n//\t\t\t\t{Text: \"GuangZhou\", ID: \"1\"},\n//\t\t\t\t{Text: \"ShenZhen\", ID: \"2\"},\n//\t\t\t\t{Text: \"BeiJing\", ID: \"3\"},\n//\t\t\t\t{Text: \"ShangHai\", ID: \"4\"},\n//\t\t\t}\n//\t\t}\n//\t})\n//\n// When you choose the country, it trigger the action of ajax which be sent to the given handler,\n// and return the city options to the field city.\nfunc (f *FormPanel) FieldOnChooseAjax(field, url string, handler Handler, custom ...template.HTML) *FormPanel {\n\tjs, callback := chooseAjax(f.FieldList[f.curFieldListIndex].Field, field, f.OperationURL(url), handler, custom...)\n\tf.FooterHtml += js\n\tf.Callbacks = f.Callbacks.AddCallback(callback)\n\treturn f\n}\n\n// FieldOnChooseHide hide the fields when value to be chosen.\nfunc (f *FormPanel) FieldOnChooseHide(value string, field ...string) *FormPanel {\n\tf.FooterHtml += chooseHideJS(f.FieldList[f.curFieldListIndex].Field, []string{value}, field...)\n\treturn f\n}\n\n// FieldOnChooseOptionsHide display the fields when value to be chosen.\nfunc (f *FormPanel) FieldOnChooseOptionsHide(values []string, field ...string) *FormPanel {\n\tf.FooterHtml += chooseHideJS(f.FieldList[f.curFieldListIndex].Field, values, field...)\n\treturn f\n}\n\n// FieldFilterOnChooseShow display the fields when value to be chosen.\nfunc (f *FormPanel) FieldOnChooseShow(value string, field ...string) *FormPanel {\n\tf.FooterHtml += chooseShowJS(f.FieldList[f.curFieldListIndex].Field, []string{value}, field...)\n\treturn f\n}\n\n// FieldOnChooseOptionsShow display the fields when values to be chosen.\nfunc (f *FormPanel) FieldOnChooseOptionsShow(values []string, field ...string) *FormPanel {\n\tf.FooterHtml += chooseShowJS(f.FieldList[f.curFieldListIndex].Field, values, field...)\n\treturn f\n}\n\n// FieldOnChooseDisable disable the fields when value to be chosen.\nfunc (f *FormPanel) FieldOnChooseDisable(value string, field ...string) *FormPanel {\n\tf.FooterHtml += chooseDisableJS(f.FieldList[f.curFieldListIndex].Field, []string{value}, field...)\n\treturn f\n}\n\nfunc (f *FormPanel) addFooterHTML(footer template.HTML) *FormPanel {\n\tf.FooterHtml += template.HTML(ParseTableDataTmpl(footer))\n\treturn f\n}\n\nfunc (f *FormPanel) AddCSS(css template.CSS) *FormPanel {\n\treturn f.addFooterHTML(template.HTML(\"<style>\" + css + \"</style>\"))\n}\n\nfunc (f *FormPanel) AddJS(js template.JS) *FormPanel {\n\treturn f.addFooterHTML(template.HTML(\"<script>\" + js + \"</script>\"))\n}\n\nfunc searchJS(ext template.JS, url string, handler Handler, delay ...int) (template.JS, context.Node) {\n\tdelayStr := \"500\"\n\tif len(delay) > 0 {\n\t\tdelayStr = strconv.Itoa(delay[0])\n\t}\n\n\tif ext != template.JS(\"\") {\n\t\ts := string(ext)\n\t\ts = strings.Replace(s, \"{\", \"\", 1)\n\t\ts = utils.ReplaceNth(s, \"}\", \"\", strings.Count(s, \"}\"))\n\t\ts = strings.TrimRight(s, \" \")\n\t\ts += \",\"\n\t\text = template.JS(s)\n\t}\n\n\treturn template.JS(`{\n\t\t`) + ext + template.JS(`\n\t\tajax: {\n\t\t    url: \"`+url+`\",\n\t\t    dataType: 'json',\n\t\t    data: function (params) {\n\t\t\t      var query = {\n\t\t\t        \tsearch: params.term,\n\t\t\t\t\t\tpage: params.page || 1\n\t\t\t      }\n\t\t\t      return query;\n\t\t    },\n\t\t    delay: `+delayStr+`,\n\t\t    processResults: function (data, params) {\n\t\t\t      return data.data;\n\t    \t}\n\t  \t}\n\t}`), context.Node{\n\t\t\tPath:     url,\n\t\t\tMethod:   \"get\",\n\t\t\tHandlers: context.Handlers{handler.Wrap()},\n\t\t\tValue:    map[string]interface{}{constant.ContextNodeNeedAuth: 1},\n\t\t}\n}\n\nfunc chooseCustomJS(field string, js template.HTML) template.HTML {\n\treturn utils.ParseHTML(\"choose_custom\", tmpls[\"choose_custom\"], struct {\n\t\tField template.JS\n\t\tJS    template.JS\n\t}{Field: template.JS(field), JS: template.JS(js)})\n}\n\nfunc chooseMapJS(field string, m map[string]LinkField) template.HTML {\n\treturn utils.ParseHTML(\"choose_map\", tmpls[\"choose_map\"], struct {\n\t\tField template.JS\n\t\tData  map[string]LinkField\n\t}{\n\t\tField: template.JS(field),\n\t\tData:  m,\n\t})\n}\n\nfunc chooseJS(field, chooseField, val string, value template.HTML) template.HTML {\n\treturn utils.ParseHTML(\"choose\", tmpls[\"choose\"], struct {\n\t\tField       template.JS\n\t\tChooseField template.JS\n\t\tVal         template.JS\n\t\tValue       template.JS\n\t}{\n\t\tField:       template.JS(field),\n\t\tChooseField: template.JS(chooseField),\n\t\tValue:       decorateChooseValue([]string{string(value)}),\n\t\tVal:         decorateChooseValue([]string{string(val)}),\n\t})\n}\n\nfunc chooseAjax(field, chooseField, url string, handler Handler, js ...template.HTML) (template.HTML, context.Node) {\n\n\tactionJS := template.HTML(\"\")\n\tpassValue := template.JS(\"\")\n\n\tif len(js) > 0 {\n\t\tactionJS = js[0]\n\t}\n\n\tif len(js) > 1 {\n\t\tpassValue = template.JS(js[1])\n\t}\n\n\treturn utils.ParseHTML(\"choose_ajax\", tmpls[\"choose_ajax\"], struct {\n\t\t\tField       template.JS\n\t\t\tChooseField template.JS\n\t\t\tPassValue   template.JS\n\t\t\tActionJS    template.JS\n\t\t\tUrl         template.JS\n\t\t}{\n\t\t\tUrl:         template.JS(url),\n\t\t\tField:       template.JS(field),\n\t\t\tChooseField: template.JS(chooseField),\n\t\t\tPassValue:   passValue,\n\t\t\tActionJS:    template.JS(actionJS),\n\t\t}), context.Node{\n\t\t\tPath:     url,\n\t\t\tMethod:   \"post\",\n\t\t\tHandlers: context.Handlers{handler.Wrap()},\n\t\t\tValue:    map[string]interface{}{constant.ContextNodeNeedAuth: 1},\n\t\t}\n}\n\nfunc chooseHideJS(field string, value []string, chooseFields ...string) template.HTML {\n\tif len(chooseFields) == 0 {\n\t\treturn \"\"\n\t}\n\n\treturn utils.ParseHTML(\"choose_hide\", tmpls[\"choose_hide\"], struct {\n\t\tField        template.JS\n\t\tValue        template.JS\n\t\tChooseFields []string\n\t}{\n\t\tField:        template.JS(field),\n\t\tValue:        decorateChooseValue(value),\n\t\tChooseFields: chooseFields,\n\t})\n}\n\nfunc chooseShowJS(field string, value []string, chooseFields ...string) template.HTML {\n\tif len(chooseFields) == 0 {\n\t\treturn \"\"\n\t}\n\n\treturn utils.ParseHTML(\"choose_show\", tmpls[\"choose_show\"], struct {\n\t\tField        template.JS\n\t\tValue        template.JS\n\t\tChooseFields []string\n\t}{\n\t\tField:        template.JS(field),\n\t\tValue:        decorateChooseValue(value),\n\t\tChooseFields: chooseFields,\n\t})\n}\n\nfunc chooseDisableJS(field string, value []string, chooseFields ...string) template.HTML {\n\tif len(chooseFields) == 0 {\n\t\treturn \"\"\n\t}\n\n\treturn utils.ParseHTML(\"choose_disable\", tmpls[\"choose_disable\"], struct {\n\t\tField        template.JS\n\t\tValue        template.JS\n\t\tChooseFields []string\n\t}{\n\t\tField:        template.JS(field),\n\t\tValue:        decorateChooseValue(value),\n\t\tChooseFields: chooseFields,\n\t})\n}\n\nfunc decorateChooseValue(val []string) template.JS {\n\tif len(val) == 0 {\n\t\treturn \"\"\n\t}\n\n\tres := make([]string, len(val))\n\n\tfor k, v := range val {\n\n\t\tif v == \"\" {\n\t\t\tv = `\"\"`\n\t\t}\n\n\t\tif v[0] != '\"' {\n\t\t\tif strings.Contains(v, \"$(this)\") {\n\t\t\t\tres[k] = v\n\t\t\t}\n\t\t\tif v == \"{{.vue}}\" {\n\t\t\t\tres[k] = \"$(this).v()\"\n\t\t\t}\n\t\t\tif len(v) > 3 && v[:3] == \"js:\" {\n\t\t\t\tres[k] = v[3:]\n\t\t\t}\n\t\t\tres[k] = `\"` + v + `\"`\n\t\t} else {\n\t\t\tres[k] = v\n\t\t}\n\t}\n\n\treturn template.JS(\"[\" + strings.Join(res, \",\") + \"]\")\n}\n\n// FormPanel attribute setting functions\n// ====================================================\n\nfunc (f *FormPanel) SetTitle(title string) *FormPanel {\n\tf.Title = title\n\treturn f\n}\n\nfunc (f *FormPanel) SetTabGroups(groups TabGroups) *FormPanel {\n\tf.TabGroups = groups\n\treturn f\n}\n\nfunc (f *FormPanel) SetTabHeaders(headers ...string) *FormPanel {\n\tf.TabHeaders = headers\n\treturn f\n}\n\nfunc (f *FormPanel) SetDescription(desc string) *FormPanel {\n\tf.Description = desc\n\treturn f\n}\n\nfunc (f *FormPanel) SetHeaderHtml(header template.HTML) *FormPanel {\n\tf.HeaderHtml += header\n\treturn f\n}\n\nfunc (f *FormPanel) SetFooterHtml(footer template.HTML) *FormPanel {\n\tf.FooterHtml += footer\n\treturn f\n}\n\nfunc (f *FormPanel) HasError() bool {\n\treturn f.PageError != nil\n}\n\nfunc (f *FormPanel) SetError(err errors.PageError, content ...template.HTML) *FormPanel {\n\tf.PageError = err\n\tif len(content) > 0 {\n\t\tf.PageErrorHTML = content[0]\n\t}\n\treturn f\n}\n\nfunc (f *FormPanel) SetNoCompress() *FormPanel {\n\tf.NoCompress = true\n\treturn f\n}\n\nfunc (f *FormPanel) Set404Error(content ...template.HTML) *FormPanel {\n\tf.SetError(errors.PageError404, content...)\n\treturn f\n}\n\nfunc (f *FormPanel) Set403Error(content ...template.HTML) *FormPanel {\n\tf.SetError(errors.PageError403, content...)\n\treturn f\n}\n\nfunc (f *FormPanel) Set400Error(content ...template.HTML) *FormPanel {\n\tf.SetError(errors.PageError401, content...)\n\treturn f\n}\n\nfunc (f *FormPanel) Set500Error(content ...template.HTML) *FormPanel {\n\tf.SetError(errors.PageError500, content...)\n\treturn f\n}\n\nfunc (f *FormPanel) SetLayout(layout form2.Layout) *FormPanel {\n\tf.Layout = layout\n\treturn f\n}\n\nfunc (f *FormPanel) SetPostValidator(va FormPostFn) *FormPanel {\n\tf.Validator = va\n\treturn f\n}\n\nfunc (f *FormPanel) SetPreProcessFn(fn FormPreProcessFn) *FormPanel {\n\tf.PreProcessFn = fn\n\treturn f\n}\n\nfunc (f *FormPanel) SetHTMLContent(content template.HTML) *FormPanel {\n\tf.HTMLContent = content\n\treturn f\n}\n\nfunc (f *FormPanel) SetHeader(content template.HTML) *FormPanel {\n\tf.Header = content\n\treturn f\n}\n\nfunc (f *FormPanel) SetInputWidth(width int) *FormPanel {\n\tf.InputWidth = width\n\treturn f\n}\n\nfunc (f *FormPanel) SetHeadWidth(width int) *FormPanel {\n\tf.HeadWidth = width\n\treturn f\n}\n\nfunc (f *FormPanel) SetWrapper(wrapper ContentWrapper) *FormPanel {\n\tf.Wrapper = wrapper\n\treturn f\n}\n\nfunc (f *FormPanel) SetHideSideBar() *FormPanel {\n\tf.HideSideBar = true\n\treturn f\n}\n\nfunc (f *FormPanel) SetFormNewTitle(title template.HTML) *FormPanel {\n\tf.FormNewTitle = title\n\treturn f\n}\n\nfunc (f *FormPanel) SetFormNewBtnWord(word template.HTML) *FormPanel {\n\tf.FormNewBtnWord = word\n\treturn f\n}\n\nfunc (f *FormPanel) SetFormEditTitle(title template.HTML) *FormPanel {\n\tf.FormEditTitle = title\n\treturn f\n}\n\nfunc (f *FormPanel) SetFormEditBtnWord(word template.HTML) *FormPanel {\n\tf.FormEditBtnWord = word\n\treturn f\n}\n\nfunc (f *FormPanel) SetResponder(responder Responder) *FormPanel {\n\tf.Responder = responder\n\treturn f\n}\n\ntype AjaxData struct {\n\tSuccessTitle   string\n\tSuccessText    string\n\tErrorTitle     string\n\tErrorText      string\n\tSuccessJumpURL string\n\tDisableJump    bool\n\tSuccessJS      string\n\tJumpInNewTab   string\n}\n\nfunc (f *FormPanel) EnableAjaxData(data AjaxData) *FormPanel {\n\tf.Ajax = true\n\tif f.AjaxSuccessJS == template.JS(\"\") {\n\t\tsuccessMsg := modules.AorB(data.SuccessTitle != \"\", `\"`+data.SuccessTitle+`\"`, \"data.msg\")\n\t\terrorMsg := modules.AorB(data.ErrorTitle != \"\", `\"`+data.ErrorTitle+`\"`, \"data.msg\")\n\t\tjump := modules.AorB(data.SuccessJumpURL != \"\", `\"`+data.SuccessJumpURL+`\"`, \"data.data.url\")\n\t\ttext := modules.AorB(data.SuccessText != \"\", `text:\"`+data.SuccessText+`\",`, \"\")\n\t\twrongText := modules.AorB(data.ErrorText != \"\", `text:\"`+data.ErrorText+`\",`, \"text:data.msg,\")\n\t\tjumpURL := \"\"\n\t\tif !data.DisableJump {\n\t\t\tif data.JumpInNewTab != \"\" {\n\t\t\t\tjumpURL = `listenerForAddNavTab(` + jump + `, \"` + data.JumpInNewTab + `\");`\n\t\t\t}\n\t\t\tjumpURL += `$.pjax({url: ` + jump + `, container: '#pjax-container'});`\n\t\t} else {\n\t\t\tjumpURL = `\n\t\tif (data.data && data.data.token !== \"\") {\n\t\t\t$(\"input[name='__go_admin_t_']\").val(data.data.token)\n\t\t}`\n\t\t}\n\t\tf.AjaxSuccessJS = template.JS(`\n\tif (typeof (data) === \"string\") {\n\t    data = JSON.parse(data);\n\t}\n\tif (data.code === 200) {\n\t    swal({\n\t\t\ttype: \"success\",\n\t\t\ttitle: ` + successMsg + `,\n\t\t\t` + text + `\n\t\t\tshowCancelButton: false,\n\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\tconfirmButtonText: '` + language.Get(\"got it\") + `',\n        }, function() {\n\t\t\t$(\".modal-backdrop.fade.in\").remove();\n\t\t\t` + jumpURL + `\n\t\t\t` + data.SuccessJS + `\n        });\n\t} else {\n\t\tif (data.data && data.data.token !== \"\") {\n\t\t\t$(\"input[name='__go_admin_t_']\").val(data.data.token);\n\t\t}\n\t\tswal({\n\t\t\ttype: \"error\",\n\t\t\ttitle: ` + errorMsg + `,\n\t\t\t` + wrongText + `\n\t\t\tshowCancelButton: false,\n\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\tconfirmButtonText: '` + language.Get(\"got it\") + `',\n        })\n\t}\n`)\n\t}\n\tif f.AjaxErrorJS == template.JS(\"\") {\n\t\terrorMsg := modules.AorB(data.ErrorTitle != \"\", `\"`+data.ErrorTitle+`\"`, \"data.responseJSON.msg\")\n\t\terror2Msg := modules.AorB(data.ErrorTitle != \"\", `\"`+data.ErrorTitle+`\"`, \"'\"+language.Get(\"error\")+\"'\")\n\t\twrongText := modules.AorB(data.ErrorText != \"\", `text:\"`+data.ErrorText+`\",`, \"text:data.msg,\")\n\t\tf.AjaxErrorJS = template.JS(`\n\tif (data.responseText !== \"\") {\n\t\tif (data.responseJSON.data && data.responseJSON.data.token !== \"\") {\n\t\t\t$(\"input[name='__go_admin_t_']\").val(data.responseJSON.data.token)\n\t\t}\n\t\tswal({\n\t\t\ttype: \"error\",\n\t\t\ttitle: ` + errorMsg + `,\n\t\t\t` + wrongText + `\n\t\t\tshowCancelButton: false,\n\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\tconfirmButtonText: '` + language.Get(\"got it\") + `',\n        })\n\t} else {\n\t\tswal({\n\t\t\ttype: \"error\",\n\t\t\ttitle: ` + error2Msg + `,\n\t\t\t` + wrongText + `\n\t\t\tshowCancelButton: false,\n\t\t\tconfirmButtonColor: \"#3c8dbc\",\n\t\t\tconfirmButtonText: '` + language.Get(\"got it\") + `',\n        })\n\t}\n`)\n\t}\n\treturn f\n}\n\nfunc (f *FormPanel) EnableAjax(msgs ...string) *FormPanel {\n\tvar data AjaxData\n\tif len(msgs) > 0 && msgs[0] != \"\" {\n\t\tdata.SuccessTitle = msgs[0]\n\t}\n\tif len(msgs) > 1 && msgs[1] != \"\" {\n\t\tdata.ErrorTitle = msgs[1]\n\t}\n\tif len(msgs) > 2 && msgs[2] != \"\" {\n\t\tdata.SuccessJumpURL = msgs[2]\n\t}\n\tif len(msgs) > 3 && msgs[3] != \"\" {\n\t\tdata.SuccessText = msgs[3]\n\t}\n\tif len(msgs) > 4 && msgs[4] != \"\" {\n\t\tdata.ErrorText = msgs[4]\n\t}\n\treturn f.EnableAjaxData(data)\n}\n\nfunc (f *FormPanel) SetAjaxSuccessJS(js template.JS) *FormPanel {\n\tf.AjaxSuccessJS = js\n\treturn f\n}\n\nfunc (f *FormPanel) SetAjaxErrorJS(js template.JS) *FormPanel {\n\tf.AjaxErrorJS = js\n\treturn f\n}\n\nfunc (f *FormPanel) SetPostHook(fn FormPostFn) *FormPanel {\n\tf.PostHook = fn\n\treturn f\n}\n\nfunc (f *FormPanel) SetUpdateFn(fn FormPostFn) *FormPanel {\n\tf.UpdateFn = fn\n\treturn f\n}\n\nfunc (f *FormPanel) SetInsertFn(fn FormPostFn) *FormPanel {\n\tf.InsertFn = fn\n\treturn f\n}\n\nfunc (f *FormPanel) GroupFieldWithValue(pk, id string, columns []string, res map[string]interface{}, sql func() *db.SQL) ([]FormFields, []string) {\n\tvar (\n\t\tgroupFormList = make([]FormFields, 0)\n\t\tgroupHeaders  = make([]string, 0)\n\t\thasPK         = false\n\t\texistField    = make([]string, 0)\n\t)\n\n\tif len(f.TabGroups) > 0 {\n\t\tfor index, group := range f.TabGroups {\n\t\t\tlist := make(FormFields, 0)\n\t\t\tfor index, fieldName := range group {\n\t\t\t\tlabel := \"_ga_group_\" + strconv.Itoa(index)\n\t\t\t\tfield := f.FieldList.FindByFieldName(fieldName)\n\t\t\t\tif field != nil && field.isNotBelongToATable() && !field.NotAllowEdit {\n\t\t\t\t\tif !field.Hide {\n\t\t\t\t\t\tfield.Hide = field.EditHide\n\t\t\t\t\t}\n\t\t\t\t\tif field.FormType.IsTable() {\n\t\t\t\t\t\tfor z := 0; z < len(field.TableFields); z++ {\n\t\t\t\t\t\t\trowValue := field.TableFields[z].GetRawValue(columns, res[field.TableFields[z].Field])\n\t\t\t\t\t\t\tif field.TableFields[z].Field == pk {\n\t\t\t\t\t\t\t\thasPK = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfield.TableFields[z] = *(field.TableFields[z].UpdateValue(id, rowValue, res, sql()))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif utils.InArray(existField, field.Field) {\n\t\t\t\t\t\t\tfield.Field = field.Field + label\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlist = append(list, *field)\n\t\t\t\t\t\texistField = append(existField, field.Field)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif field.Field == pk {\n\t\t\t\t\t\t\thasPK = true\n\t\t\t\t\t\t}\n\t\t\t\t\t\trowValue := field.GetRawValue(columns, res[field.Field])\n\t\t\t\t\t\tif utils.InArray(existField, field.Field) {\n\t\t\t\t\t\t\tfield.Field = field.Field + label\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlist = append(list, *(field.UpdateValue(id, rowValue, res, sql())))\n\t\t\t\t\t\texistField = append(existField, field.Field)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgroupFormList = append(groupFormList, list.FillCustomContent())\n\t\t\tgroupHeaders = append(groupHeaders, f.TabHeaders[index])\n\t\t}\n\n\t\tif len(groupFormList) > 0 && !hasPK {\n\t\t\tgroupFormList[len(groupFormList)-1] = groupFormList[len(groupFormList)-1].Add(&FormField{\n\t\t\t\tHead:       pk,\n\t\t\t\tFieldClass: pk,\n\t\t\t\tField:      pk,\n\t\t\t\tValue:      template.HTML(id),\n\t\t\t\tHide:       true,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn groupFormList, groupHeaders\n}\n\nfunc (f *FormPanel) GroupField(sql ...func() *db.SQL) ([]FormFields, []string) {\n\tvar (\n\t\tgroupFormList = make([]FormFields, 0)\n\t\tgroupHeaders  = make([]string, 0)\n\t\texistField    = make([]string, 0)\n\t)\n\n\tfor index, group := range f.TabGroups {\n\t\tlist := make(FormFields, 0)\n\t\tfor index, fieldName := range group {\n\t\t\tfield := f.FieldList.FindByFieldName(fieldName)\n\t\t\tlabel := \"_ga_group_\" + strconv.Itoa(index)\n\t\t\tif field != nil && field.isNotBelongToATable() && field.allowAdd() {\n\t\t\t\tfield.Editable = !field.DisplayButNotAdd\n\t\t\t\tif !field.Hide {\n\t\t\t\t\tfield.Hide = field.CreateHide\n\t\t\t\t}\n\t\t\t\tif field.FormType.IsTable() {\n\t\t\t\t\tfor z := 0; z < len(field.TableFields); z++ {\n\t\t\t\t\t\tif len(sql) > 0 {\n\t\t\t\t\t\t\tfield.TableFields[z] = *(field.TableFields[z].UpdateDefaultValue(sql[0]()))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfield.TableFields[z] = *(field.TableFields[z].UpdateDefaultValue(nil))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif utils.InArray(existField, field.Field) {\n\t\t\t\t\t\tfield.Field = field.Field + label\n\t\t\t\t\t}\n\t\t\t\t\tlist = append(list, *field)\n\t\t\t\t\texistField = append(existField, field.Field)\n\t\t\t\t} else {\n\t\t\t\t\tif utils.InArray(existField, field.Field) {\n\t\t\t\t\t\tfield.Field = field.Field + label\n\t\t\t\t\t}\n\t\t\t\t\tif len(sql) > 0 {\n\t\t\t\t\t\tlist = append(list, *(field.UpdateDefaultValue(sql[0]())))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlist = append(list, *(field.UpdateDefaultValue(nil)))\n\t\t\t\t\t}\n\t\t\t\t\texistField = append(existField, field.Field)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tgroupFormList = append(groupFormList, list.FillCustomContent())\n\t\tgroupHeaders = append(groupHeaders, f.TabHeaders[index])\n\t}\n\n\treturn groupFormList, groupHeaders\n}\n\nfunc (f *FormPanel) FieldsWithValue(pk, id string, columns []string, res map[string]interface{}, sql func() *db.SQL) FormFields {\n\tvar (\n\t\tlist  = make(FormFields, 0)\n\t\thasPK = false\n\t)\n\tfor i := 0; i < len(f.FieldList); i++ {\n\t\tif !f.FieldList[i].NotAllowEdit {\n\t\t\tif !f.FieldList[i].Hide {\n\t\t\t\tf.FieldList[i].Hide = f.FieldList[i].EditHide\n\t\t\t}\n\t\t\trowValue := f.FieldList[i].GetRawValue(columns, res[f.FieldList[i].Field])\n\t\t\tif f.FieldList[i].FatherField != \"\" {\n\t\t\t\tf.FieldList.FindTableField(f.FieldList[i].Field, f.FieldList[i].FatherField).UpdateValue(id, rowValue, res, sql())\n\t\t\t} else if f.FieldList[i].FormType.IsTable() {\n\t\t\t\tlist = append(list, f.FieldList[i])\n\t\t\t} else {\n\t\t\t\tlist = append(list, *(f.FieldList[i].UpdateValue(id, rowValue, res, sql())))\n\t\t\t}\n\n\t\t\tif f.FieldList[i].Field == pk {\n\t\t\t\thasPK = true\n\t\t\t}\n\t\t}\n\t}\n\tif !hasPK {\n\t\tlist = list.Add(&FormField{\n\t\t\tHead:       pk,\n\t\t\tFieldClass: pk,\n\t\t\tField:      pk,\n\t\t\tValue:      template.HTML(id),\n\t\t\tFormType:   form2.Default,\n\t\t\tHide:       true,\n\t\t})\n\t}\n\treturn list.FillCustomContent()\n}\n\nfunc (f *FormPanel) FieldsWithDefaultValue(sql ...func() *db.SQL) FormFields {\n\tvar list = make(FormFields, 0)\n\tfor i := 0; i < len(f.FieldList); i++ {\n\t\tif f.FieldList[i].allowAdd() {\n\t\t\tf.FieldList[i].Editable = !f.FieldList[i].DisplayButNotAdd\n\t\t\tif !f.FieldList[i].Hide {\n\t\t\t\tf.FieldList[i].Hide = f.FieldList[i].CreateHide\n\t\t\t}\n\t\t\tif f.FieldList[i].FatherField != \"\" {\n\t\t\t\tif len(sql) > 0 {\n\t\t\t\t\tf.FieldList.FindTableField(f.FieldList[i].Field, f.FieldList[i].FatherField).UpdateDefaultValue(sql[0]())\n\t\t\t\t} else {\n\t\t\t\t\tf.FieldList.FindTableField(f.FieldList[i].Field, f.FieldList[i].FatherField).UpdateDefaultValue(nil)\n\t\t\t\t}\n\t\t\t} else if f.FieldList[i].FormType.IsTable() {\n\t\t\t\tlist = append(list, f.FieldList[i])\n\t\t\t} else {\n\t\t\t\tif len(sql) > 0 {\n\t\t\t\t\tlist = append(list, *(f.FieldList[i].UpdateDefaultValue(sql[0]())))\n\t\t\t\t} else {\n\t\t\t\t\tlist = append(list, *(f.FieldList[i].UpdateDefaultValue(nil)))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn list.FillCustomContent().RemoveNotShow()\n}\n\nfunc (f *FormPanel) GetNewFormFields(sql ...func() *db.SQL) (FormFields, []FormFields, []string) {\n\tif len(f.TabGroups) > 0 {\n\t\ttabFields, tabHeaders := f.GroupField(sql...)\n\t\treturn make(FormFields, 0), tabFields, tabHeaders\n\t}\n\treturn f.FieldsWithDefaultValue(sql...), make([]FormFields, 0), make([]string, 0)\n}\n\ntype (\n\tFormPreProcessFn  func(values form.Values) form.Values\n\tFormPostFn        func(values form.Values) error\n\tFormFields        []FormField\n\tGroupFormFields   []FormFields\n\tGroupFieldHeaders []string\n)\n\nfunc (f FormFields) Copy() FormFields {\n\tformList := make(FormFields, len(f))\n\tcopy(formList, f)\n\tfor i := 0; i < len(formList); i++ {\n\t\tformList[i].Options = make(FieldOptions, len(f[i].Options))\n\t\tfor j := 0; j < len(f[i].Options); j++ {\n\t\t\tformList[i].Options[j] = FieldOption{\n\t\t\t\tValue:    f[i].Options[j].Value,\n\t\t\t\tText:     f[i].Options[j].Text,\n\t\t\t\tTextHTML: f[i].Options[j].TextHTML,\n\t\t\t\tSelected: f[i].Options[j].Selected,\n\t\t\t}\n\t\t}\n\t}\n\treturn formList\n}\n\nfunc (f FormFields) FindByFieldName(field string) *FormField {\n\tfor i := 0; i < len(f); i++ {\n\t\tif f[i].Field == field {\n\t\t\treturn &f[i]\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f FormFields) FindIndexByFieldName(field string) int {\n\tfor i := 0; i < len(f); i++ {\n\t\tif f[i].Field == field {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\nfunc (f FormFields) FindTableField(field, father string) *FormField {\n\tff := f.FindByFieldName(father)\n\treturn ff.TableFields.FindByFieldName(field)\n}\n\nfunc (f FormFields) FindTableChildren(father string) []*FormField {\n\tlist := make([]*FormField, 0)\n\tfor i := 0; i < len(f); i++ {\n\t\tif f[i].FatherField == father {\n\t\t\tlist = append(list, &f[i])\n\t\t}\n\t}\n\treturn list\n}\n\nfunc (f FormFields) FillCustomContent() FormFields {\n\tfor i := range f {\n\t\tif f[i].FormType.IsCustom() {\n\t\t\tf[i] = *(f[i]).FillCustomContent()\n\t\t}\n\t}\n\treturn f\n}\n\nfunc (f FormFields) Add(field *FormField) FormFields {\n\treturn append(f, *field)\n}\n\nfunc (f FormFields) RemoveNotShow() FormFields {\n\tff := f\n\tfor i := 0; i < len(ff); {\n\t\tif ff[i].FatherFormType == form2.Table {\n\t\t\tff = append(ff[:i], ff[i+1:]...)\n\t\t} else {\n\t\t\ti++\n\t\t}\n\t}\n\treturn ff\n}\n"
  },
  {
    "path": "template/types/form_test.go",
    "content": "package types\n"
  },
  {
    "path": "template/types/info.go",
    "content": "package types\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"html\"\n\t\"html/template\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logger\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/table\"\n)\n\n// FieldModel is the single query result.\ntype FieldModel struct {\n\t// The primaryKey of the table.\n\tID string\n\n\t// The value of the single query result.\n\tValue string\n\n\t// The current row data.\n\tRow map[string]interface{}\n\n\t// Post type\n\tPostType PostType\n}\n\ntype PostType uint8\n\nconst (\n\tPostTypeCreate = iota\n\tPostTypeUpdate\n)\n\nfunc (m FieldModel) IsCreate() bool {\n\treturn m.PostType == PostTypeCreate\n}\n\nfunc (m FieldModel) IsUpdate() bool {\n\treturn m.PostType == PostTypeUpdate\n}\n\n// PostFieldModel contains ID and value of the single query result and the current row data.\ntype PostFieldModel struct {\n\tID    string\n\tValue FieldModelValue\n\tRow   map[string]string\n\t// Post type\n\tPostType PostType\n}\n\nfunc (m PostFieldModel) IsCreate() bool {\n\treturn m.PostType == PostTypeCreate\n}\n\nfunc (m PostFieldModel) IsUpdate() bool {\n\treturn m.PostType == PostTypeUpdate\n}\n\ntype InfoList []map[string]InfoItem\n\ntype InfoItem struct {\n\tContent template.HTML `json:\"content\"`\n\tValue   string        `json:\"value\"`\n}\n\nfunc (i InfoList) GroupBy(groups TabGroups) []InfoList {\n\n\tvar res = make([]InfoList, len(groups))\n\n\tfor key, value := range groups {\n\t\tvar newInfoList = make(InfoList, len(i))\n\n\t\tfor index, info := range i {\n\t\t\tvar newRow = make(map[string]InfoItem)\n\t\t\tfor mk, m := range info {\n\t\t\t\tif modules.InArray(value, mk) {\n\t\t\t\t\tnewRow[mk] = m\n\t\t\t\t}\n\t\t\t}\n\t\t\tnewInfoList[index] = newRow\n\t\t}\n\n\t\tres[key] = newInfoList\n\t}\n\n\treturn res\n}\n\ntype Callbacks []context.Node\n\nfunc (c Callbacks) AddCallback(node context.Node) Callbacks {\n\tif node.Path != \"\" && node.Method != \"\" && len(node.Handlers) > 0 {\n\t\tfor _, item := range c {\n\t\t\tif strings.EqualFold(item.Path, node.Path) &&\n\t\t\t\tstrings.EqualFold(item.Method, node.Method) {\n\t\t\t\treturn c\n\t\t\t}\n\t\t}\n\t\tparr := strings.Split(node.Path, \"?\")\n\t\tif len(parr) > 1 {\n\t\t\tnode.Path = parr[0]\n\t\t\treturn append(c, node)\n\t\t}\n\t\treturn append(c, node)\n\t}\n\treturn c\n}\n\ntype FieldModelValue []string\n\nfunc (r FieldModelValue) Value() string {\n\treturn r.First()\n}\n\nfunc (r FieldModelValue) First() string {\n\tif len(r) > 0 {\n\t\treturn r[0]\n\t}\n\treturn \"\"\n}\n\n// FieldDisplay is filter function of data.\ntype FieldFilterFn func(value FieldModel) interface{}\n\n// PostFieldFilterFn is filter function of data.\ntype PostFieldFilterFn func(value PostFieldModel) interface{}\n\n// Field is the table field.\ntype Field struct {\n\tHead     string\n\tField    string\n\tTypeName db.DatabaseType\n\n\tJoins Joins\n\n\tWidth       int\n\tSortable    bool\n\tEditAble    bool\n\tFixed       bool\n\tFilterable  bool\n\tHide        bool\n\tHideForList bool\n\n\tEditType    table.Type\n\tEditOptions FieldOptions\n\n\tFilterFormFields []FilterFormField\n\n\tIsEditParam   bool\n\tIsDeleteParam bool\n\tIsDetailParam bool\n\n\tFieldDisplay\n}\n\ntype QueryFilterFn func(param parameter.Parameters, conn db.Connection) (ids []string, stopQuery bool)\ntype UpdateParametersFn func(param *parameter.Parameters)\n\ntype FilterFormField struct {\n\tType        form.Type\n\tOptions     FieldOptions\n\tOptionTable OptionTable\n\tWidth       int\n\tHeadWidth   int\n\tInputWidth  int\n\tStyle       template.HTMLAttr\n\tOperator    FilterOperator\n\tOptionExt   template.JS\n\tHead        string\n\tPlaceholder string\n\tHelpMsg     template.HTML\n\tNoIcon      bool\n\tProcessFn   func(string) string\n}\n\nfunc (f Field) GetFilterFormFields(params parameter.Parameters, headField string, sql ...*db.SQL) []FormField {\n\n\tvar (\n\t\tfilterForm               = make([]FormField, 0)\n\t\tvalue, value2, keySuffix string\n\t)\n\n\tfor index, filter := range f.FilterFormFields {\n\n\t\tif index > 0 {\n\t\t\tkeySuffix = parameter.FilterParamCountInfix + strconv.Itoa(index)\n\t\t}\n\n\t\tif filter.Type.IsRange() {\n\t\t\tvalue = params.GetFilterFieldValueStart(headField)\n\t\t\tvalue2 = params.GetFilterFieldValueEnd(headField)\n\t\t} else if filter.Type.IsMultiSelect() {\n\t\t\tvalue = params.GetFieldValuesStr(headField)\n\t\t} else {\n\t\t\tif filter.Operator == FilterOperatorFree {\n\t\t\t\tvalue2 = GetOperatorFromValue(params.GetFieldOperator(headField, keySuffix)).String()\n\t\t\t}\n\t\t\tvalue = params.GetFieldValue(headField + keySuffix)\n\t\t}\n\n\t\tvar (\n\t\t\toptionExt1 = filter.OptionExt\n\t\t\toptionExt2 template.JS\n\t\t)\n\n\t\tif filter.OptionExt == template.JS(\"\") {\n\t\t\top1, op2, js := filter.Type.GetDefaultOptions(headField + keySuffix)\n\t\t\tif op1 != nil {\n\t\t\t\ts, _ := json.Marshal(op1)\n\t\t\t\toptionExt1 = template.JS(string(s))\n\t\t\t}\n\t\t\tif op2 != nil {\n\t\t\t\ts, _ := json.Marshal(op2)\n\t\t\t\toptionExt2 = template.JS(string(s))\n\t\t\t}\n\t\t\tif js != template.JS(\"\") {\n\t\t\t\toptionExt1 = js\n\t\t\t}\n\t\t}\n\n\t\tfield := &FormField{\n\t\t\tField:       headField + keySuffix,\n\t\t\tFieldClass:  headField + keySuffix,\n\t\t\tHead:        filter.Head,\n\t\t\tTypeName:    f.TypeName,\n\t\t\tHelpMsg:     filter.HelpMsg,\n\t\t\tNoIcon:      filter.NoIcon,\n\t\t\tFormType:    filter.Type,\n\t\t\tEditable:    true,\n\t\t\tWidth:       filter.Width,\n\t\t\tHeadWidth:   filter.HeadWidth,\n\t\t\tInputWidth:  filter.InputWidth,\n\t\t\tStyle:       filter.Style,\n\t\t\tPlaceholder: filter.Placeholder,\n\t\t\tValue:       template.HTML(value),\n\t\t\tValue2:      value2,\n\t\t\tOptions:     filter.Options,\n\t\t\tOptionExt:   optionExt1,\n\t\t\tOptionExt2:  optionExt2,\n\t\t\tOptionTable: filter.OptionTable,\n\t\t\tLabel:       filter.Operator.Label(),\n\t\t}\n\n\t\tfield.setOptionsFromSQL(sql[0])\n\n\t\tif filter.Type.IsSingleSelect() {\n\t\t\tfield.Options = field.Options.SetSelected(params.GetFieldValue(f.Field), filter.Type.SelectedLabel())\n\t\t}\n\n\t\tif filter.Type.IsMultiSelect() {\n\t\t\tfield.Options = field.Options.SetSelected(params.GetFieldValues(f.Field), filter.Type.SelectedLabel())\n\t\t}\n\n\t\tfilterForm = append(filterForm, *field)\n\n\t\tif filter.Operator.AddOrNot() {\n\t\t\tff := headField + parameter.FilterParamOperatorSuffix + keySuffix\n\t\t\tfilterForm = append(filterForm, FormField{\n\t\t\t\tField:      ff,\n\t\t\t\tFieldClass: ff,\n\t\t\t\tHead:       f.Head,\n\t\t\t\tTypeName:   f.TypeName,\n\t\t\t\tValue:      template.HTML(filter.Operator.Value()),\n\t\t\t\tFormType:   filter.Type,\n\t\t\t\tHide:       true,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn filterForm\n}\n\nfunc (f Field) Exist() bool {\n\treturn f.Field != \"\"\n}\n\ntype FieldList []Field\n\ntype TableInfo struct {\n\tTable      string\n\tPrimaryKey string\n\tDelimiter  string\n\tDelimiter2 string\n\tDriver     string\n}\n\nfunc (f FieldList) GetTheadAndFilterForm(info TableInfo, params parameter.Parameters, columns []string,\n\tsql ...func() *db.SQL) (Thead, string, string, string, []string, []FormField) {\n\tvar (\n\t\tthead      = make(Thead, 0)\n\t\tfields     = \"\"\n\t\tjoinFields = \"\"\n\t\tjoins      = \"\"\n\t\tjoinTables = make([]string, 0)\n\t\tfilterForm = make([]FormField, 0)\n\t\ttableName  = info.Delimiter + info.Table + info.Delimiter2\n\t)\n\tfor _, field := range f {\n\t\tif field.Field != info.PrimaryKey && modules.InArray(columns, field.Field) &&\n\t\t\t!field.Joins.Valid() {\n\t\t\tfields += tableName + \".\" + modules.FilterField(field.Field, info.Delimiter, info.Delimiter2) + \",\"\n\t\t}\n\n\t\theadField := field.Field\n\n\t\tif field.Joins.Valid() {\n\t\t\theadField = field.Joins.Last().GetTableName() + parameter.FilterParamJoinInfix + field.Field\n\t\t\tjoinFields += db.GetAggregationExpression(info.Driver, field.Joins.Last().GetTableName(info.Delimiter, info.Delimiter2)+\".\"+\n\t\t\t\tmodules.FilterField(field.Field, info.Delimiter, info.Delimiter2), headField, JoinFieldValueDelimiter) + \",\"\n\t\t\tfor _, join := range field.Joins {\n\t\t\t\tif !modules.InArray(joinTables, join.GetTableName(info.Delimiter, info.Delimiter2)) {\n\t\t\t\t\tjoinTables = append(joinTables, join.GetTableName(info.Delimiter, info.Delimiter2))\n\t\t\t\t\tif join.BaseTable == \"\" {\n\t\t\t\t\t\tjoin.BaseTable = info.Table\n\t\t\t\t\t}\n\t\t\t\t\tjoins += \" left join \" + modules.FilterField(join.Table, info.Delimiter, info.Delimiter2) + \" \" + join.TableAlias + \" on \" +\n\t\t\t\t\t\tjoin.GetTableName(info.Delimiter, info.Delimiter2) + \".\" + modules.FilterField(join.JoinField, info.Delimiter, info.Delimiter2) + \" = \" +\n\t\t\t\t\t\tmodules.Delimiter(info.Delimiter, info.Delimiter2, join.BaseTable) + \".\" + modules.FilterField(join.Field, info.Delimiter, info.Delimiter2)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif field.Filterable {\n\t\t\tif len(sql) > 0 {\n\t\t\t\tfilterForm = append(filterForm, field.GetFilterFormFields(params, headField, sql[0]())...)\n\t\t\t} else {\n\t\t\t\tfilterForm = append(filterForm, field.GetFilterFormFields(params, headField)...)\n\t\t\t}\n\t\t}\n\n\t\tif field.Hide {\n\t\t\tcontinue\n\t\t}\n\t\tif field.HideForList {\n\t\t\tcontinue\n\t\t}\n\t\tthead = append(thead, TheadItem{\n\t\t\tHead:       field.Head,\n\t\t\tSortable:   field.Sortable,\n\t\t\tField:      headField,\n\t\t\tHide:       !modules.InArrayWithoutEmpty(params.Columns, headField),\n\t\t\tEditable:   field.EditAble,\n\t\t\tEditType:   field.EditType.String(),\n\t\t\tEditOption: field.EditOptions,\n\t\t\tWidth:      strconv.Itoa(field.Width) + \"px\",\n\t\t})\n\t}\n\n\treturn thead, fields, joinFields, joins, joinTables, filterForm\n}\n\nfunc (f FieldList) GetThead(info TableInfo, params parameter.Parameters, columns []string) (Thead, string, string) {\n\tvar (\n\t\tthead      = make(Thead, 0)\n\t\tfields     = \"\"\n\t\tjoins      = \"\"\n\t\tjoinTables = make([]string, 0)\n\t)\n\tfor _, field := range f {\n\t\tif field.Field != info.PrimaryKey && modules.InArray(columns, field.Field) &&\n\t\t\t!field.Joins.Valid() {\n\t\t\tfields += info.Table + \".\" + modules.FilterField(field.Field, info.Delimiter, info.Delimiter2) + \",\"\n\t\t}\n\n\t\theadField := field.Field\n\n\t\tif field.Joins.Valid() {\n\t\t\theadField = field.Joins.Last().GetTableName(info.Delimiter, info.Delimiter2) + parameter.FilterParamJoinInfix + field.Field\n\t\t\tfor _, join := range field.Joins {\n\t\t\t\tif !modules.InArray(joinTables, join.GetTableName(info.Delimiter, info.Delimiter2)) {\n\t\t\t\t\tjoinTables = append(joinTables, join.GetTableName(info.Delimiter, info.Delimiter2))\n\t\t\t\t\tif join.BaseTable == \"\" {\n\t\t\t\t\t\tjoin.BaseTable = info.Table\n\t\t\t\t\t}\n\t\t\t\t\tjoins += \" left join \" + modules.FilterField(join.Table, info.Delimiter, info.Delimiter2) + \" \" + join.TableAlias + \" on \" +\n\t\t\t\t\t\tjoin.GetTableName(info.Delimiter, info.Delimiter2) + \".\" + modules.FilterField(join.JoinField, info.Delimiter, info.Delimiter2) + \" = \" +\n\t\t\t\t\t\tmodules.Delimiter(info.Delimiter, info.Delimiter2, join.BaseTable) + \".\" + modules.FilterField(join.Field, info.Delimiter, info.Delimiter2)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif field.Hide {\n\t\t\tcontinue\n\t\t}\n\t\tthead = append(thead, TheadItem{\n\t\t\tHead:       field.Head,\n\t\t\tSortable:   field.Sortable,\n\t\t\tField:      headField,\n\t\t\tHide:       !modules.InArrayWithoutEmpty(params.Columns, headField),\n\t\t\tEditable:   field.EditAble,\n\t\t\tEditType:   field.EditType.String(),\n\t\t\tEditOption: field.EditOptions,\n\t\t\tWidth:      strconv.Itoa(field.Width) + \"px\",\n\t\t})\n\t}\n\n\treturn thead, fields, joins\n}\n\nfunc (f FieldList) GetFieldFilterProcessValue(key, value, keyIndex string) string {\n\tfield := f.GetFieldByFieldName(key)\n\tindex := 0\n\tif keyIndex != \"\" {\n\t\tindex, _ = strconv.Atoi(keyIndex)\n\t}\n\tif field.FilterFormFields != nil && len(field.FilterFormFields) > index {\n\t\tif field.FilterFormFields[index].ProcessFn != nil {\n\t\t\tvalue = field.FilterFormFields[index].ProcessFn(value)\n\t\t}\n\t}\n\treturn value\n}\n\nfunc (f FieldList) GetFieldJoinTable(key string) string {\n\tfield := f.GetFieldByFieldName(key)\n\tif field.Exist() {\n\t\treturn field.Joins.Last().Table\n\t}\n\treturn \"\"\n}\n\nfunc (f FieldList) GetFieldByFieldName(name string) Field {\n\tfor _, field := range f {\n\t\tif field.Field == name {\n\t\t\treturn field\n\t\t}\n\t\tif JoinField(field.Joins.Last().GetTableName(), field.Field) == name {\n\t\t\treturn field\n\t\t}\n\t}\n\treturn Field{}\n}\n\n// Join store join table info. For example:\n//\n//\tJoin {\n//\t    BaseTable:   \"users\",\n//\t    Field:       \"role_id\",\n//\t    Table:       \"roles\",\n//\t    JoinField:   \"id\",\n//\t}\n//\n// It will generate the join table sql like:\n//\n// ... left join roles on roles.id = users.role_id ...\ntype Join struct {\n\tTable      string\n\tTableAlias string\n\tField      string\n\tJoinField  string\n\tBaseTable  string\n}\n\ntype Joins []Join\n\nfunc JoinField(table, field string) string {\n\treturn table + parameter.FilterParamJoinInfix + field\n}\n\nfunc GetJoinField(field string) string {\n\treturn strings.Split(field, parameter.FilterParamJoinInfix)[1]\n}\n\nfunc (j Joins) Valid() bool {\n\tfor i := 0; i < len(j); i++ {\n\t\tif j[i].Valid() {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (j Joins) Last() Join {\n\tif len(j) > 0 {\n\t\treturn j[len(j)-1]\n\t}\n\treturn Join{}\n}\n\nfunc (j Join) Valid() bool {\n\treturn j.Table != \"\" && j.Field != \"\" && j.JoinField != \"\"\n}\n\nfunc (j Join) GetTableName(delimiter ...string) string {\n\tif j.TableAlias != \"\" {\n\t\treturn j.TableAlias\n\t}\n\tif len(delimiter) > 0 {\n\t\treturn delimiter[0] + j.Table + delimiter[1]\n\t}\n\treturn j.Table\n}\n\nvar JoinFieldValueDelimiter = utils.Uuid(8)\n\ntype TabGroups [][]string\n\nfunc (t TabGroups) Valid() bool {\n\treturn len(t) > 0\n}\n\nfunc NewTabGroups(items ...string) TabGroups {\n\tvar t = make(TabGroups, 0)\n\treturn append(t, items)\n}\n\nfunc (t TabGroups) AddGroup(items ...string) TabGroups {\n\treturn append(t, items)\n}\n\ntype TabHeaders []string\n\nfunc (t TabHeaders) Add(header string) TabHeaders {\n\treturn append(t, header)\n}\n\ntype GetDataFn func(param parameter.Parameters) ([]map[string]interface{}, int)\n\ntype DeleteFn func(ids []string) error\ntype DeleteFnWithRes func(ids []string, res error) error\n\ntype Sort uint8\n\nconst (\n\tSortDesc Sort = iota\n\tSortAsc\n)\n\ntype primaryKey struct {\n\tType db.DatabaseType\n\tName string\n}\n\ntype ExportProcessFn func(param parameter.Parameters) (PanelInfo, error)\n\n// InfoPanel\ntype InfoPanel struct {\n\tCtx *context.Context\n\n\tFieldList         FieldList\n\tcurFieldListIndex int\n\n\tTable       string\n\tTitle       string\n\tDescription string\n\n\t// Warn: may be deprecated future.\n\tTabGroups  TabGroups\n\tTabHeaders TabHeaders\n\n\tSort      Sort\n\tSortField string\n\n\tPageSizeList    []int\n\tDefaultPageSize int\n\n\tExportType      int\n\tExportProcessFn ExportProcessFn\n\n\tprimaryKey primaryKey\n\n\tIsHideNewButton    bool\n\tIsHideExportButton bool\n\tIsHideEditButton   bool\n\tIsHideDeleteButton bool\n\tIsHideDetailButton bool\n\tIsHideFilterButton bool\n\tIsHideRowSelector  bool\n\tIsHidePagination   bool\n\tIsHideFilterArea   bool\n\tIsHideQueryInfo    bool\n\tFilterFormLayout   form.Layout\n\n\tFilterFormHeadWidth  int\n\tFilterFormInputWidth int\n\n\tWheres    Wheres\n\tWhereRaws WhereRaw\n\n\tCallbacks Callbacks\n\n\tButtons Buttons\n\n\tTableLayout string\n\n\tDeleteHook  DeleteFn\n\tPreDeleteFn DeleteFn\n\tDeleteFn    DeleteFn\n\n\tDeleteHookWithRes DeleteFnWithRes\n\n\tGetDataFn GetDataFn\n\n\tprocessChains DisplayProcessFnChains\n\n\tActionButtons    Buttons\n\tActionButtonFold bool\n\n\tDisplayGeneratorRecords map[string]struct{}\n\n\tQueryFilterFn       QueryFilterFn\n\tUpdateParametersFns []UpdateParametersFn\n\n\tWrapper ContentWrapper\n\n\t// column operation buttons\n\tAction     template.HTML\n\tHeaderHtml template.HTML\n\tFooterHtml template.HTML\n\n\tPageError     errors.PageError\n\tPageErrorHTML template.HTML\n\n\tNoCompress  bool\n\tHideSideBar bool\n\n\tAutoRefresh uint\n}\n\ntype Where struct {\n\tJoin     string\n\tField    string\n\tOperator string\n\tArg      interface{}\n}\n\ntype Wheres []Where\n\nfunc (whs Wheres) Statement(wheres, delimiter, delimiter2 string, whereArgs []interface{}, existKeys, columns []string) (string, []interface{}) {\n\tpwheres := \"\"\n\tfor k, wh := range whs {\n\n\t\twhFieldArr := strings.Split(wh.Field, \".\")\n\t\twhField := \"\"\n\t\twhTable := \"\"\n\t\tif len(whFieldArr) > 1 {\n\t\t\twhField = whFieldArr[1]\n\t\t\twhTable = whFieldArr[0]\n\t\t} else {\n\t\t\twhField = whFieldArr[0]\n\t\t}\n\n\t\tif modules.InArray(existKeys, whField) {\n\t\t\tcontinue\n\t\t}\n\n\t\t// TODO: support like operation and join table\n\t\tif modules.InArray(columns, whField) {\n\n\t\t\tjoinMark := \"\"\n\t\t\tif k != len(whs)-1 {\n\t\t\t\tjoinMark = whs[k+1].Join\n\t\t\t}\n\n\t\t\tif whTable != \"\" {\n\t\t\t\tpwheres += whTable + \".\" + modules.FilterField(whField, delimiter, delimiter2) + \" \" + wh.Operator + \" ? \" + joinMark + \" \"\n\t\t\t} else {\n\t\t\t\tpwheres += modules.FilterField(whField, delimiter, delimiter2) + \" \" + wh.Operator + \" ? \" + joinMark + \" \"\n\t\t\t}\n\t\t\twhereArgs = append(whereArgs, wh.Arg)\n\t\t}\n\t}\n\tif wheres != \"\" && pwheres != \"\" {\n\t\twheres += \" and \"\n\t}\n\treturn wheres + pwheres, whereArgs\n}\n\ntype WhereRaw struct {\n\tRaw  string\n\tArgs []interface{}\n}\n\nfunc (wh WhereRaw) check() int {\n\tindex := 0\n\tfor i := 0; i < len(wh.Raw); i++ {\n\t\tif wh.Raw[i] == ' ' {\n\t\t\tcontinue\n\t\t}\n\t\tif wh.Raw[i] == 'a' {\n\t\t\tif len(wh.Raw) < i+3 {\n\t\t\t\tbreak\n\t\t\t} else if wh.Raw[i+1] == 'n' && wh.Raw[i+2] == 'd' {\n\t\t\t\tindex = i + 3\n\t\t\t}\n\t\t} else if wh.Raw[i] == 'o' {\n\t\t\tif len(wh.Raw) < i+2 {\n\t\t\t\tbreak\n\t\t\t} else if wh.Raw[i+1] == 'r' {\n\t\t\t\tindex = i + 2\n\t\t\t}\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn index\n}\n\nfunc (wh WhereRaw) Statement(wheres string, whereArgs []interface{}) (string, []interface{}) {\n\n\tif wh.Raw == \"\" {\n\t\treturn wheres, whereArgs\n\t}\n\n\tif wheres != \"\" {\n\t\tif wh.check() != 0 {\n\t\t\twheres += wh.Raw + \" \"\n\t\t} else {\n\t\t\twheres += \" and \" + wh.Raw + \" \"\n\t\t}\n\n\t\twhereArgs = append(whereArgs, wh.Args...)\n\t} else {\n\t\twheres += wh.Raw[wh.check():] + \" \"\n\t\twhereArgs = append(whereArgs, wh.Args...)\n\t}\n\n\treturn wheres, whereArgs\n}\n\ntype Handler func(ctx *context.Context) (success bool, msg string, data interface{})\n\nfunc (h Handler) Wrap() context.Handler {\n\treturn func(ctx *context.Context) {\n\t\tdefer func() {\n\t\t\tif err := recover(); err != nil {\n\t\t\t\tlogger.Error(err)\n\t\t\t\tctx.JSON(http.StatusInternalServerError, map[string]interface{}{\n\t\t\t\t\t\"code\": 500,\n\t\t\t\t\t\"data\": \"\",\n\t\t\t\t\t\"msg\":  \"error\",\n\t\t\t\t})\n\t\t\t}\n\t\t}()\n\n\t\tcode := 0\n\t\ts, m, d := h(ctx)\n\n\t\tif !s {\n\t\t\tcode = 500\n\t\t}\n\t\tctx.JSON(http.StatusOK, map[string]interface{}{\n\t\t\t\"code\": code,\n\t\t\t\"data\": d,\n\t\t\t\"msg\":  m,\n\t\t})\n\t}\n}\n\ntype ContentWrapper func(content template.HTML) template.HTML\n\ntype Action interface {\n\tJs() template.JS\n\tBtnAttribute() template.HTML\n\tBtnClass() template.HTML\n\tExtContent(ctx *context.Context) template.HTML\n\tFooterContent(ctx *context.Context) template.HTML\n\tSetBtnId(btnId string)\n\tSetBtnData(data interface{})\n\tGetCallbacks() context.Node\n}\n\ntype NilAction struct{}\n\nfunc (def *NilAction) SetBtnId(btnId string)                            {}\nfunc (def *NilAction) SetBtnData(data interface{})                      {}\nfunc (def *NilAction) Js() template.JS                                  { return \"\" }\nfunc (def *NilAction) BtnAttribute() template.HTML                      { return \"\" }\nfunc (def *NilAction) BtnClass() template.HTML                          { return \"\" }\nfunc (def *NilAction) ExtContent(ctx *context.Context) template.HTML    { return \"\" }\nfunc (def *NilAction) FooterContent(ctx *context.Context) template.HTML { return \"\" }\nfunc (def *NilAction) GetCallbacks() context.Node                       { return context.Node{} }\n\ntype Actions []Action\n\ntype DefaultAction struct {\n\tAttr   template.HTML\n\tJS     template.JS\n\tExt    template.HTML\n\tFooter template.HTML\n}\n\nfunc NewDefaultAction(attr, ext, footer template.HTML, js template.JS) *DefaultAction {\n\treturn &DefaultAction{Attr: attr, Ext: ext, Footer: footer, JS: js}\n}\n\nfunc (def *DefaultAction) SetBtnId(btnId string)                            {}\nfunc (def *DefaultAction) SetBtnData(data interface{})                      {}\nfunc (def *DefaultAction) Js() template.JS                                  { return def.JS }\nfunc (def *DefaultAction) BtnAttribute() template.HTML                      { return def.Attr }\nfunc (def *DefaultAction) BtnClass() template.HTML                          { return \"\" }\nfunc (def *DefaultAction) ExtContent(ctx *context.Context) template.HTML    { return def.Ext }\nfunc (def *DefaultAction) FooterContent(ctx *context.Context) template.HTML { return def.Footer }\nfunc (def *DefaultAction) GetCallbacks() context.Node                       { return context.Node{} }\n\nvar _ Action = (*DefaultAction)(nil)\n\nvar DefaultPageSizeList = []int{10, 20, 30, 50, 100}\n\nconst DefaultPageSize = 10\n\nfunc NewInfoPanel(ctx *context.Context, pk string) *InfoPanel {\n\treturn &InfoPanel{\n\t\tCtx:                     ctx,\n\t\tcurFieldListIndex:       -1,\n\t\tPageSizeList:            DefaultPageSizeList,\n\t\tDefaultPageSize:         DefaultPageSize,\n\t\tprocessChains:           make(DisplayProcessFnChains, 0),\n\t\tButtons:                 make(Buttons, 0),\n\t\tCallbacks:               make(Callbacks, 0),\n\t\tDisplayGeneratorRecords: make(map[string]struct{}),\n\t\tWheres:                  make([]Where, 0),\n\t\tWhereRaws:               WhereRaw{},\n\t\tSortField:               pk,\n\t\tTableLayout:             \"auto\",\n\t\tFilterFormInputWidth:    10,\n\t\tFilterFormHeadWidth:     2,\n\t\tAutoRefresh:             0,\n\t}\n}\n\nfunc (i *InfoPanel) Where(field string, operator string, arg interface{}) *InfoPanel {\n\ti.Wheres = append(i.Wheres, Where{Field: field, Operator: operator, Arg: arg, Join: \"and\"})\n\treturn i\n}\n\nfunc (i *InfoPanel) WhereOr(field string, operator string, arg interface{}) *InfoPanel {\n\ti.Wheres = append(i.Wheres, Where{Field: field, Operator: operator, Arg: arg, Join: \"or\"})\n\treturn i\n}\n\nfunc (i *InfoPanel) WhereRaw(raw string, arg ...interface{}) *InfoPanel {\n\ti.WhereRaws.Raw = raw\n\ti.WhereRaws.Args = arg\n\treturn i\n}\n\nfunc (i *InfoPanel) AddSelectBox(ctx *context.Context, placeholder string, options FieldOptions, action Action, width ...int) *InfoPanel {\n\toptions = append(FieldOptions{{Value: \"\", Text: language.Get(\"All\")}}, options...)\n\taction.SetBtnData(options)\n\ti.addButton(GetDefaultSelection(placeholder, options, action, width...)).\n\t\taddFooterHTML(action.FooterContent(ctx)).\n\t\taddCallback(action.GetCallbacks())\n\n\treturn i\n}\n\nfunc (i *InfoPanel) ExportValue() *InfoPanel {\n\ti.ExportType = 1\n\treturn i\n}\n\nfunc (i *InfoPanel) IsExportValue() bool {\n\treturn i.ExportType == 1\n}\n\nfunc (i *InfoPanel) AddButtonRaw(ctx *context.Context, btn Button, action Action) *InfoPanel {\n\ti.Buttons = append(i.Buttons, btn)\n\ti.addFooterHTML(action.FooterContent(ctx)).addCallback(action.GetCallbacks())\n\treturn i\n}\n\nfunc (i *InfoPanel) AddButton(ctx *context.Context, title template.HTML, icon string, action Action, color ...template.HTML) *InfoPanel {\n\ti.addButton(GetDefaultButtonGroup(title, icon, action, color...)).\n\t\taddFooterHTML(action.FooterContent(ctx)).\n\t\taddCallback(action.GetCallbacks())\n\treturn i\n}\n\nfunc (i *InfoPanel) AddActionIconButton(ctx *context.Context, icon string, action Action, ids ...string) *InfoPanel {\n\ti.addActionButton(GetActionIconButton(icon, action, ids...)).\n\t\taddFooterHTML(action.FooterContent(ctx)).\n\t\taddCallback(action.GetCallbacks())\n\n\treturn i\n}\n\nfunc (i *InfoPanel) AddActionButtonFront(ctx *context.Context, title template.HTML, action Action, ids ...string) *InfoPanel {\n\ti.SetActionButtonFold()\n\ti.ActionButtons = append([]Button{GetActionButton(title, action, ids...)}, i.ActionButtons...)\n\ti.addFooterHTML(action.FooterContent(ctx)).\n\t\taddCallback(action.GetCallbacks())\n\treturn i\n}\n\nfunc (i *InfoPanel) AddActionButton(ctx *context.Context, title template.HTML, action Action, ids ...string) *InfoPanel {\n\ti.SetActionButtonFold()\n\ti.addActionButton(GetActionButton(title, action, ids...)).\n\t\taddFooterHTML(action.FooterContent(ctx)).\n\t\taddCallback(action.GetCallbacks())\n\n\treturn i\n}\n\nfunc (i *InfoPanel) SetActionButtonFold() *InfoPanel {\n\ti.ActionButtonFold = true\n\treturn i\n}\n\nfunc (i *InfoPanel) AddLimitFilter(limit int) *InfoPanel {\n\ti.processChains = addLimit(limit, i.processChains)\n\treturn i\n}\n\nfunc (i *InfoPanel) AddTrimSpaceFilter() *InfoPanel {\n\ti.processChains = addTrimSpace(i.processChains)\n\treturn i\n}\n\nfunc (i *InfoPanel) AddSubstrFilter(start int, end int) *InfoPanel {\n\ti.processChains = addSubstr(start, end, i.processChains)\n\treturn i\n}\n\nfunc (i *InfoPanel) AddToTitleFilter() *InfoPanel {\n\ti.processChains = addToTitle(i.processChains)\n\treturn i\n}\n\nfunc (i *InfoPanel) AddToUpperFilter() *InfoPanel {\n\ti.processChains = addToUpper(i.processChains)\n\treturn i\n}\n\nfunc (i *InfoPanel) AddToLowerFilter() *InfoPanel {\n\ti.processChains = addToLower(i.processChains)\n\treturn i\n}\n\nfunc (i *InfoPanel) AddXssFilter() *InfoPanel {\n\ti.processChains = addXssFilter(i.processChains)\n\treturn i\n}\n\nfunc (i *InfoPanel) AddXssJsFilter() *InfoPanel {\n\ti.processChains = addXssJsFilter(i.processChains)\n\treturn i\n}\n\nfunc (i *InfoPanel) SetExportProcessFn(fn ExportProcessFn) *InfoPanel {\n\ti.ExportProcessFn = fn\n\treturn i\n}\n\nfunc (i *InfoPanel) SetDeleteHook(fn DeleteFn) *InfoPanel {\n\ti.DeleteHook = fn\n\treturn i\n}\n\nfunc (i *InfoPanel) SetDeleteHookWithRes(fn DeleteFnWithRes) *InfoPanel {\n\ti.DeleteHookWithRes = fn\n\treturn i\n}\n\nfunc (i *InfoPanel) SetQueryFilterFn(fn QueryFilterFn) *InfoPanel {\n\ti.QueryFilterFn = fn\n\treturn i\n}\n\nfunc (i *InfoPanel) AddUpdateParametersFn(fn UpdateParametersFn) *InfoPanel {\n\ti.UpdateParametersFns = append(i.UpdateParametersFns, fn)\n\treturn i\n}\n\nfunc (i *InfoPanel) SetWrapper(wrapper ContentWrapper) *InfoPanel {\n\ti.Wrapper = wrapper\n\treturn i\n}\n\nfunc (i *InfoPanel) SetPreDeleteFn(fn DeleteFn) *InfoPanel {\n\ti.PreDeleteFn = fn\n\treturn i\n}\n\nfunc (i *InfoPanel) SetDeleteFn(fn DeleteFn) *InfoPanel {\n\ti.DeleteFn = fn\n\treturn i\n}\n\nfunc (i *InfoPanel) SetGetDataFn(fn GetDataFn) *InfoPanel {\n\ti.GetDataFn = fn\n\treturn i\n}\n\nfunc (i *InfoPanel) SetPrimaryKey(name string, typ db.DatabaseType) *InfoPanel {\n\ti.primaryKey = primaryKey{Name: name, Type: typ}\n\treturn i\n}\n\nfunc (i *InfoPanel) SetTableFixed() *InfoPanel {\n\ti.TableLayout = \"fixed\"\n\treturn i\n}\n\nfunc (i *InfoPanel) AddColumn(head string, fun FieldFilterFn) *InfoPanel {\n\ti.FieldList = append(i.FieldList, Field{\n\t\tHead:     head,\n\t\tField:    head,\n\t\tTypeName: db.Varchar,\n\t\tSortable: false,\n\t\tEditAble: false,\n\t\tEditType: table.Text,\n\t\tFieldDisplay: FieldDisplay{\n\t\t\tDisplay:              fun,\n\t\t\tDisplayProcessChains: chooseDisplayProcessChains(i.processChains),\n\t\t},\n\t})\n\ti.curFieldListIndex++\n\treturn i\n}\n\nfunc (i *InfoPanel) AddColumnButtons(ctx *context.Context, head string, buttons ...Button) *InfoPanel {\n\tvar content, js template.HTML\n\tfor _, btn := range buttons {\n\t\tbtn.GetAction().SetBtnId(\".\" + btn.ID())\n\t\tbtnContent, btnJs := btn.Content(ctx)\n\t\tcontent += btnContent\n\t\tjs += template.HTML(btnJs)\n\t\ti.FooterHtml += template.HTML(ParseTableDataTmpl(btn.GetAction().FooterContent(ctx)))\n\t\ti.Callbacks = i.Callbacks.AddCallback(btn.GetAction().GetCallbacks())\n\t}\n\ti.FooterHtml += template.HTML(\"<script>\") + template.HTML(ParseTableDataTmpl(js)) + template.HTML(\"</script>\")\n\ti.FieldList = append(i.FieldList, Field{\n\t\tHead:     head,\n\t\tField:    head,\n\t\tTypeName: db.Varchar,\n\t\tSortable: false,\n\t\tEditAble: false,\n\t\tEditType: table.Text,\n\t\tFieldDisplay: FieldDisplay{\n\t\t\tDisplay: func(value FieldModel) interface{} {\n\t\t\t\tpk := db.GetValueFromDatabaseType(i.primaryKey.Type, value.Row[i.primaryKey.Name], i.isFromJSON())\n\t\t\t\tvar v = make(map[string]InfoItem)\n\t\t\t\tfor key, item := range value.Row {\n\t\t\t\t\titemValue := fmt.Sprintf(\"%v\", item)\n\t\t\t\t\tv[key] = InfoItem{Value: itemValue, Content: template.HTML(itemValue)}\n\t\t\t\t}\n\t\t\t\treturn template.HTML(ParseTableDataTmplWithID(pk.HTML(), string(content), v))\n\t\t\t},\n\t\t\tDisplayProcessChains: chooseDisplayProcessChains(i.processChains),\n\t\t},\n\t})\n\ti.curFieldListIndex++\n\treturn i\n}\n\nfunc (i *InfoPanel) AddFieldTr(ctx *context.Context, head, field string, typeName db.DatabaseType) *InfoPanel {\n\treturn i.AddFieldWithTranslation(ctx, head, field, typeName)\n}\n\nfunc (i *InfoPanel) AddFieldWithTranslation(ctx *context.Context, head, field string, typeName db.DatabaseType) *InfoPanel {\n\treturn i.AddField(language.GetWithLang(head, ctx.Lang()), field, typeName)\n}\n\nfunc (i *InfoPanel) AddField(head, field string, typeName db.DatabaseType) *InfoPanel {\n\ti.FieldList = append(i.FieldList, Field{\n\t\tHead:     head,\n\t\tField:    field,\n\t\tTypeName: typeName,\n\t\tSortable: false,\n\t\tJoins:    make(Joins, 0),\n\t\tEditAble: false,\n\t\tEditType: table.Text,\n\t\tFieldDisplay: FieldDisplay{\n\t\t\tDisplay: func(value FieldModel) interface{} {\n\t\t\t\treturn value.Value\n\t\t\t},\n\t\t\tDisplayProcessChains: chooseDisplayProcessChains(i.processChains),\n\t\t},\n\t})\n\ti.curFieldListIndex++\n\treturn i\n}\n\nfunc (i *InfoPanel) AddFilter(head, field string, typeName db.DatabaseType, fn UpdateParametersFn, filterType ...FilterType) *InfoPanel {\n\treturn i.AddField(head, field, typeName).FieldHide().FieldFilterable(filterType...).AddUpdateParametersFn(fn)\n}\n\n// Field attribute setting functions\n// ====================================================\n\nfunc (i *InfoPanel) FieldDisplay(filter FieldFilterFn) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].Display = filter\n\treturn i\n}\n\ntype FieldLabelParam struct {\n\tColor template.HTML\n\tType  string\n}\n\nfunc (i *InfoPanel) FieldLabel(args ...FieldLabelParam) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"label\"].Get(i.Ctx, args))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldImage(width, height string, prefix ...string) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"image\"].Get(i.Ctx, width, height, prefix))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldBool(flags ...string) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"bool\"].Get(i.Ctx, flags))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldLink(src string, openInNewTab ...bool) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"link\"].Get(i.Ctx, src, openInNewTab))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldFileSize() *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"filesize\"].Get(i.Ctx))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldDate(format string) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"date\"].Get(i.Ctx, format))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldIcon(icons map[string]string, defaultIcon string) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"link\"].Get(i.Ctx, icons, defaultIcon))\n\treturn i\n}\n\ntype FieldDotColor string\n\nconst (\n\tFieldDotColorDanger  FieldDotColor = \"danger\"\n\tFieldDotColorInfo    FieldDotColor = \"info\"\n\tFieldDotColorPrimary FieldDotColor = \"primary\"\n\tFieldDotColorSuccess FieldDotColor = \"success\"\n)\n\nfunc (i *InfoPanel) FieldDot(icons map[string]FieldDotColor, defaultDot FieldDotColor) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"dot\"].Get(i.Ctx, icons, defaultDot))\n\treturn i\n}\n\ntype FieldProgressBarData struct {\n\tStyle string\n\tSize  string\n\tMax   int\n}\n\nfunc (i *InfoPanel) FieldProgressBar(data ...FieldProgressBarData) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"progressbar\"].Get(i.Ctx, data))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldLoading(data []string) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"loading\"].Get(i.Ctx, data))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldDownLoadable(prefix ...string) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"downloadable\"].Get(i.Ctx, prefix))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldCopyable(prefix ...string) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"copyable\"].Get(i.Ctx, prefix))\n\tif _, ok := i.DisplayGeneratorRecords[\"copyable\"]; !ok {\n\t\ti.addFooterHTML(`<script>` + displayFnGens[\"copyable\"].JS() + `</script>`)\n\t\ti.DisplayGeneratorRecords[\"copyable\"] = struct{}{}\n\t}\n\treturn i\n}\n\ntype FieldGetImgArrFn func(value string) []string\n\nfunc (i *InfoPanel) FieldCarousel(fn FieldGetImgArrFn, size ...int) *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"carousel\"].Get(i.Ctx, fn, size))\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldQrcode() *InfoPanel {\n\ti.addDisplayChains(displayFnGens[\"qrcode\"].Get(i.Ctx))\n\tif _, ok := i.DisplayGeneratorRecords[\"qrcode\"]; !ok {\n\t\ti.addFooterHTML(`<script>` + displayFnGens[\"qrcode\"].JS() + `</script>`)\n\t\ti.DisplayGeneratorRecords[\"qrcode\"] = struct{}{}\n\t}\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldWidth(width int) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].Width = width\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldSortable() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].Sortable = true\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldEditOptions(options FieldOptions, extra ...map[string]string) *InfoPanel {\n\tif i.FieldList[i.curFieldListIndex].EditType.IsSwitch() {\n\t\tif len(extra) == 0 {\n\t\t\toptions[0].Extra = map[string]string{\n\t\t\t\t\"size\":     \"small\",\n\t\t\t\t\"onColor\":  \"primary\",\n\t\t\t\t\"offColor\": \"default\",\n\t\t\t}\n\t\t} else {\n\t\t\tif extra[0][\"size\"] == \"\" {\n\t\t\t\textra[0][\"size\"] = \"small\"\n\t\t\t}\n\t\t\tif extra[0][\"onColor\"] == \"\" {\n\t\t\t\textra[0][\"onColor\"] = \"primary\"\n\t\t\t}\n\t\t\tif extra[0][\"offColor\"] == \"\" {\n\t\t\t\textra[0][\"offColor\"] = \"default\"\n\t\t\t}\n\t\t\toptions[0].Extra = extra[0]\n\t\t}\n\t}\n\ti.FieldList[i.curFieldListIndex].EditOptions = options\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldEditAble(editType ...table.Type) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].EditAble = true\n\tif len(editType) > 0 {\n\t\ti.FieldList[i.curFieldListIndex].EditType = editType[0]\n\t}\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldAsEditParam() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].IsEditParam = true\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldAsDeleteParam() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].IsDeleteParam = true\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldAsDetailParam() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].IsDetailParam = true\n\treturn i\n}\n\nfunc (i *InfoPanel) FieldFixed() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].Fixed = true\n\treturn i\n}\n\ntype FilterType struct {\n\tOptions     FieldOptions\n\tProcess     func(string) string\n\tOptionExt   map[string]interface{}\n\tFormType    form.Type\n\tHelpMsg     template.HTML\n\tStyle       template.HTMLAttr\n\tOperator    FilterOperator\n\tHead        string\n\tPlaceholder string\n\tWidth       int\n\tHeadWidth   int\n\tInputWidth  int\n\tNoHead      bool\n\tNoIcon      bool\n}\n\n// FieldFilterable set a field filterable which will display in the filter box.\nfunc (i *InfoPanel) FieldFilterable(filterType ...FilterType) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].Filterable = true\n\n\tif len(filterType) == 0 {\n\t\ti.FieldList[i.curFieldListIndex].FilterFormFields = append(i.FieldList[i.curFieldListIndex].FilterFormFields,\n\t\t\tFilterFormField{\n\t\t\t\tType:        form.Text,\n\t\t\t\tHead:        i.FieldList[i.curFieldListIndex].Head,\n\t\t\t\tPlaceholder: language.Get(\"input\") + \" \" + i.FieldList[i.curFieldListIndex].Head,\n\t\t\t})\n\t}\n\n\tfor _, filter := range filterType {\n\t\tvar ff FilterFormField\n\t\tff.Operator = filter.Operator\n\t\tif filter.FormType == form.Default {\n\t\t\tff.Type = form.Text\n\t\t} else {\n\t\t\tff.Type = filter.FormType\n\t\t}\n\t\tff.Head = modules.AorB(!filter.NoHead && filter.Head == \"\",\n\t\t\ti.FieldList[i.curFieldListIndex].Head, filter.Head)\n\t\tff.Width = filter.Width\n\t\tff.HeadWidth = filter.HeadWidth\n\t\tff.InputWidth = filter.InputWidth\n\t\tff.HelpMsg = filter.HelpMsg\n\t\tff.NoIcon = filter.NoIcon\n\t\tff.Style = filter.Style\n\t\tff.ProcessFn = filter.Process\n\t\tff.Placeholder = modules.AorB(filter.Placeholder == \"\", language.Get(\"input\")+\" \"+ff.Head, filter.Placeholder)\n\t\tff.Options = filter.Options\n\t\tif len(filter.OptionExt) > 0 {\n\t\t\ts, _ := json.Marshal(filter.OptionExt)\n\t\t\tff.OptionExt = template.JS(s)\n\t\t}\n\t\ti.FieldList[i.curFieldListIndex].FilterFormFields = append(i.FieldList[i.curFieldListIndex].FilterFormFields, ff)\n\t}\n\n\treturn i\n}\n\n// FieldFilterOptions set options for a filterable field to select. It will work when you set the\n// FormType of the field to SelectSingle/Select/SelectBox.\nfunc (i *InfoPanel) FieldFilterOptions(options FieldOptions) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].FilterFormFields[0].Options = options\n\ti.FieldList[i.curFieldListIndex].FilterFormFields[0].OptionExt = `{\"allowClear\": \"true\"}`\n\treturn i\n}\n\n// FieldFilterOptionsFromTable set options for a filterable field to select. The options is from other table.\n// For example,\n//\n//\t`FieldFilterOptionsFromTable(\"roles\", \"name\", \"id\")`\n//\n// will generate the sql like:\n//\n//\t`select id, name from roles`.\n//\n// And the `id` will be the value of options, `name` is the text to be shown.\nfunc (i *InfoPanel) FieldFilterOptionsFromTable(table, textFieldName, valueFieldName string, process ...OptionTableQueryProcessFn) *InfoPanel {\n\tvar fn OptionTableQueryProcessFn\n\tif len(process) > 0 {\n\t\tfn = process[0]\n\t}\n\ti.FieldList[i.curFieldListIndex].FilterFormFields[0].OptionTable = OptionTable{\n\t\tTable:          table,\n\t\tTextField:      textFieldName,\n\t\tValueField:     valueFieldName,\n\t\tQueryProcessFn: fn,\n\t}\n\treturn i\n}\n\n// FieldFilterOptionExt set the option extension js of the field.\nfunc (i *InfoPanel) FieldFilterOptionExt(m map[string]interface{}) *InfoPanel {\n\ts, _ := json.Marshal(m)\n\ti.FieldList[i.curFieldListIndex].FilterFormFields[0].OptionExt = template.JS(s)\n\treturn i\n}\n\n// FieldFilterProcess process the field content.\n// For example:\n//\n//\tFieldFilterProcess(func(val string) string {\n//\t\t\treturn val + \"ms\"\n//\t})\nfunc (i *InfoPanel) FieldFilterProcess(process func(string) string) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].FilterFormFields[0].ProcessFn = process\n\treturn i\n}\n\n// FieldFilterOnSearch set the url and the corresponding handler which has some backend logic and\n// return the options of the field.\n// For example:\n//\n//\tFieldFilterOnSearch(\"/search/city\", func(ctx *context.Context) (success bool, msg string, data interface{}) {\n//\t\treturn true, \"ok\", selection.Data{\n//\t\t\tResults: selection.Options{\n//\t\t\t\t{Text: \"GuangZhou\", ID: \"1\"},\n//\t\t\t\t{Text: \"ShenZhen\", ID: \"2\"},\n//\t\t\t\t{Text: \"BeiJing\", ID: \"3\"},\n//\t\t\t\t{Text: \"ShangHai\", ID: \"4\"},\n//\t\t\t}\n//\t\t}\n//\t}, 1000)\nfunc (i *InfoPanel) FieldFilterOnSearch(url string, handler Handler, delay ...int) *InfoPanel {\n\text, callback := searchJS(i.FieldList[i.curFieldListIndex].FilterFormFields[0].OptionExt, url, handler, delay...)\n\ti.FieldList[i.curFieldListIndex].FilterFormFields[0].OptionExt = ext\n\ti.Callbacks = append(i.Callbacks, callback)\n\treturn i\n}\n\n// FieldFilterOnChooseCustom set the js that will be called when filter option be selected.\nfunc (i *InfoPanel) FieldFilterOnChooseCustom(js template.HTML) *InfoPanel {\n\ti.FooterHtml += chooseCustomJS(i.FieldList[i.curFieldListIndex].Field, js)\n\treturn i\n}\n\n// FieldFilterOnChooseMap set the actions that will be taken when filter option be selected.\n// For example:\n//\n//\tmap[string]types.LinkField{\n//\t     \"men\": {Field: \"ip\", Value:\"127.0.0.1\"},\n//\t     \"women\": {Field: \"ip\", Hide: true},\n//\t     \"other\": {Field: \"ip\", Disable: true}\n//\t}\n//\n// mean when choose men, the value of field ip will be set to 127.0.0.1,\n// when choose women, field ip will be hidden, and when choose other, field ip will be disabled.\nfunc (i *InfoPanel) FieldFilterOnChooseMap(m map[string]LinkField) *InfoPanel {\n\ti.FooterHtml += chooseMapJS(i.FieldList[i.curFieldListIndex].Field, m)\n\treturn i\n}\n\n// FieldFilterOnChoose set the given value of the given field when choose the value of val.\nfunc (i *InfoPanel) FieldFilterOnChoose(val, field string, value template.HTML) *InfoPanel {\n\ti.FooterHtml += chooseJS(i.FieldList[i.curFieldListIndex].Field, field, val, value)\n\treturn i\n}\n\n// OperationURL get the operation api url.\nfunc (i *InfoPanel) OperationURL(id string) string {\n\treturn config.Url(\"/operation/\" + utils.WrapURL(id))\n}\n\n// FieldFilterOnChooseAjax set the url and handler that will be called when field be choosed.\n// The handler will return the option of the field. It will help to link two or more form items.\n// For example:\n//\n//\tFieldFilterOnChooseAjax(\"city\", \"/search/city\", func(ctx *context.Context) (success bool, msg string, data interface{}) {\n//\t\treturn true, \"ok\", selection.Data{\n//\t\t\tResults: selection.Options{\n//\t\t\t\t{Text: \"GuangZhou\", ID: \"1\"},\n//\t\t\t\t{Text: \"ShenZhen\", ID: \"2\"},\n//\t\t\t\t{Text: \"BeiJing\", ID: \"3\"},\n//\t\t\t\t{Text: \"ShangHai\", ID: \"4\"},\n//\t\t\t}\n//\t\t}\n//\t})\n//\n// When you choose the country, it trigger the action of ajax which be sent to the given handler,\n// and return the city options to the field city.\nfunc (i *InfoPanel) FieldFilterOnChooseAjax(field, url string, handler Handler) *InfoPanel {\n\tjs, callback := chooseAjax(i.FieldList[i.curFieldListIndex].Field, field, i.OperationURL(url), handler)\n\ti.FooterHtml += js\n\ti.Callbacks = append(i.Callbacks, callback)\n\treturn i\n}\n\n// FieldFilterOnChooseHide hide the fields when value to be chosen.\nfunc (i *InfoPanel) FieldFilterOnChooseHide(value string, field ...string) *InfoPanel {\n\ti.FooterHtml += chooseHideJS(i.FieldList[i.curFieldListIndex].Field, []string{value}, field...)\n\treturn i\n}\n\n// FieldFilterOnChooseShow display the fields when value to be chosen.\nfunc (i *InfoPanel) FieldFilterOnChooseShow(value string, field ...string) *InfoPanel {\n\ti.FooterHtml += chooseShowJS(i.FieldList[i.curFieldListIndex].Field, []string{value}, field...)\n\treturn i\n}\n\n// FieldFilterOnChooseDisable disable the fields when value to be chosen.\nfunc (i *InfoPanel) FieldFilterOnChooseDisable(value string, field ...string) *InfoPanel {\n\ti.FooterHtml += chooseDisableJS(i.FieldList[i.curFieldListIndex].Field, []string{value}, field...)\n\treturn i\n}\n\n// FieldHide hide field. Include the filter area.\nfunc (i *InfoPanel) FieldHide() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].Hide = true\n\treturn i\n}\n\n// FieldHide hide field for only the table.\nfunc (i *InfoPanel) FieldHideForList() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].HideForList = true\n\treturn i\n}\n\n// FieldJoin gets the field of the concatenated table.\n//\n//\tJoin {\n//\t    BaseTable:   \"users\",\n//\t    Field:       \"role_id\",\n//\t    Table:       \"roles\",\n//\t    JoinField:   \"id\",\n//\t}\n//\n// It will generate the join table sql like:\n//\n// select ... from users left join roles on roles.id = users.role_id\nfunc (i *InfoPanel) FieldJoin(join Join) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].Joins = append(i.FieldList[i.curFieldListIndex].Joins, join)\n\treturn i\n}\n\n// FieldLimit limit the field length.\nfunc (i *InfoPanel) FieldLimit(limit int) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].DisplayProcessChains = i.FieldList[i.curFieldListIndex].AddLimit(limit)\n\treturn i\n}\n\n// FieldTrimSpace trim space of the field.\nfunc (i *InfoPanel) FieldTrimSpace() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].DisplayProcessChains = i.FieldList[i.curFieldListIndex].AddTrimSpace()\n\treturn i\n}\n\n// FieldSubstr intercept string of the field.\nfunc (i *InfoPanel) FieldSubstr(start int, end int) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].DisplayProcessChains = i.FieldList[i.curFieldListIndex].AddSubstr(start, end)\n\treturn i\n}\n\n// FieldToTitle update the field to a string that begin words mapped to their Unicode title case.\nfunc (i *InfoPanel) FieldToTitle() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].DisplayProcessChains = i.FieldList[i.curFieldListIndex].AddToTitle()\n\treturn i\n}\n\n// FieldToUpper update the field to a string with all Unicode letters mapped to their upper case.\nfunc (i *InfoPanel) FieldToUpper() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].DisplayProcessChains = i.FieldList[i.curFieldListIndex].AddToUpper()\n\treturn i\n}\n\n// FieldToLower update the field to a string with all Unicode letters mapped to their lower case.\nfunc (i *InfoPanel) FieldToLower() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].DisplayProcessChains = i.FieldList[i.curFieldListIndex].AddToLower()\n\treturn i\n}\n\n// FieldXssFilter escape field with html.Escape.\nfunc (i *InfoPanel) FieldXssFilter() *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].DisplayProcessChains = i.FieldList[i.curFieldListIndex].DisplayProcessChains.\n\t\tAdd(func(value FieldModel) interface{} {\n\t\t\treturn html.EscapeString(value.Value)\n\t\t})\n\treturn i\n}\n\n// InfoPanel attribute setting functions\n// ====================================================\n\nfunc (i *InfoPanel) SetTable(table string) *InfoPanel {\n\ti.Table = table\n\treturn i\n}\n\nfunc (i *InfoPanel) SetPageSizeList(pageSizeList []int) *InfoPanel {\n\ti.PageSizeList = pageSizeList\n\treturn i\n}\n\nfunc (i *InfoPanel) SetDefaultPageSize(defaultPageSize int) *InfoPanel {\n\ti.DefaultPageSize = defaultPageSize\n\treturn i\n}\n\nfunc (i *InfoPanel) GetPageSizeList() []string {\n\tvar pageSizeList = make([]string, len(i.PageSizeList))\n\tfor j := 0; j < len(i.PageSizeList); j++ {\n\t\tpageSizeList[j] = strconv.Itoa(i.PageSizeList[j])\n\t}\n\treturn pageSizeList\n}\n\nfunc (i *InfoPanel) GetSort() string {\n\tswitch i.Sort {\n\tcase SortAsc:\n\t\treturn \"asc\"\n\tdefault:\n\t\treturn \"desc\"\n\t}\n}\n\nfunc (i *InfoPanel) SetTitle(title string) *InfoPanel {\n\ti.Title = title\n\treturn i\n}\n\nfunc (i *InfoPanel) SetTabGroups(groups TabGroups) *InfoPanel {\n\ti.TabGroups = groups\n\treturn i\n}\n\nfunc (i *InfoPanel) SetTabHeaders(headers ...string) *InfoPanel {\n\ti.TabHeaders = headers\n\treturn i\n}\n\nfunc (i *InfoPanel) SetDescription(desc string) *InfoPanel {\n\ti.Description = desc\n\treturn i\n}\n\nfunc (i *InfoPanel) SetFilterFormLayout(layout form.Layout) *InfoPanel {\n\ti.FilterFormLayout = layout\n\treturn i\n}\n\nfunc (i *InfoPanel) SetFilterFormHeadWidth(w int) *InfoPanel {\n\ti.FilterFormHeadWidth = w\n\treturn i\n}\n\nfunc (i *InfoPanel) SetFilterFormInputWidth(w int) *InfoPanel {\n\ti.FilterFormInputWidth = w\n\treturn i\n}\n\nfunc (i *InfoPanel) SetSortField(field string) *InfoPanel {\n\ti.SortField = field\n\treturn i\n}\n\nfunc (i *InfoPanel) SetSortAsc() *InfoPanel {\n\ti.Sort = SortAsc\n\treturn i\n}\n\nfunc (i *InfoPanel) SetSortDesc() *InfoPanel {\n\ti.Sort = SortDesc\n\treturn i\n}\n\nfunc (i *InfoPanel) SetAction(action template.HTML) *InfoPanel {\n\ti.Action = action\n\treturn i\n}\n\nfunc (i *InfoPanel) SetHeaderHtml(header template.HTML) *InfoPanel {\n\ti.HeaderHtml += header\n\treturn i\n}\n\nfunc (i *InfoPanel) SetFooterHtml(footer template.HTML) *InfoPanel {\n\ti.FooterHtml += footer\n\treturn i\n}\n\nfunc (i *InfoPanel) HasError() bool {\n\treturn i.PageError != nil\n}\n\nfunc (i *InfoPanel) SetError(err errors.PageError, content ...template.HTML) *InfoPanel {\n\ti.PageError = err\n\tif len(content) > 0 {\n\t\ti.PageErrorHTML = content[0]\n\t}\n\treturn i\n}\n\nfunc (i *InfoPanel) SetNoCompress() *InfoPanel {\n\ti.NoCompress = true\n\treturn i\n}\n\nfunc (i *InfoPanel) SetHideSideBar() *InfoPanel {\n\ti.HideSideBar = true\n\treturn i\n}\n\nfunc (i *InfoPanel) SetAutoRefresh(interval uint) *InfoPanel {\n\ti.AutoRefresh = interval\n\treturn i\n}\n\nfunc (i *InfoPanel) Set404Error(content ...template.HTML) *InfoPanel {\n\ti.SetError(errors.PageError404, content...)\n\treturn i\n}\n\nfunc (i *InfoPanel) Set403Error(content ...template.HTML) *InfoPanel {\n\ti.SetError(errors.PageError403, content...)\n\treturn i\n}\n\nfunc (i *InfoPanel) Set400Error(content ...template.HTML) *InfoPanel {\n\ti.SetError(errors.PageError401, content...)\n\treturn i\n}\n\nfunc (i *InfoPanel) Set500Error(content ...template.HTML) *InfoPanel {\n\ti.SetError(errors.PageError500, content...)\n\treturn i\n}\n\nfunc (i *InfoPanel) HideNewButton() *InfoPanel {\n\ti.IsHideNewButton = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideExportButton() *InfoPanel {\n\ti.IsHideExportButton = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideFilterButton() *InfoPanel {\n\ti.IsHideFilterButton = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideRowSelector() *InfoPanel {\n\ti.IsHideRowSelector = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HidePagination() *InfoPanel {\n\ti.IsHidePagination = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideFilterArea() *InfoPanel {\n\ti.IsHideFilterArea = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideQueryInfo() *InfoPanel {\n\ti.IsHideQueryInfo = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideEditButton() *InfoPanel {\n\ti.IsHideEditButton = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideDeleteButton() *InfoPanel {\n\ti.IsHideDeleteButton = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideDetailButton() *InfoPanel {\n\ti.IsHideDetailButton = true\n\treturn i\n}\n\nfunc (i *InfoPanel) HideCheckBoxColumn() *InfoPanel {\n\treturn i.HideColumn(1)\n}\n\nfunc (i *InfoPanel) HideColumn(n int) *InfoPanel {\n\ti.AddCSS(template.CSS(fmt.Sprintf(`\n\t.box-body table.table tbody tr td:nth-child(%v), .box-body table.table tbody tr th:nth-child(%v) {\n\t\tdisplay: none;\n\t}`, n, n)))\n\treturn i\n}\n\nfunc (i *InfoPanel) addFooterHTML(footer template.HTML) *InfoPanel {\n\ti.FooterHtml += template.HTML(ParseTableDataTmpl(footer))\n\treturn i\n}\n\nfunc (i *InfoPanel) AddCSS(css template.CSS) *InfoPanel {\n\treturn i.addFooterHTML(template.HTML(\"<style>\" + css + \"</style>\"))\n}\n\nfunc (i *InfoPanel) AddJS(js template.JS) *InfoPanel {\n\treturn i.addFooterHTML(template.HTML(\"<script>\" + js + \"</script>\"))\n}\n\nfunc (i *InfoPanel) AddJSModule(js template.JS) *InfoPanel {\n\treturn i.addFooterHTML(template.HTML(\"<script type='module'>\" + js + \"</script>\"))\n}\n\nfunc (i *InfoPanel) addCallback(node context.Node) *InfoPanel {\n\ti.Callbacks = i.Callbacks.AddCallback(node)\n\treturn i\n}\n\nfunc (i *InfoPanel) addButton(btn Button) *InfoPanel {\n\ti.Buttons = append(i.Buttons, btn)\n\treturn i\n}\n\nfunc (i *InfoPanel) addActionButton(btn Button) *InfoPanel {\n\ti.ActionButtons = append(i.ActionButtons, btn)\n\treturn i\n}\n\nfunc (i *InfoPanel) isFromJSON() bool {\n\treturn i.GetDataFn != nil\n}\n\nfunc (i *InfoPanel) addDisplayChains(fn FieldFilterFn) *InfoPanel {\n\ti.FieldList[i.curFieldListIndex].DisplayProcessChains =\n\t\ti.FieldList[i.curFieldListIndex].DisplayProcessChains.Add(fn)\n\treturn i\n}\n"
  },
  {
    "path": "template/types/info_test.go",
    "content": "package types\n"
  },
  {
    "path": "template/types/operators.go",
    "content": "package types\n\nimport \"html/template\"\n\ntype FilterOperator string\n\nconst (\n\tFilterOperatorLike           FilterOperator = \"like\"\n\tFilterOperatorGreater        FilterOperator = \">\"\n\tFilterOperatorGreaterOrEqual FilterOperator = \">=\"\n\tFilterOperatorEqual          FilterOperator = \"=\"\n\tFilterOperatorNotEqual       FilterOperator = \"!=\"\n\tFilterOperatorLess           FilterOperator = \"<\"\n\tFilterOperatorLessOrEqual    FilterOperator = \"<=\"\n\tFilterOperatorFree           FilterOperator = \"free\"\n)\n\nfunc GetOperatorFromValue(value string) FilterOperator {\n\tswitch value {\n\tcase \"like\":\n\t\treturn FilterOperatorLike\n\tcase \"gr\":\n\t\treturn FilterOperatorGreater\n\tcase \"gq\":\n\t\treturn FilterOperatorGreaterOrEqual\n\tcase \"eq\":\n\t\treturn FilterOperatorEqual\n\tcase \"ne\":\n\t\treturn FilterOperatorNotEqual\n\tcase \"le\":\n\t\treturn FilterOperatorLess\n\tcase \"lq\":\n\t\treturn FilterOperatorLessOrEqual\n\tcase \"free\":\n\t\treturn FilterOperatorFree\n\tdefault:\n\t\treturn FilterOperatorEqual\n\t}\n}\n\nfunc (o FilterOperator) Value() string {\n\tswitch o {\n\tcase FilterOperatorLike:\n\t\treturn \"like\"\n\tcase FilterOperatorGreater:\n\t\treturn \"gr\"\n\tcase FilterOperatorGreaterOrEqual:\n\t\treturn \"gq\"\n\tcase FilterOperatorEqual:\n\t\treturn \"eq\"\n\tcase FilterOperatorNotEqual:\n\t\treturn \"ne\"\n\tcase FilterOperatorLess:\n\t\treturn \"le\"\n\tcase FilterOperatorLessOrEqual:\n\t\treturn \"lq\"\n\tcase FilterOperatorFree:\n\t\treturn \"free\"\n\tdefault:\n\t\treturn \"eq\"\n\t}\n}\n\nfunc (o FilterOperator) String() string {\n\treturn string(o)\n}\n\nfunc (o FilterOperator) Label() template.HTML {\n\tif o == FilterOperatorLike {\n\t\treturn \"\"\n\t}\n\treturn template.HTML(o)\n}\n\nfunc (o FilterOperator) AddOrNot() bool {\n\treturn string(o) != \"\" && o != FilterOperatorFree && o != FilterOperatorLike\n}\n\nfunc (o FilterOperator) Valid() bool {\n\tswitch o {\n\tcase FilterOperatorLike, FilterOperatorGreater, FilterOperatorGreaterOrEqual,\n\t\tFilterOperatorLess, FilterOperatorLessOrEqual, FilterOperatorFree:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "template/types/operators_test.go",
    "content": "package types\n\nimport (\n\t\"testing\"\n)\n\nfunc TestFilterOperatorAddOrNot(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\toperator FilterOperator\n\t\texpected bool\n\t}{\n\t\t{\n\t\t\tname:     \"FilterOperatorLike should not add operator field\",\n\t\t\toperator: FilterOperatorLike,\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"FilterOperatorFree should not add operator field\",\n\t\t\toperator: FilterOperatorFree,\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"Empty operator should not add operator field\",\n\t\t\toperator: FilterOperator(\"\"),\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"FilterOperatorGreater should add operator field\",\n\t\t\toperator: FilterOperatorGreater,\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"FilterOperatorEqual should add operator field\",\n\t\t\toperator: FilterOperatorEqual,\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"FilterOperatorNotEqual should add operator field\",\n\t\t\toperator: FilterOperatorNotEqual,\n\t\t\texpected: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult := tt.operator.AddOrNot()\n\t\t\tif result != tt.expected {\n\t\t\t\tt.Errorf(\"FilterOperator.AddOrNot() = %v, expected %v for operator %s\", result, tt.expected, string(tt.operator))\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFilterOperatorLabel(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\toperator FilterOperator\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname:     \"FilterOperatorLike should return empty label\",\n\t\t\toperator: FilterOperatorLike,\n\t\t\texpected: \"\",\n\t\t},\n\t\t{\n\t\t\tname:     \"FilterOperatorGreater should return > label\",\n\t\t\toperator: FilterOperatorGreater,\n\t\t\texpected: \">\",\n\t\t},\n\t\t{\n\t\t\tname:     \"FilterOperatorEqual should return = label\",\n\t\t\toperator: FilterOperatorEqual,\n\t\t\texpected: \"=\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult := string(tt.operator.Label())\n\t\t\tif result != tt.expected {\n\t\t\t\tt.Errorf(\"FilterOperator.Label() = %v, expected %v for operator %s\", result, tt.expected, string(tt.operator))\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "template/types/page.go",
    "content": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n// license that can be found in the LICENSE file.\n\npackage types\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"strconv\"\n\ttextTmpl \"text/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/menu\"\n\t\"github.com/GoAdminGroup/go-admin/modules/system\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/models\"\n)\n\n// Attribute is the component interface of template. Every component of\n// template should implement it.\ntype Attribute struct {\n\tTemplateList map[string]string\n\tSeparation   bool\n}\n\n// Page used in the template as a top variable.\ntype Page struct {\n\t// User is the login user.\n\tUser models.UserModel\n\n\t// Menu is the left side menu of the template.\n\tMenu menu.Menu\n\n\t// Panel is the main content of template.\n\tPanel Panel\n\n\t// System contains some system info.\n\tSystem SystemInfo\n\n\t// UrlPrefix is the prefix of url.\n\tUrlPrefix string\n\n\t// Title is the title of the web page.\n\tTitle string\n\n\t// Logo is the logo of the template.\n\tLogo template.HTML\n\n\t// MiniLogo is the downsizing logo of the template.\n\tMiniLogo template.HTML\n\n\t// ColorScheme is the color scheme of the template.\n\tColorScheme string\n\n\t// IndexUrl is the home page url of the site.\n\tIndexUrl string\n\n\t// AssetUrl is the cdn link of assets\n\tCdnUrl string\n\n\t// Custom html in the tag head.\n\tCustomHeadHtml template.HTML\n\n\t// Custom html after body.\n\tCustomFootHtml template.HTML\n\n\tTmplHeadHTML template.HTML\n\tTmplFootJS   template.HTML\n\n\t// Components assets\n\tAssetsList template.HTML\n\n\t// Footer info\n\tFooterInfo template.HTML\n\n\t// Load as Iframe or not\n\tIframe bool\n\n\t// Whether update menu or not\n\tUpdateMenu bool\n\n\t// Top Nav Buttons\n\tnavButtons     Buttons\n\tNavButtonsHTML template.HTML\n}\n\ntype NewPageParam struct {\n\tUser           models.UserModel\n\tMenu           *menu.Menu\n\tUpdateMenu     bool\n\tPanel          Panel\n\tLogo           template.HTML\n\tAssets         template.HTML\n\tButtons        Buttons\n\tIframe         bool\n\tTmplHeadHTML   template.HTML\n\tTmplFootJS     template.HTML\n\tNavButtonsHTML template.HTML\n\tNavButtonsJS   template.HTML\n}\n\nfunc (param *NewPageParam) NavButtonsAndJS(ctx *context.Context) (template.HTML, template.HTML) {\n\tnavBtnFooter := template.HTML(\"\")\n\tnavBtn := template.HTML(\"\")\n\tbtnJS := template.JS(\"\")\n\n\tfor _, btn := range param.Buttons {\n\t\tif btn.IsType(ButtonTypeNavDropDown) {\n\t\t\tcontent, js := btn.Content(ctx)\n\t\t\tnavBtn += content\n\t\t\tbtnJS += js\n\t\t\tfor _, item := range btn.(*NavDropDownButton).Items {\n\t\t\t\tnavBtnFooter += item.GetAction().FooterContent(ctx)\n\t\t\t\t_, js := item.Content(ctx)\n\t\t\t\tbtnJS += js\n\t\t\t}\n\t\t} else {\n\t\t\tnavBtnFooter += btn.GetAction().FooterContent(ctx)\n\t\t\tcontent, js := btn.Content(ctx)\n\t\t\tnavBtn += content\n\t\t\tbtnJS += js\n\t\t}\n\t}\n\n\treturn template.HTML(ParseTableDataTmpl(navBtn)),\n\t\tnavBtnFooter + template.HTML(ParseTableDataTmpl(`<script>`+btnJS+`</script>`))\n}\n\nfunc NewPage(ctx *context.Context, param *NewPageParam) *Page {\n\n\tif param.NavButtonsHTML == template.HTML(\"\") {\n\t\tparam.NavButtonsHTML, param.NavButtonsJS = param.NavButtonsAndJS(ctx)\n\t}\n\n\tlogo := param.Logo\n\tif logo == template.HTML(\"\") {\n\t\tlogo = config.GetLogo()\n\t}\n\n\treturn &Page{\n\t\tUser:       param.User,\n\t\tMenu:       *param.Menu,\n\t\tPanel:      param.Panel,\n\t\tUpdateMenu: param.UpdateMenu,\n\t\tSystem: SystemInfo{\n\t\t\tVersion: system.Version(),\n\t\t\tTheme:   config.GetTheme(),\n\t\t},\n\t\tUrlPrefix:      config.AssertPrefix(),\n\t\tTitle:          config.GetTitle(),\n\t\tLogo:           logo,\n\t\tMiniLogo:       config.GetMiniLogo(),\n\t\tColorScheme:    config.GetColorScheme(),\n\t\tIndexUrl:       config.GetIndexURL(),\n\t\tCdnUrl:         config.GetAssetUrl(),\n\t\tCustomHeadHtml: config.GetCustomHeadHtml(),\n\t\tCustomFootHtml: config.GetCustomFootHtml() + param.NavButtonsJS,\n\t\tFooterInfo:     config.GetFooterInfo(),\n\t\tAssetsList:     param.Assets,\n\t\tnavButtons:     param.Buttons,\n\t\tIframe:         param.Iframe,\n\t\tNavButtonsHTML: param.NavButtonsHTML,\n\t\tTmplHeadHTML:   param.TmplHeadHTML,\n\t\tTmplFootJS:     param.TmplFootJS,\n\t}\n}\n\nfunc (page *Page) AddButton(ctx *context.Context, title template.HTML, icon string, action Action) *Page {\n\tpage.navButtons = append(page.navButtons, GetNavButton(title, icon, action))\n\tpage.CustomFootHtml += action.FooterContent(ctx)\n\treturn page\n}\n\nfunc NewPagePanel(panel Panel) *Page {\n\treturn &Page{\n\t\tPanel: panel,\n\t\tSystem: SystemInfo{\n\t\t\tVersion: system.Version(),\n\t\t},\n\t}\n}\n\n// SystemInfo contains basic info of system.\ntype SystemInfo struct {\n\tVersion string\n\tTheme   string\n}\n\ntype TableRowData struct {\n\tId    template.HTML\n\tIds   template.HTML\n\tValue map[string]InfoItem\n}\n\nfunc ParseTableDataTmpl(content interface{}) string {\n\tvar (\n\t\tc  string\n\t\tok bool\n\t)\n\tif c, ok = content.(string); !ok {\n\t\tif cc, ok := content.(template.HTML); ok {\n\t\t\tc = string(cc)\n\t\t} else {\n\t\t\tc = string(content.(template.JS))\n\t\t}\n\t}\n\tt := template.New(\"row_data_tmpl\")\n\tt, _ = t.Parse(c)\n\tbuf := new(bytes.Buffer)\n\t_ = t.Execute(buf, TableRowData{Ids: `typeof(selectedRows)===\"function\" ? selectedRows().join() : \"\"`})\n\treturn buf.String()\n}\n\nfunc ParseTableDataTmplWithID(id template.HTML, content string, value ...map[string]InfoItem) string {\n\tt := textTmpl.New(\"row_data_tmpl\")\n\tt, _ = t.Parse(content)\n\tbuf := new(bytes.Buffer)\n\tv := make(map[string]InfoItem)\n\tif len(value) > 0 {\n\t\tv = value[0]\n\t}\n\t_ = t.Execute(buf, TableRowData{\n\t\tId:    id,\n\t\tIds:   `typeof(selectedRows)===\"function\" ? selectedRows().join() : \"\"`,\n\t\tValue: v,\n\t})\n\treturn buf.String()\n}\n\n// Panel contains the main content of the template which used as pjax.\ntype Panel struct {\n\tTitle       template.HTML\n\tDescription template.HTML\n\tContent     template.HTML\n\n\tCSS template.CSS\n\tJS  template.JS\n\tUrl string\n\n\t// Whether to toggle the sidebar\n\tMiniSidebar bool\n\n\t// Auto refresh page switch.\n\tAutoRefresh bool\n\t// Refresh page intervals, the unit is second.\n\tRefreshInterval []int\n\n\tCallbacks Callbacks\n}\n\ntype Component interface {\n\tGetContent() template.HTML\n\tGetJS() template.JS\n\tGetCSS() template.CSS\n\tGetCallbacks() Callbacks\n}\n\nfunc (p Panel) AddComponent(comp Component) Panel {\n\tp.JS += comp.GetJS()\n\tp.CSS += comp.GetCSS()\n\tp.Content += comp.GetContent()\n\tp.Callbacks = append(p.Callbacks, comp.GetCallbacks()...)\n\treturn p\n}\n\nfunc (p Panel) AddJS(js template.JS) Panel {\n\tp.JS += js\n\treturn p\n}\n\nfunc (p Panel) GetContent(params ...bool) Panel {\n\n\tcompress := false\n\n\tif len(params) > 0 {\n\t\tcompress = params[0]\n\t}\n\n\tvar (\n\t\tanimation, style, remove = template.HTML(\"\"), template.HTML(\"\"), template.HTML(\"\")\n\t\tani                      = config.GetAnimation()\n\t)\n\n\tif ani.Type != \"\" && (len(params) < 2 || params[1]) {\n\t\tanimation = template.HTML(` class='pjax-container-content animated ` + ani.Type + `'`)\n\t\tif ani.Delay != 0 {\n\t\t\tstyle = template.HTML(fmt.Sprintf(`animation-delay: %fs;-webkit-animation-delay: %fs;`, ani.Delay, ani.Delay))\n\t\t}\n\t\tif ani.Duration != 0 {\n\t\t\tstyle = template.HTML(fmt.Sprintf(`animation-duration: %fs;-webkit-animation-duration: %fs;`, ani.Duration, ani.Duration))\n\t\t}\n\t\tif style != \"\" {\n\t\t\tstyle = ` style=\"` + style + `\"`\n\t\t}\n\t\tremove = template.HTML(`<script>\n\t\t$('.pjax-container-content .modal.fade').on('show.bs.modal', function (event) {\n            // Fix Animate.css\n\t\t\t$('.pjax-container-content').removeClass('` + ani.Type + `');\n        });\n\t\t</script>`)\n\t}\n\n\tp.Content = `<div` + animation + style + \">\" + p.Content + \"</div>\" + remove\n\tif p.MiniSidebar {\n\t\tp.Content += `<script>$(\"body\").addClass(\"sidebar-collapse\")</script>`\n\t}\n\tif p.AutoRefresh {\n\t\trefreshTime := 60\n\t\tif len(p.RefreshInterval) > 0 {\n\t\t\trefreshTime = p.RefreshInterval[0]\n\t\t}\n\n\t\tp.Content += `<script>\nwindow.setTimeout(function(){\n\t$.pjax.reload('#pjax-container');\t\n}, ` + template.HTML(strconv.Itoa(refreshTime*1000)) + `);\n</script>`\n\t}\n\n\tif compress {\n\t\tutils.CompressedContent(&p.Content)\n\t}\n\n\treturn p\n}\n\ntype GetPanelFn func(ctx interface{}) (Panel, error)\n\ntype GetPanelInfoFn func(ctx *context.Context) (Panel, error)\n"
  },
  {
    "path": "template/types/select.go",
    "content": "package types\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n)\n\ntype DefaultSelection struct {\n\t*BaseButton\n\tOptions     FieldOptions\n\tPlaceholder string\n\tWidth       int\n}\n\nfunc btnUUID() string {\n\treturn \"info-btn-\" + utils.Uuid(10)\n}\n\nfunc GetDefaultSelection(placeholder string, options FieldOptions, action Action, widths ...int) *DefaultSelection {\n\n\tid := btnUUID()\n\taction.SetBtnId(\".\" + id)\n\n\tvar width = 100\n\tif len(widths) > 0 {\n\t\twidth = widths[0]\n\t}\n\tnode := action.GetCallbacks()\n\treturn &DefaultSelection{\n\t\tBaseButton: &BaseButton{\n\t\t\tId:     id,\n\t\t\tAction: action,\n\t\t\tUrl:    node.Path,\n\t\t\tMethod: node.Method,\n\t\t},\n\t\tPlaceholder: placeholder,\n\t\tWidth:       width,\n\t\tOptions:     options,\n\t}\n\n}\n\nfunc (b *DefaultSelection) Content(ctx *context.Context) (template.HTML, template.JS) {\n\n\toptionsHtml := `<option value='__go_admin_all__'>` + language.Get(\"All\") + `</option>`\n\n\tfor _, op := range b.Options {\n\t\toptionsHtml += `<option value='` + op.Value + `'>` + op.Text + `</option>`\n\t}\n\n\th := template.HTML(`<div class=\"btn-group pull-right\" style=\"margin-right: 10px\">\n<div style=\"width:`+strconv.Itoa(b.Width)+`px;\">\n<select style=\"width:100%;height:30px;\" class=\"`+b.Id+` select2-hidden-accessible\" name=\"`+b.Id+`\"\n            data-multiple=\"false\"  data-placeholder=\"`+b.Placeholder+`\" tabindex=\"-1\" aria-hidden=\"true\">\n\t<option></option>\n    `+optionsHtml+`\n</select>\n</div>\n</div>\n<style type=\"text/css\">\n\t.box-header .select2-container .select2-selection--single {\n\t\theight: 30px;\n\t\tline-height: 24px;\n\t}\n\t.box-header .select2-container--default .select2-selection--single .select2-selection__rendered\n\t{\n\t\tline-height: 24px;\n\t}\n</style>`) + b.Action.ExtContent(ctx)\n\n\treturn h, b.Action.Js() + template.JS(`\n\t$(\".`+b.Id+`\").select2();\n`)\n}\n"
  },
  {
    "path": "template/types/size.go",
    "content": "package types\n\nimport \"strconv\"\n\n// Extra small screen / phone\n// xs: 0\n\n// Small screen / phone\n// sm: 576px\n\n// Medium screen / tablet\n// md: 768px\n\n// Large screen / desktop\n// lg: 992px\n\n// Extra large screen / wide desktop\n// xl: 1200px\n\ntype S map[string]string\n\nfunc Size(sm, md, lg int) S {\n\tvar s = make(S)\n\tif sm > 0 && sm < 13 {\n\t\ts[\"sm\"] = strconv.Itoa(sm)\n\t}\n\tif md > 0 && md < 13 {\n\t\ts[\"md\"] = strconv.Itoa(md)\n\t}\n\tif lg > 0 && lg < 13 {\n\t\ts[\"lg\"] = strconv.Itoa(lg)\n\t}\n\treturn s\n}\n\nfunc (s S) LG(lg int) S {\n\tif lg > 0 && lg < 13 {\n\t\ts[\"lg\"] = strconv.Itoa(lg)\n\t}\n\treturn s\n}\n\nfunc (s S) XS(xs int) S {\n\tif xs > 0 && xs < 13 {\n\t\ts[\"xs\"] = strconv.Itoa(xs)\n\t}\n\treturn s\n}\n\nfunc (s S) XL(xl int) S {\n\tif xl > 0 && xl < 13 {\n\t\ts[\"xl\"] = strconv.Itoa(xl)\n\t}\n\treturn s\n}\n\nfunc (s S) SM(sm int) S {\n\tif sm > 0 && sm < 13 {\n\t\ts[\"sm\"] = strconv.Itoa(sm)\n\t}\n\treturn s\n}\n\nfunc (s S) MD(md int) S {\n\tif md > 0 && md < 13 {\n\t\ts[\"md\"] = strconv.Itoa(md)\n\t}\n\treturn s\n}\n\nfunc SizeXS(xs int) S {\n\tvar s = make(S)\n\tif xs > 0 && xs < 13 {\n\t\ts[\"xs\"] = strconv.Itoa(xs)\n\t}\n\treturn s\n}\n\nfunc SizeXL(xl int) S {\n\tvar s = make(S)\n\tif xl > 0 && xl < 13 {\n\t\ts[\"xl\"] = strconv.Itoa(xl)\n\t}\n\treturn s\n}\n\nfunc SizeSM(sm int) S {\n\tvar s = make(S)\n\tif sm > 0 && sm < 13 {\n\t\ts[\"sm\"] = strconv.Itoa(sm)\n\t}\n\treturn s\n}\n\nfunc SizeMD(md int) S {\n\tvar s = make(S)\n\tif md > 0 && md < 13 {\n\t\ts[\"md\"] = strconv.Itoa(md)\n\t}\n\treturn s\n}\n\nfunc SizeLG(lg int) S {\n\tvar s = make(S)\n\tif lg > 0 && lg < 13 {\n\t\ts[\"lg\"] = strconv.Itoa(lg)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "template/types/table/table.go",
    "content": "package table\n\ntype Type uint8\n\nconst (\n\tText Type = iota\n\tTextarea\n\tSelect\n\tDate\n\tDatetime\n\tYear\n\tMonth\n\tDay\n\tSwitch\n)\n\nfunc (t Type) String() string {\n\tswitch t {\n\tcase Text:\n\t\treturn \"text\"\n\tcase Select:\n\t\treturn \"select\"\n\tcase Textarea:\n\t\treturn \"textarea\"\n\tcase Date:\n\t\treturn \"date\"\n\tcase Switch:\n\t\treturn \"switch\"\n\tcase Year:\n\t\treturn \"year\"\n\tcase Month:\n\t\treturn \"month\"\n\tcase Day:\n\t\treturn \"day\"\n\tcase Datetime:\n\t\treturn \"datetime\"\n\tdefault:\n\t\tpanic(\"wrong form type\")\n\t}\n}\n\nfunc (t Type) IsSwitch() bool {\n\treturn t == Switch\n}\n"
  },
  {
    "path": "template/types/tmpl.go",
    "content": "package types\n\nvar tmpls = map[string]string{\"choose\": `{{define \"choose\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            if (e.params.data.text === {{.Val}} || e.params.data.id === {{.Val}}) {\n                if ($(\"select.{{.ChooseField}}\").length > 0) {\n                    $(\"select.{{.ChooseField}}\").val(\"{{.Value}}[0]\").select2()\n                } else {\n                    $(\".{{.ChooseField}}\").val({{.Value}})\n                }\n            }\n        })\n    </script>\n{{end}}`, \"choose_ajax\": `{{define \"choose_ajax\"}}\n    <script>\n\n        let {{.Field}}_updateBoxSelections = function (selectObj, new_opts) {\n            selectObj.html('');\n            new_opts.forEach(function (opt) {\n                selectObj.append($('<option value=\"' + opt[\"id\"] + '\">' + opt[\"text\"] + '</option>'));\n            });\n            selectObj.bootstrapDualListbox('refresh', true);\n        };\n\n        let {{.Field}}_req = function (selectObj, box, event) {\n            $.ajax({\n                url: \"{{.Url}}\",\n                type: 'post',\n                dataType: 'text',\n                data: {\n                    'value': $(\"select.{{.Field}}\").val(),\n                    {{.PassValue}}\n                    'event': event\n                },\n                success: function (data) {\n                    if (typeof (data) === \"string\") {\n                        data = JSON.parse(data);\n                    }\n                    if (data.code === 0) {\n                        {{if eq .ActionJS \"\"}}\n\n                        if (selectObj.length > 0) {\n                            if (typeof (data.data) === \"object\") {\n                                if (box) {\n                                    {{.Field}}_updateBoxSelections(selectObj, data.data)\n                                } else {\n                                    if (typeof (selectObj.attr(\"multiple\")) !== \"undefined\") {\n                                        selectObj.html(\"\");\n                                    }\n                                    selectObj.select2({\n                                        data: data.data\n                                    });\n                                }\n                            } else {\n                                if (box) {\n                                    selectObj.val(data.data).select2()\n                                } else {\n\n                                }\n                            }\n                        } else {\n                            $('.{{.ChooseField}}').val(data.data);\n                        }\n\n                        {{else}}\n\n                        {{.ActionJS}}\n\n                        {{end}}\n                    } else {\n                        swal(data.msg, '', 'error');\n                    }\n                },\n                error: function () {\n                    alert('error')\n                }\n            });\n        };\n\n        if ($(\"label[for='{{.Field}}']\").next().find(\".bootstrap-duallistbox-container\").length === 0) {\n            $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n                let id = '{{.ChooseField}}';\n                let selectObj = $(\"select.\" + id);\n                if (selectObj.length > 0) {\n                    selectObj.val(\"\").select2();\n                    selectObj.html('<option value=\"\" selected=\"selected\"></option>')\n                }\n                {{.Field}}_req(selectObj, false, \"select\");\n            });\n            if (typeof ($(\"select.{{.Field}}\").attr(\"multiple\")) !== \"undefined\") {\n                $(\"select.{{.Field}}\").on(\"select2:unselect\", function (e) {\n                    let id = '{{.ChooseField}}';\n                    let selectObj = $(\"select.\" + id);\n                    if (selectObj.length > 0) {\n                        selectObj.val(\"\").select2();\n                        selectObj.html('<option value=\"\" selected=\"selected\"></option>')\n                    }\n                    {{.Field}}_req(selectObj, false, \"unselect\");\n                })\n            }\n        } else {\n            let {{.Field}}_lastState = $(\".{{.Field}}\").val();\n\n            $(\".{{.Field}}\").on('change', function (e) {\n                var newState = $(this).val();\n                if ($({{.Field}}_lastState).not(newState).get().length > 0) {\n                    let id = '{{.ChooseField}}';\n                    {{.Field}}_req($(\".\" + id), true, \"unselect\");\n                }\n                if ($(newState).not({{.Field}}_lastState).get().length > 0) {\n                    let id = '{{.ChooseField}}';\n                    {{.Field}}_req($(\".\" + id), true, \"select\");\n                }\n                {{.Field}}_lastState = newState;\n            })\n        }\n    </script>\n{{end}}`, \"choose_custom\": `{{define \"choose_custom\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            {{.JS}}\n        })\n    </script>\n{{end}}`, \"choose_disable\": `{{define \"choose_disable\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            if ({{.Value}}.indexOf(e.params.data.text) !== -1 || {{.Value}}.indexOf(e.params.data.id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\".{{$fields}}\").prop('disabled', true);\n\n                {{end}}\n            } else {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\".{{$fields}}\").prop('disabled', false);\n\n                {{end}}\n            }\n        });\n    </script>\n{{end}}`, \"choose_hide\": `{{define \"choose_hide\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            if ({{.Value}}.indexOf(e.params.data.text) !== -1 || {{.Value}}.indexOf(e.params.data.id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().hide();\n\n                {{end}}\n            } else {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().show();\n\n                {{end}}\n            }\n        });\n        $(function () {\n            let {{.Field}}data = $(\".{{.Field}}\").select2(\"data\");\n            let {{.Field}}text = \"\";\n            let {{.Field}}id = \"\";\n            if ({{.Field}}data.length > 0) {\n                {{.Field}}text = {{.Field}}data[0].text;\n                {{.Field}}id = {{.Field}}data[0].id;\n            }\n            if ({{.Value}}.indexOf({{$.Field}}text) !== -1 || {{.Value}}.indexOf({{$.Field}}id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().hide();\n\n                {{end}}\n            }\n        })\n    </script>\n{{end}}`, \"choose_map\": `{{define \"choose_map\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            {{range $val, $object := .Data}}\n\n            {{if $object.Hide}}\n\n            if (e.params.data.text === \"{{$val}}\" || e.params.data.id === \"{{$val}}\") {\n                $(\"label[for='{{$object.Field}}']\").parent().hide()\n            } else {\n                $(\"label[for='{{$object.Field}}']\").parent().show()\n            }\n\n            {{else if $object.Disable}}\n\n            if (e.params.data.text === \"{{$val}}\" || e.params.data.id === \"{{$val}}\") {\n                $(\"label[for='{{$object.Field}}']\").prop('disabled', true);\n            } else {\n                $(\"label[for='{{$object.Field}}']\").prop('disabled', false);\n            }\n\n            {{else}}\n\n            if (e.params.data.text === \"{{$val}}\" || e.params.data.id === \"{{$val}}\") {\n                if ($(\"select.{{$object.Field}}\").length > 0) {\n                    $(\"select.{{$object.Field}}\").val(\"{{$object.Value}}\").select2()\n                } else {\n                    $(\"#{{$object.Field}}\").val(\"{{$object.Value}}\")\n                }\n            }\n\n            {{end}}\n\n            {{end}}\n        })\n    </script>\n{{end}}`, \"choose_show\": `{{define \"choose_show\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            if ({{.Value}}.indexOf(e.params.data.text) !== -1 || {{.Value}}.indexOf(e.params.data.id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().show();\n\n                {{end}}\n            } else {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().hide();\n\n                {{end}}\n            }\n        });\n        $(function () {\n            let {{.Field}}data = $(\".{{.Field}}\").select2(\"data\");\n            let {{.Field}}text = \"\";\n            let {{.Field}}id = \"\";\n            if ({{.Field}}data.length > 0) {\n                {{.Field}}text = {{.Field}}data[0].text;\n                {{.Field}}id = {{.Field}}data[0].id;\n            }\n            if ({{.Value}}.indexOf({{$.Field}}text) !== -1 || {{.Value}}.indexOf({{$.Field}}id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().show();\n\n                {{end}}\n            }\n        })\n    </script>\n{{end}}`}\n"
  },
  {
    "path": "template/types/tmpls/choose.tmpl",
    "content": "{{define \"choose\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            if (e.params.data.text === {{.Val}} || e.params.data.id === {{.Val}}) {\n                if ($(\"select.{{.ChooseField}}\").length > 0) {\n                    $(\"select.{{.ChooseField}}\").val(\"{{.Value}}[0]\").select2()\n                } else {\n                    $(\".{{.ChooseField}}\").val({{.Value}})\n                }\n            }\n        })\n    </script>\n{{end}}"
  },
  {
    "path": "template/types/tmpls/choose_ajax.tmpl",
    "content": "{{define \"choose_ajax\"}}\n    <script>\n\n        let {{.Field}}_updateBoxSelections = function (selectObj, new_opts) {\n            selectObj.html('');\n            new_opts.forEach(function (opt) {\n                selectObj.append($('<option value=\"' + opt[\"id\"] + '\">' + opt[\"text\"] + '</option>'));\n            });\n            selectObj.bootstrapDualListbox('refresh', true);\n        };\n\n        let {{.Field}}_req = function (selectObj, box, event) {\n            $.ajax({\n                url: \"{{.Url}}\",\n                type: 'post',\n                dataType: 'text',\n                data: {\n                    'value': $(\"select.{{.Field}}\").val(),\n                    {{.PassValue}}\n                    'event': event\n                },\n                success: function (data) {\n                    if (typeof (data) === \"string\") {\n                        data = JSON.parse(data);\n                    }\n                    if (data.code === 0) {\n                        {{if eq .ActionJS \"\"}}\n\n                        if (selectObj.length > 0) {\n                            if (typeof (data.data) === \"object\") {\n                                if (box) {\n                                    {{.Field}}_updateBoxSelections(selectObj, data.data)\n                                } else {\n                                    if (typeof (selectObj.attr(\"multiple\")) !== \"undefined\") {\n                                        selectObj.html(\"\");\n                                    }\n                                    selectObj.select2({\n                                        data: data.data\n                                    });\n                                }\n                            } else {\n                                if (box) {\n                                    selectObj.val(data.data).select2()\n                                } else {\n\n                                }\n                            }\n                        } else {\n                            $('.{{.ChooseField}}').val(data.data);\n                        }\n\n                        {{else}}\n\n                        {{.ActionJS}}\n\n                        {{end}}\n                    } else {\n                        swal(data.msg, '', 'error');\n                    }\n                },\n                error: function () {\n                    alert('error')\n                }\n            });\n        };\n\n        if ($(\"label[for='{{.Field}}']\").next().find(\".bootstrap-duallistbox-container\").length === 0) {\n            $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n                let id = '{{.ChooseField}}';\n                let selectObj = $(\"select.\" + id);\n                if (selectObj.length > 0) {\n                    selectObj.val(\"\").select2();\n                    selectObj.html('<option value=\"\" selected=\"selected\"></option>')\n                }\n                {{.Field}}_req(selectObj, false, \"select\");\n            });\n            if (typeof ($(\"select.{{.Field}}\").attr(\"multiple\")) !== \"undefined\") {\n                $(\"select.{{.Field}}\").on(\"select2:unselect\", function (e) {\n                    let id = '{{.ChooseField}}';\n                    let selectObj = $(\"select.\" + id);\n                    if (selectObj.length > 0) {\n                        selectObj.val(\"\").select2();\n                        selectObj.html('<option value=\"\" selected=\"selected\"></option>')\n                    }\n                    {{.Field}}_req(selectObj, false, \"unselect\");\n                })\n            }\n        } else {\n            let {{.Field}}_lastState = $(\".{{.Field}}\").val();\n\n            $(\".{{.Field}}\").on('change', function (e) {\n                var newState = $(this).val();\n                if ($({{.Field}}_lastState).not(newState).get().length > 0) {\n                    let id = '{{.ChooseField}}';\n                    {{.Field}}_req($(\".\" + id), true, \"unselect\");\n                }\n                if ($(newState).not({{.Field}}_lastState).get().length > 0) {\n                    let id = '{{.ChooseField}}';\n                    {{.Field}}_req($(\".\" + id), true, \"select\");\n                }\n                {{.Field}}_lastState = newState;\n            })\n        }\n    </script>\n{{end}}"
  },
  {
    "path": "template/types/tmpls/choose_custom.tmpl",
    "content": "{{define \"choose_custom\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            {{.JS}}\n        })\n    </script>\n{{end}}"
  },
  {
    "path": "template/types/tmpls/choose_disable.tmpl",
    "content": "{{define \"choose_disable\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            if ({{.Value}}.indexOf(e.params.data.text) !== -1 || {{.Value}}.indexOf(e.params.data.id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\".{{$fields}}\").prop('disabled', true);\n\n                {{end}}\n            } else {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\".{{$fields}}\").prop('disabled', false);\n\n                {{end}}\n            }\n        });\n    </script>\n{{end}}"
  },
  {
    "path": "template/types/tmpls/choose_hide.tmpl",
    "content": "{{define \"choose_hide\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            if ({{.Value}}.indexOf(e.params.data.text) !== -1 || {{.Value}}.indexOf(e.params.data.id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().hide();\n\n                {{end}}\n            } else {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().show();\n\n                {{end}}\n            }\n        });\n        $(function () {\n            let {{.Field}}data = $(\".{{.Field}}\").select2(\"data\");\n            let {{.Field}}text = \"\";\n            let {{.Field}}id = \"\";\n            if ({{.Field}}data.length > 0) {\n                {{.Field}}text = {{.Field}}data[0].text;\n                {{.Field}}id = {{.Field}}data[0].id;\n            }\n            if ({{.Value}}.indexOf({{$.Field}}text) !== -1 || {{.Value}}.indexOf({{$.Field}}id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().hide();\n\n                {{end}}\n            }\n        })\n    </script>\n{{end}}"
  },
  {
    "path": "template/types/tmpls/choose_map.tmpl",
    "content": "{{define \"choose_map\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            {{range $val, $object := .Data}}\n\n            {{if $object.Hide}}\n\n            if (e.params.data.text === \"{{$val}}\" || e.params.data.id === \"{{$val}}\") {\n                $(\"label[for='{{$object.Field}}']\").parent().hide()\n            } else {\n                $(\"label[for='{{$object.Field}}']\").parent().show()\n            }\n\n            {{else if $object.Disable}}\n\n            if (e.params.data.text === \"{{$val}}\" || e.params.data.id === \"{{$val}}\") {\n                $(\"label[for='{{$object.Field}}']\").prop('disabled', true);\n            } else {\n                $(\"label[for='{{$object.Field}}']\").prop('disabled', false);\n            }\n\n            {{else}}\n\n            if (e.params.data.text === \"{{$val}}\" || e.params.data.id === \"{{$val}}\") {\n                if ($(\"select.{{$object.Field}}\").length > 0) {\n                    $(\"select.{{$object.Field}}\").val(\"{{$object.Value}}\").select2()\n                } else {\n                    $(\"#{{$object.Field}}\").val(\"{{$object.Value}}\")\n                }\n            }\n\n            {{end}}\n\n            {{end}}\n        })\n    </script>\n{{end}}"
  },
  {
    "path": "template/types/tmpls/choose_show.tmpl",
    "content": "{{define \"choose_show\"}}\n    <script>\n        $(\"select.{{.Field}}\").on(\"select2:select\", function (e) {\n            if ({{.Value}}.indexOf(e.params.data.text) !== -1 || {{.Value}}.indexOf(e.params.data.id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().show();\n\n                {{end}}\n            } else {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().hide();\n\n                {{end}}\n            }\n        });\n        $(function () {\n            let {{.Field}}data = $(\".{{.Field}}\").select2(\"data\");\n            let {{.Field}}text = \"\";\n            let {{.Field}}id = \"\";\n            if ({{.Field}}data.length > 0) {\n                {{.Field}}text = {{.Field}}data[0].text;\n                {{.Field}}id = {{.Field}}data[0].id;\n            }\n            if ({{.Value}}.indexOf({{$.Field}}text) !== -1 || {{.Value}}.indexOf({{$.Field}}id) !== -1) {\n                {{range $key, $fields := .ChooseFields}}\n\n                $(\"label[for='{{$fields}}']\").parent().show();\n\n                {{end}}\n            }\n        })\n    </script>\n{{end}}"
  },
  {
    "path": "tests/common/api.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc apiTest(e *httpexpect.Expect, sesID *http.Cookie) {\n\n\tfmt.Println()\n\tprintlnWithColor(\"Api\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\tprintlnWithColor(\"show\", \"green\")\n\te.GET(config.Url(\"/api/list/manager\")).\n\t\tWithHeader(\"Accept\", \"application/json, text/plain, */*\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).JSON().Object().ValueEqual(\"code\", 200)\n\n\t//printlnWithColor(\"update form without id\", \"green\")\n\t//e.GET(config.Url(\"/api/edit/form/manager\")).\n\t//\tWithHeader(\"Accept\", \"application/json, text/plain, */*\").\n\t//\tWithCookie(sesID.Name, sesID.Value).\n\t//\tExpect().\n\t//\tStatus(400).JSON().Object().ValueEqual(\"code\", 400)\n\n\tprintlnWithColor(\"update form\", \"green\")\n\te.GET(config.Url(\"/api/edit/form/manager\")).\n\t\tWithHeader(\"Accept\", \"application/json, text/plain, */*\").\n\t\tWithQuery(constant.EditPKKey, \"1\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).JSON().Object().ValueEqual(\"code\", 200)\n\n\tprintlnWithColor(\"create form\", \"green\")\n\te.GET(config.Url(\"/api/create/form/manager\")).\n\t\tWithHeader(\"Accept\", \"application/json, text/plain, */*\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).JSON().Object().ValueEqual(\"code\", 200)\n}\n"
  },
  {
    "path": "tests/common/auth.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/auth\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc authTest(e *httpexpect.Expect) *http.Cookie {\n\n\tprintlnWithColor(\"Auth\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\t// login: show\n\n\tprintlnWithColor(\"login: show\", \"green\")\n\te.GET(config.Url(config.GetLoginUrl())).Expect().Status(200)\n\tprintlnWithColor(\"login: empty password\", \"green\")\n\te.POST(config.Url(\"/signin\")).WithJSON(map[string]string{\n\t\t\"username\": \"admin\",\n\t\t\"password\": \"\",\n\t}).Expect().Status(400)\n\n\t// login\n\n\tprintlnWithColor(\"login\", \"green\")\n\tsesID := e.POST(config.Url(\"/signin\")).WithForm(map[string]string{\n\t\t\"username\": \"admin\",\n\t\t\"password\": \"admin\",\n\t}).Expect().Status(200).Cookie(auth.DefaultCookieKey).Raw()\n\n\t// logout: without login\n\n\tprintlnWithColor(\"logout: without login\", \"green\")\n\te.GET(config.Url(\"/logout\")).Expect().\n\t\tStatus(200)\n\n\t// logout\n\n\tprintlnWithColor(\"logout\", \"green\")\n\te.GET(config.Url(\"/logout\")).WithCookie(auth.DefaultCookieKey, sesID.Value).Expect().\n\t\tStatus(200)\n\n\t// login again\n\n\tprintlnWithColor(\"login again\", \"green\")\n\tcookie1 := e.POST(config.Url(\"/signin\")).WithForm(map[string]string{\n\t\t\"username\": \"admin\",\n\t\t\"password\": \"admin\",\n\t}).Expect().Status(200).Cookie(auth.DefaultCookieKey).Raw()\n\n\tprintlnWithColor(\"login again：restrict users from logging in at the same time\", \"green\")\n\tcookie2 := e.POST(config.Url(\"/signin\")).WithForm(map[string]string{\n\t\t\"username\": \"admin\",\n\t\t\"password\": \"admin\",\n\t}).Expect().Status(200).Cookie(auth.DefaultCookieKey).Raw()\n\n\t// login success\n\n\tprintlnWithColor(\"cookie failure\", \"green\")\n\te.GET(config.Url(\"/\")).\n\t\tWithCookie(auth.DefaultCookieKey, cookie1.Value).Expect().\n\t\tStatus(200).\n\t\tBody().Contains(\"login\")\n\n\tprintlnWithColor(\"login success\", \"green\")\n\te.GET(config.Url(\"/\")).\n\t\tWithCookie(auth.DefaultCookieKey, cookie2.Value).Expect().\n\t\tStatus(200).\n\t\tBody().Contains(\"Dashboard\")\n\n\treturn cookie2\n\n}\n"
  },
  {
    "path": "tests/common/checklist.md",
    "content": "# Test Case Checklist\n\n## Authentication\n\n- [ ] Show login page\n- [ ] Login\n- [ ] Logout without login\n- [ ] Logout\n\n## Admin Management\n\n- [ ] Show list page\n- [ ] Edit\n- [ ] Show form page without ID\n- [ ] Show form\n- [ ] Edit form\n- [ ] Show new form\n- [ ] New manager tester\n- [ ] Tester login with wrong password\n- [ ] Tester login with right password"
  },
  {
    "path": "tests/common/common.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/gavv/httpexpect\"\n\t\"github.com/mgutz/ansi\"\n)\n\nvar reg, _ = regexp.Compile(\"<input type=\\\"hidden\\\" name=\\\"\" + form.TokenKey + \"\\\" value='(.*?)'>\")\n\n// ExtraTest contains unit test sections of the GoAdmin admin plugin.\nfunc ExtraTest(e *httpexpect.Expect) {\n\n\tfmt.Println()\n\tfmt.Println(\"============================================\")\n\tprintlnWithColor(\"Basic Function Black-Box Testing\", \"blue\")\n\tfmt.Println(\"============================================\")\n\tfmt.Println()\n\n\tcookie := authTest(e)\n\n\t// permission check\n\tpermissionTest(e, cookie)\n\t// role check\n\troleTest(e, cookie)\n\t// manager check\n\tmanagerTest(e, cookie)\n\t// api check\n\tapiTest(e, cookie)\n\t// menu check\n\tmenuTest(e, cookie)\n\t// operation log check\n\toperationLogTest(e, cookie)\n\n\t// get data from outside source check\n\texternalTest(e, cookie)\n\t// normal table tests\n\tnormalTest(e, cookie)\n}\n\n// ExtraTest contains unit test sections of the GoAdmin admin plugin.\nfunc Test(e *httpexpect.Expect) {\n\n\tfmt.Println()\n\tfmt.Println(\"============================================\")\n\tprintlnWithColor(\"Basic Function Black-Box Testing\", \"blue\")\n\tfmt.Println(\"============================================\")\n\tfmt.Println()\n\n\tcookie := authTest(e)\n\n\t// permission check\n\tpermissionTest(e, cookie)\n\t// role check\n\troleTest(e, cookie)\n\t// manager check\n\tmanagerTest(e, cookie)\n\t// menu check\n\tmenuTest(e, cookie)\n\t// operation log check\n\toperationLogTest(e, cookie)\n}\n\nfunc printlnWithColor(msg string, color string) {\n\tfmt.Println(ansi.Color(msg, color))\n}\n"
  },
  {
    "path": "tests/common/config.json",
    "content": "{\n  \"database\": {\n    \"default\": {\n      \"host\": \"db_mysql\",\n      \"port\": \"3306\",\n      \"user\": \"root\",\n      \"pwd\": \"root\",\n      \"name\": \"go-admin-test\",\n      \"max_idle_con\": 50,\n      \"max_open_con\": 150,\n      \"driver\": \"mysql\"\n    }\n  },\n  \"domain\": \"localhost\",\n  \"prefix\": \"admin\",\n  \"store\": {\n    \"path\": \"./uploads\",\n    \"prefix\": \"uploads\"\n  },\n  \"env\": \"local\",\n  \"language\": \"en\",\n  \"index\": \"/\",\n  \"debug\": true,\n  \"open_admin_api\": true,\n  \"color_scheme\": \"skin-black\"\n}"
  },
  {
    "path": "tests/common/config_ms.json",
    "content": "{\n  \"database\": {\n    \"default\": {\n      \"host\": \"db_mssql\",\n      \"port\": \"1433\",\n      \"user\": \"sa\",\n      \"pwd\": \"Aa123456\",\n      \"name\": \"goadmin\",\n      \"max_idle_con\": 50,\n      \"max_open_con\": 150,\n      \"driver\": \"mssql\"\n    }\n  },\n  \"domain\": \"localhost\",\n  \"prefix\": \"admin\",\n  \"store\": {\n    \"path\": \"./uploads\",\n    \"prefix\": \"uploads\"\n  },\n  \"env\": \"local\",\n  \"language\": \"en\",\n  \"index\": \"/\",\n  \"debug\": true,\n  \"open_admin_api\": true,\n  \"color_scheme\": \"skin-black\"\n}\n"
  },
  {
    "path": "tests/common/config_pg.json",
    "content": "{\n  \"database\": {\n    \"default\": {\n      \"host\": \"db_pgsql\",\n      \"port\": \"5432\",\n      \"user\": \"postgres\",\n      \"pwd\": \"root\",\n      \"name\": \"go-admin-test\",\n      \"max_idle_con\": 50,\n      \"max_open_con\": 150,\n      \"driver\": \"postgresql\"\n    }\n  },\n  \"domain\": \"localhost\",\n  \"prefix\": \"admin\",\n  \"store\": {\n    \"path\": \"./uploads\",\n    \"prefix\": \"uploads\"\n  },\n  \"env\": \"local\",\n  \"language\": \"en\",\n  \"index\": \"/\",\n  \"debug\": true,\n  \"open_admin_api\": true,\n  \"color_scheme\": \"skin-black\"\n}"
  },
  {
    "path": "tests/common/config_sqlite.json",
    "content": "{\n  \"database\": {\n    \"default\": {\n      \"driver\": \"sqlite\",\n      \"file\": \"./../../common/admin.db\"\n    }\n  },\n  \"domain\": \"localhost\",\n  \"prefix\": \"admin\",\n  \"store\": {\n    \"path\": \"./uploads\",\n    \"prefix\": \"uploads\"\n  },\n  \"env\": \"local\",\n  \"language\": \"en\",\n  \"index\": \"/\",\n  \"debug\": true,\n  \"open_admin_api\": true,\n  \"color_scheme\": \"skin-black\"\n}"
  },
  {
    "path": "tests/common/external.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc externalTest(e *httpexpect.Expect, sesID *http.Cookie) {\n\tfmt.Println()\n\tprintlnWithColor(\"External\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\t// show\n\n\tprintlnWithColor(\"show\", \"green\")\n\te.GET(config.Url(\"/info/external\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).\n\t\tBody().Contains(\"External\").Contains(\"this is a title\").Contains(\"10\")\n\n\t// show form: without id\n\n\t//printlnWithColor(\"show form: without id\", \"green\")\n\t//e.GET(config.Url(\"/info/external/edit\")).\n\t//\tWithCookie(sesID.Name, sesID.Value).\n\t//\tExpect().Status(200).Body().Contains(errors.WrongID)\n\n\t// show form\n\n\tprintlnWithColor(\"show form\", \"green\")\n\te.GET(config.Url(\"/info/external/edit\")).\n\t\tWithQuery(constant.EditPKKey, \"10\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\t// show new form\n\n\tprintlnWithColor(\"show new form\", \"green\")\n\te.GET(config.Url(\"/info/external/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n}\n"
  },
  {
    "path": "tests/common/manager.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc managerTest(e *httpexpect.Expect, sesID *http.Cookie) {\n\n\tfmt.Println()\n\tprintlnWithColor(\"Manager\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\t// show\n\n\tprintlnWithColor(\"show\", \"green\")\n\te.GET(config.Url(\"/info/manager\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).\n\t\tBody().Contains(\"Managers\").Contains(\"admin\").Contains(\"1\")\n\n\t// edit\n\n\tprintlnWithColor(\"edit\", \"green\")\n\te.POST(config.Url(\"/edit/manager\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"username\":        \"admin\",\n\t\t\t\"name\":            \"admin1\",\n\t\t\t\"password\":        \"admin\",\n\t\t\t\"password_again\":  \"admin\",\n\t\t\t\"role_id[]\":       1,\n\t\t\t\"permission_id[]\": 1,\n\t\t\tform.PreviousKey:  config.Url(\"/info/manager?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\t\"id\":              \"1\",\n\t\t\tform.TokenKey:     \"123\",\n\t\t}).Expect().Status(200).Body().Contains(errors.EditFailWrongToken)\n\n\t// show form: without id\n\n\t//printlnWithColor(\"show form: without id\", \"green\")\n\t//e.GET(config.Url(\"/info/manager/edit\")).\n\t//\tWithCookie(sesID.Name, sesID.Value).\n\t//\tExpect().Status(200).Body().Contains(errors.WrongID)\n\n\t// show form\n\n\tprintlnWithColor(\"show form\", \"green\")\n\tformBody := e.GET(config.Url(\"/info/manager/edit\")).\n\t\tWithQuery(constant.EditPKKey, \"1\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken := reg.FindStringSubmatch(formBody.Raw())\n\n\t// edit form\n\n\tprintlnWithColor(\"edit form\", \"green\")\n\tres := e.POST(config.Url(\"/edit/manager\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"username\":            \"admin\",\n\t\t\t\"name\":                \"admin1\",\n\t\t\t\"password\":            \"admin\",\n\t\t\t\"password_again\":      \"admin\",\n\t\t\t\"avatar__delete_flag\": \"0\",\n\t\t\t\"role_id[]\":           1,\n\t\t\t\"permission_id[]\":     1,\n\t\t\tform.PreviousKey:      config.Url(\"/info/manager?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\t\"id\":                  \"1\",\n\t\t\tform.TokenKey:         token[1],\n\t\t}).Expect().Status(200)\n\tres.Header(\"X-Pjax-Url\").Contains(config.Url(\"/info/\"))\n\tres.Body().Contains(\"admin1\")\n\n\t// show new form\n\n\tprintlnWithColor(\"show new form\", \"green\")\n\tformBody = e.GET(config.Url(\"/info/manager/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken = reg.FindStringSubmatch(formBody.Raw())\n\n\t// new manager tester\n\n\tprintlnWithColor(\"new manager test\", \"green\")\n\tres = e.POST(config.Url(\"/new/manager\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"username\":            \"tester\",\n\t\t\t\"name\":                \"tester\",\n\t\t\t\"password\":            \"tester\",\n\t\t\t\"password_again\":      \"tester\",\n\t\t\t\"avatar__delete_flag\": \"0\",\n\t\t\t\"role_id[]\":           1,\n\t\t\t\"permission_id[]\":     1,\n\t\t\tform.PreviousKey:      config.Url(\"/info/manager?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\t\"id\":                  \"1\",\n\t\t\tform.TokenKey:         token[1],\n\t\t}).Expect().Status(200)\n\tres.Header(\"X-Pjax-Url\").Contains(config.Url(\"/info/\"))\n\tres.Body().Contains(\"tester\")\n\n\t// tester login: wrong password\n\n\tprintlnWithColor(\"tester login: wrong password\", \"green\")\n\te.POST(config.Url(\"/signin\")).WithForm(map[string]string{\n\t\t\"username\": \"tester\",\n\t\t\"password\": \"admin\",\n\t}).Expect().Status(400)\n\n\t// tester login success\n\n\tprintlnWithColor(\"tester login success\", \"green\")\n\te.POST(config.Url(\"/signin\")).WithForm(map[string]string{\n\t\t\"username\": \"tester\",\n\t\t\"password\": \"tester\",\n\t}).Expect().Status(200).JSON().Equal(map[string]interface{}{\n\t\t\"code\": 200,\n\t\t\"data\": map[string]interface{}{\n\t\t\t\"url\": \"/\" + config.GetUrlPrefix(),\n\t\t},\n\t\t\"msg\": \"ok\",\n\t})\n}\n"
  },
  {
    "path": "tests/common/menu.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc menuTest(e *httpexpect.Expect, sesID *http.Cookie) {\n\n\tfmt.Println()\n\tprintlnWithColor(\"Menu\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\t// show\n\n\tprintlnWithColor(\"show\", \"green\")\n\tformBody := e.GET(config.Url(\"/menu\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).\n\t\tBody().Contains(language.Get(\"menus manage\"))\n\n\ttoken := reg.FindStringSubmatch(formBody.Raw())\n\n\t// new menu tester\n\n\tprintlnWithColor(\"new menu test\", \"green\")\n\tres := e.POST(config.Url(\"/menu/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"roles[]\", \"1\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"parent_id\":      0,\n\t\t\t\"title\":          \"test menu\",\n\t\t\t\"header\":         \"\",\n\t\t\t\"icon\":           \"fa-angellist\",\n\t\t\t\"uri\":            \"/example/test\",\n\t\t\tform.PreviousKey: \"/admin/menu\",\n\t\t\tform.TokenKey:    token[1],\n\t\t}).Expect().Status(200)\n\tres.Header(\"X-Pjax-Url\").Contains(config.Url(\"/menu\"))\n\tres.Body().Contains(\"test menu\").Contains(\"/example/test\")\n\n\t// show form: without id\n\n\t//printlnWithColor(\"show form: without id\", \"green\")\n\t//e.GET(config.Url(\"/menu/edit/show\")).\n\t//\tWithCookie(sesID.Name, sesID.Value).\n\t//\tExpect().Status(200).Body().Contains(errors.WrongID)\n\n\t// show form\n\n\tprintlnWithColor(\"show form\", \"green\")\n\tformBody = e.GET(config.Url(\"/menu/edit/show\")).\n\t\tWithQuery(constant.EditPKKey, \"3\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken = reg.FindStringSubmatch(formBody.Raw())\n\n\t// edit form\n\n\tprintlnWithColor(\"edit form\", \"green\")\n\tres = e.POST(config.Url(\"/menu/edit\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"roles[]\", \"1\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"parent_id\":      0,\n\t\t\t\"title\":          \"test2 menu\",\n\t\t\t\"header\":         \"\",\n\t\t\t\"icon\":           \"fa-angellist\",\n\t\t\t\"uri\":            \"/example/test\",\n\t\t\tform.PreviousKey: \"/admin/menu\",\n\t\t\tform.TokenKey:    token[1],\n\t\t\t\"id\":             \"3\",\n\t\t}).Expect().Status(200)\n\tres.Header(\"X-Pjax-Url\").Contains(config.Url(\"/menu\"))\n\tres.Body().Contains(\"test2 menu\").Contains(\"/example/test\")\n\n\t// new tester2\n\n\tprintlnWithColor(\"new tester2\", \"green\")\n\te.POST(config.Url(\"/menu/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"roles[]\", \"1\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"parent_id\":      0,\n\t\t\t\"title\":          \"test2 menu\",\n\t\t\t\"header\":         \"\",\n\t\t\t\"icon\":           \"fa-angellist\",\n\t\t\t\"uri\":            \"/example/test2\",\n\t\t\tform.PreviousKey: \"/admin/menu\",\n\t\t\tform.TokenKey:    token[1],\n\t\t}).Expect().Status(200)\n\n\t// delete tester2\n\n\tprintlnWithColor(\"delete menu tester2\", \"green\")\n\te.POST(config.Url(\"/menu/delete\")).\n\t\tWithQuery(\"id\", \"9\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tExpect().Status(200).JSON().Object().\n\t\tValueEqual(\"code\", 200).\n\t\tValueEqual(\"msg\", \"delete succeed\")\n}\n"
  },
  {
    "path": "tests/common/normal.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc normalTest(e *httpexpect.Expect, sesID *http.Cookie) {\n\n\tfmt.Println()\n\tprintlnWithColor(\"Normal Table\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\t// show\n\n\tprintlnWithColor(\"show\", \"green\")\n\te.GET(config.Url(\"/info/user\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).\n\t\tBody().Contains(\"Users\")\n\n\t// export\n\n\tprintlnWithColor(\"export test\", \"green\")\n\te.POST(config.Url(\"/export/user\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"id\", \"1\").\n\t\tExpect().Status(200)\n\n\t// show form: without id\n\n\t//printlnWithColor(\"show form: without id\", \"green\")\n\t//e.GET(config.Url(\"/info/user/edit\")).\n\t//\tWithCookie(sesID.Name, sesID.Value).\n\t//\tExpect().Status(200).Body().Contains(errors.WrongID)\n\n\t// show form\n\n\t//printlnWithColor(\"show form\", \"green\")\n\t//e.GET(config.Url(\"/info/user/edit\")).\n\t//\tWithQuery(constant.EditPKKey, \"362\").\n\t//\tWithCookie(sesID.Name, sesID.Value).\n\t//\tExpect().Status(200).Body()\n\n\t// show new form\n\n\tprintlnWithColor(\"show new form\", \"green\")\n\te.GET(config.Url(\"/info/user/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n}\n"
  },
  {
    "path": "tests/common/operation_log.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc operationLogTest(e *httpexpect.Expect, sesID *http.Cookie) {\n\n\tfmt.Println()\n\tprintlnWithColor(\"Operation Log\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\t// show\n\n\tprintlnWithColor(\"show\", \"green\")\n\te.GET(config.Url(\"/info/op\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).\n\t\tBody().Contains(language.Get(\"operation log\"))\n}\n"
  },
  {
    "path": "tests/common/permission.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc permissionTest(e *httpexpect.Expect, sesID *http.Cookie) {\n\n\tfmt.Println()\n\tprintlnWithColor(\"Permission\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\t// show\n\n\tprintlnWithColor(\"show\", \"green\")\n\te.GET(config.Url(\"/info/permission\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).\n\t\tBody().Contains(\"Dashboard\").Contains(\"All permission\")\n\n\t// show new form\n\n\tprintlnWithColor(\"show new form\", \"green\")\n\tformBody := e.GET(config.Url(\"/info/permission/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken := reg.FindStringSubmatch(formBody.Raw())\n\n\t// new permission tester\n\n\tprintlnWithColor(\"new permission test\", \"green\")\n\tres := e.POST(config.Url(\"/new/permission\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"http_method[]\", \"GET\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"name\": \"tester\",\n\t\t\t\"slug\": \"tester\",\n\t\t\t\"http_path\": `/\n/admin/info/op`,\n\t\t\tform.PreviousKey: config.Url(\"/info/permission?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\tform.TokenKey:    token[1],\n\t\t}).Expect().Status(200)\n\tres.Header(\"X-Pjax-Url\").Contains(config.Url(\"/info/\"))\n\tres.Body().Contains(\"tester\").Contains(\"GET\")\n\n\t// show form: without id\n\n\t//printlnWithColor(\"show form: without id\", \"green\")\n\t//e.GET(config.Url(\"/info/permission/edit\")).\n\t//\tWithCookie(sesID.Name, sesID.Value).\n\t//\tExpect().Status(200).Body().Contains(errors.WrongID)\n\n\t// show form\n\n\tprintlnWithColor(\"show form\", \"green\")\n\tformBody = e.GET(config.Url(\"/info/permission/edit\")).\n\t\tWithQuery(constant.EditPKKey, \"3\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken = reg.FindStringSubmatch(formBody.Raw())\n\n\t// edit form\n\n\tprintlnWithColor(\"edit form\", \"green\")\n\tres = e.POST(config.Url(\"/edit/permission\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"http_method[]\", \"GET\").\n\t\tWithFormField(\"http_method[]\", \"POST\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"name\": \"tester\",\n\t\t\t\"slug\": \"tester\",\n\t\t\t\"http_path\": `/\n/admin/info/op`,\n\t\t\tform.PreviousKey: config.Url(\"/info/permission?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\tform.TokenKey:    token[1],\n\t\t\t\"id\":             \"3\",\n\t\t}).Expect().Status(200)\n\tres.Header(\"X-Pjax-Url\").Contains(config.Url(\"/info/\"))\n\tres.Body().Contains(\"tester\").Contains(\"GET,POST\")\n\n\t// show new form\n\n\tprintlnWithColor(\"show new form\", \"green\")\n\tformBody = e.GET(config.Url(\"/info/permission/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken = reg.FindStringSubmatch(formBody.Raw())\n\n\t// new tester2\n\n\tprintlnWithColor(\"new tester2\", \"green\")\n\te.POST(config.Url(\"/new/permission\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"http_method[]\", \"GET\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"name\": \"tester2\",\n\t\t\t\"slug\": \"tester2\",\n\t\t\t\"http_path\": `/\n/admin/info/op`,\n\t\t\tform.PreviousKey: config.Url(\"/info/permission?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\tform.TokenKey:    token[1],\n\t\t}).Expect().Status(200)\n\n\t// delete tester2\n\n\tprintlnWithColor(\"delete permission tester2\", \"green\")\n\te.POST(config.Url(\"/delete/permission\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"id\", \"4\").\n\t\tExpect().Status(200).JSON().Object().\n\t\tValueEqual(\"code\", 200).\n\t\tValueEqual(\"msg\", \"ok\")\n}\n"
  },
  {
    "path": "tests/common/role.go",
    "content": "package common\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc roleTest(e *httpexpect.Expect, sesID *http.Cookie) {\n\n\tfmt.Println()\n\tprintlnWithColor(\"Role\", \"blue\")\n\tfmt.Println(\"============================\")\n\n\t// show\n\n\tprintlnWithColor(\"show\", \"green\")\n\te.GET(config.Url(\"/info/roles\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().\n\t\tStatus(200).\n\t\tBody().Contains(\"Administrator\").Contains(\"Operator\")\n\n\t// show new form\n\n\tprintlnWithColor(\"show new form\", \"green\")\n\tformBody := e.GET(config.Url(\"/info/roles/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken := reg.FindStringSubmatch(formBody.Raw())\n\n\t// new roles tester\n\n\tprintlnWithColor(\"new roles test\", \"green\")\n\tres := e.POST(config.Url(\"/new/roles\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"permission_id[]\", \"3\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"name\":           \"tester\",\n\t\t\t\"slug\":           \"tester\",\n\t\t\tform.PreviousKey: config.Url(\"/info/roles?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\tform.TokenKey:    token[1],\n\t\t}).Expect().Status(200)\n\tres.Header(\"X-Pjax-Url\").Contains(config.Url(\"/info/\"))\n\tres.Body().Contains(\"tester\")\n\n\t// show form: without id\n\n\t//printlnWithColor(\"show form: without id\", \"green\")\n\t//e.GET(config.Url(\"/info/roles/edit\")).\n\t//\tWithCookie(sesID.Name, sesID.Value).\n\t//\tExpect().Status(200).Body().Contains(errors.WrongID)\n\n\t// show form\n\n\tprintlnWithColor(\"show form\", \"green\")\n\tformBody = e.GET(config.Url(\"/info/roles/edit\")).\n\t\tWithQuery(constant.EditPKKey, \"3\").\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken = reg.FindStringSubmatch(formBody.Raw())\n\n\t// edit form\n\n\tprintlnWithColor(\"edit form\", \"green\")\n\tres = e.POST(config.Url(\"/edit/roles\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"permission_id[]\", \"3\").\n\t\tWithFormField(\"permission_id[]\", \"2\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"name\":           \"tester\",\n\t\t\t\"slug\":           \"tester\",\n\t\t\tform.PreviousKey: config.Url(\"/info/roles?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\tform.TokenKey:    token[1],\n\t\t\t\"id\":             \"3\",\n\t\t}).Expect().Status(200)\n\tres.Header(\"X-Pjax-Url\").Contains(config.Url(\"/info/\"))\n\tres.Body().Contains(\"tester\")\n\n\t// show new form\n\n\tprintlnWithColor(\"show new form\", \"green\")\n\tformBody = e.GET(config.Url(\"/info/roles/new\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tExpect().Status(200).Body()\n\n\ttoken = reg.FindStringSubmatch(formBody.Raw())\n\n\t// new tester2\n\n\tprintlnWithColor(\"new tester2\", \"green\")\n\te.POST(config.Url(\"/new/roles\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"permission_id[]\", \"3\").\n\t\tWithForm(map[string]interface{}{\n\t\t\t\"name\":           \"tester2\",\n\t\t\t\"slug\":           \"tester2\",\n\t\t\tform.PreviousKey: config.Url(\"/info/roles?__page=1&__pageSize=10&__sort=id&__sort_type=desc\"),\n\t\t\tform.TokenKey:    token[1],\n\t\t}).Expect().Status(200)\n\n\t// delete tester2\n\n\tprintlnWithColor(\"delete roles tester2\", \"green\")\n\te.POST(config.Url(\"/delete/roles\")).\n\t\tWithCookie(sesID.Name, sesID.Value).\n\t\tWithMultipart().\n\t\tWithFormField(\"id\", \"3\").\n\t\tExpect().Status(200).JSON().Object().\n\t\tValueEqual(\"code\", 200).\n\t\tValueEqual(\"msg\", \"ok\")\n}\n"
  },
  {
    "path": "tests/data/admin.sql",
    "content": "# ************************************************************\n# Sequel Pro SQL dump\n# Version 4541\n#\n# http://www.sequelpro.com/\n# https://github.com/sequelpro/sequelpro\n#\n# Host: 127.0.0.1 (MySQL 5.7.19)\n# Database: go-admin-test\n# Generation Time: 2020-03-14 09:34:40 +0000\n# ************************************************************\n\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n/*!40101 SET NAMES utf8 */;\n/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n\n\n# Dump of table goadmin_menu\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_menu`;\n\nCREATE TABLE `goadmin_menu` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `parent_id` int(11) unsigned NOT NULL DEFAULT '0',\n  `type` tinyint(4) unsigned NOT NULL DEFAULT '0',\n  `order` int(11) unsigned NOT NULL DEFAULT '0',\n  `title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `icon` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `uri` varchar(3000) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `plugin_name` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `header` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `uuid` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_menu` WRITE;\n/*!40000 ALTER TABLE `goadmin_menu` DISABLE KEYS */;\n\nINSERT INTO `goadmin_menu` (`id`, `parent_id`, `type`, `order`, `title`, `icon`, `uri`, `header`, `created_at`, `updated_at`)\nVALUES\n\t(1,0,1,2,'Admin','fa-tasks','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,1,1,2,'Users','fa-users','/info/manager',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(3,1,1,3,'Roles','fa-user','/info/roles',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(4,1,1,4,'Permission','fa-ban','/info/permission',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(5,1,1,5,'Menu','fa-bars','/menu',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(6,1,1,6,'Operation log','fa-history','/info/op',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(7,0,1,1,'Dashboard','fa-bar-chart','/',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(8,0,1,7,'User','fa-users','/info/user',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_menu` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_operation_log\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_operation_log`;\n\nCREATE TABLE `goadmin_operation_log` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `user_id` int(11) unsigned NOT NULL,\n  `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `method` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `ip` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `input` text COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  KEY `admin_operation_log_user_id_index` (`user_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n\n\n# Dump of table goadmin_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_permissions`;\n\nCREATE TABLE `goadmin_permissions` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `http_method` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `http_path` text COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_permissions_name_unique` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_permissions` (`id`, `name`, `slug`, `http_method`, `http_path`, `created_at`, `updated_at`)\nVALUES\n\t(1,'All permission','*','','*','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'Dashboard','dashboard','GET,PUT,POST,DELETE','/','2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n# Dump of table goadmin_site\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_site`;\n\nCREATE TABLE `goadmin_site` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `key` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `value` longtext COLLATE utf8mb4_unicode_ci,\n  `description` varchar(3000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `state` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n\n# Dump of table goadmin_role_menu\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_menu`;\n\nCREATE TABLE `goadmin_role_menu` (\n  `role_id` int(11) unsigned NOT NULL,\n  `menu_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  KEY `admin_role_menu_role_id_menu_id_index` (`role_id`,`menu_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_menu` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_menu` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_menu` (`role_id`, `menu_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,8,'2019-09-11 10:20:55','2019-09-11 10:20:55'),\n\t(2,8,'2019-09-11 10:20:55','2019-09-11 10:20:55');\n\n/*!40000 ALTER TABLE `goadmin_role_menu` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_role_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_permissions`;\n\nCREATE TABLE `goadmin_role_permissions` (\n  `role_id` int(11) unsigned NOT NULL,\n  `permission_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_role_permissions` (`role_id`,`permission_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_permissions` (`role_id`, `permission_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(1,2,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_role_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_role_users\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_role_users`;\n\nCREATE TABLE `goadmin_role_users` (\n  `role_id` int(11) unsigned NOT NULL,\n  `user_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_user_roles` (`role_id`,`user_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_role_users` WRITE;\n/*!40000 ALTER TABLE `goadmin_role_users` DISABLE KEYS */;\n\nINSERT INTO `goadmin_role_users` (`role_id`, `user_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_role_users` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_roles\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_roles`;\n\nCREATE TABLE `goadmin_roles` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_roles_name_unique` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_roles` WRITE;\n/*!40000 ALTER TABLE `goadmin_roles` DISABLE KEYS */;\n\nINSERT INTO `goadmin_roles` (`id`, `name`, `slug`, `created_at`, `updated_at`)\nVALUES\n\t(1,'Administrator','administrator','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'Operator','operator','2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_roles` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_session\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_session`;\n\nCREATE TABLE `goadmin_session` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `sid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `values` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n\n\n# Dump of table goadmin_user_permissions\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_user_permissions`;\n\nCREATE TABLE `goadmin_user_permissions` (\n  `user_id` int(11) unsigned NOT NULL,\n  `permission_id` int(11) unsigned NOT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  UNIQUE KEY `admin_user_permissions` (`user_id`,`permission_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_user_permissions` WRITE;\n/*!40000 ALTER TABLE `goadmin_user_permissions` DISABLE KEYS */;\n\nINSERT INTO `goadmin_user_permissions` (`user_id`, `permission_id`, `created_at`, `updated_at`)\nVALUES\n\t(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_user_permissions` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table goadmin_users\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `goadmin_users`;\n\nCREATE TABLE `goadmin_users` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `username` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `password` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `admin_users_username_unique` (`username`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `goadmin_users` WRITE;\n/*!40000 ALTER TABLE `goadmin_users` DISABLE KEYS */;\n\nINSERT INTO `goadmin_users` (`id`, `username`, `password`, `name`, `avatar`, `remember_token`, `created_at`, `updated_at`)\nVALUES\n\t(1,'admin','$2a$10$U3F/NSaf2kaVbyXTBp7ppOn0jZFyRqXRnYXB.AMioCjXl3Ciaj4oy','admin','','tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh','2019-09-10 00:00:00','2019-09-10 00:00:00'),\n\t(2,'operator','$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.','Operator','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');\n\n/*!40000 ALTER TABLE `goadmin_users` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table member\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `member`;\n\nCREATE TABLE `member` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `member` WRITE;\n/*!40000 ALTER TABLE `member` DISABLE KEYS */;\n\nINSERT INTO `member` (`id`, `name`, `created_at`, `updated_at`)\nVALUES\n\t(1,'level_one','2020-03-14 17:11:11','2020-03-14 17:11:11'),\n\t(2,'level_two','2020-03-14 17:11:13','2020-03-14 17:11:13'),\n\t(3,'level_three','2020-03-14 17:11:21','2020-03-14 17:11:21'),\n\t(4,'bronze','2020-03-14 17:11:29','2020-03-14 17:11:29'),\n\t(5,'silver','2020-03-14 17:11:39','2020-03-14 17:11:39'),\n\t(6,'gold','2020-03-14 17:11:46','2020-03-14 17:11:46'),\n\t(7,'platinum','2020-03-14 17:11:53','2020-03-14 17:11:53'),\n\t(8,'vip','2020-03-14 17:12:06','2020-03-14 17:12:06');\n\n/*!40000 ALTER TABLE `member` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table user_like_books\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `user_like_books`;\n\nCREATE TABLE `user_like_books` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `user_id` int(10) unsigned NOT NULL,\n  `name` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `user_like_books` WRITE;\n/*!40000 ALTER TABLE `user_like_books` DISABLE KEYS */;\n\nINSERT INTO `user_like_books` (`id`, `user_id`, `name`, `created_at`, `updated_at`)\nVALUES\n\t(1,372,'Robinson Crusoe','2020-03-14 17:29:48','2020-03-14 17:29:48'),\n\t(2,390,'The catcher in the rye','2020-03-14 17:29:58','2020-03-14 17:29:58');\n\n/*!40000 ALTER TABLE `user_like_books` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n# Dump of table users\n# ------------------------------------------------------------\n\nDROP TABLE IF EXISTS `users`;\n\nCREATE TABLE `users` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `homepage` varchar(3000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `email` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `birthday` timestamp NULL DEFAULT NULL,\n  `country` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `member_id` tinyint(3) unsigned NOT NULL DEFAULT '1',\n  `city` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `password` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `ip` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `certificate` varchar(300) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `money` int(10) unsigned DEFAULT NULL,\n  `age` int(10) unsigned DEFAULT NULL,\n  `resume` text COLLATE utf8mb4_unicode_ci,\n  `gender` tinyint(4) unsigned DEFAULT NULL,\n  `fruit` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `drink` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n  `experience` tinyint(3) unsigned DEFAULT NULL,\n  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nLOCK TABLES `users` WRITE;\n/*!40000 ALTER TABLE `users` DISABLE KEYS */;\n\nINSERT INTO `users` (`id`, `name`, `homepage`, `email`, `birthday`, `country`, `member_id`, `city`, `password`, `ip`, `certificate`, `money`, `age`, `resume`, `gender`, `fruit`, `drink`, `experience`, `created_at`, `updated_at`)\nVALUES\n\t(1,'Jack','http://jack.me','jack@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','61.20.168.18',NULL,503,25,'<h1>Jack`s Resume</h1>',0,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(362,'Ada','http://ada.me','ada@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','93.156.246.251',NULL,219,20,'<h1>Ada`s Resume</h1>',1,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(363,'Aaliyah','http://aaliyah.me','aaliyah@163.com','1993-10-21 00:00:00','canada',8,'toronto','123456','8.51.229.228',NULL,319,32,'<h1>Aaliyah`s Resume</h1>',1,'banana','beer',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(364,'Amos','http://amos.me','amos@163.com','1993-10-21 00:00:00','america',6,'washington, dc','123456','196.39.119.222',NULL,220,25,'<h1>Amos`s Resume</h1>',0,'pear','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(365,'Andre','http://andre.me','andre@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','244.43.247.85',NULL,452,54,'<h1>Andre`s Resume</h1>',0,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(366,'Bartholomew','http://bartholomew.me','bartholomew@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','193.200.167.235',NULL,348,20,'<h1>Bartholomew`s Resume</h1>',0,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(367,'Bart','http://bart.me','bart@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','163.109.58.214',NULL,452,39,'<h1>Bart`s Resume</h1>',0,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(368,'Barton','http://barton.me','barton@163.com','1993-10-21 00:00:00','america',4,'washington, dc','123456','131.14.186.121',NULL,215,42,'<h1>Barton`s Resume</h1>',0,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(369,'Bartley','http://bartley.me','bartley@163.com','1993-10-21 00:00:00','england',7,'manchester','123456','47.127.240.51',NULL,338,37,'<h1>Bartley`s Resume</h1>',0,'banana','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(370,'Aditi','http://aditi.me','aditi@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','47.82.13.73',NULL,336,21,'<h1>Aditi`s Resume</h1>',1,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(371,'Adela','http://adela.me','adela@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','69.128.177.245',NULL,472,25,'<h1>Adela`s Resume</h1>',1,'watermelon','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(372,'Adelaide','http://adelaide.me','adelaide@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','184.182.105.232',NULL,280,41,'<h1>Adelaide`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(373,'Adele','http://adele.me','adele@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','81.219.85.23',NULL,498,27,'<h1>Adele`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(374,'Derrick','http://derrick.me','derrick@163.com','1993-10-21 00:00:00','canada',1,'toronto','123456','116.253.153.5',NULL,289,42,'<h1>Derrick`s Resume</h1>',0,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(375,'Devin','http://devin.me','devin@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','74.101.27.87',NULL,481,56,'<h1>Devin`s Resume</h1>',0,'banana','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(376,'Dick','http://dick.me','dick@163.com','1993-10-21 00:00:00','america',1,'washington, dc','123456','97.224.64.157',NULL,221,22,'<h1>Dick`s Resume</h1>',0,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(377,'Adora','http://adora.me','adora@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','84.204.3.167',NULL,323,47,'<h1>Adora`s Resume</h1>',1,'pear','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(378,'Afra','http://afra.me','afra@163.com','1993-10-21 00:00:00','england',3,'manchester','123456','61.56.99.69',NULL,488,27,'<h1>Afra`s Resume</h1>',1,'watermelon','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(379,'Agatha','http://agatha.me','agatha@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','50.42.57.161',NULL,471,28,'<h1>Agatha`s Resume</h1>',1,'apple','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(380,'Agnes','http://agnes.me','agnes@163.com','1993-10-21 00:00:00','america',5,'washington, dc','123456','124.135.50.97',NULL,301,39,'<h1>Agnes`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(381,'Alani','http://alani.me','alani@163.com','1993-10-21 00:00:00','england',6,'manchester','123456','79.104.28.84',NULL,401,23,'<h1>Alani`s Resume</h1>',1,'banana','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(382,'Alberta','http://alberta.me','alberta@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','78.138.202.84',NULL,411,34,'<h1>Alberta`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(383,'Alice','http://alice.me','alice@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','68.89.241.174',NULL,273,29,'<h1>Alice`s Resume</h1>',1,'apple','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(384,'Alma','http://alma.me','alma@163.com','1993-10-21 00:00:00','england',5,'manchester','123456','144.199.53.178',NULL,364,35,'<h1>Alma`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(385,'Althea','http://althea.me','althea@163.com','1993-10-21 00:00:00','canada',3,'toronto','123456','221.62.153.68',NULL,302,52,'<h1>Althea`s Resume</h1>',1,'watermelon','beer',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(386,'Alva','http://alva.me','alva@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','138.232.232.211',NULL,374,56,'<h1>Alva`s Resume</h1>',1,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(387,'Alexandra','http://alexandra.me','alexandra@163.com','1993-10-21 00:00:00','england',2,'manchester','123456','102.131.92.68',NULL,309,34,'<h1>Alexandra`s Resume</h1>',1,'banana','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(388,'Amelia','http://amelia.me','amelia@163.com','1993-10-21 00:00:00','america',6,'washington, dc','123456','65.119.146.117',NULL,306,48,'<h1>Amelia`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(389,'Amity','http://amity.me','amity@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','146.124.182.27',NULL,382,34,'<h1>Amity`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(390,'Anila','http://anila.me','anila@163.com','1993-10-21 00:00:00','england',3,'manchester','123456','100.162.2.30',NULL,221,29,'<h1>Anila`s Resume</h1>',1,'pear','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(391,'Amy','http://amy.me','amy@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','145.124.184.36',NULL,297,43,'<h1>Amy`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(392,'Andrea','http://andrea.me','andrea@163.com','1993-10-21 00:00:00','america',5,'washington, dc','123456','139.75.212.71',NULL,240,49,'<h1>Andrea`s Resume</h1>',1,'watermelon','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(393,'Angela','http://angela.me','angela@163.com','1993-10-21 00:00:00','england',7,'manchester','123456','230.170.160.34',NULL,236,52,'<h1>Angela`s Resume</h1>',1,'banana','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(394,'Ann','http://ann.me','ann@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','201.137.82.253',NULL,223,30,'<h1>Ann`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(395,'Anna','http://anna.me','anna@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','252.247.223.119',NULL,459,56,'<h1>Anna`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(396,'April','http://april.me','april@163.com','1993-10-21 00:00:00','canada',6,'toronto','123456','181.35.143.98',NULL,225,41,'<h1>April`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(397,'Arabela','http://arabela.me','arabela@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','60.5.102.241',NULL,338,22,'<h1>Arabela`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(398,'Arlene','http://arlene.me','arlene@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','130.182.9.8',NULL,376,22,'<h1>Arlene`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(399,'Ashley','http://ashley.me','ashley@163.com','1993-10-21 00:00:00','england',2,'manchester','123456','13.40.161.177',NULL,422,57,'<h1>Ashley`s Resume</h1>',1,'watermelon','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(400,'Astrid','http://astrid.me','astrid@163.com','1993-10-21 00:00:00','america',2,'washington, dc','123456','143.185.242.144',NULL,299,35,'<h1>Astrid`s Resume</h1>',1,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(401,'Atalanta','http://atalanta.me','atalanta@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','250.50.12.162',NULL,332,38,'<h1>Atalanta`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(402,'Athena','http://athena.me','athena@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','9.70.68.127',NULL,349,42,'<h1>Athena`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(403,'Audrey','http://audrey.me','audrey@163.com','1993-10-21 00:00:00','china',5,'guangzhou','123456','175.241.167.114',NULL,498,58,'<h1>Audrey`s Resume</h1>',1,'pear','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(404,'Aurora','http://aurora.me','aurora@163.com','1993-10-21 00:00:00','america',2,'washington, dc','123456','68.253.42.212',NULL,272,49,'<h1>Aurora`s Resume</h1>',1,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(405,'Ava','http://ava.me','ava@163.com','1993-10-21 00:00:00','england',6,'manchester','123456','171.216.59.154',NULL,364,55,'<h1>Ava`s Resume</h1>',1,'banana','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(406,'Barbara','http://barbara.me','barbara@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','84.213.46.100',NULL,286,22,'<h1>Barbara`s Resume</h1>',1,'watermelon','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(407,'Basia','http://basia.me','basia@163.com','1993-10-21 00:00:00','canada',3,'toronto','123456','107.237.96.24',NULL,257,40,'<h1>Basia`s Resume</h1>',1,'apple','beer',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(408,'Bblythe','http://bblythe.me','bblythe@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','87.106.12.254',NULL,347,37,'<h1>Bblythe`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(409,'Beatrice','http://beatrice.me','beatrice@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','214.53.134.252',NULL,288,31,'<h1>Beatrice`s Resume</h1>',1,'apple','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(410,'Belen','http://belen.me','belen@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','95.229.93.33',NULL,254,22,'<h1>Belen`s Resume</h1>',1,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(411,'Bella','http://bella.me','bella@163.com','1993-10-21 00:00:00','england',8,'manchester','123456','141.95.52.228',NULL,399,20,'<h1>Bella`s Resume</h1>',1,'banana','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(412,'Belle','http://belle.me','belle@163.com','1993-10-21 00:00:00','america',3,'washington, dc','123456','220.160.140.218',NULL,265,57,'<h1>Belle`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(413,'Belinda','http://belinda.me','belinda@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','161.149.8.101',NULL,335,23,'<h1>Belinda`s Resume</h1>',1,'watermelon','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(414,'Bernice','http://bernice.me','bernice@163.com','1993-10-21 00:00:00','england',8,'manchester','123456','227.65.156.72',NULL,294,28,'<h1>Bernice`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(415,'Bertha','http://bertha.me','bertha@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','148.15.137.132',NULL,485,36,'<h1>Bertha`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(416,'Beryl','http://beryl.me','beryl@163.com','1993-10-21 00:00:00','america',3,'washington, dc','123456','249.82.171.102',NULL,426,27,'<h1>Beryl`s Resume</h1>',1,'pear','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(417,'Bess','http://bess.me','bess@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','249.175.126.104',NULL,395,33,'<h1>Bess`s Resume</h1>',1,'banana','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(418,'Betsy','http://betsy.me','betsy@163.com','1993-10-21 00:00:00','canada',3,'toronto','123456','144.151.66.134',NULL,394,22,'<h1>Betsy`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(419,'Betty','http://betty.me','betty@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','214.160.156.46',NULL,327,26,'<h1>Betty`s Resume</h1>',1,'apple','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(420,'Beulah','http://beulah.me','beulah@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','14.189.135.108',NULL,327,34,'<h1>Beulah`s Resume</h1>',1,'watermelon','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(421,'Blanche','http://blanche.me','blanche@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','134.90.48.223',NULL,393,43,'<h1>Blanche`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(422,'Bonnie','http://bonnie.me','bonnie@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','206.107.172.28',NULL,210,32,'<h1>Bonnie`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(423,'Breenda','http://breenda.me','breenda@163.com','1993-10-21 00:00:00','england',3,'manchester','123456','135.80.250.245',NULL,356,24,'<h1>Breenda`s Resume</h1>',1,'banana','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(424,'Brianna','http://brianna.me','brianna@163.com','1993-10-21 00:00:00','america',4,'washington, dc','123456','217.98.90.158',NULL,430,50,'<h1>Brianna`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(425,'Bridget','http://bridget.me','bridget@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','8.75.95.250',NULL,343,48,'<h1>Bridget`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(426,'Brook','http://brook.me','brook@163.com','1993-10-21 00:00:00','england',3,'manchester','123456','201.1.163.49',NULL,322,49,'<h1>Brook`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(427,'Calista','http://calista.me','calista@163.com','1993-10-21 00:00:00','china',2,'guangzhou','123456','12.164.19.114',NULL,457,22,'<h1>Calista`s Resume</h1>',1,'watermelon','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(428,'Camille','http://camille.me','camille@163.com','1993-10-21 00:00:00','america',7,'washington, dc','123456','4.185.148.185',NULL,418,31,'<h1>Camille`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(429,'Candice','http://candice.me','candice@163.com','1993-10-21 00:00:00','canada',7,'toronto','123456','225.58.124.190',NULL,252,30,'<h1>Candice`s Resume</h1>',1,'pear','beer',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(430,'Candance','http://candance.me','candance@163.com','1993-10-21 00:00:00','china',5,'guangzhou','123456','70.32.205.166',NULL,312,34,'<h1>Candance`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(431,'Carol','http://carol.me','carol@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','211.49.122.206',NULL,255,58,'<h1>Carol`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(432,'Cara','http://cara.me','cara@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','152.143.3.98',NULL,387,27,'<h1>Cara`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(433,'Caroline','http://caroline.me','caroline@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','223.55.117.162',NULL,485,37,'<h1>Caroline`s Resume</h1>',1,'apple','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(434,'Carlin','http://carlin.me','carlin@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','207.36.69.237',NULL,320,58,'<h1>Carlin`s Resume</h1>',1,'watermelon','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(435,'Charlotte','http://charlotte.me','charlotte@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','214.101.116.25',NULL,290,43,'<h1>Charlotte`s Resume</h1>',1,'banana','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(436,'Benedict','http://benedict.me','benedict@163.com','1993-10-21 00:00:00','america',1,'washington, dc','123456','29.71.11.96',NULL,314,52,'<h1>Benedict`s Resume</h1>',0,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(437,'Cornelius','http://cornelius.me','cornelius@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','191.158.216.96',NULL,304,54,'<h1>Cornelius`s Resume</h1>',0,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(438,'Benjamin','http://benjamin.me','benjamin@163.com','1993-10-21 00:00:00','england',2,'manchester','123456','86.140.187.4',NULL,371,27,'<h1>Benjamin`s Resume</h1>',0,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(439,'Bennett','http://bennett.me','bennett@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','225.93.45.199',NULL,295,23,'<h1>Bennett`s Resume</h1>',0,'apple','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(440,'Alisa','http://alisa.me','alisa@163.com','1993-10-21 00:00:00','canada',1,'toronto','123456','95.134.127.235',NULL,201,47,'<h1>Alisa`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(441,'Alison','http://alison.me','alison@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','28.201.154.168',NULL,453,23,'<h1>Alison`s Resume</h1>',1,'watermelon','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(442,'Alyssa','http://alyssa.me','alyssa@163.com','1993-10-21 00:00:00','china',2,'guangzhou','123456','121.100.136.127',NULL,321,28,'<h1>Alyssa`s Resume</h1>',1,'pear','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(443,'Chaya','http://chaya.me','chaya@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','226.237.254.46',NULL,374,35,'<h1>Chaya`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(444,'Cheryl','http://cheryl.me','cheryl@163.com','1993-10-21 00:00:00','england',6,'manchester','123456','233.6.97.210',NULL,399,53,'<h1>Cheryl`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(445,'Cherry','http://cherry.me','cherry@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','251.112.62.227',NULL,339,49,'<h1>Cherry`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(446,'Cheryl','http://cheryl.me','cheryl@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','185.244.153.33',NULL,277,36,'<h1>Cheryl`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(447,'Chloe','http://chloe.me','chloe@163.com','1993-10-21 00:00:00','england',7,'manchester','123456','217.220.194.53',NULL,218,41,'<h1>Chloe`s Resume</h1>',1,'banana','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(448,'Christine','http://christine.me','christine@163.com','1993-10-21 00:00:00','america',1,'washington, dc','123456','195.50.172.201',NULL,487,29,'<h1>Christine`s Resume</h1>',1,'watermelon','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(449,'Clara','http://clara.me','clara@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','235.60.106.94',NULL,491,53,'<h1>Clara`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(450,'Claire','http://claire.me','claire@163.com','1993-10-21 00:00:00','england',2,'manchester','123456','151.217.122.215',NULL,443,30,'<h1>Claire`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(451,'Clara','http://clara.me','clara@163.com','1993-10-21 00:00:00','canada',2,'toronto','123456','197.86.91.199',NULL,404,49,'<h1>Clara`s Resume</h1>',1,'apple','beer',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(452,'Clementine','http://clementine.me','clementine@163.com','1993-10-21 00:00:00','america',3,'washington, dc','123456','211.201.117.235',NULL,424,59,'<h1>Clementine`s Resume</h1>',1,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(453,'Constance','http://constance.me','constance@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','61.108.100.177',NULL,347,35,'<h1>Constance`s Resume</h1>',1,'banana','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(454,'Cora','http://cora.me','cora@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','73.91.233.130',NULL,262,44,'<h1>Cora`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(455,'Donald','http://donald.me','donald@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','202.110.199.156',NULL,328,50,'<h1>Donald`s Resume</h1>',0,'pear','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(456,'Coral','http://coral.me','coral@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','179.175.81.137',NULL,371,24,'<h1>Coral`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(457,'Cornelia','http://cornelia.me','cornelia@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','184.252.199.238',NULL,221,48,'<h1>Cornelia`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(458,'Crystal','http://crystal.me','crystal@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','83.210.34.52',NULL,316,21,'<h1>Crystal`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(459,'Cynthia','http://cynthia.me','cynthia@163.com','1993-10-21 00:00:00','england',3,'manchester','123456','157.117.116.227',NULL,255,49,'<h1>Cynthia`s Resume</h1>',1,'banana','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(460,'Daisy','http://daisy.me','daisy@163.com','1993-10-21 00:00:00','america',3,'washington, dc','123456','20.185.101.205',NULL,278,21,'<h1>Daisy`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(461,'Dale','http://dale.me','dale@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','208.172.237.156',NULL,499,48,'<h1>Dale`s Resume</h1>',1,'apple','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(462,'Dana','http://dana.me','dana@163.com','1993-10-21 00:00:00','canada',3,'toronto','123456','67.123.160.174',NULL,454,37,'<h1>Dana`s Resume</h1>',1,'watermelon','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(463,'Damla','http://damla.me','damla@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','137.161.137.204',NULL,465,40,'<h1>Damla`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(464,'Daphne','http://daphne.me','daphne@163.com','1993-10-21 00:00:00','america',6,'washington, dc','123456','98.133.116.179',NULL,431,31,'<h1>Daphne`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(465,'Darlene','http://darlene.me','darlene@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','38.163.188.197',NULL,487,31,'<h1>Darlene`s Resume</h1>',1,'banana','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(466,'Dawn','http://dawn.me','dawn@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','164.230.148.48',NULL,471,54,'<h1>Dawn`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(467,'Debby','http://debby.me','debby@163.com','1993-10-21 00:00:00','china',5,'guangzhou','123456','51.109.138.105',NULL,373,59,'<h1>Debby`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(468,'Deborah','http://deborah.me','deborah@163.com','1993-10-21 00:00:00','england',5,'manchester','123456','113.250.144.225',NULL,441,43,'<h1>Deborah`s Resume</h1>',1,'pear','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(469,'Deirdre','http://deirdre.me','deirdre@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','184.242.150.22',NULL,400,56,'<h1>Deirdre`s Resume</h1>',1,'watermelon','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(470,'Delia','http://delia.me','delia@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','169.16.81.100',NULL,441,40,'<h1>Delia`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(471,'Denise','http://denise.me','denise@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','1.214.48.105',NULL,292,20,'<h1>Denise`s Resume</h1>',1,'banana','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(472,'Destiny','http://destiny.me','destiny@163.com','1993-10-21 00:00:00','america',2,'washington, dc','123456','129.74.237.197',NULL,464,53,'<h1>Destiny`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(473,'Diana','http://diana.me','diana@163.com','1993-10-21 00:00:00','canada',5,'toronto','123456','18.9.248.189',NULL,307,22,'<h1>Diana`s Resume</h1>',1,'apple','beer',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(474,'Dinah','http://dinah.me','dinah@163.com','1993-10-21 00:00:00','england',5,'manchester','123456','203.190.87.120',NULL,473,56,'<h1>Dinah`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(475,'Dolores','http://dolores.me','dolores@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','84.57.34.252',NULL,300,29,'<h1>Dolores`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(476,'Dominic','http://dominic.me','dominic@163.com','1993-10-21 00:00:00','america',7,'washington, dc','123456','140.195.48.164',NULL,243,28,'<h1>Dominic`s Resume</h1>',1,'watermelon','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(477,'Donna','http://donna.me','donna@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','164.75.135.195',NULL,386,25,'<h1>Donna`s Resume</h1>',1,'banana','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(478,'Doreen','http://doreen.me','doreen@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','59.221.160.137',NULL,446,42,'<h1>Doreen`s Resume</h1>',1,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(479,'Dora','http://dora.me','dora@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','207.112.194.121',NULL,450,31,'<h1>Dora`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(480,'Doris','http://doris.me','doris@163.com','1993-10-21 00:00:00','england',5,'manchester','123456','26.20.20.40',NULL,371,28,'<h1>Doris`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(481,'Dorothy','http://dorothy.me','dorothy@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','138.62.151.58',NULL,240,44,'<h1>Dorothy`s Resume</h1>',1,'pear','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(482,'Aaron','http://aaron.me','aaron@163.com','1993-10-21 00:00:00','china',2,'guangzhou','123456','93.32.138.84',NULL,313,58,'<h1>Aaron`s Resume</h1>',0,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(483,'Abbott','http://abbott.me','abbott@163.com','1993-10-21 00:00:00','england',6,'manchester','123456','3.17.78.80',NULL,375,53,'<h1>Abbott`s Resume</h1>',0,'watermelon','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(484,'Abel','http://abel.me','abel@163.com','1993-10-21 00:00:00','canada',8,'toronto','123456','169.95.222.57',NULL,411,27,'<h1>Abel`s Resume</h1>',0,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(485,'Abner','http://abner.me','abner@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','131.229.241.8',NULL,396,49,'<h1>Abner`s Resume</h1>',0,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(486,'Abraham','http://abraham.me','abraham@163.com','1993-10-21 00:00:00','england',3,'manchester','123456','82.128.138.52',NULL,311,48,'<h1>Abraham`s Resume</h1>',0,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(487,'Adair','http://adair.me','adair@163.com','1993-10-21 00:00:00','china',2,'guangzhou','123456','102.97.180.99',NULL,496,47,'<h1>Adair`s Resume</h1>',0,'apple','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(488,'Adam','http://adam.me','adam@163.com','1993-10-21 00:00:00','america',6,'washington, dc','123456','210.241.64.105',NULL,213,59,'<h1>Adam`s Resume</h1>',0,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(489,'Addison','http://addison.me','addison@163.com','1993-10-21 00:00:00','england',2,'manchester','123456','79.80.162.60',NULL,459,21,'<h1>Addison`s Resume</h1>',0,'banana','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(490,'Adolph','http://adolph.me','adolph@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','69.162.95.244',NULL,473,49,'<h1>Adolph`s Resume</h1>',0,'watermelon','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(491,'Adonis','http://adonis.me','adonis@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','170.116.71.4',NULL,417,45,'<h1>Adonis`s Resume</h1>',0,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(492,'Annabelle','http://annabelle.me','annabelle@163.com','1993-10-21 00:00:00','england',7,'manchester','123456','62.43.30.18',NULL,293,36,'<h1>Annabelle`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(493,'Antonia','http://antonia.me','antonia@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','254.197.221.3',NULL,284,24,'<h1>Antonia`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(494,'Apphia','http://apphia.me','apphia@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','115.59.202.68',NULL,244,46,'<h1>Apphia`s Resume</h1>',1,'pear','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(495,'Adrian','http://adrian.me','adrian@163.com','1993-10-21 00:00:00','canada',8,'toronto','123456','245.1.32.158',NULL,265,43,'<h1>Adrian`s Resume</h1>',0,'banana','beer',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(496,'Ahern','http://ahern.me','ahern@163.com','1993-10-21 00:00:00','america',3,'washington, dc','123456','185.194.160.216',NULL,349,50,'<h1>Ahern`s Resume</h1>',0,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(497,'Alan','http://alan.me','alan@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','88.50.238.18',NULL,219,41,'<h1>Alan`s Resume</h1>',0,'watermelon','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(498,'Albert','http://albert.me','albert@163.com','1993-10-21 00:00:00','england',7,'manchester','123456','144.155.85.216',NULL,418,29,'<h1>Albert`s Resume</h1>',0,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(499,'Aldrich','http://aldrich.me','aldrich@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','59.156.93.253',NULL,313,53,'<h1>Aldrich`s Resume</h1>',0,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(500,'Alexander','http://alexander.me','alexander@163.com','1993-10-21 00:00:00','america',2,'washington, dc','123456','222.92.48.221',NULL,407,33,'<h1>Alexander`s Resume</h1>',0,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(501,'Alfred','http://alfred.me','alfred@163.com','1993-10-21 00:00:00','england',7,'manchester','123456','195.58.213.128',NULL,251,57,'<h1>Alfred`s Resume</h1>',0,'banana','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(502,'Alger','http://alger.me','alger@163.com','1993-10-21 00:00:00','china',5,'guangzhou','123456','252.113.61.224',NULL,493,36,'<h1>Alger`s Resume</h1>',0,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(503,'Algernon','http://algernon.me','algernon@163.com','1993-10-21 00:00:00','china',1,'guangzhou','123456','169.171.95.218',NULL,367,31,'<h1>Algernon`s Resume</h1>',0,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(504,'Allen','http://allen.me','allen@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','37.42.98.108',NULL,253,38,'<h1>Allen`s Resume</h1>',0,'watermelon','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(505,'Alston','http://alston.me','alston@163.com','1993-10-21 00:00:00','china',7,'guangzhou','123456','244.133.189.33',NULL,276,24,'<h1>Alston`s Resume</h1>',0,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(506,'Alva','http://alva.me','alva@163.com','1993-10-21 00:00:00','canada',8,'toronto','123456','108.184.86.135',NULL,336,20,'<h1>Alva`s Resume</h1>',0,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(507,'Alvin','http://alvin.me','alvin@163.com','1993-10-21 00:00:00','england',5,'manchester','123456','159.135.196.64',NULL,373,48,'<h1>Alvin`s Resume</h1>',0,'pear','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(508,'Alvis','http://alvis.me','alvis@163.com','1993-10-21 00:00:00','america',5,'washington, dc','123456','244.7.68.62',NULL,456,55,'<h1>Alvis`s Resume</h1>',0,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(509,'Basil','http://basil.me','basil@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','104.81.92.216',NULL,466,47,'<h1>Basil`s Resume</h1>',0,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(510,'Beacher','http://beacher.me','beacher@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','39.54.155.104',NULL,215,50,'<h1>Beacher`s Resume</h1>',0,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(511,'Beverly','http://beverly.me','beverly@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','51.201.84.72',NULL,221,33,'<h1>Beverly`s Resume</h1>',1,'watermelon','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(512,'Beau','http://beau.me','beau@163.com','1993-10-21 00:00:00','america',4,'washington, dc','123456','108.70.25.167',NULL,323,43,'<h1>Beau`s Resume</h1>',0,'apple','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(513,'Beck','http://beck.me','beck@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','252.248.229.144',NULL,200,48,'<h1>Beck`s Resume</h1>',0,'banana','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(514,'Ben','http://ben.me','ben@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','34.246.110.66',NULL,465,44,'<h1>Ben`s Resume</h1>',0,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(515,'Amanda','http://amanda.me','amanda@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','252.43.223.221',NULL,474,41,'<h1>Amanda`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(516,'Benson','http://benson.me','benson@163.com','1993-10-21 00:00:00','england',5,'manchester','123456','180.238.138.232',NULL,245,55,'<h1>Benson`s Resume</h1>',0,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(517,'Berg','http://berg.me','berg@163.com','1993-10-21 00:00:00','canada',3,'toronto','123456','234.218.132.6',NULL,322,59,'<h1>Berg`s Resume</h1>',0,'apple','beer',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(518,'Berger','http://berger.me','berger@163.com','1993-10-21 00:00:00','china',5,'guangzhou','123456','145.196.35.94',NULL,398,25,'<h1>Berger`s Resume</h1>',0,'watermelon','juice',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(519,'Cliff','http://cliff.me','cliff@163.com','1993-10-21 00:00:00','england',7,'manchester','123456','112.24.36.108',NULL,483,49,'<h1>Cliff`s Resume</h1>',0,'banana','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(520,'Clifford','http://clifford.me','clifford@163.com','1993-10-21 00:00:00','america',5,'washington, dc','123456','175.41.188.54',NULL,437,43,'<h1>Clifford`s Resume</h1>',0,'pear','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(521,'Clyde','http://clyde.me','clyde@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','216.153.116.121',NULL,441,40,'<h1>Clyde`s Resume</h1>',0,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(522,'Caitlin','http://caitlin.me','caitlin@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','1.152.244.2',NULL,214,56,'<h1>Caitlin`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(523,'Colbert','http://colbert.me','colbert@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','39.190.70.31',NULL,251,48,'<h1>Colbert`s Resume</h1>',0,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(524,'Colby','http://colby.me','colby@163.com','1993-10-21 00:00:00','america',6,'washington, dc','123456','201.144.120.165',NULL,293,31,'<h1>Colby`s Resume</h1>',0,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(525,'Colin','http://colin.me','colin@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','212.53.138.20',NULL,329,51,'<h1>Colin`s Resume</h1>',0,'watermelon','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(526,'Conrad','http://conrad.me','conrad@163.com','1993-10-21 00:00:00','china',2,'guangzhou','123456','196.156.190.227',NULL,208,23,'<h1>Conrad`s Resume</h1>',0,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(527,'Catherine','http://catherine.me','catherine@163.com','1993-10-21 00:00:00','china',6,'guangzhou','123456','54.101.85.120',NULL,371,50,'<h1>Catherine`s Resume</h1>',1,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(528,'Cathy','http://cathy.me','cathy@163.com','1993-10-21 00:00:00','canada',7,'toronto','123456','93.102.231.82',NULL,200,54,'<h1>Cathy`s Resume</h1>',1,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(529,'Cecilia','http://cecilia.me','cecilia@163.com','1993-10-21 00:00:00','china',2,'guangzhou','123456','226.120.178.17',NULL,412,51,'<h1>Cecilia`s Resume</h1>',1,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(530,'Celeste','http://celeste.me','celeste@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','62.4.87.168',NULL,382,46,'<h1>Celeste`s Resume</h1>',1,'apple','juice',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(531,'Corey','http://corey.me','corey@163.com','1993-10-21 00:00:00','england',8,'manchester','123456','70.99.28.100',NULL,326,46,'<h1>Corey`s Resume</h1>',0,'banana','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(532,'Cornell','http://cornell.me','cornell@163.com','1993-10-21 00:00:00','america',7,'washington, dc','123456','161.248.246.233',NULL,299,38,'<h1>Cornell`s Resume</h1>',0,'watermelon','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(533,'Craig','http://craig.me','craig@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','168.142.207.96',NULL,244,53,'<h1>Craig`s Resume</h1>',0,'pear','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(534,'Curitis','http://curitis.me','curitis@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','115.33.73.9',NULL,212,23,'<h1>Curitis`s Resume</h1>',0,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(535,'Cyril','http://cyril.me','cyril@163.com','1993-10-21 00:00:00','china',4,'guangzhou','123456','80.117.92.106',NULL,260,25,'<h1>Cyril`s Resume</h1>',0,'apple','water',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(536,'Dominic','http://dominic.me','dominic@163.com','1993-10-21 00:00:00','america',2,'washington, dc','123456','1.197.214.225',NULL,224,24,'<h1>Dominic`s Resume</h1>',0,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(537,'Don','http://don.me','don@163.com','1993-10-21 00:00:00','england',4,'manchester','123456','226.202.74.18',NULL,207,33,'<h1>Don`s Resume</h1>',0,'banana','water',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(538,'Donahue','http://donahue.me','donahue@163.com','1993-10-21 00:00:00','china',8,'guangzhou','123456','125.58.169.163',NULL,456,42,'<h1>Donahue`s Resume</h1>',0,'apple','juice',0,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(539,'Douglas','http://douglas.me','douglas@163.com','1993-10-21 00:00:00','canada',8,'toronto','123456','52.27.231.56',NULL,413,48,'<h1>Douglas`s Resume</h1>',0,'watermelon','beer',1,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(540,'Drew','http://drew.me','drew@163.com','1993-10-21 00:00:00','england',1,'manchester','123456','96.56.245.36',NULL,424,45,'<h1>Drew`s Resume</h1>',0,'banana','red bull',3,'2020-03-09 15:24:00','2020-03-09 15:24:00'),\n\t(541,'Duke','http://duke.me','duke@163.com','1993-10-21 00:00:00','china',3,'guangzhou','123456','212.188.45.171',NULL,411,50,'<h1>Duke`s Resume</h1>',0,'apple','water',2,'2020-03-09 15:24:00','2020-03-09 15:24:00');\n\n/*!40000 ALTER TABLE `users` ENABLE KEYS */;\nUNLOCK TABLES;\n\n\n\n/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n"
  },
  {
    "path": "tests/data/admin_ms.sql",
    "content": "/*\n Navicat Premium Data Transfer\n\n Source Server         : mssql\n Source Server Type    : SQL Server\n Source Server Version : 14003281\n Source Host           : localhost\n Source Database       : goadmin\n Source Schema         : dbo\n\n Target Server Type    : SQL Server\n Target Server Version : 14003281\n File Encoding         : utf-8\n\n Date: 04/08/2020 01:11:22 AM\n*/\n\n-- ----------------------------\n--  Table structure for goadmin_menu\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_menu]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_menu]\nGO\nCREATE TABLE [dbo].[goadmin_menu] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[parent_id] int NOT NULL DEFAULT ((0)),\n\t[type] tinyint NOT NULL DEFAULT ((0)),\n\t[order] int NOT NULL DEFAULT ('0'),\n\t[title] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[icon] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[uri] varchar(3000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL DEFAULT '',\n\t[header] varchar(150) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT NULL,\n\t[uuid] varchar(150) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT NULL,\n\t[plugin_name] varchar(150) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL DEFAULT '',\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_menu\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_menu] ON\nGO\nINSERT INTO [dbo].[goadmin_menu] ([id], [parent_id], [type], [order], [title], [icon], [uri], [header], [created_at], [updated_at]) VALUES ('1', '0', '1', '2', 'Admin', 'fa-tasks', '', null, '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_menu] ([id], [parent_id], [type], [order], [title], [icon], [uri], [header], [created_at], [updated_at]) VALUES ('2', '1', '1', '2', 'Users', 'fa-users', '/info/manager', null, '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_menu] ([id], [parent_id], [type], [order], [title], [icon], [uri], [header], [created_at], [updated_at]) VALUES ('3', '0', '1', '3', 'test2 menu', 'fa-angellist', '/example/test', '', '2019-09-10 00:00:00.000', '2020-03-15 12:24:47.000');\nINSERT INTO [dbo].[goadmin_menu] ([id], [parent_id], [type], [order], [title], [icon], [uri], [header], [created_at], [updated_at]) VALUES ('4', '1', '1', '4', 'Permission', 'fa-ban', '/info/permission', null, '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_menu] ([id], [parent_id], [type], [order], [title], [icon], [uri], [header], [created_at], [updated_at]) VALUES ('5', '1', '1', '5', 'Menu', 'fa-bars', '/menu', null, '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_menu] ([id], [parent_id], [type], [order], [title], [icon], [uri], [header], [created_at], [updated_at]) VALUES ('6', '1', '1', '6', 'Operation log', 'fa-history', '/info/op', null, '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_menu] ([id], [parent_id], [type], [order], [title], [icon], [uri], [header], [created_at], [updated_at]) VALUES ('7', '0', '1', '1', 'Dashboard', 'fa-bar-chart', '/', null, '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_menu] ([id], [parent_id], [type], [order], [title], [icon], [uri], [header], [created_at], [updated_at]) VALUES ('8', '0', '1', '7', 'User', 'fa-users', '/info/user', '', '2020-03-15 03:09:14.810', '2020-03-15 03:09:14.810');\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_menu] OFF\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_operation_log\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_operation_log]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_operation_log]\nGO\nCREATE TABLE [dbo].[goadmin_operation_log] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[user_id] int NOT NULL,\n\t[path] varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[method] varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[ip] varchar(15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[input] text COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nTEXTIMAGE_ON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_operation_log\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_operation_log] ON\nGO\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('1', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 03:09:12.760', '2020-03-15 03:09:12.760');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('2', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.177', '2020-03-15 03:09:13.177');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('3', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.210', '2020-03-15 03:09:13.210');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('4', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"5f810995-beca-4c0f-8802-b327bef75743\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:09:13.253', '2020-03-15 03:09:13.253');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('5', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.283', '2020-03-15 03:09:13.283');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('6', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.317', '2020-03-15 03:09:13.317');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('7', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"11114d9c-3bf2-4670-8638-09ee291d0233\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:09:13.363', '2020-03-15 03:09:13.363');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('8', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.400', '2020-03-15 03:09:13.400');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('9', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"9ae81396-6250-4e53-85f6-a459471f1bbf\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:09:13.450', '2020-03-15 03:09:13.450');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('10', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 03:09:13.487', '2020-03-15 03:09:13.487');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('11', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.547', '2020-03-15 03:09:13.547');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('12', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.590', '2020-03-15 03:09:13.590');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('13', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"c3061c30-e384-4938-b5f7-6f07a11d04ac\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 03:09:13.660', '2020-03-15 03:09:13.660');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('14', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.690', '2020-03-15 03:09:13.690');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('15', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.733', '2020-03-15 03:09:13.733');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('16', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"1e69d7a2-6e01-42f6-95a2-a5fba51e29a8\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 03:09:13.800', '2020-03-15 03:09:13.800');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('17', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:09:13.833', '2020-03-15 03:09:13.833');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('18', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"79d55f58-03f2-4ad3-940d-b88174d3783e\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:09:13.893', '2020-03-15 03:09:13.893');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('19', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 03:09:13.937', '2020-03-15 03:09:13.937');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('20', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 03:09:14.010', '2020-03-15 03:09:14.010');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('21', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:09:14.040', '2020-03-15 03:09:14.040');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('22', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:14.070', '2020-03-15 03:09:14.070');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('23', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:14.130', '2020-03-15 03:09:14.130');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('24', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"44274eaa-9b15-43f1-9573-ec5c322f8e5f\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:09:14.280', '2020-03-15 03:09:14.280');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('25', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 03:09:14.317', '2020-03-15 03:09:14.317');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('26', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"71687e2d-cad3-48b5-be5a-d90b65a2891a\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 03:09:14.487', '2020-03-15 03:09:14.487');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('27', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 03:09:14.780', '2020-03-15 03:09:14.780');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('28', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"e1c920bc-9131-4486-87c6-a332120c9efe\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:09:14.863', '2020-03-15 03:09:14.863');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('29', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:09:14.910', '2020-03-15 03:09:14.910');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('30', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:09:14.967', '2020-03-15 03:09:14.967');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('31', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"d7eebcbe-a6c3-45ea-a5d0-d3af5bebe37f\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:09:15.047', '2020-03-15 03:09:15.047');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('32', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"d7eebcbe-a6c3-45ea-a5d0-d3af5bebe37f\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 03:09:15.103', '2020-03-15 03:09:15.103');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('33', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 03:09:15.137', '2020-03-15 03:09:15.137');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('34', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.217', '2020-03-15 03:09:15.217');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('35', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.247', '2020-03-15 03:09:15.247');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('36', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.280', '2020-03-15 03:09:15.280');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('37', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.320', '2020-03-15 03:09:15.320');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('38', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.353', '2020-03-15 03:09:15.353');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('39', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.400', '2020-03-15 03:09:15.400');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('40', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 03:09:15.443', '2020-03-15 03:09:15.443');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('41', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.483', '2020-03-15 03:09:15.483');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('42', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.520', '2020-03-15 03:09:15.520');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('43', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 03:09:15.550', '2020-03-15 03:09:15.550');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('44', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 03:14:36.897', '2020-03-15 03:14:36.897');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('45', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.297', '2020-03-15 03:14:37.297');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('46', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.330', '2020-03-15 03:14:37.330');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('47', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"d66311db-d66a-403b-9154-60710429a1cb\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:14:37.363', '2020-03-15 03:14:37.363');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('48', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.400', '2020-03-15 03:14:37.400');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('49', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.430', '2020-03-15 03:14:37.430');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('50', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"a95d2d24-fb3e-4020-b1a2-e7e50a94ff19\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:14:37.483', '2020-03-15 03:14:37.483');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('51', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.517', '2020-03-15 03:14:37.517');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('52', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"5c3ebaad-2459-43d5-9536-bb8b69d5ded1\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:14:37.563', '2020-03-15 03:14:37.563');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('53', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 03:14:37.593', '2020-03-15 03:14:37.593');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('54', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.640', '2020-03-15 03:14:37.640');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('55', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.700', '2020-03-15 03:14:37.700');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('56', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"c8c64eb9-e8c7-4f38-be00-7c817e3ed14e\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 03:14:37.760', '2020-03-15 03:14:37.760');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('57', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.790', '2020-03-15 03:14:37.790');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('58', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.830', '2020-03-15 03:14:37.830');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('59', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"3ffbad00-9670-4262-b637-f88026b52bfc\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 03:14:37.873', '2020-03-15 03:14:37.873');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('60', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:14:37.913', '2020-03-15 03:14:37.913');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('61', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"3ba7d233-1bc2-4257-95a6-544eedf18981\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:14:37.940', '2020-03-15 03:14:37.940');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('62', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 03:14:37.980', '2020-03-15 03:14:37.980');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('63', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 03:14:38.030', '2020-03-15 03:14:38.030');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('64', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:14:38.063', '2020-03-15 03:14:38.063');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('65', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:38.097', '2020-03-15 03:14:38.097');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('66', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:38.150', '2020-03-15 03:14:38.150');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('67', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"8c0004a3-e902-46ad-a80a-ccb01a5b90c7\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:14:38.283', '2020-03-15 03:14:38.283');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('68', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 03:14:38.327', '2020-03-15 03:14:38.327');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('69', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"3c7ae974-1e74-48fd-a70d-6f3a502d4767\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 03:14:38.460', '2020-03-15 03:14:38.460');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('70', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 03:14:38.730', '2020-03-15 03:14:38.730');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('71', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"c8b82f1c-45c3-4a9e-b92d-e9055133af08\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:14:38.803', '2020-03-15 03:14:38.803');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('72', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:14:38.853', '2020-03-15 03:14:38.853');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('73', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:14:38.910', '2020-03-15 03:14:38.910');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('74', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"3d6ae122-32dc-40d5-9930-84aff50aa97f\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:14:38.990', '2020-03-15 03:14:38.990');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('75', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"3d6ae122-32dc-40d5-9930-84aff50aa97f\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 03:14:39.043', '2020-03-15 03:14:39.043');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('76', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 03:14:39.083', '2020-03-15 03:14:39.083');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('77', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.133', '2020-03-15 03:14:39.133');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('78', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.163', '2020-03-15 03:14:39.163');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('79', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.193', '2020-03-15 03:14:39.193');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('80', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.233', '2020-03-15 03:14:39.233');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('81', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.280', '2020-03-15 03:14:39.280');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('82', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.310', '2020-03-15 03:14:39.310');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('83', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 03:14:39.360', '2020-03-15 03:14:39.360');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('84', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.403', '2020-03-15 03:14:39.403');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('85', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.443', '2020-03-15 03:14:39.443');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('86', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 03:14:39.487', '2020-03-15 03:14:39.487');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('87', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 03:39:21.340', '2020-03-15 03:39:21.340');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('88', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 03:39:21.750', '2020-03-15 03:39:21.750');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('89', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:39:21.787', '2020-03-15 03:39:21.787');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('90', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"8bee7649-6223-4fe6-a505-ea375cd0b49c\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:39:21.820', '2020-03-15 03:39:21.820');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('91', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:21.850', '2020-03-15 03:39:21.850');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('92', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:21.887', '2020-03-15 03:39:21.887');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('93', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"087d600a-86a5-4fe2-9ff3-fd4e6b0176c4\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:39:21.947', '2020-03-15 03:39:21.947');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('94', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:39:21.987', '2020-03-15 03:39:21.987');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('95', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"8c2c3b2a-108e-42c7-8de8-55dd101d44e3\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:39:22.020', '2020-03-15 03:39:22.020');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('96', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 03:39:22.053', '2020-03-15 03:39:22.053');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('97', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.100', '2020-03-15 03:39:22.100');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('98', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.130', '2020-03-15 03:39:22.130');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('99', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"2485611e-bd7e-4ae2-acc9-4ce72a601c44\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 03:39:22.167', '2020-03-15 03:39:22.167');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('100', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.207', '2020-03-15 03:39:22.207');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('101', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.473', '2020-03-15 03:39:22.473');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('102', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"42723e0f-6198-4a96-b13b-83e8406b9ba7\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 03:39:22.537', '2020-03-15 03:39:22.537');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('103', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.577', '2020-03-15 03:39:22.577');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('104', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"1687c542-94e9-45b3-b362-16aeb6d92169\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:39:22.617', '2020-03-15 03:39:22.617');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('105', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 03:39:22.647', '2020-03-15 03:39:22.647');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('106', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.690', '2020-03-15 03:39:22.690');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('107', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:39:22.713', '2020-03-15 03:39:22.713');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('108', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.740', '2020-03-15 03:39:22.740');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('109', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.780', '2020-03-15 03:39:22.780');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('110', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"f37d07a2-cff6-42dc-8004-8bd174da141d\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:39:22.927', '2020-03-15 03:39:22.927');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('111', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 03:39:22.970', '2020-03-15 03:39:22.970');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('112', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"04a35b51-52e5-4dfb-8a9f-fa2211709d3e\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 03:39:23.093', '2020-03-15 03:39:23.093');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('113', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.387', '2020-03-15 03:39:23.387');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('114', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"ab730b2e-7c8b-4c55-b0bb-f5ba0cae4e5b\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:39:23.457', '2020-03-15 03:39:23.457');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('115', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.517', '2020-03-15 03:39:23.517');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('116', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.573', '2020-03-15 03:39:23.573');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('117', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"402e0b89-7179-472f-af66-424e02f090b5\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:39:23.663', '2020-03-15 03:39:23.663');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('118', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"402e0b89-7179-472f-af66-424e02f090b5\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 03:39:23.723', '2020-03-15 03:39:23.723');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('119', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 03:39:23.757', '2020-03-15 03:39:23.757');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('120', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.813', '2020-03-15 03:39:23.813');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('121', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.847', '2020-03-15 03:39:23.847');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('122', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.877', '2020-03-15 03:39:23.877');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('123', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.910', '2020-03-15 03:39:23.910');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('124', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.947', '2020-03-15 03:39:23.947');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('125', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 03:39:23.970', '2020-03-15 03:39:23.970');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('126', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 03:39:24.010', '2020-03-15 03:39:24.010');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('127', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:24.050', '2020-03-15 03:39:24.050');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('128', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:39:24.093', '2020-03-15 03:39:24.093');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('129', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 03:39:24.137', '2020-03-15 03:39:24.137');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('130', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 03:49:24.813', '2020-03-15 03:49:24.813');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('131', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.190', '2020-03-15 03:49:25.190');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('132', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.233', '2020-03-15 03:49:25.233');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('133', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"c3a60aba-926d-424a-8cbd-a999668753fe\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:49:25.277', '2020-03-15 03:49:25.277');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('134', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.310', '2020-03-15 03:49:25.310');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('135', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.357', '2020-03-15 03:49:25.357');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('136', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"68d8bb95-b37a-4f35-ba19-efea7b75a2f2\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:49:25.410', '2020-03-15 03:49:25.410');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('137', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.443', '2020-03-15 03:49:25.443');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('138', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"ff95fcec-ad5a-4604-ba83-b51cb9b18a89\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:49:25.480', '2020-03-15 03:49:25.480');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('139', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 03:49:25.507', '2020-03-15 03:49:25.507');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('140', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.527', '2020-03-15 03:49:25.527');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('141', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.573', '2020-03-15 03:49:25.573');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('142', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"fc0ec315-3254-4145-bd90-fa54dc115d6f\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 03:49:25.613', '2020-03-15 03:49:25.613');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('143', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.643', '2020-03-15 03:49:25.643');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('144', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.680', '2020-03-15 03:49:25.680');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('145', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"d539d703-d4eb-4551-83b3-4b41049e884c\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 03:49:25.723', '2020-03-15 03:49:25.723');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('146', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.763', '2020-03-15 03:49:25.763');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('147', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"a62ae5e8-66c8-44c2-9bc4-be92c75f255d\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:49:25.800', '2020-03-15 03:49:25.800');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('148', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 03:49:25.830', '2020-03-15 03:49:25.830');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('149', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.860', '2020-03-15 03:49:25.860');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('150', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:49:25.903', '2020-03-15 03:49:25.903');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('151', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.937', '2020-03-15 03:49:25.937');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('152', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:25.983', '2020-03-15 03:49:25.983');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('153', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"a8b6b05c-f420-4c33-852f-d673599b47a4\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:49:26.143', '2020-03-15 03:49:26.143');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('154', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 03:49:26.190', '2020-03-15 03:49:26.190');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('155', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"b8a8e809-9672-462e-937a-3fd9a516a35b\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 03:49:26.293', '2020-03-15 03:49:26.293');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('156', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 03:49:26.600', '2020-03-15 03:49:26.600');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('157', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"8441b1f4-d6de-4c34-a65c-6bb9969e2974\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:49:26.673', '2020-03-15 03:49:26.673');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('158', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:49:26.727', '2020-03-15 03:49:26.727');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('159', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:49:26.773', '2020-03-15 03:49:26.773');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('160', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"a981fd88-2911-4b32-ab74-990842814dac\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:49:26.847', '2020-03-15 03:49:26.847');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('161', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"a981fd88-2911-4b32-ab74-990842814dac\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 03:49:26.893', '2020-03-15 03:49:26.893');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('162', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 03:49:26.927', '2020-03-15 03:49:26.927');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('163', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 03:49:26.957', '2020-03-15 03:49:26.957');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('164', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 03:49:26.997', '2020-03-15 03:49:26.997');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('165', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:27.027', '2020-03-15 03:49:27.027');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('166', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:27.063', '2020-03-15 03:49:27.063');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('167', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 03:49:27.103', '2020-03-15 03:49:27.103');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('168', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 03:49:27.133', '2020-03-15 03:49:27.133');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('169', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 03:49:27.177', '2020-03-15 03:49:27.177');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('170', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:27.220', '2020-03-15 03:49:27.220');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('171', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:49:27.260', '2020-03-15 03:49:27.260');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('172', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 03:49:27.293', '2020-03-15 03:49:27.293');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('173', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.027', '2020-03-15 03:55:28.027');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('174', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.430', '2020-03-15 03:55:28.430');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('175', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.477', '2020-03-15 03:55:28.477');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('176', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"418ee4ee-3a05-49a2-b666-830c719fd776\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:55:28.513', '2020-03-15 03:55:28.513');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('177', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.550', '2020-03-15 03:55:28.550');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('178', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.580', '2020-03-15 03:55:28.580');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('179', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"515bd79c-e610-4f1e-a600-b46ff6d902af\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:55:28.637', '2020-03-15 03:55:28.637');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('180', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.677', '2020-03-15 03:55:28.677');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('181', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"9738e849-c22c-4c38-a1b8-1d7d1741efe2\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:55:28.713', '2020-03-15 03:55:28.713');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('182', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 03:55:28.743', '2020-03-15 03:55:28.743');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('183', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.763', '2020-03-15 03:55:28.763');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('184', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.813', '2020-03-15 03:55:28.813');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('185', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"e6a37010-b56a-4f8f-9d88-396059440744\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 03:55:28.857', '2020-03-15 03:55:28.857');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('186', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.890', '2020-03-15 03:55:28.890');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('187', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:28.947', '2020-03-15 03:55:28.947');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('188', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"6560686e-ac53-499b-8a8c-9813787446f5\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 03:55:28.993', '2020-03-15 03:55:28.993');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('189', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:55:29.037', '2020-03-15 03:55:29.037');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('190', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"1844756f-0a44-4fbf-8019-cd3f97a6db70\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:55:29.080', '2020-03-15 03:55:29.080');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('191', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 03:55:29.117', '2020-03-15 03:55:29.117');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('192', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 03:55:29.147', '2020-03-15 03:55:29.147');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('193', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:55:29.190', '2020-03-15 03:55:29.190');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('194', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:29.227', '2020-03-15 03:55:29.227');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('195', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:29.290', '2020-03-15 03:55:29.290');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('196', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"4e465c13-ee6f-4b95-9187-f46a231caae9\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:55:29.463', '2020-03-15 03:55:29.463');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('197', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 03:55:29.517', '2020-03-15 03:55:29.517');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('198', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"b0b0d014-f418-4281-82fd-da8e5be8f43d\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 03:55:29.623', '2020-03-15 03:55:29.623');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('199', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 03:55:29.943', '2020-03-15 03:55:29.943');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('200', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"63980a38-e643-46b1-aefa-e49da95de6e0\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:55:30.057', '2020-03-15 03:55:30.057');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('201', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:55:31.580', '2020-03-15 03:55:31.580');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('202', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:55:31.623', '2020-03-15 03:55:31.623');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('203', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"e95cab98-2517-44ed-b59c-4b65b8d2837d\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:55:31.730', '2020-03-15 03:55:31.730');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('204', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"e95cab98-2517-44ed-b59c-4b65b8d2837d\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 03:55:31.770', '2020-03-15 03:55:31.770');\nGO\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('205', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 03:55:31.807', '2020-03-15 03:55:31.807');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('206', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 03:55:31.830', '2020-03-15 03:55:31.830');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('207', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 03:55:31.880', '2020-03-15 03:55:31.880');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('208', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:31.913', '2020-03-15 03:55:31.913');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('209', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:31.947', '2020-03-15 03:55:31.947');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('210', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 03:55:31.980', '2020-03-15 03:55:31.980');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('211', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 03:55:32.010', '2020-03-15 03:55:32.010');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('212', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 03:55:32.053', '2020-03-15 03:55:32.053');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('213', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:32.097', '2020-03-15 03:55:32.097');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('214', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:55:32.143', '2020-03-15 03:55:32.143');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('215', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 03:55:32.180', '2020-03-15 03:55:32.180');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('216', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.097', '2020-03-15 03:57:01.097');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('217', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.477', '2020-03-15 03:57:01.477');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('218', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.530', '2020-03-15 03:57:01.530');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('219', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"51757bf6-b3c4-46f4-bf9f-6e91f347dc2d\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:57:01.563', '2020-03-15 03:57:01.563');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('220', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.593', '2020-03-15 03:57:01.593');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('221', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.640', '2020-03-15 03:57:01.640');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('222', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"9762d55b-c444-405e-b0b6-5feb851c0e40\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 03:57:01.690', '2020-03-15 03:57:01.690');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('223', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.730', '2020-03-15 03:57:01.730');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('224', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"64218a2f-eb41-4ca3-99d9-c925d9d11700\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:57:01.763', '2020-03-15 03:57:01.763');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('225', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 03:57:01.787', '2020-03-15 03:57:01.787');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('226', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.810', '2020-03-15 03:57:01.810');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('227', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.847', '2020-03-15 03:57:01.847');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('228', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"cfa68542-545d-4cd4-bc1c-fef5a4005b0d\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 03:57:01.880', '2020-03-15 03:57:01.880');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('229', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.907', '2020-03-15 03:57:01.907');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('230', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:01.950', '2020-03-15 03:57:01.950');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('231', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"7ef4b394-e721-4012-a24a-9296233d0053\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 03:57:01.987', '2020-03-15 03:57:01.987');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('232', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 03:57:02.030', '2020-03-15 03:57:02.030');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('233', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"6a6318cd-89be-4a37-8e59-fb63a30c0d03\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 03:57:02.067', '2020-03-15 03:57:02.067');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('234', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 03:57:02.107', '2020-03-15 03:57:02.107');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('235', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 03:57:02.130', '2020-03-15 03:57:02.130');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('236', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:57:02.173', '2020-03-15 03:57:02.173');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('237', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:02.207', '2020-03-15 03:57:02.207');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('238', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:02.253', '2020-03-15 03:57:02.253');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('239', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"aa9b074b-c297-4aff-9a66-179b5020078c\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 03:57:02.407', '2020-03-15 03:57:02.407');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('240', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 03:57:02.453', '2020-03-15 03:57:02.453');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('241', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"062dc246-ad4b-44b8-899f-dfc3815eefd3\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 03:57:02.553', '2020-03-15 03:57:02.553');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('242', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 03:57:02.850', '2020-03-15 03:57:02.850');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('243', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"168e4192-270a-4ac4-947d-1a7d73785474\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:57:02.923', '2020-03-15 03:57:02.923');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('244', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:57:02.973', '2020-03-15 03:57:02.973');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('245', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.027', '2020-03-15 03:57:03.027');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('246', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"6697607f-8220-41c5-a5da-ba1c6a432195\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 03:57:03.093', '2020-03-15 03:57:03.093');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('247', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"6697607f-8220-41c5-a5da-ba1c6a432195\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 03:57:03.143', '2020-03-15 03:57:03.143');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('248', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 03:57:03.170', '2020-03-15 03:57:03.170');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('249', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.200', '2020-03-15 03:57:03.200');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('250', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.237', '2020-03-15 03:57:03.237');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('251', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.267', '2020-03-15 03:57:03.267');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('252', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.300', '2020-03-15 03:57:03.300');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('253', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.330', '2020-03-15 03:57:03.330');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('254', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.350', '2020-03-15 03:57:03.350');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('255', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 03:57:03.380', '2020-03-15 03:57:03.380');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('256', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.413', '2020-03-15 03:57:03.413');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('257', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.447', '2020-03-15 03:57:03.447');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('258', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 03:57:03.480', '2020-03-15 03:57:03.480');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('259', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 04:08:41.627', '2020-03-15 04:08:41.627');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('260', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 04:08:41.993', '2020-03-15 04:08:41.993');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('261', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.047', '2020-03-15 04:08:42.047');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('262', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"95001d14-ab8f-4d1e-a16e-78e85ce1830e\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:08:42.083', '2020-03-15 04:08:42.083');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('263', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.120', '2020-03-15 04:08:42.120');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('264', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.160', '2020-03-15 04:08:42.160');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('265', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"c247b48f-fd2b-412f-adb0-c7ca03a96331\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:08:42.210', '2020-03-15 04:08:42.210');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('266', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.250', '2020-03-15 04:08:42.250');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('267', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"25f2de82-68e1-4810-830f-a8cf0eb8f5a0\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:08:42.290', '2020-03-15 04:08:42.290');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('268', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 04:08:42.320', '2020-03-15 04:08:42.320');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('269', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.340', '2020-03-15 04:08:42.340');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('270', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.393', '2020-03-15 04:08:42.393');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('271', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"064639b2-d4eb-4c7e-9082-35580a9b65e2\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 04:08:42.433', '2020-03-15 04:08:42.433');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('272', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.463', '2020-03-15 04:08:42.463');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('273', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.503', '2020-03-15 04:08:42.503');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('274', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"27b2084a-c9fd-4b76-b178-f298d1f42be6\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 04:08:42.547', '2020-03-15 04:08:42.547');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('275', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.593', '2020-03-15 04:08:42.593');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('276', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"6f88027a-3bba-4e1d-8b03-bf5ff269e0c4\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:08:42.630', '2020-03-15 04:08:42.630');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('277', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 04:08:42.660', '2020-03-15 04:08:42.660');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('278', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.690', '2020-03-15 04:08:42.690');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('279', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:08:42.730', '2020-03-15 04:08:42.730');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('280', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.763', '2020-03-15 04:08:42.763');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('281', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:42.817', '2020-03-15 04:08:42.817');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('282', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"79b123f3-ea8b-465a-af6d-493bc5e91a4e\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:08:42.967', '2020-03-15 04:08:42.967');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('283', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.010', '2020-03-15 04:08:43.010');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('284', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"ec317734-967b-401f-ab45-48fc59bc9276\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 04:08:43.117', '2020-03-15 04:08:43.117');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('285', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.403', '2020-03-15 04:08:43.403');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('286', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"e0284537-2c85-4562-a383-43d3d61dcfb6\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:08:43.477', '2020-03-15 04:08:43.477');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('287', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.520', '2020-03-15 04:08:43.520');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('288', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.563', '2020-03-15 04:08:43.563');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('289', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"fdb68af2-d8c9-42b3-9c98-d2134fd67afd\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:08:43.627', '2020-03-15 04:08:43.627');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('290', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"fdb68af2-d8c9-42b3-9c98-d2134fd67afd\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 04:08:43.673', '2020-03-15 04:08:43.673');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('291', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 04:08:43.703', '2020-03-15 04:08:43.703');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('292', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.723', '2020-03-15 04:08:43.723');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('293', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.767', '2020-03-15 04:08:43.767');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('294', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.790', '2020-03-15 04:08:43.790');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('295', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.820', '2020-03-15 04:08:43.820');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('296', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.853', '2020-03-15 04:08:43.853');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('297', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.877', '2020-03-15 04:08:43.877');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('298', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 04:08:43.913', '2020-03-15 04:08:43.913');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('299', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.957', '2020-03-15 04:08:43.957');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('300', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:08:43.993', '2020-03-15 04:08:43.993');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('301', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 04:08:44.033', '2020-03-15 04:08:44.033');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('302', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 04:09:20.960', '2020-03-15 04:09:20.960');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('303', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.343', '2020-03-15 04:09:21.343');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('304', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.390', '2020-03-15 04:09:21.390');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('305', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"8343b2e9-05a6-4989-869b-76a5f4bf4c89\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:09:21.430', '2020-03-15 04:09:21.430');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('306', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.460', '2020-03-15 04:09:21.460');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('307', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.500', '2020-03-15 04:09:21.500');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('308', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"1bebaf0e-a0f3-4f27-a18f-fe12ff7ec333\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:09:21.547', '2020-03-15 04:09:21.547');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('309', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.587', '2020-03-15 04:09:21.587');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('310', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"903a8026-fb39-468b-9748-c97e8a691f54\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:09:21.627', '2020-03-15 04:09:21.627');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('311', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 04:09:21.660', '2020-03-15 04:09:21.660');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('312', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.683', '2020-03-15 04:09:21.683');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('313', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.737', '2020-03-15 04:09:21.737');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('314', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"52a1496c-d043-4e91-904f-7da25a0fd35d\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 04:09:21.780', '2020-03-15 04:09:21.780');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('315', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.827', '2020-03-15 04:09:21.827');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('316', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.877', '2020-03-15 04:09:21.877');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('317', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"87f737d4-7e7d-4c4c-9ac3-e95c4e1a27b7\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 04:09:21.923', '2020-03-15 04:09:21.923');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('318', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:09:21.973', '2020-03-15 04:09:21.973');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('319', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"df905cd3-b59a-4a50-8db9-802b599e7512\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:09:22.013', '2020-03-15 04:09:22.013');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('320', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 04:09:22.043', '2020-03-15 04:09:22.043');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('321', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 04:09:22.073', '2020-03-15 04:09:22.073');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('322', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:09:22.127', '2020-03-15 04:09:22.127');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('323', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:22.160', '2020-03-15 04:09:22.160');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('324', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:22.217', '2020-03-15 04:09:22.217');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('325', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"759907db-027c-45df-a564-9e3206f60722\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:09:22.483', '2020-03-15 04:09:22.483');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('326', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 04:09:22.523', '2020-03-15 04:09:22.523');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('327', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"44c84e40-d665-4fd4-9f50-c0984580b709\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 04:09:22.633', '2020-03-15 04:09:22.633');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('328', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 04:09:22.937', '2020-03-15 04:09:22.937');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('329', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"2048c150-95ab-47ac-a253-ec05cab832bf\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:09:23.007', '2020-03-15 04:09:23.007');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('330', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.043', '2020-03-15 04:09:23.043');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('331', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.097', '2020-03-15 04:09:23.097');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('332', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"37d32f19-3984-415d-8286-79b6e5e1c957\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:09:23.177', '2020-03-15 04:09:23.177');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('333', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"37d32f19-3984-415d-8286-79b6e5e1c957\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 04:09:23.223', '2020-03-15 04:09:23.223');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('334', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 04:09:23.253', '2020-03-15 04:09:23.253');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('335', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.283', '2020-03-15 04:09:23.283');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('336', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.327', '2020-03-15 04:09:23.327');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('337', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.360', '2020-03-15 04:09:23.360');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('338', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.393', '2020-03-15 04:09:23.393');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('339', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.430', '2020-03-15 04:09:23.430');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('340', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.457', '2020-03-15 04:09:23.457');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('341', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 04:09:23.513', '2020-03-15 04:09:23.513');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('342', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.553', '2020-03-15 04:09:23.553');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('343', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.607', '2020-03-15 04:09:23.607');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('344', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 04:09:23.660', '2020-03-15 04:09:23.660');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('345', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 04:14:39.593', '2020-03-15 04:14:39.593');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('346', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.010', '2020-03-15 04:14:40.010');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('347', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.057', '2020-03-15 04:14:40.057');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('348', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"a381041b-f969-4c25-adea-fad2bc5d674e\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:14:40.103', '2020-03-15 04:14:40.103');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('349', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.137', '2020-03-15 04:14:40.137');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('350', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.180', '2020-03-15 04:14:40.180');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('351', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"04fd9af1-0977-4547-805c-6d27a4fd07f1\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:14:40.230', '2020-03-15 04:14:40.230');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('352', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.273', '2020-03-15 04:14:40.273');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('353', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"0178e9bd-1e8d-44d9-9fa4-c134cf84d0f1\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:14:40.310', '2020-03-15 04:14:40.310');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('354', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 04:14:40.340', '2020-03-15 04:14:40.340');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('355', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.383', '2020-03-15 04:14:40.383');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('356', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.427', '2020-03-15 04:14:40.427');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('357', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"9c213d9d-8965-4cc0-840e-ac6e0491f10c\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 04:14:40.470', '2020-03-15 04:14:40.470');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('358', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.500', '2020-03-15 04:14:40.500');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('359', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.537', '2020-03-15 04:14:40.537');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('360', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"596cb505-caf2-4aba-8a0d-e8bfd624c59f\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 04:14:40.583', '2020-03-15 04:14:40.583');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('361', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.627', '2020-03-15 04:14:40.627');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('362', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"f9e11d14-9521-492d-a835-0c4f3179bb85\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:14:40.670', '2020-03-15 04:14:40.670');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('363', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 04:14:40.710', '2020-03-15 04:14:40.710');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('364', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.763', '2020-03-15 04:14:40.763');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('365', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:14:40.797', '2020-03-15 04:14:40.797');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('366', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.827', '2020-03-15 04:14:40.827');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('367', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:40.880', '2020-03-15 04:14:40.880');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('368', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"ccd05fd4-5bfe-498d-8e14-4fc08df1f25b\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:14:41.040', '2020-03-15 04:14:41.040');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('369', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.080', '2020-03-15 04:14:41.080');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('370', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"d98d5b45-45a9-410c-97e0-018c22dd2071\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 04:14:41.207', '2020-03-15 04:14:41.207');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('371', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.480', '2020-03-15 04:14:41.480');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('372', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"67b1a2a6-bf25-435e-9d21-104aa17ff0a9\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:14:41.547', '2020-03-15 04:14:41.547');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('373', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.600', '2020-03-15 04:14:41.600');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('374', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.650', '2020-03-15 04:14:41.650');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('375', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"208aab5e-8c58-4934-8737-a711caffeed3\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:14:41.713', '2020-03-15 04:14:41.713');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('376', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"208aab5e-8c58-4934-8737-a711caffeed3\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 04:14:41.770', '2020-03-15 04:14:41.770');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('377', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 04:14:41.793', '2020-03-15 04:14:41.793');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('378', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.847', '2020-03-15 04:14:41.847');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('379', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.880', '2020-03-15 04:14:41.880');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('380', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.903', '2020-03-15 04:14:41.903');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('381', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.940', '2020-03-15 04:14:41.940');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('382', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 04:14:41.973', '2020-03-15 04:14:41.973');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('383', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 04:14:42.000', '2020-03-15 04:14:42.000');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('384', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 04:14:42.037', '2020-03-15 04:14:42.037');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('385', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:42.057', '2020-03-15 04:14:42.057');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('386', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:14:42.090', '2020-03-15 04:14:42.090');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('387', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 04:14:42.127', '2020-03-15 04:14:42.127');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('388', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 04:19:24.570', '2020-03-15 04:19:24.570');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('389', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 04:19:24.953', '2020-03-15 04:19:24.953');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('390', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.000', '2020-03-15 04:19:25.000');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('391', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"44aaca60-ddd9-4b32-b81d-1f8af1b01c98\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:19:25.033', '2020-03-15 04:19:25.033');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('392', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.060', '2020-03-15 04:19:25.060');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('393', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.093', '2020-03-15 04:19:25.093');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('394', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"124fad17-284e-4c29-87cd-020626b0a275\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:19:25.140', '2020-03-15 04:19:25.140');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('395', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.177', '2020-03-15 04:19:25.177');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('396', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"7f9624e7-86cf-4517-997e-57f9c176682e\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:19:25.220', '2020-03-15 04:19:25.220');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('397', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 04:19:25.250', '2020-03-15 04:19:25.250');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('398', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.280', '2020-03-15 04:19:25.280');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('399', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.330', '2020-03-15 04:19:25.330');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('400', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"1f3ddf1a-931c-4889-b3da-6b6c82806bc0\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 04:19:25.377', '2020-03-15 04:19:25.377');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('401', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.407', '2020-03-15 04:19:25.407');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('402', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.443', '2020-03-15 04:19:25.443');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('403', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"41b65d45-fefa-4587-8fc9-3901b8aa98ce\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 04:19:25.487', '2020-03-15 04:19:25.487');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('404', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.533', '2020-03-15 04:19:25.533');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('405', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"6087c942-2c6d-44fb-ac65-0b8c72eb62ab\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:19:25.570', '2020-03-15 04:19:25.570');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('406', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 04:19:25.610', '2020-03-15 04:19:25.610');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('407', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.640', '2020-03-15 04:19:25.640');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('408', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:19:25.687', '2020-03-15 04:19:25.687');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('409', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.720', '2020-03-15 04:19:25.720');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('410', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.777', '2020-03-15 04:19:25.777');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('411', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"d6b57ee4-01fb-49e8-a154-bd29999b5933\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:19:25.907', '2020-03-15 04:19:25.907');\nGO\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('412', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 04:19:25.987', '2020-03-15 04:19:25.987');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('413', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"26cdd12f-ea5a-4f13-83a1-2498a04025c3\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 04:19:26.100', '2020-03-15 04:19:26.100');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('414', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.410', '2020-03-15 04:19:26.410');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('415', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"d0b6c9d7-81dc-46e7-8f5c-274ffec50de5\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:19:26.483', '2020-03-15 04:19:26.483');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('416', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.540', '2020-03-15 04:19:26.540');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('417', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.590', '2020-03-15 04:19:26.590');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('418', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"d260d214-fcde-4f1e-b076-0abaf3ab1ba5\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:19:26.670', '2020-03-15 04:19:26.670');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('419', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"d260d214-fcde-4f1e-b076-0abaf3ab1ba5\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 04:19:26.717', '2020-03-15 04:19:26.717');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('420', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 04:19:26.747', '2020-03-15 04:19:26.747');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('421', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.777', '2020-03-15 04:19:26.777');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('422', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.817', '2020-03-15 04:19:26.817');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('423', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.850', '2020-03-15 04:19:26.850');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('424', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.883', '2020-03-15 04:19:26.883');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('425', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.920', '2020-03-15 04:19:26.920');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('426', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 04:19:26.950', '2020-03-15 04:19:26.950');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('427', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 04:19:26.990', '2020-03-15 04:19:26.990');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('428', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:27.027', '2020-03-15 04:19:27.027');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('429', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:19:27.060', '2020-03-15 04:19:27.060');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('430', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 04:19:27.100', '2020-03-15 04:19:27.100');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('431', '1', '/admin/logout', 'GET', '127.0.0.1', '', '2020-03-15 04:24:45.410', '2020-03-15 04:24:45.410');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('432', '1', '/admin/info/permission', 'GET', '127.0.0.1', '', '2020-03-15 04:24:45.827', '2020-03-15 04:24:45.827');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('433', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:24:45.860', '2020-03-15 04:24:45.860');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('434', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"092217f5-5f35-40a2-93aa-e9a46a739cec\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:24:45.893', '2020-03-15 04:24:45.893');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('435', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:45.930', '2020-03-15 04:24:45.930');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('436', '1', '/admin/info/permission/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:45.967', '2020-03-15 04:24:45.967');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('437', '1', '/admin/edit/permission', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"26457988-35b7-4cfe-b1cc-6505498993c8\"],\"http_method[]\":[\"GET\",\"POST\"],\"http_path\":[\"/\\n/admin/info/op\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"slug\":[\"tester\"]}', '2020-03-15 04:24:46.017', '2020-03-15 04:24:46.017');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('438', '1', '/admin/info/permission/new', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.057', '2020-03-15 04:24:46.057');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('439', '1', '/admin/new/permission', 'POST', '127.0.0.1', '{\"__go_admin_post_type\":[\"1\"],\"__go_admin_previous_\":[\"/admin/info/permission?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"1cbe9682-8185-4a6a-ab5e-27c7986e00a4\"],\"http_method[]\":[\"GET\"],\"http_path\":[\"/\\n/admin/info/op\"],\"name\":[\"tester2\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:24:46.093', '2020-03-15 04:24:46.093');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('440', '1', '/admin/delete/permission', 'POST', '127.0.0.1', '{\"id\":[\"4\"]}', '2020-03-15 04:24:46.123', '2020-03-15 04:24:46.123');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('441', '1', '/admin/info/roles', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.170', '2020-03-15 04:24:46.170');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('442', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.210', '2020-03-15 04:24:46.210');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('443', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"e0809bf8-b0ea-4296-8343-188294f0d04d\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester\"]}', '2020-03-15 04:24:46.250', '2020-03-15 04:24:46.250');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('444', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.277', '2020-03-15 04:24:46.277');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('445', '1', '/admin/info/roles/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.320', '2020-03-15 04:24:46.320');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('446', '1', '/admin/edit/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"d2bf536e-07cf-44ac-ad21-702a7a89bb6b\"],\"id\":[\"3\"],\"name\":[\"tester\"],\"permission_id[]\":[\"3\",\"2\"],\"slug\":[\"tester\"]}', '2020-03-15 04:24:46.360', '2020-03-15 04:24:46.360');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('447', '1', '/admin/info/roles/new', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.400', '2020-03-15 04:24:46.400');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('448', '1', '/admin/new/roles', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/roles?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"e47c72f5-88ba-420c-959e-da5701b25ef1\"],\"name\":[\"tester2\"],\"permission_id[]\":[\"3\"],\"slug\":[\"tester2\"]}', '2020-03-15 04:24:46.440', '2020-03-15 04:24:46.440');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('449', '1', '/admin/delete/roles', 'POST', '127.0.0.1', '{\"id\":[\"3\"]}', '2020-03-15 04:24:46.477', '2020-03-15 04:24:46.477');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('450', '1', '/admin/info/manager', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.527', '2020-03-15 04:24:46.527');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('451', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"123\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:24:46.560', '2020-03-15 04:24:46.560');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('452', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.590', '2020-03-15 04:24:46.590');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('453', '1', '/admin/info/manager/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.643', '2020-03-15 04:24:46.643');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('454', '1', '/admin/edit/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"a14b2cb1-8403-4e9e-91e7-642eb43de615\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"admin1\"],\"password\":[\"admin\"],\"password_again\":[\"admin\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"admin\"]}', '2020-03-15 04:24:46.797', '2020-03-15 04:24:46.797');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('455', '1', '/admin/info/manager/new', 'GET', '127.0.0.1', '', '2020-03-15 04:24:46.840', '2020-03-15 04:24:46.840');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('456', '1', '/admin/new/manager', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/info/manager?__page=1\\u0026__pageSize=10\\u0026__sort=id\\u0026__sort_type=desc\"],\"__go_admin_t_\":[\"bf003301-4b93-4d11-b5e1-117608b5b1a1\"],\"avatar__delete_flag\":[\"0\"],\"id\":[\"1\"],\"name\":[\"tester\"],\"password\":[\"tester\"],\"password_again\":[\"tester\"],\"permission_id[]\":[\"1\"],\"role_id[]\":[\"1\"],\"username\":[\"tester\"]}', '2020-03-15 04:24:46.963', '2020-03-15 04:24:46.963');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('457', '1', '/admin/menu', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.243', '2020-03-15 04:24:47.243');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('458', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"83df8f18-88d5-4d47-8b8b-4db42e1f76f1\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:24:47.313', '2020-03-15 04:24:47.313');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('459', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.370', '2020-03-15 04:24:47.370');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('460', '1', '/admin/menu/edit/show', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.420', '2020-03-15 04:24:47.420');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('461', '1', '/admin/menu/edit', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"916fc225-9d2f-4079-aec2-e53c0effaa41\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"id\":[\"3\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test\"]}', '2020-03-15 04:24:47.493', '2020-03-15 04:24:47.493');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('462', '1', '/admin/menu/new', 'POST', '127.0.0.1', '{\"__go_admin_previous_\":[\"/admin/menu\"],\"__go_admin_t_\":[\"916fc225-9d2f-4079-aec2-e53c0effaa41\"],\"header\":[\"\"],\"icon\":[\"fa-angellist\"],\"parent_id\":[\"\"],\"roles[]\":[\"1\"],\"title\":[\"test2 menu\"],\"uri\":[\"/example/test2\"]}', '2020-03-15 04:24:47.547', '2020-03-15 04:24:47.547');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('463', '1', '/admin/menu/delete', 'POST', '127.0.0.1', '{}', '2020-03-15 04:24:47.573', '2020-03-15 04:24:47.573');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('464', '1', '/admin/info/op', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.633', '2020-03-15 04:24:47.633');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('465', '1', '/admin/info/external', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.670', '2020-03-15 04:24:47.670');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('466', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.700', '2020-03-15 04:24:47.700');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('467', '1', '/admin/info/external/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.740', '2020-03-15 04:24:47.740');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('468', '1', '/admin/info/external/new', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.777', '2020-03-15 04:24:47.777');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('469', '1', '/admin/info/user', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.837', '2020-03-15 04:24:47.837');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('470', '1', '/admin/export/user', 'POST', '127.0.0.1', '{\"id\":[\"1\"]}', '2020-03-15 04:24:47.870', '2020-03-15 04:24:47.870');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('471', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.903', '2020-03-15 04:24:47.903');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('472', '1', '/admin/info/user/edit', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.940', '2020-03-15 04:24:47.940');\nINSERT INTO [dbo].[goadmin_operation_log] ([id], [user_id], [path], [method], [ip], [input], [created_at], [updated_at]) VALUES ('473', '1', '/admin/info/user/new', 'GET', '127.0.0.1', '', '2020-03-15 04:24:47.980', '2020-03-15 04:24:47.980');\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_operation_log] OFF\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_permissions\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_permissions]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_permissions]\nGO\nCREATE TABLE [dbo].[goadmin_permissions] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[name] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[slug] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[http_method] varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT NULL,\n\t[http_path] text COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nTEXTIMAGE_ON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_permissions\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_permissions] ON\nGO\nINSERT INTO [dbo].[goadmin_permissions] ([id], [name], [slug], [http_method], [http_path], [created_at], [updated_at]) VALUES ('1', 'All permission', '*', '', '*', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_permissions] ([id], [name], [slug], [http_method], [http_path], [created_at], [updated_at]) VALUES ('2', 'Dashboard', 'dashboard', 'GET,PUT,POST,DELETE', '/', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_permissions] OFF\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_role_menu\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_role_menu]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_role_menu]\nGO\nCREATE TABLE [dbo].[goadmin_role_menu] (\n\t[role_id] int NOT NULL,\n\t[menu_id] int NOT NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_role_menu\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nINSERT INTO [dbo].[goadmin_role_menu] VALUES ('1', '1', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_role_menu] VALUES ('1', '7', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_role_menu] VALUES ('1', '8', '2019-09-11 10:20:55.000', '2019-09-11 10:20:55.000');\nINSERT INTO [dbo].[goadmin_role_menu] VALUES ('2', '7', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_role_menu] VALUES ('2', '8', '2019-09-11 10:20:55.000', '2019-09-11 10:20:55.000');\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_role_permissions\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_role_permissions]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_role_permissions]\nGO\nCREATE TABLE [dbo].[goadmin_role_permissions] (\n\t[role_id] int NOT NULL,\n\t[permission_id] int NOT NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_role_permissions\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nINSERT INTO [dbo].[goadmin_role_permissions] VALUES ('1', '1', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_role_permissions] VALUES ('1', '2', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_role_permissions] VALUES ('2', '2', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_role_users\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_role_users]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_role_users]\nGO\nCREATE TABLE [dbo].[goadmin_role_users] (\n\t[role_id] int NOT NULL,\n\t[user_id] int NOT NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_role_users\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nINSERT INTO [dbo].[goadmin_role_users] VALUES ('1', '1', '2020-03-15 04:24:46.757', '2020-03-15 04:24:46.757');\nINSERT INTO [dbo].[goadmin_role_users] VALUES ('2', '2', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_roles\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_roles]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_roles]\nGO\nCREATE TABLE [dbo].[goadmin_roles] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[name] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[slug] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_roles\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_roles] ON\nGO\nINSERT INTO [dbo].[goadmin_roles] ([id], [name], [slug], [created_at], [updated_at]) VALUES ('1', 'Administrator', 'administrator', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nINSERT INTO [dbo].[goadmin_roles] ([id], [name], [slug], [created_at], [updated_at]) VALUES ('2', 'Operator', 'operator', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_roles] OFF\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_session\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_session]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_session]\nGO\nCREATE TABLE [dbo].[goadmin_session] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[sid] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT '',\n\t[values] varchar(3000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT '',\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_session\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_session] ON\nGO\nINSERT INTO [dbo].[goadmin_session] ([id], [sid], [values], [created_at], [updated_at]) VALUES ('43', '5ada7ffd-1025-4bfe-802a-43b7e6e79582', '{\"user_id\":1}', '2020-03-15 04:24:45.750', '2020-03-15 04:24:45.750');\nINSERT INTO [dbo].[goadmin_session] ([id], [sid], [values], [created_at], [updated_at]) VALUES ('44', 'a01d8b11-083e-4075-8287-1bfb1865fe70', '{\"user_id\":3}', '2020-03-15 04:24:47.190', '2020-03-15 04:24:47.190');\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_session] OFF\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_site\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_site]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_site]\nGO\nCREATE TABLE [dbo].[goadmin_site] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[key] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[value] text COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[state] tinyint NULL DEFAULT ((0)),\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nTEXTIMAGE_ON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_user_permissions\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_user_permissions]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_user_permissions]\nGO\nCREATE TABLE [dbo].[goadmin_user_permissions] (\n\t[user_id] int NOT NULL,\n\t[permission_id] int NOT NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_user_permissions\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nINSERT INTO [dbo].[goadmin_user_permissions] VALUES ('1', '1', '2020-03-15 04:24:46.763', '2020-03-15 04:24:46.763');\nINSERT INTO [dbo].[goadmin_user_permissions] VALUES ('2', '2', '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for goadmin_users\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[goadmin_users]') AND type IN ('U'))\n\tDROP TABLE [dbo].[goadmin_users]\nGO\nCREATE TABLE [dbo].[goadmin_users] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[username] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[password] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL DEFAULT '',\n\t[name] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,\n\t[avatar] varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT NULL,\n\t[remember_token] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of goadmin_users\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_users] ON\nGO\nINSERT INTO [dbo].[goadmin_users] ([id], [username], [password], [name], [avatar], [remember_token], [created_at], [updated_at]) VALUES ('1', 'admin', '$2a$10$9Bb3g7FUC/dDhYISUWegBOHy0498EuV50rVCgxkvAbpjavrKwhjvm', 'admin1', '', 'tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh', '2019-09-10 00:00:00.000', '2020-03-15 12:24:46.000');\nINSERT INTO [dbo].[goadmin_users] ([id], [username], [password], [name], [avatar], [remember_token], [created_at], [updated_at]) VALUES ('2', 'operator', '$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.', 'Operator', '', null, '2019-09-10 00:00:00.000', '2019-09-10 00:00:00.000');\nGO\nSET IDENTITY_INSERT [dbo].[goadmin_users] OFF\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for user_like_books\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[user_like_books]') AND type IN ('U'))\n\tDROP TABLE [dbo].[user_like_books]\nGO\nCREATE TABLE [dbo].[user_like_books] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[user_id] int NULL,\n\t[name] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[created_at] datetime NULL DEFAULT (getdate()),\n\t[updated_at] datetime NULL DEFAULT (getdate())\n)\nON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of user_like_books\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nSET IDENTITY_INSERT [dbo].[user_like_books] ON\nGO\nINSERT INTO [dbo].[user_like_books] ([id], [user_id], [name], [created_at], [updated_at]) VALUES ('1', '1', 'Robinson Crusoe', '2020-03-15 09:57:49.000', '2020-03-15 09:57:51.000');\nGO\nSET IDENTITY_INSERT [dbo].[user_like_books] OFF\nGO\nCOMMIT\nGO\n\n-- ----------------------------\n--  Table structure for users\n-- ----------------------------\nIF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID('[dbo].[users]') AND type IN ('U'))\n\tDROP TABLE [dbo].[users]\nGO\nCREATE TABLE [dbo].[users] (\n\t[id] int IDENTITY(1,1) NOT NULL,\n\t[name] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[homepage] varchar(3000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[email] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[birthday] timestamp NULL,\n\t[country] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[member_id] smallint NULL DEFAULT ((0)),\n\t[city] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[password] varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[ip] varchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[certificate] varchar(300) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[money] int NULL,\n\t[age] int NULL DEFAULT ((0)),\n\t[resume] text COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[gender] smallint NULL DEFAULT ((0)),\n\t[fruit] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[drink] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,\n\t[experience] smallint NULL DEFAULT ((0)),\n\t[created_at] datetime NULL,\n\t[updated_at] datetime NULL\n)\nON [PRIMARY]\nTEXTIMAGE_ON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Records of users\n-- ----------------------------\nBEGIN TRANSACTION\nGO\nSET IDENTITY_INSERT [dbo].[users] ON\nGO\nINSERT INTO [dbo].[users] ([id], [name], [homepage], [email], [birthday], [country], [member_id], [city], [password], [ip], [certificate], [money], [age], [resume], [gender], [fruit], [drink], [experience], [created_at], [updated_at]) VALUES ('1', 'Jack', 'http://jack.me', 'jack@163.com', DEFAULT, 'china', '6', 'guangzhou', '123456', '127.0.0.1', null, '503', '25', '<h1>Jack`s Resume</h1>', '0', 'apple', 'water', '0', '2020-03-15 09:54:39.000', '2020-03-15 09:54:42.000');\nGO\nSET IDENTITY_INSERT [dbo].[users] OFF\nGO\nCOMMIT\nGO\n\n\n-- ----------------------------\n--  Primary key structure for table goadmin_menu\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_menu] ADD\n\tCONSTRAINT [PK__goadmin___3213E83FF5EBF8CC] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_operation_log\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_operation_log] ADD\n\tCONSTRAINT [PK__goadmin___3213E83F6C7E1A25] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_permissions\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_permissions] ADD\n\tCONSTRAINT [PK__goadmin___3213E83F6A86BC1A] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_role_menu\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_role_menu] ADD\n\tCONSTRAINT [PK__goadmin___A2C36A610BBE2A9C] PRIMARY KEY CLUSTERED ([role_id],[menu_id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_role_permissions\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_role_permissions] ADD\n\tCONSTRAINT [PK__goadmin___C85A54636259324C] PRIMARY KEY CLUSTERED ([role_id],[permission_id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_role_users\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_role_users] ADD\n\tCONSTRAINT [PK__goadmin___9D9286BC2FC99BF2] PRIMARY KEY CLUSTERED ([role_id],[user_id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_roles\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_roles] ADD\n\tCONSTRAINT [PK__goadmin___3213E83F7D29D84E] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Uniques structure for table goadmin_roles\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_roles] ADD\n\tCONSTRAINT [UQ__goadmin___72E12F1BF4C046D9] UNIQUE NONCLUSTERED ([name] ASC) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_session\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_session] ADD\n\tCONSTRAINT [PK__goadmin___3213E83FD9B9AF30] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_site\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_site] ADD\n\tCONSTRAINT [PK__goadmin___3213E83FBC0B9B22] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_user_permissions\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_user_permissions] ADD\n\tCONSTRAINT [PK__goadmin___07ED06A0046D7D01] PRIMARY KEY CLUSTERED ([user_id],[permission_id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table goadmin_users\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_users] ADD\n\tCONSTRAINT [PK__goadmin___3213E83F354C3AA1] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Uniques structure for table goadmin_users\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_users] ADD\n\tCONSTRAINT [UQ__goadmin___F3DBC572BFCF4D97] UNIQUE NONCLUSTERED ([username] ASC) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [PRIMARY]\nGO\n\n-- ----------------------------\n--  Primary key structure for table user_like_books\n-- ----------------------------\nALTER TABLE [dbo].[user_like_books] ADD\n\tCONSTRAINT [PK__user_lik__3213E83F151C3FE8] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Primary key structure for table users\n-- ----------------------------\nALTER TABLE [dbo].[users] ADD\n\tCONSTRAINT [PK__users__3213E83F2F479EFF] PRIMARY KEY CLUSTERED ([id]) \n\tWITH (PAD_INDEX = OFF,\n\t\tIGNORE_DUP_KEY = OFF,\n\t\tALLOW_ROW_LOCKS = ON,\n\t\tALLOW_PAGE_LOCKS = ON)\n\tON [default]\nGO\n\n-- ----------------------------\n--  Options for table goadmin_menu\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_menu] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[goadmin_menu]', RESEED, 9)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_operation_log\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_operation_log] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[goadmin_operation_log]', RESEED, 473)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_permissions\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_permissions] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[goadmin_permissions]', RESEED, 2)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_role_menu\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_role_menu] SET (LOCK_ESCALATION = TABLE)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_role_permissions\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_role_permissions] SET (LOCK_ESCALATION = TABLE)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_role_users\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_role_users] SET (LOCK_ESCALATION = TABLE)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_roles\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_roles] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[goadmin_roles]', RESEED, 2)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_session\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_session] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[goadmin_session]', RESEED, 44)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_site\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_site] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[goadmin_site]', RESEED, 1)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_user_permissions\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_user_permissions] SET (LOCK_ESCALATION = TABLE)\nGO\n\n-- ----------------------------\n--  Options for table goadmin_users\n-- ----------------------------\nALTER TABLE [dbo].[goadmin_users] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[goadmin_users]', RESEED, 3)\nGO\n\n-- ----------------------------\n--  Options for table user_like_books\n-- ----------------------------\nALTER TABLE [dbo].[user_like_books] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[user_like_books]', RESEED, 1)\nGO\n\n-- ----------------------------\n--  Options for table users\n-- ----------------------------\nALTER TABLE [dbo].[users] SET (LOCK_ESCALATION = TABLE)\nGO\nDBCC CHECKIDENT ('[dbo].[users]', RESEED, 1)\nGO\n\n"
  },
  {
    "path": "tests/data/admin_pg.sql",
    "content": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 9.5.14\n-- Dumped by pg_dump version 10.5\n\nSET statement_timeout = 0;\nSET lock_timeout = 0;\nSET idle_in_transaction_session_timeout = 0;\nSET client_encoding = 'EUC_CN';\nSET standard_conforming_strings = on;\nSELECT pg_catalog.set_config('search_path', '', false);\nSET check_function_bodies = false;\nSET client_min_messages = warning;\nSET row_security = off;\n\n--\n-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: \n--\n\nCREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;\n\n\n--\n-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: \n--\n\nCOMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';\n\n\n--\n-- Name: goadmin_menu_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_menu_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_menu_myid_seq OWNER TO postgres;\n\nSET default_tablespace = '';\n\nSET default_with_oids = false;\n\n--\n-- Name: goadmin_menu; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_menu (\n    id integer DEFAULT nextval('public.goadmin_menu_myid_seq'::regclass) NOT NULL,\n    parent_id integer DEFAULT 0 NOT NULL,\n    type integer DEFAULT 0,\n    \"order\" integer DEFAULT 0 NOT NULL,\n    title character varying(50) NOT NULL,\n    header character varying(100),\n    icon character varying(50) NOT NULL,\n    uri character varying(50) NOT NULL,\n    uuid character varying(100),\n    plugin_name character varying(150) NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_menu OWNER TO postgres;\n\n--\n-- Name: goadmin_operation_log_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_operation_log_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_operation_log_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_operation_log; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_operation_log (\n    id integer DEFAULT nextval('public.goadmin_operation_log_myid_seq'::regclass) NOT NULL,\n    user_id integer NOT NULL,\n    path character varying(255) NOT NULL,\n    method character varying(10) NOT NULL,\n    ip character varying(15) NOT NULL,\n    input text NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_operation_log OWNER TO postgres;\n\n--\n-- Name: goadmin_permissions_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_permissions_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_permissions_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_permissions; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_permissions (\n    id integer DEFAULT nextval('public.goadmin_permissions_myid_seq'::regclass) NOT NULL,\n    name character varying(50) NOT NULL,\n    slug character varying(50) NOT NULL,\n    http_method character varying(255),\n    http_path text NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_permissions OWNER TO postgres;\n\n--\n-- Name: goadmin_site_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_site_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_site_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_site; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_site (\n    id integer DEFAULT nextval('public.goadmin_site_myid_seq'::regclass) NOT NULL,\n    key character varying(100) NOT NULL,\n    value text NOT NULL,\n    type integer DEFAULT 0,\n    description character varying(3000),\n    state integer DEFAULT 0,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_site OWNER TO postgres;\n\n--\n-- Name: goadmin_role_menu; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_role_menu (\n    role_id integer NOT NULL,\n    menu_id integer NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_role_menu OWNER TO postgres;\n\n--\n-- Name: goadmin_role_permissions; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_role_permissions (\n    role_id integer NOT NULL,\n    permission_id integer NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_role_permissions OWNER TO postgres;\n\n--\n-- Name: goadmin_role_users; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_role_users (\n    role_id integer NOT NULL,\n    user_id integer NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_role_users OWNER TO postgres;\n\n--\n-- Name: goadmin_roles_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_roles_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_roles_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_roles; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_roles (\n    id integer DEFAULT nextval('public.goadmin_roles_myid_seq'::regclass) NOT NULL,\n    name character varying NOT NULL,\n    slug character varying NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_roles OWNER TO postgres;\n\n--\n-- Name: goadmin_session_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_session_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_session_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_session; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_session (\n    id integer DEFAULT nextval('public.goadmin_session_myid_seq'::regclass) NOT NULL,\n    sid character varying(50) NOT NULL,\n    \"values\" character varying(3000) NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_session OWNER TO postgres;\n\n--\n-- Name: goadmin_user_permissions; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_user_permissions (\n    user_id integer NOT NULL,\n    permission_id integer NOT NULL,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_user_permissions OWNER TO postgres;\n\n--\n-- Name: goadmin_users_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres\n--\n\nCREATE SEQUENCE public.goadmin_users_myid_seq\n    START WITH 1\n    INCREMENT BY 1\n    NO MINVALUE\n    MAXVALUE 99999999\n    CACHE 1;\n\n\nALTER TABLE public.goadmin_users_myid_seq OWNER TO postgres;\n\n--\n-- Name: goadmin_users; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.goadmin_users (\n    id integer DEFAULT nextval('public.goadmin_users_myid_seq'::regclass) NOT NULL,\n    username character varying(190) NOT NULL,\n    password character varying(80) NOT NULL,\n    name character varying(255) NOT NULL,\n    avatar character varying(255),\n    remember_token character varying(100),\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.goadmin_users OWNER TO postgres;\n\n--\n-- Name: user_like_books; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.user_like_books (\n    id integer,\n    user_id integer,\n    name character varying,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now()\n);\n\n\nALTER TABLE public.user_like_books OWNER TO postgres;\n\n--\n-- Name: users; Type: TABLE; Schema: public; Owner: postgres\n--\n\nCREATE TABLE public.users (\n    id integer NOT NULL,\n    name character varying(100),\n    homepage character varying(3000),\n    email character varying(100),\n    birthday timestamp with time zone,\n    country character varying(50),\n    city character varying(50),\n    password character varying(100),\n    ip character varying(20),\n    certificate character varying(300),\n    money integer,\n    resume text,\n    gender smallint,\n    fruit character varying(200),\n    drink character varying(200),\n    experience smallint,\n    created_at timestamp without time zone DEFAULT now(),\n    updated_at timestamp without time zone DEFAULT now(),\n    member_id integer DEFAULT 0\n);\n\n\nALTER TABLE public.users OWNER TO postgres;\n\n--\n-- Data for Name: goadmin_menu; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_menu (id, parent_id, type, \"order\", title, plugin_name, header, icon, uri, created_at, updated_at) FROM stdin;\n1\t0\t1\t2\tAdmin\t\t\\N\tfa-tasks\t\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t1\t1\t2\tUsers\t\t\\N\tfa-users\t/info/manager\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n3\t1\t1\t3\tRoles\t\t\\N\tfa-user\t/info/roles\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n4\t1\t1\t4\tPermission\t\t\\N\tfa-ban\t/info/permission\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n5\t1\t1\t5\tMenu\t\t\\N\tfa-bars\t/menu\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n6\t1\t1\t6\tOperation log\t\t\\N\tfa-history\t/info/op\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n7\t0\t1\t1\tDashboard\t\t\\N\tfa-bar-chart\t/\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_operation_log; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_operation_log (id, user_id, path, method, ip, input, created_at, updated_at) FROM stdin;\n\\.\n\n\n--\n-- Data for Name: goadmin_site; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_site (id, key, value, description, state, created_at, updated_at) FROM stdin;\n\\.\n\n\n--\n-- Data for Name: goadmin_permissions; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_permissions (id, name, slug, http_method, http_path, created_at, updated_at) FROM stdin;\n1\tAll permission\t*\t\t*\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\tDashboard\tdashboard\tGET,PUT,POST,DELETE\t/\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_role_menu; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_role_menu (role_id, menu_id, created_at, updated_at) FROM stdin;\n1\t1\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n1\t7\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t7\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_role_permissions; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_role_permissions (role_id, permission_id, created_at, updated_at) FROM stdin;\n1\t1\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n1\t2\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t2\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n0\t3\t\\N\t\\N\n\\.\n\n\n--\n-- Data for Name: goadmin_role_users; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_role_users (role_id, user_id, created_at, updated_at) FROM stdin;\n1\t1\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\t2\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_roles; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_roles (id, name, slug, created_at, updated_at) FROM stdin;\n1\tAdministrator\tadministrator\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\tOperator\toperator\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: goadmin_session; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_session (id, sid, \"values\", created_at, updated_at) FROM stdin;\n2\tf5a99916-36c8-4fd6-8873-6f2be8845cd0\t{\"user_id\":1}\t2019-11-27 22:26:11.917665\t2019-11-27 22:26:11.917665\n3\t03263ffc-0043-4b89-a02f-3aa616bbf857\t{\"user_id\":3}\t2019-11-27 22:26:12.819931\t2019-11-27 22:26:12.819931\n\\.\n\n\n--\n-- Data for Name: goadmin_user_permissions; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_user_permissions (user_id, permission_id, created_at, updated_at) FROM stdin;\n2\t2\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n0\t1\t\\N\t\\N\n1\t1\t2019-11-27 22:26:12.425769\t2019-11-27 22:26:12.425769\n3\t1\t2019-11-27 22:26:12.572997\t2019-11-27 22:26:12.572997\n\\.\n\n\n--\n-- Data for Name: goadmin_users; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.goadmin_users (id, username, password, name, avatar, remember_token, created_at, updated_at) FROM stdin;\n1\tadmin\t$2a$10$OxWYJJGTP2gi00l2x06QuOWqw5VR47MQCJ0vNKnbMYfrutij10Hwe\tadmin\t\ttlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n2\toperator\t$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.\tOperator\t\t\\N\t2019-09-10 00:00:00\t2019-09-10 00:00:00\n\\.\n\n\n--\n-- Data for Name: user_like_books; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.user_like_books (id, user_id, name, created_at, updated_at) FROM stdin;\n1\t1\tRobinson Crusoe\t2020-03-15 09:00:57.409596\t2020-03-15 09:00:57.409596\n\\.\n\n\n--\n-- Data for Name: users; Type: TABLE DATA; Schema: public; Owner: postgres\n--\n\nCOPY public.users (id, name, homepage, email, birthday, country, city, password, ip, certificate, money, resume, gender, fruit, drink, experience, created_at, updated_at, member_id) FROM stdin;\n1\tJack\thttp://jack.me\tjack@163.com\t1993-10-21 00:00:00+08\tchina\tguangzhou\t123456\t127.0.0.1\t\\N\t10\t<h1>Jacks Resume</h1>\t0\tapple\twater\t0\t2020-03-09 15:24:00\t2020-03-09 15:24:00\t0\n\\.\n\n\n--\n-- Name: goadmin_menu_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_menu_myid_seq', 7, true);\n\n\n--\n-- Name: goadmin_operation_log_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_operation_log_myid_seq', 1, true);\n\n\n--\n-- Name: goadmin_permissions_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_permissions_myid_seq', 2, true);\n\n\n--\n-- Name: goadmin_roles_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_roles_myid_seq', 2, true);\n\n\n--\n-- Name: goadmin_session_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_session_myid_seq', 1, true);\n\n--\n-- Name: goadmin_site_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_site_myid_seq', 1, true);\n\n\n--\n-- Name: goadmin_users_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres\n--\n\nSELECT pg_catalog.setval('public.goadmin_users_myid_seq', 2, true);\n\n\n--\n-- Name: goadmin_menu goadmin_menu_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_menu\n    ADD CONSTRAINT goadmin_menu_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_operation_log goadmin_operation_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_operation_log\n    ADD CONSTRAINT goadmin_operation_log_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_permissions goadmin_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_permissions\n    ADD CONSTRAINT goadmin_permissions_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_roles goadmin_roles_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_roles\n    ADD CONSTRAINT goadmin_roles_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_site goadmin_site_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_site\n    ADD CONSTRAINT goadmin_site_pkey PRIMARY KEY (id);\n\n--\n-- Name: goadmin_session goadmin_session_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_session\n    ADD CONSTRAINT goadmin_session_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: goadmin_users goadmin_users_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.goadmin_users\n    ADD CONSTRAINT goadmin_users_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres\n--\n\nALTER TABLE ONLY public.users\n    ADD CONSTRAINT users_pkey PRIMARY KEY (id);\n\n\n--\n-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: postgres\n--\n\nREVOKE ALL ON SCHEMA public FROM PUBLIC;\nREVOKE ALL ON SCHEMA public FROM postgres;\nGRANT ALL ON SCHEMA public TO postgres;\nGRANT ALL ON SCHEMA public TO PUBLIC;\n\n\n--\n-- PostgreSQL database dump complete\n--\n\n"
  },
  {
    "path": "tests/frameworks/beego/beego.go",
    "content": "package beego\n\nimport (\n\t// add beego adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/beego\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/astaxie/beego\"\n)\n\nfunc internalHandler() http.Handler {\n\n\tapp := beego.NewApp()\n\n\teng := engine.Default()\n\tadminPlugin := admin.NewAdmin(tables.Generators)\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\n\texamplePlugin := example.NewExample()\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin, examplePlugin).Use(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tbeego.BConfig.Listen.HTTPAddr = \"127.0.0.1\"\n\tbeego.BConfig.Listen.HTTPPort = 9087\n\n\treturn app.Handlers\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\n\tapp := beego.NewApp()\n\n\teng := engine.Default()\n\tadminPlugin := admin.NewAdmin(gens)\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin).Use(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tbeego.BConfig.Listen.HTTPAddr = \"127.0.0.1\"\n\tbeego.BConfig.Listen.HTTPPort = 9087\n\n\treturn app.Handlers\n}\n"
  },
  {
    "path": "tests/frameworks/beego/beego_test.go",
    "content": "package beego\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestBeego(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/beego2/beego.go",
    "content": "package beego\n\nimport (\n\t\"net/http\"\n\t\"os\"\n\n\t// add beego adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/beego2\"\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\t\"github.com/beego/beego/v2/server/web\"\n)\n\nfunc internalHandler() http.Handler {\n\n\tapp := web.NewHttpSever()\n\n\teng := engine.Default()\n\tadminPlugin := admin.NewAdmin(tables.Generators)\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\n\texamplePlugin := example.NewExample()\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin, examplePlugin).Use(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tapp.Cfg.Listen.HTTPAddr = \"127.0.0.1\"\n\tapp.Cfg.Listen.HTTPPort = 9087\n\n\treturn app.Handlers\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\n\tapp := web.NewHttpSever()\n\n\teng := engine.Default()\n\tadminPlugin := admin.NewAdmin(gens)\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin).Use(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tapp.Cfg.Listen.HTTPAddr = \"127.0.0.1\"\n\tapp.Cfg.Listen.HTTPPort = 9087\n\n\treturn app.Handlers\n}\n"
  },
  {
    "path": "tests/frameworks/beego2/beego_test.go",
    "content": "package beego\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestBeego2(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/buffalo/buffalo.go",
    "content": "package buffalo\n\nimport (\n\t// add buffalo adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/buffalo\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t_ \"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/gobuffalo/buffalo\"\n)\n\nfunc internalHandler() http.Handler {\n\tbu := buffalo.New(buffalo.Options{\n\t\tEnv:  \"test\",\n\t\tAddr: \"127.0.0.1:9033\",\n\t})\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators)\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\n\texamplePlugin := example.NewExample()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin, examplePlugin).Use(bu); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tbu.ServeFiles(\"/uploads\", http.Dir(\"./uploads\"))\n\n\treturn bu\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\tbu := buffalo.New(buffalo.Options{\n\t\tEnv:  \"test\",\n\t\tAddr: \"127.0.0.1:9033\",\n\t})\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(gens)\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin).Use(bu); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tbu.ServeFiles(\"/uploads\", http.Dir(\"./uploads\"))\n\n\treturn bu\n}\n"
  },
  {
    "path": "tests/frameworks/buffalo/buffalo_test.go",
    "content": "package buffalo\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestBuffalo(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/chi/chi.go",
    "content": "package chi\n\nimport (\n\t// add chi adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/chi\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/go-chi/chi\"\n)\n\nfunc internalHandler() http.Handler {\n\tr := chi.NewRouter()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators)\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\texamplePlugin := example.NewExample()\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin, examplePlugin).Use(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn r\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\tr := chi.NewRouter()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(gens)\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin).Use(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn r\n}\n"
  },
  {
    "path": "tests/frameworks/chi/chi_test.go",
    "content": "package chi\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestChi(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/echo/echo.go",
    "content": "package echo\n\nimport (\n\t// add echo adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/echo\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/labstack/echo/v4\"\n)\n\nfunc internalHandler() http.Handler {\n\te := echo.New()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators)\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\ttemplate.AddComp(chartjs.NewChart())\n\n\texamplePlugin := example.NewExample()\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin, examplePlugin).Use(e); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn e\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\te := echo.New()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(gens)\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin).Use(e); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn e\n}\n"
  },
  {
    "path": "tests/frameworks/echo/echo_test.go",
    "content": "package echo\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestEcho(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/fasthttp/fasthttp.go",
    "content": "package fasthttp\n\nimport (\n\t// add fasthttp adapter\n\tada \"github.com/GoAdminGroup/go-admin/adapter/fasthttp\"\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/buaazp/fasthttprouter\"\n\t\"github.com/valyala/fasthttp\"\n)\n\nfunc internalHandler() fasthttp.RequestHandler {\n\trouter := fasthttprouter.New()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators).AddDisplayFilterXssJsFilter()\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin).\n\t\tUse(router); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn func(ctx *fasthttp.RequestCtx) {\n\t\trouter.Handler(ctx)\n\t}\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) fasthttp.RequestHandler {\n\trouter := fasthttprouter.New()\n\n\teng := engine.Default()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddAdapter(new(ada.Fasthttp)).\n\t\tAddGenerators(gens).\n\t\tUse(router); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn func(ctx *fasthttp.RequestCtx) {\n\t\trouter.Handler(ctx)\n\t}\n}\n"
  },
  {
    "path": "tests/frameworks/fasthttp/fasthttp_test.go",
    "content": "package fasthttp\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestFasthttp(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewFastBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/gear/gear.go",
    "content": "package gear\n\nimport (\n\t// add gin adapter\n\tada \"github.com/GoAdminGroup/go-admin/adapter/gear\"\n\t\"github.com/teambition/gear\"\n\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n)\n\nfunc internalHandler() http.Handler {\n\tapp := gear.New()\n\n\teng := engine.Default()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddGenerators(tables.Generators).\n\t\tAddGenerator(\"user\", tables.GetUserTable).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn app\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\tapp := gear.New()\n\n\teng := engine.Default()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddAdapter(new(ada.Gear)).\n\t\tAddGenerators(gens).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn app\n}\n"
  },
  {
    "path": "tests/frameworks/gear/gear_test.go",
    "content": "package gear\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestGear(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/gf/gf.go",
    "content": "package gf\n\nimport (\n\t\"net/http\"\n\t\"os\"\n\n\t// add gf adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gf\"\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/gogf/gf/frame/g\"\n)\n\nfunc internalHandler() http.Handler {\n\ts := g.Server(8103)\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators).AddDisplayFilterXssJsFilter()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin).\n\t\tUse(s); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn s\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\n\ts := g.Server(8103)\n\n\teng := engine.Default()\n\tadminPlugin := admin.NewAdmin(gens)\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin).Use(s); err != nil {\n\t\tpanic(err)\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn s\n}\n"
  },
  {
    "path": "tests/frameworks/gf/gf_test.go",
    "content": "package gf\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestGf(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/gf2/gf.go",
    "content": "package gf\n\nimport (\n\t// add gf adapter\n\t\"reflect\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gf2\"\n\t\"github.com/agiledragon/gomonkey\"\n\n\t// add mysql driver\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/gogf/gf/v2/frame/g\"\n\t\"github.com/gogf/gf/v2/net/ghttp\"\n)\n\nfunc internalHandler() http.Handler {\n\ts := g.Server()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators).AddDisplayFilterXssJsFilter()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin).\n\t\tUse(s); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\ts.SetPort(8103)\n\n\tgomonkey.ApplyMethod(reflect.TypeOf(new(ghttp.Request).Session), \"Close\",\n\t\tfunc(*ghttp.Session) error {\n\t\t\treturn nil\n\t\t})\n\n\treturn s\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\n\ts := g.Server(8103)\n\n\teng := engine.Default()\n\tadminPlugin := admin.NewAdmin(gens)\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin).Use(s); err != nil {\n\t\tpanic(err)\n\t}\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn s\n}\n"
  },
  {
    "path": "tests/frameworks/gf2/gf_test.go",
    "content": "package gf\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestGf2(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/gin/gin.go",
    "content": "package gin\n\nimport (\n\t// add gin adapter\n\n\tada \"github.com/GoAdminGroup/go-admin/adapter/gin\"\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/gin-gonic/gin\"\n)\n\nfunc internalHandler() http.Handler {\n\tr := gin.Default()\n\n\tgin.SetMode(gin.ReleaseMode)\n\n\teng := engine.Default()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddGenerators(tables.Generators).\n\t\tAddGenerator(\"user\", tables.GetUserTable).\n\t\tUse(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tr.Static(\"/uploads\", \"./uploads\")\n\n\treturn r\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\tr := gin.Default()\n\n\tgin.SetMode(gin.ReleaseMode)\n\n\teng := engine.Default()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddAdapter(new(ada.Gin)).\n\t\tAddGenerators(gens).\n\t\tUse(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tr.Static(\"/uploads\", \"./uploads\")\n\n\treturn r\n}\n"
  },
  {
    "path": "tests/frameworks/gin/gin_test.go",
    "content": "package gin\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestGin(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/gofiber/gofiber.go",
    "content": "package gofiber\n\nimport (\n\t// add fasthttp adapter\n\tada \"github.com/GoAdminGroup/go-admin/adapter/gofiber\"\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/gofiber/fiber/v2\"\n\t\"github.com/valyala/fasthttp\"\n)\n\nfunc internalHandler() fasthttp.RequestHandler {\n\tapp := fiber.New(fiber.Config{\n\t\tServerHeader: \"Fiber\",\n\t})\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators).AddDisplayFilterXssJsFilter()\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn app.Handler()\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) fasthttp.RequestHandler {\n\tapp := fiber.New(fiber.Config{\n\t\tServerHeader: \"Fiber\",\n\t})\n\n\teng := engine.Default()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddAdapter(new(ada.Gofiber)).\n\t\tAddGenerators(gens).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn app.Handler()\n}\n"
  },
  {
    "path": "tests/frameworks/gofiber/gofiber_test.go",
    "content": "package gofiber\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestGofiber(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewFastBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/gorilla/gorilla.go",
    "content": "package gorilla\n\nimport (\n\t// add gorilla adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gorilla\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/gorilla/mux\"\n)\n\nfunc internalHandler() http.Handler {\n\tapp := mux.NewRouter()\n\teng := engine.Default()\n\n\texamplePlugin := example.NewExample()\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(admin.NewAdmin(tables.Generators).\n\t\t\tAddGenerator(\"user\", tables.GetUserTable), examplePlugin).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn app\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\tapp := mux.NewRouter()\n\teng := engine.Default()\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(admin.NewAdmin(gens)).\n\t\tUse(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn app\n}\n"
  },
  {
    "path": "tests/frameworks/gorilla/gorilla_test.go",
    "content": "package gorilla\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestGorilla(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/iris/iris.go",
    "content": "package iris\n\nimport (\n\t// add iris adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/iris\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/kataras/iris/v12\"\n)\n\nfunc internalHandler() http.Handler {\n\tapp := iris.New()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators)\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\texamplePlugin := example.NewExample()\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin, examplePlugin).Use(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tif err := app.Build(); err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn app.Router\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\tapp := iris.New()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(gens)\n\n\texamplePlugin := example.NewExample()\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin, examplePlugin).Use(app); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tif err := app.Build(); err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn app.Router\n}\n"
  },
  {
    "path": "tests/frameworks/iris/iris_test.go",
    "content": "package iris\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestIris(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/frameworks/nethttp/nethttp.go",
    "content": "package nethttp\n\nimport (\n\t// add net/http adapter\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/nethttp\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n\t// add mysql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t// add postgresql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres\"\n\t// add sqlite driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/sqlite\"\n\t// add mssql driver\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t// add adminlte ui theme\n\t\"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/example\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n)\n\nfunc internalHandler() http.Handler {\n\tr := http.NewServeMux()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators)\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\texamplePlugin := example.NewExample()\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfigFromJSON(os.Args[len(os.Args)-1]).\n\t\tAddPlugins(adminPlugin, examplePlugin).Use(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn r\n}\n\nfunc NewHandler(dbs config.DatabaseList, gens table.GeneratorList) http.Handler {\n\tr := http.NewServeMux()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(gens)\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tif err := eng.AddConfig(&config.Config{\n\t\tDatabases: dbs,\n\t\tUrlPrefix: \"admin\",\n\t\tStore: config.Store{\n\t\t\tPath:   \"./uploads\",\n\t\t\tPrefix: \"uploads\",\n\t\t},\n\t\tLanguage:    language.EN,\n\t\tIndexUrl:    \"/\",\n\t\tDebug:       true,\n\t\tColorScheme: adminlte.ColorschemeSkinBlack,\n\t}).\n\t\tAddPlugins(adminPlugin).Use(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\treturn r\n}\n"
  },
  {
    "path": "tests/frameworks/nethttp/nethttp_test.go",
    "content": "package nethttp\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/gavv/httpexpect\"\n)\n\nfunc TestNetHTTP(t *testing.T) {\n\tcommon.ExtraTest(httpexpect.WithConfig(httpexpect.Config{\n\t\tClient: &http.Client{\n\t\t\tTransport: httpexpect.NewBinder(internalHandler()),\n\t\t\tJar:       httpexpect.NewJar(),\n\t\t},\n\t\tReporter: httpexpect.NewAssertReporter(t),\n\t}))\n}\n"
  },
  {
    "path": "tests/tables/authors.go",
    "content": "package tables\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\n// GetAuthorsTable return the model of table author.\nfunc GetAuthorsTable(ctx *context.Context) (authorsTable table.Table) {\n\n\tauthorsTable = table.NewDefaultTable(ctx, table.DefaultConfig())\n\n\t// connect your custom connection\n\t// authorsTable = table.NewDefaultTable(ctx, table.DefaultConfigWithDriverAndConnection(\"mysql\", \"admin\"))\n\n\tinfo := authorsTable.GetInfo()\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(\"First Name\", \"first_name\", db.Varchar)\n\tinfo.AddField(\"Last Name\", \"last_name\", db.Varchar)\n\tinfo.AddField(\"Email\", \"email\", db.Varchar)\n\tinfo.AddField(\"Birthdate\", \"birthdate\", db.Date)\n\tinfo.AddField(\"Added\", \"added\", db.Timestamp)\n\n\tinfo.SetTable(\"authors\").SetTitle(\"Authors\").SetDescription(\"Authors\")\n\n\tformList := authorsTable.GetForm()\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(\"First Name\", \"first_name\", db.Varchar, form.Text)\n\tformList.AddField(\"Last Name\", \"last_name\", db.Varchar, form.Text)\n\tformList.AddField(\"Email\", \"email\", db.Varchar, form.Text)\n\tformList.AddField(\"Birthdate\", \"birthdate\", db.Date, form.Text)\n\tformList.AddField(\"Added\", \"added\", db.Timestamp, form.Text)\n\n\tformList.SetTable(\"authors\").SetTitle(\"Authors\").SetDescription(\"Authors\")\n\n\treturn\n}\n"
  },
  {
    "path": "tests/tables/content.go",
    "content": "package tables\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\ttmpl \"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/chart_legend\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/description\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/infobox\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/productlist\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/progress_group\"\n\t\"github.com/GoAdminGroup/themes/adminlte/components/smallbox\"\n)\n\n// GetContent return the content of index page.\nfunc GetContent(ctx *context.Context) (types.Panel, error) {\n\n\tcomponents := tmpl.Default(ctx)\n\tcolComp := components.Col()\n\n\t/**************************\n\t * Info Box\n\t/**************************/\n\n\tinfobox1 := infobox.New().\n\t\tSetText(\"CPU TRAFFIC\").\n\t\tSetColor(\"aqua\").\n\t\tSetNumber(\"100\").\n\t\tSetIcon(\"ion-ios-gear-outline\").\n\t\tGetContent()\n\n\tinfobox2 := infobox.New().\n\t\tSetText(\"Likes\").\n\t\tSetColor(\"red\").\n\t\tSetNumber(\"1030.00<small>$</small>\").\n\t\tSetIcon(icon.GooglePlus).\n\t\tGetContent()\n\n\tinfobox3 := infobox.New().\n\t\tSetText(\"Sales\").\n\t\tSetColor(\"green\").\n\t\tSetNumber(\"760\").\n\t\tSetIcon(\"ion-ios-cart-outline\").\n\t\tGetContent()\n\n\tinfobox4 := infobox.New().\n\t\tSetText(\"New Members\").\n\t\tSetColor(\"yellow\").\n\t\tSetNumber(\"2,349\").\n\t\tSetIcon(\"ion-ios-people-outline\"). // svg is ok\n\t\tGetContent()\n\n\tvar size = types.Size(6, 3, 0).XS(12)\n\tinfoboxCol1 := colComp.SetSize(size).SetContent(infobox1).GetContent()\n\tinfoboxCol2 := colComp.SetSize(size).SetContent(infobox2).GetContent()\n\tinfoboxCol3 := colComp.SetSize(size).SetContent(infobox3).GetContent()\n\tinfoboxCol4 := colComp.SetSize(size).SetContent(infobox4).GetContent()\n\trow1 := components.Row().SetContent(infoboxCol1 + infoboxCol2 + infoboxCol3 + infoboxCol4).GetContent()\n\n\t/**************************\n\t * Box\n\t/**************************/\n\n\ttable := components.Table().SetInfoList([]map[string]types.InfoItem{\n\t\t{\n\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t}, {\n\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t}, {\n\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t}, {\n\t\t\t\"Order ID\":   {Content: \"OR9842\"},\n\t\t\t\"Item\":       {Content: \"Call of Duty IV\"},\n\t\t\t\"Status\":     {Content: \"shipped\"},\n\t\t\t\"Popularity\": {Content: \"90%\"},\n\t\t},\n\t}).SetThead(types.Thead{\n\t\t{Head: \"Order ID\"},\n\t\t{Head: \"Item\"},\n\t\t{Head: \"Status\"},\n\t\t{Head: \"Popularity\"},\n\t}).GetContent()\n\n\tboxInfo := components.Box().\n\t\tWithHeadBorder().\n\t\tSetHeader(\"Latest Orders\").\n\t\tSetHeadColor(\"#f7f7f7\").\n\t\tSetBody(table).\n\t\tSetFooter(`<div class=\"clearfix\"><a href=\"javascript:void(0)\" class=\"btn btn-sm btn-info btn-flat pull-left\">处理订单</a><a href=\"javascript:void(0)\" class=\"btn btn-sm btn-default btn-flat pull-right\">查看所有新订单</a> </div>`).\n\t\tGetContent()\n\n\ttableCol := colComp.SetSize(types.SizeMD(8)).SetContent(row1 + boxInfo).GetContent()\n\n\t/**************************\n\t * Product List\n\t/**************************/\n\n\tproductList := productlist.New().SetData([]map[string]string{\n\t\t{\n\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\"label\":       \"free\",\n\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t}, {\n\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\"label\":       \"free\",\n\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t}, {\n\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\"label\":       \"free\",\n\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t}, {\n\t\t\t\"title\":       \"GoAdmin\",\n\t\t\t\"has_tabel\":   \"true\",\n\t\t\t\"labeltype\":   \"warning\",\n\t\t\t\"label\":       \"free\",\n\t\t\t\"description\": `a framework help you build the dataviz system`,\n\t\t},\n\t}).GetContent()\n\n\tboxWarning := components.Box().SetTheme(\"warning\").WithHeadBorder().SetHeader(\"Recently Added Products\").\n\t\tSetBody(productList).\n\t\tSetFooter(`<a href=\"javascript:void(0)\" class=\"uppercase\">View All Products</a>`).\n\t\tGetContent()\n\n\tnewsCol := colComp.SetSize(types.SizeMD(4)).SetContent(boxWarning).GetContent()\n\n\trow5 := components.Row().SetContent(tableCol + newsCol).GetContent()\n\n\t/**************************\n\t * Box\n\t/**************************/\n\n\tline := chartjs.Line()\n\n\tlineChart := line.\n\t\tSetID(\"salechart\").\n\t\tSetHeight(180).\n\t\tSetTitle(\"Sales: 1 Jan, 2019 - 30 Jul, 2019\").\n\t\tSetLabels([]string{\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\"}).\n\t\tAddDataSet(\"Electronics\").\n\t\tDSData([]float64{65, 59, 80, 81, 56, 55, 40}).\n\t\tDSFill(false).\n\t\tDSBorderColor(\"rgb(210, 214, 222)\").\n\t\tDSLineTension(0.1).\n\t\tAddDataSet(\"Digital Goods\").\n\t\tDSData([]float64{28, 48, 40, 19, 86, 27, 90}).\n\t\tDSFill(false).\n\t\tDSBorderColor(\"rgba(60,141,188,1)\").\n\t\tDSLineTension(0.1).\n\t\tGetContent()\n\n\ttitle := `<p class=\"text-center\"><strong>Goal Completion</strong></p>`\n\tprogressGroup := progress_group.New().\n\t\tSetTitle(\"Add Products to Cart\").\n\t\tSetColor(\"#76b2d4\").\n\t\tSetDenominator(200).\n\t\tSetMolecular(160).\n\t\tSetPercent(80).\n\t\tGetContent()\n\n\tprogressGroup1 := progress_group.New().\n\t\tSetTitle(\"Complete Purchase\").\n\t\tSetColor(\"#f17c6e\").\n\t\tSetDenominator(400).\n\t\tSetMolecular(310).\n\t\tSetPercent(80).\n\t\tGetContent()\n\n\tprogressGroup2 := progress_group.New().\n\t\tSetTitle(\"Visit Premium Page\").\n\t\tSetColor(\"#ace0ae\").\n\t\tSetDenominator(800).\n\t\tSetMolecular(490).\n\t\tSetPercent(80).\n\t\tGetContent()\n\n\tprogressGroup3 := progress_group.New().\n\t\tSetTitle(\"Send Inquiries\").\n\t\tSetColor(\"#fdd698\").\n\t\tSetDenominator(500).\n\t\tSetMolecular(250).\n\t\tSetPercent(50).\n\t\tGetContent()\n\n\tboxInternalCol1 := colComp.SetContent(lineChart).SetSize(types.SizeMD(8)).GetContent()\n\tboxInternalCol2 := colComp.\n\t\tSetContent(template.HTML(title) + progressGroup + progressGroup1 + progressGroup2 + progressGroup3).\n\t\tSetSize(types.SizeMD(4)).\n\t\tGetContent()\n\n\tboxInternalRow := components.Row().SetContent(boxInternalCol1 + boxInternalCol2).GetContent()\n\n\tdescription1 := description.New().\n\t\tSetPercent(\"17\").\n\t\tSetNumber(\"¥140,100\").\n\t\tSetTitle(\"TOTAL REVENUE\").\n\t\tSetArrow(\"up\").\n\t\tSetColor(\"green\").\n\t\tSetBorder(\"right\").\n\t\tGetContent()\n\n\tdescription2 := description.New().\n\t\tSetPercent(\"2\").\n\t\tSetNumber(\"440,560\").\n\t\tSetTitle(\"TOTAL REVENUE\").\n\t\tSetArrow(\"down\").\n\t\tSetColor(\"red\").\n\t\tSetBorder(\"right\").\n\t\tGetContent()\n\n\tdescription3 := description.New().\n\t\tSetPercent(\"12\").\n\t\tSetNumber(\"¥140,050\").\n\t\tSetTitle(\"TOTAL REVENUE\").\n\t\tSetArrow(\"up\").\n\t\tSetColor(\"green\").\n\t\tSetBorder(\"right\").\n\t\tGetContent()\n\n\tdescription4 := description.New().\n\t\tSetPercent(\"1\").\n\t\tSetNumber(\"30943\").\n\t\tSetTitle(\"TOTAL REVENUE\").\n\t\tSetArrow(\"up\").\n\t\tSetColor(\"green\").\n\t\tGetContent()\n\n\tsize2 := types.SizeXS(6).SM(3)\n\tboxInternalCol3 := colComp.SetContent(description1).SetSize(size2).GetContent()\n\tboxInternalCol4 := colComp.SetContent(description2).SetSize(size2).GetContent()\n\tboxInternalCol5 := colComp.SetContent(description3).SetSize(size2).GetContent()\n\tboxInternalCol6 := colComp.SetContent(description4).SetSize(size2).GetContent()\n\n\tboxInternalRow2 := components.Row().SetContent(boxInternalCol3 + boxInternalCol4 + boxInternalCol5 + boxInternalCol6).GetContent()\n\n\tbox := components.Box().WithHeadBorder().SetHeader(\"Monthly Recap Report\").\n\t\tSetBody(boxInternalRow).\n\t\tSetFooter(boxInternalRow2).\n\t\tGetContent()\n\n\tboxcol := colComp.SetContent(box).SetSize(types.SizeMD(12)).GetContent()\n\trow2 := components.Row().SetContent(boxcol).GetContent()\n\n\t/**************************\n\t * Small Box\n\t/**************************/\n\n\tsmallbox1 := smallbox.New().SetColor(\"blue\").SetIcon(\"ion-ios-gear-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"345￥\").GetContent()\n\tsmallbox2 := smallbox.New().SetColor(\"yellow\").SetIcon(\"ion-ios-cart-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"80%\").GetContent()\n\tsmallbox3 := smallbox.New().SetColor(\"red\").SetIcon(\"fa-user\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"645￥\").GetContent()\n\tsmallbox4 := smallbox.New().SetColor(\"green\").SetIcon(\"ion-ios-cart-outline\").SetUrl(\"/\").SetTitle(\"new users\").SetValue(\"889￥\").GetContent()\n\n\tcol1 := colComp.SetSize(size).SetContent(smallbox1).GetContent()\n\tcol2 := colComp.SetSize(size).SetContent(smallbox2).GetContent()\n\tcol3 := colComp.SetSize(size).SetContent(smallbox3).GetContent()\n\tcol4 := colComp.SetSize(size).SetContent(smallbox4).GetContent()\n\n\trow3 := components.Row().SetContent(col1 + col2 + col3 + col4).GetContent()\n\n\t/**************************\n\t * Pie Chart\n\t/**************************/\n\n\tpie := chartjs.Pie().\n\t\tSetHeight(170).\n\t\tSetLabels([]string{\"Navigator\", \"Opera\", \"Safari\", \"FireFox\", \"IE\", \"Chrome\"}).\n\t\tSetID(\"pieChart\").\n\t\tAddDataSet(\"Chrome\").\n\t\tDSData([]float64{100, 300, 600, 400, 500, 700}).\n\t\tDSBackgroundColor([]chartjs.Color{\n\t\t\t\"rgb(255, 205, 86)\", \"rgb(54, 162, 235)\", \"rgb(255, 99, 132)\", \"rgb(255, 205, 86)\", \"rgb(54, 162, 235)\", \"rgb(255, 99, 132)\",\n\t\t}).\n\t\tGetContent()\n\n\tlegend := chart_legend.New().SetData([]map[string]string{\n\t\t{\n\t\t\t\"label\": \" Chrome\",\n\t\t\t\"color\": \"red\",\n\t\t}, {\n\t\t\t\"label\": \" IE\",\n\t\t\t\"color\": \"Green\",\n\t\t}, {\n\t\t\t\"label\": \" FireFox\",\n\t\t\t\"color\": \"yellow\",\n\t\t}, {\n\t\t\t\"label\": \" Sarafri\",\n\t\t\t\"color\": \"blue\",\n\t\t}, {\n\t\t\t\"label\": \" Opera\",\n\t\t\t\"color\": \"light-blue\",\n\t\t}, {\n\t\t\t\"label\": \" Navigator\",\n\t\t\t\"color\": \"gray\",\n\t\t},\n\t}).GetContent()\n\n\tboxDanger := components.Box().SetTheme(\"danger\").WithHeadBorder().SetHeader(\"Browser Usage\").\n\t\tSetBody(components.Row().\n\t\t\tSetContent(colComp.SetSize(types.SizeMD(8)).\n\t\t\t\tSetContent(pie).\n\t\t\t\tGetContent() + colComp.SetSize(types.SizeMD(4)).\n\t\t\t\tSetContent(legend).\n\t\t\t\tGetContent()).GetContent()).\n\t\tSetFooter(`<p class=\"text-center\"><a href=\"javascript:void(0)\" class=\"uppercase\">View All Users</a></p>`).\n\t\tGetContent()\n\n\ttabs := components.Tabs().SetData([]map[string]template.HTML{\n\t\t{\n\t\t\t\"title\": \"tabs1\",\n\t\t\t\"content\": template.HTML(`<b>How to use:</b>\n\n                <p>Exactly like the original bootstrap tabs except you should use\n                  the custom wrapper <code>.nav-tabs-custom</code> to achieve this style.</p>\n                A wonderful serenity has taken possession of my entire soul,\n                like these sweet mornings of spring which I enjoy with my whole heart.\n                I am alone, and feel the charm of existence in this spot,\n                which was created for the bliss of souls like mine. I am so happy,\n                my dear friend, so absorbed in the exquisite sense of mere tranquil existence,\n                that I neglect my talents. I should be incapable of drawing a single stroke\n                at the present moment; and yet I feel that I never was a greater artist than now.`),\n\t\t}, {\n\t\t\t\"title\": \"tabs2\",\n\t\t\t\"content\": template.HTML(`\n                The European languages are members of the same family. Their separate existence is a myth.\n                For science, music, sport, etc, Europe uses the same vocabulary. The languages only differ\n                in their grammar, their pronunciation and their most common words. Everyone realizes why a\n                new common language would be desirable: one could refuse to pay expensive translators. To\n                achieve this, it would be necessary to have uniform grammar, pronunciation and more common\n                words. If several languages coalesce, the grammar of the resulting language is more simple\n                and regular than that of the individual languages.\n              `),\n\t\t}, {\n\t\t\t\"title\": \"tabs3\",\n\t\t\t\"content\": template.HTML(`\n                Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n                Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,\n                when an unknown printer took a galley of type and scrambled it to make a type specimen book.\n                It has survived not only five centuries, but also the leap into electronic typesetting,\n                remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset\n                sheets containing Lorem Ipsum passages, and more recently with desktop publishing software\n                like Aldus PageMaker including versions of Lorem Ipsum.\n              `),\n\t\t},\n\t}).GetContent()\n\n\tbuttonTest := `<button type=\"button\" class=\"btn btn-primary\" data-toggle=\"modal\" data-target=\"#exampleModal\" data-whatever=\"@mdo\">Open modal for @mdo</button>`\n\tpopupForm := `<form>\n          <div class=\"form-group\">\n            <label for=\"recipient-name\" class=\"col-form-label\">Recipient:</label>\n            <input type=\"text\" class=\"form-control\" id=\"recipient-name\">\n          </div>\n          <div class=\"form-group\">\n            <label for=\"message-text\" class=\"col-form-label\">Message:</label>\n            <textarea class=\"form-control\" id=\"message-text\"></textarea>\n          </div>\n        </form>`\n\tpopup := components.Popup().SetID(\"exampleModal\").\n\t\tSetFooter(\"Save Change\").\n\t\tSetTitle(\"this is a popup\").\n\t\tSetBody(template.HTML(popupForm)).\n\t\tGetContent()\n\n\tcol5 := colComp.SetSize(types.SizeMD(8)).SetContent(tabs + template.HTML(buttonTest)).GetContent()\n\tcol6 := colComp.SetSize(types.SizeMD(4)).SetContent(boxDanger + popup).GetContent()\n\n\trow4 := components.Row().SetContent(col5 + col6).GetContent()\n\n\treturn types.Panel{\n\t\tContent:     row3 + row2 + row5 + row4,\n\t\tTitle:       \"Dashboard\",\n\t\tDescription: \"dashboard example\",\n\t}, nil\n}\n"
  },
  {
    "path": "tests/tables/external.go",
    "content": "package tables\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/parameter\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n)\n\n// GetExternalTable return the model from external data source.\nfunc GetExternalTable(ctx *context.Context) (externalTable table.Table) {\n\n\texternalTable = table.NewDefaultTable(ctx, )\n\n\tinfo := externalTable.GetInfo()\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(\"Title\", \"title\", db.Varchar)\n\n\tinfo.SetTable(\"external\").\n\t\tSetTitle(\"Externals\").\n\t\tSetDescription(\"Externals\").\n\t\tSetGetDataFn(func(param parameter.Parameters) ([]map[string]interface{}, int) {\n\t\t\treturn []map[string]interface{}{\n\t\t\t\t{\n\t\t\t\t\t\"id\":    10,\n\t\t\t\t\t\"title\": \"this is a title\",\n\t\t\t\t}, {\n\t\t\t\t\t\"id\":    11,\n\t\t\t\t\t\"title\": \"this is a title2\",\n\t\t\t\t}, {\n\t\t\t\t\t\"id\":    12,\n\t\t\t\t\t\"title\": \"this is a title3\",\n\t\t\t\t}, {\n\t\t\t\t\t\"id\":    13,\n\t\t\t\t\t\"title\": \"this is a title4\",\n\t\t\t\t},\n\t\t\t}, 10\n\t\t})\n\n\tformList := externalTable.GetForm()\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(\"Title\", \"title\", db.Varchar, form.Text)\n\n\tformList.SetTable(\"external\").SetTitle(\"Externals\").SetDescription(\"Externals\")\n\n\tdetail := externalTable.GetDetail()\n\n\tdetail.SetTable(\"external\").\n\t\tSetTitle(\"Externals\").\n\t\tSetDescription(\"Externals\").\n\t\tSetGetDataFn(func(param parameter.Parameters) ([]map[string]interface{}, int) {\n\t\t\treturn []map[string]interface{}{\n\t\t\t\t{\n\t\t\t\t\t\"id\":    10,\n\t\t\t\t\t\"title\": \"this is a title\",\n\t\t\t\t},\n\t\t\t}, 1\n\t\t})\n\n\treturn\n}\n"
  },
  {
    "path": "tests/tables/posts.go",
    "content": "package tables\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n\teditType \"github.com/GoAdminGroup/go-admin/template/types/table\"\n)\n\n// GetPostsTable return the model of table posts.\nfunc GetPostsTable(ctx *context.Context) (postsTable table.Table) {\n\n\tpostsTable = table.NewDefaultTable(ctx, table.DefaultConfig())\n\n\tinfo := postsTable.GetInfo()\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(\"Title\", \"title\", db.Varchar)\n\tinfo.AddField(\"AuthorID\", \"author_id\", db.Varchar).FieldDisplay(func(value types.FieldModel) interface{} {\n\t\treturn template.Default(ctx).\n\t\t\tLink().\n\t\t\tSetURL(\"/admin/info/authors/detail?__goadmin_detail_pk=100\").\n\t\t\tSetContent(\"100\").\n\t\t\tOpenInNewTab().\n\t\t\tSetTabTitle(\"Author Detail\").\n\t\t\tGetContent()\n\t})\n\tinfo.AddField(\"Description\", \"description\", db.Varchar)\n\tinfo.AddField(\"Content\", \"content\", db.Varchar).FieldEditAble(editType.Textarea)\n\tinfo.AddField(\"Date\", \"date\", db.Varchar)\n\n\tinfo.SetTable(\"posts\").SetTitle(\"Posts\").SetDescription(\"Posts\")\n\n\tformList := postsTable.GetForm()\n\tformList.AddField(\"ID\", \"id\", db.Int, form.Default).FieldDisplayButCanNotEditWhenUpdate().FieldDisableWhenCreate()\n\tformList.AddField(\"Title\", \"title\", db.Varchar, form.Text)\n\tformList.AddField(\"Description\", \"description\", db.Varchar, form.Text)\n\tformList.AddField(\"Content\", \"content\", db.Varchar, form.RichText).FieldEnableFileUpload()\n\tformList.AddField(\"Date\", \"date\", db.Varchar, form.Datetime)\n\n\tformList.SetTable(\"posts\").SetTitle(\"Posts\").SetDescription(\"Posts\")\n\n\treturn\n}\n"
  },
  {
    "path": "tests/tables/tables.go",
    "content": "package tables\n\nimport \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\nvar Generators = map[string]table.Generator{\n\t\"posts\":    GetPostsTable,\n\t\"authors\":  GetAuthorsTable,\n\t\"external\": GetExternalTable,\n}\n"
  },
  {
    "path": "tests/tables/user.go",
    "content": "package tables\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/template/icon\"\n\t\"github.com/GoAdminGroup/go-admin/template/types\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/action\"\n\t\"github.com/GoAdminGroup/go-admin/template/types/form\"\n\tselection \"github.com/GoAdminGroup/go-admin/template/types/form/select\"\n\teditType \"github.com/GoAdminGroup/go-admin/template/types/table\"\n)\n\n// GetUserTable return the model of table user.\nfunc GetUserTable(ctx *context.Context) (userTable table.Table) {\n\n\tuserTable = table.NewDefaultTable(ctx, table.Config{\n\t\tDriver:     config.GetDatabases().GetDefault().Driver,\n\t\tCanAdd:     true,\n\t\tEditable:   true,\n\t\tDeletable:  true,\n\t\tExportable: true,\n\t\tConnection: table.DefaultConnectionName,\n\t\tPrimaryKey: table.PrimaryKey{\n\t\t\tType: db.Int,\n\t\t\tName: table.DefaultPrimaryKeyName,\n\t\t},\n\t})\n\n\tinfo := userTable.GetInfo().SetFilterFormLayout(form.LayoutThreeCol).Where(\"gender\", \"=\", 0)\n\tinfo.AddField(\"ID\", \"id\", db.Int).FieldSortable()\n\tinfo.AddField(\"Name\", \"name\", db.Varchar).FieldEditAble(editType.Text).\n\t\tFieldFilterable(types.FilterType{Operator: types.FilterOperatorLike})\n\tinfo.AddField(\"Gender\", \"gender\", db.Tinyint).FieldDisplay(func(model types.FieldModel) interface{} {\n\t\tif model.Value == \"0\" {\n\t\t\treturn \"men\"\n\t\t}\n\t\tif model.Value == \"1\" {\n\t\t\treturn \"women\"\n\t\t}\n\t\treturn \"unknown\"\n\t}).FieldEditAble(editType.Switch).FieldEditOptions(types.FieldOptions{\n\t\t{Value: \"0\", Text: \"👦\"},\n\t\t{Value: \"1\", Text: \"👧\"},\n\t}).FieldFilterable(types.FilterType{FormType: form.SelectSingle}).FieldFilterOptions(types.FieldOptions{\n\t\t{Value: \"0\", Text: \"men\"},\n\t\t{Value: \"1\", Text: \"women\"},\n\t})\n\tinfo.AddField(\"Experience\", \"experience\", db.Tinyint).\n\t\tFieldFilterable(types.FilterType{FormType: form.Radio}).\n\t\tFieldFilterOptions(types.FieldOptions{\n\t\t\t{Value: \"0\", Text: \"one\"},\n\t\t\t{Value: \"1\", Text: \"two\"},\n\t\t\t{Value: \"3\", Text: \"three\"},\n\t\t}).FieldHide()\n\tinfo.AddField(\"Drink\", \"drink\", db.Tinyint).\n\t\tFieldFilterable(types.FilterType{FormType: form.Select}).\n\t\tFieldFilterOptions(types.FieldOptions{\n\t\t\t{Value: \"water\", Text: \"water\"},\n\t\t\t{Value: \"juice\", Text: \"juice\"},\n\t\t\t{Value: \"red bull\", Text: \"red bull\"},\n\t\t}).FieldHide()\n\tinfo.AddField(\"City\", \"city\", db.Varchar).FieldFilterable()\n\tinfo.AddField(\"Book\", \"name\", db.Varchar).FieldJoin(types.Join{\n\t\tJoinField: \"user_id\",\n\t\tField:     \"id\",\n\t\tTable:     \"user_like_books\",\n\t})\n\tinfo.AddField(\"Avatar\", \"avatar\", db.Varchar).FieldDisplay(func(value types.FieldModel) interface{} {\n\t\treturn \"1231\"\n\t})\n\tinfo.AddField(\"CreatedAt\", \"created_at\", db.Timestamp).\n\t\tFieldFilterable(types.FilterType{FormType: form.DatetimeRange})\n\tinfo.AddField(\"UpdatedAt\", \"updated_at\", db.Timestamp).FieldEditAble(editType.Datetime)\n\n\t// ===========================\n\t// Buttons\n\t// ===========================\n\n\tinfo.AddActionButton(ctx, \"google\", action.Jump(\"https://google.com\"))\n\tinfo.AddActionButton(ctx, \"Audit\", action.Ajax(\"/admin/audit\",\n\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\tfmt.Println(\"PostForm\", ctx.PostForm())\n\t\t\treturn true, \"success\", \"\"\n\t\t}))\n\tinfo.AddActionButton(ctx, \"Preview\", action.PopUp(\"/admin/preview\", \"Preview\",\n\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\treturn true, \"\", \"<h2>preview content</h2>\"\n\t\t}))\n\tinfo.AddButton(ctx, \"jump\", icon.User, action.JumpInNewTab(\"/admin/info/authors\", \"authors\"))\n\tinfo.AddButton(ctx, \"popup\", icon.Terminal, action.PopUp(\"/admin/popup\", \"Popup Example\",\n\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\treturn true, \"\", \"<h2>hello world</h2>\"\n\t\t}))\n\tinfo.AddButton(ctx, \"ajax\", icon.Android, action.Ajax(\"/admin/ajax\",\n\t\tfunc(ctx *context.Context) (success bool, msg string, data interface{}) {\n\t\t\treturn true, \"Oh li get\", \"\"\n\t\t}))\n\tinfo.AddSelectBox(ctx, \"gender\", types.FieldOptions{\n\t\t{Value: \"0\", Text: \"men\"},\n\t\t{Value: \"1\", Text: \"women\"},\n\t}, action.FieldFilter(\"gender\"))\n\n\tinfo.SetTable(\"users\").SetTitle(\"Users\").SetDescription(\"Users\")\n\n\tformList := userTable.GetForm()\n\n\tformList.AddField(\"Name\", \"name\", db.Varchar, form.Text)\n\tformList.AddField(\"Age\", \"age\", db.Int, form.Number)\n\tformList.AddField(\"Homepage\", \"homepage\", db.Varchar, form.Url).FieldDefault(\"http://google.com\")\n\tformList.AddField(\"Email\", \"email\", db.Varchar, form.Email).FieldDefault(\"xxxx@xxx.com\")\n\tformList.AddField(\"Birthday\", \"birthday\", db.Varchar, form.Datetime).FieldDefault(\"2010-09-05\")\n\tformList.AddField(\"Password\", \"password\", db.Varchar, form.Password)\n\tformList.AddField(\"IP\", \"ip\", db.Varchar, form.Ip)\n\tformList.AddField(\"Cert\", \"certificate\", db.Varchar, form.Multifile).FieldOptionExt(map[string]interface{}{\n\t\t\"maxFileCount\": 10,\n\t})\n\tformList.AddField(\"Amount\", \"money\", db.Int, form.Currency)\n\tformList.AddField(\"Content\", \"resume\", db.Text, form.RichText).\n\t\tFieldDefault(`<h1>343434</h1><p>34344433434</p><ol><li>23234</li><li>2342342342</li><li>asdfads</li></ol><ul><li>3434334</li><li>34343343434</li><li>44455</li></ul><p><span style=\"color: rgb(194, 79, 74);\">343434</span></p><p><span style=\"background-color: rgb(194, 79, 74); color: rgb(0, 0, 0);\">434434433434</span></p><table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table><p><br></p><p><span style=\"color: rgb(194, 79, 74);\"><br></span></p>`)\n\n\tformList.AddField(\"Switch\", \"website\", db.Tinyint, form.Switch).\n\t\tFieldHelpMsg(\"Will not be able to access when the site was off\").\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Value: \"0\"},\n\t\t\t{Value: \"1\"},\n\t\t})\n\tformList.AddField(\"Fruit\", \"fruit\", db.Varchar, form.SelectBox).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"Apple\", Value: \"apple\"},\n\t\t\t{Text: \"Banana\", Value: \"banana\"},\n\t\t\t{Text: \"Watermelon\", Value: \"watermelon\"},\n\t\t\t{Text: \"Pear\", Value: \"pear\"},\n\t\t}).\n\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn []string{\"Pear\"}\n\t\t})\n\tformList.AddField(\"Country\", \"country\", db.Tinyint, form.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"China\", Value: \"china\"},\n\t\t\t{Text: \"America\", Value: \"america\"},\n\t\t\t{Text: \"England\", Value: \"england\"},\n\t\t\t{Text: \"Canada\", Value: \"canada\"},\n\t\t}).FieldDefault(\"china\").FieldOnChooseAjax(\"city\", \"/choose/country\",\n\t\tfunc(ctx *context.Context) (bool, string, interface{}) {\n\t\t\tcountry := ctx.FormValue(\"value\")\n\t\t\tvar data = make(selection.Options, 0)\n\t\t\tswitch country {\n\t\t\tcase \"china\":\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"Beijing\", ID: \"beijing\"},\n\t\t\t\t\t{Text: \"ShangHai\", ID: \"shanghai\"},\n\t\t\t\t\t{Text: \"GuangZhou\", ID: \"guangzhou\"},\n\t\t\t\t\t{Text: \"ShenZhen\", ID: \"shenzhen\"},\n\t\t\t\t}\n\t\t\tcase \"america\":\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"Los Angeles\", ID: \"los angeles\"},\n\t\t\t\t\t{Text: \"Washington, dc\", ID: \"washington, dc\"},\n\t\t\t\t\t{Text: \"New York\", ID: \"new york\"},\n\t\t\t\t\t{Text: \"Las Vegas\", ID: \"las vegas\"},\n\t\t\t\t}\n\t\t\tcase \"england\":\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"London\", ID: \"london\"},\n\t\t\t\t\t{Text: \"Cambridge\", ID: \"cambridge\"},\n\t\t\t\t\t{Text: \"Manchester\", ID: \"manchester\"},\n\t\t\t\t\t{Text: \"Liverpool\", ID: \"liverpool\"},\n\t\t\t\t}\n\t\t\tcase \"canada\":\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"Vancouver\", ID: \"vancouver\"},\n\t\t\t\t\t{Text: \"Toronto\", ID: \"toronto\"},\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tdata = selection.Options{\n\t\t\t\t\t{Text: \"Beijing\", ID: \"beijing\"},\n\t\t\t\t\t{Text: \"ShangHai\", ID: \"shangHai\"},\n\t\t\t\t\t{Text: \"GuangZhou\", ID: \"guangzhou\"},\n\t\t\t\t\t{Text: \"ShenZhen\", ID: \"shenZhen\"},\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true, \"ok\", data\n\t\t})\n\tformList.AddField(\"City\", \"city\", db.Varchar, form.SelectSingle).\n\t\tFieldOptionInitFn(func(val types.FieldModel) types.FieldOptions {\n\t\t\treturn types.FieldOptions{\n\t\t\t\t{Value: val.Value, Text: val.Value, Selected: true},\n\t\t\t}\n\t\t}).FieldOptions(types.FieldOptions{\n\t\t{Text: \"Beijing\", Value: \"beijing\"},\n\t\t{Text: \"ShangHai\", Value: \"shanghai\"},\n\t\t{Text: \"GuangZhou\", Value: \"guangzhou\"},\n\t\t{Text: \"ShenZhen\", Value: \"shenzhen\"},\n\t})\n\tformList.AddField(\"Gender\", \"gender\", db.Tinyint, form.Radio).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"Boy\", Value: \"0\"},\n\t\t\t{Text: \"Girl\", Value: \"1\"},\n\t\t})\n\tformList.AddField(\"Drink\", \"drink\", db.Varchar, form.Select).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"Beer\", Value: \"beer\"},\n\t\t\t{Text: \"Juice\", Value: \"juice\"},\n\t\t\t{Text: \"Water\", Value: \"water\"},\n\t\t\t{Text: \"Red bull\", Value: \"red bull\"},\n\t\t}).\n\t\tFieldDefault(\"beer\").\n\t\tFieldDisplay(func(value types.FieldModel) interface{} {\n\t\t\treturn strings.Split(value.Value, \",\")\n\t\t}).\n\t\tFieldPostFilterFn(func(value types.PostFieldModel) interface{} {\n\t\t\treturn strings.Join(value.Value, \",\")\n\t\t})\n\tformList.AddField(\"Work Experience\", \"experience\", db.Tinyint, form.SelectSingle).\n\t\tFieldOptions(types.FieldOptions{\n\t\t\t{Text: \"two years\", Value: \"0\"},\n\t\t\t{Text: \"three years\", Value: \"1\"},\n\t\t\t{Text: \"four years\", Value: \"2\"},\n\t\t\t{Text: \"five years\", Value: \"3\"},\n\t\t}).FieldDefault(\"beer\")\n\tformList.SetTabGroups(types.TabGroups{\n\t\t{\"name\", \"age\", \"homepage\", \"email\", \"birthday\", \"password\", \"ip\", \"certificate\", \"money\", \"resume\"},\n\t\t{\"website\", \"fruit\", \"country\", \"city\", \"gender\", \"drink\", \"experience\"},\n\t})\n\tformList.SetTabHeaders(\"input\", \"select\")\n\n\tformList.SetTable(\"users\").SetTitle(\"Users\").SetDescription(\"Users\")\n\n\treturn\n}\n"
  },
  {
    "path": "tests/test.go",
    "content": "package tests\n\nimport (\n\t\"net/http\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/dialect\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\t\"github.com/GoAdminGroup/go-admin/tests/common\"\n\t\"github.com/GoAdminGroup/go-admin/tests/frameworks/fasthttp\"\n\t\"github.com/gavv/httpexpect\"\n\tfasthttp2 \"github.com/valyala/fasthttp\"\n)\n\nfunc Cleaner(config config.DatabaseList) {\n\n\tcheckStatement := \"\"\n\n\tif config.GetDefault().Driver != \"sqlite\" {\n\t\tif config.GetDefault().Dsn == \"\" {\n\t\t\tcheckStatement = config.GetDefault().Name\n\t\t} else {\n\t\t\tcheckStatement = config.GetDefault().Dsn\n\t\t}\n\t} else {\n\t\tif config.GetDefault().Dsn == \"\" {\n\t\t\tcheckStatement = config.GetDefault().File\n\t\t} else {\n\t\t\tcheckStatement = config.GetDefault().Dsn\n\t\t}\n\t}\n\n\tif !strings.Contains(checkStatement, \"test\") {\n\t\tpanic(\"wrong database\")\n\t}\n\n\tvar allTables = [...]string{\n\t\t\"goadmin_users\",\n\t\t\"goadmin_user_permissions\",\n\t\t\"goadmin_session\",\n\t\t\"goadmin_roles\",\n\t\t\"goadmin_role_users\",\n\t\t\"goadmin_role_permissions\",\n\t\t\"goadmin_role_menu\",\n\t\t\"goadmin_permissions\",\n\t\t\"goadmin_operation_log\",\n\t\t\"goadmin_menu\",\n\t}\n\tvar autoIncrementTable = [...]string{\n\t\t\"goadmin_menu\",\n\t\t\"goadmin_permissions\",\n\t\t\"goadmin_roles\",\n\t\t\"goadmin_users\",\n\t}\n\tvar insertData = map[string][]dialect.H{\n\t\t\"goadmin_users\": {\n\t\t\t{\"username\": \"admin\", \"name\": \"admin\", \"password\": \"$2a$10$TEDU/aUxLkr2wCxGxI62/.yOtzrzfv426DLLdyha9H2GpWRggB0di\", \"remember_token\": \"tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh\"},\n\t\t\t{\"username\": \"operator\", \"name\": \"operator\", \"password\": \"$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.\", \"remember_token\": \"tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh\"},\n\t\t},\n\t\t\"goadmin_roles\": {\n\t\t\t{\"name\": \"Administrator\", \"slug\": \"administrator\"},\n\t\t\t{\"name\": \"Operator\", \"slug\": \"operator\"},\n\t\t},\n\t\t\"goadmin_permissions\": {\n\t\t\t{\"name\": \"All permission\", \"slug\": \"*\", \"http_method\": \"\", \"http_path\": \"*\"},\n\t\t\t{\"name\": \"Dashboard\", \"slug\": \"dashboard\", \"http_method\": \"GET,PUT,POST,DELETE\", \"http_path\": \"/\"},\n\t\t},\n\t\t\"goadmin_menu\": {\n\t\t\t{\"parent_id\": 0, \"type\": 1, \"order\": 2, \"title\": \"Admin\", \"icon\": \"fa-tasks\", \"uri\": \"\"},\n\t\t\t{\"parent_id\": 1, \"type\": 1, \"order\": 2, \"title\": \"Users\", \"icon\": \"fa-users\", \"uri\": \"/info/manager\"},\n\t\t\t{\"parent_id\": 0, \"type\": 1, \"order\": 3, \"title\": \"test2 menu\", \"icon\": \"fa-angellist\", \"uri\": \"/example/test\"},\n\t\t\t{\"parent_id\": 1, \"type\": 1, \"order\": 4, \"title\": \"Permission\", \"icon\": \"fa-ban\", \"uri\": \"/info/permission\"},\n\t\t\t{\"parent_id\": 1, \"type\": 1, \"order\": 5, \"title\": \"Menu\", \"icon\": \"fa-bars\", \"uri\": \"/menu\"},\n\t\t\t{\"parent_id\": 1, \"type\": 1, \"order\": 6, \"title\": \"Operation log\", \"icon\": \"fa-history\", \"uri\": \"/info/op\"},\n\t\t\t{\"parent_id\": 0, \"type\": 1, \"order\": 1, \"title\": \"Dashboard\", \"icon\": \"fa-bar-chart\", \"uri\": \"/\"},\n\t\t\t{\"parent_id\": 0, \"type\": 1, \"order\": 7, \"title\": \"User\", \"icon\": \"fa-users\", \"uri\": \"/info/user\"},\n\t\t},\n\t\t\"goadmin_role_users\": {\n\t\t\t{\"user_id\": 1, \"role_id\": 1},\n\t\t\t{\"user_id\": 2, \"role_id\": 2},\n\t\t},\n\t\t\"goadmin_user_permissions\": {\n\t\t\t{\"user_id\": 1, \"permission_id\": 1},\n\t\t\t{\"user_id\": 2, \"permission_id\": 2},\n\t\t},\n\t\t\"goadmin_role_permissions\": {\n\t\t\t{\"role_id\": 1, \"permission_id\": 1},\n\t\t\t{\"role_id\": 1, \"permission_id\": 2},\n\t\t\t{\"role_id\": 2, \"permission_id\": 2},\n\t\t},\n\t\t\"goadmin_role_menu\": {\n\t\t\t{\"role_id\": 1, \"menu_id\": 1},\n\t\t\t{\"role_id\": 1, \"menu_id\": 7},\n\t\t\t{\"role_id\": 2, \"menu_id\": 7},\n\t\t\t{\"role_id\": 1, \"menu_id\": 8},\n\t\t\t{\"role_id\": 2, \"menu_id\": 8},\n\t\t\t{\"role_id\": 1, \"menu_id\": 3},\n\t\t},\n\t}\n\tconn := db.GetConnectionByDriver(config.GetDefault().Driver).InitDB(config)\n\t// clean data\n\tfor _, t := range allTables {\n\t\t_ = db.WithDriver(conn).Table(t).Delete()\n\t}\n\t// reset auto increment\n\tswitch config.GetDefault().Driver {\n\tcase db.DriverMysql:\n\t\tfor _, t := range autoIncrementTable {\n\t\t\tcheckErr(conn.Exec(`ALTER TABLE ` + t + ` AUTO_INCREMENT = 1`))\n\t\t}\n\tcase db.DriverMssql:\n\t\tfor _, t := range autoIncrementTable {\n\t\t\tcheckErr(conn.Exec(`DBCC CHECKIDENT (` + t + `, RESEED, 0)`))\n\t\t}\n\tcase db.DriverPostgresql:\n\t\tfor _, t := range autoIncrementTable {\n\t\t\tcheckErr(conn.Exec(`ALTER SEQUENCE ` + t + `_myid_seq RESTART WITH  1`))\n\t\t}\n\tcase db.DriverSqlite:\n\t\tfor _, t := range autoIncrementTable {\n\t\t\tcheckErr(conn.Exec(`update sqlite_sequence set seq = 0 where name = '` + t + `'`))\n\t\t}\n\t}\n\t// insert data\n\tfor t, data := range insertData {\n\t\tfor _, d := range data {\n\t\t\tcheckErr(db.WithDriver(conn).Table(t).Insert(d))\n\t\t}\n\t}\n}\n\nfunc BlackBoxTestSuitOfBuiltInTables(t *testing.T, fn HandlerGenFn, config config.DatabaseList, isFasthttp ...bool) {\n\tBlackBoxTestSuit(t, fn, config, nil, Cleaner, common.Test, isFasthttp...)\n}\n\nfunc checkErr(_ interface{}, err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc BlackBoxTestSuit(t *testing.T, fn HandlerGenFn,\n\tconfig config.DatabaseList,\n\tgens table.GeneratorList,\n\tcleaner DataCleaner,\n\ttester Tester, isFasthttp ...bool) {\n\t// Clean Data\n\tcleaner(config)\n\t// Test\n\tif len(isFasthttp) > 0 && isFasthttp[0] {\n\t\ttester(httpexpect.WithConfig(httpexpect.Config{\n\t\t\tClient: &http.Client{\n\t\t\t\tTransport: httpexpect.NewFastBinder(fasthttp.NewHandler(config, gens)),\n\t\t\t\tJar:       httpexpect.NewJar(),\n\t\t\t},\n\t\t\tReporter: httpexpect.NewAssertReporter(t),\n\t\t}))\n\t} else {\n\t\ttester(httpexpect.WithConfig(httpexpect.Config{\n\t\t\tClient: &http.Client{\n\t\t\t\tTransport: httpexpect.NewBinder(fn(config, gens)),\n\t\t\t\tJar:       httpexpect.NewJar(),\n\t\t\t},\n\t\t\tReporter: httpexpect.NewAssertReporter(t),\n\t\t}))\n\t}\n}\n\ntype Tester func(e *httpexpect.Expect)\ntype DataCleaner func(config config.DatabaseList)\ntype HandlerGenFn func(config config.DatabaseList, gens table.GeneratorList) http.Handler\ntype FasthttpHandlerGenFn func(config config.DatabaseList, gens table.GeneratorList) fasthttp2.RequestHandler\n"
  },
  {
    "path": "tests/test_test.go",
    "content": "package tests\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/tests/frameworks/gin\"\n)\n\nfunc TestBlackBoxTestSuitOfBuiltInTables(t *testing.T) {\n\tBlackBoxTestSuitOfBuiltInTables(t, gin.NewHandler, config.DatabaseList{\n\t\t\"default\": {\n\t\t\tHost:            \"127.0.0.1\",\n\t\t\tPort:            \"3306\",\n\t\t\tUser:            \"root\",\n\t\t\tPwd:             \"root\",\n\t\t\tName:            \"go-admin-test\",\n\t\t\tMaxIdleConns:    50,\n\t\t\tMaxOpenConns:    150,\n\t\t\tConnMaxLifetime: time.Hour,\n\t\t\tConnMaxIdleTime: 0,\n\t\t\tDriver:          config.DriverMysql,\n\t\t},\n\t})\n}\n"
  },
  {
    "path": "tests/web/README_CN.md",
    "content": "# 测试功能清单\n\n列举详尽的功能测试清单。\n\n## 登录\n\n- [x] 输入正确的账号密码\n- [ ] 输入错误的账号密码\n- [ ] 带验证码的登录页面正常登录\n\n## 导航栏与侧边栏\n\n- [x] 导航栏菜单的显示点击与关闭\n- [ ] 导航栏菜单过长情况的判断\n- [ ] 导航栏功能按钮的点击\n\n## 表格页面\n\n### 功能按钮\n\n- [x] 表格功能按钮，弹出按钮的点击显示关闭\n- [x] 表格功能按钮，Ajax按钮的点击显示关闭\n- [x] 表格功能按钮，下拉选择按钮的点击\n\n### 行更新\n\n- [x] 表格项文本更新功能\n- [ ] 表格项选择更新功能\n\n### 筛选框\n\n- [x] 筛选框显示\n- [x] 筛选框文本筛选功能\n- [ ] 筛选框选择筛选功能\n\n### 导出功能\n\n- [x] 导出按钮，导出当前页\n- [ ] 导出按钮，导出全部\n- [ ] 导出按钮，导出选择的\n\n### 列选择\n\n- [x] 列选择按钮显示选择点击\n\n### 列排序\n\n- [x] 列排序按钮，正序\n- [x] 列排序按钮，倒序\n\n### 列功能按钮\n\n- [x] 列功能按钮，弹出操作点击显示关闭\n- [x] 列功能按钮，Ajax操作点击显示关闭\n\n### 按钮的隐藏\n\n- [ ] 筛选框的隐藏\n- [ ] 新建按钮的隐藏\n- [ ] 导出按钮的隐藏\n- [ ] 编辑按钮的隐藏\n- [ ] 删除按钮的隐藏\n- [ ] 详情按钮的隐藏\n- [ ] 筛选按钮的隐藏\n- [ ] 列选择按钮的隐藏\n- [ ] 分页条的隐藏\n- [ ] 查询信息的隐藏\n\n### 列的显示\n\n- [ ] 标签的显示 FieldLabel\n- [ ] 图片的显示 FieldImage\n- [ ] bool值的显示 FieldBool\n- [ ] 链接的显示 FieldLink\n- [ ] 文件大小的显示 FieldFileSize\n- [ ] 日期的显示 FieldDate\n- [ ] icon的显示 FieldIcon\n- [ ] 点的显示 FieldDot\n- [ ] 进度条的显示 FieldProgressBar\n- [ ] loading的显示 FieldLoading\n- [ ] 下载链接的显示 FieldDownLoadable\n- [ ] 可复制文本的显示 FieldCopyable\n- [ ] 图片轮播的显示 FieldCarousel\n- [ ] 二维码的显示 FieldQrcode\n\n## 表单页面\n\n### 组件显示\n\n- [x] 单选的点击显示选择\n- [x] 多选的点击显示选择\n- [x] selectbox的点击显示选择\n- [x] 文本框的输入\n- [ ] 富文本的输入编辑保存\n- [ ] 单/多文件选择\n- [ ] 时间选择组件的选择\n- [ ] 时间选择范围组件的选择\n- [ ] Array组件的点击显示编辑\n- [ ] Table组件的点击显示编辑\n- [ ] IconPicker组件的选择\n- [ ] 滑动组件的点击\n- [ ] 代码组件的编辑\n- [ ] 数字组件的点击\n- [ ] 数字范围组件的点击\n- [ ] 自定义字段的编辑\n\n### 按钮显示\n\n- [x] 保存错误框显示\n- [x] 重设按钮的点击\n- [x] 继续编辑的选择\n\n### 联动\n\n- [ ] chooseMapJS\n- [ ] chooseJS\n- [ ] chooseAjax\n- [ ] chooseHideJS\n- [ ] chooseShowJS\n- [ ] chooseDisableJS\n\n## 详情页\n\n## 权限的增删改查\n\n## 角色的增删改查\n\n## 管理员的增删改查\n\n- [x] 新建管理员\n- [x] 新建管理员正常登录\n\n## 菜单的增删改查\n\n- [x] 新建菜单\n- [x] 删除菜单\n- [ ] 改变菜单顺序\n- [ ] 三级菜单的新建与显示"
  },
  {
    "path": "tests/web/config.json",
    "content": "{\n  \"database\": {\n    \"default\": {\n      \"host\": \"db_mysql\",\n      \"port\": \"3306\",\n      \"user\": \"root\",\n      \"pwd\": \"root\",\n      \"name\": \"go-admin-test\",\n      \"max_idle_con\": 50,\n      \"max_open_con\": 150,\n      \"driver\": \"mysql\"\n    }\n  },\n  \"domain\": \"localhost\",\n  \"prefix\": \"admin\",\n  \"store\": {\n    \"path\": \"./uploads\",\n    \"prefix\": \"uploads\"\n  },\n  \"env\": \"local\",\n  \"language\": \"en\",\n  \"index\": \"/\",\n  \"access_log_off\": true,\n  \"debug\": false,\n  \"color_scheme\": \"skin-black\"\n}"
  },
  {
    "path": "tests/web/page.go",
    "content": "package web\n\nimport (\n\t\"fmt\"\n\t\"runtime/debug\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/sclevine/agouti\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype Page struct {\n\t*agouti.Page\n\tT      *testing.T\n\tDriver *agouti.WebDriver\n\tQuit   chan struct{}\n}\n\nfunc (page *Page) Destroy() {\n\tif r := recover(); r != nil {\n\t\tdebug.PrintStack()\n\t\tfmt.Println(\"Recovered in f\", r)\n\t\t_ = page.Page.Destroy()\n\t\t_ = page.Driver.Stop()\n\t\tpage.T.Fail()\n\t\tpage.Quit <- struct{}{}\n\t}\n}\n\nfunc (page *Page) Wait(t int) {\n\ttime.Sleep(time.Duration(t) * time.Second)\n}\n\nfunc (page *Page) Contain(s string) {\n\tcontent, err := page.HTML()\n\tassert.Equal(page.T, err, nil)\n\tassert.Equal(page.T, strings.Contains(content, s), true)\n}\n\nfunc (page *Page) NoContain(s string) {\n\tcontent, err := page.HTML()\n\tassert.Equal(page.T, err, nil)\n\tassert.Equal(page.T, strings.Contains(content, s), false)\n}\n\nfunc (page *Page) Css(xpath, css, res string) {\n\tstyle, err := page.FindByXPath(xpath).CSS(css)\n\tassert.Equal(page.T, err, nil)\n\tassert.Equal(page.T, style, res)\n}\n\nfunc (page *Page) CssS(s *agouti.Selection, css, res string) {\n\tstyle, err := s.CSS(css)\n\tassert.Equal(page.T, err, nil)\n\tassert.Equal(page.T, style, res)\n}\n\nfunc (page *Page) Text(xpath, text string) {\n\tmli1, err := page.FindByXPath(xpath).Text()\n\tassert.Equal(page.T, err, nil)\n\tassert.Equal(page.T, mli1, text)\n}\n\nfunc (page *Page) MoveMouseBy(xOffset, yOffset int) {\n\tassert.Equal(page.T, page.Page.MoveMouseBy(xOffset, yOffset), nil)\n}\n\nfunc (page *Page) Display(xpath string) {\n\tpage.Css(xpath, \"display\", \"block\")\n}\n\nfunc (page *Page) Nondisplay(xpath string) {\n\tpage.Css(xpath, \"display\", \"none\")\n}\n\nfunc (page *Page) Value(xpath, value string) {\n\tval, err := page.FindByXPath(xpath).Attribute(\"value\")\n\tassert.Equal(page.T, err, nil)\n\tassert.Equal(page.T, val, value)\n}\n\nfunc (page *Page) Click(xpath string, intervals ...int) {\n\tassert.Equal(page.T, page.FindByXPath(xpath).Click(), nil)\n\tinterval := 1\n\tif len(intervals) > 0 {\n\t\tinterval = intervals[0]\n\t}\n\tpage.Wait(interval)\n}\n\nfunc (page *Page) ClickS(s *agouti.Selection, intervals ...int) {\n\tassert.Equal(page.T, s.Click(), nil)\n\tinterval := 1\n\tif len(intervals) > 0 {\n\t\tinterval = intervals[0]\n\t}\n\tpage.Wait(interval)\n}\n\nfunc (page *Page) Attr(s *agouti.Selection, attr, res string) {\n\tstyle, err := s.Attribute(attr)\n\tassert.Equal(page.T, err, nil)\n\tassert.Equal(page.T, style, res)\n}\n\nfunc (page *Page) Fill(xpath, content string) {\n\tassert.Equal(page.T, page.FindByXPath(xpath).Fill(content), nil)\n}\n\nfunc (page *Page) NavigateTo(path string) {\n\tassert.Equal(page.T, page.Navigate(path), nil)\n\tpage.Wait(2)\n}\n"
  },
  {
    "path": "tests/web/test.go",
    "content": "package web\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/mgutz/ansi\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gin\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/sclevine/agouti\"\n)\n\ntype Testers func(t *testing.T, page *Page)\ntype ServerStarter func(quit chan struct{})\n\n// UserAcceptanceTestSuit make sure the chromedriver version Is corresponding to the\n// chrome version. Using the following link to get the latest version of Chrome and ChromeDriver.\n// https://googlechromelabs.github.io/chrome-for-testing/\nfunc UserAcceptanceTestSuit(t *testing.T, testers Testers, serverStarter ServerStarter, local bool, options ...string) {\n\tvar quit = make(chan struct{})\n\tgo serverStarter(quit)\n\n\tif len(options) == 0 {\n\t\toptions = []string{\n\t\t\t\"--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36\",\n\t\t\t\"--window-size=1500,900\",\n\t\t\t\"--incognito\",\n\t\t\t\"--blink-settings=imagesEnabled=true\",\n\t\t\t\"--no-default-browser-check\",\n\t\t\t\"--ignore-ssl-errors=true\",\n\t\t\t\"--ssl-protocol=any\",\n\t\t\t\"--no-sandbox\",\n\t\t\t\"--disable-breakpad\",\n\t\t\t\"--disable-gpu\",\n\t\t\t\"--disable-logging\",\n\t\t\t\"--no-zygote\",\n\t\t\t\"--allow-running-insecure-content\",\n\t\t}\n\t\tif !local {\n\t\t\toptions = append(options, \"--headless\")\n\t\t}\n\t}\n\n\tdriver := agouti.ChromeDriver(\n\t\tagouti.ChromeOptions(\"args\", options),\n\t\tagouti.Desired(\n\t\t\tagouti.Capabilities{\n\t\t\t\t\"loggingPrefs\": map[string]string{\n\t\t\t\t\t\"performance\": \"ALL\",\n\t\t\t\t},\n\t\t\t\t\"acceptSslCerts\":      true,\n\t\t\t\t\"acceptInsecureCerts\": true,\n\t\t\t},\n\t\t))\n\terr := driver.Start()\n\tif err != nil {\n\t\tpanic(\"failed to start driver, error: \" + err.Error())\n\t}\n\n\tpage, err := driver.NewPage()\n\tif err != nil {\n\t\tpanic(\"failed to open page, error: \" + err.Error())\n\t}\n\n\tfmt.Println()\n\tfmt.Println(\"============================================\")\n\tprintlnWithColor(\"User Acceptance Testing\", \"blue\")\n\tfmt.Println(\"============================================\")\n\tfmt.Println()\n\n\ttesters(t, &Page{T: t, Page: page, Driver: driver, Quit: quit})\n\n\twait(2)\n\n\tif !local {\n\t\terr = page.CloseWindow()\n\t\tif err != nil {\n\t\t\tfmt.Println(\"failed to close page, error: \", err)\n\t\t}\n\n\t\terr = page.Destroy()\n\t\tif err != nil {\n\t\t\tfmt.Println(\"failed to destroy page, error: \", err)\n\t\t}\n\n\t\terr = driver.Stop()\n\t\tif err != nil {\n\t\t\tfmt.Println(\"failed to stop driver, error: \", err)\n\t\t}\n\t}\n\n\tquit <- struct{}{}\n}\n\nfunc printlnWithColor(msg string, color string) {\n\tfmt.Println(ansi.Color(msg, color))\n}\n\nfunc printPart(part string) {\n\tprintlnWithColor(\"> \"+part, colorBlue)\n}\n\nfunc wait(t int) {\n\ttime.Sleep(time.Duration(t) * time.Second)\n}\n\nconst basePath = \"http://localhost:9033\"\n\nfunc url(suffix string) string {\n\tif suffix == \"/\" {\n\t\tsuffix = \"\"\n\t}\n\treturn basePath + \"/admin\" + suffix\n}\n\nconst (\n\tcolorBlue  = \"blue\"\n\tcolorGreen = \"green\"\n)\n"
  },
  {
    "path": "tests/web/web_test.go",
    "content": "package web\n\nimport (\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"testing\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gin\"\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n\t_ \"github.com/GoAdminGroup/themes/adminlte\"\n\n\t\"github.com/GoAdminGroup/go-admin/engine\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin\"\n\t\"github.com/GoAdminGroup/go-admin/template\"\n\t\"github.com/GoAdminGroup/go-admin/template/chartjs\"\n\t\"github.com/GoAdminGroup/go-admin/tests/tables\"\n\t\"github.com/gin-gonic/gin\"\n)\n\nconst (\n\t// Info Table Page\n\n\tnewPageBtn              = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[1]/div/div[3]/a`\n\teditPageBtn             = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[8]/div/ul/li[1]/a`\n\tgenderActionDropDown    = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[1]/div/div[7]/div/span/span[1]/span/span[2]`\n\tmenOptionActionBtn      = `/html/body/span/span/span[2]/ul/li[2]`\n\tidOrderBtn              = `//*[@id=\"sort-id\"]`\n\trowActionDropDown       = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[8]/div/div/a`\n\tpopupBtn                = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[1]/div/div[5]/a`\n\tpopup                   = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[4]/div[3]`\n\tpopupCloseBtn           = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[4]/div[3]/div/div/div[3]/button`\n\tajaxBtn                 = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[1]/div/div[6]/a`\n\tajaxAlert               = `/html/body/div[3]`\n\tselectionDropDown       = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div[2]/div/div/div[1]/div/span/span[1]/span/span[2]`\n\tselectionLi1            = `/html/body/span/span/span[2]/ul/li[1]`\n\tselectionLi2            = `/html/body/span/span/span[2]/ul/li[2]`\n\tselectionRes            = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div[2]/div/div/div[1]/div/span/span[1]/span/span[1]`\n\tmultiSelectInput        = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div[1]/div/div/div[2]/div/span/span[1]/span/ul/li/input`\n\tmultiSelectLi1          = `/html/body/span/span/span/ul/li[1]`\n\tmultiSelectLi2          = `/html/body/span/span/span/ul/li[2]`\n\tmultiSelectLi3          = `/html/body/span/span/span/ul/li[3]`\n\tmultiSelectRes          = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div[1]/div/div/div[2]/div/span/span[1]/span/ul/li[1]`\n\tfilterNameField         = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div[1]/div/div/div[1]/div/div/input`\n\tfilterCreatedStart      = `//*[@id=\"created_at_start__goadmin\"]`\n\tfilterCreatedEnd        = `//*[@id=\"created_at_end__goadmin\"]`\n\tradio                   = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div[3]/div/div/div[1]/div/div[1]`\n\tsearchBtn               = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[2]/div[2]/div[1]/button`\n\tfilterResetBtn          = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[2]/div[2]/div[2]/a`\n\trowSelector             = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[1]/div/div[1]/button`\n\trowSelectCityCheckbox   = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[1]/div/div[1]/ul/li[1]/ul/li[4]/label/div`\n\trowSelectAvatarCheckbox = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[1]/div/div[1]/ul/li[1]/ul/li[5]/label/div`\n\tactionDropDown          = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[1]/div`\n\texportBtn               = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[1]/span/div/button`\n\tpreviewAction           = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[8]/div/ul/li[7]/a`\n\tclosePreviewAction      = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[4]/div[2]/div/div/div[3]/button`\n\tpreviewPopup            = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[4]/div[2]`\n\trowAjaxAction           = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[8]/div/ul/li[6]/a`\n\trowAjaxPopup            = `/html/body/div[3]`\n\tcloseRowAjaxPopup       = `/html/body/div[3]/div[7]/div/button`\n\tupdateNameTd            = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[3]/a`\n\tupdateNameInput         = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[3]/div/div[2]/div/form/div/div[1]/div[1]/input`\n\tupdateNameSaveBtn       = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[3]/div/div[2]/div/form/div/div[1]/div[2]/button[1]`\n\tupdateGenderBtn         = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[4]/div/div/span[1]`\n\tdetailBtn               = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[3]/table/tbody/tr[2]/td[10]/a`\n\n\t// Form Page\n\n\tsaveBtn            = `//*[@id=\"pjax-container\"]/section[2]/div/form/div[2]/div[2]/div[1]/button`\n\tresetBtn           = `//*[@id=\"pjax-container\"]/section[2]/div/form/div[2]/div[2]/div[2]/button`\n\tnameField          = `//*[@id=\"tab-form-0\"]/div[1]/div/div/input`\n\tageField           = `//*[@id=\"tab-form-0\"]/div[2]/div/div/div/input`\n\temailField         = `//*[@id=\"tab-form-0\"]/div[4]/div/div/input`\n\tbirthdayField      = `//*[@id=\"tab-form-0\"]/div[5]/div/div/input`\n\tpasswordField      = `//*[@id=\"tab-form-0\"]/div[6]/div/div/input`\n\thomePageField      = `//*[@id=\"tab-form-0\"]/div[3]/div/div/input`\n\tipField            = `//*[@id=\"tab-form-0\"]/div[7]/div/div/input`\n\tamountField        = `//*[@id=\"tab-form-0\"]/div[9]/div/div/input`\n\tappleOptField      = `//*[@id=\"bootstrap-duallistbox-nonselected-list_fruit[]\"]/option[1]`\n\tbananaOptField     = `//*[@id=\"bootstrap-duallistbox-nonselected-list_fruit[]\"]/option[2]`\n\twatermelonOptField = `//*[@id=\"bootstrap-duallistbox-nonselected-list_fruit[]\"]/option[3]`\n\t//pearOptField          = `//*[@id=\"bootstrap-duallistbox-nonselected-list_fruit[]\"]/option[4]`\n\tgenderBoyCheckBox     = `//*[@id=\"tab-form-1\"]/div[5]/div/div/div[1]`\n\tgenderGirlCheckBox    = `//*[@id=\"tab-form-1\"]/div[5]/div/div/div[2]`\n\texperienceDropDown    = `//*[@id=\"tab-form-1\"]/div[7]/div/span/span[1]/span/span[2]`\n\ttwoYearsSelection     = `/html/body/span/span/span[2]/ul/li[1]`\n\tthreeYearsSelection   = `/html/body/span/span/span[2]/ul/li[2]`\n\tfourYearsSelection    = `/html/body/span/span/span[2]/ul/li[3]`\n\tfiveYearsSelection    = `/html/body/span/span/span[2]/ul/li[4]`\n\tinputTab              = `//*[@id=\"pjax-container\"]/section[2]/div/form/div[1]/div/div/ul/li[1]`\n\tselectTab             = `//*[@id=\"pjax-container\"]/section[2]/div/form/div[1]/div/div/ul/li[2]`\n\tmultiSelectionInput   = `//*[@id=\"tab-form-1\"]/div[6]/div/span/span[1]/span/ul/li[2]/input`\n\tmultiSelectedOpt      = `//*[@id=\"tab-form-1\"]/div[6]/div/span/span[1]/span/ul/li[1]`\n\tmultiBeerOpt          = `/html/body/span/span/span/ul/li[1]`\n\tmultiJuiceOpt         = `/html/body/span/span/span/ul/li[2]`\n\tmultiWaterOpt         = `/html/body/span/span/span/ul/li[3]`\n\tmultiRedBullOpt       = `/html/body/span/span/span/ul/li[4]`\n\tcontinueEditCheckBox  = `//*[@id=\"pjax-container\"]/section[2]/div/form/div[2]/div[2]/label/div`\n\tboxSelectedOpt        = `//*[@id=\"bootstrap-duallistbox-selected-list_fruit[]\"]/option`\n\texperienceSelectedOpt = `//*[@id=\"tab-form-1\"]/div[7]/div/span/span[1]/span/span[1]`\n\n\tsideBarManageDropDown    = `/html/body/div[1]/aside/section/ul/li[2]/a/span[2]`\n\tmenuPageBtn              = `/html/body/div[1]/aside/section/ul/li[2]/ul/li[4]/a`\n\tmenuParentIdDropDown     = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/div/div[2]/form/div[1]/div/div/div[1]/div/span/span[1]/span/span[2]`\n\tparentIdRootOpt          = `/html/body/span/span/span[2]/ul/li[1]`\n\tparentIdDashboardOpt     = `/html/body/span/span/span[2]/ul/li[2]`\n\tparentIdAdminOpt         = `/html/body/span/span/span[2]/ul/li[3]`\n\tparentIdUserOpt          = `/html/body/span/span/span[2]/ul/li[4]`\n\tmenuRoleDropDown         = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/div/div[2]/form/div[1]/div/div/div[6]/div/span/span[1]/span`\n\tmenuRoleAdminOpt         = `/html/body/span/span/span/ul/li[1]`\n\tmenuRoleOperatorOpt      = `/html/body/span/span/span/ul/li[2]`\n\ticonPopupBtn             = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/div/div[2]/form/div[1]/div/div/div[4]/div/div[1]/span`\n\ticonPopup                = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/div/div[2]/form/div[1]/div/div/div[4]/div/div[2]`\n\ticonBtn                  = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/div/div[2]/form/div[1]/div/div/div[4]/div/div[2]/div[3]/div/div/a[5]`\n\tmenuNameInput            = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/div/div[2]/form/div[1]/div/div/div[2]/div/div/input`\n\tmenuUriInput             = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/div/div[2]/form/div[1]/div/div/div[5]/div/div/input`\n\tmenuInfoSaveBtn          = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/div/div[2]/form/div[2]/div[2]/div[1]/button`\n\ttestMenuItem             = `//*[@id=\"tree-model\"]/ol/li[2]`\n\ttestMenuDeleteBtn        = `//*[@id=\"tree-model\"]/ol/li[2]/div/span/a[2]`\n\ttestMenuDeleteConfirmBtn = `/html/body/div[3]/div[7]/div/button`\n\tmenuOkBtn                = `/html/body/div[3]/div[7]/div/button`\n\tuserMenuEditBtn          = `//*[@id=\"tree-model\"]/ol/li[3]/div/span/a[1]`\n\theadFieldInput           = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[4]/div/div/input`\n\tmenuEditSaveBtn          = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[2]/div[2]/div[1]/button`\n\n\tmanagerPageBtn               = `/html/body/div[1]/aside/section/ul/li[2]/ul/li[1]/a`\n\trolesPageBtn                 = `/html/body/div[1]/aside/section/ul/li[2]/ul/li[2]/a`\n\tpermissionPageBtn            = `/html/body/div[1]/aside/section/ul/li[2]/ul/li[3]/a`\n\toperationLogPageBtn          = `/html/body/div[1]/aside/section/ul/li[2]/ul/li[5]/a`\n\tnavLinkBtn                   = `//*[@id=\"firstnav\"]/div[2]/ul/li[1]/a`\n\tnavCloseBtn                  = `//*[@id=\"firstnav\"]/div[2]/ul/li[1]/i`\n\tuserPageBtn                  = `/html/body/div[1]/aside/section/ul/li[3]/a`\n\tmanagerEditBtn               = `//*[@id=\"pjax-container\"]/section[2]/div/div[2]/div[2]/table/tbody/tr[3]/td[8]/a[1]`\n\toperatorEditBtn              = `//*[@id=\"pjax-container\"]/section[2]/div/div[2]/div[2]/table/tbody/tr[2]/td[8]/a[1]`\n\tmanagerNameField             = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[2]/div/div/input`\n\tmanagerNickNameField         = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[3]/div/div/input`\n\tmanagerRoleSelectedOpt       = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[5]/div/span[1]/span[1]/span/ul/li[1]`\n\tmanagerPermissionSelectedOpt = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[6]/div/span[1]/span[1]/span/ul/li[1]`\n\tmanagerRoleDropDown          = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[5]/div/span[1]/span[1]/span/ul`\n\tmanagerRoleOpt2              = `/html/body/span/span/span/ul/li[2]`\n\tmanagerPermissionDropDown    = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[6]/div/span[1]/span[1]/span`\n\tmanagerPermissionOpt2        = `/html/body/span/span/span/ul/li[2]`\n\tmanagerSaveBtn               = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[2]/div[2]/div[1]/button`\n\tnewPermissionBtn             = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[6]/div/span[2]/a`\n\tmanagerUserViewSelectOpt     = `/html/body/span/span/span/ul/li[3]`\n\n\tpermissionNameInput    = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[1]/div/div/input`\n\tpermissionSlugInput    = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[2]/div/div/input`\n\tpermissionMethodSelect = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[3]/div/span[1]/span[1]/span/ul/li/input`\n\tpermissionGetSelectOpt = `/html/body/span/span/span/ul/li[1]`\n\tpermissionPathInput    = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[1]/div/div/div[4]/div/textarea`\n\tpermissionSaveBtn      = `//*[@id=\"pjax-container\"]/section[2]/div/div/div[2]/form/div[2]/div[2]/div[1]/button`\n\n\tuserNavMenuBtn = `//*[@id=\"firstnav\"]/div[4]/ul/li[5]/a`\n\tuserSettingBtn = `//*[@id=\"firstnav\"]/div[4]/ul/li[5]/ul/li[5]/a`\n\tuserSignOutBtn = `//*[@id=\"firstnav\"]/div[4]/ul/li[5]/ul/li[6]/a`\n\n\tloginPageUserNameInput = `//*[@id=\"username\"]`\n\tloginPagePasswordInput = `//*[@id=\"password\"]`\n)\n\nvar (\n\tdebugMode  = false\n\toptionList = []string{\n\t\t\"--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36\",\n\t\t\"--window-size=1500,900\",\n\t\t\"--incognito\",\n\t\t\"--blink-settings=imagesEnabled=true\",\n\t\t\"--no-default-browser-check\",\n\t\t\"--ignore-ssl-errors=true\",\n\t\t\"--ssl-protocol=any\",\n\t\t\"--no-sandbox\",\n\t\t\"--disable-breakpad\",\n\t\t\"--disable-gpu\",\n\t\t\"--disable-logging\",\n\t\t\"--no-zygote\",\n\t\t\"--allow-running-insecure-content\",\n\t}\n)\n\nconst (\n\tport = \":9033\"\n)\n\nfunc init() {\n\tif os.Args[len(os.Args)-1] == \"true\" {\n\t\tdebugMode = true\n\t}\n\tif !debugMode {\n\t\toptionList = append(optionList, \"--headless\")\n\t}\n}\n\nfunc startServer(quit chan struct{}) {\n\n\tif !debugMode {\n\t\tgin.SetMode(gin.ReleaseMode)\n\t\tgin.DefaultWriter = io.Discard\n\t}\n\n\tr := gin.New()\n\n\teng := engine.Default()\n\n\tadminPlugin := admin.NewAdmin(tables.Generators)\n\tadminPlugin.AddGenerator(\"user\", tables.GetUserTable)\n\n\ttemplate.AddComp(chartjs.NewChart())\n\n\tcfg := config.ReadFromJson(\"./config.json\")\n\tif debugMode {\n\t\tcfg.SqlLog = true\n\t\tcfg.Debug = true\n\t\tcfg.AccessLogOff = false\n\t}\n\n\tif err := eng.AddConfig(&cfg).\n\t\tAddPlugins(adminPlugin).\n\t\tUse(r); err != nil {\n\t\tpanic(err)\n\t}\n\n\teng.HTML(\"GET\", \"/admin\", tables.GetContent)\n\n\tr.Static(\"/uploads\", \"./uploads\")\n\n\tgo func() {\n\t\t_ = r.Run(port)\n\t}()\n\n\t<-quit\n\tlog.Print(\"closing database connection\")\n\teng.MysqlConnection().Close()\n}\n\nfunc TestWeb(t *testing.T) {\n\tUserAcceptanceTestSuit(t, func(_ *testing.T, page *Page) {\n\t\tdefer page.Destroy()\n\t\ttestLogin(page)\n\t\ttestInfoTablePageOperations(page)\n\t\ttestNewPageOperations(page)\n\t\ttestEditPageOperations(page)\n\t\ttestDetailPageOperations(page)\n\t\ttestRolePageOperations(page)\n\t\ttestPermissionPageOperations(page)\n\t\ttestMenuPageOperations(page)\n\t\ttestManagerPageOperations(page)\n\t\ttestPermission(page)\n\t}, startServer, debugMode, optionList...)\n}\n\nfunc testLogin(page *Page) {\n\tpage.NavigateTo(url(\"/login\"))\n\n\tpage.Fill(loginPageUserNameInput, \"admin\")\n\tpage.Fill(loginPagePasswordInput, \"admin\")\n\tpage.ClickS(page.FindByButton(\"Login\"))\n\n\twait(3)\n\n\tpage.Contain(\"main-header\")\n}\n\nfunc testInfoTablePageOperations(page *Page) {\n\n\t// Nav link Check\n\t// =============================\n\n\t//printPart(\"nav link check\")\n\t//page.Click(sideBarManageDropDown)\n\t//page.Click(managerPageBtn)\n\t//page.Click(rolesPageBtn)\n\t//page.Click(permissionPageBtn)\n\t//page.Click(menuPageBtn)\n\t//page.Click(operationLogPageBtn)\n\t//page.Click(navLinkBtn)\n\t//page.Click(navCloseBtn)\n\t//page.Click(navLinkBtn)\n\t//page.Click(navCloseBtn)\n\t//page.Click(navLinkBtn)\n\t//page.Click(navCloseBtn)\n\t//page.Click(navLinkBtn)\n\t//page.Click(navCloseBtn)\n\t//page.Click(navLinkBtn)\n\t//page.Click(navCloseBtn)\n\n\tpage.NavigateTo(url(\"/info/user\"))\n\n\tpage.Contain(\"Users\")\n\n\t// Buttons Check\n\t// =============================\n\n\tprintPart(\"buttons check\")\n\n\tpage.Click(popupBtn)\n\n\tpage.Display(popup)\n\n\twait(1)\n\n\tpage.Contain(\"hello world\")\n\tpage.Click(popupCloseBtn)\n\n\tpage.Nondisplay(popup)\n\n\tpage.Click(ajaxBtn)\n\n\tpage.Contain(\"Oh li get\")\n\n\tpage.Display(ajaxAlert)\n\n\tpage.ClickS(page.FindByButton(\"OK\"))\n\n\tpage.Nondisplay(ajaxAlert)\n\n\t// Update Check\n\t// =============================\n\n\tprintPart(\"update check\")\n\tpage.Click(updateNameTd)\n\tpage.Fill(updateNameInput, \"DukeDukeDuke\")\n\tpage.Click(updateNameSaveBtn)\n\tpage.Click(updateGenderBtn)\n\tpage.Contain(\"DukeDukeDuke\")\n\n\t// Filter Area Check\n\t// =============================\n\n\tprintPart(\"filter area check\")\n\n\tpage.Click(selectionDropDown)\n\n\tpage.Text(selectionLi1, \"men\")\n\tpage.Text(selectionLi2, \"women\")\n\n\tpage.Click(selectionLi2)\n\n\tpage.Attr(page.FindByXPath(selectionRes), \"title\", \"women\")\n\n\tpage.Fill(multiSelectInput, \" \")\n\n\twait(1)\n\n\tpage.Text(multiSelectLi1, \"water\")\n\tpage.Text(multiSelectLi2, \"juice\")\n\tpage.Text(multiSelectLi3, \"red bull\")\n\n\tpage.Click(multiSelectLi3)\n\n\tpage.Attr(page.FindByXPath(multiSelectRes), \"title\", \"red bull\")\n\n\tpage.Click(radio)\n\n\tpage.Fill(filterNameField, \"Jack\")\n\n\t//page.Fill(filterCreatedStart, \"2020-03-08 15:24:00\")\n\t//page.Click(filterCreatedEnd)\n\n\tpage.Click(searchBtn, 2)\n\n\tpage.Click(filterResetBtn, 2)\n\n\t// Row Selector Check\n\t// =============================\n\n\tprintPart(\"row selector check\")\n\n\tpage.Click(rowSelector)\n\tpage.Click(rowSelectCityCheckbox)\n\tpage.Click(rowSelectAvatarCheckbox)\n\n\tpage.ClickS(page.FindByButton(\"Submit\"), 2)\n\n\tpage.NoContain(\"guangzhou\")\n\n\tpage.ClickS(page.FindByID(\"filter-btn\"))\n\n\tpage.CssS(page.FindByClass(\"filter-area\"), \"display\", \"none\")\n\n\t// Export Check\n\t// =============================\n\n\tprintPart(\"row export check\")\n\n\tpage.ClickS(page.FindByXPath(actionDropDown))\n\tpage.ClickS(page.FindByXPath(exportBtn))\n\tpage.ClickS(page.FindByClass(`grid-batch-1`))\n\n\t// Order Check\n\n\tprintPart(\"order check\")\n\n\tpage.Click(idOrderBtn)\n\tpage.Click(idOrderBtn)\n\n\t// Action Button Check\n\t// =============================\n\n\tprintPart(\"action buttons check\")\n\n\tpage.Click(rowActionDropDown)\n\tpage.Click(previewAction)\n\tpage.Contain(\"preview content\")\n\tpage.Display(previewPopup)\n\n\tpage.Click(closePreviewAction)\n\n\tpage.Nondisplay(previewPopup)\n\n\tpage.Click(rowActionDropDown)\n\tpage.Click(rowAjaxAction)\n\n\tpage.Display(rowAjaxPopup)\n\n\tpage.Click(closeRowAjaxPopup)\n\n\tpage.Nondisplay(rowAjaxPopup)\n\n\twait(2)\n}\n\nfunc testNewPageOperations(page *Page) {\n\n\tpage.Click(newPageBtn, 2)\n\tpage.Value(homePageField, \"http://google.com\")\n\n\t// Selections Form Item Check\n\t// =============================\n\n\tprintPart(\"selections form items check\")\n\n\tcheckSelectionsInForm(page)\n\n\t// Create Error Check\n\t// =============================\n\n\tprintPart(\"create error check\")\n\n\tpage.Click(saveBtn)\n\tpage.Contain(\"error\")\n\n\t// Reset Check\n\t// =============================\n\n\tprintPart(\"reset error check\")\n\n\tfillNewForm(page, \"jane\", \"girl\")\n\tpage.Click(resetBtn)\n\n\t// Continue Creating Check\n\t// =============================\n\n\tprintPart(\"continue creating check\")\n\n\tpage.Click(inputTab)\n\tpage.Text(ipField, \"\")\n\tpage.Click(continueEditCheckBox)\n\tfillNewForm(page, \"jane\", \"girl\")\n\tpage.Click(saveBtn)\n\n\t// Creating Check\n\t// =============================\n\n\tprintPart(\"creating check\")\n\n\tfillNewForm(page, \"harry\", \"boy\")\n\tpage.Click(saveBtn, 2)\n\n\tpage.NoContain(\"harry\")\n\tpage.Click(genderActionDropDown)\n\tpage.Click(menOptionActionBtn, 2)\n\tpage.Click(idOrderBtn)\n\tpage.Contain(\"harry\")\n}\n\nfunc fillNewForm(page *Page, name, gender string) {\n\n\tpage.Fill(nameField, name)\n\tpage.Fill(ageField, \"15\")\n\tpage.Fill(passwordField, \"12345678\")\n\tpage.Fill(ipField, \"127.0.0.1\")\n\tpage.Fill(amountField, \"15\")\n\tpage.Click(selectTab)\n\tpage.Click(appleOptField)\n\tif gender == \"girl\" {\n\t\tpage.Click(genderGirlCheckBox)\n\t} else {\n\t\tpage.Click(genderBoyCheckBox)\n\t}\n\tpage.Click(experienceDropDown)\n\tpage.Click(twoYearsSelection)\n}\n\nfunc checkSelectionsInForm(page *Page) {\n\tpage.Click(selectTab)\n\tpage.Text(appleOptField, \"Apple\")\n\tpage.Text(bananaOptField, \"Banana\")\n\tpage.Text(watermelonOptField, \"Watermelon\")\n\t//page.Text(pearOptField, \"\")\n\tpage.Click(experienceDropDown)\n\tpage.Text(twoYearsSelection, \"two years\")\n\tpage.Text(threeYearsSelection, \"three years\")\n\tpage.Text(fourYearsSelection, \"four years\")\n\tpage.Text(fiveYearsSelection, \"five years\")\n\tpage.Click(selectTab)\n\tpage.Attr(page.FindByXPath(multiSelectedOpt), \"title\", \"Beer\")\n\tpage.Click(multiSelectionInput)\n\tpage.Text(multiBeerOpt, \"Beer\")\n\tpage.Text(multiJuiceOpt, \"Juice\")\n\tpage.Text(multiWaterOpt, \"Water\")\n\tpage.Text(multiRedBullOpt, \"Red bull\")\n\tpage.Click(inputTab)\n}\n\nfunc testEditPageOperations(page *Page) {\n\tpage.Click(rowActionDropDown)\n\tpage.Click(editPageBtn, 2)\n\n\t// Form Field Value Check\n\t// =============================\n\n\tprintPart(\"edit form values check\")\n\n\tpage.Value(nameField, \"harry\")\n\tpage.Value(homePageField, \"http://google.com\")\n\tpage.Value(ageField, \"15\")\n\tpage.Value(emailField, \"xxxx@xxx.com\")\n\tpage.Value(birthdayField, \"2010-09-05 00:00:00\")\n\tpage.Value(passwordField, \"12345678\")\n\tpage.Value(ipField, \"127.0.0.1\")\n\tpage.Value(amountField, \"15\")\n\n\tpage.Click(selectTab)\n\n\tpage.Text(boxSelectedOpt, \"Pear\")\n\tpage.Attr(page.FindByXPath(multiSelectedOpt), \"title\", \"Beer\")\n\tpage.Text(experienceSelectedOpt, \"two years\")\n}\n\n//  TODO:\n//\n// [ ] Pagination\n// [ ] Join table fields display in table and form\n\nfunc testDetailPageOperations(_ *Page) {\n\n}\n\nfunc testRolePageOperations(_ *Page) {\n\n}\n\nfunc testPermissionPageOperations(_ *Page) {\n\n}\n\nfunc testMenuPageOperations(page *Page) {\n\n\tpage.Click(sideBarManageDropDown)\n\tpage.Click(menuPageBtn)\n\n\t// ParentIDs Selection Check\n\t// =============================\n\n\tprintPart(\"menu parent ids selection check\")\n\n\tpage.Click(menuParentIdDropDown)\n\tpage.Text(parentIdRootOpt, \"ROOT\")\n\tpage.Text(parentIdDashboardOpt, \"  ┝ Dashboard\")\n\tpage.Text(parentIdAdminOpt, \"  ┝ Admin\")\n\tpage.Text(parentIdUserOpt, \"         ┝ Users\")\n\tpage.Click(parentIdRootOpt)\n\n\t// Roles Selection Check\n\t// =============================\n\n\tprintPart(\"menu roles selection check\")\n\n\tpage.Click(menuRoleDropDown)\n\tpage.Text(menuRoleAdminOpt, \"administrator\")\n\tpage.Text(menuRoleOperatorOpt, \"operator\")\n\tpage.Click(menuRoleAdminOpt)\n\n\tpage.Click(iconPopupBtn)\n\tpage.Display(iconPopup)\n\tpage.Click(iconBtn)\n\tpage.Click(iconPopupBtn)\n\tpage.Nondisplay(iconPopup)\n\n\tpage.Fill(menuNameInput, \"Test\")\n\tpage.Fill(menuUriInput, \"/info/user\")\n\n\t// Save Check\n\t// =============================\n\n\tprintPart(\"menu save check\")\n\n\tpage.Click(menuInfoSaveBtn)\n\n\t// change order check\n\n\t//item := page.FindByXPath(testMenuItem)\n\t//assert.Equal(t, item.MouseToElement(), nil)\n\t//assert.Equal(t, page.Click(agouti.HoldClick, agouti.LeftButton), nil)\n\t//assert.Equal(t, item.ScrollFinger(0, -200), nil)\n\t//assert.Equal(t, page.Click(agouti.HoldClick, agouti.LeftButton), nil)\n\n\t// Delete Check\n\t// =============================\n\n\tprintPart(\"menu delete check\")\n\n\tpage.Click(testMenuDeleteBtn)\n\tpage.Click(testMenuDeleteConfirmBtn)\n\tpage.Click(menuOkBtn)\n\n\tpage.Click(userMenuEditBtn)\n\tpage.Fill(headFieldInput, \"example\")\n\tpage.Click(menuEditSaveBtn)\n}\n\nfunc testManagerPageOperations(page *Page) {\n\n\tpage.Click(managerPageBtn)\n\tpage.Click(managerEditBtn)\n\tpage.Value(managerNameField, \"admin\")\n\tpage.Value(managerNickNameField, \"admin\")\n\tpage.Attr(page.FindByXPath(managerRoleSelectedOpt), \"title\", \"administrator\")\n\tpage.Attr(page.FindByXPath(managerPermissionSelectedOpt), \"title\", \"*\")\n\tpage.Fill(managerNickNameField, \"admin1\")\n\tpage.Click(managerRoleDropDown)\n\tpage.Text(managerRoleOpt2, \"operator\")\n\tpage.Click(managerRoleDropDown)\n\tpage.Click(managerPermissionDropDown)\n\tpage.Text(managerPermissionOpt2, \"dashboard\")\n\tpage.Click(managerPermissionDropDown)\n\tpage.Click(managerSaveBtn)\n\tpage.Contain(\"admin1\")\n\n\tpage.Click(operatorEditBtn)\n\tpage.Click(newPermissionBtn)\n\tpage.Fill(permissionNameInput, \"user_view\")\n\tpage.Fill(permissionSlugInput, \"user_view\")\n\tpage.Click(permissionMethodSelect)\n\tpage.Click(permissionGetSelectOpt)\n\tpage.Fill(permissionPathInput, `/info/user\n/info/user/detail`)\n\tpage.Click(permissionSaveBtn)\n\tpage.Click(managerPermissionDropDown)\n\tpage.Click(managerUserViewSelectOpt)\n\tpage.Click(managerSaveBtn)\n\n\tpage.Click(userNavMenuBtn)\n\tpage.Click(userSettingBtn)\n\tpage.Fill(managerNickNameField, \"admin\")\n\tpage.Click(managerSaveBtn)\n\tpage.Contain(\"admin\")\n\tpage.Click(userNavMenuBtn)\n\tpage.Click(userSignOutBtn)\n}\n\nfunc testPermission(page *Page) {\n\tpage.Fill(loginPageUserNameInput, \"operator\")\n\tpage.Fill(loginPagePasswordInput, \"admin\")\n\tpage.ClickS(page.FindByButton(\"Login\"))\n\tpage.NavigateTo(url(\"/info/user\"))\n\tpage.NoContain(\"New\")\n\tpage.Click(detailBtn)\n\tpage.NoContain(\"Edit\")\n}\n"
  }
]