[
  {
    "path": ".github/FUNDING.yaml",
    "content": "github: aofei\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve.\ntitle: 'Bug: '\nlabels: ''\nassignees: ''\n\n---\n\n<!-- Please answer the following questions before submitting your issue. Thanks! -->\n\n## What is the output when you execute the `go version` command?\n\n<pre>\n$ go version\n<!-- Please fill in your answer in the blank line below this line. -->\n\n</pre>\n\n## What is the output when you execute the `go env` command?\n\n<details>\n<summary><code>go env</code> Output</summary>\n<br>\n<pre>\n$ go env\n<!-- Please fill in your answer in the blank line below this line. -->\n\n</pre>\n</details>\n\n## What did you do?\n\n<!-- If possible, provide a recipe for reproducing the error. -->\n<!-- Please fill in your answer in the blank line below this line. -->\n\n\n## What is the behavior of the bug?\n\n<!-- Please fill in your answer in the blank line below this line. -->\n\n\n## Do you have any guesses?\n\n<!-- Please fill in your answer in the blank line below this line. -->\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/new-question.md",
    "content": "---\nname: New question\nabout: Create a question to ask others for help.\ntitle: 'Question: '\nlabels: ''\nassignees: ''\n\n---\n\n<!-- Please answer the following questions before submitting your issue. Thanks! -->\n\n## What is the output when you execute the `go version` command?\n\n<pre>\n$ go version\n<!-- Please fill in your answer in the blank line below this line. -->\n\n</pre>\n\n## What is the output when you execute the `go env` command?\n\n<details>\n<summary><code>go env</code> Output</summary>\n<br>\n<pre>\n$ go env\n<!-- Please fill in your answer in the blank line below this line. -->\n\n</pre>\n</details>\n\n## What did you do?\n\n<!-- If possible, provide a recipe for reproducing the error. -->\n<!-- Please fill in your answer in the blank line below this line. -->\n\n\n## What did you expect to see?\n\n<!-- Please fill in your answer in the blank line below this line. -->\n\n\n## What did you see instead?\n\n<!-- Please fill in your answer in the blank line below this line. -->\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/new-question.zh-CN.md",
    "content": "---\nname: 新建问题\nabout: 创建一个问题来向他人寻求帮助。\ntitle: '问题：'\nlabels: ''\nassignees: ''\n\n---\n\n<!-- 在提交你的问题之前，请先回答下述问题。非常感谢！ -->\n\n## 当你执行 `go version` 命令后的输出结果是什么？\n\n<pre>\n$ go version\n<!-- 请在此行下面的空白行填写你的答案。 -->\n\n</pre>\n\n## 当你执行 `go env` 命令后的输出结果是什么？\n\n<details>\n<summary><code>go env</code> 的输出结果</summary>\n<br>\n<pre>\n$ go env\n<!-- 请在此行下面的空白行填写你的答案。 -->\n\n</pre>\n</details>\n\n## 你做了什么？\n\n<!-- 如果可以，请告诉我们再现错误的方式。 -->\n<!-- 请在此行下面的空白行填写你的答案。 -->\n\n\n## 你期望看到的结果是什么？\n\n<!-- 请在此行下面的空白行填写你的答案。 -->\n\n\n## 你实际看到的结果是什么？\n\n<!-- 请在此行下面的空白行填写你的答案。 -->\n\n"
  },
  {
    "path": ".gitignore",
    "content": "# Bin\n/goproxy.cn\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\ngoproxy@duck.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM golang:1.20-alpine3.18 AS build\n\nWORKDIR /usr/local/src/goproxy.cn\nCOPY . .\n\nRUN apk add --no-cache git\nRUN go mod download\nRUN CGO_ENABLED=0 go build -trimpath -ldflags \"-s -w\" -o bin/\n\nFROM alpine:3.18\n\nCOPY --from=build /usr/local/src/goproxy.cn/bin/ /usr/local/bin/\nCOPY templates/ /goproxy.cn/templates/\nCOPY assets/ /goproxy.cn/assets/\nCOPY locales/ /goproxy.cn/locales/\nCOPY robots.txt favicon.ico apple-touch-icon.png unknown-badge.svg /goproxy.cn/\n\nRUN apk add --no-cache go git git-lfs openssh gpg subversion fossil mercurial breezy\nRUN git lfs install\n\nENV GOPATH=/tmp/gopath\nENV GOCACHE=/tmp/gocache\nENV GOPROXY=direct\nENV GOSUMDB=off\n\nWORKDIR /goproxy.cn\n\nENTRYPOINT [\"/usr/local/bin/goproxy.cn\"]\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Aofei Sheng\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "[English](README.md) ∙ [简体中文](README.zh-CN.md)\n\n# Goproxy.cn\n\nThe most trusted Go module proxy in China.\n\nGoproxy.cn has fully implemented the [GOPROXY protocol](https://go.dev/ref/mod#goproxy-protocol). It's a non-profit\nproject supported by China's well-trusted cloud service provider [Qiniu Cloud](https://www.qiniu.com/en). Our goal is to\nprovide a free, trusted, always-on, and globally CDN-accelerated Go module proxy for Gophers in China. Please subscribe\nto our real-time and historical data on system performance at [status.goproxy.cn](https://status.goproxy.cn).\n\nGoproxy.cn focuses on the development of the web application that serves at\n[https://goproxy.cn](https://goproxy.cn). If you're looking for a simple way to build your own Go module proxy,\ncheck out [Goproxy](https://github.com/goproxy/goproxy), which Goproxy.cn is based on.\n\nHappy coding, Gophers! ;-)\n\n## Usage\n\n### Go 1.13 and above (RECOMMENDED)\n\nOpen your terminal and execute\n\n```bash\n$ go env -w GO111MODULE=on\n$ go env -w GOPROXY=https://goproxy.cn,direct\n```\n\ndone.\n\n### macOS or Linux\n\nOpen your terminal and execute\n\n```bash\n$ export GO111MODULE=on\n$ export GOPROXY=https://goproxy.cn\n```\n\nor\n\n```bash\n$ echo \"export GO111MODULE=on\" >> ~/.profile\n$ echo \"export GOPROXY=https://goproxy.cn\" >> ~/.profile\n$ source ~/.profile\n```\n\ndone.\n\n### Windows\n\nOpen your PowerShell and execute\n\n```powershell\nC:\\> $env:GO111MODULE = \"on\"\nC:\\> $env:GOPROXY = \"https://goproxy.cn\"\n```\n\nor\n\n1. Open the Start Search, type in \"env\"\n2. Choose the \"Edit the system environment variables\"\n3. Click the \"Environment Variables…\" button\n4. Under the \"User variables for <YOUR_USERNAME>\" section (the upper half)\n5. Click the \"New...\" button\n6. Choose the \"Variable name\" input bar, type in \"GO111MODULE\"\n7. Choose the \"Variable value\" input bar, type in \"on\"\n8. Click the \"OK\" button\n9. Click the \"New...\" button\n10. Choose the \"Variable name\" input bar, type in \"GOPROXY\"\n11. Choose the \"Variable value\" input bar, type in \"https://goproxy.cn\"\n12. Click the \"OK\" button\n\ndone.\n\n## FAQ\n\n### Why create Goproxy.cn?\n\nDue to China's network restrictions, many Go modules in the ecosystem are inaccessible to Chinese Gophers, including\nthe widely-used `golang.org/x/...` packages. Additionally, downloading modules from GitHub in mainland China can be\nslow. We created Goproxy.cn to help Chinese Gophers use Go modules more effectively. Since Goproxy.cn is globally\nCDN-accelerated, it can be used anywhere in the world.\n\n### Is it safe to use Goproxy.cn?\n\nAbsolutely. Like all Go module proxies, we cache modules in their original, unmodified state, ensuring complete\nintegrity on our end. If you need additional verification, you can use the trusted checksum database\n[sum.golang.org](https://sum.golang.org) to verify that modules obtained from us remain untampered, as Goproxy.cn\nfully supports [proxying checksum databases](https://go.dev/design/25530-sumdb#proxying-a-checksum-database).\n\n### Is Goproxy.cn legal in China?\n\nGoproxy.cn is a business-supported project rather than a personal project. And it has been ICP filed in the MIIT of\nChina (ICP license: [沪ICP备11037377号-56](https://beian.miit.gov.cn)), which means it's **fully legal** in China.\n\n### Why not use [proxy.golang.org](https://proxy.golang.org)?\n\nSince [proxy.golang.org](https://proxy.golang.org) has been blocked in the mainland of China, so no. However, if you're\nnot in the mainland of China, then we recommend that you give priority to using\n[proxy.golang.org](https://proxy.golang.org), after all, it looks more official. Once you enter the mainland of China,\nwe hope that you'll think of Goproxy.cn in the first place, which is the main reason why we choose the `.cn` as the\ndomain name extension.\n\n### Who will answer the questions that I have asked in [here](https://github.com/goproxy/goproxy.cn/issues/new?assignees=&labels=&template=new-question.md&title=Question%3A+)?\n\nMembers of Goproxy.cn and enthusiastic volunteers from our great Go community.\n\n## Credits\n\n- Author: [Aofei Sheng](https://aofeisheng.com)\n- Maintainer: [Aofei Sheng](https://aofeisheng.com)\n- Promoters: [Shiwei Xu (Qiniu Cloud's founder-CEO)](https://baike.baidu.com/item/许式伟), Chuntang Tao, [Lifu Mao](https://github.com/forrest-mao) and [Jianyu Chen](https://github.com/eddycjy)\n\n## Sponsors\n\nAs a community-driven open source project, Goproxy.cn is made possible by the generous support of our sponsors.\n\n### [![Qiniu Cloud](https://github.com/user-attachments/assets/8eeedef5-8b59-4bd5-abc9-1231631ae580)](https://www.qiniu.com/en)\n\n[Qiniu Cloud](https://www.qiniu.com/en) is our primary sponsor, providing essential infrastructure including servers,\nobject storage, and CDN services.\n\n### [![DigitalOcean](https://github.com/user-attachments/assets/95bd1397-9415-4d46-a7e5-16a5fb825982)](https://www.digitalocean.com)\n\n[DigitalOcean](https://www.digitalocean.com) provides servers for our [Stats API](https://goproxy.cn/stats), log\nanalytics, and backup infrastructure to enhance availability.\n\n### [![Atlassian](https://github.com/user-attachments/assets/5f12924b-17be-4f37-8a80-376cc556a873)](https://www.atlassian.com)\n\n[Atlassian](https://www.atlassian.com) provides our [Statuspage](https://www.atlassian.com/software/statuspage)\nsubscription, enabling us to maintain our system status page at [status.goproxy.cn](https://status.goproxy.cn).\n\n## Community\n\nIf you have any questions or ideas about this project, feel free to discuss them\n[here](https://github.com/goproxy/goproxy.cn/discussions).\n\n## Contributing\n\nIf you would like to contribute to this project, please submit issues\n[here](https://github.com/goproxy/goproxy.cn/issues) or pull requests\n[here](https://github.com/goproxy/goproxy.cn/pulls).\n\nWhen submitting a pull request, please make sure its commit messages adhere to\n[Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/).\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n"
  },
  {
    "path": "README.zh-CN.md",
    "content": "[English](README.md) ∙ [简体中文](README.zh-CN.md)\n\n# Goproxy.cn\n\n中国最可靠的 Go 模块代理。\n\nGoproxy.cn 完全实现了 [GOPROXY 协议](https://go.dev/ref/mod#goproxy-protocol)。它是一个由中国备受信赖的云服务提供商[七牛云](https://www.qiniu.com)支持的非营利性项目。我们的目标是为中国的 Gopher 提供一个免费的、可靠的、持续在线且通过全球 CDN 加速的模块代理。请在 [status.goproxy.cn](https://status.goproxy.cn) 订阅我们的系统性能实时和历史数据。\n\nGoproxy.cn 专注于服务在 [https://goproxy.cn](https://goproxy.cn) 的 Web 应用开发。如果你正在寻找一种简单的方法来搭建自己的 Go 模块代理，请查看 [Goproxy](https://github.com/goproxy/goproxy)，Goproxy.cn 就是基于它开发的。\n\n愉快地编码吧，Gopher 们！;-)\n\n## 用法\n\n### Go 1.13 及以上（推荐）\n\n打开你的终端并执行\n\n```bash\n$ go env -w GO111MODULE=on\n$ go env -w GOPROXY=https://goproxy.cn,direct\n```\n\n完成。\n\n### macOS 或 Linux\n\n打开你的终端并执行\n\n```bash\n$ export GO111MODULE=on\n$ export GOPROXY=https://goproxy.cn\n```\n\n或者\n\n```bash\n$ echo \"export GO111MODULE=on\" >> ~/.profile\n$ echo \"export GOPROXY=https://goproxy.cn\" >> ~/.profile\n$ source ~/.profile\n```\n\n完成。\n\n### Windows\n\n打开你的 PowerShell 并执行\n\n```powershell\nC:\\> $env:GO111MODULE = \"on\"\nC:\\> $env:GOPROXY = \"https://goproxy.cn\"\n```\n\n或者\n\n1. 打开“开始”并搜索“env”\n2. 选择“编辑系统环境变量”\n3. 点击“环境变量…”按钮\n4. 在“<你的用户名> 的用户变量”章节下（上半部分）\n5. 点击“新建…”按钮\n6. 选择“变量名”输入框并输入“GO111MODULE”\n7. 选择“变量值”输入框并输入“on”\n8. 点击“确定”按钮\n9. 点击“新建…”按钮\n10. 选择“变量名”输入框并输入“GOPROXY”\n11. 选择“变量值”输入框并输入“https://goproxy.cn”\n12. 点击“确定”按钮\n\n完成。\n\n## 常见问题\n\n### 为什么创建 Goproxy.cn？\n\n由于中国的网络限制，Go 生态系统中有许多中国 Gopher 无法获取的模块，比如最著名的 `golang.org/x/...`。同时，在中国大陆从 GitHub 获取模块的速度也比较慢。因此，我们创建了 Goproxy.cn，帮助中国的 Gopher 更好地使用 Go 模块。事实上，由于 Goproxy.cn 已在全球范围内通过 CDN 加速，你可以在任何地方使用它。\n\n### 使用 Goproxy.cn 是否安全？\n\n当然安全。和所有其他的 Go 模块代理一样，我们以原始形式缓存模块，确保它们在我们这边不会被篡改。如果你需要额外的验证，可以使用最值得信任的校验和数据库 [sum.golang.org](https://sum.golang.org) 来确保从我们这里获取的模块没有被篡改，因为 Goproxy.cn 完全支持[代理校验和数据库](https://go.dev/design/25530-sumdb#proxying-a-checksum-database)。\n\n### Goproxy.cn 在中国是合法的吗？\n\nGoproxy.cn 是一个商业支持的项目而不是个人项目。它已经在中华人民共和国工业和信息化部完成 ICP 备案（ICP 备案号：[沪ICP备11037377号-56](https://beian.miit.gov.cn)），这意味着它在中国完全合法。\n\n### 为什么不使用 [proxy.golang.org](https://proxy.golang.org)？\n\n因为 [proxy.golang.org](https://proxy.golang.org) 在中国大陆被屏蔽了，所以，不使用。但是，如果你不在中国大陆，那么我们建议你优先考虑使用 [proxy.golang.org](https://proxy.golang.org)，毕竟它看起来更加官方。一旦你进入了中国大陆，我们希望你能在第一时间想到 Goproxy.cn，这也是我们选择 `.cn` 作为域名后缀的主要原因。\n\n### 谁将回答我在[这里](https://github.com/goproxy/goproxy.cn/issues/new?assignees=&labels=&template=questions-related-to-go-modules.zh-CN.md&title=Go+%E6%A8%A1%E5%9D%97%EF%BC%9A)询问的问题？\n\nGoproxy.cn 的成员以及我们伟大的 Go 社区中热心肠的志愿者们。\n\n## 功劳\n\n- 作者：[盛傲飞](https://aofeisheng.com)\n- 维护者：[盛傲飞](https://aofeisheng.com)\n- 推动者：[许式伟（七牛云的创始人兼首席执行官）](https://baike.baidu.com/item/许式伟)、陶纯堂、[茅力夫](https://github.com/forrest-mao)和[陈剑煜](https://github.com/eddycjy)\n\n## 赞助商\n\n作为一个社区驱动的开源项目，Goproxy.cn 的运行完全依赖于赞助商的慷慨支持。\n\n### [![七牛云](https://github.com/user-attachments/assets/8eeedef5-8b59-4bd5-abc9-1231631ae580)](https://www.qiniu.com)\n\n[七牛云](https://www.qiniu.com)是我们的主要赞助商，提供了至关重要的基础设施支持，包括服务器、对象存储和 CDN 服务。\n\n### [![DigitalOcean](https://github.com/user-attachments/assets/95bd1397-9415-4d46-a7e5-16a5fb825982)](https://www.digitalocean.com)\n\n[DigitalOcean](https://www.digitalocean.com) 提供的服务器用于运行我们的 [Stats API](https://goproxy.cn/stats) 服务、处理日志分析，并提供备用基础设施以提高系统可用性。\n\n### [![Atlassian](https://github.com/user-attachments/assets/5f12924b-17be-4f37-8a80-376cc556a873)](https://www.atlassian.com)\n\n[Atlassian](https://www.atlassian.com) 为我们提供了 [Statuspage](https://www.atlassian.com/software/statuspage) 订阅，使我们能够在 [status.goproxy.cn](https://status.goproxy.cn) 维护系统状态页面。\n\n## 社区\n\n如果你对此项目有任何问题或想法，欢迎在[这里](https://github.com/goproxy/goproxy.cn/discussions)讨论。\n\n## 贡献\n\n如果你想要对此项目做出贡献，请在[这里](https://github.com/goproxy/goproxy.cn/issues)提交问题或在[这里](https://github.com/goproxy/goproxy.cn/pulls)提交 PR。\n\n在提交 PR 时，请确保提交信息遵循 [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/) 规范。\n\n## 许可证\n\n此项目基于 [MIT 许可证](LICENSE)发布。\n"
  },
  {
    "path": "assets/css/bootstrap.css",
    "content": "/*!\n * Bootswatch v4.4.0\n * Homepage: https://bootswatch.com\n * Copyright 2012-2019 Thomas Park\n * Licensed under MIT\n * Based on Bootstrap\n*/\n/*!\n * Bootstrap v4.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #4582EC;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #d9534f;\n  --orange: #fd7e14;\n  --yellow: #f0ad4e;\n  --green: #02B875;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #fff;\n  --gray: #868e96;\n  --gray-dark: #343a40;\n  --primary: #4582EC;\n  --secondary: #adb5bd;\n  --success: #02B875;\n  --info: #17a2b8;\n  --warning: #f0ad4e;\n  --danger: #d9534f;\n  --light: #f8f9fa;\n  --dark: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1.063rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #343a40;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n  outline: 0 !important;\n}\n\nhr {\n  -webkit-box-sizing: content-box;\n          box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n          text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #4582EC;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #1559cf;\n  text-decoration: underline;\n}\n\na:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #868e96;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: 0.5rem;\n  font-weight: 700;\n  line-height: 1.2;\n}\n\nh1, .h1 {\n  font-size: 2.6575rem;\n}\n\nh2, .h2 {\n  font-size: 2.126rem;\n}\n\nh3, .h3 {\n  font-size: 1.86025rem;\n}\n\nh4, .h4 {\n  font-size: 1.5945rem;\n}\n\nh5, .h5 {\n  font-size: 1.32875rem;\n}\n\nh6, .h6 {\n  font-size: 1.063rem;\n}\n\n.lead {\n  font-size: 1.32875rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\n\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.32875rem;\n}\n\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #868e96;\n}\n\n.blockquote-footer::before {\n  content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 90%;\n  color: #868e96;\n}\n\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-wrap: break-word;\n}\n\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\n\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n}\n\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\n\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid, .container-sm, .container-md, .container-lg, .container-xl {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container, .container-sm {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container, .container-sm, .container-md {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container, .container-sm, .container-md, .container-lg {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container, .container-sm, .container-md, .container-lg, .container-xl {\n    max-width: 1140px;\n  }\n}\n\n.row {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n      flex-basis: 0;\n  -webkit-box-flex: 1;\n      -ms-flex-positive: 1;\n          flex-grow: 1;\n  max-width: 100%;\n}\n\n.row-cols-1 > * {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 100%;\n          flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.row-cols-2 > * {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 50%;\n          flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.row-cols-3 > * {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 33.3333333333%;\n          flex: 0 0 33.3333333333%;\n  max-width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 25%;\n          flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.row-cols-5 > * {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 20%;\n          flex: 0 0 20%;\n  max-width: 20%;\n}\n\n.row-cols-6 > * {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 16.6666666667%;\n          flex: 0 0 16.6666666667%;\n  max-width: 16.6666666667%;\n}\n\n.col-auto {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 auto;\n          flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 8.3333333333%;\n          flex: 0 0 8.3333333333%;\n  max-width: 8.3333333333%;\n}\n\n.col-2 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 16.6666666667%;\n          flex: 0 0 16.6666666667%;\n  max-width: 16.6666666667%;\n}\n\n.col-3 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 25%;\n          flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 33.3333333333%;\n          flex: 0 0 33.3333333333%;\n  max-width: 33.3333333333%;\n}\n\n.col-5 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 41.6666666667%;\n          flex: 0 0 41.6666666667%;\n  max-width: 41.6666666667%;\n}\n\n.col-6 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 50%;\n          flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 58.3333333333%;\n          flex: 0 0 58.3333333333%;\n  max-width: 58.3333333333%;\n}\n\n.col-8 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 66.6666666667%;\n          flex: 0 0 66.6666666667%;\n  max-width: 66.6666666667%;\n}\n\n.col-9 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 75%;\n          flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 83.3333333333%;\n          flex: 0 0 83.3333333333%;\n  max-width: 83.3333333333%;\n}\n\n.col-11 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 91.6666666667%;\n          flex: 0 0 91.6666666667%;\n  max-width: 91.6666666667%;\n}\n\n.col-12 {\n  -webkit-box-flex: 0;\n      -ms-flex: 0 0 100%;\n          flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -webkit-box-ordinal-group: 0;\n      -ms-flex-order: -1;\n          order: -1;\n}\n\n.order-last {\n  -webkit-box-ordinal-group: 14;\n      -ms-flex-order: 13;\n          order: 13;\n}\n\n.order-0 {\n  -webkit-box-ordinal-group: 1;\n      -ms-flex-order: 0;\n          order: 0;\n}\n\n.order-1 {\n  -webkit-box-ordinal-group: 2;\n      -ms-flex-order: 1;\n          order: 1;\n}\n\n.order-2 {\n  -webkit-box-ordinal-group: 3;\n      -ms-flex-order: 2;\n          order: 2;\n}\n\n.order-3 {\n  -webkit-box-ordinal-group: 4;\n      -ms-flex-order: 3;\n          order: 3;\n}\n\n.order-4 {\n  -webkit-box-ordinal-group: 5;\n      -ms-flex-order: 4;\n          order: 4;\n}\n\n.order-5 {\n  -webkit-box-ordinal-group: 6;\n      -ms-flex-order: 5;\n          order: 5;\n}\n\n.order-6 {\n  -webkit-box-ordinal-group: 7;\n      -ms-flex-order: 6;\n          order: 6;\n}\n\n.order-7 {\n  -webkit-box-ordinal-group: 8;\n      -ms-flex-order: 7;\n          order: 7;\n}\n\n.order-8 {\n  -webkit-box-ordinal-group: 9;\n      -ms-flex-order: 8;\n          order: 8;\n}\n\n.order-9 {\n  -webkit-box-ordinal-group: 10;\n      -ms-flex-order: 9;\n          order: 9;\n}\n\n.order-10 {\n  -webkit-box-ordinal-group: 11;\n      -ms-flex-order: 10;\n          order: 10;\n}\n\n.order-11 {\n  -webkit-box-ordinal-group: 12;\n      -ms-flex-order: 11;\n          order: 11;\n}\n\n.order-12 {\n  -webkit-box-ordinal-group: 13;\n      -ms-flex-order: 12;\n          order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.3333333333%;\n}\n\n.offset-2 {\n  margin-left: 16.6666666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.3333333333%;\n}\n\n.offset-5 {\n  margin-left: 41.6666666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.3333333333%;\n}\n\n.offset-8 {\n  margin-left: 66.6666666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.3333333333%;\n}\n\n.offset-11 {\n  margin-left: 91.6666666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n        flex-basis: 0;\n    -webkit-box-flex: 1;\n        -ms-flex-positive: 1;\n            flex-grow: 1;\n    max-width: 100%;\n  }\n  .row-cols-sm-1 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .row-cols-sm-2 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .row-cols-sm-3 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 33.3333333333%;\n            flex: 0 0 33.3333333333%;\n    max-width: 33.3333333333%;\n  }\n  .row-cols-sm-4 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .row-cols-sm-5 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%;\n    max-width: 20%;\n  }\n  .row-cols-sm-6 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 16.6666666667%;\n            flex: 0 0 16.6666666667%;\n    max-width: 16.6666666667%;\n  }\n  .col-sm-auto {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 auto;\n            flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 8.3333333333%;\n            flex: 0 0 8.3333333333%;\n    max-width: 8.3333333333%;\n  }\n  .col-sm-2 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 16.6666666667%;\n            flex: 0 0 16.6666666667%;\n    max-width: 16.6666666667%;\n  }\n  .col-sm-3 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 33.3333333333%;\n            flex: 0 0 33.3333333333%;\n    max-width: 33.3333333333%;\n  }\n  .col-sm-5 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 41.6666666667%;\n            flex: 0 0 41.6666666667%;\n    max-width: 41.6666666667%;\n  }\n  .col-sm-6 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 58.3333333333%;\n            flex: 0 0 58.3333333333%;\n    max-width: 58.3333333333%;\n  }\n  .col-sm-8 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 66.6666666667%;\n            flex: 0 0 66.6666666667%;\n    max-width: 66.6666666667%;\n  }\n  .col-sm-9 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 83.3333333333%;\n            flex: 0 0 83.3333333333%;\n    max-width: 83.3333333333%;\n  }\n  .col-sm-11 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 91.6666666667%;\n            flex: 0 0 91.6666666667%;\n    max-width: 91.6666666667%;\n  }\n  .col-sm-12 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -webkit-box-ordinal-group: 0;\n        -ms-flex-order: -1;\n            order: -1;\n  }\n  .order-sm-last {\n    -webkit-box-ordinal-group: 14;\n        -ms-flex-order: 13;\n            order: 13;\n  }\n  .order-sm-0 {\n    -webkit-box-ordinal-group: 1;\n        -ms-flex-order: 0;\n            order: 0;\n  }\n  .order-sm-1 {\n    -webkit-box-ordinal-group: 2;\n        -ms-flex-order: 1;\n            order: 1;\n  }\n  .order-sm-2 {\n    -webkit-box-ordinal-group: 3;\n        -ms-flex-order: 2;\n            order: 2;\n  }\n  .order-sm-3 {\n    -webkit-box-ordinal-group: 4;\n        -ms-flex-order: 3;\n            order: 3;\n  }\n  .order-sm-4 {\n    -webkit-box-ordinal-group: 5;\n        -ms-flex-order: 4;\n            order: 4;\n  }\n  .order-sm-5 {\n    -webkit-box-ordinal-group: 6;\n        -ms-flex-order: 5;\n            order: 5;\n  }\n  .order-sm-6 {\n    -webkit-box-ordinal-group: 7;\n        -ms-flex-order: 6;\n            order: 6;\n  }\n  .order-sm-7 {\n    -webkit-box-ordinal-group: 8;\n        -ms-flex-order: 7;\n            order: 7;\n  }\n  .order-sm-8 {\n    -webkit-box-ordinal-group: 9;\n        -ms-flex-order: 8;\n            order: 8;\n  }\n  .order-sm-9 {\n    -webkit-box-ordinal-group: 10;\n        -ms-flex-order: 9;\n            order: 9;\n  }\n  .order-sm-10 {\n    -webkit-box-ordinal-group: 11;\n        -ms-flex-order: 10;\n            order: 10;\n  }\n  .order-sm-11 {\n    -webkit-box-ordinal-group: 12;\n        -ms-flex-order: 11;\n            order: 11;\n  }\n  .order-sm-12 {\n    -webkit-box-ordinal-group: 13;\n        -ms-flex-order: 12;\n            order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.3333333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.6666666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.3333333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.6666666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.3333333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.6666666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.3333333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.6666666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n        flex-basis: 0;\n    -webkit-box-flex: 1;\n        -ms-flex-positive: 1;\n            flex-grow: 1;\n    max-width: 100%;\n  }\n  .row-cols-md-1 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .row-cols-md-2 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .row-cols-md-3 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 33.3333333333%;\n            flex: 0 0 33.3333333333%;\n    max-width: 33.3333333333%;\n  }\n  .row-cols-md-4 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .row-cols-md-5 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%;\n    max-width: 20%;\n  }\n  .row-cols-md-6 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 16.6666666667%;\n            flex: 0 0 16.6666666667%;\n    max-width: 16.6666666667%;\n  }\n  .col-md-auto {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 auto;\n            flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 8.3333333333%;\n            flex: 0 0 8.3333333333%;\n    max-width: 8.3333333333%;\n  }\n  .col-md-2 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 16.6666666667%;\n            flex: 0 0 16.6666666667%;\n    max-width: 16.6666666667%;\n  }\n  .col-md-3 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 33.3333333333%;\n            flex: 0 0 33.3333333333%;\n    max-width: 33.3333333333%;\n  }\n  .col-md-5 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 41.6666666667%;\n            flex: 0 0 41.6666666667%;\n    max-width: 41.6666666667%;\n  }\n  .col-md-6 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 58.3333333333%;\n            flex: 0 0 58.3333333333%;\n    max-width: 58.3333333333%;\n  }\n  .col-md-8 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 66.6666666667%;\n            flex: 0 0 66.6666666667%;\n    max-width: 66.6666666667%;\n  }\n  .col-md-9 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 83.3333333333%;\n            flex: 0 0 83.3333333333%;\n    max-width: 83.3333333333%;\n  }\n  .col-md-11 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 91.6666666667%;\n            flex: 0 0 91.6666666667%;\n    max-width: 91.6666666667%;\n  }\n  .col-md-12 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -webkit-box-ordinal-group: 0;\n        -ms-flex-order: -1;\n            order: -1;\n  }\n  .order-md-last {\n    -webkit-box-ordinal-group: 14;\n        -ms-flex-order: 13;\n            order: 13;\n  }\n  .order-md-0 {\n    -webkit-box-ordinal-group: 1;\n        -ms-flex-order: 0;\n            order: 0;\n  }\n  .order-md-1 {\n    -webkit-box-ordinal-group: 2;\n        -ms-flex-order: 1;\n            order: 1;\n  }\n  .order-md-2 {\n    -webkit-box-ordinal-group: 3;\n        -ms-flex-order: 2;\n            order: 2;\n  }\n  .order-md-3 {\n    -webkit-box-ordinal-group: 4;\n        -ms-flex-order: 3;\n            order: 3;\n  }\n  .order-md-4 {\n    -webkit-box-ordinal-group: 5;\n        -ms-flex-order: 4;\n            order: 4;\n  }\n  .order-md-5 {\n    -webkit-box-ordinal-group: 6;\n        -ms-flex-order: 5;\n            order: 5;\n  }\n  .order-md-6 {\n    -webkit-box-ordinal-group: 7;\n        -ms-flex-order: 6;\n            order: 6;\n  }\n  .order-md-7 {\n    -webkit-box-ordinal-group: 8;\n        -ms-flex-order: 7;\n            order: 7;\n  }\n  .order-md-8 {\n    -webkit-box-ordinal-group: 9;\n        -ms-flex-order: 8;\n            order: 8;\n  }\n  .order-md-9 {\n    -webkit-box-ordinal-group: 10;\n        -ms-flex-order: 9;\n            order: 9;\n  }\n  .order-md-10 {\n    -webkit-box-ordinal-group: 11;\n        -ms-flex-order: 10;\n            order: 10;\n  }\n  .order-md-11 {\n    -webkit-box-ordinal-group: 12;\n        -ms-flex-order: 11;\n            order: 11;\n  }\n  .order-md-12 {\n    -webkit-box-ordinal-group: 13;\n        -ms-flex-order: 12;\n            order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.3333333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.6666666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.3333333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.6666666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.3333333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.6666666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.3333333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.6666666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n        flex-basis: 0;\n    -webkit-box-flex: 1;\n        -ms-flex-positive: 1;\n            flex-grow: 1;\n    max-width: 100%;\n  }\n  .row-cols-lg-1 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .row-cols-lg-2 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .row-cols-lg-3 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 33.3333333333%;\n            flex: 0 0 33.3333333333%;\n    max-width: 33.3333333333%;\n  }\n  .row-cols-lg-4 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .row-cols-lg-5 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%;\n    max-width: 20%;\n  }\n  .row-cols-lg-6 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 16.6666666667%;\n            flex: 0 0 16.6666666667%;\n    max-width: 16.6666666667%;\n  }\n  .col-lg-auto {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 auto;\n            flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 8.3333333333%;\n            flex: 0 0 8.3333333333%;\n    max-width: 8.3333333333%;\n  }\n  .col-lg-2 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 16.6666666667%;\n            flex: 0 0 16.6666666667%;\n    max-width: 16.6666666667%;\n  }\n  .col-lg-3 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 33.3333333333%;\n            flex: 0 0 33.3333333333%;\n    max-width: 33.3333333333%;\n  }\n  .col-lg-5 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 41.6666666667%;\n            flex: 0 0 41.6666666667%;\n    max-width: 41.6666666667%;\n  }\n  .col-lg-6 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 58.3333333333%;\n            flex: 0 0 58.3333333333%;\n    max-width: 58.3333333333%;\n  }\n  .col-lg-8 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 66.6666666667%;\n            flex: 0 0 66.6666666667%;\n    max-width: 66.6666666667%;\n  }\n  .col-lg-9 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 83.3333333333%;\n            flex: 0 0 83.3333333333%;\n    max-width: 83.3333333333%;\n  }\n  .col-lg-11 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 91.6666666667%;\n            flex: 0 0 91.6666666667%;\n    max-width: 91.6666666667%;\n  }\n  .col-lg-12 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -webkit-box-ordinal-group: 0;\n        -ms-flex-order: -1;\n            order: -1;\n  }\n  .order-lg-last {\n    -webkit-box-ordinal-group: 14;\n        -ms-flex-order: 13;\n            order: 13;\n  }\n  .order-lg-0 {\n    -webkit-box-ordinal-group: 1;\n        -ms-flex-order: 0;\n            order: 0;\n  }\n  .order-lg-1 {\n    -webkit-box-ordinal-group: 2;\n        -ms-flex-order: 1;\n            order: 1;\n  }\n  .order-lg-2 {\n    -webkit-box-ordinal-group: 3;\n        -ms-flex-order: 2;\n            order: 2;\n  }\n  .order-lg-3 {\n    -webkit-box-ordinal-group: 4;\n        -ms-flex-order: 3;\n            order: 3;\n  }\n  .order-lg-4 {\n    -webkit-box-ordinal-group: 5;\n        -ms-flex-order: 4;\n            order: 4;\n  }\n  .order-lg-5 {\n    -webkit-box-ordinal-group: 6;\n        -ms-flex-order: 5;\n            order: 5;\n  }\n  .order-lg-6 {\n    -webkit-box-ordinal-group: 7;\n        -ms-flex-order: 6;\n            order: 6;\n  }\n  .order-lg-7 {\n    -webkit-box-ordinal-group: 8;\n        -ms-flex-order: 7;\n            order: 7;\n  }\n  .order-lg-8 {\n    -webkit-box-ordinal-group: 9;\n        -ms-flex-order: 8;\n            order: 8;\n  }\n  .order-lg-9 {\n    -webkit-box-ordinal-group: 10;\n        -ms-flex-order: 9;\n            order: 9;\n  }\n  .order-lg-10 {\n    -webkit-box-ordinal-group: 11;\n        -ms-flex-order: 10;\n            order: 10;\n  }\n  .order-lg-11 {\n    -webkit-box-ordinal-group: 12;\n        -ms-flex-order: 11;\n            order: 11;\n  }\n  .order-lg-12 {\n    -webkit-box-ordinal-group: 13;\n        -ms-flex-order: 12;\n            order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.3333333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.6666666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.3333333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.6666666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.3333333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.6666666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.3333333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.6666666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n        flex-basis: 0;\n    -webkit-box-flex: 1;\n        -ms-flex-positive: 1;\n            flex-grow: 1;\n    max-width: 100%;\n  }\n  .row-cols-xl-1 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .row-cols-xl-2 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .row-cols-xl-3 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 33.3333333333%;\n            flex: 0 0 33.3333333333%;\n    max-width: 33.3333333333%;\n  }\n  .row-cols-xl-4 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .row-cols-xl-5 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%;\n    max-width: 20%;\n  }\n  .row-cols-xl-6 > * {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 16.6666666667%;\n            flex: 0 0 16.6666666667%;\n    max-width: 16.6666666667%;\n  }\n  .col-xl-auto {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 auto;\n            flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 8.3333333333%;\n            flex: 0 0 8.3333333333%;\n    max-width: 8.3333333333%;\n  }\n  .col-xl-2 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 16.6666666667%;\n            flex: 0 0 16.6666666667%;\n    max-width: 16.6666666667%;\n  }\n  .col-xl-3 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 33.3333333333%;\n            flex: 0 0 33.3333333333%;\n    max-width: 33.3333333333%;\n  }\n  .col-xl-5 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 41.6666666667%;\n            flex: 0 0 41.6666666667%;\n    max-width: 41.6666666667%;\n  }\n  .col-xl-6 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 58.3333333333%;\n            flex: 0 0 58.3333333333%;\n    max-width: 58.3333333333%;\n  }\n  .col-xl-8 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 66.6666666667%;\n            flex: 0 0 66.6666666667%;\n    max-width: 66.6666666667%;\n  }\n  .col-xl-9 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 83.3333333333%;\n            flex: 0 0 83.3333333333%;\n    max-width: 83.3333333333%;\n  }\n  .col-xl-11 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 91.6666666667%;\n            flex: 0 0 91.6666666667%;\n    max-width: 91.6666666667%;\n  }\n  .col-xl-12 {\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -webkit-box-ordinal-group: 0;\n        -ms-flex-order: -1;\n            order: -1;\n  }\n  .order-xl-last {\n    -webkit-box-ordinal-group: 14;\n        -ms-flex-order: 13;\n            order: 13;\n  }\n  .order-xl-0 {\n    -webkit-box-ordinal-group: 1;\n        -ms-flex-order: 0;\n            order: 0;\n  }\n  .order-xl-1 {\n    -webkit-box-ordinal-group: 2;\n        -ms-flex-order: 1;\n            order: 1;\n  }\n  .order-xl-2 {\n    -webkit-box-ordinal-group: 3;\n        -ms-flex-order: 2;\n            order: 2;\n  }\n  .order-xl-3 {\n    -webkit-box-ordinal-group: 4;\n        -ms-flex-order: 3;\n            order: 3;\n  }\n  .order-xl-4 {\n    -webkit-box-ordinal-group: 5;\n        -ms-flex-order: 4;\n            order: 4;\n  }\n  .order-xl-5 {\n    -webkit-box-ordinal-group: 6;\n        -ms-flex-order: 5;\n            order: 5;\n  }\n  .order-xl-6 {\n    -webkit-box-ordinal-group: 7;\n        -ms-flex-order: 6;\n            order: 6;\n  }\n  .order-xl-7 {\n    -webkit-box-ordinal-group: 8;\n        -ms-flex-order: 7;\n            order: 7;\n  }\n  .order-xl-8 {\n    -webkit-box-ordinal-group: 9;\n        -ms-flex-order: 8;\n            order: 8;\n  }\n  .order-xl-9 {\n    -webkit-box-ordinal-group: 10;\n        -ms-flex-order: 9;\n            order: 9;\n  }\n  .order-xl-10 {\n    -webkit-box-ordinal-group: 11;\n        -ms-flex-order: 10;\n            order: 10;\n  }\n  .order-xl-11 {\n    -webkit-box-ordinal-group: 12;\n        -ms-flex-order: 11;\n            order: 11;\n  }\n  .order-xl-12 {\n    -webkit-box-ordinal-group: 13;\n        -ms-flex-order: 12;\n            order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.3333333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.6666666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.3333333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.6666666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.3333333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.6666666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.3333333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.6666666667%;\n  }\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 1rem;\n  color: #343a40;\n}\n\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid rgba(0, 0, 0, 0.1);\n}\n\n.table tbody + tbody {\n  border-top: 2px solid rgba(0, 0, 0, 0.1);\n}\n\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n\n.table-bordered {\n  border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n  border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n  color: #343a40;\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #cbdcfa;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n  border-color: #9ebef5;\n}\n\n.table-hover .table-primary:hover {\n  background-color: #b4ccf8;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #b4ccf8;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #e8eaed;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n  border-color: #d4d9dd;\n}\n\n.table-hover .table-secondary:hover {\n  background-color: #dadde2;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #dadde2;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #b8ebd8;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n  border-color: #7bdab7;\n}\n\n.table-hover .table-success:hover {\n  background-color: #a4e5cd;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #a4e5cd;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n  border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #fbe8cd;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n  border-color: #f7d4a3;\n}\n\n.table-hover .table-warning:hover {\n  background-color: #f9ddb5;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #f9ddb5;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f4cfce;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n  border-color: #eba6a3;\n}\n\n.table-hover .table-danger:hover {\n  background-color: #efbbb9;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #efbbb9;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n  border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n  background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n  border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #454d55;\n}\n\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.table-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n  border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n  color: #fff;\n  background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n  border: 0;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1.1rem;\n  font-size: 1.063rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  border-radius: 0.25rem;\n  -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n\n.form-control:-moz-focusring {\n  color: transparent;\n  text-shadow: 0 0 0 #495057;\n}\n\n.form-control:focus {\n  color: #495057;\n  background-color: #fff;\n  border-color: #b9d0f8;\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #868e96;\n  opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n  color: #868e96;\n  opacity: 1;\n}\n\n.form-control::placeholder {\n  color: #868e96;\n  opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n.col-form-label {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.32875rem;\n  line-height: 1.5;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.930125rem;\n  line-height: 1.5;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding: 0.5rem 0;\n  margin-bottom: 0;\n  font-size: 1.063rem;\n  line-height: 1.5;\n  color: #343a40;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding: 0.25rem 0.5rem;\n  font-size: 0.930125rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.form-control-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1rem;\n  font-size: 1.32875rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n  height: auto;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 1rem;\n}\n\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n\n.form-row {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n\n.form-check-input[disabled] ~ .form-check-label,\n.form-check-input:disabled ~ .form-check-label {\n  color: #868e96;\n}\n\n.form-check-label {\n  margin-bottom: 0;\n}\n\n.form-check-inline {\n  display: -webkit-inline-box;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #02B875;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.6875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(2, 184, 117, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: #02B875;\n  padding-right: calc(1.5em + 1rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2302B875' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: right calc(0.375em + 0.25rem) center;\n  background-size: calc(0.75em + 0.5rem) calc(0.75em + 0.5rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: #02B875;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-right: calc(1.5em + 1rem);\n  background-position: top calc(0.375em + 0.25rem) right calc(0.375em + 0.25rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n  border-color: #02B875;\n  padding-right: calc(0.75em + 2.85rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 1.1rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2302B875' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 2.1rem/calc(0.75em + 0.5rem) calc(0.75em + 0.5rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n  border-color: #02B875;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.25);\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #02B875;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n  color: #02B875;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n  border-color: #02B875;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  border-color: #03ea95;\n  background-color: #03ea95;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #02B875;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #02B875;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n  border-color: #02B875;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.25);\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #d9534f;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.6875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(217, 83, 79, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: #d9534f;\n  padding-right: calc(1.5em + 1rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23d9534f' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23d9534f' stroke='none'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: right calc(0.375em + 0.25rem) center;\n  background-size: calc(0.75em + 0.5rem) calc(0.75em + 0.5rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: #d9534f;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-right: calc(1.5em + 1rem);\n  background-position: top calc(0.375em + 0.25rem) right calc(0.375em + 0.25rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n  border-color: #d9534f;\n  padding-right: calc(0.75em + 2.85rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 1.1rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23d9534f' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23d9534f' stroke='none'/%3e%3c/svg%3e\") #fff no-repeat center right 2.1rem/calc(0.75em + 0.5rem) calc(0.75em + 0.5rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n  border-color: #d9534f;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #d9534f;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n  color: #d9534f;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n  border-color: #d9534f;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  border-color: #e27c79;\n  background-color: #e27c79;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #d9534f;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #d9534f;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n  border-color: #d9534f;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);\n}\n\n.form-inline {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n      -ms-flex-flow: row wrap;\n          flex-flow: row wrap;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n}\n\n.form-inline .form-check {\n  width: 100%;\n}\n\n@media (min-width: 576px) {\n  .form-inline label {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-box-pack: center;\n        -ms-flex-pack: center;\n            justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-flex: 0;\n        -ms-flex: 0 0 auto;\n            flex: 0 0 auto;\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-flow: row wrap;\n            flex-flow: row wrap;\n    -webkit-box-align: center;\n        -ms-flex-align: center;\n            align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group,\n  .form-inline .custom-select {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-box-pack: center;\n        -ms-flex-pack: center;\n            justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    -ms-flex-negative: 0;\n        flex-shrink: 0;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    -webkit-box-align: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-box-pack: center;\n        -ms-flex-pack: center;\n            justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n\n.btn {\n  display: inline-block;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-weight: 400;\n  color: #343a40;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-color: transparent;\n  border: 1px solid transparent;\n  padding: 0.5rem 1.1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.btn:hover {\n  color: #343a40;\n  text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n  opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #4582EC;\n  border-color: #4582EC;\n}\n\n.btn-primary:hover {\n  color: #fff;\n  background-color: #226be8;\n  border-color: #1863e6;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n  color: #fff;\n  background-color: #226be8;\n  border-color: #1863e6;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(97, 149, 239, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(97, 149, 239, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n  color: #fff;\n  background-color: #4582EC;\n  border-color: #4582EC;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #1863e6;\n  border-color: #165edb;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(97, 149, 239, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(97, 149, 239, 0.5);\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #adb5bd;\n  border-color: #adb5bd;\n}\n\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #98a2ac;\n  border-color: #919ca6;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n  color: #fff;\n  background-color: #98a2ac;\n  border-color: #919ca6;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(185, 192, 199, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(185, 192, 199, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n  color: #fff;\n  background-color: #adb5bd;\n  border-color: #adb5bd;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #919ca6;\n  border-color: #8a95a1;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(185, 192, 199, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(185, 192, 199, 0.5);\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #02B875;\n  border-color: #02B875;\n}\n\n.btn-success:hover {\n  color: #fff;\n  background-color: #02925d;\n  border-color: #018655;\n}\n\n.btn-success:focus, .btn-success.focus {\n  color: #fff;\n  background-color: #02925d;\n  border-color: #018655;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 195, 138, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(40, 195, 138, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n  color: #fff;\n  background-color: #02B875;\n  border-color: #02B875;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #018655;\n  border-color: #01794d;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 195, 138, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(40, 195, 138, 0.5);\n}\n\n.btn-info {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:hover {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #fff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #f0ad4e;\n}\n\n.btn-warning:hover {\n  color: #fff;\n  background-color: #ed9d2b;\n  border-color: #ec971f;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n  color: #fff;\n  background-color: #ed9d2b;\n  border-color: #ec971f;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(242, 185, 105, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(242, 185, 105, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #f0ad4e;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #ea9214;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(242, 185, 105, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(242, 185, 105, 0.5);\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d9534f;\n}\n\n.btn-danger:hover {\n  color: #fff;\n  background-color: #d23430;\n  border-color: #c9302c;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n  color: #fff;\n  background-color: #d23430;\n  border-color: #c9302c;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(223, 109, 105, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(223, 109, 105, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d9534f;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #bf2e29;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(223, 109, 105, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(223, 109, 105, 0.5);\n}\n\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #212529;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:hover {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n  color: #4582EC;\n  border-color: #4582EC;\n}\n\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #4582EC;\n  border-color: #4582EC;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n  color: #4582EC;\n  background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #4582EC;\n  border-color: #4582EC;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.5);\n}\n\n.btn-outline-secondary {\n  color: #adb5bd;\n  border-color: #adb5bd;\n}\n\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #adb5bd;\n  border-color: #adb5bd;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(173, 181, 189, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(173, 181, 189, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n  color: #adb5bd;\n  background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #adb5bd;\n  border-color: #adb5bd;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(173, 181, 189, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(173, 181, 189, 0.5);\n}\n\n.btn-outline-success {\n  color: #02B875;\n  border-color: #02B875;\n}\n\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #02B875;\n  border-color: #02B875;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n  color: #02B875;\n  background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #fff;\n  background-color: #02B875;\n  border-color: #02B875;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.5);\n}\n\n.btn-outline-info {\n  color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n  color: #f0ad4e;\n  border-color: #f0ad4e;\n}\n\n.btn-outline-warning:hover {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #f0ad4e;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(240, 173, 78, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(240, 173, 78, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n  color: #f0ad4e;\n  background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #f0ad4e;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(240, 173, 78, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(240, 173, 78, 0.5);\n}\n\n.btn-outline-danger {\n  color: #d9534f;\n  border-color: #d9534f;\n}\n\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d9534f;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n  color: #d9534f;\n  background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d9534f;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.5);\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n  color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #4582EC;\n  text-decoration: none;\n}\n\n.btn-link:hover {\n  color: #1559cf;\n  text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n  text-decoration: underline;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n  color: #868e96;\n  pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.32875rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.688rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  -webkit-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1.063rem;\n  color: #343a40;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-sm-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 768px) {\n  .dropdown-menu-md-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-md-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 992px) {\n  .dropdown-menu-lg-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-lg-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-xl-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n.dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n  right: auto;\n  bottom: auto;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1.5rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #4582EC;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #868e96;\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1.5rem;\n  margin-bottom: 0;\n  font-size: 0.930125rem;\n  color: #868e96;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1.5rem;\n  color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: -webkit-inline-box;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  -webkit-box-flex: 1;\n      -ms-flex: 1 1 auto;\n          flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  -webkit-box-pack: start;\n      -ms-flex-pack: start;\n          justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n  margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.825rem;\n  padding-left: 0.825rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  -webkit-box-align: start;\n      -ms-flex-align: start;\n          align-items: flex-start;\n  -webkit-box-pack: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n\n.input-group {\n  position: relative;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  -webkit-box-align: stretch;\n      -ms-flex-align: stretch;\n          align-items: stretch;\n  width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n  position: relative;\n  -webkit-box-flex: 1;\n      -ms-flex: 1 1 0%;\n          flex: 1 1 0%;\n  min-width: 0;\n  margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n  margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n  z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n  z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n  z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n\n.input-group-prepend {\n  margin-right: -1px;\n}\n\n.input-group-append {\n  margin-left: -1px;\n}\n\n.input-group-text {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  padding: 0.5rem 1.1rem;\n  margin-bottom: 0;\n  font-size: 1.063rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n  height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.32875rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n  height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.930125rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n  padding-right: 2.1rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5945rem;\n  padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n  display: -webkit-inline-box;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  margin-right: 1rem;\n}\n\n.custom-control-input {\n  position: absolute;\n  left: 0;\n  z-index: -1;\n  width: 1rem;\n  height: 1.29725rem;\n  opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #fff;\n  border-color: #4582EC;\n  background-color: #4582EC;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #b9d0f8;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #e7effd;\n  border-color: #e7effd;\n}\n\n.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label {\n  color: #868e96;\n}\n\n.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n\n.custom-control-label {\n  position: relative;\n  margin-bottom: 0;\n  vertical-align: top;\n}\n\n.custom-control-label::before {\n  position: absolute;\n  top: 0.29725rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  background-color: #fff;\n  border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n  position: absolute;\n  top: 0.29725rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  border-color: #4582EC;\n  background-color: #4582EC;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(69, 130, 236, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n  background-color: rgba(69, 130, 236, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(69, 130, 236, 0.5);\n}\n\n.custom-switch {\n  padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n  left: -2.25rem;\n  width: 1.75rem;\n  pointer-events: all;\n  border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n  top: calc(0.29725rem + 2px);\n  left: calc(-2.25rem + 2px);\n  width: calc(1rem - 4px);\n  height: calc(1rem - 4px);\n  background-color: #adb5bd;\n  border-radius: 0.5rem;\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-switch .custom-control-label::after {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n  background-color: #fff;\n  -webkit-transform: translateX(0.75rem);\n          transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(69, 130, 236, 0.5);\n}\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 2.1rem 0.5rem 1.1rem;\n  font-size: 1.063rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: #fff url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 1.1rem center/8px 10px;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  border-radius: 0.25rem;\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n}\n\n.custom-select:focus {\n  border-color: #b9d0f8;\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 1.1rem;\n  background-image: none;\n}\n\n.custom-select:disabled {\n  color: #868e96;\n  background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n  display: none;\n}\n\n.custom-select:-moz-focusring {\n  color: transparent;\n  text-shadow: 0 0 0 #495057;\n}\n\n.custom-select-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-left: 0.5rem;\n  font-size: 0.930125rem;\n}\n\n.custom-select-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-left: 1rem;\n  font-size: 1.32875rem;\n}\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 1rem + 2px);\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(1.5em + 1rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n  border-color: #b9d0f8;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.custom-file-input[disabled] ~ .custom-file-label,\n.custom-file-input:disabled ~ .custom-file-label {\n  background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n  content: attr(data-browse);\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1.1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: calc(1.5em + 1rem);\n  padding: 0.5rem 1.1rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: inherit;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n  width: 100%;\n  height: 1.4rem;\n  padding: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n}\n\n.custom-range:focus {\n  outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n          box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n  border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #4582EC;\n  border: 0;\n  border-radius: 1rem;\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n          appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-webkit-slider-thumb {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n  background-color: #e7effd;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #ddd;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #4582EC;\n  border: 0;\n  border-radius: 1rem;\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  -moz-appearance: none;\n       appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-moz-range-thumb {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.custom-range::-moz-range-thumb:active {\n  background-color: #e7effd;\n}\n\n.custom-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #ddd;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: 0;\n  margin-right: 0.2rem;\n  margin-left: 0.2rem;\n  background-color: #4582EC;\n  border: 0;\n  border-radius: 1rem;\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-ms-thumb {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.custom-range::-ms-thumb:active {\n  background-color: #e7effd;\n}\n\n.custom-range::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: transparent;\n  border-color: transparent;\n  border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n  background-color: #ddd;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n  margin-right: 15px;\n  background-color: #ddd;\n  border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-control-label::before,\n  .custom-file-label,\n  .custom-select {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.nav {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n  text-decoration: none;\n}\n\n.nav-link.disabled {\n  color: #868e96;\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #ddd;\n}\n\n.nav-tabs .nav-link.disabled {\n  color: #868e96;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #ddd #ddd #fff;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #4582EC;\n}\n\n.nav-fill .nav-item {\n  -webkit-box-flex: 1;\n      -ms-flex: 1 1 auto;\n          flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified .nav-item {\n  -ms-flex-preferred-size: 0;\n      flex-basis: 0;\n  -webkit-box-flex: 1;\n      -ms-flex-positive: 1;\n          flex-grow: 1;\n  text-align: center;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-pack: justify;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n  padding: 0.5rem 1rem;\n}\n\n.navbar .container,\n.navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-pack: justify;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n}\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3006875rem;\n  padding-bottom: 0.3006875rem;\n  margin-right: 1rem;\n  font-size: 1.32875rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n  text-decoration: none;\n}\n\n.navbar-nav {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  -ms-flex-preferred-size: 100%;\n      flex-basis: 100%;\n  -webkit-box-flex: 1;\n      -ms-flex-positive: 1;\n          flex-grow: 1;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.32875rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n  text-decoration: none;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-flow: row nowrap;\n            flex-flow: row nowrap;\n    -webkit-box-pack: start;\n        -ms-flex-pack: start;\n            justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {\n    -ms-flex-wrap: nowrap;\n        flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n        flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-flow: row nowrap;\n            flex-flow: row nowrap;\n    -webkit-box-pack: start;\n        -ms-flex-pack: start;\n            justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {\n    -ms-flex-wrap: nowrap;\n        flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n        flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-flow: row nowrap;\n            flex-flow: row nowrap;\n    -webkit-box-pack: start;\n        -ms-flex-pack: start;\n            justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {\n    -ms-flex-wrap: nowrap;\n        flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n        flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-flow: row nowrap;\n            flex-flow: row nowrap;\n    -webkit-box-pack: start;\n        -ms-flex-pack: start;\n            justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {\n    -ms-flex-wrap: nowrap;\n        flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n        flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n}\n\n.navbar-expand {\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n      -ms-flex-flow: row nowrap;\n          flex-flow: row nowrap;\n  -webkit-box-pack: start;\n      -ms-flex-pack: start;\n          justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: row;\n          flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {\n  -ms-flex-wrap: nowrap;\n      flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n  display: -webkit-box !important;\n  display: -ms-flexbox !important;\n  display: flex !important;\n  -ms-flex-preferred-size: auto;\n      flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n\n.navbar-light .navbar-brand {\n  color: #343a40;\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: #343a40;\n}\n\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: #343a40;\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: #343a40;\n}\n\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n  color: #343a40;\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n  color: #343a40;\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.6);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.6);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.6)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.6);\n}\n\n.navbar-dark .navbar-text a {\n  color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n  -webkit-box-flex: 1;\n      -ms-flex: 1 1 auto;\n          flex: 1 1 auto;\n  min-height: 1px;\n  padding: 1.25rem;\n}\n\n.card-title {\n  margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link:hover {\n  text-decoration: none;\n}\n\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n  -ms-flex-negative: 0;\n      flex-shrink: 0;\n  width: 100%;\n}\n\n.card-img,\n.card-img-top {\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-bottom {\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-deck {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-flow: row wrap;\n            flex-flow: row wrap;\n    margin-right: -15px;\n    margin-left: -15px;\n  }\n  .card-deck .card {\n    -webkit-box-flex: 1;\n        -ms-flex: 1 0 0%;\n            flex: 1 0 0%;\n    margin-right: 15px;\n    margin-bottom: 0;\n    margin-left: 15px;\n  }\n}\n\n.card-group > .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-group {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-flow: row wrap;\n            flex-flow: row wrap;\n  }\n  .card-group > .card {\n    -webkit-box-flex: 1;\n        -ms-flex: 1 0 0%;\n            flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-top,\n  .card-group > .card:not(:last-child) .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-bottom,\n  .card-group > .card:not(:last-child) .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-top,\n  .card-group > .card:not(:first-child) .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-bottom,\n  .card-group > .card:not(:first-child) .card-footer {\n    border-bottom-left-radius: 0;\n  }\n}\n\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n  .card-columns {\n    -webkit-column-count: 3;\n            column-count: 3;\n    -webkit-column-gap: 1.25rem;\n            column-gap: 1.25rem;\n    orphans: 1;\n    widows: 1;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n\n.accordion > .card {\n  overflow: hidden;\n}\n\n.accordion > .card:not(:last-of-type) {\n  border-bottom: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.accordion > .card > .card-header {\n  border-radius: 0;\n  margin-bottom: -1px;\n}\n\n.breadcrumb {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  color: #868e96;\n  content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n\n.breadcrumb-item.active {\n  color: #868e96;\n}\n\n.pagination {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #4582EC;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n\n.page-link:hover {\n  z-index: 2;\n  color: #1559cf;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #ddd;\n}\n\n.page-link:focus {\n  z-index: 3;\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.25);\n}\n\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n  z-index: 3;\n  color: #fff;\n  background-color: #4582EC;\n  border-color: #4582EC;\n}\n\n.page-item.disabled .page-link {\n  color: #868e96;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #fff;\n  border-color: #ddd;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.32875rem;\n  line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.930125rem;\n  line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.6em 1.2em;\n  font-size: 75%;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n  -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .badge {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\na.badge:hover, a.badge:focus {\n  text-decoration: none;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n\n.badge-primary {\n  color: #fff;\n  background-color: #4582EC;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n  color: #fff;\n  background-color: #1863e6;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(69, 130, 236, 0.5);\n}\n\n.badge-secondary {\n  color: #fff;\n  background-color: #adb5bd;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n  color: #fff;\n  background-color: #919ca6;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(173, 181, 189, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(173, 181, 189, 0.5);\n}\n\n.badge-success {\n  color: #fff;\n  background-color: #02B875;\n}\n\na.badge-success:hover, a.badge-success:focus {\n  color: #fff;\n  background-color: #018655;\n}\n\na.badge-success:focus, a.badge-success.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(2, 184, 117, 0.5);\n}\n\n.badge-info {\n  color: #fff;\n  background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n  color: #fff;\n  background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n  color: #fff;\n  background-color: #ec971f;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(240, 173, 78, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(240, 173, 78, 0.5);\n}\n\n.badge-danger {\n  color: #fff;\n  background-color: #d9534f;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n  color: #fff;\n  background-color: #c9302c;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.5);\n}\n\n.badge-light {\n  color: #212529;\n  background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n  color: #212529;\n  background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n  color: #fff;\n  background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n  outline: 0;\n  -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n          box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 0 solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 4.0945rem;\n}\n\n.alert-dismissible .close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n\n.alert-primary {\n  color: #24447b;\n  background-color: #dae6fb;\n  border-color: #cbdcfa;\n}\n\n.alert-primary hr {\n  border-top-color: #b4ccf8;\n}\n\n.alert-primary .alert-link {\n  color: #182e54;\n}\n\n.alert-secondary {\n  color: #5a5e62;\n  background-color: #eff0f2;\n  border-color: #e8eaed;\n}\n\n.alert-secondary hr {\n  border-top-color: #dadde2;\n}\n\n.alert-secondary .alert-link {\n  color: #424547;\n}\n\n.alert-success {\n  color: #01603d;\n  background-color: #ccf1e3;\n  border-color: #b8ebd8;\n}\n\n.alert-success hr {\n  border-top-color: #a4e5cd;\n}\n\n.alert-success .alert-link {\n  color: #002e1d;\n}\n\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n  color: #062c33;\n}\n\n.alert-warning {\n  color: #7d5a29;\n  background-color: #fcefdc;\n  border-color: #fbe8cd;\n}\n\n.alert-warning hr {\n  border-top-color: #f9ddb5;\n}\n\n.alert-warning .alert-link {\n  color: #573e1c;\n}\n\n.alert-danger {\n  color: #712b29;\n  background-color: #f7dddc;\n  border-color: #f4cfce;\n}\n\n.alert-danger hr {\n  border-top-color: #efbbb9;\n}\n\n.alert-danger .alert-link {\n  color: #4c1d1b;\n}\n\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n\n.alert-light hr {\n  border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n  color: #686868;\n}\n\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n  color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.79725rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  -webkit-box-pack: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  overflow: hidden;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #4582EC;\n  -webkit-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: progress-bar-stripes 1s linear infinite;\n          animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    -webkit-animation: none;\n            animation: none;\n  }\n}\n\n.media {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: start;\n      -ms-flex-align: start;\n          align-items: flex-start;\n}\n\n.media-body {\n  -webkit-box-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n}\n\n.list-group {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n  z-index: 1;\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n  color: #343a40;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #868e96;\n  pointer-events: none;\n  background-color: #fff;\n}\n\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #4582EC;\n  border-color: #4582EC;\n}\n\n.list-group-item + .list-group-item {\n  border-top-width: 0;\n}\n\n.list-group-item + .list-group-item.active {\n  margin-top: -1px;\n  border-top-width: 1px;\n}\n\n.list-group-horizontal {\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: row;\n          flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n  border-bottom-left-radius: 0.25rem;\n  border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n  border-top-right-radius: 0.25rem;\n  border-bottom-left-radius: 0;\n}\n\n.list-group-horizontal .list-group-item.active {\n  margin-top: 0;\n}\n\n.list-group-horizontal .list-group-item + .list-group-item {\n  border-top-width: 1px;\n  border-left-width: 0;\n}\n\n.list-group-horizontal .list-group-item + .list-group-item.active {\n  margin-left: -1px;\n  border-left-width: 1px;\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .list-group-horizontal-sm .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-sm .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-sm .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-sm .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .list-group-horizontal-md .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-md .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-md .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-md .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-md .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .list-group-horizontal-lg .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-lg .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-lg .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-lg .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .list-group-horizontal-xl .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-xl .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xl .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-xl .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n\n.list-group-flush .list-group-item {\n  border-right-width: 0;\n  border-left-width: 0;\n  border-radius: 0;\n}\n\n.list-group-flush .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n  border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n  color: #24447b;\n  background-color: #cbdcfa;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #24447b;\n  background-color: #b4ccf8;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #24447b;\n  border-color: #24447b;\n}\n\n.list-group-item-secondary {\n  color: #5a5e62;\n  background-color: #e8eaed;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #5a5e62;\n  background-color: #dadde2;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #5a5e62;\n  border-color: #5a5e62;\n}\n\n.list-group-item-success {\n  color: #01603d;\n  background-color: #b8ebd8;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #01603d;\n  background-color: #a4e5cd;\n}\n\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #01603d;\n  border-color: #01603d;\n}\n\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n\n.list-group-item-warning {\n  color: #7d5a29;\n  background-color: #fbe8cd;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #7d5a29;\n  background-color: #f9ddb5;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #7d5a29;\n  border-color: #7d5a29;\n}\n\n.list-group-item-danger {\n  color: #712b29;\n  background-color: #f4cfce;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #712b29;\n  background-color: #efbbb9;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #712b29;\n  border-color: #712b29;\n}\n\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #818182;\n  background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #818182;\n  border-color: #818182;\n}\n\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n\n.close {\n  float: right;\n  font-size: 1.5945rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: .5;\n}\n\n.close:hover {\n  color: #000;\n  text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n  opacity: .75;\n}\n\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n}\n\na.close.disabled {\n  pointer-events: none;\n}\n\n.toast {\n  max-width: 350px;\n  overflow: hidden;\n  font-size: 0.875rem;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  -webkit-box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n          box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n  -webkit-backdrop-filter: blur(10px);\n          backdrop-filter: blur(10px);\n  opacity: 0;\n  border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n  margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n  opacity: 1;\n}\n\n.toast.show {\n  display: block;\n  opacity: 1;\n}\n\n.toast.hide {\n  display: none;\n}\n\n.toast-header {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  padding: 0.25rem 0.75rem;\n  color: #868e96;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n  padding: 0.75rem;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  transition: -webkit-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n  -webkit-transform: translate(0, -50px);\n          transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.modal.show .modal-dialog {\n  -webkit-transform: none;\n          transform: none;\n}\n\n.modal.modal-static .modal-dialog {\n  -webkit-transform: scale(1.02);\n          transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n  max-height: calc(100vh - 1rem);\n  overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n  -ms-flex-negative: 0;\n      flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n  display: block;\n  height: calc(100vh - 1rem);\n  content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  -webkit-box-pack: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n  max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n  content: none;\n}\n\n.modal-content {\n  position: relative;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: start;\n      -ms-flex-align: start;\n          align-items: flex-start;\n  -webkit-box-pack: justify;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n  padding: 1rem 1rem;\n  border-bottom: 1px solid #ddd;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.modal-header .close {\n  padding: 1rem 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  -webkit-box-flex: 1;\n      -ms-flex: 1 1 auto;\n          flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n      flex-wrap: wrap;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-pack: end;\n      -ms-flex-pack: end;\n          justify-content: flex-end;\n  padding: 0.75rem;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: calc(0.3rem - 1px);\n  border-bottom-left-radius: calc(0.3rem - 1px);\n}\n\n.modal-footer > * {\n  margin: 0.25rem;\n}\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-scrollable {\n    max-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-scrollable .modal-content {\n    max-height: calc(100vh - 3.5rem);\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-centered::before {\n    height: calc(100vh - 3.5rem);\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n\n@media (min-width: 992px) {\n  .modal-lg,\n  .modal-xl {\n    max-width: 800px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .modal-xl {\n    max-width: 1140px;\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.6875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n\n.tooltip.show {\n  opacity: 0.9;\n}\n\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.930125rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n  bottom: calc(-0.5rem - 1px);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n  bottom: 0;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n  bottom: 1px;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n  left: calc(-0.5rem - 1px);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n  left: 0;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n  left: 1px;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n  top: calc(-0.5rem - 1px);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n  top: 0;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n  top: 1px;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n  right: calc(-0.5rem - 1px);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n  right: 0;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n  right: 1px;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1.063rem;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #343a40;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  -ms-touch-action: pan-y;\n      touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  -webkit-transition: -webkit-transform 0.6s ease-in-out;\n  transition: -webkit-transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n  -webkit-transform: translateX(100%);\n          transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n  -webkit-transform: translateX(-100%);\n          transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  -webkit-transition-property: opacity;\n  transition-property: opacity;\n  -webkit-transform: none;\n          transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n  z-index: 1;\n  opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n  z-index: 0;\n  opacity: 0;\n  -webkit-transition: opacity 0s 0.6s;\n  transition: opacity 0s 0.6s;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-left,\n  .carousel-fade .active.carousel-item-right {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-pack: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  width: 15%;\n  color: #fff;\n  text-align: center;\n  opacity: 0.5;\n  -webkit-transition: opacity 0.15s ease;\n  transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n  .carousel-control-next {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 15;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-pack: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  -webkit-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-box-flex: 0;\n      -ms-flex: 0 1 auto;\n          flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #fff;\n  background-clip: padding-box;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: .5;\n  -webkit-transition: opacity 0.6s ease;\n  transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators li {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n  }\n}\n\n@keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n  }\n}\n\n.spinner-border {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  border: 0.25em solid currentColor;\n  border-right-color: transparent;\n  border-radius: 50%;\n  -webkit-animation: spinner-border .75s linear infinite;\n          animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n  width: 1rem;\n  height: 1rem;\n  border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n            transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n            transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n.spinner-grow {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  background-color: currentColor;\n  border-radius: 50%;\n  opacity: 0;\n  -webkit-animation: spinner-grow .75s linear infinite;\n          animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n  width: 1rem;\n  height: 1rem;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.bg-primary {\n  background-color: #4582EC !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n  background-color: #1863e6 !important;\n}\n\n.bg-secondary {\n  background-color: #adb5bd !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n  background-color: #919ca6 !important;\n}\n\n.bg-success {\n  background-color: #02B875 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n  background-color: #018655 !important;\n}\n\n.bg-info {\n  background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n  background-color: #117a8b !important;\n}\n\n.bg-warning {\n  background-color: #f0ad4e !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n  background-color: #ec971f !important;\n}\n\n.bg-danger {\n  background-color: #d9534f !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n  background-color: #c9302c !important;\n}\n\n.bg-light {\n  background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n  background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n  background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n  background-color: #1d2124 !important;\n}\n\n.bg-white {\n  background-color: #fff !important;\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n\n.border {\n  border: 1px solid #ddd !important;\n}\n\n.border-top {\n  border-top: 1px solid #ddd !important;\n}\n\n.border-right {\n  border-right: 1px solid #ddd !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #ddd !important;\n}\n\n.border-left {\n  border-left: 1px solid #ddd !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-right-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-left-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #4582EC !important;\n}\n\n.border-secondary {\n  border-color: #adb5bd !important;\n}\n\n.border-success {\n  border-color: #02B875 !important;\n}\n\n.border-info {\n  border-color: #17a2b8 !important;\n}\n\n.border-warning {\n  border-color: #f0ad4e !important;\n}\n\n.border-danger {\n  border-color: #d9534f !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #343a40 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.rounded-sm {\n  border-radius: 0.2rem !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -webkit-box !important;\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -webkit-inline-box !important;\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n.embed-responsive-21by9::before {\n  padding-top: 42.8571428571%;\n}\n\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n\n.flex-row {\n  -webkit-box-orient: horizontal !important;\n  -webkit-box-direction: normal !important;\n      -ms-flex-direction: row !important;\n          flex-direction: row !important;\n}\n\n.flex-column {\n  -webkit-box-orient: vertical !important;\n  -webkit-box-direction: normal !important;\n      -ms-flex-direction: column !important;\n          flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -webkit-box-orient: horizontal !important;\n  -webkit-box-direction: reverse !important;\n      -ms-flex-direction: row-reverse !important;\n          flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -webkit-box-orient: vertical !important;\n  -webkit-box-direction: reverse !important;\n      -ms-flex-direction: column-reverse !important;\n          flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n      flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n      flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n      flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -webkit-box-flex: 1 !important;\n      -ms-flex: 1 1 auto !important;\n          flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -webkit-box-flex: 0 !important;\n      -ms-flex-positive: 0 !important;\n          flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -webkit-box-flex: 1 !important;\n      -ms-flex-positive: 1 !important;\n          flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n      flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n      flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -webkit-box-pack: start !important;\n      -ms-flex-pack: start !important;\n          justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -webkit-box-pack: end !important;\n      -ms-flex-pack: end !important;\n          justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -webkit-box-pack: center !important;\n      -ms-flex-pack: center !important;\n          justify-content: center !important;\n}\n\n.justify-content-between {\n  -webkit-box-pack: justify !important;\n      -ms-flex-pack: justify !important;\n          justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n      justify-content: space-around !important;\n}\n\n.align-items-start {\n  -webkit-box-align: start !important;\n      -ms-flex-align: start !important;\n          align-items: flex-start !important;\n}\n\n.align-items-end {\n  -webkit-box-align: end !important;\n      -ms-flex-align: end !important;\n          align-items: flex-end !important;\n}\n\n.align-items-center {\n  -webkit-box-align: center !important;\n      -ms-flex-align: center !important;\n          align-items: center !important;\n}\n\n.align-items-baseline {\n  -webkit-box-align: baseline !important;\n      -ms-flex-align: baseline !important;\n          align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -webkit-box-align: stretch !important;\n      -ms-flex-align: stretch !important;\n          align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n      align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n      align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n      align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n      align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n      align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n      align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n      align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n      align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n      align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n      align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n      align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n      align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n        -ms-flex-direction: row !important;\n            flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n        -ms-flex-direction: column !important;\n            flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n        -ms-flex-direction: row-reverse !important;\n            flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n        -ms-flex-direction: column-reverse !important;\n            flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n        flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n        flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n        flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -webkit-box-flex: 1 !important;\n        -ms-flex: 1 1 auto !important;\n            flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -webkit-box-flex: 0 !important;\n        -ms-flex-positive: 0 !important;\n            flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -webkit-box-flex: 1 !important;\n        -ms-flex-positive: 1 !important;\n            flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n        flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n        flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -webkit-box-pack: start !important;\n        -ms-flex-pack: start !important;\n            justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -webkit-box-pack: end !important;\n        -ms-flex-pack: end !important;\n            justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -webkit-box-pack: center !important;\n        -ms-flex-pack: center !important;\n            justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -webkit-box-pack: justify !important;\n        -ms-flex-pack: justify !important;\n            justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n        justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -webkit-box-align: start !important;\n        -ms-flex-align: start !important;\n            align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -webkit-box-align: end !important;\n        -ms-flex-align: end !important;\n            align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -webkit-box-align: center !important;\n        -ms-flex-align: center !important;\n            align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -webkit-box-align: baseline !important;\n        -ms-flex-align: baseline !important;\n            align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -webkit-box-align: stretch !important;\n        -ms-flex-align: stretch !important;\n            align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n        align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n        align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n        align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n        align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n        align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n        align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n        align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n        align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n        align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n        align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n        align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n        align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n        -ms-flex-direction: row !important;\n            flex-direction: row !important;\n  }\n  .flex-md-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n        -ms-flex-direction: column !important;\n            flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n        -ms-flex-direction: row-reverse !important;\n            flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n        -ms-flex-direction: column-reverse !important;\n            flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n        flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n        flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n        flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -webkit-box-flex: 1 !important;\n        -ms-flex: 1 1 auto !important;\n            flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -webkit-box-flex: 0 !important;\n        -ms-flex-positive: 0 !important;\n            flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -webkit-box-flex: 1 !important;\n        -ms-flex-positive: 1 !important;\n            flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n        flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n        flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -webkit-box-pack: start !important;\n        -ms-flex-pack: start !important;\n            justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -webkit-box-pack: end !important;\n        -ms-flex-pack: end !important;\n            justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -webkit-box-pack: center !important;\n        -ms-flex-pack: center !important;\n            justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -webkit-box-pack: justify !important;\n        -ms-flex-pack: justify !important;\n            justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n        justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -webkit-box-align: start !important;\n        -ms-flex-align: start !important;\n            align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -webkit-box-align: end !important;\n        -ms-flex-align: end !important;\n            align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -webkit-box-align: center !important;\n        -ms-flex-align: center !important;\n            align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -webkit-box-align: baseline !important;\n        -ms-flex-align: baseline !important;\n            align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -webkit-box-align: stretch !important;\n        -ms-flex-align: stretch !important;\n            align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n        align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n        align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n        align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n        align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n        align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n        align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n        align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n        align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n        align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n        align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n        align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n        align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n        -ms-flex-direction: row !important;\n            flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n        -ms-flex-direction: column !important;\n            flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n        -ms-flex-direction: row-reverse !important;\n            flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n        -ms-flex-direction: column-reverse !important;\n            flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n        flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n        flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n        flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -webkit-box-flex: 1 !important;\n        -ms-flex: 1 1 auto !important;\n            flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -webkit-box-flex: 0 !important;\n        -ms-flex-positive: 0 !important;\n            flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -webkit-box-flex: 1 !important;\n        -ms-flex-positive: 1 !important;\n            flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n        flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n        flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -webkit-box-pack: start !important;\n        -ms-flex-pack: start !important;\n            justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -webkit-box-pack: end !important;\n        -ms-flex-pack: end !important;\n            justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -webkit-box-pack: center !important;\n        -ms-flex-pack: center !important;\n            justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -webkit-box-pack: justify !important;\n        -ms-flex-pack: justify !important;\n            justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n        justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -webkit-box-align: start !important;\n        -ms-flex-align: start !important;\n            align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -webkit-box-align: end !important;\n        -ms-flex-align: end !important;\n            align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -webkit-box-align: center !important;\n        -ms-flex-align: center !important;\n            align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -webkit-box-align: baseline !important;\n        -ms-flex-align: baseline !important;\n            align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -webkit-box-align: stretch !important;\n        -ms-flex-align: stretch !important;\n            align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n        align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n        align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n        align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n        align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n        align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n        align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n        align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n        align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n        align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n        align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n        align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n        align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n        -ms-flex-direction: row !important;\n            flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n        -ms-flex-direction: column !important;\n            flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n        -ms-flex-direction: row-reverse !important;\n            flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n        -ms-flex-direction: column-reverse !important;\n            flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n        flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n        flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n        flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -webkit-box-flex: 1 !important;\n        -ms-flex: 1 1 auto !important;\n            flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -webkit-box-flex: 0 !important;\n        -ms-flex-positive: 0 !important;\n            flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -webkit-box-flex: 1 !important;\n        -ms-flex-positive: 1 !important;\n            flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n        flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n        flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -webkit-box-pack: start !important;\n        -ms-flex-pack: start !important;\n            justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -webkit-box-pack: end !important;\n        -ms-flex-pack: end !important;\n            justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -webkit-box-pack: center !important;\n        -ms-flex-pack: center !important;\n            justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -webkit-box-pack: justify !important;\n        -ms-flex-pack: justify !important;\n            justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n        justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -webkit-box-align: start !important;\n        -ms-flex-align: start !important;\n            align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -webkit-box-align: end !important;\n        -ms-flex-align: end !important;\n            align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -webkit-box-align: center !important;\n        -ms-flex-align: center !important;\n            align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -webkit-box-align: baseline !important;\n        -ms-flex-align: baseline !important;\n            align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -webkit-box-align: stretch !important;\n        -ms-flex-align: stretch !important;\n            align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n        align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n        align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n        align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n        align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n        align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n        align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n        align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n        align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n        align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n        align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n        align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n        align-self: stretch !important;\n  }\n}\n\n.float-left {\n  float: left !important;\n}\n\n.float-right {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n  .sticky-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n}\n\n.shadow-sm {\n  -webkit-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n          box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n  -webkit-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n          box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n  -webkit-box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n          box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  -webkit-box-shadow: none !important;\n          box-shadow: none !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  pointer-events: auto;\n  content: \"\";\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n\n.text-monospace {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n  text-align: justify !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.text-left {\n  text-align: left !important;\n}\n\n.text-right {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.font-weight-light {\n  font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n  font-weight: lighter !important;\n}\n\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n  font-weight: bolder !important;\n}\n\n.font-italic {\n  font-style: italic !important;\n}\n\n.text-white {\n  color: #fff !important;\n}\n\n.text-primary {\n  color: #4582EC !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n  color: #1559cf !important;\n}\n\n.text-secondary {\n  color: #adb5bd !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n  color: #838f9b !important;\n}\n\n.text-success {\n  color: #02B875 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n  color: #016c45 !important;\n}\n\n.text-info {\n  color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n  color: #0f6674 !important;\n}\n\n.text-warning {\n  color: #f0ad4e !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n  color: #df8a13 !important;\n}\n\n.text-danger {\n  color: #d9534f !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n  color: #b52b27 !important;\n}\n\n.text-light {\n  color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n  color: #cbd3da !important;\n}\n\n.text-dark {\n  color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n  color: #121416 !important;\n}\n\n.text-body {\n  color: #343a40 !important;\n}\n\n.text-muted {\n  color: #868e96 !important;\n}\n\n.text-black-50 {\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-break {\n  word-break: break-word !important;\n  overflow-wrap: break-word !important;\n}\n\n.text-reset {\n  color: inherit !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\n  }\n  pre,\n  blockquote {\n    border: 1px solid #adb5bd;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  @page {\n    size: a3;\n  }\n  body {\n    min-width: 992px !important;\n  }\n  .container {\n    min-width: 992px !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n  .table-dark {\n    color: inherit;\n  }\n  .table-dark th,\n  .table-dark td,\n  .table-dark thead th,\n  .table-dark tbody + tbody {\n    border-color: rgba(0, 0, 0, 0.1);\n  }\n  .table .thead-dark th {\n    color: inherit;\n    border-color: rgba(0, 0, 0, 0.1);\n  }\n}\n\n.navbar {\n  font-size: 0.930125rem;\n}\n\n.navbar.bg-dark {\n  background-color: #02B875 !important;\n}\n\n.navbar.bg-light {\n  background-color: #fff !important;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.navbar.bg-light.navbar-fixed-top {\n  border-width: 0 0 1px 0;\n}\n\n.navbar.bg-light.navbar-fixed-bottom {\n  border-width: 1px 0 0 0;\n}\n\n.btn {\n  border-radius: 1.078em;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  border-radius: 2.688em;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  border-radius: 0.844em;\n}\n\np {\n  font-family: Georgia, Cambria, \"Times New Roman\", Times, serif;\n}\n\nblockquote {\n  font-style: italic;\n}\n\nfooter {\n  font-size: 0.930125rem;\n}\n\n.lead {\n  color: #868e96;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n}\n\ntable,\n.table {\n  font-size: 0.930125rem;\n}\n\ntable-primary, table-secondary, table-success, table-info, table-warning, table-danger,\n.table-primary,\n.table-secondary,\n.table-success,\n.table-info,\n.table-warning,\n.table-danger {\n  color: #fff;\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #4582EC;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #adb5bd;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #f8f9fa;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #343a40;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #02B875;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #17a2b8;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #d9534f;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #f0ad4e;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-primary:hover, .table-hover .table-primary:hover > th, .table-hover .table-primary:hover > td {\n  background-color: #2e72ea;\n}\n\n.table-hover .table-secondary:hover, .table-hover .table-secondary:hover > th, .table-hover .table-secondary:hover > td {\n  background-color: #9fa8b2;\n}\n\n.table-hover .table-light:hover, .table-hover .table-light:hover > th, .table-hover .table-light:hover > td {\n  background-color: #e9ecef;\n}\n\n.table-hover .table-dark:hover, .table-hover .table-dark:hover > th, .table-hover .table-dark:hover > td {\n  background-color: #292d32;\n}\n\n.table-hover .table-success:hover, .table-hover .table-success:hover > th, .table-hover .table-success:hover > td {\n  background-color: #029f65;\n}\n\n.table-hover .table-info:hover, .table-hover .table-info:hover > th, .table-hover .table-info:hover > td {\n  background-color: #148ea1;\n}\n\n.table-hover .table-danger:hover, .table-hover .table-danger:hover > th, .table-hover .table-danger:hover > td {\n  background-color: #d43f3a;\n}\n\n.table-hover .table-warning:hover, .table-hover .table-warning:hover > th, .table-hover .table-warning:hover > td {\n  background-color: #eea236;\n}\n\n.table-hover .table-active:hover, .table-hover .table-active:hover > th, .table-hover .table-active:hover > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.nav,\n.breadcrumb,\n.pagination {\n  font-size: 0.930125rem;\n}\n\n.dropdown-menu {\n  font-size: 0.930125rem;\n}\n\n.alert {\n  color: #fff;\n  font-size: 0.930125rem;\n}\n\n.alert, .alert p {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n}\n\n.alert a, .alert .alert-link {\n  color: #fff;\n  font-weight: normal;\n  text-decoration: underline;\n}\n\n.alert-primary {\n  background-color: #4582EC;\n}\n\n.alert-secondary {\n  background-color: #adb5bd;\n}\n\n.alert-success {\n  background-color: #02B875;\n}\n\n.alert-info {\n  background-color: #17a2b8;\n}\n\n.alert-warning {\n  background-color: #f0ad4e;\n}\n\n.alert-danger {\n  background-color: #d9534f;\n}\n\n.alert-light {\n  background-color: #f8f9fa;\n}\n\n.alert-dark {\n  background-color: #343a40;\n}\n\n.alert-light,\n.alert-light a,\n.alert-light .alert-link {\n  color: #343a40;\n}\n\n.badge {\n  vertical-align: bottom;\n}\n\n.list-group {\n  font-size: 0.930125rem;\n}\n"
  },
  {
    "path": "assets/css/main.css",
    "content": "body {\n\tcolor: #5a5a5a;\n\tfont-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;\n\tfont-size: 1rem;\n\tpadding: 3.5rem 0;\n}\n\n@media screen and (max-width: 600px) {\n\tbody {\n\t\tfont-size: 0.875rem;\n\t}\n}\n\nhr {\n\tmargin: 4rem 0;\n}\n\npre code {\n\tword-wrap: normal;\n}\n\n.jumbotron {\n\tmargin-bottom: 5rem;\n}\n\n.jumbotron .logo {\n\twidth: 15rem;\n}\n\n@media screen and (max-width: 600px) {\n\t.jumbotron .logo {\n\t\twidth: 12rem;\n\t}\n\n\t.jumbotron .brand {\n\t\tfont-size: 2.5rem;\n\t}\n}\n\n.language-item-selected,\n.language-item-selected:hover {\n\tcolor: #5a5a5a;\n\tfont-weight: bold;\n}\n\nfooter p {\n\ttext-align: center;\n}\n"
  },
  {
    "path": "assets/js/main.js",
    "content": "const languageListItems = document.getElementsByClassName(\"language-item\");\nif (languageListItems !== undefined) {\n\tfor (var i = 0; i < languageListItems.length; i++) {\n\t\tlet languageListItem = languageListItems[i];\n\t\tlanguageListItem.onclick = function() {\n\t\t\tdocument.cookie = \"accept-language=\" + languageListItem.getAttribute(\"tag\") + \"; Path=/; Max-Age=31536000\";\n\t\t\tlocation.reload();\n\t\t};\n\t}\n}\n\nconst pres = document.getElementsByTagName(\"pre\");\nif (pres !== undefined) {\n\tfor (var i = 0; i < pres.length; i++) {\n\t\tcode = pres[i].getElementsByTagName(\"code\")[0]\n\t\tcode.setAttribute(\"class\", code.getAttribute(\"class\").replace(\"language-\", \"\"));\n\t\thljs.highlightBlock(code);\n\t}\n}\n"
  },
  {
    "path": "base/base.go",
    "content": "package base\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aofei/air\"\n\t\"github.com/robfig/cron/v3\"\n\t\"github.com/rs/zerolog\"\n\t\"github.com/spf13/pflag\"\n\t\"github.com/spf13/viper\"\n)\n\nvar (\n\t// Viper is the global instace of the `viper.Viper`.\n\tViper = viper.New()\n\n\t// Logger is the global instace of the `zerolog.Logger`.\n\tLogger = zerolog.New(os.Stderr).With().Timestamp().Logger()\n\n\t// Air is the global instace of the `air.Air`.\n\tAir = air.New()\n\n\t// Context is the global instance of the `context.Context`.\n\tContext context.Context\n\n\t// Cron is the global instance of the `cron.Cron`.\n\tCron *cron.Cron\n)\n\nfunc init() {\n\tcf := pflag.StringP(\"config\", \"c\", \"config.toml\", \"configuration file\")\n\tpflag.Parse()\n\n\text := filepath.Ext(*cf)\n\tViper.AddConfigPath(filepath.Dir(*cf))\n\tViper.SetConfigName(strings.TrimSuffix(filepath.Base(*cf), ext))\n\tViper.SetConfigType(strings.TrimPrefix(ext, \".\"))\n\tif err := Viper.ReadInConfig(); err != nil {\n\t\tpanic(fmt.Errorf(\"failed to read configuration file: %v\", err))\n\t}\n\n\tzerolog.TimeFieldFormat = zerolog.TimeFormatUnix\n\tLogger = Logger.With().\n\t\tStr(\"app_name\", Viper.GetString(\"air.app_name\")).\n\t\tLogger()\n\tif Viper.GetBool(\"air.debug_mode\") {\n\t\tLogger = Logger.Level(zerolog.DebugLevel)\n\t} else {\n\t\tl, _ := zerolog.ParseLevel(Viper.GetString(\"zerolog.level\"))\n\t\tLogger = Logger.Level(l)\n\t}\n\n\tif err := Viper.UnmarshalKey(\"air\", Air); err != nil {\n\t\tLogger.Fatal().Err(err).\n\t\t\tMsg(\"failed to unmarshal air configuration items\")\n\t}\n\n\tvar cancel context.CancelFunc\n\tContext, cancel = context.WithCancel(context.Background())\n\tAir.AddShutdownJob(cancel)\n\n\tCron = cron.New(\n\t\tcron.WithLocation(time.UTC),\n\t\tcron.WithLogger(\n\t\t\tcron.PrintfLogger(log.New(Logger, \"cron: \", 0)),\n\t\t),\n\t)\n\tCron.Start()\n\tAir.AddShutdownJob(func() {\n\t\t<-Cron.Stop().Done()\n\t})\n}\n"
  },
  {
    "path": "base/retry.go",
    "content": "package base\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"time\"\n)\n\n// ErrRetryable means an operation is retryable.\nvar ErrRetryable = errors.New(\"retryable\")\n\n// RetryableError is an error indicating that an operation is retryable.\ntype RetryableError string\n\n// Error implements the `error`.\nfunc (re RetryableError) Error() string {\n\treturn string(re)\n}\n\n// Is reports whether the target is `ErrRetryable`.\nfunc (RetryableError) Is(target error) bool {\n\treturn target == ErrRetryable\n}\n\n// Retry is like the `RetryN`, but at most 100 million retries.\nfunc Retry(\n\tctx context.Context,\n\tf func(ctx context.Context) error,\n\tretryable func(err error) bool,\n\tnap time.Duration,\n) error {\n\treturn RetryN(ctx, f, retryable, nap, 100_000_000)\n}\n\n// RetryN retries the f based on the retryable at most n times. And there is a\n// nap before each retry.\nfunc RetryN(\n\tctx context.Context,\n\tf func(ctx context.Context) error,\n\tretryable func(err error) bool,\n\tnap time.Duration,\n\tn int,\n) error {\n\tif retryable == nil {\n\t\tretryable = func(_ error) bool { return false }\n\t}\n\tn = max(n, 1)\n\n\tvar err error\n\tfor range n {\n\t\tif err = f(ctx); err == nil {\n\t\t\treturn nil\n\t\t} else if !errors.Is(err, ErrRetryable) && !retryable(err) {\n\t\t\treturn err\n\t\t}\n\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn err\n\t\tcase <-time.After(nap):\n\t\t}\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "base/time.go",
    "content": "package base\n\nimport \"time\"\n\n// TZAsiaShanghai is the \"Asia/Shanghai\" timezone.\nvar TZAsiaShanghai = time.FixedZone(\"Asia/Shanghai\", 8*60*60)\n"
  },
  {
    "path": "config.toml",
    "content": "# Air\n[air]\napp_name = \"goproxy.cn\"\ndebug_mode = true\naddress = \"localhost:8080\"\nminifier_enabled = true\ngzip_enabled = true\ncoffer_enabled = true\ni18n_enabled = true\n\n# Zerolog\n[zerolog]\nlevel = \"debug\"\n\n# Qiniu Cloud\n[qiniu]\naccess_key = \"<ACCESS_KEY>\"\nsecret_key = \"<SECRET_KEY>\"\nkodo_endpoint = \"<KODO_ENDPOINT>\"\nkodo_bucket_name = \"<KODO_BUCKET_NAME>\"\nkodo_force_path_style = false\nkodo_multipart_upload_part_size = 104857600\n\n# Goproxy\n[goproxy]\ngo_bin_name = \"go\"\ncacher_max_cache_bytes = 52428800\nproxied_sumdbs = [\"sum.golang.org\"]\nfetch_timeout = \"60s\"\nauto_redirect = false\nauto_redirect_min_size = 10485760\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/goproxy/goproxy.cn\n\ngo 1.25.0\n\nrequire (\n\tgithub.com/air-gases/cacheman v0.17.0\n\tgithub.com/air-gases/defibrillator v0.22.0\n\tgithub.com/air-gases/langman v0.9.0\n\tgithub.com/air-gases/limiter v0.22.0\n\tgithub.com/air-gases/logger v0.22.0\n\tgithub.com/aofei/air v0.22.0\n\tgithub.com/goproxy/goproxy v0.14.0\n\tgithub.com/minio/minio-go/v7 v7.0.95\n\tgithub.com/robfig/cron/v3 v3.0.1\n\tgithub.com/rs/zerolog v1.21.0\n\tgithub.com/spf13/pflag v1.0.6\n\tgithub.com/spf13/viper v1.20.1\n\tgolang.org/x/mod v0.25.0\n)\n\nrequire (\n\tgithub.com/VictoriaMetrics/fastcache v1.12.1 // indirect\n\tgithub.com/aofei/mimesniffer v1.2.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/dustin/go-humanize v1.0.1 // indirect\n\tgithub.com/fsnotify/fsnotify v1.8.0 // indirect\n\tgithub.com/go-ini/ini v1.67.0 // indirect\n\tgithub.com/go-viper/mapstructure/v2 v2.2.1 // indirect\n\tgithub.com/goccy/go-json v0.10.5 // indirect\n\tgithub.com/golang/snappy v0.0.4 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/gorilla/websocket v1.5.0 // indirect\n\tgithub.com/klauspost/compress v1.18.0 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.11 // indirect\n\tgithub.com/minio/crc64nvme v1.0.2 // indirect\n\tgithub.com/minio/md5-simd v1.1.2 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/patrickmn/go-cache v2.1.0+incompatible // indirect\n\tgithub.com/pelletier/go-toml v1.9.5 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.2.3 // indirect\n\tgithub.com/philhofer/fwd v1.2.0 // indirect\n\tgithub.com/rs/xid v1.6.0 // indirect\n\tgithub.com/sagikazarmark/locafero v0.7.0 // indirect\n\tgithub.com/sourcegraph/conc v0.3.0 // indirect\n\tgithub.com/spf13/afero v1.12.0 // indirect\n\tgithub.com/spf13/cast v1.7.1 // indirect\n\tgithub.com/subosito/gotenv v1.6.0 // indirect\n\tgithub.com/tdewolff/minify/v2 v2.12.5 // indirect\n\tgithub.com/tdewolff/parse/v2 v2.6.5 // indirect\n\tgithub.com/tinylib/msgp v1.3.0 // indirect\n\tgithub.com/vmihailenco/msgpack/v5 v5.3.5 // indirect\n\tgithub.com/vmihailenco/tagparser/v2 v2.0.0 // indirect\n\tgo.uber.org/atomic v1.9.0 // indirect\n\tgo.uber.org/multierr v1.9.0 // indirect\n\tgolang.org/x/crypto v0.39.0 // indirect\n\tgolang.org/x/net v0.41.0 // indirect\n\tgolang.org/x/sys v0.33.0 // indirect\n\tgolang.org/x/text v0.26.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/VictoriaMetrics/fastcache v1.5.8/go.mod h1:SiMZNgwEPJ9qWLshu9tyuE6bKc9ZWYhcNV/L7jurprQ=\ngithub.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40=\ngithub.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o=\ngithub.com/air-gases/cacheman v0.17.0 h1:/nbjhH9ByrUMFsl+kbZgB9m+V7gB/ov+UyetpaLHlnM=\ngithub.com/air-gases/cacheman v0.17.0/go.mod h1:AA3ID4zrvv1H89L6pUpaBG3eH/WvgBs5DIOBc9nD2VI=\ngithub.com/air-gases/defibrillator v0.22.0 h1:XwoXVNPUV7h5Ukq6SavAdM9Eh7ID3UxYdn1F9WW4BJM=\ngithub.com/air-gases/defibrillator v0.22.0/go.mod h1:vm3Ek8HMQDR0wB6ascxtVGEKlbDdQH5wKP81FosETyc=\ngithub.com/air-gases/langman v0.9.0 h1:XNJjrEU+dmBCQ1t/ioUICL6UeDFsUX7yZUVM0DN4A6g=\ngithub.com/air-gases/langman v0.9.0/go.mod h1:IyQQkve5E42EnSzSzbChh8FF4H5xiQ5HbM93EO4LJuE=\ngithub.com/air-gases/limiter v0.22.0 h1:5A+OXenbik/tNF11juU5ZxY+BA/Y6ZP+R/WBu95U4cc=\ngithub.com/air-gases/limiter v0.22.0/go.mod h1:MV3UvwmXbSZ11DzuGZMrvohinvjtrR2ubtT7aJfZb74=\ngithub.com/air-gases/logger v0.22.0 h1:S3qWKrWq1sWnzvqGBnwrXsyI8rEXhefjPtH8WY7kqCs=\ngithub.com/air-gases/logger v0.22.0/go.mod h1:goKEv8ocGVc9+BMLM1tg1L1MmJXkXiRc65ImDHlcoio=\ngithub.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=\ngithub.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc=\ngithub.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=\ngithub.com/aofei/air v0.22.0 h1:reotCNJjFf8twdStQ+RGoeWy8P0Q9O+N4Ae4VRyuzmQ=\ngithub.com/aofei/air v0.22.0/go.mod h1:XAPcWfXds+P8+fRXRLiAPcp0PkgBGBOT9bb9vREK4Fo=\ngithub.com/aofei/mimesniffer v1.1.6/go.mod h1:jUnb40YhdVAhs+rZ5yyWJcBS1afj7F0RZudl98tOSHM=\ngithub.com/aofei/mimesniffer v1.2.1 h1:IMsdcpRp6cxmRywsOo3GlN1p5nwYdW/6kNK543/GYBg=\ngithub.com/aofei/mimesniffer v1.2.1/go.mod h1:RdFvw/YnqGk4qKjvwV5N6SXc/Hr/VaX+eP1iabbqBKk=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\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/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE=\ngithub.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=\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/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=\ngithub.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=\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.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=\ngithub.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\ngithub.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=\ngithub.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=\ngithub.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=\ngithub.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=\ngithub.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=\ngithub.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/snappy v0.0.3/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/google/go-cmp v0.5.5/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/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/goproxy/goproxy v0.14.0 h1:t0R6KY1OvxCbHTgJZZlRNdYhb0pPZECH2FmNQyPKO/E=\ngithub.com/goproxy/goproxy v0.14.0/go.mod h1:NY5JQtVDSCZNJUijc1ep5SqoUs55hGzuqe8WLnbPCSw=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=\ngithub.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=\ngithub.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=\ngithub.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU=\ngithub.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=\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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs=\ngithub.com/minio/crc64nvme v1.0.2 h1:6uO1UxGAD+kwqWWp7mBFsi5gAse66C4NXO8cmcVculg=\ngithub.com/minio/crc64nvme v1.0.2/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=\ngithub.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=\ngithub.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=\ngithub.com/minio/minio-go/v7 v7.0.95 h1:ywOUPg+PebTMTzn9VDsoFJy32ZuARN9zhB+K3IYEvYU=\ngithub.com/minio/minio-go/v7 v7.0.95/go.mod h1:wOOX3uxS334vImCNRVyIDdXX9OsXDm89ToynKgqUKlo=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\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/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=\ngithub.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=\ngithub.com/pelletier/go-toml v1.9.0/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=\ngithub.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=\ngithub.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=\ngithub.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=\ngithub.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=\ngithub.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=\ngithub.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=\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/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=\ngithub.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=\ngithub.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=\ngithub.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=\ngithub.com/rs/zerolog v1.21.0 h1:Q3vdXlfLNT+OftyBHsU0Y445MD+8m8axjKgf2si0QcM=\ngithub.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM=\ngithub.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=\ngithub.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=\ngithub.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=\ngithub.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=\ngithub.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=\ngithub.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=\ngithub.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=\ngithub.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=\ngithub.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4=\ngithub.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=\ngithub.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=\ngithub.com/tdewolff/minify/v2 v2.9.16/go.mod h1:cjMkr4ZgFjqxXAQ1kR9Fm4l1046mmONd2g6yMzGuN/w=\ngithub.com/tdewolff/minify/v2 v2.12.5 h1:s2KDBt/D/3ayE3gcqQF8VIgTmYgkx+btuLvVAeePzZM=\ngithub.com/tdewolff/minify/v2 v2.12.5/go.mod h1:i8QXtVyL7Ddwc4I5gqzvgBqKlTMgMNTbiXaPO4Iqg+A=\ngithub.com/tdewolff/parse/v2 v2.5.14/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho=\ngithub.com/tdewolff/parse/v2 v2.5.15/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho=\ngithub.com/tdewolff/parse/v2 v2.6.5 h1:lYvWBk55GkqKl0JJenGpmrgu/cPHQQ6/Mm1hBGswoGQ=\ngithub.com/tdewolff/parse/v2 v2.6.5/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs=\ngithub.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=\ngithub.com/tdewolff/test v1.0.7 h1:8Vs0142DmPFW/bQeHRP3MV19m1gvndjUb1sn8yy74LM=\ngithub.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=\ngithub.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=\ngithub.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=\ngithub.com/vmihailenco/msgpack/v5 v5.3.1/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=\ngithub.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=\ngithub.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=\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/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\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/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=\ngo.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210415154028-4f45737414dc/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=\ngolang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=\ngolang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=\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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=\ngolang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\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-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210415045647-66c3f260301c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=\ngolang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\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/text v0.3.0/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.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=\ngolang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=\ngolang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=\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/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.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=\ngoogle.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=\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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\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=\n"
  },
  {
    "path": "handler/goproxy.go",
    "content": "package handler\n\nimport (\n\t\"context\"\n\t\"crypto/md5\"\n\t\"encoding/hex\"\n\t\"io\"\n\t\"io/fs\"\n\t\"log\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aofei/air\"\n\t\"github.com/goproxy/goproxy\"\n\t\"github.com/goproxy/goproxy.cn/base\"\n\t\"github.com/minio/minio-go/v7\"\n\t\"golang.org/x/mod/module\"\n\t\"golang.org/x/mod/semver\"\n)\n\nvar (\n\t// goproxyViper is used to get the configuration items of the Goproxy.\n\tgoproxyViper = base.Viper.Sub(\"goproxy\")\n\n\t// hhGoproxy is an instance of the `goproxy.Goproxy`.\n\thhGoproxy = &goproxy.Goproxy{\n\t\tGoBinName:           goproxyViper.GetString(\"go_bin_name\"),\n\t\tCacher:              &goproxyCacher{},\n\t\tCacherMaxCacheBytes: goproxyViper.GetInt(\"cacher_max_cache_bytes\"),\n\t\tProxiedSUMDBs:       goproxyViper.GetStringSlice(\"proxied_sumdbs\"),\n\t\tTransport: &http.Transport{\n\t\t\tProxy: http.ProxyFromEnvironment,\n\t\t\tDialContext: (&net.Dialer{\n\t\t\t\tTimeout:   30 * time.Second,\n\t\t\t\tKeepAlive: 30 * time.Second,\n\t\t\t\tDualStack: true,\n\t\t\t}).DialContext,\n\t\t\tMaxIdleConnsPerHost:   200,\n\t\t\tIdleConnTimeout:       90 * time.Second,\n\t\t\tTLSHandshakeTimeout:   10 * time.Second,\n\t\t\tExpectContinueTimeout: 1 * time.Second,\n\t\t\tForceAttemptHTTP2:     true,\n\t\t},\n\t\tErrorLogger: log.New(base.Logger, \"\", 0),\n\t}\n\n\t// goproxyFetchTimeout is the maximum duration allowed for Goproxy to\n\t// fetch a module.\n\tgoproxyFetchTimeout = goproxyViper.GetDuration(\"fetch_timeout\")\n\n\t// goproxyAutoRedirect indicates whether the automatic redirection\n\t// feature is enabled for Goproxy.\n\tgoproxyAutoRedirect = goproxyViper.GetBool(\"auto_redirect\")\n\n\t// goproxyAutoRedirectMinSize is the minimum size of the Goproxy used to\n\t// limit at least how big Goproxy cache can be automatically redirected.\n\tgoproxyAutoRedirectMinSize = goproxyViper.GetInt64(\"auto_redirect_min_size\")\n)\n\nfunc init() {\n\tbase.Air.BATCH(getHeadMethods, \"/*\", hGoproxy)\n}\n\n// hGoproxy handles requests to play with Go module proxy.\nfunc hGoproxy(req *air.Request, res *air.Response) error {\n\tif goproxyFetchTimeout != 0 {\n\t\tvar cancel context.CancelFunc\n\t\treq.Context, cancel = context.WithTimeout(\n\t\t\treq.Context,\n\t\t\tgoproxyFetchTimeout,\n\t\t)\n\t\tdefer cancel()\n\t}\n\n\tname, err := url.PathUnescape(req.ParamValue(\"*\").String())\n\tif err != nil || strings.HasSuffix(name, \"/\") {\n\t\treturn CacheableNotFound(req, res, 86400)\n\t}\n\n\treq.Header.Del(\"Disable-Module-Fetch\")\n\n\tif !goproxyAutoRedirect || path.Ext(name) != \".zip\" {\n\t\thhGoproxy.ServeHTTP(res.HTTPResponseWriter(), req.HTTPRequest())\n\t\treturn nil\n\t}\n\n\tif strings.Contains(name, \"..\") {\n\t\tfor _, part := range strings.Split(name, \"/\") {\n\t\t\tif part == \"..\" {\n\t\t\t\treturn CacheableNotFound(req, res, 86400)\n\t\t\t}\n\t\t}\n\t}\n\n\tname = strings.TrimPrefix(path.Clean(name), \"/\")\n\tif !validGoproxyCacheName(name) {\n\t\treturn CacheableNotFound(req, res, 86400)\n\t}\n\n\tvar objectInfo minio.ObjectInfo\n\tif err := retryQiniuKodoDo(req.Context, func(\n\t\tctx context.Context,\n\t) (err error) {\n\t\tobjectInfo, err = qiniuKodoClient.StatObject(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\tname,\n\t\t\tminio.StatObjectOptions{},\n\t\t)\n\t\treturn err\n\t}); err != nil {\n\t\tif isNotFoundMinIOError(err) {\n\t\t\thhGoproxy.ServeHTTP(\n\t\t\t\tres.HTTPResponseWriter(),\n\t\t\t\treq.HTTPRequest(),\n\t\t\t)\n\t\t\treturn nil\n\t\t}\n\n\t\treturn err\n\t}\n\n\tif objectInfo.Size < goproxyAutoRedirectMinSize {\n\t\thhGoproxy.ServeHTTP(res.HTTPResponseWriter(), req.HTTPRequest())\n\t\treturn nil\n\t}\n\n\tu, err := qiniuKodoClient.Presign(\n\t\treq.Context,\n\t\treq.Method,\n\t\tqiniuKodoBucketName,\n\t\tobjectInfo.Key,\n\t\t7*24*time.Hour,\n\t\turl.Values{\n\t\t\t\"response-cache-control\": []string{\n\t\t\t\t\"public, max-age=604800\",\n\t\t\t},\n\t\t},\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn res.Redirect(u.String())\n}\n\n// goproxyCacher implements the `goproxy.Cacher`.\ntype goproxyCacher struct{}\n\n// Get implements the `goproxy.Cacher`.\nfunc (gc *goproxyCacher) Get(\n\tctx context.Context,\n\tname string,\n) (io.ReadCloser, error) {\n\tvar (\n\t\tobject     *minio.Object\n\t\tobjectInfo minio.ObjectInfo\n\t)\n\n\tif err := retryQiniuKodoDo(ctx, func(ctx context.Context) (err error) {\n\t\tobject, err = qiniuKodoClient.GetObject(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\tname,\n\t\t\tminio.GetObjectOptions{},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjectInfo, err = object.Stat()\n\t\tif err != nil {\n\t\t\tobject.Close()\n\t\t}\n\n\t\treturn err\n\t}); err != nil {\n\t\tif isNotFoundMinIOError(err) {\n\t\t\treturn nil, fs.ErrNotExist\n\t\t}\n\n\t\treturn nil, err\n\t}\n\n\tchecksum, _ := hex.DecodeString(objectInfo.ETag)\n\tif len(checksum) != md5.Size {\n\t\teTagChecksum := md5.Sum([]byte(objectInfo.ETag))\n\t\tchecksum = eTagChecksum[:]\n\t}\n\n\treturn &goproxyCacheReader{\n\t\tReadSeekCloser: object,\n\t\tmodTime:        objectInfo.LastModified,\n\t\tchecksum:       checksum,\n\t}, nil\n}\n\n// Put implements the `goproxy.Cacher`.\nfunc (gc *goproxyCacher) Put(\n\tctx context.Context,\n\tname string,\n\tcontent io.ReadSeeker,\n) error {\n\tif err := retryQiniuKodoDo(ctx, func(ctx context.Context) error {\n\t\t_, err := qiniuKodoClient.StatObject(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\tname,\n\t\t\tminio.StatObjectOptions{},\n\t\t)\n\t\treturn err\n\t}); err == nil {\n\t\treturn nil\n\t} else if !isNotFoundMinIOError(err) {\n\t\treturn err\n\t}\n\n\treturn qiniuKodoUpload(ctx, name, content)\n}\n\n// goproxyCacheReader is the reader of the cache unit of the `goproxyCacher`.\ntype goproxyCacheReader struct {\n\tio.ReadSeekCloser\n\n\tmodTime  time.Time\n\tchecksum []byte\n}\n\n// ModTime returns the modification time of the gcr.\nfunc (gcr *goproxyCacheReader) ModTime() time.Time {\n\treturn gcr.modTime\n}\n\n// Checksum returns the checksum of the gcr.\nfunc (gcr *goproxyCacheReader) Checksum() []byte {\n\treturn gcr.checksum\n}\n\n// validGoproxyCacheName reports whether the name is a valid Goproxy cache name.\nfunc validGoproxyCacheName(name string) bool {\n\tescapedModulePath, _, found := strings.Cut(name, \"/@v/\")\n\tif !found {\n\t\treturn false\n\t}\n\n\tif _, err := module.UnescapePath(escapedModulePath); err != nil {\n\t\treturn false\n\t}\n\n\tnameBase := path.Base(name)\n\tnameExt := path.Ext(nameBase)\n\tswitch nameExt {\n\tcase \".info\", \".mod\", \".zip\":\n\tdefault:\n\t\treturn false\n\t}\n\n\tescapedModuleVersion := strings.TrimSuffix(nameBase, nameExt)\n\tmoduleVersion, err := module.UnescapeVersion(escapedModuleVersion)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn semver.IsValid(moduleVersion)\n}\n"
  },
  {
    "path": "handler/handler.go",
    "content": "package handler\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/air-gases/cacheman\"\n\t\"github.com/aofei/air\"\n\t\"github.com/goproxy/goproxy.cn/base\"\n\t\"github.com/minio/minio-go/v7\"\n\t\"github.com/minio/minio-go/v7/pkg/credentials\"\n\t\"github.com/robfig/cron/v3\"\n)\n\nvar (\n\t// qiniuViper is used to get the configuration items of the Qiniu Cloud.\n\tqiniuViper = base.Viper.Sub(\"qiniu\")\n\n\t// qiniuKodoBucketName is the bucket name for the Qiniu Cloud Kodo.\n\tqiniuKodoBucketName = qiniuViper.GetString(\"kodo_bucket_name\")\n\n\t// qiniuKodoMultipartUploadPartSize is the multipart upload part size\n\t// for the Qiniu Cloud Kodo.\n\tqiniuKodoMultipartUploadPartSize = qiniuViper.GetInt64(\"kodo_multipart_upload_part_size\")\n\n\t// qiniuKodoClient is the client for the Qiniu Cloud Kodo.\n\tqiniuKodoClient *minio.Client\n\n\t// qiniuKodoCore is the core for the Qiniu Cloud Kodo.\n\tqiniuKodoCore *minio.Core\n\n\t// getHeadMethods is an array contains the GET and HEAD methods.\n\tgetHeadMethods = []string{http.MethodGet, http.MethodHead}\n\n\t// minutelyCachemanGas is used to manage the Cache-Control header.\n\tminutelyCachemanGas = cacheman.Gas(cacheman.GasConfig{\n\t\tPublic:  true,\n\t\tMaxAge:  60,\n\t\tSMaxAge: -1,\n\t})\n\n\t// hourlyCachemanGas is used to manage the Cache-Control header.\n\thourlyCachemanGas = cacheman.Gas(cacheman.GasConfig{\n\t\tPublic:  true,\n\t\tMaxAge:  3600,\n\t\tSMaxAge: -1,\n\t})\n\n\t// moduleVersionCount is the module version count.\n\tmoduleVersionCount int\n)\n\nfunc init() {\n\tqiniuKodoEndpoint, err := url.Parse(\n\t\tqiniuViper.GetString(\"kodo_endpoint\"),\n\t)\n\tif err != nil {\n\t\tbase.Logger.Fatal().Err(err).\n\t\t\tMsg(\"failed to parse qiniu kodo endpoint\")\n\t}\n\n\tqiniuKodoClientOptions := &minio.Options{\n\t\tCreds: credentials.NewStaticV4(\n\t\t\tqiniuViper.GetString(\"access_key\"),\n\t\t\tqiniuViper.GetString(\"secret_key\"),\n\t\t\t\"\",\n\t\t),\n\t\tSecure: qiniuKodoEndpoint.Scheme == \"https\",\n\t}\n\n\tif qiniuViper.GetBool(\"kodo_force_path_style\") {\n\t\tqiniuKodoClientOptions.BucketLookup = minio.BucketLookupPath\n\t} else {\n\t\tqiniuKodoClientOptions.BucketLookup = minio.BucketLookupDNS\n\t}\n\n\tqiniuKodoEndpoint.Scheme = \"\"\n\tqiniuKodoClient, err = minio.New(\n\t\tstrings.TrimPrefix(qiniuKodoEndpoint.String(), \"//\"),\n\t\tqiniuKodoClientOptions,\n\t)\n\tif err != nil {\n\t\tbase.Logger.Fatal().Err(err).\n\t\t\tMsg(\"failed to create qiniu kodo client\")\n\t}\n\n\tqiniuKodoCore = &minio.Core{\n\t\tClient: qiniuKodoClient,\n\t}\n\n\tif err := updateModuleVersionsCount(); err != nil {\n\t\tbase.Logger.Fatal().Err(err).\n\t\t\tMsg(\"failed to initialize module version count\")\n\t}\n\n\tif _, err := base.Cron.AddJob(\n\t\t\"* * * * *\", // Every minute\n\t\tcron.NewChain(\n\t\t\tcron.SkipIfStillRunning(cron.DiscardLogger),\n\t\t).Then(cron.FuncJob(func() {\n\t\t\terr := updateModuleVersionsCount()\n\t\t\tif err == nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tbase.Logger.Error().Err(err).\n\t\t\t\tMsg(\"failed to update module version count\")\n\t\t})),\n\t); err != nil {\n\t\tbase.Logger.Fatal().Err(err).\n\t\t\tMsg(\"failed to add module version count update cron \" +\n\t\t\t\t\"job\")\n\t}\n\n\tbase.Air.FILE(\"/robots.txt\", \"robots.txt\")\n\tbase.Air.FILE(\"/favicon.ico\", \"favicon.ico\", hourlyCachemanGas)\n\tbase.Air.FILE(\n\t\t\"/apple-touch-icon.png\",\n\t\t\"apple-touch-icon.png\",\n\t\thourlyCachemanGas,\n\t)\n\n\tbase.Air.FILES(\"/assets\", base.Air.CofferAssetRoot, hourlyCachemanGas)\n\n\tbase.Air.BATCH(getHeadMethods, \"/\", hIndexPage)\n}\n\n// NotFound returns not found error.\nfunc NotFound(req *air.Request, res *air.Response) error {\n\tres.Status = http.StatusNotFound\n\treturn errors.New(strings.ToLower(http.StatusText(res.Status)))\n}\n\n// CacheableNotFound returns cacheable not found error.\nfunc CacheableNotFound(req *air.Request, res *air.Response, maxAge int) error {\n\tres.Header.Set(\n\t\t\"Cache-Control\",\n\t\tfmt.Sprintf(\"public, max-age=%d\", maxAge),\n\t)\n\treturn NotFound(req, res)\n}\n\n// MethodNotAllowed returns method not allowed error.\nfunc MethodNotAllowed(req *air.Request, res *air.Response) error {\n\tres.Status = http.StatusMethodNotAllowed\n\treturn errors.New(strings.ToLower(http.StatusText(res.Status)))\n}\n\n// Error handles errors.\nfunc Error(err error, req *air.Request, res *air.Response) {\n\tif res.Written {\n\t\treturn\n\t}\n\n\tif !req.Air.DebugMode && res.Status == http.StatusInternalServerError {\n\t\tres.WriteString(strings.ToLower(http.StatusText(res.Status)))\n\t} else {\n\t\tres.WriteString(err.Error())\n\t}\n}\n\n// hIndexPage handles requests to get index page.\nfunc hIndexPage(req *air.Request, res *air.Response) error {\n\treturn res.Render(map[string]any{\n\t\t\"IsIndexPage\": true,\n\t\t\"ModuleVersionCount\": thousandsCommaSeperated(\n\t\t\tint64(moduleVersionCount),\n\t\t),\n\t}, req.LocalizedString(\"index.html\"), \"layouts/default.html\")\n}\n\n// updateModuleVersionsCount updates the `moduleVersionCount`.\nfunc updateModuleVersionsCount() error {\n\tvar statSummary struct {\n\t\tModuleVersionCount int `json:\"module_version_count\"`\n\t}\n\n\tif err := retryQiniuKodoDo(base.Context, func(\n\t\tctx context.Context,\n\t) error {\n\t\tobject, err := qiniuKodoClient.GetObject(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\t\"stats/summary\",\n\t\t\tminio.GetObjectOptions{},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdefer object.Close()\n\n\t\treturn json.NewDecoder(object).Decode(&statSummary)\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tmoduleVersionCount = statSummary.ModuleVersionCount\n\n\treturn nil\n}\n\n// qiniuKodoUpload uploads the content with the name to the Qiniu Cloud Kodo.\nfunc qiniuKodoUpload(\n\tctx context.Context,\n\tname string,\n\tcontent io.ReadSeeker,\n) (err error) {\n\tvar contentType string\n\tswitch path.Base(name) {\n\tcase \"@latest\":\n\t\tcontentType = \"application/json; charset=utf-8\"\n\tcase \"list\":\n\t\tcontentType = \"text/plain; charset=utf-8\"\n\tdefault:\n\t\tswitch path.Ext(name) {\n\t\tcase \".info\":\n\t\t\tcontentType = \"application/json; charset=utf-8\"\n\t\tcase \".mod\":\n\t\t\tcontentType = \"text/plain; charset=utf-8\"\n\t\tcase \".zip\":\n\t\t\tcontentType = \"application/zip\"\n\t\t}\n\t}\n\n\tvar size int64\n\tif f, ok := content.(*os.File); ok {\n\t\tfi, err := f.Stat()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tsize = fi.Size()\n\t} else if size, err = content.Seek(0, io.SeekEnd); err != nil {\n\t\treturn err\n\t} else if _, err := content.Seek(0, io.SeekStart); err != nil {\n\t\treturn err\n\t}\n\n\tif size <= qiniuKodoMultipartUploadPartSize {\n\t\tcontent := content\n\t\tif ra, ok := content.(io.ReaderAt); ok {\n\t\t\tcontent = io.NewSectionReader(ra, 0, size)\n\t\t} else if _, err := content.Seek(0, io.SeekStart); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn retryQiniuKodoDo(ctx, func(ctx context.Context) error {\n\t\t\t_, err := qiniuKodoCore.PutObject(\n\t\t\t\tctx,\n\t\t\t\tqiniuKodoBucketName,\n\t\t\t\tname,\n\t\t\t\tcontent,\n\t\t\t\tsize,\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\tminio.PutObjectOptions{\n\t\t\t\t\tContentType: contentType,\n\t\t\t\t},\n\t\t\t)\n\t\t\treturn err\n\t\t})\n\t}\n\n\tvar uploadID string\n\tif err := retryQiniuKodoDo(ctx, func(ctx context.Context) (err error) {\n\t\tuploadID, err = qiniuKodoCore.NewMultipartUpload(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\tname,\n\t\t\tminio.PutObjectOptions{\n\t\t\t\tContentType: contentType,\n\t\t\t},\n\t\t)\n\t\treturn err\n\t}); err != nil {\n\t\treturn err\n\t}\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tretryQiniuKodoDo(ctx, func(ctx context.Context) error {\n\t\t\t\treturn qiniuKodoCore.AbortMultipartUpload(\n\t\t\t\t\tctx,\n\t\t\t\t\tqiniuKodoBucketName,\n\t\t\t\t\tname,\n\t\t\t\t\tuploadID,\n\t\t\t\t)\n\t\t\t})\n\t\t}\n\t}()\n\n\tvar completeParts []minio.CompletePart\n\tfor offset := int64(0); offset < size; {\n\t\tpartSize := min(qiniuKodoMultipartUploadPartSize, size-offset)\n\n\t\tvar part minio.ObjectPart\n\t\tif err := retryQiniuKodoDo(ctx, func(\n\t\t\tctx context.Context,\n\t\t) (err error) {\n\t\t\tcontent := content\n\t\t\tif ra, ok := content.(io.ReaderAt); ok {\n\t\t\t\tcontent = io.NewSectionReader(\n\t\t\t\t\tra,\n\t\t\t\t\toffset,\n\t\t\t\t\tpartSize,\n\t\t\t\t)\n\t\t\t} else if _, err := content.Seek(\n\t\t\t\toffset,\n\t\t\t\tio.SeekStart,\n\t\t\t); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tpart, err = qiniuKodoCore.PutObjectPart(\n\t\t\t\tctx,\n\t\t\t\tqiniuKodoBucketName,\n\t\t\t\tname,\n\t\t\t\tuploadID,\n\t\t\t\tlen(completeParts)+1,\n\t\t\t\tio.LimitReader(content, partSize),\n\t\t\t\tpartSize,\n\t\t\t\tminio.PutObjectPartOptions{},\n\t\t\t)\n\n\t\t\treturn err\n\t\t}); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tcompleteParts = append(completeParts, minio.CompletePart{\n\t\t\tPartNumber: part.PartNumber,\n\t\t\tETag:       part.ETag,\n\t\t})\n\n\t\toffset += part.Size\n\t}\n\n\treturn retryQiniuKodoDo(ctx, func(ctx context.Context) error {\n\t\t_, err := qiniuKodoCore.CompleteMultipartUpload(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\tname,\n\t\t\tuploadID,\n\t\t\tcompleteParts,\n\t\t\tminio.PutObjectOptions{\n\t\t\t\tContentType: contentType,\n\t\t\t},\n\t\t)\n\t\treturn err\n\t})\n}\n\n// retryQiniuKodoDo retries a Qiniu Cloud Kodo operation in case of some special\n// errors.\nfunc retryQiniuKodoDo(\n\tctx context.Context,\n\tf func(ctx context.Context) error,\n) error {\n\treturn base.RetryN(ctx, f, func(err error) bool {\n\t\tswitch minio.ToErrorResponse(err).StatusCode {\n\t\tcase 573, 579, 599:\n\t\t\treturn true\n\t\t}\n\n\t\treturn false\n\t}, 100*time.Millisecond, 10)\n}\n\n// isNotFoundMinIOError reports whether the err is MinIO not found error.\nfunc isNotFoundMinIOError(err error) bool {\n\treturn minio.ToErrorResponse(err).StatusCode == http.StatusNotFound\n}\n\n// thousandsCommaSeperated returns a thousands comma separated string for the n.\nfunc thousandsCommaSeperated(n int64) string {\n\tin := strconv.FormatInt(n, 10)\n\tnumOfDigits := len(in)\n\tif n < 0 {\n\t\tnumOfDigits--\n\t}\n\n\tnumOfCommas := (numOfDigits - 1) / 3\n\n\tout := make([]byte, len(in)+numOfCommas)\n\tif n < 0 {\n\t\tin, out[0] = in[1:], '-'\n\t}\n\n\tfor i, j, k := len(in)-1, len(out)-1, 0; ; i, j = i-1, j-1 {\n\t\tout[j] = in[i]\n\t\tif i == 0 {\n\t\t\treturn string(out)\n\t\t}\n\t\tif k++; k == 3 {\n\t\t\tj, k = j-1, 0\n\t\t\tout[j] = ','\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "handler/stat.go",
    "content": "package handler\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aofei/air\"\n\t\"github.com/goproxy/goproxy.cn/base\"\n\t\"github.com/minio/minio-go/v7\"\n\t\"golang.org/x/mod/module\"\n)\n\n// moduleVersionStat is the module version statastic.\ntype moduleVersionStat struct {\n\tDownloadCount int `json:\"download_count\"`\n\tLast30Days    []struct {\n\t\tDate          time.Time `json:\"date\"`\n\t\tDownloadCount int       `json:\"download_count\"`\n\t} `json:\"last_30_days\"`\n\tTop10ModuleVersions []struct {\n\t\tModuleVersion string `json:\"module_version\"`\n\t\tDownloadCount int    `json:\"download_count\"`\n\t} `json:\"top_10_module_versions,omitempty\"`\n}\n\n// updateLast30Days updates `mvs.Last30Days` to the date.\nfunc (mvs *moduleVersionStat) updateLast30Days(date time.Time) {\n\tlast30Days := make([]struct {\n\t\tDate          time.Time `json:\"date\"`\n\t\tDownloadCount int       `json:\"download_count\"`\n\t}, 30)\n\n\tfor i := range len(last30Days) {\n\t\tlast30Days[i].Date = date.AddDate(0, 0, -i)\n\t\tfor _, d := range mvs.Last30Days {\n\t\t\tif d.Date.Equal(last30Days[i].Date) {\n\t\t\t\tlast30Days[i].DownloadCount = d.DownloadCount\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tmvs.Last30Days = last30Days\n}\n\nfunc init() {\n\tbase.Air.BATCH(\n\t\tgetHeadMethods,\n\t\t\"/stats/summary\",\n\t\thStatSummary,\n\t\tminutelyCachemanGas,\n\t)\n\n\tbase.Air.BATCH(\n\t\tgetHeadMethods,\n\t\t\"/stats/trends/:Trend\",\n\t\thStatTrend,\n\t\thourlyCachemanGas,\n\t)\n\n\tbase.Air.BATCH(getHeadMethods, \"/stats/*\", hStat, hourlyCachemanGas)\n\n\tbase.Air.BATCH(getHeadMethods, \"/stats\", hStatsPage)\n}\n\n// hStatSummary handles requests to query stat summary.\nfunc hStatSummary(req *air.Request, res *air.Response) error {\n\tvar (\n\t\tobject     *minio.Object\n\t\tobjectInfo minio.ObjectInfo\n\t)\n\n\tif err := retryQiniuKodoDo(req.Context, func(\n\t\tctx context.Context,\n\t) (err error) {\n\t\tobject, err = qiniuKodoClient.GetObject(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\t\"stats/summary\",\n\t\t\tminio.GetObjectOptions{},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjectInfo, err = object.Stat()\n\t\tif err != nil {\n\t\t\tobject.Close()\n\t\t}\n\n\t\treturn err\n\t}); err != nil {\n\t\tif isNotFoundMinIOError(err) {\n\t\t\treturn NotFound(req, res)\n\t\t}\n\n\t\treturn err\n\t}\n\tdefer object.Close()\n\n\tres.Header.Set(\"Content-Type\", objectInfo.ContentType)\n\tres.Header.Set(\"ETag\", fmt.Sprintf(\"%q\", objectInfo.ETag))\n\tres.Header.Set(\n\t\t\"Last-Modified\",\n\t\tobjectInfo.LastModified.UTC().Format(http.TimeFormat),\n\t)\n\n\treturn res.Write(object)\n}\n\n// hStatTrend handles requests to query stat trend.\nfunc hStatTrend(req *air.Request, res *air.Response) error {\n\ttrend := req.ParamValue(\"Trend\").String()\n\tswitch trend {\n\tcase \"latest\", \"last-7-days\", \"last-30-days\":\n\tdefault:\n\t\treturn NotFound(req, res)\n\t}\n\n\tvar (\n\t\tobject     *minio.Object\n\t\tobjectInfo minio.ObjectInfo\n\t)\n\n\tif err := retryQiniuKodoDo(req.Context, func(\n\t\tctx context.Context,\n\t) (err error) {\n\t\tobject, err = qiniuKodoClient.GetObject(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\tfmt.Sprint(\"stats/trends/\", trend),\n\t\t\tminio.GetObjectOptions{},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjectInfo, err = object.Stat()\n\t\tif err != nil {\n\t\t\tobject.Close()\n\t\t}\n\n\t\treturn err\n\t}); err != nil {\n\t\tif isNotFoundMinIOError(err) {\n\t\t\treturn NotFound(req, res)\n\t\t}\n\n\t\treturn err\n\t}\n\tdefer object.Close()\n\n\tres.Header.Set(\"Content-Type\", objectInfo.ContentType)\n\tres.Header.Set(\"ETag\", fmt.Sprintf(\"%q\", objectInfo.ETag))\n\tres.Header.Set(\n\t\t\"Last-Modified\",\n\t\tobjectInfo.LastModified.UTC().Format(http.TimeFormat),\n\t)\n\n\treturn res.Write(object)\n}\n\n// hStat handles requests to query stat.\nfunc hStat(req *air.Request, res *air.Response) error {\n\tconst downloadCountBadgeSuffix = \"/badges/download-count.svg\"\n\n\tname, err := url.PathUnescape(req.ParamValue(\"*\").String())\n\tif err != nil || strings.HasSuffix(name, \"/\") {\n\t\treturn CacheableNotFound(req, res, 86400)\n\t}\n\n\tif strings.Contains(name, \"..\") {\n\t\tfor _, part := range strings.Split(name, \"/\") {\n\t\t\tif part == \"..\" {\n\t\t\t\treturn CacheableNotFound(req, res, 86400)\n\t\t\t}\n\t\t}\n\t}\n\n\tname = strings.TrimPrefix(path.Clean(name), \"/\")\n\n\thasDownloadCountBadgeSuffix := strings.HasSuffix(\n\t\tname,\n\t\tdownloadCountBadgeSuffix,\n\t)\n\tif hasDownloadCountBadgeSuffix {\n\t\tif module.CheckPath(strings.TrimSuffix(\n\t\t\tname,\n\t\t\tdownloadCountBadgeSuffix,\n\t\t)) != nil {\n\t\t\treturn CacheableNotFound(req, res, 86400)\n\t\t}\n\t} else if path, version, found := strings.Cut(name, \"@\"); found {\n\t\tif module.Check(path, version) != nil {\n\t\t\treturn CacheableNotFound(req, res, 86400)\n\t\t}\n\t} else if module.CheckPath(name) != nil {\n\t\treturn CacheableNotFound(req, res, 86400)\n\t}\n\n\tdate := time.Now().UTC()\n\tdate = time.Date(\n\t\tdate.Year(),\n\t\tdate.Month(),\n\t\tdate.Day()-1,\n\t\t0,\n\t\t0,\n\t\t0,\n\t\t0,\n\t\ttime.UTC,\n\t)\n\n\tvar (\n\t\tobject     *minio.Object\n\t\tobjectInfo minio.ObjectInfo\n\t)\n\n\tif err := retryQiniuKodoDo(req.Context, func(\n\t\tctx context.Context,\n\t) (err error) {\n\t\tobject, err = qiniuKodoClient.GetObject(\n\t\t\tctx,\n\t\t\tqiniuKodoBucketName,\n\t\t\tpath.Join(\"stats\", name),\n\t\t\tminio.GetObjectOptions{},\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjectInfo, err = object.Stat()\n\t\tif err != nil {\n\t\t\tobject.Close()\n\t\t}\n\n\t\treturn err\n\t}); err != nil {\n\t\tif isNotFoundMinIOError(err) {\n\t\t\tif hasDownloadCountBadgeSuffix {\n\t\t\t\tres.Header.Set(\"Content-Type\", \"image/svg+xml\")\n\t\t\t\treturn res.WriteFile(\"unknown-badge.svg\")\n\t\t\t}\n\n\t\t\tvar stat moduleVersionStat\n\t\t\tstat.updateLast30Days(date)\n\n\t\t\tstatJSON, err := json.Marshal(stat)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tres.Header.Set(\n\t\t\t\t\"Content-Type\",\n\t\t\t\t\"application/json; charset=utf-8\",\n\t\t\t)\n\n\t\t\treturn res.Write(bytes.NewReader(statJSON))\n\t\t}\n\n\t\treturn err\n\t}\n\tdefer object.Close()\n\n\tif hasDownloadCountBadgeSuffix {\n\t\tres.Header.Set(\"Content-Type\", objectInfo.ContentType)\n\t\tres.Header.Set(\"ETag\", fmt.Sprintf(\"%q\", objectInfo.ETag))\n\t\tres.Header.Set(\n\t\t\t\"Last-Modified\",\n\t\t\tobjectInfo.LastModified.UTC().Format(http.TimeFormat),\n\t\t)\n\t\treturn res.Write(object)\n\t}\n\n\tb, err := io.ReadAll(object)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar stat moduleVersionStat\n\tif err := json.Unmarshal(b, &stat); err != nil {\n\t\treturn err\n\t}\n\n\tstat.updateLast30Days(date)\n\n\tstatJSON, err := json.Marshal(stat)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tres.Header.Set(\"Content-Type\", objectInfo.ContentType)\n\n\treturn res.Write(bytes.NewReader(statJSON))\n}\n\n// hStatsPage handles requests to get statistics page.\nfunc hStatsPage(req *air.Request, res *air.Response) error {\n\treturn res.Render(map[string]any{\n\t\t\"PageTitle\":     req.LocalizedString(\"Statistics\"),\n\t\t\"CanonicalPath\": \"/stats\",\n\t\t\"IsStatsPage\":   true,\n\t}, req.LocalizedString(\"stats.html\"), \"layouts/default.html\")\n}\n"
  },
  {
    "path": "locales/en-US.toml",
    "content": "\"Aofei Sheng\" = \"Aofei Sheng\"\n\"Contact\" = \"Contact\"\n\"Index\" = \"Index\"\n\"Qiniu Cloud\" = \"Qiniu Cloud\"\n\"Statistics\" = \"Statistics\"\n\"Status\" = \"Status\"\n\"The most trusted Go module proxy in China.\" = \"The most trusted Go module proxy in China.\"\n\"https://www.qiniu.com/en\" = \"https://www.qiniu.com/en\"\n\"i18n.locale\" = \"English\"\n\"index.html\" = \"index.html\"\n\"stats.html\" = \"stats.html\"\n"
  },
  {
    "path": "locales/zh-CN.toml",
    "content": "\"Aofei Sheng\" = \"盛傲飞\"\n\"Contact\" = \"联系我们\"\n\"Index\" = \"首页\"\n\"Qiniu Cloud\" = \"七牛云\"\n\"Statistics\" = \"统计数据\"\n\"Status\" = \"状态页\"\n\"The most trusted Go module proxy in China.\" = \"中国最可靠的 Go 模块代理。\"\n\"https://www.qiniu.com/en\" = \"https://www.qiniu.com\"\n\"i18n.locale\" = \"简体中文\"\n\"index.html\" = \"index.zh-CN.html\"\n\"stats.html\" = \"stats.zh-CN.html\"\n"
  },
  {
    "path": "main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"net/url\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"github.com/air-gases/defibrillator\"\n\t\"github.com/air-gases/langman\"\n\t\"github.com/air-gases/limiter\"\n\t\"github.com/air-gases/logger\"\n\t\"github.com/aofei/air\"\n\t\"github.com/goproxy/goproxy.cn/base\"\n\t\"github.com/goproxy/goproxy.cn/handler\"\n)\n\nfunc main() {\n\tbase.Air.NotFoundHandler = handler.NotFound\n\tbase.Air.MethodNotAllowedHandler = handler.MethodNotAllowed\n\tbase.Air.ErrorHandler = handler.Error\n\tbase.Air.ErrorLogger = log.New(base.Logger, \"\", 0)\n\n\tbase.Air.Pregases = []air.Gas{\n\t\tlogger.Gas(logger.GasConfig{\n\t\t\tLogger:               &base.Logger,\n\t\t\tIncludeClientAddress: true,\n\t\t}),\n\t\tdefibrillator.Gas(defibrillator.GasConfig{}),\n\t\tlimiter.BodySizeGas(limiter.BodySizeGasConfig{\n\t\t\tMaxBytes: 1 << 20,\n\t\t}),\n\t\tfunc(next air.Handler) air.Handler {\n\t\t\treturn func(req *air.Request, res *air.Response) error {\n\t\t\t\tpath, err := url.PathUnescape(req.Path)\n\t\t\t\tif err != nil || !utf8.ValidString(path) {\n\t\t\t\t\treturn handler.CacheableNotFound(\n\t\t\t\t\t\treq,\n\t\t\t\t\t\tres,\n\t\t\t\t\t\t86400,\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\treturn next(req, res)\n\t\t\t}\n\t\t},\n\t}\n\n\tbase.Air.Gases = []air.Gas{\n\t\tlangman.Gas(langman.GasConfig{\n\t\t\tCookieMaxAge: 31536000,\n\t\t}),\n\t}\n\n\tgo func() {\n\t\tif err := base.Air.Serve(); err != nil {\n\t\t\tbase.Logger.Error().Err(err).\n\t\t\t\tMsg(\"air server error\")\n\t\t}\n\t}()\n\n\tshutdownChan := make(chan os.Signal, 1)\n\tsignal.Notify(shutdownChan, os.Interrupt, syscall.SIGTERM)\n\t<-shutdownChan\n\n\tctx, cancel := context.WithTimeout(context.Background(), time.Minute)\n\tdefer cancel()\n\n\tbase.Air.Shutdown(ctx)\n}\n"
  },
  {
    "path": "robots.txt",
    "content": "User-agent: *\nDisallow: /*/@latest\nDisallow: /*/@v/list\nDisallow: /*/@v/*.info\nDisallow: /*/@v/*.mod\nDisallow: /*/@v/*.zip\nDisallow: /sumdb/\nDisallow: /stats/\n"
  },
  {
    "path": "templates/index.html",
    "content": "<div class=\"jumbotron\">\n\t<div class=\"container text-center\">\n\t\t<img class=\"logo\" src=\"/assets/images/logo.svg\">\n\t\t<h1 class=\"brand display-3\">Goproxy.cn</h1>\n\t\t<p>The most trusted Go module proxy in China.</p>\n\t\t<p><span class=\"badge badge-success\">{{.ModuleVersionCount}} module versions cached</span></p>\n\t\t<a class=\"github-button\" href=\"https://github.com/goproxy/goproxy.cn\" data-size=\"large\" data-show-count=\"true\" aria-label=\"Star goproxy/goproxy.cn on GitHub\">Star</a>\n\t</div>\n</div>\n\n<div class=\"container\">\n\t<div class=\"row text-center\">\n\t\t<div class=\"col-md-3\">\n\t\t\t<h3 class=\"text-info\"><i class=\"fas fa-rocket\"></i>&nbsp;Blazing Fast</h3>\n\t\t\t<p>We are using <a href=\"https://www.qiniu.com/en/products/qcdn\" target=\"_blank\">Qiniu Cloud CDN</a> to accelerate our service globally without placing any bandwidth limits. With thousands of CDN nodes and <b>100Gbps+ single-node bandwidth</b>, you will be given the ability to download module versions at a blazing fast speed.</p>\n\t\t</div>\n\n\t\t<div class=\"col-md-3\">\n\t\t\t<h3 class=\"text-info\"><i class=\"fas fa-infinity\"></i>&nbsp;No Limit</h3>\n\t\t\t<p>We do not just place no bandwidth limits. Furthermore, we <b>have not placed any rate limits</b>. This means that you can use our service in any scenario, like CI/CD. You can even use our service as an upstream proxy, just like <a href=\"https://goproxy.baidu.com\" target=\"_blank\">goproxy.baidu.com</a> does.</p>\n\t\t</div>\n\n\t\t<div class=\"col-md-3\">\n\t\t\t<h3 class=\"text-info\"><i class=\"fas fa-th-large\"></i>&nbsp;Full Featured</h3>\n\t\t\t<p>We are always using the latest Go version, even the unstable version. Because we provide <b>cutting-edge feature support</b>. In particular, we support <a href=\"https://go.dev/design/25530-sumdb#proxying-a-checksum-database\" target=\"_blank\">proxying</a> the default checksum database <a href=\"https://sum.golang.org\" target=\"_blank\">sum.golang.org</a>. You don't need to do anything extra, it just works.</p>\n\t\t</div>\n\n\t\t<div class=\"col-md-3\">\n\t\t\t<h3 class=\"text-info\"><i class=\"fas fa-eye\"></i>&nbsp;Data Visualized</h3>\n\t\t\t<p>For everyone to better understand the activity of all modules in our service, we have launched the very first <a href=\"/stats\">Statistics API</a> of the Go module proxy world. With the decent RESTful API design, you will be able to easily query statistics for all module versions in our service.</p>\n\t\t</div>\n\t</div>\n\n\t<hr>\n\n\t<div class=\"row text-center\">\n\t\t<div class=\"col-md\">\n\t\t\t<h3 id=\"usage\"><a class=\"font-weight-bold text-info\" href=\"#usage\">Usage</a></h3>\n\t\t</div>\n\t</div>\n\n\t<div class=\"row\">\n\t\t<div class=\"col-md\">\n\t\t\t<p id=\"usage-go-113-and-above-recommended\"><a class=\"font-weight-bold text-info\" href=\"#usage-go-113-and-above-recommended\">Go 1.13 and above (RECOMMENDED)</a></p>\n\t\t\t<p>Open your terminal and execute</p>\n\t\t\t<pre><code class=\"language-bash\">$ go env -w GO111MODULE=on\n$ go env -w GOPROXY=https://goproxy.cn,direct</code></pre>\n\t\t\t<p>done.</p>\n\n\t\t\t<p id=\"usage-macos-or-linux\"><a class=\"font-weight-bold text-info\" href=\"#usage-macos-or-linux\">macOS or Linux</a></p>\n\t\t\t<p>Open your terminal and execute</p>\n\t\t\t<pre><code class=\"language-bash\">$ export GO111MODULE=on\n$ export GOPROXY=https://goproxy.cn</code></pre>\n\t\t\t<p>or</p>\n\t\t\t<pre><code class=\"language-bash\">$ echo \"export GO111MODULE=on\" >> ~/.profile\n$ echo \"export GOPROXY=https://goproxy.cn\" >> ~/.profile\n$ source ~/.profile</code></pre>\n\t\t\t<p>done.</p>\n\n\t\t\t<p id=\"usage-windows\"><a class=\"font-weight-bold text-info\" href=\"#usage-windows\">Windows</a></p>\n\t\t\t<p>Open your terminal and execute</p>\n\t\t\t<pre><code class=\"language-bash\">C:\\> $env:GO111MODULE = \"on\"\nC:\\> $env:GOPROXY = \"https://goproxy.cn\"</code></pre>\n\t\t\t<p>or</p>\n\t\t\t<pre><code class=\"language-md\">1. Open the Start Search, type in \"env\"\n2. Choose the \"Edit the system environment variables\"\n3. Click the \"Environment Variables…\" button\n4. Under the \"User variables for &lt;YOUR_USERNAME&gt;\" section (the upper half)\n5. Click the \"New...\" button\n6. Choose the \"Variable name\" input bar, type in \"GO111MODULE\"\n7. Choose the \"Variable value\" input bar, type in \"on\"\n8. Click the \"OK\" button\n9. Click the \"New...\" button\n10. Choose the \"Variable name\" input bar, type in \"GOPROXY\"\n11. Choose the \"Variable value\" input bar, type in \"https://goproxy.cn\"\n12. Click the \"OK\" button</code></pre>\n\t\t\t<p>done.</p>\n\t\t</div>\n\t</div>\n\n\t<hr>\n\n\t<div class=\"row text-center\">\n\t\t<div class=\"col-md\">\n\t\t\t<h3 id=\"self-hosted-go-module-proxy\"><a class=\"font-weight-bold text-info\" href=\"#self-hosted-go-module-proxy\">Self-hosted Go module proxy</a></h3>\n\t\t</div>\n\t</div>\n\n\t<div class=\"row\">\n\t\t<div class=\"col-md\">\n\t\t\t<p>Your code is always yours, so we provide you with the coolest self-hosted Go module proxy building solution in the world. By using <a href=\"https://github.com/goproxy/goproxy\" target=\"_blank\">Goproxy</a>, a minimalist project, you can easily add Go module proxy support to any existing web service, you know that Goproxy.cn is built on it.</p>\n\t\t\t<p>Create a file named <code>goproxy.go</code></p>\n\t\t\t<pre><code class=\"language-go\">package main\n\nimport (\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/goproxy/goproxy\"\n)\n\nfunc main() {\n\thttp.ListenAndServe(\"localhost:8080\", &goproxy.Goproxy{\n\t\tGoBinEnv: append(\n\t\t\tos.Environ(),\n\t\t\t\"GOPROXY=https://goproxy.cn,direct\", // Use Goproxy.cn as the upstream proxy\n\t\t\t\"GOPRIVATE=git.example.com\",         // Solve the problem of pulling private modules\n\t\t),\n\t\tProxiedSUMDBs: []string{\n\t\t\t\"sum.golang.org https://goproxy.cn/sumdb/sum.golang.org\", // Proxy the default checksum database\n\t\t},\n\t})\n}</code></pre>\n\t\t\t<p>and run it</p>\n\t\t\t<pre><code class=\"language-bash\">$ go run goproxy.go</code></pre>\n\t\t\t<p>then try it by setting <code>GOPROXY</code> to <code>http://localhost:8080</code>. In addition, we also recommend that you set <code>GO111MODULE</code> to <code>on</code>.</p>\n\t\t\t<p>That's it, a fully functional Go module proxy is successfully built. In fact, you can use <a href=\"https://github.com/goproxy/goproxy\" target=\"_blank\">Goproxy</a> with your favorite web frameworks, such as <a href=\"https://pkg.go.dev/github.com/gin-gonic/gin#WrapH\" target=\"_blank\">Gin</a> and <a href=\"https://pkg.go.dev/github.com/labstack/echo/v4#WrapHandler\" target=\"_blank\">Echo</a>, all you need to do is add one more route. For more advanced usage please check the <a href=\"https://pkg.go.dev/github.com/goproxy/goproxy\" target=\"_blank\">documentation</a>.</p>\n\t\t</div>\n\t</div>\n</div>\n"
  },
  {
    "path": "templates/index.zh-CN.html",
    "content": "<div class=\"jumbotron\">\n\t<div class=\"container text-center\">\n\t\t<img class=\"logo\" src=\"/assets/images/logo.svg\">\n\t\t<h1 class=\"brand display-3\">Goproxy.cn</h1>\n\t\t<p>中国最可靠的 Go 模块代理。</p>\n\t\t<p><span class=\"badge badge-success\">已缓存 {{.ModuleVersionCount}} 个模块版本</span></p>\n\t\t<a class=\"github-button\" href=\"https://github.com/goproxy/goproxy.cn\" data-size=\"large\" data-show-count=\"true\" aria-label=\"Star goproxy/goproxy.cn on GitHub\">Star</a>\n\t</div>\n</div>\n\n<div class=\"container\">\n\t<div class=\"row text-center\">\n\t\t<div class=\"col-md-3\">\n\t\t\t<h3 class=\"text-info\"><i class=\"fas fa-rocket\"></i>&nbsp;极速下载</h3>\n\t\t\t<p>我们正在使用<a href=\"https://www.qiniu.com/products/qcdn\" target=\"_blank\">七牛云 CDN</a> 在全球范围内加速我们的服务，并且我们没有设置任何带宽限制。凭借着数以千计的 CDN 节点和 <b>100Gbps+ 的单节点带宽</b>，你将被赋予一个以极快的速度下载模块版本的能力。</p>\n\t\t</div>\n\n\t\t<div class=\"col-md-3\">\n\t\t\t<h3 class=\"text-info\"><i class=\"fas fa-infinity\"></i>&nbsp;没有限制</h3>\n\t\t\t<p>我们不但没有设置带宽限制。更进一步地，我们还<b>没有设置任何速率限制</b>。这意味着你可以在任何场景下使用我们的服务，例如 CI/CD。你甚至可以像 <a href=\"https://goproxy.baidu.com\" target=\"_blank\">goproxy.baidu.com</a> 一样将我们的服务用作上游代理。</p>\n\t\t</div>\n\n\t\t<div class=\"col-md-3\">\n\t\t\t<h3 class=\"text-info\"><i class=\"fas fa-th-large\"></i>&nbsp;功能齐全</h3>\n\t\t\t<p>我们一直在使用最新的 Go 版本，甚至是不稳定版本，因此我们提供了<b>最前沿的功能支持</b>。特别地，我们支持<a href=\"https://go.dev/design/25530-sumdb#proxying-a-checksum-database\" target=\"_blank\">代理</a>默认的校验和数据库 <a href=\"https://sum.golang.org\" target=\"_blank\">sum.golang.org</a>。你无需进行其他额外的配置，它便可以正常工作。</p>\n\t\t</div>\n\n\t\t<div class=\"col-md-3\">\n\t\t\t<h3 class=\"text-info\"><i class=\"fas fa-eye\"></i>&nbsp;数据可视</h3>\n\t\t\t<p>为了使大家可以更好地了解我们的服务中所有模块的活跃度，我们推出了 Go 模块代理世界中的首个<a href=\"/stats\">统计数据 API</a>。通过得体的 RESTful API 设计，你将能够轻松地查询我们服务中所有模块版本的统计数据。</p>\n\t\t</div>\n\t</div>\n\n\t<hr>\n\n\t<div class=\"row text-center\">\n\t\t<div class=\"col-md\">\n\t\t\t<h3 id=\"usage\"><a class=\"font-weight-bold text-info\" href=\"#usage\">用法</a></h3>\n\t\t</div>\n\t</div>\n\n\t<div class=\"row\">\n\t\t<div class=\"col-md\">\n\t\t\t<p id=\"usage-go-113-and-above-recommended\"><a class=\"font-weight-bold text-info\" href=\"#usage-go-113-and-above-recommended\">Go 1.13 及以上（推荐）</a></p>\n\t\t\t<p>打开你的终端并执行</p>\n\t\t\t<pre><code class=\"language-bash\">$ go env -w GO111MODULE=on\n$ go env -w GOPROXY=https://goproxy.cn,direct</code></pre>\n\t\t\t<p>完成。</p>\n\n\t\t\t<p id=\"usage-macos-or-linux\"><a class=\"font-weight-bold text-info\" href=\"#usage-macos-or-linux\">macOS 或 Linux</a></p>\n\t\t\t<p>打开你的终端并执行</p>\n\t\t\t<pre><code class=\"language-bash\">$ export GO111MODULE=on\n$ export GOPROXY=https://goproxy.cn</code></pre>\n\t\t\t<p>或者</p>\n\t\t\t<pre><code class=\"language-bash\">$ echo \"export GO111MODULE=on\" >> ~/.profile\n$ echo \"export GOPROXY=https://goproxy.cn\" >> ~/.profile\n$ source ~/.profile</code></pre>\n\t\t\t<p>完成。</p>\n\n\t\t\t<p id=\"usage-windows\"><a class=\"font-weight-bold text-info\" href=\"#usage-windows\">Windows</a></p>\n\t\t\t<p>打开你的 PowerShell 并执行</p>\n\t\t\t<pre><code class=\"language-bash\">C:\\> $env:GO111MODULE = \"on\"\nC:\\> $env:GOPROXY = \"https://goproxy.cn\"</code></pre>\n\t\t\t<p>或者</p>\n\t\t\t<pre><code class=\"language-md\">1. 打开“开始”并搜索“env”\n2. 选择“编辑系统环境变量”\n3. 点击“环境变量…”按钮\n4. 在“&lt;你的用户名&gt; 的用户变量”章节下（上半部分）\n5. 点击“新建…”按钮\n6. 选择“变量名”输入框并输入“GO111MODULE”\n7. 选择“变量值”输入框并输入“on”\n8. 点击“确定”按钮\n9. 点击“新建…”按钮\n10. 选择“变量名”输入框并输入“GOPROXY”\n11. 选择“变量值”输入框并输入“https://goproxy.cn”\n12. 点击“确定”按钮</code></pre>\n\t\t\t<p>完成。</p>\n\t\t</div>\n\t</div>\n\n\t<hr>\n\n\t<div class=\"row text-center\">\n\t\t<div class=\"col-md\">\n\t\t\t<h3 id=\"self-hosted-go-module-proxy\"><a class=\"font-weight-bold text-info\" href=\"#self-hosted-go-module-proxy\">自托管 Go 模块代理</a></h3>\n\t\t</div>\n\t</div>\n\n\t<div class=\"row\">\n\t\t<div class=\"col-md\">\n\t\t\t<p>你的代码永远只属于你自己，因此我们向你提供目前世界上最炫酷的自托管 Go 模块代理搭建方案。通过使用 <a href=\"https://github.com/goproxy/goproxy\" target=\"_blank\">Goproxy</a> 这个极简主义项目，你可以在现有的任意 Web 服务中轻松地引入 Go 模块代理支持，要知道 Goproxy.cn 就是基于它搭建的。</p>\n\t\t\t<p>创建一个名为 <code>goproxy.go</code> 的文件</p>\n\t\t\t<pre><code class=\"language-go\">package main\n\nimport (\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/goproxy/goproxy\"\n)\n\nfunc main() {\n\thttp.ListenAndServe(\"localhost:8080\", &goproxy.Goproxy{\n\t\tGoBinEnv: append(\n\t\t\tos.Environ(),\n\t\t\t\"GOPROXY=https://goproxy.cn,direct\", // 使用 Goproxy.cn 作为上游代理\n\t\t\t\"GOPRIVATE=git.example.com\",         // 解决私有模块的拉取问题（比如可以配置成公司内部的代码源）\n\t\t),\n\t\tProxiedSUMDBs: []string{\n\t\t\t\"sum.golang.org https://goproxy.cn/sumdb/sum.golang.org\", // 代理默认的校验和数据库\n\t\t},\n\t})\n}</code></pre>\n\t\t\t<p>并且运行它</p>\n\t\t\t<pre><code class=\"language-bash\">$ go run goproxy.go</code></pre>\n\t\t\t<p>然后通过把 <code>GOPROXY</code> 设置为 <code>http://localhost:8080</code> 来试用它。另外，我们也建议你把 <code>GO111MODULE</code> 设置为 <code>on</code>。</p>\n\t\t\t<p>就这么简单，一个功能完备的 Go 模块代理就搭建成功了。事实上，你还可以将 <a href=\"https://github.com/goproxy/goproxy\" target=\"_blank\">Goproxy</a> 结合着你钟爱的 Web 框架一起使用，比如 <a href=\"https://pkg.go.dev/github.com/gin-gonic/gin#WrapH\" target=\"_blank\">Gin</a> 和 <a href=\"https://pkg.go.dev/github.com/labstack/echo/v4#WrapHandler\" target=\"_blank\">Echo</a>，你所需要做的只是多添加一条路由而已。更高级的用法请查看<a href=\"https://pkg.go.dev/github.com/goproxy/goproxy\" target=\"_blank\">文档</a>。</p>\n\t\t</div>\n\t</div>\n</div>\n"
  },
  {
    "path": "templates/layouts/default.html",
    "content": "<!DOCTYPE html>\n<html>\n\t{{template \"parts/head.html\" .}}\n\n\t<body>\n\t\t{{template \"parts/header.html\" .}}\n\t\t<main>{{.InheritedHTML}}</main>\n\t\t<hr>\n\t\t{{template \"parts/footer.html\" .}}\n\t\t{{template \"parts/scripts.html\" .}}\n\t</body>\n</html>\n"
  },
  {
    "path": "templates/parts/footer.html",
    "content": "<footer class=\"container\">\n\t<p><a href=\"https://beian.miit.gov.cn\" target=\"_blank\">沪ICP备11037377号-56</a></p>\n\t<p>\n\t\t&copy; <a href=\"{{locstr \"https://www.qiniu.com/en\"}}\" target=\"_blank\">{{locstr \"Qiniu Cloud\"}}</a>\n\t\t&middot;\n\t\t<a class=\"language-item {{if (eq (locstr \"i18n.locale\") \"English\")}}language-item-selected{{end}}\" href=\"javascript:;\" tag=\"en-US\">English</a>\n\t\t&middot;\n\t\t<a class=\"language-item {{if (eq (locstr \"i18n.locale\") \"简体中文\")}}language-item-selected{{end}}\" href=\"javascript:;\" tag=\"zh-CN\">简体中文</a>\n\t</p>\n</footer>\n"
  },
  {
    "path": "templates/parts/head.html",
    "content": "<head>\n\t<meta charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n\t<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n\n\t<title>{{with .PageTitle}}{{.}} - {{end}}{{if and .IsIndexPage (eq (locstr \"i18n.locale\") \"简体中文\")}}七牛云 - {{end}}Goproxy.cn</title>\n\t<meta name=\"description\" content=\"{{locstr \"The most trusted Go module proxy in China.\"}}\">\n\t<meta name=\"keywords\" content=\"Go Module Proxy, Go Modules, Go 代理, Go 依赖管理, Go 包管理, Go 模块, Go 模块代理, Go 版本控制, Gomod, Goproxy\">\n\t<meta name=\"author\" content=\"{{locstr \"Aofei Sheng\"}}\">\n\n\t<link rel=\"canonical\" href=\"https://goproxy.cn{{.CanonicalPath}}\">\n\t<link rel=\"shortcut icon\" href=\"/favicon.ico\">\n\t<link rel=\"apple-touch-icon\" href=\"/apple-touch-icon.png\">\n\n\t<link rel=\"stylesheet\" href=\"https://cdn.staticfile.net/font-awesome/5.12.1/css/all.css\">\n\t<link rel=\"stylesheet\" href=\"https://cdn.staticfile.net/highlight.js/9.18.1/styles/routeros.min.css\">\n\t<link rel=\"stylesheet\" href=\"/assets/css/bootstrap.css\">\n\t<link rel=\"stylesheet\" href=\"/assets/css/main.css\">\n</head>\n"
  },
  {
    "path": "templates/parts/header.html",
    "content": "<header>\n\t<nav class=\"navbar navbar-expand-md navbar-dark fixed-top bg-primary\">\n\t\t<a class=\"navbar-brand\" href=\"/\">Goproxy.cn</a>\n\n\t\t<button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n\t\t\t<span class=\"navbar-toggler-icon\"></span>\n\t\t</button>\n\n\t\t<div id=\"navbarCollapse\" class=\"collapse navbar-collapse\">\n\t\t\t<div class=\"mr-auto\"></div>\n\n\t\t\t<ul class=\"navbar-nav mt-md-0\">\n\t\t\t\t<li class=\"nav-item{{if .IsIndexPage}} active{{end}}\">\n\t\t\t\t\t<a class=\"nav-link\" href=\"/\">{{locstr \"Index\"}}{{if .IsIndexPage}}<span class=\"sr-only\">(current)</span>{{end}}</a>\n\t\t\t\t</li>\n\n\t\t\t\t<li class=\"nav-item{{if .IsStatsPage}} active{{end}}\">\n\t\t\t\t\t<a class=\"nav-link\" href=\"/stats\">{{locstr \"Statistics\"}}{{if .IsStatsPage}}<span class=\"sr-only\">(current)</span>{{end}}</a>\n\t\t\t\t</li>\n\n\t\t\t\t<li class=\"nav-item\">\n\t\t\t\t\t<a class=\"nav-link\" href=\"https://status.goproxy.cn\" target=\"_blank\">{{locstr \"Status\"}}</a>\n\t\t\t\t</li>\n\n\t\t\t\t<li class=\"nav-item\">\n\t\t\t\t\t<a class=\"nav-link\" href=\"https://github.com/goproxy/goproxy.cn/issues/new/choose\" target=\"_blank\">{{locstr \"Contact\"}}</a>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</div>\n\t</nav>\n</header>\n"
  },
  {
    "path": "templates/parts/scripts.html",
    "content": "<script src=\"https://cdn.staticfile.net/jquery/3.4.1/jquery.min.js\"></script>\n<script src=\"https://cdn.staticfile.net/twitter-bootstrap/4.4.1/js/bootstrap.min.js\"></script>\n<script src=\"https://cdn.staticfile.net/highlight.js/9.15.10/highlight.min.js\"></script>\n<script src=\"https://buttons.github.io/buttons.js\"></script>\n<script src=\"/assets/js/main.js\"></script>\n"
  },
  {
    "path": "templates/stats.html",
    "content": "<div class=\"jumbotron\">\n\t<div class=\"container text-center\">\n\t\t<h1 class=\"brand display-3\">Statistics</h1>\n\t</div>\n</div>\n\n<div class=\"container\">\n\t<div id=\"statsAPI\" class=\"accordion\">\n\t\t<div class=\"card\">\n\t\t\t<div id=\"statSummaryAPI\" class=\"card-header\">\n\t\t\t\t<h2 class=\"mb-0\">\n\t\t\t\t\t<button class=\"btn btn-link collapsed\" type=\"button\" data-toggle=\"collapse\" data-target=\"#statSummaryAPICollapse\" aria-expanded=\"false\" aria-controls=\"statSummaryAPICollapse\">API: Get Service Summary</button>\n\t\t\t\t</h2>\n\t\t\t</div>\n\n\t\t\t<div id=\"statSummaryAPICollapse\" class=\"collapse\" aria-labelledby=\"statSummaryAPI\" data-parent=\"#statsAPI\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<p>Get the summary information of the service, such as the total size and total number of all module versions in the service.</p>\n\t\t\t\t\t<pre><code class=\"language-http\">GET /stats/summary</code></pre>\n\t\t\t\t\t<p>Example request URL: <a href=\"https://goproxy.cn/stats/summary\" target=\"_blank\">goproxy.cn/stats/summary</a></p>\n\t\t\t\t\t<p>Example response body:</p>\n\t\t\t\t\t<pre><code class=\"language-json\">{\n\t\"cacher_size\": 2663405247231,\n\t\"module_version_count\": 1035421,\n\t\"module_host_count\": 1120,\n\t\"top_10_module_hosts\": [\n\t\t{\"module_host\": \"github.com\", \"module_version_count\": 921606},\n\t\t{\"module_host\": \"k8s.io\", \"module_version_count\": 24982},\n\t\t{\"module_host\": \"gitlab.com\", \"module_version_count\": 13172},\n\t\t{\"module_host\": \"gopkg.in\", \"module_version_count\": 10479},\n\t\t{\"module_host\": \"golang.org\", \"module_version_count\": 8000},\n\t\t{\"module_host\": \"gitee.com\", \"module_version_count\": 4650},\n\t\t{\"module_host\": \"bitbucket.org\", \"module_version_count\": 4177},\n\t\t{\"module_host\": \"sigs.k8s.io\", \"module_version_count\": 3280},\n\t\t{\"module_host\": \"google.golang.org\", \"module_version_count\": 2703},\n\t\t{\"module_host\": \"istio.io\", \"module_version_count\": 2487}\n\t]\n}</code></pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"card\">\n\t\t\t<div id=\"statTrendAPI\" class=\"card-header\">\n\t\t\t\t<h2 class=\"mb-0\">\n\t\t\t\t\t<button class=\"btn btn-link collapsed\" type=\"button\" data-toggle=\"collapse\" data-target=\"#statTrendAPICollapse\" aria-expanded=\"false\" aria-controls=\"statTrendAPICollapse\">API: Get Module Trends</button>\n\t\t\t\t</h2>\n\t\t\t</div>\n\n\t\t\t<div id=\"statTrendAPICollapse\" class=\"collapse\" aria-labelledby=\"statTrendAPI\" data-parent=\"#statsAPI\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<p>Get module trends in service, such as the most active top 1000 module in the most recent period.</p>\n\t\t\t\t\t<pre><code class=\"language-http\">GET /stats/trends/&lt;trend&gt;</code></pre>\n\t\t\t\t\t<p>The path parameter <code>&lt;trend&gt;</code> is <span class=\"text-danger\">REQUIRED</span> and has three options: <code>latest</code> (latest trend), <code>last-7-days</code> (trend in the last 7 days), and <code>last-30-days</code> (trend in the last 30 days).</p>\n\t\t\t\t\t<p>Example request URL: <a href=\"https://goproxy.cn/stats/trends/latest\" target=\"_blank\">goproxy.cn/stats/trends/latest</a></p>\n\t\t\t\t\t<p>Example response body:</p>\n\t\t\t\t\t<pre><code class=\"language-json\">[\n\t{\"module_path\": \"golang.org/x/sys\", \"download_count\": 1822180},\n\t{\"module_path\": \"golang.org/x/net\", \"download_count\": 1713080},\n\t{\"module_path\": \"golang.org/x/tools\", \"download_count\": 1503522},\n\t{\"module_path\": \"golang.org/x/crypto\", \"download_count\": 1032270},\n\t{\"module_path\": \"gopkg.in/yaml.v2\", \"download_count\": 578120}\n]</code></pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"card\">\n\t\t\t<div id=\"statModuleVersionAPI\" class=\"card-header\">\n\t\t\t\t<h2 class=\"mb-0\">\n\t\t\t\t\t<button class=\"btn btn-link collapsed\" type=\"button\" data-toggle=\"collapse\" data-target=\"#statModuleVersionAPICollapse\" aria-expanded=\"false\" aria-controls=\"statModuleVersionAPICollapse\">API: Get Module (Version) Statistics</button>\n\t\t\t\t</h2>\n\t\t\t</div>\n\n\t\t\t<div id=\"statModuleVersionAPICollapse\" class=\"collapse\" aria-labelledby=\"statModuleVersionAPI\" data-parent=\"#statsAPI\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<p>Get the statistics of the specified module (version) in the service, such as the total number of downloads of the specified module (version) and its single-day downloads in the last 30 days.</p>\n\t\t\t\t\t<pre><code class=\"language-http\">GET /stats/&lt;module-path&gt;[@&lt;module-version&gt;]</code></pre>\n\t\t\t\t\t<p>The path parameter <code>&lt;module-path&gt;</code> is <span class=\"text-danger\">REQUIRED</span>, for example: <code>golang.org/x/text</code>.<p>\n\t\t\t\t\t<p>The path parameter <code>&lt;module-version&gt;</code> is <span class=\"text-danger\">OPTIONAL</span>, and note that it can only appear with the leading symbol <code>@</code>, for example: <code>@v0.3.2</code>.<p>\n\t\t\t\t\t<p>Example request URL: <a href=\"https://goproxy.cn/stats/golang.org/x/text\" target=\"_blank\">goproxy.cn/stats/golang.org/x/text</a></p>\n\t\t\t\t\t<p>Example response body:</p>\n\t\t\t\t\t<pre><code class=\"language-json\">{\n\t\"download_count\": 476705,\n\t\"last_30_days\": [\n\t\t{\"date\": \"2020-03-25T00:00:00Z\", \"download_count\": 15940},\n\t\t{\"date\": \"2020-03-24T00:00:00Z\", \"download_count\": 16884},\n\t\t{\"date\": \"2020-03-23T00:00:00Z\", \"download_count\": 15842},\n\t\t{\"date\": \"2020-03-22T00:00:00Z\", \"download_count\": 11232},\n\t\t{\"date\": \"2020-03-21T00:00:00Z\", \"download_count\": 11894},\n\t\t{\"date\": \"2020-03-20T00:00:00Z\", \"download_count\": 14968},\n\t\t{\"date\": \"2020-03-19T00:00:00Z\", \"download_count\": 11017},\n\t\t{\"date\": \"2020-03-18T00:00:00Z\", \"download_count\": 5209},\n\t\t{\"date\": \"2020-03-17T00:00:00Z\", \"download_count\": 5759},\n\t\t{\"date\": \"2020-03-16T00:00:00Z\", \"download_count\": 4166},\n\t\t{\"date\": \"2020-03-15T00:00:00Z\", \"download_count\": 2145},\n\t\t{\"date\": \"2020-03-14T00:00:00Z\", \"download_count\": 2218},\n\t\t{\"date\": \"2020-03-13T00:00:00Z\", \"download_count\": 4609},\n\t\t{\"date\": \"2020-03-12T00:00:00Z\", \"download_count\": 5503},\n\t\t{\"date\": \"2020-03-11T00:00:00Z\", \"download_count\": 5412},\n\t\t{\"date\": \"2020-03-10T00:00:00Z\", \"download_count\": 6453},\n\t\t{\"date\": \"2020-03-09T00:00:00Z\", \"download_count\": 4798},\n\t\t{\"date\": \"2020-03-08T00:00:00Z\", \"download_count\": 2323},\n\t\t{\"date\": \"2020-03-07T00:00:00Z\", \"download_count\": 2332},\n\t\t{\"date\": \"2020-03-06T00:00:00Z\", \"download_count\": 4806},\n\t\t{\"date\": \"2020-03-05T00:00:00Z\", \"download_count\": 6339},\n\t\t{\"date\": \"2020-03-04T00:00:00Z\", \"download_count\": 5858},\n\t\t{\"date\": \"2020-03-03T00:00:00Z\", \"download_count\": 5579},\n\t\t{\"date\": \"2020-03-02T00:00:00Z\", \"download_count\": 8862},\n\t\t{\"date\": \"2020-03-01T00:00:00Z\", \"download_count\": 2119},\n\t\t{\"date\": \"2020-02-29T00:00:00Z\", \"download_count\": 2053},\n\t\t{\"date\": \"2020-02-28T00:00:00Z\", \"download_count\": 4735},\n\t\t{\"date\": \"2020-02-27T00:00:00Z\", \"download_count\": 6578},\n\t\t{\"date\": \"2020-02-26T00:00:00Z\", \"download_count\": 4954},\n\t\t{\"date\": \"2020-02-25T00:00:00Z\", \"download_count\": 5318}\n\t],\n\t\"top_10_module_versions\": [\n\t\t{\"module_version\": \"v0.3.2\", \"download_count\": 232795},\n\t\t{\"module_version\": \"v0.3.0\", \"download_count\": 146009},\n\t\t{\"module_version\": \"v0.3.1-0.20180807135948-17ff2d5776d2\", \"download_count\": 67096},\n\t\t{\"module_version\": \"v0.3.1-0.20181227161524-e6919f6577db\", \"download_count\": 11494},\n\t\t{\"module_version\": \"v0.0.0-20160726164857-2910a502d2bf\", \"download_count\": 11223},\n\t\t{\"module_version\": \"v0.0.0-20170915032832-14c0d48ead0c\", \"download_count\": 3991},\n\t\t{\"module_version\": \"v0.3.1-0.20171227012246-e19ae1496984\", \"download_count\": 1128},\n\t\t{\"module_version\": \"v0.0.0-20170915090833-1cbadb444a80\", \"download_count\": 937},\n\t\t{\"module_version\": \"v0.3.1-0.20181030141323-6f44c5a2ea40\", \"download_count\": 480},\n\t\t{\"module_version\": \"v0.3.1\", \"download_count\": 353}\n\t]\n}</code></pre>\n\t\t\t\t\t<p>Example request URL: <a href=\"https://goproxy.cn/stats/golang.org/x/text@v0.3.2\" target=\"_blank\">goproxy.cn/stats/golang.org/x/text@v0.3.2</a></p>\n\t\t\t\t\t<p>Example response body:</p>\n\t\t\t\t\t<pre><code class=\"language-json\">{\n\t\"download_count\": 232795,\n\t\"last_30_days\": [\n\t\t{\"date\": \"2020-03-25T00:00:00Z\", \"download_count\": 12852},\n\t\t{\"date\": \"2020-03-24T00:00:00Z\", \"download_count\": 12708},\n\t\t{\"date\": \"2020-03-23T00:00:00Z\", \"download_count\": 12602},\n\t\t{\"date\": \"2020-03-22T00:00:00Z\", \"download_count\": 10371},\n\t\t{\"date\": \"2020-03-21T00:00:00Z\", \"download_count\": 10673},\n\t\t{\"date\": \"2020-03-20T00:00:00Z\", \"download_count\": 11882},\n\t\t{\"date\": \"2020-03-19T00:00:00Z\", \"download_count\": 8379},\n\t\t{\"date\": \"2020-03-18T00:00:00Z\", \"download_count\": 2244},\n\t\t{\"date\": \"2020-03-17T00:00:00Z\", \"download_count\": 2407},\n\t\t{\"date\": \"2020-03-16T00:00:00Z\", \"download_count\": 1696},\n\t\t{\"date\": \"2020-03-15T00:00:00Z\", \"download_count\": 981},\n\t\t{\"date\": \"2020-03-14T00:00:00Z\", \"download_count\": 897},\n\t\t{\"date\": \"2020-03-13T00:00:00Z\", \"download_count\": 1898},\n\t\t{\"date\": \"2020-03-12T00:00:00Z\", \"download_count\": 2498},\n\t\t{\"date\": \"2020-03-11T00:00:00Z\", \"download_count\": 2374},\n\t\t{\"date\": \"2020-03-10T00:00:00Z\", \"download_count\": 2491},\n\t\t{\"date\": \"2020-03-09T00:00:00Z\", \"download_count\": 1854},\n\t\t{\"date\": \"2020-03-08T00:00:00Z\", \"download_count\": 800},\n\t\t{\"date\": \"2020-03-07T00:00:00Z\", \"download_count\": 981},\n\t\t{\"date\": \"2020-03-06T00:00:00Z\", \"download_count\": 2085},\n\t\t{\"date\": \"2020-03-05T00:00:00Z\", \"download_count\": 2642},\n\t\t{\"date\": \"2020-03-04T00:00:00Z\", \"download_count\": 2212},\n\t\t{\"date\": \"2020-03-03T00:00:00Z\", \"download_count\": 2515},\n\t\t{\"date\": \"2020-03-02T00:00:00Z\", \"download_count\": 2832},\n\t\t{\"date\": \"2020-03-01T00:00:00Z\", \"download_count\": 785},\n\t\t{\"date\": \"2020-02-29T00:00:00Z\", \"download_count\": 871},\n\t\t{\"date\": \"2020-02-28T00:00:00Z\", \"download_count\": 2019},\n\t\t{\"date\": \"2020-02-27T00:00:00Z\", \"download_count\": 2480},\n\t\t{\"date\": \"2020-02-26T00:00:00Z\", \"download_count\": 2163},\n\t\t{\"date\": \"2020-02-25T00:00:00Z\", \"download_count\": 2344}\n\t]\n}</code></pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"card\">\n\t\t\t<div id=\"statModuleDownloadCountBadgeAPI\" class=\"card-header\">\n\t\t\t\t<h2 class=\"mb-0\">\n\t\t\t\t\t<button class=\"btn btn-link collapsed\" type=\"button\" data-toggle=\"collapse\" data-target=\"#statModuleDownloadCountBadgeAPICollapse\" aria-expanded=\"false\" aria-controls=\"statModuleDownloadCountBadgeAPICollapse\">API: Get Module Total Download Badge</button>\n\t\t\t\t</h2>\n\t\t\t</div>\n\n\t\t\t<div id=\"statModuleDownloadCountBadgeAPICollapse\" class=\"collapse\" aria-labelledby=\"statModuleDownloadCountBadgeAPI\" data-parent=\"#statsAPI\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<p>Get the badge for the total download of the specified module in the service.</p>\n\t\t\t\t\t<pre><code class=\"language-http\">GET /stats/&lt;module-path&gt;/badges/download-count.svg</code></pre>\n\t\t\t\t\t<p>The path parameter <code>&lt;module-path&gt;</code> is <span class=\"text-danger\">REQUIRED</span>, for example: <code>golang.org/x/text</code>.<p>\n\t\t\t\t\t<p>Example request URL: <a href=\"https://goproxy.cn/stats/golang.org/x/text/badges/download-count.svg\" target=\"_blank\">goproxy.cn/stats/golang.org/x/text/badges/download-count.svg</a></p>\n\t\t\t\t\t<p>Example response body:</p>\n\t\t\t\t\t<p><img src=\"https://goproxy.cn/stats/golang.org/x/text/badges/download-count.svg\"></p>\n\t\t\t\t\t<p>The total download badge for a specified module can be placed in the project's <code>README.md</code> using the following Markdown syntax:</p>\n\t\t\t\t\t<pre><code class=\"language-md\">[![Goproxy.cn](https://goproxy.cn/stats/&lt;module-path&gt;/badges/download-count.svg)](https://goproxy.cn)</code></pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n"
  },
  {
    "path": "templates/stats.zh-CN.html",
    "content": "<div class=\"jumbotron\">\n\t<div class=\"container text-center\">\n\t\t<h1 class=\"brand display-3\">统计数据</h1>\n\t</div>\n</div>\n\n<div class=\"container\">\n\t<div id=\"statsAPI\" class=\"accordion\">\n\t\t<div class=\"card\">\n\t\t\t<div id=\"statSummaryAPI\" class=\"card-header\">\n\t\t\t\t<h2 class=\"mb-0\">\n\t\t\t\t\t<button class=\"btn btn-link collapsed\" type=\"button\" data-toggle=\"collapse\" data-target=\"#statSummaryAPICollapse\" aria-expanded=\"false\" aria-controls=\"statSummaryAPICollapse\">API：获取服务摘要</button>\n\t\t\t\t</h2>\n\t\t\t</div>\n\n\t\t\t<div id=\"statSummaryAPICollapse\" class=\"collapse\" aria-labelledby=\"statSummaryAPI\" data-parent=\"#statsAPI\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<p>获取服务的摘要信息，如服务中所有模块版本的总尺寸和总数等。</p>\n\t\t\t\t\t<pre><code class=\"language-http\">GET /stats/summary</code></pre>\n\t\t\t\t\t<p>示例请求 URL：<a href=\"https://goproxy.cn/stats/summary\" target=\"_blank\">goproxy.cn/stats/summary</a></p>\n\t\t\t\t\t<p>示例响应主体：</p>\n\t\t\t\t\t<pre><code class=\"language-json\">{\n\t\"cacher_size\": 2663405247231,\n\t\"module_version_count\": 1035421,\n\t\"module_host_count\": 1120,\n\t\"top_10_module_hosts\": [\n\t\t{\"module_host\": \"github.com\", \"module_version_count\": 921606},\n\t\t{\"module_host\": \"k8s.io\", \"module_version_count\": 24982},\n\t\t{\"module_host\": \"gitlab.com\", \"module_version_count\": 13172},\n\t\t{\"module_host\": \"gopkg.in\", \"module_version_count\": 10479},\n\t\t{\"module_host\": \"golang.org\", \"module_version_count\": 8000},\n\t\t{\"module_host\": \"gitee.com\", \"module_version_count\": 4650},\n\t\t{\"module_host\": \"bitbucket.org\", \"module_version_count\": 4177},\n\t\t{\"module_host\": \"sigs.k8s.io\", \"module_version_count\": 3280},\n\t\t{\"module_host\": \"google.golang.org\", \"module_version_count\": 2703},\n\t\t{\"module_host\": \"istio.io\", \"module_version_count\": 2487}\n\t]\n}</code></pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"card\">\n\t\t\t<div id=\"statTrendAPI\" class=\"card-header\">\n\t\t\t\t<h2 class=\"mb-0\">\n\t\t\t\t\t<button class=\"btn btn-link collapsed\" type=\"button\" data-toggle=\"collapse\" data-target=\"#statTrendAPICollapse\" aria-expanded=\"false\" aria-controls=\"statTrendAPICollapse\">API：获取模块趋势</button>\n\t\t\t\t</h2>\n\t\t\t</div>\n\n\t\t\t<div id=\"statTrendAPICollapse\" class=\"collapse\" aria-labelledby=\"statTrendAPI\" data-parent=\"#statsAPI\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<p>获取服务中的模块趋势，如最近一段时间内最活跃的最多前 1000 个模块。</p>\n\t\t\t\t\t<pre><code class=\"language-http\">GET /stats/trends/&lt;trend&gt;</code></pre>\n\t\t\t\t\t<p>路径参数 <code>&lt;trend&gt;</code> 是<span class=\"text-danger\">必填的</span>，它拥有三个选项：<code>latest</code>（最新趋势）、<code>last-7-days</code>（最近 7 天的趋势）和 <code>last-30-days</code>（最近 30 天的趋势）。</p>\n\t\t\t\t\t<p>示例请求 URL：<a href=\"https://goproxy.cn/stats/trends/latest\" target=\"_blank\">goproxy.cn/stats/trends/latest</a></p>\n\t\t\t\t\t<p>示例响应主体：</p>\n\t\t\t\t\t<pre><code class=\"language-json\">[\n\t{\"module_path\": \"golang.org/x/sys\", \"download_count\": 1822180},\n\t{\"module_path\": \"golang.org/x/net\", \"download_count\": 1713080},\n\t{\"module_path\": \"golang.org/x/tools\", \"download_count\": 1503522},\n\t{\"module_path\": \"golang.org/x/crypto\", \"download_count\": 1032270},\n\t{\"module_path\": \"gopkg.in/yaml.v2\", \"download_count\": 578120}\n]</code></pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"card\">\n\t\t\t<div id=\"statModuleVersionAPI\" class=\"card-header\">\n\t\t\t\t<h2 class=\"mb-0\">\n\t\t\t\t\t<button class=\"btn btn-link collapsed\" type=\"button\" data-toggle=\"collapse\" data-target=\"#statModuleVersionAPICollapse\" aria-expanded=\"false\" aria-controls=\"statModuleVersionAPICollapse\">API：获取模块（版本）统计</button>\n\t\t\t\t</h2>\n\t\t\t</div>\n\n\t\t\t<div id=\"statModuleVersionAPICollapse\" class=\"collapse\" aria-labelledby=\"statModuleVersionAPI\" data-parent=\"#statsAPI\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<p>获取服务中指定模块（版本）的统计，如指定模块（版本）的总下载次数和其在最近 30 天内的单日下载次数。</p>\n\t\t\t\t\t<pre><code class=\"language-http\">GET /stats/&lt;module-path&gt;[@&lt;module-version&gt;]</code></pre>\n\t\t\t\t\t<p>路径参数 <code>&lt;module-path&gt;</code> 是<span class=\"text-danger\">必填的</span>，如：<code>golang.org/x/text</code>。</p>\n\t\t\t\t\t<p>路径参数 <code>&lt;module-version&gt;</code> 是<span class=\"text-danger\">可选的</span>，并且需要注意它只能伴随着前导符号 <code>@</code> 一起出现，如：<code>@v0.3.2</code>。</p>\n\t\t\t\t\t<p>示例请求 URL：<a href=\"https://goproxy.cn/stats/golang.org/x/text\" target=\"_blank\">goproxy.cn/stats/golang.org/x/text</a></p>\n\t\t\t\t\t<p>示例响应主体：</p>\n\t\t\t\t\t<pre><code class=\"language-json\">{\n\t\"download_count\": 476705,\n\t\"last_30_days\": [\n\t\t{\"date\": \"2020-03-25T00:00:00Z\", \"download_count\": 15940},\n\t\t{\"date\": \"2020-03-24T00:00:00Z\", \"download_count\": 16884},\n\t\t{\"date\": \"2020-03-23T00:00:00Z\", \"download_count\": 15842},\n\t\t{\"date\": \"2020-03-22T00:00:00Z\", \"download_count\": 11232},\n\t\t{\"date\": \"2020-03-21T00:00:00Z\", \"download_count\": 11894},\n\t\t{\"date\": \"2020-03-20T00:00:00Z\", \"download_count\": 14968},\n\t\t{\"date\": \"2020-03-19T00:00:00Z\", \"download_count\": 11017},\n\t\t{\"date\": \"2020-03-18T00:00:00Z\", \"download_count\": 5209},\n\t\t{\"date\": \"2020-03-17T00:00:00Z\", \"download_count\": 5759},\n\t\t{\"date\": \"2020-03-16T00:00:00Z\", \"download_count\": 4166},\n\t\t{\"date\": \"2020-03-15T00:00:00Z\", \"download_count\": 2145},\n\t\t{\"date\": \"2020-03-14T00:00:00Z\", \"download_count\": 2218},\n\t\t{\"date\": \"2020-03-13T00:00:00Z\", \"download_count\": 4609},\n\t\t{\"date\": \"2020-03-12T00:00:00Z\", \"download_count\": 5503},\n\t\t{\"date\": \"2020-03-11T00:00:00Z\", \"download_count\": 5412},\n\t\t{\"date\": \"2020-03-10T00:00:00Z\", \"download_count\": 6453},\n\t\t{\"date\": \"2020-03-09T00:00:00Z\", \"download_count\": 4798},\n\t\t{\"date\": \"2020-03-08T00:00:00Z\", \"download_count\": 2323},\n\t\t{\"date\": \"2020-03-07T00:00:00Z\", \"download_count\": 2332},\n\t\t{\"date\": \"2020-03-06T00:00:00Z\", \"download_count\": 4806},\n\t\t{\"date\": \"2020-03-05T00:00:00Z\", \"download_count\": 6339},\n\t\t{\"date\": \"2020-03-04T00:00:00Z\", \"download_count\": 5858},\n\t\t{\"date\": \"2020-03-03T00:00:00Z\", \"download_count\": 5579},\n\t\t{\"date\": \"2020-03-02T00:00:00Z\", \"download_count\": 8862},\n\t\t{\"date\": \"2020-03-01T00:00:00Z\", \"download_count\": 2119},\n\t\t{\"date\": \"2020-02-29T00:00:00Z\", \"download_count\": 2053},\n\t\t{\"date\": \"2020-02-28T00:00:00Z\", \"download_count\": 4735},\n\t\t{\"date\": \"2020-02-27T00:00:00Z\", \"download_count\": 6578},\n\t\t{\"date\": \"2020-02-26T00:00:00Z\", \"download_count\": 4954},\n\t\t{\"date\": \"2020-02-25T00:00:00Z\", \"download_count\": 5318}\n\t],\n\t\"top_10_module_versions\": [\n\t\t{\"module_version\": \"v0.3.2\", \"download_count\": 232795},\n\t\t{\"module_version\": \"v0.3.0\", \"download_count\": 146009},\n\t\t{\"module_version\": \"v0.3.1-0.20180807135948-17ff2d5776d2\", \"download_count\": 67096},\n\t\t{\"module_version\": \"v0.3.1-0.20181227161524-e6919f6577db\", \"download_count\": 11494},\n\t\t{\"module_version\": \"v0.0.0-20160726164857-2910a502d2bf\", \"download_count\": 11223},\n\t\t{\"module_version\": \"v0.0.0-20170915032832-14c0d48ead0c\", \"download_count\": 3991},\n\t\t{\"module_version\": \"v0.3.1-0.20171227012246-e19ae1496984\", \"download_count\": 1128},\n\t\t{\"module_version\": \"v0.0.0-20170915090833-1cbadb444a80\", \"download_count\": 937},\n\t\t{\"module_version\": \"v0.3.1-0.20181030141323-6f44c5a2ea40\", \"download_count\": 480},\n\t\t{\"module_version\": \"v0.3.1\", \"download_count\": 353}\n\t]\n}</code></pre>\n\t\t\t\t\t<p>示例请求 URL：<a href=\"https://goproxy.cn/stats/golang.org/x/text@v0.3.2\" target=\"_blank\">goproxy.cn/stats/golang.org/x/text@v0.3.2</a></p>\n\t\t\t\t\t<p>示例响应主体：</p>\n\t\t\t\t\t<pre><code class=\"language-json\">{\n\t\"download_count\": 232795,\n\t\"last_30_days\": [\n\t\t{\"date\": \"2020-03-25T00:00:00Z\", \"download_count\": 12852},\n\t\t{\"date\": \"2020-03-24T00:00:00Z\", \"download_count\": 12708},\n\t\t{\"date\": \"2020-03-23T00:00:00Z\", \"download_count\": 12602},\n\t\t{\"date\": \"2020-03-22T00:00:00Z\", \"download_count\": 10371},\n\t\t{\"date\": \"2020-03-21T00:00:00Z\", \"download_count\": 10673},\n\t\t{\"date\": \"2020-03-20T00:00:00Z\", \"download_count\": 11882},\n\t\t{\"date\": \"2020-03-19T00:00:00Z\", \"download_count\": 8379},\n\t\t{\"date\": \"2020-03-18T00:00:00Z\", \"download_count\": 2244},\n\t\t{\"date\": \"2020-03-17T00:00:00Z\", \"download_count\": 2407},\n\t\t{\"date\": \"2020-03-16T00:00:00Z\", \"download_count\": 1696},\n\t\t{\"date\": \"2020-03-15T00:00:00Z\", \"download_count\": 981},\n\t\t{\"date\": \"2020-03-14T00:00:00Z\", \"download_count\": 897},\n\t\t{\"date\": \"2020-03-13T00:00:00Z\", \"download_count\": 1898},\n\t\t{\"date\": \"2020-03-12T00:00:00Z\", \"download_count\": 2498},\n\t\t{\"date\": \"2020-03-11T00:00:00Z\", \"download_count\": 2374},\n\t\t{\"date\": \"2020-03-10T00:00:00Z\", \"download_count\": 2491},\n\t\t{\"date\": \"2020-03-09T00:00:00Z\", \"download_count\": 1854},\n\t\t{\"date\": \"2020-03-08T00:00:00Z\", \"download_count\": 800},\n\t\t{\"date\": \"2020-03-07T00:00:00Z\", \"download_count\": 981},\n\t\t{\"date\": \"2020-03-06T00:00:00Z\", \"download_count\": 2085},\n\t\t{\"date\": \"2020-03-05T00:00:00Z\", \"download_count\": 2642},\n\t\t{\"date\": \"2020-03-04T00:00:00Z\", \"download_count\": 2212},\n\t\t{\"date\": \"2020-03-03T00:00:00Z\", \"download_count\": 2515},\n\t\t{\"date\": \"2020-03-02T00:00:00Z\", \"download_count\": 2832},\n\t\t{\"date\": \"2020-03-01T00:00:00Z\", \"download_count\": 785},\n\t\t{\"date\": \"2020-02-29T00:00:00Z\", \"download_count\": 871},\n\t\t{\"date\": \"2020-02-28T00:00:00Z\", \"download_count\": 2019},\n\t\t{\"date\": \"2020-02-27T00:00:00Z\", \"download_count\": 2480},\n\t\t{\"date\": \"2020-02-26T00:00:00Z\", \"download_count\": 2163},\n\t\t{\"date\": \"2020-02-25T00:00:00Z\", \"download_count\": 2344}\n\t]\n}</code></pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"card\">\n\t\t\t<div id=\"statModuleDownloadCountBadgeAPI\" class=\"card-header\">\n\t\t\t\t<h2 class=\"mb-0\">\n\t\t\t\t\t<button class=\"btn btn-link collapsed\" type=\"button\" data-toggle=\"collapse\" data-target=\"#statModuleDownloadCountBadgeAPICollapse\" aria-expanded=\"false\" aria-controls=\"statModuleDownloadCountBadgeAPICollapse\">API：获取模块总下载次数徽章</button>\n\t\t\t\t</h2>\n\t\t\t</div>\n\n\t\t\t<div id=\"statModuleDownloadCountBadgeAPICollapse\" class=\"collapse\" aria-labelledby=\"statModuleDownloadCountBadgeAPI\" data-parent=\"#statsAPI\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<p>获取服务中指定模块的总下载次数徽章。</p>\n\t\t\t\t\t<pre><code class=\"language-http\">GET /stats/&lt;module-path&gt;/badges/download-count.svg</code></pre>\n\t\t\t\t\t<p>路径参数 <code>&lt;module-path&gt;</code> 是<span class=\"text-danger\">必填的</span>，如：<code>golang.org/x/text</code>。</p>\n\t\t\t\t\t<p>示例请求 URL：<a href=\"https://goproxy.cn/stats/golang.org/x/text/badges/download-count.svg\" target=\"_blank\">goproxy.cn/stats/golang.org/x/text/badges/download-count.svg</a></p>\n\t\t\t\t\t<p>示例响应主体：</p>\n\t\t\t\t\t<p><img src=\"https://goproxy.cn/stats/golang.org/x/text/badges/download-count.svg\"></p>\n\t\t\t\t\t<p>可以通过如下 Markdown 语法将指定模块的总下载次数徽章放入项目的 <code>README.md</code> 中：</p>\n\t\t\t\t\t<pre><code class=\"language-md\">[![Goproxy.cn](https://goproxy.cn/stats/&lt;module-path&gt;/badges/download-count.svg)](https://goproxy.cn)</code></pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n"
  }
]