├── .github └── workflows │ ├── codeql.yml │ └── trufflehog.yaml ├── .gitignore ├── .pre-commit-config.yaml ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── api ├── .dockerignore ├── Dockerfile ├── Pipfile ├── Pipfile.lock ├── app.py ├── assets │ ├── answers.txt │ ├── questions.txt │ ├── swagger_dark.css │ ├── swashbuckle.css │ └── theme-newspaper.css ├── env.example ├── gunicorn.conf.py ├── inventor │ └── __init__.py ├── log │ └── .gitkeep ├── requirements.txt └── swagger │ ├── answer.yaml │ └── question.yaml ├── docker-compose.yml ├── nginx ├── Dockerfile └── config │ ├── default.conf │ └── nginx.conf └── ui ├── .dockerignore ├── Dockerfile ├── package-lock.json ├── package.json ├── public ├── CAH-blank-white.png ├── card.css ├── favicon.ico ├── index.html ├── manifest.json └── robots.txt └── src ├── App.css ├── App.js ├── App.test.js ├── Components ├── ApiClient.js ├── Cards.jsx ├── Controls.jsx ├── Controls2.jsx ├── Explainer.jsx ├── Footer.jsx ├── Header.jsx ├── Instructions.jsx ├── Layout.jsx ├── Navigation.jsx ├── Styles.js └── Title.jsx ├── index.css ├── index.js ├── pages ├── 404.jsx ├── About.jsx ├── Home.jsx └── Invent.jsx ├── reportWebVitals.js └── setupTests.js /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ "main" ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ "main" ] 20 | schedule: 21 | - cron: '30 16 * * 3' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript', 'python' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Use only 'java' to analyze code written in Java, Kotlin or both 38 | # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both 39 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 40 | 41 | steps: 42 | - name: Checkout repository 43 | uses: actions/checkout@v3 44 | 45 | # Initializes the CodeQL tools for scanning. 46 | - name: Initialize CodeQL 47 | uses: github/codeql-action/init@v2 48 | with: 49 | languages: ${{ matrix.language }} 50 | # If you wish to specify custom queries, you can do so here or in a config file. 51 | # By default, queries listed here will override any specified in a config file. 52 | # Prefix the list here with "+" to use these queries and those in the config file. 53 | 54 | # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 55 | # queries: security-extended,security-and-quality 56 | 57 | 58 | # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). 59 | # If this step fails, then you should remove it and run the build manually (see below) 60 | - name: Autobuild 61 | uses: github/codeql-action/autobuild@v2 62 | 63 | # ℹ️ Command-line programs to run using the OS shell. 64 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 65 | 66 | # If the Autobuild fails above, remove it and uncomment the following three lines. 67 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 68 | 69 | # - run: | 70 | # echo "Run, Build Application using script" 71 | # ./location_of_script_within_repo/buildscript.sh 72 | 73 | - name: Perform CodeQL Analysis 74 | uses: github/codeql-action/analyze@v2 75 | with: 76 | category: "/language:${{matrix.language}}" 77 | -------------------------------------------------------------------------------- /.github/workflows/trufflehog.yaml: -------------------------------------------------------------------------------- 1 | name: Leaked Secrets Scan 2 | on: [push] 3 | jobs: 4 | TruffleHog: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - name: Checkout code 8 | uses: actions/checkout@v3 9 | with: 10 | fetch-depth: 0 11 | 12 | - name: TruffleHog OSS 13 | uses: trufflesecurity/trufflehog@v3.24.0 14 | with: 15 | path: ./ 16 | base: "" 17 | head: ${{ github.ref_name}} 18 | extra_args: --debug --only-verified -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig 2 | 3 | # Created by https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,react,python,node,macos,linux,flask,yarn 4 | # Edit at https://www.toptal.com/developers/gitignore?templates=windows,visualstudiocode,react,python,node,macos,linux,flask,yarn 5 | 6 | ### Flask ### 7 | instance/* 8 | !instance/.gitignore 9 | .webassets-cache 10 | .env 11 | 12 | ### Flask.Python Stack ### 13 | # Byte-compiled / optimized / DLL files 14 | __pycache__/ 15 | *.py[cod] 16 | *$py.class 17 | 18 | # C extensions 19 | *.so 20 | 21 | # Distribution / packaging 22 | .Python 23 | build/ 24 | develop-eggs/ 25 | dist/ 26 | downloads/ 27 | eggs/ 28 | .eggs/ 29 | lib/ 30 | lib64/ 31 | parts/ 32 | sdist/ 33 | var/ 34 | wheels/ 35 | share/python-wheels/ 36 | *.egg-info/ 37 | .installed.cfg 38 | *.egg 39 | MANIFEST 40 | 41 | # PyInstaller 42 | # Usually these files are written by a python script from a template 43 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 44 | *.manifest 45 | *.spec 46 | 47 | # Installer logs 48 | pip-log.txt 49 | pip-delete-this-directory.txt 50 | 51 | # Unit test / coverage reports 52 | htmlcov/ 53 | .tox/ 54 | .nox/ 55 | .coverage 56 | .coverage.* 57 | .cache 58 | nosetests.xml 59 | coverage.xml 60 | *.cover 61 | *.py,cover 62 | .hypothesis/ 63 | .pytest_cache/ 64 | cover/ 65 | 66 | # Translations 67 | *.mo 68 | *.pot 69 | 70 | # Django stuff: 71 | *.log 72 | local_settings.py 73 | db.sqlite3 74 | db.sqlite3-journal 75 | 76 | # Flask stuff: 77 | instance/ 78 | 79 | # Scrapy stuff: 80 | .scrapy 81 | 82 | # Sphinx documentation 83 | docs/_build/ 84 | 85 | # PyBuilder 86 | .pybuilder/ 87 | target/ 88 | 89 | # Jupyter Notebook 90 | .ipynb_checkpoints 91 | 92 | # IPython 93 | profile_default/ 94 | ipython_config.py 95 | 96 | # pyenv 97 | # For a library or package, you might want to ignore these files since the code is 98 | # intended to run in multiple environments; otherwise, check them in: 99 | # .python-version 100 | 101 | # pipenv 102 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 103 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 104 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 105 | # install all needed dependencies. 106 | #Pipfile.lock 107 | 108 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 109 | __pypackages__/ 110 | 111 | # Celery stuff 112 | celerybeat-schedule 113 | celerybeat.pid 114 | 115 | # SageMath parsed files 116 | *.sage.py 117 | 118 | # Environments 119 | .venv 120 | env/ 121 | venv/ 122 | ENV/ 123 | env.bak/ 124 | venv.bak/ 125 | 126 | # Spyder project settings 127 | .spyderproject 128 | .spyproject 129 | 130 | # Rope project settings 131 | .ropeproject 132 | 133 | # mkdocs documentation 134 | /site 135 | 136 | # mypy 137 | .mypy_cache/ 138 | .dmypy.json 139 | dmypy.json 140 | 141 | # Pyre type checker 142 | .pyre/ 143 | 144 | # pytype static type analyzer 145 | .pytype/ 146 | 147 | # Cython debug symbols 148 | cython_debug/ 149 | 150 | ### Linux ### 151 | *~ 152 | 153 | # temporary files which can be created if a process still has a handle open of a deleted file 154 | .fuse_hidden* 155 | 156 | # KDE directory preferences 157 | .directory 158 | 159 | # Linux trash folder which might appear on any partition or disk 160 | .Trash-* 161 | 162 | # .nfs files are created when an open file is removed but is still being accessed 163 | .nfs* 164 | 165 | ### macOS ### 166 | # General 167 | .DS_Store 168 | .AppleDouble 169 | .LSOverride 170 | 171 | # Icon must end with two \r 172 | Icon 173 | 174 | 175 | # Thumbnails 176 | ._* 177 | 178 | # Files that might appear in the root of a volume 179 | .DocumentRevisions-V100 180 | .fseventsd 181 | .Spotlight-V100 182 | .TemporaryItems 183 | .Trashes 184 | .VolumeIcon.icns 185 | .com.apple.timemachine.donotpresent 186 | 187 | # Directories potentially created on remote AFP share 188 | .AppleDB 189 | .AppleDesktop 190 | Network Trash Folder 191 | Temporary Items 192 | .apdisk 193 | 194 | ### Node ### 195 | # Logs 196 | logs 197 | npm-debug.log* 198 | yarn-debug.log* 199 | yarn-error.log* 200 | lerna-debug.log* 201 | .pnpm-debug.log* 202 | 203 | # Diagnostic reports (https://nodejs.org/api/report.html) 204 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 205 | 206 | # Runtime data 207 | pids 208 | *.pid 209 | *.seed 210 | *.pid.lock 211 | 212 | # Directory for instrumented libs generated by jscoverage/JSCover 213 | lib-cov 214 | 215 | # Coverage directory used by tools like istanbul 216 | coverage 217 | *.lcov 218 | 219 | # nyc test coverage 220 | .nyc_output 221 | 222 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 223 | .grunt 224 | 225 | # Bower dependency directory (https://bower.io/) 226 | bower_components 227 | 228 | # node-waf configuration 229 | .lock-wscript 230 | 231 | # Compiled binary addons (https://nodejs.org/api/addons.html) 232 | build/Release 233 | 234 | # Dependency directories 235 | node_modules/ 236 | jspm_packages/ 237 | 238 | # Snowpack dependency directory (https://snowpack.dev/) 239 | web_modules/ 240 | 241 | # TypeScript cache 242 | *.tsbuildinfo 243 | 244 | # Optional npm cache directory 245 | .npm 246 | 247 | # Optional eslint cache 248 | .eslintcache 249 | 250 | # Microbundle cache 251 | .rpt2_cache/ 252 | .rts2_cache_cjs/ 253 | .rts2_cache_es/ 254 | .rts2_cache_umd/ 255 | 256 | # Optional REPL history 257 | .node_repl_history 258 | 259 | # Output of 'npm pack' 260 | *.tgz 261 | 262 | # Yarn Integrity file 263 | .yarn-integrity 264 | 265 | # dotenv environment variables file 266 | .env.test 267 | .env.production 268 | 269 | # parcel-bundler cache (https://parceljs.org/) 270 | .parcel-cache 271 | 272 | # Next.js build output 273 | .next 274 | out 275 | 276 | # Nuxt.js build / generate output 277 | .nuxt 278 | dist 279 | 280 | # Gatsby files 281 | .cache/ 282 | # Comment in the public line in if your project uses Gatsby and not Next.js 283 | # https://nextjs.org/blog/next-9-1#public-directory-support 284 | # public 285 | 286 | # vuepress build output 287 | .vuepress/dist 288 | 289 | # Serverless directories 290 | .serverless/ 291 | 292 | # FuseBox cache 293 | .fusebox/ 294 | 295 | # DynamoDB Local files 296 | .dynamodb/ 297 | 298 | # TernJS port file 299 | .tern-port 300 | 301 | # Stores VSCode versions used for testing VSCode extensions 302 | .vscode-test 303 | 304 | # yarn v2 305 | .yarn/cache 306 | .yarn/unplugged 307 | .yarn/build-state.yml 308 | .yarn/install-state.gz 309 | .pnp.* 310 | 311 | ### Node Patch ### 312 | # Serverless Webpack directories 313 | .webpack/ 314 | 315 | # Optional stylelint cache 316 | .stylelintcache 317 | 318 | # SvelteKit build / generate output 319 | .svelte-kit 320 | 321 | ### Python ### 322 | # Byte-compiled / optimized / DLL files 323 | 324 | # C extensions 325 | 326 | # Distribution / packaging 327 | 328 | # PyInstaller 329 | # Usually these files are written by a python script from a template 330 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 331 | 332 | # Installer logs 333 | 334 | # Unit test / coverage reports 335 | 336 | # Translations 337 | 338 | # Django stuff: 339 | 340 | # Flask stuff: 341 | 342 | # Scrapy stuff: 343 | 344 | # Sphinx documentation 345 | 346 | # PyBuilder 347 | 348 | # Jupyter Notebook 349 | 350 | # IPython 351 | 352 | # pyenv 353 | # For a library or package, you might want to ignore these files since the code is 354 | # intended to run in multiple environments; otherwise, check them in: 355 | # .python-version 356 | 357 | # pipenv 358 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 359 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 360 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 361 | # install all needed dependencies. 362 | 363 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 364 | 365 | # Celery stuff 366 | 367 | # SageMath parsed files 368 | 369 | # Environments 370 | 371 | # Spyder project settings 372 | 373 | # Rope project settings 374 | 375 | # mkdocs documentation 376 | 377 | # mypy 378 | 379 | # Pyre type checker 380 | 381 | # pytype static type analyzer 382 | 383 | # Cython debug symbols 384 | 385 | ### react ### 386 | .DS_* 387 | **/*.backup.* 388 | **/*.back.* 389 | 390 | node_modules 391 | 392 | *.sublime* 393 | 394 | psd 395 | thumb 396 | sketch 397 | 398 | ### VisualStudioCode ### 399 | .vscode/* 400 | !.vscode/settings.json 401 | !.vscode/tasks.json 402 | !.vscode/launch.json 403 | !.vscode/extensions.json 404 | *.code-workspace 405 | 406 | # Local History for Visual Studio Code 407 | .history/ 408 | 409 | ### VisualStudioCode Patch ### 410 | # Ignore all local history of files 411 | .history 412 | .ionide 413 | 414 | # Support for Project snippet scope 415 | !.vscode/*.code-snippets 416 | 417 | ### Windows ### 418 | # Windows thumbnail cache files 419 | Thumbs.db 420 | Thumbs.db:encryptable 421 | ehthumbs.db 422 | ehthumbs_vista.db 423 | 424 | # Dump file 425 | *.stackdump 426 | 427 | # Folder config file 428 | [Dd]esktop.ini 429 | 430 | # Recycle Bin used on file shares 431 | $RECYCLE.BIN/ 432 | 433 | # Windows Installer files 434 | *.cab 435 | *.msi 436 | *.msix 437 | *.msm 438 | *.msp 439 | 440 | # Windows shortcuts 441 | *.lnk 442 | 443 | ### yarn ### 444 | # https://yarnpkg.com/advanced/qa#which-files-should-be-gitignored 445 | 446 | .yarn/* 447 | !.yarn/releases 448 | !.yarn/plugins 449 | !.yarn/sdks 450 | !.yarn/versions 451 | 452 | # if you are NOT using Zero-installs, then: 453 | # comment the following lines 454 | !.yarn/cache 455 | 456 | # and uncomment the following lines 457 | # .pnp.* 458 | 459 | # End of https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,react,python,node,macos,linux,flask,yarn 460 | 461 | # Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option) 462 | 463 | ./api/log/*.log 464 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # See https://pre-commit.com for more information 2 | # See https://pre-commit.com/hooks.html for more hooks 3 | repos: 4 | - repo: https://github.com/pre-commit/pre-commit-hooks 5 | rev: v3.2.0 6 | hooks: 7 | - id: trailing-whitespace 8 | - id: end-of-file-fixer 9 | - id: check-yaml 10 | - id: check-added-large-files 11 | 12 | - repo: https://github.com/pre-commit/mirrors-eslint 13 | rev: v8.35.0 14 | hooks: 15 | - id: eslint 16 | additional_dependencies: 17 | - eslint@4.15.0 18 | - eslint-config-google@0.7.1 19 | - eslint-loader@1.6.1 20 | - eslint-plugin-react@6.10.3 21 | - babel-eslint@6.1.2 22 | 23 | - repo: https://github.com/pycqa/pylint 24 | rev: v2.16.4 25 | hooks: 26 | - id: pylint 27 | 28 | # Run Trufflehog 29 | - repo: local 30 | hooks: 31 | - id: trufflehog 32 | name: TruffleHog 33 | description: Detect secrets in your data. 34 | entry: bash -c 'trufflehog git file://. --since-commit HEAD --fail' 35 | # For running trufflehog in docker, use the following entry instead: 36 | #entry: bash -c 'docker run --rm -v "$(pwd):/workdir" -i --rm trufflesecurity/trufflehog:latest git file:///workdir --since-commit HEAD --only-verified --fail' 37 | language: system 38 | stages: ["commit", "push"] 39 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "browserslist", 4 | "cahlogo", 5 | "fontawesome", 6 | "fortawesome", 7 | "lightgray" 8 | ], 9 | "yaml.schemas": { 10 | "Kubernetes": "*.yaml", 11 | "Ansible": "*.yml", 12 | "Helm": "*.yaml", 13 | "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.22.4-standalone-strict/all.json": "file:///Users/ryandraga/Documents/src/chains-invent-insanity/api/swagger/answer.yaml", 14 | "schemaservice://combinedschema/Helm": "file:///Users/ryandraga/Documents/src/chains-invent-insanity/api/swagger/info.yaml" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chains Invent Insanity 2 | 3 | ![Chains Invent Insanity](https://chains-invent-insanity-assets.sfo3.digitaloceanspaces.com/images/Logo%20Black.png) 4 | 5 | *A Markov Chain-based [Cards Against Humanity](https://cardsagainsthumanity.com) card generator.* 6 | 7 | - - - 8 | 9 | ## Requirements 10 | 11 | ### API 12 | 13 | * Pipenv: [pipenv](https://pipenv.pypa.io/) 14 | * Python 3.9+ 15 | 16 | ### Frontend 17 | 18 | * Node.js: [Node.js](https://nodejs.org/) 19 | * React: [React](https://reactjs.org/) 20 | 21 | ## Setup 22 | 23 | ### API 24 | 25 | 1. Install Pipenv Environment and all dependencies 26 | 27 | `pipenv install` 28 | 29 | 2. Start the API server 30 | 31 | `pipenv run start` 32 | 33 | ### Frontend 34 | 35 | 1. Install Dependencies 36 | 37 | `npm install` 38 | 39 | 2. Start the frontend server 40 | 41 | `npm run start` 42 | 43 | ## Usage 44 | 45 | ### API 46 | 47 | The API is accessible at `http://localhost:8000/api/v1/`, however there are also Swagger docs available at `http://localhost:8000/apidocs/`. 48 | 49 | To modify any API configuration, edit the `gunicorn.conf.py` file. 50 | 51 | ### Frontend 52 | Once the Frontend service is up and running, it can be accessed at `http://localhost:3000/`. 53 | -------------------------------------------------------------------------------- /api/.dockerignore: -------------------------------------------------------------------------------- 1 | Pipfile 2 | Pipfile.lock 3 | env.example 4 | .env 5 | -------------------------------------------------------------------------------- /api/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.9-alpine 2 | 3 | LABEL author="Ryan Draga " 4 | LABEL version="2.0" 5 | 6 | ENV PYTHONDONTWRITEBYTECODE 1 7 | 8 | RUN apk update && apk upgrade 9 | RUN adduser -D ci2 10 | RUN mkdir /app 11 | RUN chown ci2:ci2 /app 12 | 13 | COPY . /app 14 | WORKDIR /app 15 | RUN pip install -r requirements.txt --no-cache-dir --disable-pip-version-check 16 | 17 | USER ci2 18 | 19 | ENTRYPOINT [ "gunicorn", "app:app", "-c", "gunicorn.conf.py" ] 20 | -------------------------------------------------------------------------------- /api/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | markovify = "*" 8 | requests = "*" 9 | python-dotenv = "*" 10 | gunicorn = "*" 11 | Unidecode = "*" 12 | Flask = "*" 13 | flasgger = "*" 14 | 15 | [dev-packages] 16 | 17 | [scripts] 18 | start = "gunicorn app:app --bind=0.0.0.0 --reload" 19 | start-daemon = "gunicorn app:app --bind=0.0.0.0 --daemon" 20 | 21 | [requires] 22 | python_version = "3.9" 23 | -------------------------------------------------------------------------------- /api/Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "d5dd5edb26e54fb941c83382658b8117350a6ba046022b00e188d17d8bb59d0f" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.9" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "attrs": { 20 | "hashes": [ 21 | "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", 22 | "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" 23 | ], 24 | "markers": "python_version >= '3.6'", 25 | "version": "==22.2.0" 26 | }, 27 | "certifi": { 28 | "hashes": [ 29 | "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", 30 | "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" 31 | ], 32 | "markers": "python_version >= '3.6'", 33 | "version": "==2022.12.7" 34 | }, 35 | "charset-normalizer": { 36 | "hashes": [ 37 | "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b", 38 | "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42", 39 | "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d", 40 | "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b", 41 | "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a", 42 | "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59", 43 | "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154", 44 | "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1", 45 | "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c", 46 | "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a", 47 | "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d", 48 | "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6", 49 | "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b", 50 | "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b", 51 | "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783", 52 | "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5", 53 | "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918", 54 | "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555", 55 | "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639", 56 | "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786", 57 | "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e", 58 | "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed", 59 | "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820", 60 | "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8", 61 | "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3", 62 | "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541", 63 | "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14", 64 | "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be", 65 | "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e", 66 | "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76", 67 | "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", 68 | "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c", 69 | "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b", 70 | "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3", 71 | "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc", 72 | "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6", 73 | "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59", 74 | "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4", 75 | "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d", 76 | "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d", 77 | "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3", 78 | "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a", 79 | "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea", 80 | "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6", 81 | "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e", 82 | "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", 83 | "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24", 84 | "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a", 85 | "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58", 86 | "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678", 87 | "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a", 88 | "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c", 89 | "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6", 90 | "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18", 91 | "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174", 92 | "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", 93 | "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f", 94 | "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc", 95 | "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837", 96 | "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41", 97 | "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c", 98 | "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579", 99 | "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753", 100 | "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8", 101 | "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291", 102 | "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087", 103 | "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866", 104 | "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3", 105 | "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d", 106 | "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1", 107 | "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca", 108 | "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e", 109 | "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db", 110 | "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72", 111 | "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d", 112 | "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc", 113 | "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539", 114 | "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d", 115 | "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af", 116 | "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b", 117 | "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602", 118 | "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", 119 | "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478", 120 | "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c", 121 | "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e", 122 | "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479", 123 | "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7", 124 | "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8" 125 | ], 126 | "markers": "python_version >= '3'", 127 | "version": "==3.0.1" 128 | }, 129 | "click": { 130 | "hashes": [ 131 | "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", 132 | "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" 133 | ], 134 | "markers": "python_version >= '3.7'", 135 | "version": "==8.1.3" 136 | }, 137 | "flasgger": { 138 | "hashes": [ 139 | "sha256:0603941cf4003626b4ee551ca87331f1d17b8eecce500ccf1a1f1d3a332fc94a", 140 | "sha256:6ebea406b5beecd77e8da42550f380d4d05a6107bc90b69ce9e77aee7612e2d0" 141 | ], 142 | "index": "pypi", 143 | "version": "==0.9.5" 144 | }, 145 | "flask": { 146 | "hashes": [ 147 | "sha256:7eb373984bf1c770023fce9db164ed0c3353cd0b53f130f4693da0ca756a2e6d", 148 | "sha256:c0bec9477df1cb867e5a67c9e1ab758de9cb4a3e52dd70681f59fa40a62b3f2d" 149 | ], 150 | "index": "pypi", 151 | "version": "==2.2.3" 152 | }, 153 | "gunicorn": { 154 | "hashes": [ 155 | "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e", 156 | "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8" 157 | ], 158 | "index": "pypi", 159 | "version": "==20.1.0" 160 | }, 161 | "idna": { 162 | "hashes": [ 163 | "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", 164 | "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" 165 | ], 166 | "markers": "python_version >= '3.5'", 167 | "version": "==3.4" 168 | }, 169 | "importlib-metadata": { 170 | "hashes": [ 171 | "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad", 172 | "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d" 173 | ], 174 | "markers": "python_version < '3.10'", 175 | "version": "==6.0.0" 176 | }, 177 | "itsdangerous": { 178 | "hashes": [ 179 | "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44", 180 | "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a" 181 | ], 182 | "markers": "python_version >= '3.7'", 183 | "version": "==2.1.2" 184 | }, 185 | "jinja2": { 186 | "hashes": [ 187 | "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", 188 | "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" 189 | ], 190 | "markers": "python_version >= '3.7'", 191 | "version": "==3.1.2" 192 | }, 193 | "jsonschema": { 194 | "hashes": [ 195 | "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", 196 | "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6" 197 | ], 198 | "markers": "python_version >= '3.7'", 199 | "version": "==4.17.3" 200 | }, 201 | "markovify": { 202 | "hashes": [ 203 | "sha256:eac0a156ed54bb6bede32ef20131813fbec9db70b515ead57b4d8887a16dfe39" 204 | ], 205 | "index": "pypi", 206 | "version": "==0.9.4" 207 | }, 208 | "markupsafe": { 209 | "hashes": [ 210 | "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed", 211 | "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc", 212 | "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2", 213 | "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460", 214 | "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7", 215 | "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0", 216 | "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1", 217 | "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa", 218 | "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03", 219 | "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323", 220 | "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65", 221 | "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013", 222 | "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036", 223 | "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f", 224 | "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4", 225 | "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419", 226 | "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2", 227 | "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619", 228 | "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a", 229 | "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a", 230 | "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd", 231 | "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7", 232 | "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666", 233 | "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65", 234 | "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859", 235 | "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625", 236 | "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff", 237 | "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156", 238 | "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd", 239 | "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba", 240 | "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f", 241 | "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1", 242 | "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094", 243 | "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a", 244 | "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513", 245 | "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed", 246 | "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d", 247 | "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3", 248 | "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147", 249 | "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c", 250 | "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603", 251 | "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601", 252 | "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a", 253 | "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1", 254 | "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d", 255 | "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3", 256 | "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54", 257 | "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2", 258 | "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6", 259 | "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58" 260 | ], 261 | "markers": "python_version >= '3.7'", 262 | "version": "==2.1.2" 263 | }, 264 | "mistune": { 265 | "hashes": [ 266 | "sha256:0246113cb2492db875c6be56974a7c893333bf26cd92891c85f63151cee09d34", 267 | "sha256:bad7f5d431886fcbaf5f758118ecff70d31f75231b34024a1341120340a65ce8" 268 | ], 269 | "version": "==2.0.5" 270 | }, 271 | "pyrsistent": { 272 | "hashes": [ 273 | "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8", 274 | "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440", 275 | "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a", 276 | "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c", 277 | "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3", 278 | "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393", 279 | "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9", 280 | "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da", 281 | "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf", 282 | "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64", 283 | "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a", 284 | "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3", 285 | "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98", 286 | "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2", 287 | "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8", 288 | "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf", 289 | "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc", 290 | "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7", 291 | "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28", 292 | "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2", 293 | "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b", 294 | "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a", 295 | "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64", 296 | "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19", 297 | "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1", 298 | "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9", 299 | "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c" 300 | ], 301 | "markers": "python_version >= '3.7'", 302 | "version": "==0.19.3" 303 | }, 304 | "python-dotenv": { 305 | "hashes": [ 306 | "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49", 307 | "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a" 308 | ], 309 | "index": "pypi", 310 | "version": "==0.21.1" 311 | }, 312 | "pyyaml": { 313 | "hashes": [ 314 | "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", 315 | "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", 316 | "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", 317 | "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", 318 | "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", 319 | "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", 320 | "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", 321 | "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", 322 | "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", 323 | "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", 324 | "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", 325 | "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", 326 | "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", 327 | "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", 328 | "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", 329 | "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", 330 | "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", 331 | "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", 332 | "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", 333 | "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", 334 | "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", 335 | "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", 336 | "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", 337 | "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", 338 | "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", 339 | "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", 340 | "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", 341 | "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", 342 | "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", 343 | "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", 344 | "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", 345 | "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", 346 | "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", 347 | "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", 348 | "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", 349 | "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", 350 | "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", 351 | "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", 352 | "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", 353 | "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" 354 | ], 355 | "markers": "python_version >= '3.6'", 356 | "version": "==6.0" 357 | }, 358 | "requests": { 359 | "hashes": [ 360 | "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", 361 | "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" 362 | ], 363 | "index": "pypi", 364 | "version": "==2.28.2" 365 | }, 366 | "setuptools": { 367 | "hashes": [ 368 | "sha256:95f00380ef2ffa41d9bba85d95b27689d923c93dfbafed4aecd7cf988a25e012", 369 | "sha256:bb6d8e508de562768f2027902929f8523932fcd1fb784e6d573d2cafac995a48" 370 | ], 371 | "markers": "python_version >= '3.7'", 372 | "version": "==67.3.2" 373 | }, 374 | "six": { 375 | "hashes": [ 376 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 377 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 378 | ], 379 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 380 | "version": "==1.16.0" 381 | }, 382 | "unidecode": { 383 | "hashes": [ 384 | "sha256:547d7c479e4f377b430dd91ac1275d593308dce0fc464fb2ab7d41f82ec653be", 385 | "sha256:fed09cf0be8cf415b391642c2a5addfc72194407caee4f98719e40ec2a72b830" 386 | ], 387 | "index": "pypi", 388 | "version": "==1.3.6" 389 | }, 390 | "urllib3": { 391 | "hashes": [ 392 | "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", 393 | "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" 394 | ], 395 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 396 | "version": "==1.26.14" 397 | }, 398 | "werkzeug": { 399 | "hashes": [ 400 | "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe", 401 | "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612" 402 | ], 403 | "markers": "python_version >= '3.7'", 404 | "version": "==2.2.3" 405 | }, 406 | "zipp": { 407 | "hashes": [ 408 | "sha256:188834565033387710d046e3fe96acfc9b5e86cbca7f39ff69cf21a4128198b7", 409 | "sha256:9e5421e176ef5ab4c0ad896624e87a7b2f07aca746c9b2aa305952800cb8eecb" 410 | ], 411 | "markers": "python_version >= '3.7'", 412 | "version": "==3.14.0" 413 | } 414 | }, 415 | "develop": {} 416 | } 417 | -------------------------------------------------------------------------------- /api/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request, jsonify, Response 2 | from flasgger import Swagger, swag_from 3 | import inventor 4 | 5 | cfg = inventor.Config() 6 | app = Flask(__name__) 7 | app.debug = cfg.debug_mode 8 | app.secret_key = cfg.app_key 9 | 10 | template = { 11 | "swagger": "2.0", 12 | "swagger_ui_css": "https://raw.githubusercontent.com/Amoenus/SwaggerDark/master/SwaggerDark.css", 13 | "info": { 14 | "title": "Chains Invent Insanity", 15 | "description": "API for Chains Invent Insanity", 16 | "contact": { 17 | "responsibleOrganization": "Boxing Octopus Creative", 18 | "responsibleDeveloper": "ryan.draga@boxingoctop.us", 19 | "email": "ryan.draga@boxingoctop.us", 20 | "url": "https://boxingoctop.us", 21 | }, 22 | "termsOfService": "https://chainsinventinsanity.com/terms", 23 | "version": "2.0" 24 | }, 25 | #"host": "https://chainsinventinsanity.com", # overrides localhost:500 26 | "basePath": "/api", # base bash for blueprint registration 27 | "schemes": [ 28 | "http", 29 | "https" 30 | ], 31 | "operationId": "getmyData" 32 | } 33 | 34 | swagger_config = { 35 | "headers": [], 36 | "specs": [ 37 | { 38 | "endpoint": 'apispec_1', 39 | "route": '/apispec_1.json', 40 | "rule_filter": lambda rule: True, # all in 41 | "model_filter": lambda tag: True, # all in 42 | } 43 | ], 44 | #"static_url_path": "/flasgger_static", 45 | # "static_folder": "static", # must be set by user 46 | "swagger_ui": True, 47 | "specs_route": "/apidocs/", 48 | "favicon": "https://chains-invent-insanity-assets.sfo3.digitaloceanspaces.com/images/swagger_fav.png", 49 | "swagger_ui_bundle_js": 'https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.5.0/swagger-ui-bundle.js', 50 | "swagger_ui_standalone_preset_js": 'https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.5.0/swagger-ui-standalone-preset.js', 51 | 'jquery_js': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js', 52 | 'swagger_ui_css': 'https://chains-invent-insanity-assets.sfo3.digitaloceanspaces.com/css/theme-newspaper.css' 53 | } 54 | 55 | swagger = Swagger(app, template=template, config=swagger_config) 56 | 57 | @app.route('/api/v1/question', methods=['GET']) 58 | @swag_from('swagger/question.yaml') 59 | def question(): 60 | 61 | num_cards = request.args.get('num_cards', default=1, type=int) 62 | attempts = request.args.get('attempts', default=1000, type=int) 63 | 64 | get_card = inventor.Invent(num_cards=num_cards, attempts=attempts) 65 | card = { 66 | 'answer': get_card.question() 67 | } 68 | 69 | response = jsonify(card) 70 | response.headers.add("Access-Control-Allow-Origin", "*") 71 | 72 | if num_cards < 1: 73 | error_msg = "Number of cards to be generated must be a non-zero value" 74 | elif attempts < 1: 75 | error_msg = "Number of attempts must be a non-zero value" 76 | else: 77 | error_msg = "An unknown error occurred" 78 | 79 | if num_cards < 1 or attempts < 1: 80 | return Response(error_msg, status=400) 81 | else: 82 | return response 83 | 84 | @app.route('/api/v1/answer', methods=['GET']) 85 | @swag_from('swagger/answer.yaml') 86 | def answer(): 87 | 88 | num_cards = request.args.get('num_cards', default=1, type=int) 89 | attempts = request.args.get('attempts', default=1000, type=int) 90 | 91 | get_card = inventor.Invent(num_cards=num_cards, attempts=attempts) 92 | card = { 93 | 'answer': get_card.answer() 94 | } 95 | 96 | response = jsonify(card) 97 | response.headers.add("Access-Control-Allow-Origin", "*") 98 | 99 | if num_cards < 1: 100 | error_msg = "Number of cards to be generated must be a non-zero value" 101 | elif attempts < 1: 102 | error_msg = "Number of attempts must be a non-zero value" 103 | else: 104 | error_msg = "An unknown error occurred" 105 | 106 | if num_cards < 1 or attempts < 1: 107 | return Response(error_msg, status=400) 108 | else: 109 | return response 110 | 111 | def main(): 112 | app.run(listen=cfg.listen, port=cfg.port) 113 | 114 | 115 | if __name__ == "__main__": 116 | main() 117 | -------------------------------------------------------------------------------- /api/assets/questions.txt: -------------------------------------------------------------------------------- 1 | _? There's an app for that. 2 | Why can't I sleep at night? 3 | What's that smell? 4 | I got 99 problems but _ ain't one. 5 | Maybe she's born with it. Maybe it's _. 6 | What's the next Happy Meal© toy? 7 | Anthropologists have recently discovered a primitive tribe that worships _. 8 | It's a pity that kids these days are all getting involved with _. 9 | During Picasso's often-overlooked Brown Period, he produced hundreds of paintings of _. 10 | Alternative medicine is now embracing the curative powers of _. 11 | And the Academy Award for _ goes to _. 12 | What's that sound? 13 | What ended my last relationship? 14 | MTV's new reality show features eight washed-up celebrities living with _. 15 | I drink to forget _. 16 | I'm sorry professor, but I couldn't complete my homework because of _. 17 | What is Batman's guilty pleasure? 18 | This is the way the world ends
This is the way the world ends
Not with a bang but with _. 19 | What's a girl's best friend? 20 | TSA guidelines now prohibit _ on airplanes. 21 | _. That's how I want to die. 22 | For my next trick, I will pull _ out of _. 23 | In the new Disney Channel Original Movie, Hannah Montana struggles with _ for the first time. 24 | _ is a slippery slope that leads to _. 25 | What does Dick Cheney prefer? 26 | Dear Abby, I'm having some trouble with _ and would like your advice. 27 | Instead of coal, Santa now gives the bad children _. 28 | What's the most emo? 29 | In 1,000 years when paper money is but a distant memory, _ will be our currency. 30 | What's the next superhero/sidekick duo? 31 | In M. Night Shyamalan's new movie, Bruce Willis discovers that _ had really been _ all along. 32 | A romantic, candlelit dinner would be incomplete without _. 33 | _. Becha can't have just one! 34 | White people like _. 35 | _. High five, bro. 36 | Next from J.K. Rowling: Harry Potter and the Chamber of _. 37 | BILLY MAYS HERE FOR _. 38 | In a world ravaged by _, our only solace is _. 39 | War! What is it good for? 40 | During sex, I like to think about _. 41 | What are my parents hiding from me? 42 | What will always get you laid? 43 | In L.A. County Jail, word is you can trade 200 cigarettes for _. 44 | What did I bring back from Mexico? 45 | What don't you want to find in your Chinese food? 46 | What will I bring back in time to convince people that I am a powerful wizard? 47 | How am I maintaining my relationship status? 48 | _. It's a trap! 49 | Coming to Broadway this season, _: The Musical. 50 | While the United States raced the Soviet Union to the moon, the Mexican government funneled millions of pesos into research on _. 51 | After the earthquake, Sean Penn brought _ to the people of Haiti. 52 | Next on ESPN2, the World Series of _. 53 | Step 1: _. Step 2: _. Step 3: Profit. 54 | Rumor has it that Vladimir Putin's favorite dish is _ stuffed with _. 55 | But before I kill you, Mr. Bond, I must show you _. 56 | What gives me uncontrollable gas? 57 | What do old people smell like? 58 | The class field trip was completely ruined by _. 59 | When Pharaoh remained unmoved, Moses called down a Plague of _. 60 | What's my secret power? 61 | What's there a ton of in heaven? 62 | What would grandma find disturbing, yet oddly charming? 63 | I never truly understood _ until I encountered _. 64 | What did the U.S. airdrop to the children of Afghanistan? 65 | What helps Obama unwind? 66 | What did Vin Diesel eat for dinner? 67 | _: good to the last drop. 68 | Why am I sticky? 69 | What gets better with age? 70 | _: kid-tested, mother-approved. 71 | What's the crustiest? 72 | What's Teach for America using to inspire inner city students to succeed? 73 | Studies show that lab rats navigate mazes 50% faster after being exposed to _. 74 | Life for American Indians was forever changed when the White Man introduced them to _. 75 | Make a haiku. 76 | I do not know with what weapons World War III will be fought, but World War IV will be fought with _. 77 | Why do I hurt all over? 78 | What am I giving up for Lent? 79 | In Michael Jackson's final moments, he thought about _. 80 | In an attempt to reach a wider audience, the Smithsonian Museum of Natural History has opened an interactive exhibit on _. 81 | When I am President of the United States, I will create the Department of _. 82 | Lifetime© presents _, the story of _. 83 | When I am a billionaire, I shall erect a 50-foot statue to commemorate _. 84 | When I was tripping on acid, _ turned into _. 85 | That's right, I killed _. How, you ask? _. 86 | What's my anti-drug? 87 | _ + _ = _. 88 | What never fails to liven up the party? 89 | What's the new fad diet? 90 | Major League Baseball has banned _ for giving players an unfair advantage. 91 | My plan for world domination begins with _. 92 | The CIA now interrogates enemy agents by repeatedly subjecting them to _. 93 | Dear Sir or Madam, We regret to inform you that the Office of _ has denied your request for _ 94 | In Rome, there are whisperings that the Vatican has a secret room devoted to _. 95 | Science will never explain _. 96 | When all else fails, I can always masturbate to _. 97 | I learned the hard way that you can't cheer up a grieving friend with _. 98 | In its new tourism campaign, Detroit proudly proclaims that it has finally eliminated _. 99 | An international tribunal has found _ guilty of _. 100 | The socialist governments of Scandinavia have declared that access to _ is a basic human right. 101 | In his new self-produced album, Kanye West raps over the sounds of _. 102 | What's the gift that keeps on giving? 103 | Next season on Man vs. Wild, Bear Grylls must survive in the depths of the Amazon with only _ and his wits. 104 | When I pooped, what came out of my butt? 105 | In the distant future, historians will agree that _ marked the beginning of America's decline. 106 | In a pinch, _ can be a suitable substitute for _. 107 | What has been making life difficult at the nudist colony? 108 | Michael Bay's new three-hour action epic pits _ against _. 109 | And I would have gotten away with it, too, if it hadn't been for _. 110 | What brought the orgy to a grinding halt? 111 | During his midlife crisis, my dad got really into _. 112 | _ would be woefully incomplete without _. 113 | My new favorite porn star is Joey "_" McGee. 114 | Before I run for president, I must destroy all evidence of my involvement with _. 115 | This is your captain speaking. Fasten your seatbelts and prepare for _. 116 | In his newest and most difficult stunt, David Blaine must escape from _. 117 | The Five Stages of Grief: denial, anger, bargaining, _, and acceptance. 118 | My mom freaked out when she looked at my browser history and found _.com/_. 119 | I went from _ to _, all thanks to _. 120 | Members of New York's social elite are paying thousands of dollars just to experience _. 121 | This month's Cosmo: "Spice up your sex life by bringing _ into the bedroom." 122 | Little Miss Muffet Sat on a tuffet, Eating her curds and _. 123 | If God didn't want us to enjoy _, he wouldn't have given us _. 124 | My country, 'tis of thee, sweet land of _. 125 | After months of debate, the Occupy Wall Street General Assembly could only agree on "More _!" 126 | I spent my whole life working toward _, only to have it ruined by _. 127 | Next time on Dr. Phil: How to talk to your child about _. 128 | Only two things in life are certain: death and _. 129 | Everyone down on the ground! We don't want to hurt anyone. We're just here for _. 130 | The healing process began when I joined a support group for victims of _. 131 | The votes are in, and the new high school mascot is _. 132 | Charades was ruined for me forever when my mom had to act out _. 133 | Before _, all we had was _. 134 | Tonight on 20/20: What you don't know about _ could kill you. 135 | You haven't truly lived until you've experienced _ and _ at the same time. 136 | D&D 4.0 isn't real D&D because of the _. 137 | It's a D&D retroclone with _ added. 138 | Storygames aren't RPGs because of the _. 139 | The Slayer's Guide to _. 140 | Worst character concept ever: _, but with _. 141 | Alightment: Chaotic _ 142 | It's a D&D retroclone with _ added. 143 | What made the paladin fall? _ 144 | The portal leads to the quasi-elemental plane of _. 145 | The Temple of Elemental _. 146 | Pathfinder is basically D&D _ Edition. 147 | _ : The Storytelling Game. 148 | People are wondering why Steve Jackson published GURPS _. 149 | Linear Fighter, Quadratic _. 150 | You start with 1d4 _ points. 151 | Back when I was 12 and I was just starting playing D&D, the game had _. 152 | Big Eyes, Small _. 153 | In the grim darkness of the future there is only _. 154 | My innovative new RPG has a stat for _. 155 | A true gamer has no problem with _. 156 | Elminster cast a potent _ spell and then had sex with _. 157 | The Deck of Many _. 158 | You are all at a tavern when _ approach you. 159 | For the convention I cosplayed as Sailor Moon, except with _. 160 | The worst part of Grave of the Fireflies is all the _. 161 | In the Evangelion remake, Shinji has to deal with _. 162 | Worst anime convention purchase ever? _. 163 | While powering up Vegeta screamed, _! 164 | You evaded my _ attack. Most impressive. 165 | I downloaded a doujin where _ got into _. 166 | The magical girl found out that the Power of Love is useless against _. 167 | The Japanese government has spent billions of yen researching _. 168 | In the dubbed version they changed _ into _. 169 | _ is Best Pony. 170 | The _ of Haruhi Suzumiya. 171 | The new thing in Akihabara is fetish cafes where you can see girls dressed up as _. 172 | Your drill can pierce _! 173 | Avatar: The Last _ bender. 174 | In the name of _ Sailor Moon will punish you! 175 | No harem anime is complete without _. 176 | My boyfriend's a _ now. 177 | The _ of _ has left me in despair! 178 | _.tumblr.com 179 | Somehow they made a cute mascot girl out of _. 180 | Haruko hit Naoto in the head with her bass guitar and _ came out. 181 | After blacking out during New year's Eve, I was awoken by _. 182 | This holiday season, Tim Allen must overcome his fear of _ to save Christmas. 183 | Jesus is _. 184 | Every Christmas, my uncle gets drunk and tells the story about _. 185 | What keeps me warm during the cold, cold, winter? 186 | On the third day of Christmas, my true love gave to me: three French hens, two turtle doves, and _. 187 | Wake up, America. Christmas is under attack by secular liberals and their _. 188 | We got the third rope, now where's the fourth? 189 | Tonights main event, _ vs. _. 190 | Tackle, Dropdown, _. 191 | Christopher Daniels is late on his _. 192 | Instead of booking _, they should have booked _. 193 | Genius is 10% inspiration, 90% _. 194 | They found _ in the dumpster behind _. 195 | The best thing I ever got for Christmas was _. 196 | There's no crying in _. 197 | Mastodon! Pterodactyl! Triceratops! Sabretooth Tiger! _! 198 | Don't eat the _. 199 | He did _ with the _!?! 200 | SOOOOO hot, want to touch the _. 201 | Stop looking at me _! 202 | I'm cuckoo for _ puffs. 203 | Silly rabbit, _ are for kids. 204 | Between love and madness lies _. 205 | Instead of chess, the Grim Reaper now gambles for your soul with a game of _. 206 | My father gave his life fighting to protect _ from _. 207 | Why is my throat sore? 208 | _ sparked a city-wide riot that only ended with _. 209 | I’m very sorry Mrs. Smith, but Little Billy has tested positive for _. 210 | Instead of beating them, Chris Brown now does _ to women. 211 | Instead of cutting, trendy young emo girls now engage in _. 212 | The definition of rock bottom is gambling away _. 213 | The Mayan prophecies really heralded the coming of _ in 2012. 214 | The next US election will be fought on the key issues of _ against _. 215 | When I was 10 I wrote to Santa wishing for _. 216 | Where or How I met my last signifigant other: _. 217 | _, Never leave home without it. 218 | _. This is my fetish. 219 | David Icke's newest conspiracy theory states that _ caused _. 220 | I did _ so you don't have to! 221 | I need your clothes, your bike, and _. 222 | In a new Cold War retro movie, the red menace tries to conquer the world through the cunning use of _. 223 | In college, our lecturer made us write a report comparing _ to _. 224 | In The Hangover part 3, those four guys have to deal with _, _, and _. 225 | My zombie survival kit includes food, water, and _. 226 | The way to a man's heart is through _. 227 | What was the theme of my second wedding? 228 | What's the newest Japanese craze to head West? 229 | Everybody loves _. 230 | I can only express myself through _. 231 | My new porn DVD was completely ruined by the inclusion of _ 232 | My three wishes will be for _, _, and _. 233 | The latest horrifying school shooting was inspired by _. 234 | I got fired because of my not-so-secret obsession over _. 235 | My new favourite sexual position is _ 236 | A successful job interview begins with a firm handshake and ends with _. 237 | Lovin' you is easy 'cause you're _. 238 | My life is ruled by a vicious cycle of _ and _. 239 | The blind date was going horribly until we discovered our shared interest in _. 240 | _. Awesome in theory, kind of a mess in practice. 241 | I'm not like the rest of you. I'm too rich and busy for _. 242 | In the seventh circle of Hell, sinners must endure _ for all eternity. 243 | _: Hours of fun. Easy to use. Perfect for _! 244 | What left this stain on my couch? 245 | Call the law offices of Goldstein & Goldstein, because no one should have to tolerate _ in the workplace. 246 | When you get right down to it, _ is just _. 247 | Turns out that _-Man was neither the hero we needed nor wanted. 248 | As part of his daily regimen, Anderson Cooper sets aside 15 minutes for _. 249 | Money can't buy me love, but it can buy me _. 250 | With enough time and pressure, _ will turn into _. 251 | And what did you bring for show and tell? 252 | During high school, I never really fit in until I found _ club. 253 | Hey, baby, come back to my place and I'll show you _. 254 | After months of practice with _, I think I'm finally ready for _. 255 | To prepare for his upcoming role, Daniel Day-Lewis immersed himself in the world of _. 256 | Finally! A service that delivers _ right to your door. 257 | My gym teacher got fired for adding _ to the obstacle course. 258 | Having problems with _? Try _! 259 | As part of his contract, Prince won't perform without _ in his dressing room. 260 | Listen, son. If you want to get involved with _, I won't stop you. Just steer clear of _. 261 | I just met you and this is crazy, but here's _, so _ maybe 262 | It's only _ if you get caught! 263 | _: The Next Generation 264 | Terminator 4: _ 265 | Disney presents _ on ice! 266 | _. The other white meat. 267 | A _ a day keeps the _ away. 268 | I'm sweating like a _ at a _. 269 | I love the smell of _ in the morning. 270 | You're not gonna believe this, but _. 271 | _. All the cool kids are doing it. 272 | So I was _ in my cubicle at work, and suddenly _! 273 | Baskin Robbins just added a 32nd flavor: _! 274 | I can drive and ____ at the same time. 275 | _ ain't nothin' to fuck wit'! 276 | -------------------------------------------------------------------------------- /api/assets/swagger_dark.css: -------------------------------------------------------------------------------- 1 | a { color: #8c8cfa; } 2 | 3 | ::-webkit-scrollbar-track-piece { background-color: rgba(255, 255, 255, .2) !important; } 4 | 5 | ::-webkit-scrollbar-track { background-color: rgba(255, 255, 255, .3) !important; } 6 | 7 | ::-webkit-scrollbar-thumb { background-color: rgba(255, 255, 255, .5) !important; } 8 | 9 | embed[type="application/pdf"] { filter: invert(90%); } 10 | 11 | html { 12 | background: #1f1f1f !important; 13 | box-sizing: border-box; 14 | filter: contrast(100%) brightness(100%) saturate(100%); 15 | overflow-y: scroll; 16 | } 17 | 18 | body { 19 | background: #1f1f1f; 20 | background-color: #1f1f1f; 21 | background-image: none !important; 22 | } 23 | 24 | button, input, select, textarea { 25 | background-color: #1f1f1f; 26 | color: #bfbfbf; 27 | } 28 | 29 | font, html { color: #bfbfbf; } 30 | 31 | .swagger-ui, .swagger-ui section h3 { color: #b5bac9; } 32 | 33 | .swagger-ui a { background-color: transparent; } 34 | 35 | .swagger-ui mark { 36 | background-color: #664b00; 37 | color: #bfbfbf; 38 | } 39 | 40 | .swagger-ui legend { color: inherit; } 41 | 42 | .swagger-ui .debug * { outline: #e6da99 solid 1px; } 43 | 44 | .swagger-ui .debug-white * { outline: #fff solid 1px; } 45 | 46 | .swagger-ui .debug-black * { outline: #bfbfbf solid 1px; } 47 | 48 | .swagger-ui .debug-grid { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) 0 0; } 49 | 50 | .swagger-ui .debug-grid-16 { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) 0 0; } 51 | 52 | .swagger-ui .debug-grid-8-solid { background: url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) 0 0 #1c1c21; } 53 | 54 | .swagger-ui .debug-grid-16-solid { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) 0 0 #1c1c21; } 55 | 56 | .swagger-ui .b--black { border-color: #000; } 57 | 58 | .swagger-ui .b--near-black { border-color: #121212; } 59 | 60 | .swagger-ui .b--dark-gray { border-color: #333; } 61 | 62 | .swagger-ui .b--mid-gray { border-color: #545454; } 63 | 64 | .swagger-ui .b--gray { border-color: #787878; } 65 | 66 | .swagger-ui .b--silver { border-color: #999; } 67 | 68 | .swagger-ui .b--light-silver { border-color: #6e6e6e; } 69 | 70 | .swagger-ui .b--moon-gray { border-color: #4d4d4d; } 71 | 72 | .swagger-ui .b--light-gray { border-color: #2b2b2b; } 73 | 74 | .swagger-ui .b--near-white { border-color: #242424; } 75 | 76 | .swagger-ui .b--white { border-color: #1c1c21; } 77 | 78 | .swagger-ui .b--white-90 { border-color: rgba(28, 28, 33, .9); } 79 | 80 | .swagger-ui .b--white-80 { border-color: rgba(28, 28, 33, .8); } 81 | 82 | .swagger-ui .b--white-70 { border-color: rgba(28, 28, 33, .7); } 83 | 84 | .swagger-ui .b--white-60 { border-color: rgba(28, 28, 33, .6); } 85 | 86 | .swagger-ui .b--white-50 { border-color: rgba(28, 28, 33, .5); } 87 | 88 | .swagger-ui .b--white-40 { border-color: rgba(28, 28, 33, .4); } 89 | 90 | .swagger-ui .b--white-30 { border-color: rgba(28, 28, 33, .3); } 91 | 92 | .swagger-ui .b--white-20 { border-color: rgba(28, 28, 33, .2); } 93 | 94 | .swagger-ui .b--white-10 { border-color: rgba(28, 28, 33, .1); } 95 | 96 | .swagger-ui .b--white-05 { border-color: rgba(28, 28, 33, .05); } 97 | 98 | .swagger-ui .b--white-025 { border-color: rgba(28, 28, 33, .024); } 99 | 100 | .swagger-ui .b--white-0125 { border-color: rgba(28, 28, 33, .01); } 101 | 102 | .swagger-ui .b--black-90 { border-color: rgba(0, 0, 0, .9); } 103 | 104 | .swagger-ui .b--black-80 { border-color: rgba(0, 0, 0, .8); } 105 | 106 | .swagger-ui .b--black-70 { border-color: rgba(0, 0, 0, .7); } 107 | 108 | .swagger-ui .b--black-60 { border-color: rgba(0, 0, 0, .6); } 109 | 110 | .swagger-ui .b--black-50 { border-color: rgba(0, 0, 0, .5); } 111 | 112 | .swagger-ui .b--black-40 { border-color: rgba(0, 0, 0, .4); } 113 | 114 | .swagger-ui .b--black-30 { border-color: rgba(0, 0, 0, .3); } 115 | 116 | .swagger-ui .b--black-20 { border-color: rgba(0, 0, 0, .2); } 117 | 118 | .swagger-ui .b--black-10 { border-color: rgba(0, 0, 0, .1); } 119 | 120 | .swagger-ui .b--black-05 { border-color: rgba(0, 0, 0, .05); } 121 | 122 | .swagger-ui .b--black-025 { border-color: rgba(0, 0, 0, .024); } 123 | 124 | .swagger-ui .b--black-0125 { border-color: rgba(0, 0, 0, .01); } 125 | 126 | .swagger-ui .b--dark-red { border-color: #bc2f36; } 127 | 128 | .swagger-ui .b--red { border-color: #c83932; } 129 | 130 | .swagger-ui .b--light-red { border-color: #ab3c2b; } 131 | 132 | .swagger-ui .b--orange { border-color: #cc6e33; } 133 | 134 | .swagger-ui .b--purple { border-color: #5e2ca5; } 135 | 136 | .swagger-ui .b--light-purple { border-color: #672caf; } 137 | 138 | .swagger-ui .b--dark-pink { border-color: #ab2b81; } 139 | 140 | .swagger-ui .b--hot-pink { border-color: #c03086; } 141 | 142 | .swagger-ui .b--pink { border-color: #8f2464; } 143 | 144 | .swagger-ui .b--light-pink { border-color: #721d4d; } 145 | 146 | .swagger-ui .b--dark-green { border-color: #1c6e50; } 147 | 148 | .swagger-ui .b--green { border-color: #279b70; } 149 | 150 | .swagger-ui .b--light-green { border-color: #228762; } 151 | 152 | .swagger-ui .b--navy { border-color: #0d1d35; } 153 | 154 | .swagger-ui .b--dark-blue { border-color: #20497e; } 155 | 156 | .swagger-ui .b--blue { border-color: #4380d0; } 157 | 158 | .swagger-ui .b--light-blue { border-color: #20517e; } 159 | 160 | .swagger-ui .b--lightest-blue { border-color: #143a52; } 161 | 162 | .swagger-ui .b--washed-blue { border-color: #0c312d; } 163 | 164 | .swagger-ui .b--washed-green { border-color: #0f3d2c; } 165 | 166 | .swagger-ui .b--washed-red { border-color: #411010; } 167 | 168 | .swagger-ui .b--transparent { border-color: transparent; } 169 | 170 | .swagger-ui .b--gold, .swagger-ui .b--light-yellow, .swagger-ui .b--washed-yellow, .swagger-ui .b--yellow { border-color: #664b00; } 171 | 172 | .swagger-ui .shadow-1 { box-shadow: rgba(0, 0, 0, .2) 0 0 4px 2px; } 173 | 174 | .swagger-ui .shadow-2 { box-shadow: rgba(0, 0, 0, .2) 0 0 8px 2px; } 175 | 176 | .swagger-ui .shadow-3 { box-shadow: rgba(0, 0, 0, .2) 2px 2px 4px 2px; } 177 | 178 | .swagger-ui .shadow-4 { box-shadow: rgba(0, 0, 0, .2) 2px 2px 8px 0; } 179 | 180 | .swagger-ui .shadow-5 { box-shadow: rgba(0, 0, 0, .2) 4px 4px 8px 0; } 181 | 182 | @media screen and (min-width: 30em) { 183 | .swagger-ui .shadow-1-ns { box-shadow: rgba(0, 0, 0, .2) 0 0 4px 2px; } 184 | 185 | .swagger-ui .shadow-2-ns { box-shadow: rgba(0, 0, 0, .2) 0 0 8px 2px; } 186 | 187 | .swagger-ui .shadow-3-ns { box-shadow: rgba(0, 0, 0, .2) 2px 2px 4px 2px; } 188 | 189 | .swagger-ui .shadow-4-ns { box-shadow: rgba(0, 0, 0, .2) 2px 2px 8px 0; } 190 | 191 | .swagger-ui .shadow-5-ns { box-shadow: rgba(0, 0, 0, .2) 4px 4px 8px 0; } 192 | } 193 | 194 | @media screen and (max-width: 60em) and (min-width: 30em) { 195 | .swagger-ui .shadow-1-m { box-shadow: rgba(0, 0, 0, .2) 0 0 4px 2px; } 196 | 197 | .swagger-ui .shadow-2-m { box-shadow: rgba(0, 0, 0, .2) 0 0 8px 2px; } 198 | 199 | .swagger-ui .shadow-3-m { box-shadow: rgba(0, 0, 0, .2) 2px 2px 4px 2px; } 200 | 201 | .swagger-ui .shadow-4-m { box-shadow: rgba(0, 0, 0, .2) 2px 2px 8px 0; } 202 | 203 | .swagger-ui .shadow-5-m { box-shadow: rgba(0, 0, 0, .2) 4px 4px 8px 0; } 204 | } 205 | 206 | @media screen and (min-width: 60em) { 207 | .swagger-ui .shadow-1-l { box-shadow: rgba(0, 0, 0, .2) 0 0 4px 2px; } 208 | 209 | .swagger-ui .shadow-2-l { box-shadow: rgba(0, 0, 0, .2) 0 0 8px 2px; } 210 | 211 | .swagger-ui .shadow-3-l { box-shadow: rgba(0, 0, 0, .2) 2px 2px 4px 2px; } 212 | 213 | .swagger-ui .shadow-4-l { box-shadow: rgba(0, 0, 0, .2) 2px 2px 8px 0; } 214 | 215 | .swagger-ui .shadow-5-l { box-shadow: rgba(0, 0, 0, .2) 4px 4px 8px 0; } 216 | } 217 | 218 | .swagger-ui .black-05 { color: rgba(191, 191, 191, .05); } 219 | 220 | .swagger-ui .bg-black-05 { background-color: rgba(0, 0, 0, .05); } 221 | 222 | .swagger-ui .black-90, .swagger-ui .hover-black-90:focus, .swagger-ui .hover-black-90:hover { color: rgba(191, 191, 191, .9); } 223 | 224 | .swagger-ui .black-80, .swagger-ui .hover-black-80:focus, .swagger-ui .hover-black-80:hover { color: rgba(191, 191, 191, .8); } 225 | 226 | .swagger-ui .black-70, .swagger-ui .hover-black-70:focus, .swagger-ui .hover-black-70:hover { color: rgba(191, 191, 191, .7); } 227 | 228 | .swagger-ui .black-60, .swagger-ui .hover-black-60:focus, .swagger-ui .hover-black-60:hover { color: rgba(191, 191, 191, .6); } 229 | 230 | .swagger-ui .black-50, .swagger-ui .hover-black-50:focus, .swagger-ui .hover-black-50:hover { color: rgba(191, 191, 191, .5); } 231 | 232 | .swagger-ui .black-40, .swagger-ui .hover-black-40:focus, .swagger-ui .hover-black-40:hover { color: rgba(191, 191, 191, .4); } 233 | 234 | .swagger-ui .black-30, .swagger-ui .hover-black-30:focus, .swagger-ui .hover-black-30:hover { color: rgba(191, 191, 191, .3); } 235 | 236 | .swagger-ui .black-20, .swagger-ui .hover-black-20:focus, .swagger-ui .hover-black-20:hover { color: rgba(191, 191, 191, .2); } 237 | 238 | .swagger-ui .black-10, .swagger-ui .hover-black-10:focus, .swagger-ui .hover-black-10:hover { color: rgba(191, 191, 191, .1); } 239 | 240 | .swagger-ui .hover-white-90:focus, .swagger-ui .hover-white-90:hover, .swagger-ui .white-90 { color: rgba(255, 255, 255, .9); } 241 | 242 | .swagger-ui .hover-white-80:focus, .swagger-ui .hover-white-80:hover, .swagger-ui .white-80 { color: rgba(255, 255, 255, .8); } 243 | 244 | .swagger-ui .hover-white-70:focus, .swagger-ui .hover-white-70:hover, .swagger-ui .white-70 { color: rgba(255, 255, 255, .7); } 245 | 246 | .swagger-ui .hover-white-60:focus, .swagger-ui .hover-white-60:hover, .swagger-ui .white-60 { color: rgba(255, 255, 255, .6); } 247 | 248 | .swagger-ui .hover-white-50:focus, .swagger-ui .hover-white-50:hover, .swagger-ui .white-50 { color: rgba(255, 255, 255, .5); } 249 | 250 | .swagger-ui .hover-white-40:focus, .swagger-ui .hover-white-40:hover, .swagger-ui .white-40 { color: rgba(255, 255, 255, .4); } 251 | 252 | .swagger-ui .hover-white-30:focus, .swagger-ui .hover-white-30:hover, .swagger-ui .white-30 { color: rgba(255, 255, 255, .3); } 253 | 254 | .swagger-ui .hover-white-20:focus, .swagger-ui .hover-white-20:hover, .swagger-ui .white-20 { color: rgba(255, 255, 255, .2); } 255 | 256 | .swagger-ui .hover-white-10:focus, .swagger-ui .hover-white-10:hover, .swagger-ui .white-10 { color: rgba(255, 255, 255, .1); } 257 | 258 | .swagger-ui .hover-moon-gray:focus, .swagger-ui .hover-moon-gray:hover, .swagger-ui .moon-gray { color: #ccc; } 259 | 260 | .swagger-ui .hover-light-gray:focus, .swagger-ui .hover-light-gray:hover, .swagger-ui .light-gray { color: #ededed; } 261 | 262 | .swagger-ui .hover-near-white:focus, .swagger-ui .hover-near-white:hover, .swagger-ui .near-white { color: #f5f5f5; } 263 | 264 | .swagger-ui .dark-red, .swagger-ui .hover-dark-red:focus, .swagger-ui .hover-dark-red:hover { color: #e6999d; } 265 | 266 | .swagger-ui .hover-red:focus, .swagger-ui .hover-red:hover, .swagger-ui .red { color: #e69d99; } 267 | 268 | .swagger-ui .hover-light-red:focus, .swagger-ui .hover-light-red:hover, .swagger-ui .light-red { color: #e6a399; } 269 | 270 | .swagger-ui .hover-orange:focus, .swagger-ui .hover-orange:hover, .swagger-ui .orange { color: #e6b699; } 271 | 272 | .swagger-ui .gold, .swagger-ui .hover-gold:focus, .swagger-ui .hover-gold:hover { color: #e6d099; } 273 | 274 | .swagger-ui .hover-yellow:focus, .swagger-ui .hover-yellow:hover, .swagger-ui .yellow { color: #e6da99; } 275 | 276 | .swagger-ui .hover-light-yellow:focus, .swagger-ui .hover-light-yellow:hover, .swagger-ui .light-yellow { color: #ede6b6; } 277 | 278 | .swagger-ui .hover-purple:focus, .swagger-ui .hover-purple:hover, .swagger-ui .purple { color: #b99ae4; } 279 | 280 | .swagger-ui .hover-light-purple:focus, .swagger-ui .hover-light-purple:hover, .swagger-ui .light-purple { color: #bb99e6; } 281 | 282 | .swagger-ui .dark-pink, .swagger-ui .hover-dark-pink:focus, .swagger-ui .hover-dark-pink:hover { color: #e699cc; } 283 | 284 | .swagger-ui .hot-pink, .swagger-ui .hover-hot-pink:focus, .swagger-ui .hover-hot-pink:hover, .swagger-ui .hover-pink:focus, .swagger-ui .hover-pink:hover, .swagger-ui .pink { color: #e699c7; } 285 | 286 | .swagger-ui .hover-light-pink:focus, .swagger-ui .hover-light-pink:hover, .swagger-ui .light-pink { color: #edb6d5; } 287 | 288 | .swagger-ui .dark-green, .swagger-ui .green, .swagger-ui .hover-dark-green:focus, .swagger-ui .hover-dark-green:hover, .swagger-ui .hover-green:focus, .swagger-ui .hover-green:hover { color: #99e6c9; } 289 | 290 | .swagger-ui .hover-light-green:focus, .swagger-ui .hover-light-green:hover, .swagger-ui .light-green { color: #a1e8ce; } 291 | 292 | .swagger-ui .hover-navy:focus, .swagger-ui .hover-navy:hover, .swagger-ui .navy { color: #99b8e6; } 293 | 294 | .swagger-ui .blue, .swagger-ui .dark-blue, .swagger-ui .hover-blue:focus, .swagger-ui .hover-blue:hover, .swagger-ui .hover-dark-blue:focus, .swagger-ui .hover-dark-blue:hover { color: #99bae6; } 295 | 296 | .swagger-ui .hover-light-blue:focus, .swagger-ui .hover-light-blue:hover, .swagger-ui .light-blue { color: #a9cbea; } 297 | 298 | .swagger-ui .hover-lightest-blue:focus, .swagger-ui .hover-lightest-blue:hover, .swagger-ui .lightest-blue { color: #d6e9f5; } 299 | 300 | .swagger-ui .hover-washed-blue:focus, .swagger-ui .hover-washed-blue:hover, .swagger-ui .washed-blue { color: #f7fdfc; } 301 | 302 | .swagger-ui .hover-washed-green:focus, .swagger-ui .hover-washed-green:hover, .swagger-ui .washed-green { color: #ebfaf4; } 303 | 304 | .swagger-ui .hover-washed-yellow:focus, .swagger-ui .hover-washed-yellow:hover, .swagger-ui .washed-yellow { color: #fbf9ef; } 305 | 306 | .swagger-ui .hover-washed-red:focus, .swagger-ui .hover-washed-red:hover, .swagger-ui .washed-red { color: #f9e7e7; } 307 | 308 | .swagger-ui .color-inherit, .swagger-ui .hover-inherit:focus, .swagger-ui .hover-inherit:hover { color: inherit; } 309 | 310 | .swagger-ui .bg-black-90, .swagger-ui .hover-bg-black-90:focus, .swagger-ui .hover-bg-black-90:hover { background-color: rgba(0, 0, 0, .9); } 311 | 312 | .swagger-ui .bg-black-80, .swagger-ui .hover-bg-black-80:focus, .swagger-ui .hover-bg-black-80:hover { background-color: rgba(0, 0, 0, .8); } 313 | 314 | .swagger-ui .bg-black-70, .swagger-ui .hover-bg-black-70:focus, .swagger-ui .hover-bg-black-70:hover { background-color: rgba(0, 0, 0, .7); } 315 | 316 | .swagger-ui .bg-black-60, .swagger-ui .hover-bg-black-60:focus, .swagger-ui .hover-bg-black-60:hover { background-color: rgba(0, 0, 0, .6); } 317 | 318 | .swagger-ui .bg-black-50, .swagger-ui .hover-bg-black-50:focus, .swagger-ui .hover-bg-black-50:hover { background-color: rgba(0, 0, 0, .5); } 319 | 320 | .swagger-ui .bg-black-40, .swagger-ui .hover-bg-black-40:focus, .swagger-ui .hover-bg-black-40:hover { background-color: rgba(0, 0, 0, .4); } 321 | 322 | .swagger-ui .bg-black-30, .swagger-ui .hover-bg-black-30:focus, .swagger-ui .hover-bg-black-30:hover { background-color: rgba(0, 0, 0, .3); } 323 | 324 | .swagger-ui .bg-black-20, .swagger-ui .hover-bg-black-20:focus, .swagger-ui .hover-bg-black-20:hover { background-color: rgba(0, 0, 0, .2); } 325 | 326 | .swagger-ui .bg-white-90, .swagger-ui .hover-bg-white-90:focus, .swagger-ui .hover-bg-white-90:hover { background-color: rgba(28, 28, 33, .9); } 327 | 328 | .swagger-ui .bg-white-80, .swagger-ui .hover-bg-white-80:focus, .swagger-ui .hover-bg-white-80:hover { background-color: rgba(28, 28, 33, .8); } 329 | 330 | .swagger-ui .bg-white-70, .swagger-ui .hover-bg-white-70:focus, .swagger-ui .hover-bg-white-70:hover { background-color: rgba(28, 28, 33, .7); } 331 | 332 | .swagger-ui .bg-white-60, .swagger-ui .hover-bg-white-60:focus, .swagger-ui .hover-bg-white-60:hover { background-color: rgba(28, 28, 33, .6); } 333 | 334 | .swagger-ui .bg-white-50, .swagger-ui .hover-bg-white-50:focus, .swagger-ui .hover-bg-white-50:hover { background-color: rgba(28, 28, 33, .5); } 335 | 336 | .swagger-ui .bg-white-40, .swagger-ui .hover-bg-white-40:focus, .swagger-ui .hover-bg-white-40:hover { background-color: rgba(28, 28, 33, .4); } 337 | 338 | .swagger-ui .bg-white-30, .swagger-ui .hover-bg-white-30:focus, .swagger-ui .hover-bg-white-30:hover { background-color: rgba(28, 28, 33, .3); } 339 | 340 | .swagger-ui .bg-white-20, .swagger-ui .hover-bg-white-20:focus, .swagger-ui .hover-bg-white-20:hover { background-color: rgba(28, 28, 33, .2); } 341 | 342 | .swagger-ui .bg-black, .swagger-ui .hover-bg-black:focus, .swagger-ui .hover-bg-black:hover { background-color: #000; } 343 | 344 | .swagger-ui .bg-near-black, .swagger-ui .hover-bg-near-black:focus, .swagger-ui .hover-bg-near-black:hover { background-color: #121212; } 345 | 346 | .swagger-ui .bg-dark-gray, .swagger-ui .hover-bg-dark-gray:focus, .swagger-ui .hover-bg-dark-gray:hover { background-color: #333; } 347 | 348 | .swagger-ui .bg-mid-gray, .swagger-ui .hover-bg-mid-gray:focus, .swagger-ui .hover-bg-mid-gray:hover { background-color: #545454; } 349 | 350 | .swagger-ui .bg-gray, .swagger-ui .hover-bg-gray:focus, .swagger-ui .hover-bg-gray:hover { background-color: #787878; } 351 | 352 | .swagger-ui .bg-silver, .swagger-ui .hover-bg-silver:focus, .swagger-ui .hover-bg-silver:hover { background-color: #999; } 353 | 354 | .swagger-ui .bg-white, .swagger-ui .hover-bg-white:focus, .swagger-ui .hover-bg-white:hover { background-color: #1c1c21; } 355 | 356 | .swagger-ui .bg-transparent, .swagger-ui .hover-bg-transparent:focus, .swagger-ui .hover-bg-transparent:hover { background-color: transparent; } 357 | 358 | .swagger-ui .bg-dark-red, .swagger-ui .hover-bg-dark-red:focus, .swagger-ui .hover-bg-dark-red:hover { background-color: #bc2f36; } 359 | 360 | .swagger-ui .bg-red, .swagger-ui .hover-bg-red:focus, .swagger-ui .hover-bg-red:hover { background-color: #c83932; } 361 | 362 | .swagger-ui .bg-light-red, .swagger-ui .hover-bg-light-red:focus, .swagger-ui .hover-bg-light-red:hover { background-color: #ab3c2b; } 363 | 364 | .swagger-ui .bg-orange, .swagger-ui .hover-bg-orange:focus, .swagger-ui .hover-bg-orange:hover { background-color: #cc6e33; } 365 | 366 | .swagger-ui .bg-gold, .swagger-ui .bg-light-yellow, .swagger-ui .bg-washed-yellow, .swagger-ui .bg-yellow, .swagger-ui .hover-bg-gold:focus, .swagger-ui .hover-bg-gold:hover, .swagger-ui .hover-bg-light-yellow:focus, .swagger-ui .hover-bg-light-yellow:hover, .swagger-ui .hover-bg-washed-yellow:focus, .swagger-ui .hover-bg-washed-yellow:hover, .swagger-ui .hover-bg-yellow:focus, .swagger-ui .hover-bg-yellow:hover { background-color: #664b00; } 367 | 368 | .swagger-ui .bg-purple, .swagger-ui .hover-bg-purple:focus, .swagger-ui .hover-bg-purple:hover { background-color: #5e2ca5; } 369 | 370 | .swagger-ui .bg-light-purple, .swagger-ui .hover-bg-light-purple:focus, .swagger-ui .hover-bg-light-purple:hover { background-color: #672caf; } 371 | 372 | .swagger-ui .bg-dark-pink, .swagger-ui .hover-bg-dark-pink:focus, .swagger-ui .hover-bg-dark-pink:hover { background-color: #ab2b81; } 373 | 374 | .swagger-ui .bg-hot-pink, .swagger-ui .hover-bg-hot-pink:focus, .swagger-ui .hover-bg-hot-pink:hover { background-color: #c03086; } 375 | 376 | .swagger-ui .bg-pink, .swagger-ui .hover-bg-pink:focus, .swagger-ui .hover-bg-pink:hover { background-color: #8f2464; } 377 | 378 | .swagger-ui .bg-light-pink, .swagger-ui .hover-bg-light-pink:focus, .swagger-ui .hover-bg-light-pink:hover { background-color: #721d4d; } 379 | 380 | .swagger-ui .bg-dark-green, .swagger-ui .hover-bg-dark-green:focus, .swagger-ui .hover-bg-dark-green:hover { background-color: #1c6e50; } 381 | 382 | .swagger-ui .bg-green, .swagger-ui .hover-bg-green:focus, .swagger-ui .hover-bg-green:hover { background-color: #279b70; } 383 | 384 | .swagger-ui .bg-light-green, .swagger-ui .hover-bg-light-green:focus, .swagger-ui .hover-bg-light-green:hover { background-color: #228762; } 385 | 386 | .swagger-ui .bg-navy, .swagger-ui .hover-bg-navy:focus, .swagger-ui .hover-bg-navy:hover { background-color: #0d1d35; } 387 | 388 | .swagger-ui .bg-dark-blue, .swagger-ui .hover-bg-dark-blue:focus, .swagger-ui .hover-bg-dark-blue:hover { background-color: #20497e; } 389 | 390 | .swagger-ui .bg-blue, .swagger-ui .hover-bg-blue:focus, .swagger-ui .hover-bg-blue:hover { background-color: #4380d0; } 391 | 392 | .swagger-ui .bg-light-blue, .swagger-ui .hover-bg-light-blue:focus, .swagger-ui .hover-bg-light-blue:hover { background-color: #20517e; } 393 | 394 | .swagger-ui .bg-lightest-blue, .swagger-ui .hover-bg-lightest-blue:focus, .swagger-ui .hover-bg-lightest-blue:hover { background-color: #143a52; } 395 | 396 | .swagger-ui .bg-washed-blue, .swagger-ui .hover-bg-washed-blue:focus, .swagger-ui .hover-bg-washed-blue:hover { background-color: #0c312d; } 397 | 398 | .swagger-ui .bg-washed-green, .swagger-ui .hover-bg-washed-green:focus, .swagger-ui .hover-bg-washed-green:hover { background-color: #0f3d2c; } 399 | 400 | .swagger-ui .bg-washed-red, .swagger-ui .hover-bg-washed-red:focus, .swagger-ui .hover-bg-washed-red:hover { background-color: #411010; } 401 | 402 | .swagger-ui .bg-inherit, .swagger-ui .hover-bg-inherit:focus, .swagger-ui .hover-bg-inherit:hover { background-color: inherit; } 403 | 404 | .swagger-ui .shadow-hover { transition: all .5s cubic-bezier(.165, .84, .44, 1) 0s; } 405 | 406 | .swagger-ui .shadow-hover::after { 407 | border-radius: inherit; 408 | box-shadow: rgba(0, 0, 0, .2) 0 0 16px 2px; 409 | content: ""; 410 | height: 100%; 411 | left: 0; 412 | opacity: 0; 413 | position: absolute; 414 | top: 0; 415 | transition: opacity .5s cubic-bezier(.165, .84, .44, 1) 0s; 416 | width: 100%; 417 | z-index: -1; 418 | } 419 | 420 | .swagger-ui .bg-animate, .swagger-ui .bg-animate:focus, .swagger-ui .bg-animate:hover { transition: background-color .15s ease-in-out 0s; } 421 | 422 | .swagger-ui .nested-links a { 423 | color: #99bae6; 424 | transition: color .15s ease-in 0s; 425 | } 426 | 427 | .swagger-ui .nested-links a:focus, .swagger-ui .nested-links a:hover { 428 | color: #a9cbea; 429 | transition: color .15s ease-in 0s; 430 | } 431 | 432 | .swagger-ui .opblock-tag { 433 | border-bottom: 1px solid rgba(58, 64, 80, .3); 434 | color: #b5bac9; 435 | transition: all .2s ease 0s; 436 | } 437 | 438 | .swagger-ui .opblock-tag svg, .swagger-ui section.models h4 svg { transition: all .4s ease 0s; } 439 | 440 | .swagger-ui .opblock { 441 | border: 1px solid #000; 442 | border-radius: 4px; 443 | box-shadow: rgba(0, 0, 0, .19) 0 0 3px; 444 | margin: 0 0 15px; 445 | } 446 | 447 | .swagger-ui .opblock .tab-header .tab-item.active h4 span::after { background: gray; } 448 | 449 | .swagger-ui .opblock.is-open .opblock-summary { border-bottom: 1px solid #000; } 450 | 451 | .swagger-ui .opblock .opblock-section-header { 452 | background: rgba(28, 28, 33, .8); 453 | box-shadow: rgba(0, 0, 0, .1) 0 1px 2px; 454 | } 455 | 456 | .swagger-ui .opblock .opblock-section-header > label > span { padding: 0 10px 0 0; } 457 | 458 | .swagger-ui .opblock .opblock-summary-method { 459 | background: #000; 460 | color: #fff; 461 | text-shadow: rgba(0, 0, 0, .1) 0 1px 0; 462 | } 463 | 464 | .swagger-ui .opblock.opblock-post { 465 | background: rgba(72, 203, 144, .1); 466 | border-color: #48cb90; 467 | } 468 | 469 | .swagger-ui .opblock.opblock-post .opblock-summary-method, .swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span::after { background: #48cb90; } 470 | 471 | .swagger-ui .opblock.opblock-post .opblock-summary { border-color: #48cb90; } 472 | 473 | .swagger-ui .opblock.opblock-put { 474 | background: rgba(213, 157, 88, .1); 475 | border-color: #d59d58; 476 | } 477 | 478 | .swagger-ui .opblock.opblock-put .opblock-summary-method, .swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span::after { background: #d59d58; } 479 | 480 | .swagger-ui .opblock.opblock-put .opblock-summary { border-color: #d59d58; } 481 | 482 | .swagger-ui .opblock.opblock-delete { 483 | background: rgba(200, 50, 50, .1); 484 | border-color: #c83232; 485 | } 486 | 487 | .swagger-ui .opblock.opblock-delete .opblock-summary-method, .swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span::after { background: #c83232; } 488 | 489 | .swagger-ui .opblock.opblock-delete .opblock-summary { border-color: #c83232; } 490 | 491 | .swagger-ui .opblock.opblock-get { 492 | background: rgba(42, 105, 167, .1); 493 | border-color: #2a69a7; 494 | } 495 | 496 | .swagger-ui .opblock.opblock-get .opblock-summary-method, .swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span::after { background: #2a69a7; } 497 | 498 | .swagger-ui .opblock.opblock-get .opblock-summary { border-color: #2a69a7; } 499 | 500 | .swagger-ui .opblock.opblock-patch { 501 | background: rgba(92, 214, 188, .1); 502 | border-color: #5cd6bc; 503 | } 504 | 505 | .swagger-ui .opblock.opblock-patch .opblock-summary-method, .swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span::after { background: #5cd6bc; } 506 | 507 | .swagger-ui .opblock.opblock-patch .opblock-summary { border-color: #5cd6bc; } 508 | 509 | .swagger-ui .opblock.opblock-head { 510 | background: rgba(140, 63, 207, .1); 511 | border-color: #8c3fcf; 512 | } 513 | 514 | .swagger-ui .opblock.opblock-head .opblock-summary-method, .swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span::after { background: #8c3fcf; } 515 | 516 | .swagger-ui .opblock.opblock-head .opblock-summary { border-color: #8c3fcf; } 517 | 518 | .swagger-ui .opblock.opblock-options { 519 | background: rgba(36, 89, 143, .1); 520 | border-color: #24598f; 521 | } 522 | 523 | .swagger-ui .opblock.opblock-options .opblock-summary-method, .swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span::after { background: #24598f; } 524 | 525 | .swagger-ui .opblock.opblock-options .opblock-summary { border-color: #24598f; } 526 | 527 | .swagger-ui .opblock.opblock-deprecated { 528 | background: rgba(46, 46, 46, .1); 529 | border-color: #2e2e2e; 530 | opacity: .6; 531 | } 532 | 533 | .swagger-ui .opblock.opblock-deprecated .opblock-summary-method, .swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span::after { background: #2e2e2e; } 534 | 535 | .swagger-ui .opblock.opblock-deprecated .opblock-summary { border-color: #2e2e2e; } 536 | 537 | .swagger-ui .filter .operation-filter-input { border: 2px solid #2b3446; } 538 | 539 | .swagger-ui .tab li:first-of-type::after { background: rgba(0, 0, 0, .2); } 540 | 541 | .swagger-ui .download-contents { 542 | background: #7c8192; 543 | color: #fff; 544 | } 545 | 546 | .swagger-ui .scheme-container { 547 | background: #1c1c21; 548 | box-shadow: rgba(0, 0, 0, .15) 0 1px 2px 0; 549 | } 550 | 551 | .swagger-ui .loading-container .loading::before { 552 | animation: 1s linear 0s infinite normal none running rotation, .5s ease 0s 1 normal none running opacity; 553 | border-color: rgba(0, 0, 0, .6) rgba(84, 84, 84, .1) rgba(84, 84, 84, .1); 554 | } 555 | 556 | .swagger-ui .response-control-media-type--accept-controller select { border-color: #196619; } 557 | 558 | .swagger-ui .response-control-media-type__accept-message { color: #99e699; } 559 | 560 | .swagger-ui .version-pragma__message code { background-color: #3b3b3b; } 561 | 562 | .swagger-ui .btn { 563 | background: 0 0; 564 | border: 2px solid gray; 565 | box-shadow: rgba(0, 0, 0, .1) 0 1px 2px; 566 | color: #b5bac9; 567 | } 568 | 569 | .swagger-ui .btn:hover { box-shadow: rgba(0, 0, 0, .3) 0 0 5px; } 570 | 571 | .swagger-ui .btn.authorize, .swagger-ui .btn.cancel { 572 | background-color: transparent; 573 | border-color: #a72a2a; 574 | color: #e69999; 575 | } 576 | 577 | .swagger-ui .btn.authorize { 578 | border-color: #48cb90; 579 | color: #9ce3c3; 580 | } 581 | 582 | .swagger-ui .btn.authorize svg { fill: #9ce3c3; } 583 | 584 | .swagger-ui .btn.execute { 585 | background-color: #5892d5; 586 | border-color: #5892d5; 587 | color: #fff; 588 | } 589 | 590 | .swagger-ui .copy-to-clipboard { background: #7c8192; } 591 | 592 | .swagger-ui .copy-to-clipboard button { background: url("data:image/svg+xml;charset=utf-8,") 50% center no-repeat; } 593 | 594 | .swagger-ui select { 595 | background: url("data:image/svg+xml;charset=utf-8,") right 10px center/20px no-repeat #212121; 596 | background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQuc3ZnIgogICBpZD0ic3ZnNCIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTEwIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOCIgLz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6Y3k9IjEwIgogICAgIGlua3NjYXBlOmN4PSIxMCIKICAgICBpbmtzY2FwZTp6b29tPSI0MS41IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEzLjQxOCA3Ljg1OWEuNjk1LjY5NSAwIDAxLjk3OCAwIC42OC42OCAwIDAxMCAuOTY5bC0zLjkwOCAzLjgzYS42OTcuNjk3IDAgMDEtLjk3OSAwbC0zLjkwOC0zLjgzYS42OC42OCAwIDAxMC0uOTY5LjY5NS42OTUgMCAwMS45NzggMEwxMCAxMWwzLjQxOC0zLjE0MXoiIC8+Cjwvc3ZnPgo=) right 10px center/20px no-repeat #1c1c21; 597 | border: 2px solid #41444e; 598 | } 599 | 600 | .swagger-ui select[multiple] { background: #212121; } 601 | 602 | .swagger-ui button.invalid, .swagger-ui input[type=email].invalid, .swagger-ui input[type=file].invalid, .swagger-ui input[type=password].invalid, .swagger-ui input[type=search].invalid, .swagger-ui input[type=text].invalid, .swagger-ui select.invalid, .swagger-ui textarea.invalid { 603 | background: #390e0e; 604 | border-color: #c83232; 605 | } 606 | 607 | .swagger-ui input[type=email], .swagger-ui input[type=file], .swagger-ui input[type=password], .swagger-ui input[type=search], .swagger-ui input[type=text], .swagger-ui textarea { 608 | background: #1c1c21; 609 | border: 1px solid #404040; 610 | } 611 | 612 | .swagger-ui textarea { 613 | background: rgba(28, 28, 33, .8); 614 | color: #b5bac9; 615 | } 616 | 617 | .swagger-ui input[disabled], .swagger-ui select[disabled] { 618 | background-color: #1f1f1f; 619 | color: #bfbfbf; 620 | } 621 | 622 | .swagger-ui textarea[disabled] { 623 | background-color: #41444e; 624 | color: #fff; 625 | } 626 | 627 | .swagger-ui select[disabled] { border-color: #878787; } 628 | 629 | .swagger-ui textarea:focus { border: 2px solid #2a69a7; } 630 | 631 | .swagger-ui .checkbox input[type=checkbox] + label > .item { 632 | background: #303030; 633 | box-shadow: #303030 0 0 0 2px; 634 | } 635 | 636 | .swagger-ui .checkbox input[type=checkbox]:checked + label > .item { background: url("data:image/svg+xml;charset=utf-8,") 50% center no-repeat #303030; } 637 | 638 | .swagger-ui .dialog-ux .backdrop-ux { background: rgba(0, 0, 0, .8); } 639 | 640 | .swagger-ui .dialog-ux .modal-ux { 641 | background: #1c1c21; 642 | border: 1px solid #2e2e2e; 643 | box-shadow: rgba(0, 0, 0, .2) 0 10px 30px 0; 644 | } 645 | 646 | .swagger-ui .dialog-ux .modal-ux-header .close-modal { background: 0 0; } 647 | 648 | .swagger-ui .model .deprecated span, .swagger-ui .model .deprecated td { color: #bfbfbf !important; } 649 | 650 | .swagger-ui .model-toggle::after { background: url("data:image/svg+xml;charset=utf-8,") 50% center/100% no-repeat; } 651 | 652 | .swagger-ui .model-hint { 653 | background: rgba(0, 0, 0, .7); 654 | color: #ebebeb; 655 | } 656 | 657 | .swagger-ui section.models { border: 1px solid rgba(58, 64, 80, .3); } 658 | 659 | .swagger-ui section.models.is-open h4 { border-bottom: 1px solid rgba(58, 64, 80, .3); } 660 | 661 | .swagger-ui section.models .model-container { background: rgba(0, 0, 0, .05); } 662 | 663 | .swagger-ui section.models .model-container:hover { background: rgba(0, 0, 0, .07); } 664 | 665 | .swagger-ui .model-box { background: rgba(0, 0, 0, .1); } 666 | 667 | .swagger-ui .prop-type { color: #aaaad4; } 668 | 669 | .swagger-ui table thead tr td, .swagger-ui table thead tr th { 670 | border-bottom: 1px solid rgba(58, 64, 80, .2); 671 | color: #b5bac9; 672 | } 673 | 674 | .swagger-ui .parameter__name.required::after { color: rgba(230, 153, 153, .6); } 675 | 676 | .swagger-ui .topbar .download-url-wrapper .select-label { color: #f0f0f0; } 677 | 678 | .swagger-ui .topbar .download-url-wrapper .download-url-button { 679 | background: #63a040; 680 | color: #fff; 681 | } 682 | 683 | .swagger-ui .info .title small { background: #7c8492; } 684 | 685 | .swagger-ui .info .title small.version-stamp { background-color: #7a9b27; } 686 | 687 | .swagger-ui .auth-container .errors { 688 | background-color: #350d0d; 689 | color: #b5bac9; 690 | } 691 | 692 | .swagger-ui .errors-wrapper { 693 | background: rgba(200, 50, 50, .1); 694 | border: 2px solid #c83232; 695 | } 696 | 697 | .swagger-ui .markdown code, .swagger-ui .renderedmarkdown code { 698 | background: rgba(0, 0, 0, .05); 699 | color: #c299e6; 700 | } 701 | 702 | .swagger-ui .model-toggle:after { background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQyLnN2ZyIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgaGVpZ2h0PSIyNCIKICAgd2lkdGg9IjI0Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczgiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii05IgogICAgIGlua3NjYXBlOmN5PSIxMiIKICAgICBpbmtzY2FwZTpjeD0iMTIiCiAgICAgaW5rc2NhcGU6em9vbT0iMzQuNTgzMzMzIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz4KPC9zdmc+Cg==) 50% no-repeat; } 703 | 704 | .swagger-ui .expand-operation svg, .swagger-ui section.models h4 svg { fill: #fff; } 705 | 706 | ::-webkit-scrollbar-track { background-color: #646464 !important; } 707 | 708 | ::-webkit-scrollbar-thumb { 709 | background-color: #242424 !important; 710 | border: 2px solid #3e4346 !important; 711 | } 712 | 713 | ::-webkit-scrollbar-button:vertical:start:decrement { 714 | background: linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), linear-gradient(230deg, #696969 40%, transparent 41%), linear-gradient(0deg, #696969 40%, transparent 31%); 715 | background-color: #b6b6b6; 716 | } 717 | 718 | ::-webkit-scrollbar-button:vertical:end:increment { 719 | background: linear-gradient(310deg, #696969 40%, transparent 41%), linear-gradient(50deg, #696969 40%, transparent 41%), linear-gradient(180deg, #696969 40%, transparent 31%); 720 | background-color: #b6b6b6; 721 | } 722 | 723 | ::-webkit-scrollbar-button:horizontal:end:increment { 724 | background: linear-gradient(210deg, #696969 40%, transparent 41%), linear-gradient(330deg, #696969 40%, transparent 41%), linear-gradient(90deg, #696969 30%, transparent 31%); 725 | background-color: #b6b6b6; 726 | } 727 | 728 | ::-webkit-scrollbar-button:horizontal:start:decrement { 729 | background: linear-gradient(30deg, #696969 40%, transparent 41%), linear-gradient(150deg, #696969 40%, transparent 41%), linear-gradient(270deg, #696969 30%, transparent 31%); 730 | background-color: #b6b6b6; 731 | } 732 | 733 | ::-webkit-scrollbar-button, ::-webkit-scrollbar-track-piece { background-color: #3e4346 !important; } 734 | 735 | .swagger-ui .black, .swagger-ui .checkbox, .swagger-ui .dark-gray, .swagger-ui .download-url-wrapper .loading, .swagger-ui .errors-wrapper .errors small, .swagger-ui .fallback, .swagger-ui .filter .loading, .swagger-ui .gray, .swagger-ui .hover-black:focus, .swagger-ui .hover-black:hover, .swagger-ui .hover-dark-gray:focus, .swagger-ui .hover-dark-gray:hover, .swagger-ui .hover-gray:focus, .swagger-ui .hover-gray:hover, .swagger-ui .hover-light-silver:focus, .swagger-ui .hover-light-silver:hover, .swagger-ui .hover-mid-gray:focus, .swagger-ui .hover-mid-gray:hover, .swagger-ui .hover-near-black:focus, .swagger-ui .hover-near-black:hover, .swagger-ui .hover-silver:focus, .swagger-ui .hover-silver:hover, .swagger-ui .light-silver, .swagger-ui .markdown pre, .swagger-ui .mid-gray, .swagger-ui .model .property, .swagger-ui .model .property.primitive, .swagger-ui .model-title, .swagger-ui .near-black, .swagger-ui .parameter__extension, .swagger-ui .parameter__in, .swagger-ui .prop-format, .swagger-ui .renderedmarkdown pre, .swagger-ui .response-col_links .response-undocumented, .swagger-ui .response-col_status .response-undocumented, .swagger-ui .silver, .swagger-ui section.models h4, .swagger-ui section.models h5, .swagger-ui span.token-not-formatted, .swagger-ui span.token-string, .swagger-ui table.headers .header-example, .swagger-ui table.model tr.description, .swagger-ui table.model tr.extension { color: #bfbfbf; } 736 | 737 | .swagger-ui .hover-white:focus, .swagger-ui .hover-white:hover, .swagger-ui .info .title small pre, .swagger-ui .topbar a, .swagger-ui .white { color: #fff; } 738 | 739 | .swagger-ui .bg-black-10, .swagger-ui .hover-bg-black-10:focus, .swagger-ui .hover-bg-black-10:hover, .swagger-ui .stripe-dark:nth-child(2n + 1) { background-color: rgba(0, 0, 0, .1); } 740 | 741 | .swagger-ui .bg-white-10, .swagger-ui .hover-bg-white-10:focus, .swagger-ui .hover-bg-white-10:hover, .swagger-ui .stripe-light:nth-child(2n + 1) { background-color: rgba(28, 28, 33, .1); } 742 | 743 | .swagger-ui .bg-light-silver, .swagger-ui .hover-bg-light-silver:focus, .swagger-ui .hover-bg-light-silver:hover, .swagger-ui .striped--light-silver:nth-child(2n + 1) { background-color: #6e6e6e; } 744 | 745 | .swagger-ui .bg-moon-gray, .swagger-ui .hover-bg-moon-gray:focus, .swagger-ui .hover-bg-moon-gray:hover, .swagger-ui .striped--moon-gray:nth-child(2n + 1) { background-color: #4d4d4d; } 746 | 747 | .swagger-ui .bg-light-gray, .swagger-ui .hover-bg-light-gray:focus, .swagger-ui .hover-bg-light-gray:hover, .swagger-ui .striped--light-gray:nth-child(2n + 1) { background-color: #2b2b2b; } 748 | 749 | .swagger-ui .bg-near-white, .swagger-ui .hover-bg-near-white:focus, .swagger-ui .hover-bg-near-white:hover, .swagger-ui .striped--near-white:nth-child(2n + 1) { background-color: #242424; } 750 | 751 | .swagger-ui .opblock-tag:hover, .swagger-ui section.models h4:hover { background: rgba(0, 0, 0, .02); } 752 | 753 | .swagger-ui .checkbox p, .swagger-ui .dialog-ux .modal-ux-content h4, .swagger-ui .dialog-ux .modal-ux-content p, .swagger-ui .dialog-ux .modal-ux-header h3, .swagger-ui .errors-wrapper .errors h4, .swagger-ui .errors-wrapper hgroup h4, .swagger-ui .info .base-url, .swagger-ui .info .title, .swagger-ui .info h1, .swagger-ui .info h2, .swagger-ui .info h3, .swagger-ui .info h4, .swagger-ui .info h5, .swagger-ui .info li, .swagger-ui .info p, .swagger-ui .info table, .swagger-ui .loading-container .loading::after, .swagger-ui .model, .swagger-ui .opblock .opblock-section-header h4, .swagger-ui .opblock .opblock-section-header > label, .swagger-ui .opblock .opblock-summary-description, .swagger-ui .opblock .opblock-summary-operation-id, .swagger-ui .opblock .opblock-summary-path, .swagger-ui .opblock .opblock-summary-path__deprecated, .swagger-ui .opblock-description-wrapper, .swagger-ui .opblock-description-wrapper h4, .swagger-ui .opblock-description-wrapper p, .swagger-ui .opblock-external-docs-wrapper, .swagger-ui .opblock-external-docs-wrapper h4, .swagger-ui .opblock-external-docs-wrapper p, .swagger-ui .opblock-tag small, .swagger-ui .opblock-title_normal, .swagger-ui .opblock-title_normal h4, .swagger-ui .opblock-title_normal p, .swagger-ui .parameter__name, .swagger-ui .parameter__type, .swagger-ui .response-col_links, .swagger-ui .response-col_status, .swagger-ui .responses-inner h4, .swagger-ui .responses-inner h5, .swagger-ui .scheme-container .schemes > label, .swagger-ui .scopes h2, .swagger-ui .servers > label, .swagger-ui .tab li, .swagger-ui label, .swagger-ui select, .swagger-ui table.headers td { color: #b5bac9; } 754 | 755 | .swagger-ui .download-url-wrapper .failed, .swagger-ui .filter .failed, .swagger-ui .model-deprecated-warning, .swagger-ui .parameter__deprecated, .swagger-ui .parameter__name.required span, .swagger-ui table.model tr.property-row .star { color: #e69999; } 756 | 757 | .swagger-ui .opblock-body pre.microlight, .swagger-ui textarea.curl { 758 | background: #41444e; 759 | border-radius: 4px; 760 | color: #fff; 761 | } 762 | 763 | .swagger-ui .expand-methods svg, .swagger-ui .expand-methods:hover svg { fill: #bfbfbf; } 764 | 765 | .swagger-ui .auth-container, .swagger-ui .dialog-ux .modal-ux-header { border-bottom: 1px solid #2e2e2e; } 766 | 767 | .swagger-ui .topbar .download-url-wrapper .select-label select, .swagger-ui .topbar .download-url-wrapper input[type=text] { border: 2px solid #63a040; } 768 | 769 | .swagger-ui .info a, .swagger-ui .info a:hover, .swagger-ui .scopes h2 a { color: #99bde6; } 770 | 771 | /* Dark Scrollbar */ 772 | ::-webkit-scrollbar { 773 | width: 14px; 774 | height: 14px; 775 | } 776 | 777 | ::-webkit-scrollbar-button { 778 | background-color: #3e4346 !important; 779 | } 780 | 781 | ::-webkit-scrollbar-track { 782 | background-color: #646464 !important; 783 | } 784 | 785 | ::-webkit-scrollbar-track-piece { 786 | background-color: #3e4346 !important; 787 | } 788 | 789 | ::-webkit-scrollbar-thumb { 790 | height: 50px; 791 | background-color: #242424 !important; 792 | border: 2px solid #3e4346 !important; 793 | } 794 | 795 | ::-webkit-scrollbar-corner {} 796 | 797 | ::-webkit-resizer {} 798 | 799 | ::-webkit-scrollbar-button:vertical:start:decrement { 800 | background: 801 | linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), 802 | linear-gradient(230deg, #696969 40%, rgba(0, 0, 0, 0) 41%), 803 | linear-gradient(0deg, #696969 40%, rgba(0, 0, 0, 0) 31%); 804 | background-color: #b6b6b6; 805 | } 806 | 807 | ::-webkit-scrollbar-button:vertical:end:increment { 808 | background: 809 | linear-gradient(310deg, #696969 40%, rgba(0, 0, 0, 0) 41%), 810 | linear-gradient(50deg, #696969 40%, rgba(0, 0, 0, 0) 41%), 811 | linear-gradient(180deg, #696969 40%, rgba(0, 0, 0, 0) 31%); 812 | background-color: #b6b6b6; 813 | } 814 | 815 | ::-webkit-scrollbar-button:horizontal:end:increment { 816 | background: 817 | linear-gradient(210deg, #696969 40%, rgba(0, 0, 0, 0) 41%), 818 | linear-gradient(330deg, #696969 40%, rgba(0, 0, 0, 0) 41%), 819 | linear-gradient(90deg, #696969 30%, rgba(0, 0, 0, 0) 31%); 820 | background-color: #b6b6b6; 821 | } 822 | 823 | ::-webkit-scrollbar-button:horizontal:start:decrement { 824 | background: 825 | linear-gradient(30deg, #696969 40%, rgba(0, 0, 0, 0) 41%), 826 | linear-gradient(150deg, #696969 40%, rgba(0, 0, 0, 0) 41%), 827 | linear-gradient(270deg, #696969 30%, rgba(0, 0, 0, 0) 31%); 828 | background-color: #b6b6b6; 829 | } 830 | -------------------------------------------------------------------------------- /api/assets/swashbuckle.css: -------------------------------------------------------------------------------- 1 | @-moz-document regexp("^\\S+/docs.*$") { 2 | body { 3 | background: #303030; 4 | } 5 | input { 6 | background: #303030; 7 | color: #eee; 8 | border: none; 9 | } 10 | .swagger-section #header { 11 | background-color: #202020; 12 | } 13 | .swagger-section #message-bar { 14 | color: #eee; 15 | } 16 | .info_title { 17 | color: #eee; 18 | } 19 | .swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover { 20 | color: #eee; 21 | } 22 | .swagger-section .swagger-ui-wrap p { 23 | color: #ccc; 24 | } 25 | .swagger-section .swagger-ui-wrap .model-signature .propType { 26 | color: #606dca; 27 | } 28 | .swagger-section .swagger-ui-wrap .model-signature .signature-nav a:hover { 29 | color: #eee; 30 | } 31 | /*POST Colors*/ 32 | 33 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading { 34 | background: #202020; 35 | border: none; 36 | } 37 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content { 38 | background: #202020; 39 | border: none; 40 | } 41 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a { 42 | background-color: rgba(84, 127, 0, 0.79); 43 | } 44 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4 { 45 | color: rgba(84, 127, 0, 0.79); 46 | } 47 | .swagger-section .swagger-ui-wrap .code, 48 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a { 49 | color: #eee; 50 | } 51 | /*PUT Colors*/ 52 | 53 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading { 54 | background: #202020; 55 | border: none; 56 | } 57 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content { 58 | background: #202020; 59 | border: none; 60 | } 61 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a { 62 | background-color: rgba(230, 156, 50, 0.75); 63 | } 64 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4 { 65 | color: rgba(230, 156, 50, 0.75); 66 | } 67 | 68 | /*PUT Colors*/ 69 | 70 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading { 71 | background: #202020; 72 | border: none; 73 | } 74 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content { 75 | background: #202020; 76 | border: none; 77 | } 78 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a { 79 | background-color: rgba(230, 156, 50, 0.75); 80 | } 81 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4 { 82 | color: rgba(230, 156, 50, 0.75); 83 | } 84 | 85 | /*PATCH Colors*/ 86 | 87 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading { 88 | background: #202020; 89 | border: none; 90 | } 91 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content { 92 | background: #202020; 93 | border: none; 94 | } 95 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a { 96 | background-color: rgba(230, 156, 50, 0.75); 97 | } 98 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4 { 99 | color: rgba(230, 156, 50, 0.75); 100 | } 101 | 102 | /*GET Colors*/ 103 | 104 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading { 105 | background: #202020; 106 | border: none; 107 | } 108 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content { 109 | background: #202020; 110 | border: none; 111 | } 112 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a { 113 | background-color: rgba(83, 102, 241, 0.45); 114 | } 115 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4 { 116 | color: rgba(83, 102, 241, 0.45); 117 | } 118 | /*DELETE Colors*/ 119 | 120 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading { 121 | background: #202020; 122 | border: none; 123 | } 124 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content { 125 | background: #202020; 126 | border: none; 127 | } 128 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a { 129 | background-color: rgba(204, 33, 33, 0.75); 130 | } 131 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4 { 132 | color: rgba(204, 33, 33, 0.75); 133 | } 134 | /*------------------------------*/ 135 | 136 | .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.http_method a { 137 | border-radius: 0; 138 | } 139 | .swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading h2 a, 140 | .swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading h2 a { 141 | color: #eee; 142 | } 143 | .swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading ul.options li a, 144 | .swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading ul.options li a { 145 | color: #eee; 146 | } 147 | .swagger-section .swagger-ui-wrap .model-signature pre:hover { 148 | background-color: #303030; 149 | } 150 | .swagger-section .swagger-ui-wrap pre { 151 | background-color: #303030; 152 | color: #eee; 153 | border: none; 154 | } 155 | .swagger-section pre code, 156 | .swagger-section pre .subst, 157 | .swagger-section pre .tag .title, 158 | .swagger-section pre .lisp .title, 159 | .swagger-section pre .clojure .built_in, 160 | .swagger-section pre .nginx .title { 161 | color: #eee; 162 | } 163 | .swagger-section pre .string, 164 | .swagger-section pre .title, 165 | .swagger-section pre .constant, 166 | .swagger-section pre .parent, 167 | .swagger-section pre .tag .value, 168 | .swagger-section pre .rules .value, 169 | .swagger-section pre .rules .value .number, 170 | .swagger-section pre .preprocessor, 171 | .swagger-section pre .ruby .symbol, 172 | .swagger-section pre .ruby .symbol .string, 173 | .swagger-section pre .aggregate, 174 | .swagger-section pre .template_tag, 175 | .swagger-section pre .django .variable, 176 | .swagger-section pre .smalltalk .class, 177 | .swagger-section pre .addition, 178 | .swagger-section pre .flow, 179 | .swagger-section pre .stream, 180 | .swagger-section pre .bash .variable, 181 | .swagger-section pre .apache .tag, 182 | .swagger-section pre .apache .cbracket, 183 | .swagger-section pre .tex .command, 184 | .swagger-section pre .tex .special, 185 | .swagger-section pre .erlang_repl .function_or_atom, 186 | .swagger-section pre .markdown .header { 187 | color: #ff5f5f; 188 | } 189 | .swagger-section .swagger-ui-wrap input.parameter { 190 | border: none; 191 | } 192 | .swagger-section .swagger-ui-wrap table tbody tr td { 193 | color: #eee; 194 | } 195 | .swagger-section .swagger-ui-wrap .model-signature .signature-nav .selected { 196 | color: #eee; 197 | } 198 | .response-content-type { 199 | color: #eee; 200 | } 201 | .swagger-section .swagger-ui-wrap .body-textarea { 202 | color: #eee; 203 | background: #303030; 204 | border: none; 205 | } 206 | select { 207 | background: #303030; 208 | border: none; 209 | color: #eee; 210 | } 211 | .swagger-section #header form#api_selector .input a#explore { 212 | border-radius: none !important; 213 | -webkit-border-radius: none !important; 214 | -moz-border-radius: none !important; 215 | padding: 4px 10px !important; 216 | } 217 | ::-webkit-scrollbar { 218 | width: 8px; 219 | } 220 | ::-webkit-scrollbar-track { 221 | background: transparent; 222 | } 223 | ::-webkit-scrollbar-thumb { 224 | background: rgba(255, 255, 255, .1); 225 | border-radius: 0px; 226 | } 227 | ::-webkit-scrollbar-thumb:hover { 228 | background: rgba(255, 255, 255, .25); 229 | } 230 | ::-webkit-scrollbar-thumb:active { 231 | background: rgba(255, 255, 255, .5); 232 | } 233 | .swagger-section .swagger-ui-wrap .model-signature .description .strong { 234 | color: #bfbfbf; 235 | } 236 | .swagger-section .swagger-ui-wrap .model-signature .propOpt { 237 | color: #ccc; 238 | } 239 | 240 | .swagger-section .snippet_json code.hljs.json { 241 | color: rgba(230, 156, 50, 0.75); 242 | } 243 | 244 | .swagger-section .snippet_json code.hljs.json .hljs-string,.hljs-number { 245 | color: #96b8d4; 246 | } 247 | 248 | .swagger-section .swagger-ui-wrap table thead tr th{ 249 | color: #aaa; 250 | } 251 | } 252 | -------------------------------------------------------------------------------- /api/assets/theme-newspaper.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | .swagger-ui html { 3 | box-sizing: border-box 4 | } 5 | 6 | .swagger-ui *, .swagger-ui :after, .swagger-ui :before { 7 | box-sizing: inherit 8 | } 9 | 10 | .swagger-ui body { 11 | margin: 0; 12 | background: #fafafa 13 | } 14 | 15 | .swagger-ui .wrapper { 16 | width: 100%; 17 | max-width: 1460px; 18 | margin: 0 auto; 19 | padding: 0 20px 20 | } 21 | 22 | .swagger-ui .opblock-tag-section { 23 | display: -webkit-box; 24 | display: -ms-flexbox; 25 | display: flex; 26 | -webkit-box-orient: vertical; 27 | -webkit-box-direction: normal; 28 | -ms-flex-direction: column; 29 | flex-direction: column 30 | } 31 | 32 | .swagger-ui .opblock-tag { 33 | display: -webkit-box; 34 | display: -ms-flexbox; 35 | display: flex; 36 | padding: 10px 20px 10px 10px; 37 | cursor: pointer; 38 | -webkit-transition: all .2s; 39 | transition: all .2s; 40 | border-bottom: 1px solid rgba(59, 65, 81, .3); 41 | -webkit-box-align: center; 42 | -ms-flex-align: center; 43 | align-items: center 44 | } 45 | 46 | .swagger-ui .opblock-tag:hover { 47 | background: rgba(0, 0, 0, .02) 48 | } 49 | 50 | .swagger-ui .opblock-tag { 51 | font-size: 24px; 52 | margin: 0 0 5px; 53 | font-family: Titillium Web, sans-serif; 54 | color: #3b4151 55 | } 56 | 57 | .swagger-ui .opblock-tag.no-desc span { 58 | -webkit-box-flex: 1; 59 | -ms-flex: 1; 60 | flex: 1 61 | } 62 | 63 | .swagger-ui .opblock-tag svg { 64 | -webkit-transition: all .4s; 65 | transition: all .4s 66 | } 67 | 68 | .swagger-ui .opblock-tag small { 69 | font-size: 14px; 70 | font-weight: 400; 71 | padding: 0 10px; 72 | -webkit-box-flex: 1; 73 | -ms-flex: 1; 74 | flex: 1; 75 | font-family: Open Sans, sans-serif; 76 | color: #3b4151 77 | } 78 | 79 | .swagger-ui .parаmeter__type { 80 | font-size: 12px; 81 | padding: 5px 0; 82 | font-family: Source Code Pro, monospace; 83 | font-weight: 600; 84 | color: #3b4151 85 | } 86 | 87 | .swagger-ui .view-line-link { 88 | position: relative; 89 | top: 3px; 90 | width: 20px; 91 | margin: 0 5px; 92 | cursor: pointer; 93 | -webkit-transition: all .5s; 94 | transition: all .5s 95 | } 96 | 97 | .swagger-ui .opblock { 98 | margin: 0 0 15px; 99 | border: 1px solid #000; 100 | border-radius: 4px; 101 | box-shadow: 0 0 3px rgba(0, 0, 0, .19) 102 | } 103 | 104 | .swagger-ui .opblock.is-open .opblock-summary { 105 | border-bottom: 1px solid #000 106 | } 107 | 108 | .swagger-ui .opblock .opblock-section-header { 109 | padding: 8px 20px; 110 | background: hsla(0, 0%, 100%, .8); 111 | box-shadow: 0 1px 2px rgba(0, 0, 0, .1) 112 | } 113 | 114 | .swagger-ui .opblock .opblock-section-header, .swagger-ui .opblock .opblock-section-header label { 115 | display: -webkit-box; 116 | display: -ms-flexbox; 117 | display: flex; 118 | -webkit-box-align: center; 119 | -ms-flex-align: center; 120 | align-items: center 121 | } 122 | 123 | .swagger-ui .opblock .opblock-section-header label { 124 | font-size: 12px; 125 | font-weight: 700; 126 | margin: 0; 127 | font-family: Titillium Web, sans-serif; 128 | color: #3b4151 129 | } 130 | 131 | .swagger-ui .opblock .opblock-section-header label span { 132 | padding: 0 10px 0 0 133 | } 134 | 135 | .swagger-ui .opblock .opblock-section-header h4 { 136 | font-size: 14px; 137 | margin: 0; 138 | -webkit-box-flex: 1; 139 | -ms-flex: 1; 140 | flex: 1; 141 | font-family: Titillium Web, sans-serif; 142 | color: #3b4151 143 | } 144 | 145 | .swagger-ui .opblock .opblock-summary-method { 146 | font-size: 14px; 147 | font-weight: 700; 148 | min-width: 80px; 149 | padding: 6px 15px; 150 | text-align: center; 151 | border-radius: 3px; 152 | background: #000; 153 | text-shadow: 0 1px 0 rgba(0, 0, 0, .1); 154 | font-family: Titillium Web, sans-serif; 155 | color: #fff 156 | } 157 | 158 | .swagger-ui .opblock .opblock-summary-path, .swagger-ui .opblock .opblock-summary-path__deprecated { 159 | font-size: 16px; 160 | display: -webkit-box; 161 | display: -ms-flexbox; 162 | display: flex; 163 | padding: 0 10px; 164 | font-family: Source Code Pro, monospace; 165 | font-weight: 600; 166 | color: #3b4151; 167 | -webkit-box-align: center; 168 | -ms-flex-align: center; 169 | align-items: center 170 | } 171 | 172 | .swagger-ui .opblock .opblock-summary-path .view-line-link, .swagger-ui .opblock .opblock-summary-path__deprecated .view-line-link { 173 | position: relative; 174 | top: 2px; 175 | width: 0; 176 | margin: 0; 177 | cursor: pointer; 178 | -webkit-transition: all .5s; 179 | transition: all .5s 180 | } 181 | 182 | .swagger-ui .opblock .opblock-summary-path:hover .view-line-link, .swagger-ui .opblock .opblock-summary-path__deprecated:hover .view-line-link { 183 | width: 18px; 184 | margin: 0 5px 185 | } 186 | 187 | .swagger-ui .opblock .opblock-summary-path__deprecated { 188 | text-decoration: line-through 189 | } 190 | 191 | .swagger-ui .opblock .opblock-summary-description { 192 | font-size: 13px; 193 | -webkit-box-flex: 1; 194 | -ms-flex: 1; 195 | flex: 1; 196 | font-family: Open Sans, sans-serif; 197 | color: #3b4151 198 | } 199 | 200 | .swagger-ui .opblock .opblock-summary { 201 | display: -webkit-box; 202 | display: -ms-flexbox; 203 | display: flex; 204 | padding: 5px; 205 | cursor: pointer; 206 | -webkit-box-align: center; 207 | -ms-flex-align: center; 208 | align-items: center 209 | } 210 | 211 | .swagger-ui .opblock.opblock-post { 212 | border-color: #49cc90; 213 | background: rgba(73, 204, 144, .1) 214 | } 215 | 216 | .swagger-ui .opblock.opblock-post .opblock-summary-method { 217 | background: #49cc90 218 | } 219 | 220 | .swagger-ui .opblock.opblock-post .opblock-summary { 221 | border-color: #49cc90 222 | } 223 | 224 | .swagger-ui .opblock.opblock-put { 225 | border-color: #fca130; 226 | background: rgba(252, 161, 48, .1) 227 | } 228 | 229 | .swagger-ui .opblock.opblock-put .opblock-summary-method { 230 | background: #fca130 231 | } 232 | 233 | .swagger-ui .opblock.opblock-put .opblock-summary { 234 | border-color: #fca130 235 | } 236 | 237 | .swagger-ui .opblock.opblock-delete { 238 | border-color: #f93e3e; 239 | background: rgba(249, 62, 62, .1) 240 | } 241 | 242 | .swagger-ui .opblock.opblock-delete .opblock-summary-method { 243 | background: #f93e3e 244 | } 245 | 246 | .swagger-ui .opblock.opblock-delete .opblock-summary { 247 | border-color: #f93e3e 248 | } 249 | 250 | .swagger-ui .opblock.opblock-get { 251 | border-color: #61affe; 252 | background: rgba(97, 175, 254, .1) 253 | } 254 | 255 | .swagger-ui .opblock.opblock-get .opblock-summary-method { 256 | background: #61affe 257 | } 258 | 259 | .swagger-ui .opblock.opblock-get .opblock-summary { 260 | border-color: #61affe 261 | } 262 | 263 | .swagger-ui .opblock.opblock-patch { 264 | border-color: #50e3c2; 265 | background: rgba(80, 227, 194, .1) 266 | } 267 | 268 | .swagger-ui .opblock.opblock-patch .opblock-summary-method { 269 | background: #50e3c2 270 | } 271 | 272 | .swagger-ui .opblock.opblock-patch .opblock-summary { 273 | border-color: #50e3c2 274 | } 275 | 276 | .swagger-ui .opblock.opblock-head { 277 | border-color: #9012fe; 278 | background: rgba(144, 18, 254, .1) 279 | } 280 | 281 | .swagger-ui .opblock.opblock-head .opblock-summary-method { 282 | background: #9012fe 283 | } 284 | 285 | .swagger-ui .opblock.opblock-head .opblock-summary { 286 | border-color: #9012fe 287 | } 288 | 289 | .swagger-ui .opblock.opblock-options { 290 | border-color: #0d5aa7; 291 | background: rgba(13, 90, 167, .1) 292 | } 293 | 294 | .swagger-ui .opblock.opblock-options .opblock-summary-method { 295 | background: #0d5aa7 296 | } 297 | 298 | .swagger-ui .opblock.opblock-options .opblock-summary { 299 | border-color: #0d5aa7 300 | } 301 | 302 | .swagger-ui .opblock.opblock-deprecated { 303 | opacity: .6; 304 | border-color: #ebebeb; 305 | background: hsla(0, 0%, 92%, .1) 306 | } 307 | 308 | .swagger-ui .opblock.opblock-deprecated .opblock-summary-method { 309 | background: #ebebeb 310 | } 311 | 312 | .swagger-ui .opblock.opblock-deprecated .opblock-summary { 313 | border-color: #ebebeb 314 | } 315 | 316 | .swagger-ui .tab { 317 | display: -webkit-box; 318 | display: -ms-flexbox; 319 | display: flex; 320 | margin: 20px 0 10px; 321 | padding: 0; 322 | list-style: none 323 | } 324 | 325 | .swagger-ui .tab li { 326 | font-size: 12px; 327 | min-width: 100px; 328 | min-width: 90px; 329 | padding: 0; 330 | cursor: pointer; 331 | font-family: Titillium Web, sans-serif; 332 | color: #3b4151 333 | } 334 | 335 | .swagger-ui .tab li:first-of-type { 336 | position: relative; 337 | padding-left: 0 338 | } 339 | 340 | .swagger-ui .tab li:first-of-type:after { 341 | position: absolute; 342 | top: 0; 343 | right: 6px; 344 | width: 1px; 345 | height: 100%; 346 | content: ""; 347 | background: rgba(0, 0, 0, .2) 348 | } 349 | 350 | .swagger-ui .tab li.active { 351 | font-weight: 700 352 | } 353 | 354 | .swagger-ui .opblock-description-wrapper, .swagger-ui .opblock-title_normal { 355 | padding: 15px 20px 356 | } 357 | 358 | .swagger-ui .opblock-description-wrapper, .swagger-ui .opblock-description-wrapper h4, .swagger-ui .opblock-title_normal, .swagger-ui .opblock-title_normal h4 { 359 | font-size: 12px; 360 | margin: 0 0 5px; 361 | font-family: Open Sans, sans-serif; 362 | color: #3b4151 363 | } 364 | 365 | .swagger-ui .opblock-description-wrapper p, .swagger-ui .opblock-title_normal p { 366 | font-size: 14px; 367 | margin: 0; 368 | font-family: Open Sans, sans-serif; 369 | color: #3b4151 370 | } 371 | 372 | .swagger-ui .execute-wrapper { 373 | padding: 20px; 374 | text-align: right 375 | } 376 | 377 | .swagger-ui .execute-wrapper .btn { 378 | width: 100%; 379 | padding: 8px 40px 380 | } 381 | 382 | .swagger-ui .body-param-options { 383 | display: -webkit-box; 384 | display: -ms-flexbox; 385 | display: flex; 386 | -webkit-box-orient: vertical; 387 | -webkit-box-direction: normal; 388 | -ms-flex-direction: column; 389 | flex-direction: column 390 | } 391 | 392 | .swagger-ui .body-param-options .body-param-edit { 393 | padding: 10px 0 394 | } 395 | 396 | .swagger-ui .body-param-options label { 397 | padding: 8px 0 398 | } 399 | 400 | .swagger-ui .body-param-options label select { 401 | margin: 3px 0 0 402 | } 403 | 404 | .swagger-ui .responses-inner { 405 | padding: 20px 406 | } 407 | 408 | .swagger-ui .responses-inner h4, .swagger-ui .responses-inner h5 { 409 | font-size: 12px; 410 | margin: 10px 0 5px; 411 | font-family: Open Sans, sans-serif; 412 | color: #3b4151 413 | } 414 | 415 | .swagger-ui .response-col_status { 416 | font-size: 14px; 417 | font-family: Open Sans, sans-serif; 418 | color: #3b4151 419 | } 420 | 421 | .swagger-ui .response-col_status .response-undocumented { 422 | font-size: 11px; 423 | font-family: Source Code Pro, monospace; 424 | font-weight: 600; 425 | color: #999 426 | } 427 | 428 | .swagger-ui .response-col_description__inner span { 429 | font-size: 12px; 430 | font-style: italic; 431 | display: block; 432 | margin: 10px 0; 433 | padding: 10px; 434 | border-radius: 4px; 435 | background: #41444e; 436 | font-family: Source Code Pro, monospace; 437 | font-weight: 600; 438 | color: #fff 439 | } 440 | 441 | .swagger-ui .response-col_description__inner span p { 442 | margin: 0 443 | } 444 | 445 | .swagger-ui .opblock-body pre { 446 | font-size: 12px; 447 | margin: 0; 448 | padding: 10px; 449 | white-space: pre-wrap; 450 | border-radius: 4px; 451 | background: #41444e; 452 | font-family: Source Code Pro, monospace; 453 | font-weight: 600; 454 | color: #fff 455 | } 456 | 457 | .swagger-ui .opblock-body pre span { 458 | color: #fff!important 459 | } 460 | 461 | .swagger-ui .scheme-container { 462 | margin: 0 0 20px; 463 | padding: 30px 0; 464 | background: #fff; 465 | box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .15) 466 | } 467 | 468 | .swagger-ui .scheme-container .schemes { 469 | display: -webkit-box; 470 | display: -ms-flexbox; 471 | display: flex; 472 | -webkit-box-align: center; 473 | -ms-flex-align: center; 474 | align-items: center 475 | } 476 | 477 | .swagger-ui .scheme-container .schemes>label { 478 | font-size: 12px; 479 | font-weight: 700; 480 | display: -webkit-box; 481 | display: -ms-flexbox; 482 | display: flex; 483 | -webkit-box-orient: vertical; 484 | -webkit-box-direction: normal; 485 | -ms-flex-direction: column; 486 | flex-direction: column; 487 | margin: -20px 15px 0 0; 488 | font-family: Titillium Web, sans-serif; 489 | color: #3b4151 490 | } 491 | 492 | .swagger-ui .scheme-container .schemes>label select { 493 | min-width: 130px; 494 | text-transform: uppercase 495 | } 496 | 497 | .swagger-ui .loading-container { 498 | padding: 40px 0 60px 499 | } 500 | 501 | .swagger-ui .loading-container .loading { 502 | position: relative 503 | } 504 | 505 | .swagger-ui .loading-container .loading:after { 506 | font-size: 10px; 507 | font-weight: 700; 508 | position: absolute; 509 | top: 50%; 510 | left: 50%; 511 | content: "loading"; 512 | -webkit-transform: translate(-50%, -50%); 513 | transform: translate(-50%, -50%); 514 | text-transform: uppercase; 515 | font-family: Titillium Web, sans-serif; 516 | color: #3b4151 517 | } 518 | 519 | .swagger-ui .loading-container .loading:before { 520 | position: absolute; 521 | top: 50%; 522 | left: 50%; 523 | display: block; 524 | width: 60px; 525 | height: 60px; 526 | margin: -30px; 527 | content: ""; 528 | -webkit-animation: rotation 1s infinite linear, opacity .5s; 529 | animation: rotation 1s infinite linear, opacity .5s; 530 | opacity: 1; 531 | border: 2px solid rgba(85, 85, 85, .1); 532 | border-top-color: rgba(0, 0, 0, .6); 533 | border-radius: 100%; 534 | -webkit-backface-visibility: hidden; 535 | backface-visibility: hidden 536 | } 537 | 538 | @-webkit-keyframes rotation { 539 | to { 540 | -webkit-transform: rotate(1turn); 541 | transform: rotate(1turn) 542 | } 543 | } 544 | 545 | @keyframes rotation { 546 | to { 547 | -webkit-transform: rotate(1turn); 548 | transform: rotate(1turn) 549 | } 550 | } 551 | 552 | @-webkit-keyframes blinker { 553 | 50% { 554 | opacity: 0 555 | } 556 | } 557 | 558 | @keyframes blinker { 559 | 50% { 560 | opacity: 0 561 | } 562 | } 563 | 564 | .swagger-ui .btn { 565 | font-size: 14px; 566 | font-weight: 700; 567 | padding: 5px 23px; 568 | -webkit-transition: all .3s; 569 | transition: all .3s; 570 | border: 2px solid #888; 571 | border-radius: 4px; 572 | background: transparent; 573 | box-shadow: 0 1px 2px rgba(0, 0, 0, .1); 574 | font-family: Titillium Web, sans-serif; 575 | color: #3b4151 576 | } 577 | 578 | .swagger-ui .btn[disabled] { 579 | cursor: not-allowed; 580 | opacity: .3 581 | } 582 | 583 | .swagger-ui .btn:hover { 584 | box-shadow: 0 0 5px rgba(0, 0, 0, .3) 585 | } 586 | 587 | .swagger-ui .btn.cancel { 588 | border-color: #ff6060; 589 | font-family: Titillium Web, sans-serif; 590 | color: #ff6060 591 | } 592 | 593 | .swagger-ui .btn.authorize { 594 | line-height: 1; 595 | display: inline; 596 | color: #49cc90; 597 | border-color: #49cc90 598 | } 599 | 600 | .swagger-ui .btn.authorize span { 601 | float: left; 602 | padding: 4px 20px 0 0 603 | } 604 | 605 | .swagger-ui .btn.authorize svg { 606 | fill: #49cc90 607 | } 608 | 609 | .swagger-ui .btn.execute { 610 | -webkit-animation: pulse 2s infinite; 611 | animation: pulse 2s infinite; 612 | color: #fff; 613 | border-color: #4990e2 614 | } 615 | 616 | @-webkit-keyframes pulse { 617 | 0% { 618 | color: #fff; 619 | background: #4990e2; 620 | box-shadow: 0 0 0 0 rgba(73, 144, 226, .8) 621 | } 622 | 70% { 623 | box-shadow: 0 0 0 5px rgba(73, 144, 226, 0) 624 | } 625 | to { 626 | color: #fff; 627 | background: #4990e2; 628 | box-shadow: 0 0 0 0 rgba(73, 144, 226, 0) 629 | } 630 | } 631 | 632 | @keyframes pulse { 633 | 0% { 634 | color: #fff; 635 | background: #4990e2; 636 | box-shadow: 0 0 0 0 rgba(73, 144, 226, .8) 637 | } 638 | 70% { 639 | box-shadow: 0 0 0 5px rgba(73, 144, 226, 0) 640 | } 641 | to { 642 | color: #fff; 643 | background: #4990e2; 644 | box-shadow: 0 0 0 0 rgba(73, 144, 226, 0) 645 | } 646 | } 647 | 648 | .swagger-ui .btn-group { 649 | display: -webkit-box; 650 | display: -ms-flexbox; 651 | display: flex; 652 | padding: 30px 653 | } 654 | 655 | .swagger-ui .btn-group .btn { 656 | -webkit-box-flex: 1; 657 | -ms-flex: 1; 658 | flex: 1 659 | } 660 | 661 | .swagger-ui .btn-group .btn:first-child { 662 | border-radius: 4px 0 0 4px 663 | } 664 | 665 | .swagger-ui .btn-group .btn:last-child { 666 | border-radius: 0 4px 4px 0 667 | } 668 | 669 | .swagger-ui .authorization__btn { 670 | padding: 0 10px; 671 | border: none; 672 | background: none 673 | } 674 | 675 | .swagger-ui .authorization__btn.locked { 676 | opacity: 1 677 | } 678 | 679 | .swagger-ui .authorization__btn.unlocked { 680 | opacity: .4 681 | } 682 | 683 | .swagger-ui .expand-methods, .swagger-ui .expand-operation { 684 | border: none; 685 | background: none 686 | } 687 | 688 | .swagger-ui .expand-methods svg, .swagger-ui .expand-operation svg { 689 | width: 20px; 690 | height: 20px 691 | } 692 | 693 | .swagger-ui .expand-methods { 694 | padding: 0 10px 695 | } 696 | 697 | .swagger-ui .expand-methods:hover svg { 698 | fill: #444 699 | } 700 | 701 | .swagger-ui .expand-methods svg { 702 | -webkit-transition: all .3s; 703 | transition: all .3s; 704 | fill: #777 705 | } 706 | 707 | .swagger-ui button { 708 | cursor: pointer; 709 | outline: none 710 | } 711 | 712 | .swagger-ui select { 713 | font-size: 14px; 714 | font-weight: 700; 715 | padding: 5px 40px 5px 10px; 716 | border: 2px solid #41444e; 717 | border-radius: 4px; 718 | background: #f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+ICAgIDxwYXRoIGQ9Ik0xMy40MTggNy44NTljLjI3MS0uMjY4LjcwOS0uMjY4Ljk3OCAwIC4yNy4yNjguMjcyLjcwMSAwIC45NjlsLTMuOTA4IDMuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC0zLjkwOC0zLjgzYy0uMjctLjI2Ny0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc4IDBMMTAgMTFsMy40MTgtMy4xNDF6Ii8+PC9zdmc+) right 10px center no-repeat; 719 | background-size: 20px; 720 | box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .25); 721 | font-family: Titillium Web, sans-serif; 722 | color: #3b4151; 723 | -webkit-appearance: none; 724 | -moz-appearance: none; 725 | appearance: none 726 | } 727 | 728 | .swagger-ui select[multiple] { 729 | margin: 5px 0; 730 | padding: 5px; 731 | background: #f7f7f7 732 | } 733 | 734 | .swagger-ui .opblock-body select { 735 | min-width: 230px 736 | } 737 | 738 | .swagger-ui label { 739 | font-size: 12px; 740 | font-weight: 700; 741 | margin: 0 0 5px; 742 | font-family: Titillium Web, sans-serif; 743 | color: #3b4151 744 | } 745 | 746 | .swagger-ui input[type=email], .swagger-ui input[type=password], .swagger-ui input[type=search], .swagger-ui input[type=text] { 747 | min-width: 100px; 748 | margin: 5px 0; 749 | padding: 8px 10px; 750 | border: 1px solid #d9d9d9; 751 | border-radius: 4px; 752 | background: #fff 753 | } 754 | 755 | .swagger-ui input[type=email].invalid, .swagger-ui input[type=password].invalid, .swagger-ui input[type=search].invalid, .swagger-ui input[type=text].invalid { 756 | -webkit-animation: shake .4s 1; 757 | animation: shake .4s 1; 758 | border-color: #f93e3e; 759 | background: #feebeb 760 | } 761 | 762 | @-webkit-keyframes shake { 763 | 10%, 90% { 764 | -webkit-transform: translate3d(-1px, 0, 0); 765 | transform: translate3d(-1px, 0, 0) 766 | } 767 | 20%, 80% { 768 | -webkit-transform: translate3d(2px, 0, 0); 769 | transform: translate3d(2px, 0, 0) 770 | } 771 | 30%, 50%, 70% { 772 | -webkit-transform: translate3d(-4px, 0, 0); 773 | transform: translate3d(-4px, 0, 0) 774 | } 775 | 40%, 60% { 776 | -webkit-transform: translate3d(4px, 0, 0); 777 | transform: translate3d(4px, 0, 0) 778 | } 779 | } 780 | 781 | @keyframes shake { 782 | 10%, 90% { 783 | -webkit-transform: translate3d(-1px, 0, 0); 784 | transform: translate3d(-1px, 0, 0) 785 | } 786 | 20%, 80% { 787 | -webkit-transform: translate3d(2px, 0, 0); 788 | transform: translate3d(2px, 0, 0) 789 | } 790 | 30%, 50%, 70% { 791 | -webkit-transform: translate3d(-4px, 0, 0); 792 | transform: translate3d(-4px, 0, 0) 793 | } 794 | 40%, 60% { 795 | -webkit-transform: translate3d(4px, 0, 0); 796 | transform: translate3d(4px, 0, 0) 797 | } 798 | } 799 | 800 | .swagger-ui textarea { 801 | font-size: 12px; 802 | width: 100%; 803 | min-height: 280px; 804 | padding: 10px; 805 | border: none; 806 | border-radius: 4px; 807 | outline: none; 808 | background: hsla(0, 0%, 100%, .8); 809 | font-family: Source Code Pro, monospace; 810 | font-weight: 600; 811 | color: #3b4151 812 | } 813 | 814 | .swagger-ui textarea:focus { 815 | border: 2px solid #61affe 816 | } 817 | 818 | .swagger-ui textarea.curl { 819 | font-size: 12px; 820 | min-height: 100px; 821 | margin: 0; 822 | padding: 10px; 823 | resize: none; 824 | border-radius: 4px; 825 | background: #41444e; 826 | font-family: Source Code Pro, monospace; 827 | font-weight: 600; 828 | color: #fff 829 | } 830 | 831 | .swagger-ui .checkbox { 832 | padding: 5px 0 10px; 833 | -webkit-transition: opacity .5s; 834 | transition: opacity .5s; 835 | color: #333 836 | } 837 | 838 | .swagger-ui .checkbox label { 839 | display: -webkit-box; 840 | display: -ms-flexbox; 841 | display: flex 842 | } 843 | 844 | .swagger-ui .checkbox p { 845 | font-weight: 400!important; 846 | font-style: italic; 847 | margin: 0!important; 848 | font-family: Source Code Pro, monospace; 849 | font-weight: 600; 850 | color: #3b4151 851 | } 852 | 853 | .swagger-ui .checkbox input[type=checkbox] { 854 | display: none 855 | } 856 | 857 | .swagger-ui .checkbox input[type=checkbox]+label>.item { 858 | position: relative; 859 | top: 3px; 860 | display: inline-block; 861 | width: 16px; 862 | height: 16px; 863 | margin: 0 8px 0 0; 864 | padding: 5px; 865 | cursor: pointer; 866 | border-radius: 1px; 867 | background: #e8e8e8; 868 | box-shadow: 0 0 0 2px #e8e8e8; 869 | -webkit-box-flex: 0; 870 | -ms-flex: none; 871 | flex: none 872 | } 873 | 874 | .swagger-ui .checkbox input[type=checkbox]+label>.item:active { 875 | -webkit-transform: scale(.9); 876 | transform: scale(.9) 877 | } 878 | 879 | .swagger-ui .checkbox input[type=checkbox]:checked+label>.item { 880 | background: #e8e8e8 url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E") 50% no-repeat 881 | } 882 | 883 | .swagger-ui .dialog-ux { 884 | position: fixed; 885 | z-index: 9999; 886 | top: 0; 887 | right: 0; 888 | bottom: 0; 889 | left: 0 890 | } 891 | 892 | .swagger-ui .dialog-ux .backdrop-ux { 893 | position: fixed; 894 | top: 0; 895 | right: 0; 896 | bottom: 0; 897 | left: 0; 898 | background: rgba(0, 0, 0, .8) 899 | } 900 | 901 | .swagger-ui .dialog-ux .modal-ux { 902 | position: absolute; 903 | z-index: 9999; 904 | top: 50%; 905 | left: 50%; 906 | width: 100%; 907 | min-width: 300px; 908 | max-width: 650px; 909 | -webkit-transform: translate(-50%, -50%); 910 | transform: translate(-50%, -50%); 911 | border: 1px solid #ebebeb; 912 | border-radius: 4px; 913 | background: #fff; 914 | box-shadow: 0 10px 30px 0 rgba(0, 0, 0, .2) 915 | } 916 | 917 | .swagger-ui .dialog-ux .modal-ux-content { 918 | overflow-y: auto; 919 | max-height: 540px; 920 | padding: 20px 921 | } 922 | 923 | .swagger-ui .dialog-ux .modal-ux-content p { 924 | font-size: 12px; 925 | margin: 0 0 5px; 926 | color: #41444e; 927 | font-family: Open Sans, sans-serif; 928 | color: #3b4151 929 | } 930 | 931 | .swagger-ui .dialog-ux .modal-ux-content h4 { 932 | font-size: 18px; 933 | font-weight: 600; 934 | margin: 15px 0 0; 935 | font-family: Titillium Web, sans-serif; 936 | color: #3b4151 937 | } 938 | 939 | .swagger-ui .dialog-ux .modal-ux-header { 940 | display: -webkit-box; 941 | display: -ms-flexbox; 942 | display: flex; 943 | padding: 12px 0; 944 | border-bottom: 1px solid #ebebeb; 945 | -webkit-box-align: center; 946 | -ms-flex-align: center; 947 | align-items: center 948 | } 949 | 950 | .swagger-ui .dialog-ux .modal-ux-header .close-modal { 951 | padding: 0 10px; 952 | border: none; 953 | background: none; 954 | -webkit-appearance: none; 955 | -moz-appearance: none; 956 | appearance: none 957 | } 958 | 959 | .swagger-ui .dialog-ux .modal-ux-header h3 { 960 | font-size: 20px; 961 | font-weight: 600; 962 | margin: 0; 963 | padding: 0 20px; 964 | -webkit-box-flex: 1; 965 | -ms-flex: 1; 966 | flex: 1; 967 | font-family: Titillium Web, sans-serif; 968 | color: #3b4151 969 | } 970 | 971 | .swagger-ui .model { 972 | font-size: 12px; 973 | font-weight: 300; 974 | font-family: Source Code Pro, monospace; 975 | font-weight: 600; 976 | color: #3b4151 977 | } 978 | 979 | .swagger-ui .model-toggle { 980 | font-size: 10px; 981 | position: relative; 982 | top: 6px; 983 | display: inline-block; 984 | margin: auto .3em; 985 | cursor: pointer; 986 | -webkit-transition: -webkit-transform .15s ease-in; 987 | transition: -webkit-transform .15s ease-in; 988 | transition: transform .15s ease-in; 989 | transition: transform .15s ease-in, -webkit-transform .15s ease-in; 990 | -webkit-transform: rotate(90deg); 991 | transform: rotate(90deg); 992 | -webkit-transform-origin: 50% 50%; 993 | transform-origin: 50% 50% 994 | } 995 | 996 | .swagger-ui .model-toggle.collapsed { 997 | -webkit-transform: rotate(0deg); 998 | transform: rotate(0deg) 999 | } 1000 | 1001 | .swagger-ui .model-toggle:after { 1002 | display: block; 1003 | width: 20px; 1004 | height: 20px; 1005 | content: ""; 1006 | background: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E") 50% no-repeat; 1007 | background-size: 100% 1008 | } 1009 | 1010 | .swagger-ui .model-jump-to-path { 1011 | position: relative; 1012 | cursor: pointer 1013 | } 1014 | 1015 | .swagger-ui .model-jump-to-path .view-line-link { 1016 | position: absolute; 1017 | top: -.4em; 1018 | cursor: pointer 1019 | } 1020 | 1021 | .swagger-ui .model-title { 1022 | position: relative 1023 | } 1024 | 1025 | .swagger-ui .model-title:hover .model-hint { 1026 | visibility: visible 1027 | } 1028 | 1029 | .swagger-ui .model-hint { 1030 | position: absolute; 1031 | top: -1.8em; 1032 | visibility: hidden; 1033 | padding: .1em .5em; 1034 | white-space: nowrap; 1035 | color: #ebebeb; 1036 | border-radius: 4px; 1037 | background: rgba(0, 0, 0, .7) 1038 | } 1039 | 1040 | .swagger-ui section.models { 1041 | margin: 30px 0; 1042 | border: 1px solid rgba(59, 65, 81, .3); 1043 | border-radius: 4px 1044 | } 1045 | 1046 | .swagger-ui section.models.is-open { 1047 | padding: 0 0 20px 1048 | } 1049 | 1050 | .swagger-ui section.models.is-open h4 { 1051 | margin: 0 0 5px; 1052 | border-bottom: 1px solid rgba(59, 65, 81, .3) 1053 | } 1054 | 1055 | .swagger-ui section.models.is-open h4 svg { 1056 | -webkit-transform: rotate(90deg); 1057 | transform: rotate(90deg) 1058 | } 1059 | 1060 | .swagger-ui section.models h4 { 1061 | font-size: 16px; 1062 | display: -webkit-box; 1063 | display: -ms-flexbox; 1064 | display: flex; 1065 | margin: 0; 1066 | padding: 10px 20px 10px 10px; 1067 | cursor: pointer; 1068 | -webkit-transition: all .2s; 1069 | transition: all .2s; 1070 | font-family: Titillium Web, sans-serif; 1071 | color: #777; 1072 | -webkit-box-align: center; 1073 | -ms-flex-align: center; 1074 | align-items: center 1075 | } 1076 | 1077 | .swagger-ui section.models h4 svg { 1078 | -webkit-transition: all .4s; 1079 | transition: all .4s 1080 | } 1081 | 1082 | .swagger-ui section.models h4 span { 1083 | -webkit-box-flex: 1; 1084 | -ms-flex: 1; 1085 | flex: 1 1086 | } 1087 | 1088 | .swagger-ui section.models h4:hover { 1089 | background: rgba(0, 0, 0, .02) 1090 | } 1091 | 1092 | .swagger-ui section.models h5 { 1093 | font-size: 16px; 1094 | margin: 0 0 10px; 1095 | font-family: Titillium Web, sans-serif; 1096 | color: #777 1097 | } 1098 | 1099 | .swagger-ui section.models .model-jump-to-path { 1100 | position: relative; 1101 | top: 5px 1102 | } 1103 | 1104 | .swagger-ui section.models .model-container { 1105 | margin: 0 20px 15px; 1106 | -webkit-transition: all .5s; 1107 | transition: all .5s; 1108 | border-radius: 4px; 1109 | background: rgba(0, 0, 0, .05) 1110 | } 1111 | 1112 | .swagger-ui section.models .model-container:hover { 1113 | background: rgba(0, 0, 0, .07) 1114 | } 1115 | 1116 | .swagger-ui section.models .model-container:first-of-type { 1117 | margin: 20px 1118 | } 1119 | 1120 | .swagger-ui section.models .model-container:last-of-type { 1121 | margin: 0 20px 1122 | } 1123 | 1124 | .swagger-ui section.models .model-box { 1125 | background: none 1126 | } 1127 | 1128 | .swagger-ui .model-box { 1129 | padding: 10px; 1130 | border-radius: 4px; 1131 | background: rgba(0, 0, 0, .1) 1132 | } 1133 | 1134 | .swagger-ui .model-box .model-jump-to-path { 1135 | position: relative; 1136 | top: 4px 1137 | } 1138 | 1139 | .swagger-ui .model-title { 1140 | font-size: 16px; 1141 | font-family: Titillium Web, sans-serif; 1142 | color: #555 1143 | } 1144 | 1145 | .swagger-ui span>span.model, .swagger-ui span>span.model .brace-close { 1146 | padding: 0 0 0 10px 1147 | } 1148 | 1149 | .swagger-ui .prop-type { 1150 | color: #55a 1151 | } 1152 | 1153 | .swagger-ui .prop-enum { 1154 | display: block 1155 | } 1156 | 1157 | .swagger-ui .prop-format { 1158 | color: #999 1159 | } 1160 | 1161 | .swagger-ui table { 1162 | width: 100%; 1163 | padding: 0 10px; 1164 | border-collapse: collapse 1165 | } 1166 | 1167 | .swagger-ui table.model tbody tr td { 1168 | padding: 0; 1169 | vertical-align: top 1170 | } 1171 | 1172 | .swagger-ui table.model tbody tr td:first-of-type { 1173 | width: 100px; 1174 | padding: 0 1175 | } 1176 | 1177 | .swagger-ui table.headers td { 1178 | font-size: 12px; 1179 | font-weight: 300; 1180 | vertical-align: middle; 1181 | font-family: Source Code Pro, monospace; 1182 | font-weight: 600; 1183 | color: #3b4151 1184 | } 1185 | 1186 | .swagger-ui table tbody tr td { 1187 | padding: 10px 0 0; 1188 | vertical-align: top 1189 | } 1190 | 1191 | .swagger-ui table tbody tr td:first-of-type { 1192 | width: 20%; 1193 | padding: 10px 0 1194 | } 1195 | 1196 | .swagger-ui table thead tr td, .swagger-ui table thead tr th { 1197 | font-size: 12px; 1198 | font-weight: 700; 1199 | padding: 12px 0; 1200 | text-align: left; 1201 | border-bottom: 1px solid rgba(59, 65, 81, .2); 1202 | font-family: Open Sans, sans-serif; 1203 | color: #3b4151 1204 | } 1205 | 1206 | .swagger-ui .parameters-col_description p { 1207 | font-size: 14px; 1208 | margin: 0; 1209 | font-family: Open Sans, sans-serif; 1210 | color: #3b4151 1211 | } 1212 | 1213 | .swagger-ui .parameters-col_description input[type=text] { 1214 | width: 100%; 1215 | max-width: 340px 1216 | } 1217 | 1218 | .swagger-ui .parameter__name { 1219 | font-size: 16px; 1220 | font-weight: 400; 1221 | font-family: Titillium Web, sans-serif; 1222 | color: #3b4151 1223 | } 1224 | 1225 | .swagger-ui .parameter__name.required { 1226 | font-weight: 700 1227 | } 1228 | 1229 | .swagger-ui .parameter__name.required:after { 1230 | font-size: 10px; 1231 | position: relative; 1232 | top: -6px; 1233 | padding: 5px; 1234 | content: "required"; 1235 | color: rgba(255, 0, 0, .6) 1236 | } 1237 | 1238 | .swagger-ui .parameter__in { 1239 | font-size: 12px; 1240 | font-style: italic; 1241 | font-family: Source Code Pro, monospace; 1242 | font-weight: 600; 1243 | color: #888 1244 | } 1245 | 1246 | .swagger-ui .table-container { 1247 | padding: 20px 1248 | } 1249 | 1250 | .swagger-ui .topbar { 1251 | padding: 8px 30px; 1252 | background-color: #89bf04 1253 | } 1254 | 1255 | .swagger-ui .topbar .topbar-wrapper { 1256 | -ms-flex-align: center 1257 | } 1258 | 1259 | .swagger-ui .topbar .topbar-wrapper, .swagger-ui .topbar a { 1260 | display: -webkit-box; 1261 | display: -ms-flexbox; 1262 | display: flex; 1263 | -webkit-box-align: center; 1264 | align-items: center 1265 | } 1266 | 1267 | .swagger-ui .topbar a { 1268 | font-size: 1.5em; 1269 | font-weight: 700; 1270 | text-decoration: none; 1271 | -webkit-box-flex: 1; 1272 | -ms-flex: 1; 1273 | flex: 1; 1274 | -ms-flex-align: center; 1275 | font-family: Titillium Web, sans-serif; 1276 | color: #fff 1277 | } 1278 | 1279 | .swagger-ui .topbar a span { 1280 | margin: 0; 1281 | padding: 0 10px 1282 | } 1283 | 1284 | .swagger-ui .topbar .download-url-wrapper { 1285 | display: -webkit-box; 1286 | display: -ms-flexbox; 1287 | display: flex 1288 | } 1289 | 1290 | .swagger-ui .topbar .download-url-wrapper input[type=text] { 1291 | min-width: 350px; 1292 | margin: 0; 1293 | border: 2px solid #547f00; 1294 | border-radius: 4px 0 0 4px; 1295 | outline: none 1296 | } 1297 | 1298 | .swagger-ui .topbar .download-url-wrapper .download-url-button { 1299 | font-size: 16px; 1300 | font-weight: 700; 1301 | padding: 4px 40px; 1302 | border: none; 1303 | border-radius: 0 4px 4px 0; 1304 | background: #547f00; 1305 | font-family: Titillium Web, sans-serif; 1306 | color: #fff 1307 | } 1308 | 1309 | .swagger-ui .info { 1310 | margin: 50px 0 1311 | } 1312 | 1313 | .swagger-ui .info hgroup.main { 1314 | margin: 0 0 20px 1315 | } 1316 | 1317 | .swagger-ui .info hgroup.main a { 1318 | font-size: 12px 1319 | } 1320 | 1321 | .swagger-ui .info p { 1322 | font-size: 14px; 1323 | font-family: Open Sans, sans-serif; 1324 | color: #3b4151 1325 | } 1326 | 1327 | .swagger-ui .info code { 1328 | padding: 3px 5px; 1329 | border-radius: 4px; 1330 | background: rgba(0, 0, 0, .05); 1331 | font-family: Source Code Pro, monospace; 1332 | font-weight: 600; 1333 | color: #9012fe 1334 | } 1335 | 1336 | .swagger-ui .info a { 1337 | font-size: 14px; 1338 | -webkit-transition: all .4s; 1339 | transition: all .4s; 1340 | font-family: Open Sans, sans-serif; 1341 | color: #4990e2 1342 | } 1343 | 1344 | .swagger-ui .info a:hover { 1345 | color: #1f69c0 1346 | } 1347 | 1348 | .swagger-ui .info>div { 1349 | margin: 0 0 5px 1350 | } 1351 | 1352 | .swagger-ui .info .base-url { 1353 | font-size: 12px; 1354 | font-weight: 300!important; 1355 | margin: 0; 1356 | font-family: Source Code Pro, monospace; 1357 | font-weight: 600; 1358 | color: #3b4151 1359 | } 1360 | 1361 | .swagger-ui .info .title { 1362 | font-size: 36px; 1363 | margin: 0; 1364 | font-family: Open Sans, sans-serif; 1365 | color: #3b4151 1366 | } 1367 | 1368 | .swagger-ui .info .title small { 1369 | font-size: 10px; 1370 | position: relative; 1371 | top: -5px; 1372 | display: inline-block; 1373 | margin: 0 0 0 5px; 1374 | padding: 2px 4px; 1375 | vertical-align: super; 1376 | border-radius: 57px; 1377 | background: #7d8492 1378 | } 1379 | 1380 | .swagger-ui .info .title small pre { 1381 | margin: 0; 1382 | font-family: Titillium Web, sans-serif; 1383 | color: #fff 1384 | } 1385 | 1386 | .swagger-ui .auth-btn-wrapper { 1387 | display: -webkit-box; 1388 | display: -ms-flexbox; 1389 | display: flex; 1390 | padding: 10px 0; 1391 | -webkit-box-pack: center; 1392 | -ms-flex-pack: center; 1393 | justify-content: center 1394 | } 1395 | 1396 | .swagger-ui .auth-wrapper { 1397 | display: -webkit-box; 1398 | display: -ms-flexbox; 1399 | display: flex; 1400 | -webkit-box-flex: 1; 1401 | -ms-flex: 1; 1402 | flex: 1; 1403 | -webkit-box-pack: end; 1404 | -ms-flex-pack: end; 1405 | justify-content: flex-end 1406 | } 1407 | 1408 | .swagger-ui .auth-wrapper .authorize { 1409 | padding-right: 20px 1410 | } 1411 | 1412 | .swagger-ui .auth-container { 1413 | margin: 0 0 10px; 1414 | padding: 10px 20px; 1415 | border-bottom: 1px solid #ebebeb 1416 | } 1417 | 1418 | .swagger-ui .auth-container:last-of-type { 1419 | margin: 0; 1420 | padding: 10px 20px; 1421 | border: 0 1422 | } 1423 | 1424 | .swagger-ui .auth-container h4 { 1425 | margin: 5px 0 15px!important 1426 | } 1427 | 1428 | .swagger-ui .auth-container .wrapper { 1429 | margin: 0; 1430 | padding: 0 1431 | } 1432 | 1433 | .swagger-ui .auth-container input[type=password], .swagger-ui .auth-container input[type=text] { 1434 | min-width: 230px 1435 | } 1436 | 1437 | .swagger-ui .auth-container .errors { 1438 | font-size: 12px; 1439 | padding: 10px; 1440 | border-radius: 4px; 1441 | font-family: Source Code Pro, monospace; 1442 | font-weight: 600; 1443 | color: #3b4151 1444 | } 1445 | 1446 | .swagger-ui .scopes h2 { 1447 | font-size: 14px; 1448 | font-family: Titillium Web, sans-serif; 1449 | color: #3b4151 1450 | } 1451 | 1452 | .swagger-ui .scope-def { 1453 | padding: 0 0 20px 1454 | } 1455 | 1456 | .swagger-ui .errors-wrapper { 1457 | margin: 20px; 1458 | padding: 10px 20px; 1459 | -webkit-animation: scaleUp .5s; 1460 | animation: scaleUp .5s; 1461 | border: 2px solid #f93e3e; 1462 | border-radius: 4px; 1463 | background: rgba(249, 62, 62, .1) 1464 | } 1465 | 1466 | .swagger-ui .errors-wrapper .error-wrapper { 1467 | margin: 0 0 10px 1468 | } 1469 | 1470 | .swagger-ui .errors-wrapper .errors h4 { 1471 | font-size: 14px; 1472 | margin: 0; 1473 | font-family: Source Code Pro, monospace; 1474 | font-weight: 600; 1475 | color: #3b4151 1476 | } 1477 | 1478 | .swagger-ui .errors-wrapper hgroup { 1479 | display: -webkit-box; 1480 | display: -ms-flexbox; 1481 | display: flex; 1482 | -webkit-box-align: center; 1483 | -ms-flex-align: center; 1484 | align-items: center 1485 | } 1486 | 1487 | .swagger-ui .errors-wrapper hgroup h4 { 1488 | font-size: 20px; 1489 | margin: 0; 1490 | -webkit-box-flex: 1; 1491 | -ms-flex: 1; 1492 | flex: 1; 1493 | font-family: Titillium Web, sans-serif; 1494 | color: #3b4151 1495 | } 1496 | 1497 | @-webkit-keyframes scaleUp { 1498 | 0% { 1499 | -webkit-transform: scale(.8); 1500 | transform: scale(.8); 1501 | opacity: 0 1502 | } 1503 | to { 1504 | -webkit-transform: scale(1); 1505 | transform: scale(1); 1506 | opacity: 1 1507 | } 1508 | } 1509 | 1510 | @keyframes scaleUp { 1511 | 0% { 1512 | -webkit-transform: scale(.8); 1513 | transform: scale(.8); 1514 | opacity: 0 1515 | } 1516 | to { 1517 | -webkit-transform: scale(1); 1518 | transform: scale(1); 1519 | opacity: 1 1520 | } 1521 | } 1522 | 1523 | .swagger-ui .Resizer.vertical.disabled { 1524 | display: none 1525 | } 1526 | 1527 | /*# sourceMappingURL=swagger-ui.css.map*/ 1528 | 1529 | /** 1530 | * Swagger UI Theme Overrides 1531 | * 1532 | * Theme: Newspaper 1533 | * Author: Mark Ostrander 1534 | * Github: https://github.com/ostranme/swagger-ui-themes 1535 | */ 1536 | 1537 | .swagger-ui .opblock.opblock-post { 1538 | border-color: #DADFE1; 1539 | background: rgba(34, 34, 34, .1); 1540 | } 1541 | 1542 | .swagger-ui .opblock.opblock-post .opblock-summary-method { 1543 | background: #222222; 1544 | } 1545 | 1546 | .swagger-ui .opblock.opblock-post .opblock-summary { 1547 | border-color: #DADFE1; 1548 | } 1549 | 1550 | .swagger-ui .opblock.opblock-put { 1551 | border-color: #DADFE1; 1552 | background: rgba(34, 34, 34, .1); 1553 | } 1554 | 1555 | .swagger-ui .opblock.opblock-put .opblock-summary-method { 1556 | background: #222222; 1557 | } 1558 | 1559 | .swagger-ui .opblock.opblock-put .opblock-summary { 1560 | border-color: #DADFE1; 1561 | } 1562 | 1563 | .swagger-ui .opblock.opblock-delete { 1564 | border-color: #DADFE1; 1565 | background: rgba(34, 34, 34, .1); 1566 | } 1567 | 1568 | .swagger-ui .opblock.opblock-delete .opblock-summary-method { 1569 | background: #222222; 1570 | } 1571 | 1572 | .swagger-ui .opblock.opblock-delete .opblock-summary { 1573 | border-color: #DADFE1; 1574 | } 1575 | 1576 | .swagger-ui .opblock.opblock-get { 1577 | border-color: #DADFE1; 1578 | background: rgba(34, 34, 34, .1); 1579 | } 1580 | 1581 | .swagger-ui .opblock.opblock-get .opblock-summary-method { 1582 | background: #222222; 1583 | } 1584 | 1585 | .swagger-ui .opblock.opblock-get .opblock-summary { 1586 | border-color: #DADFE1; 1587 | } 1588 | 1589 | .swagger-ui .opblock.opblock-patch { 1590 | border-color: #DADFE1; 1591 | background: rgba(34, 34, 34, .1); 1592 | } 1593 | 1594 | .swagger-ui .opblock.opblock-patch .opblock-summary-method { 1595 | background: #222222; 1596 | } 1597 | 1598 | .swagger-ui .opblock.opblock-patch .opblock-summary { 1599 | border-color: #DADFE1; 1600 | } 1601 | 1602 | .swagger-ui .opblock.opblock-head { 1603 | border-color: #DADFE1; 1604 | background: rgba(34, 34, 34, .1); 1605 | } 1606 | 1607 | .swagger-ui .opblock.opblock-head .opblock-summary-method { 1608 | background: #222222; 1609 | } 1610 | 1611 | .swagger-ui .opblock.opblock-head .opblock-summary { 1612 | border-color: #DADFE1; 1613 | } 1614 | 1615 | .swagger-ui .opblock.opblock-options { 1616 | border-color: #DADFE1; 1617 | background: rgba(34, 34, 34, .1); 1618 | } 1619 | 1620 | .swagger-ui .opblock.opblock-options .opblock-summary-method { 1621 | background: #222222; 1622 | } 1623 | 1624 | .swagger-ui .opblock.opblock-options .opblock-summary { 1625 | border-color: #DADFE1; 1626 | } 1627 | 1628 | .swagger-ui .topbar { 1629 | padding: 8px 30px; 1630 | background-color: #222222; 1631 | } 1632 | .swagger-ui .topbar .download-url-wrapper input[type=text] { 1633 | min-width: 350px; 1634 | margin: 0; 1635 | border: 2px solid #DADFE1; 1636 | border-radius: 4px 0 0 4px; 1637 | outline: none; 1638 | } 1639 | 1640 | .swagger-ui .topbar .download-url-wrapper .download-url-button { 1641 | font-size: 16px; 1642 | font-weight: 700; 1643 | padding: 4px 40px; 1644 | border: none; 1645 | border-radius: 0 4px 4px 0; 1646 | background: #DADFE1; 1647 | font-family: Titillium Web, sans-serif; 1648 | color: #222222; 1649 | } 1650 | 1651 | .swagger-ui .info a { 1652 | font-size: 14px; 1653 | -webkit-transition: all .4s; 1654 | transition: all .4s; 1655 | font-family: Open Sans, sans-serif; 1656 | color: #222222; 1657 | } 1658 | 1659 | .swagger-ui .info a:hover { 1660 | color: #222222; 1661 | } 1662 | 1663 | .swagger-ui .btn.authorize { 1664 | line-height: 1; 1665 | display: inline; 1666 | color: #222222; 1667 | border-color: #222222; 1668 | } 1669 | .swagger-ui .btn.authorize svg { 1670 | fill: #222222; 1671 | } 1672 | -------------------------------------------------------------------------------- /api/env.example: -------------------------------------------------------------------------------- 1 | DEBUG_MODE="True" 2 | APP_KEY="a1b2c3d4" 3 | PORT=8000 4 | USE_LOCAL_WORDLIST="False" 5 | REMOTE_WORDLIST="https://ci2-assets.nyc3.digitaloceanspaces.com/wordlist.txt" 6 | LOCAL_QUESTION_WORDLIST="/path/to/questions.txt" 7 | LOCAL_ANSWER_WORDLIST="/path/to/answers.txt" 8 | REMOTE_QUESTION_WORDLIST="https://ci2-assets.nyc3.digitaloceanspaces.com/questions.txt" 9 | REMOTE_ANSWER_WORDLIST="https://ci2-assets.nyc3.digitaloceanspaces.com/answers.txt" 10 | -------------------------------------------------------------------------------- /api/gunicorn.conf.py: -------------------------------------------------------------------------------- 1 | import multiprocessing 2 | 3 | bind = "0.0.0.0:8000" 4 | reload = True 5 | #worker_tmp_dir = '/dev/shm' 6 | workers = multiprocessing.cpu_count() * 2 + 1 7 | threads = 4 8 | worker_class = 'gthread' 9 | accesslog = './log/gunicorn.access.log' 10 | errorlog = './log/gunicorn.error.log' 11 | log_level = 'info' 12 | -------------------------------------------------------------------------------- /api/inventor/__init__.py: -------------------------------------------------------------------------------- 1 | import markovify 2 | import requests 3 | import os 4 | from dotenv import load_dotenv, find_dotenv 5 | 6 | class Config: 7 | 8 | def __init__(self): 9 | self.debug_mode = os.environ.get('DEBUG_MODE') 10 | self.app_key = os.environ.get('APP_KEY') 11 | self.listen = os.environ.get('LISTEN') 12 | self.port = os.environ.get('PORT') 13 | self.use_local_wordlists = os.environ.get('USE_LOCAL_WORDLISTS') 14 | self.local_question_wordlist = os.environ.get('LOCAL_QUESTION_WORDLIST') 15 | self.remote_question_wordlist = os.environ.get('REMOTE_QUESTION_WORDLIST') 16 | self.local_answer_wordlist = os.environ.get('LOCAL_ANSWER_WORDLIST') 17 | self.remote_answer_wordlist = os.environ.get('REMOTE_ANSWER_WORDLIST') 18 | self.assets_dir = os.path.join(os.getcwd(), 'assets') 19 | 20 | # Tell our app where to get its environment variables from 21 | dotenv_path = os.path.join(os.path.dirname(__file__), '.env') 22 | try: 23 | load_dotenv(dotenv_path) 24 | except IOError: 25 | find_dotenv() 26 | 27 | class Invent: 28 | 29 | def __init__(self, num_cards, attempts): 30 | self.num_cards = int(num_cards) 31 | self.attempts = int(attempts) 32 | 33 | def question(self): 34 | 35 | cfg = Config() 36 | 37 | attempts_str2int = int(self.attempts) 38 | num_cards_str2int = int(self.num_cards) 39 | cards = [] 40 | 41 | if cfg.use_local_wordlists is True: 42 | text = cfg.local_question_wordlist 43 | else: 44 | req = requests.get(cfg.remote_question_wordlist) 45 | text = req.text 46 | 47 | text_model = markovify.Text(text) 48 | 49 | for i in range(num_cards_str2int): 50 | cards.append(text_model.make_sentence(tries=attempts_str2int)) 51 | 52 | return cards 53 | 54 | def answer(self): 55 | 56 | cfg = Config() 57 | 58 | attempts_str2int = int(self.attempts) 59 | num_cards_str2int = int(self.num_cards) 60 | cards = [] 61 | 62 | if cfg.use_local_wordlists is True: 63 | text = cfg.local_answer_wordlist 64 | else: 65 | req = requests.get(cfg.remote_answer_wordlist) 66 | text = req.text 67 | 68 | text_model = markovify.Text(text) 69 | 70 | for i in range(num_cards_str2int): 71 | cards.append(text_model.make_sentence(tries=attempts_str2int)) 72 | 73 | return cards 74 | -------------------------------------------------------------------------------- /api/log/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoxingOctopusCreative/chains-invent-insanity/9a84e18b2bf8f0a752df634d668f87996ebca7cb/api/log/.gitkeep -------------------------------------------------------------------------------- /api/requirements.txt: -------------------------------------------------------------------------------- 1 | markovify 2 | Unidecode 3 | requests 4 | flask 5 | python-dotenv 6 | gunicorn 7 | flask-cors 8 | -------------------------------------------------------------------------------- /api/swagger/answer.yaml: -------------------------------------------------------------------------------- 1 | This endpoint returns the answer to the question card. 2 | --- 3 | parameters: 4 | - name: num_cards 5 | in: query 6 | type: integer 7 | required: true 8 | default: 1 9 | description: Number of cards to return 10 | - name: attempts 11 | in: query 12 | type: integer 13 | required: true 14 | default: 1000 15 | description: Number of attempts made by the Markov chain to generate a card 16 | definitions: 17 | answer: 18 | type: object 19 | properties: 20 | num_cards: 21 | type: integer 22 | default: 1 23 | attempts: 24 | type: integer 25 | default: 1000 26 | responses: 27 | 200: 28 | description: OK 29 | schema: 30 | $ref: '#/definitions/answer' 31 | properties: 32 | num_cards: 33 | type: integer 34 | description: Number of cards returned 35 | default: 1 36 | attempts: 37 | type: integer 38 | description: Number of attempts made by the Markov chain to generate a card 39 | default: 1000 40 | example: 41 | num_cards: 1 42 | attempts: 1000 43 | -------------------------------------------------------------------------------- /api/swagger/question.yaml: -------------------------------------------------------------------------------- 1 | This endpoint returns a question card. 2 | --- 3 | parameters: 4 | - name: num_cards 5 | in: query 6 | type: integer 7 | required: true 8 | default: 1 9 | description: Number of cards to return 10 | - name: attempts 11 | in: query 12 | type: integer 13 | required: true 14 | default: 1000 15 | description: Number of attempts made by the Markov chain to generate a card 16 | definitions: 17 | question: 18 | type: object 19 | properties: 20 | num_cards: 21 | type: integer 22 | default: 1 23 | attempts: 24 | type: integer 25 | default: 1000 26 | responses: 27 | 200: 28 | description: OK 29 | schema: 30 | $ref: '#/definitions/question' 31 | properties: 32 | num_cards: 33 | type: integer 34 | description: Number of cards returned 35 | default: 1 36 | attempts: 37 | type: integer 38 | description: Number of attempts made by the Markov chain to generate a card 39 | default: 1000 40 | example: 41 | num_cards: 1 42 | attempts: 1000 43 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | api: 5 | build: ./api 6 | env_file: ./api/.env 7 | ports: 8 | - "8000:8000" 9 | 10 | ui: 11 | build: ./ui 12 | links: 13 | - api 14 | ports: 15 | - "3000:3000" 16 | 17 | nginx: 18 | image: nginx:1.21.4-alpine 19 | links: 20 | - ui 21 | - api 22 | ports: 23 | - "80:80" 24 | - "443:443" 25 | volumes: 26 | - ./nginx/config/nginx.conf:/etc/nginx/nginx.conf 27 | - ./nginx/config/default.conf:/etc/nginx/conf.d/default.conf 28 | -------------------------------------------------------------------------------- /nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.13.6 2 | 3 | RUN rm /etc/nginx/nginx.conf 4 | COPY nginx.conf /etc/nginx/ 5 | 6 | RUN rm /etc/nginx/conf.d/default.conf 7 | COPY nginx-site.conf /etc/nginx/conf.d/ 8 | -------------------------------------------------------------------------------- /nginx/config/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | 4 | location / { 5 | proxy_pass http://ui:3000/; 6 | proxy_set_header Host $host; 7 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 8 | } 9 | 10 | location /api { 11 | proxy_pass http://api:3000/; 12 | proxy_set_header Host $host; 13 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /nginx/config/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes 4; 3 | 4 | error_log /var/log/nginx/error.log warn; 5 | pid /var/run/nginx.pid; 6 | 7 | 8 | events { 9 | worker_connections 19000; 10 | } 11 | 12 | 13 | http { 14 | include /etc/nginx/mime.types; 15 | default_type application/octet-stream; 16 | 17 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 18 | '$status $body_bytes_sent "$http_referer" ' 19 | '"$http_user_agent" "$http_x_forwarded_for"'; 20 | 21 | access_log /var/log/nginx/access.log main; 22 | 23 | sendfile on; 24 | #tcp_nopush on; 25 | 26 | keepalive_timeout 65; 27 | 28 | #gzip on; 29 | 30 | include /etc/nginx/conf.d/*.conf; 31 | } 32 | -------------------------------------------------------------------------------- /ui/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .eslintcache 3 | -------------------------------------------------------------------------------- /ui/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:17-alpine3.12 as build 2 | 3 | RUN adduser -D ci2 4 | WORKDIR /app 5 | COPY . . 6 | RUN chown ci2:ci2 /app 7 | USER ci2 8 | RUN npm install 9 | RUN npm run build 10 | 11 | FROM node:17-alpine3.12 as final 12 | COPY --from=build /app /app 13 | 14 | RUN apk update && apk upgrade 15 | RUN adduser -D ci2 16 | RUN chown ci2:ci2 /app 17 | 18 | WORKDIR /app 19 | USER ci2 20 | ENTRYPOINT ["npm", "start"] 21 | -------------------------------------------------------------------------------- /ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "devDependencies": { 6 | "@testing-library/jest-dom": "^5.11.8", 7 | "@testing-library/react": "^11.2.2", 8 | "@testing-library/user-event": "^12.6.0" 9 | }, 10 | "dependencies": { 11 | "@fortawesome/fontawesome-svg-core": "^1.2.36", 12 | "@fortawesome/free-solid-svg-icons": "^5.15.4", 13 | "@fortawesome/react-fontawesome": "^0.1.16", 14 | "axios": "^0.24.0", 15 | "bootstrap": "^4.5.3", 16 | "fontawesome": "^5.6.3", 17 | "html-react-parser": "^1.4.4", 18 | "react": "^17.0.1", 19 | "react-bootstrap": "^2.1.2", 20 | "react-bootstrap-multiselect": "^2.4.1", 21 | "react-dom": "^17.0.1", 22 | "react-ga": "^3.3.0", 23 | "react-helmet": "^6.1.0", 24 | "react-helmet-async": "^1.2.3", 25 | "react-router": "^5.2.0", 26 | "react-router-dom": "^6.2.1", 27 | "react-scripts": "^5.0.0", 28 | "react-transition-group": "^4.4.1", 29 | "styled-components": "^5.2.1", 30 | "web-vitals": "^0.2.4" 31 | }, 32 | "scripts": { 33 | "start": "react-scripts start", 34 | "build": "react-scripts build", 35 | "test": "react-scripts test", 36 | "eject": "react-scripts eject" 37 | }, 38 | "eslintConfig": { 39 | "extends": [ 40 | "react-app", 41 | "react-app/jest" 42 | ] 43 | }, 44 | "browserslist": { 45 | "production": [ 46 | ">0.2%", 47 | "not dead", 48 | "not op_mini all" 49 | ], 50 | "development": [ 51 | "last 1 chrome version", 52 | "last 1 firefox version", 53 | "last 1 safari version" 54 | ] 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /ui/public/CAH-blank-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoxingOctopusCreative/chains-invent-insanity/9a84e18b2bf8f0a752df634d668f87996ebca7cb/ui/public/CAH-blank-white.png -------------------------------------------------------------------------------- /ui/public/card.css: -------------------------------------------------------------------------------- 1 | .card { 2 | position: relative; 3 | float: left; 4 | width: 225px; 5 | height: 315px; 6 | padding: 1em; 7 | margin: .5em; 8 | background: white; 9 | border: .1em black solid; 10 | border-radius: 1em; 11 | } 12 | 13 | .card p { 14 | color: black; 15 | font-weight: 700; 16 | font-size: 16px; 17 | font-family: "Helvetica"; 18 | line-height: 1.6em; 19 | margin-top: 0; 20 | } 21 | 22 | .card .cahlogo { 23 | position: absolute; 24 | bottom: 0.05em; 25 | left: 0em; 26 | } 27 | -------------------------------------------------------------------------------- /ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoxingOctopusCreative/chains-invent-insanity/9a84e18b2bf8f0a752df634d668f87996ebca7cb/ui/public/favicon.ico -------------------------------------------------------------------------------- /ui/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 16 | 17 | 26 | Chains Invent Insanity 27 | 28 | 29 | 30 |
31 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /ui/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Chains Invent Insanity", 3 | "name": "Chains Invent Insanity", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#000000" 15 | } 16 | -------------------------------------------------------------------------------- /ui/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /ui/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | background-color: black; 4 | } 5 | 6 | .container { 7 | background-color: black; 8 | } 9 | 10 | .body { 11 | background-color: black; 12 | color: white; 13 | } 14 | -------------------------------------------------------------------------------- /ui/src/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { BrowserRouter, Routes, Route } from "react-router-dom"; 3 | import { Layout } from './Components/Layout'; 4 | import Home from './Pages/Home'; 5 | import About from './Pages/About'; 6 | import Invent from './Pages/Invent'; 7 | import { FourOhFour } from "./Pages/404"; 8 | 9 | 10 | export default function App() { 11 | return ( 12 | 13 | 14 | }> 15 | } /> 16 | } /> 17 | } /> 18 | } /> 19 | 20 | 21 | 22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /ui/src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /ui/src/Components/ApiClient.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import React from 'react'; 3 | 4 | export default function ApiClient(card_type, num_cards, attempts) { 5 | 6 | const baseUrl = `http://localhost:8000/api/v1/${card_type}?num_cards=${num_cards}&attempts=${attempts}`; 7 | 8 | const [post, setPost] = React.useState(null); 9 | 10 | React.useEffect(() => { 11 | axios.get(baseUrl).then((response) => { 12 | setPost(response.data); 13 | }); 14 | }, []); 15 | 16 | if (!post) return null; 17 | } 18 | -------------------------------------------------------------------------------- /ui/src/Components/Cards.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const Cards = (props) => ( 4 |
5 |
6 |

7 | {props.children} 8 |

9 |
10 |
11 | ) 12 | -------------------------------------------------------------------------------- /ui/src/Components/Controls.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { Form, Button } from 'react-bootstrap'; 3 | 4 | function Controls() { 5 | 6 | const [formData, setFormData] = useState({ 7 | card_type: '', 8 | num_cards: '', 9 | attempts: '' 10 | }); 11 | 12 | const handleChange = (event) => { 13 | const { name, value } = event.target; 14 | setFormData(prevState => ({ ...prevState, [name]: value })); 15 | } 16 | 17 | const handleSubmit = (event) => { 18 | event.preventDefault(); 19 | const { card_type, num_cards, attempts } = formData; 20 | const url = `http://localhost:8000/api/v1/${card_type}?num_cards=${num_cards}&attempts=${attempts}`; 21 | fetch(url, { 22 | method: 'POST', 23 | headers: { 24 | 'Content-Type': 'application/json' 25 | } 26 | }) 27 | .then(response => response.json()) 28 | .then(data => console.log(data)) 29 | .catch(error => console.error(error)); 30 | } 31 | 32 | return ( 33 |
34 |

Options

35 | 36 | Number of Cards 37 | 38 | 39 | Number of cards to generate. 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | Attempts 51 | 52 | 53 | Number of attempts to generate valid cards each time 54 | 55 | 56 | 59 |
60 | ); 61 | } 62 | 63 | export default Controls; 64 | -------------------------------------------------------------------------------- /ui/src/Components/Controls2.jsx: -------------------------------------------------------------------------------- 1 | // import React, { Component, useState, useEffect } from 'react'; 2 | // import { Form, Button } from 'react-bootstrap'; 3 | // import ApiClient from './ApiClient'; 4 | // import axios from 'axios'; 5 | 6 | // const baseUrl = `http://localhost:8000/api/v1/${card_type}?num_cards=${num_cards}&attempts=${attempts}`; 7 | 8 | // export default class Controls extends Component { 9 | 10 | 11 | // saveState() { 12 | // const [cards, setCards] = useState('') 13 | // } 14 | 15 | // handleOnSubmit(event) { 16 | 17 | 18 | // event.preventDefault(); 19 | 20 | // React.useEffect(() => { 21 | // axios.get(baseUrl).then((response) => { 22 | // saveState(response.data); 23 | // }); 24 | // }, []); 25 | 26 | // if (!post) return null; 27 | // event.target.reset(); 28 | // } 29 | 30 | // render() { 31 | // return( 32 | //
33 | //

Options

34 | // 35 | // Number of Cards 36 | // 37 | // 38 | // Number of cards to generate. 39 | // 40 | // 41 | // 42 | // 43 | // 44 | // 45 | // 46 | // 47 | // 48 | // 49 | // Attempts 50 | // 51 | // 52 | // Number of attempts to generate valid cards each time 53 | // 54 | // 55 | // 58 | //
59 | // ) 60 | // } 61 | // } 62 | 63 | // export const Controls = () => { 64 | 65 | // const saveState = () => { 66 | // const [cards, setCards] = useState('') 67 | // } 68 | 69 | // const handleOnSubmit = (event) => { 70 | // event.preventDefault(); 71 | 72 | // useEffect(() => { 73 | // axios.get(baseUrl).then((response) => { 74 | // saveState(response.data); 75 | // }); 76 | // }, []); 77 | 78 | // if (!post) return null; 79 | // event.target.reset(); 80 | // } 81 | 82 | // return ( 83 | //
84 | //

Options

85 | // 86 | // Number of Cards 87 | // 88 | // 89 | // Number of cards to generate. 90 | // 91 | // 92 | 93 | // 94 | // Attempts 95 | // 96 | // 97 | // Number of attempts to generate valid cards each time 98 | // 99 | // 100 | // 103 | //
104 | // ) 105 | // } 106 | -------------------------------------------------------------------------------- /ui/src/Components/Explainer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const Explainer = () => ( 4 | <> 5 |

Why??

6 |

7 | Because Cards Against Humanity is fun, and hilarious; but let's face it, play it enough times and 8 | you start to get bored, because you've seen every answer. Also, Markov chains are absurd, and hilarious. 9 | So to my way of thinking, they're a perfect combination. 10 |

11 |

12 | That said, I have a strange sense of humour; 13 | so perhaps you won't find this as hilarious. Your loss if you don't. However I really do hope this 14 | provides you with some manner of amusing distraction from your otherwise dull and dreary life. ENJOY! 15 |

16 | 17 | ); 18 | -------------------------------------------------------------------------------- /ui/src/Components/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Parser from 'html-react-parser'; 3 | 4 | const BoxingOctopusUrl = 'Boxing Octopus Creative' 5 | const FlaskUrl = 'Flask' 6 | const ReactUrl = 'React' 7 | const GithubUrl = 'GitHub' 8 | 9 | export const Footer = () => ( 10 |
11 |
12 |
13 | Another fine {Parser(BoxingOctopusUrl)} Project | Built with {Parser(FlaskUrl)} and {Parser(ReactUrl)} | Clone this project on {Parser(GithubUrl)} 14 |
15 |
16 |
17 | ); 18 | -------------------------------------------------------------------------------- /ui/src/Components/Header.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const Header = () => ( 4 |
5 |
6 |
7 | Welcome to Chains Invent Insanity 8 |
9 |

10 | Chains Invent Insanity is a 11 | Cards Against Humanity answer card generator.
12 | As the name suggests, it generates cards based on 13 | a Markov Chain 14 | compiled from a wordlist.
15 | This wordlist is comprised of every single (official) answer card ever written for every edition of the game. 16 |

17 |
18 |
19 | ); 20 | -------------------------------------------------------------------------------- /ui/src/Components/Instructions.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Modal, Button } from 'react-bootstrap'; 3 | 4 | export default class Instructions extends Component { 5 | 6 | state = { 7 | isOpen: false 8 | }; 9 | 10 | openModal = () => this.setState({ isOpen: true }); 11 | closeModal = () => this.setState({ isOpen: false }); 12 | 13 | render() { 14 | return ( 15 | <> 16 | 17 | 18 | Instructions/Notes 19 | 20 | 21 |

22 | The markov chain generator will try numerous times to assemble what is meant to pass for a 23 | logical sentence. However, generally speaking, this value SHOULD be above 1000 to avoid an error, 24 | and the default value of 10000 should be fine enough, however if you start seeing duplicate cards, 25 | you may want to increase this number. 26 |

27 |

28 | Additionally, you can pick the number of cards you'd like to generate.

29 |

30 |
31 | 32 | 35 | 36 |
37 | 38 | ); 39 | }; 40 | }; 41 | 42 | // export const Instructions = () => ( 43 | // <> 44 | //

Instructions/Notes

45 | //

46 | // The markov chain generator will try numerous times to assemble what is meant to pass for a 47 | // logical sentence. However, generally speaking, this value SHOULD be above 1000 to avoid an error, 48 | // and the default value of 10000 should be fine enough, however if you start seeing duplicate cards, 49 | // you may want to increase this number. 50 | //

51 | //

52 | // Additionally, you can pick the number of cards you'd like to generate.

53 | //

54 | // 55 | // ); 56 | -------------------------------------------------------------------------------- /ui/src/Components/Layout.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Container, Row, Stack, Col } from 'react-bootstrap'; 3 | import { Outlet } from 'react-router-dom'; 4 | import Title from './Title'; 5 | import { Styles } from './Styles'; 6 | import Navigation from './Navigation'; 7 | import { Footer } from './Footer'; 8 | import { Header } from './Header' 9 | 10 | export const Layout = () => { 11 | return ( 12 | <> 13 | 14 | <Styles> 15 | <div className="body"> 16 | <Stack gap={3}> 17 | <Container fluid="xl"> 18 | <Row> 19 | <Col> 20 | <Navigation /> 21 | </Col> 22 | </Row> 23 | </Container> 24 | {/* <Container fluid="xl"> 25 | <Row></Row> 26 | <Row> 27 | <Col> 28 | <Header /> 29 | </Col> 30 | </Row> 31 | </Container> */} 32 | <Container fluid="xl"> 33 | <div className="vertical-center"> 34 | <Row> 35 | <Outlet /> 36 | </Row> 37 | </div> 38 | </Container> 39 | <Container> 40 | <Row> 41 | <Footer /> 42 | </Row> 43 | </Container> 44 | </Stack> 45 | </div> 46 | </Styles> 47 | </> 48 | ); 49 | }; 50 | -------------------------------------------------------------------------------- /ui/src/Components/Navigation.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Navbar, Nav, Container, Row, Col, Modal, Button } from 'react-bootstrap'; 3 | 4 | export default class Navigation extends Component { 5 | 6 | state = { 7 | isOpen: false 8 | }; 9 | 10 | openModal = () => this.setState({ isOpen: true }); 11 | closeModal = () => this.setState({ isOpen: false }); 12 | 13 | render() { 14 | return ( 15 | <> 16 | <Modal 17 | aria-labelledby="contained-modal-title-vcenter" 18 | centered 19 | show={this.state.isOpen} 20 | onHide={this.closeModal} 21 | > 22 | <Modal.Header closeButton> 23 | <Modal.Title><h3>Instructions/Notes</h3></Modal.Title> 24 | </Modal.Header> 25 | <Modal.Body> 26 | <p> 27 | The markov chain generator will try numerous times to assemble what is meant to pass for a 28 | logical sentence. However, generally speaking, this value SHOULD be above 1000 to avoid an error, 29 | and the default value of 10000 should be fine enough, however if you start seeing duplicate cards, 30 | you may want to increase this number. 31 | </p> 32 | <p> 33 | Additionally, you can pick the number of cards you'd like to generate. 34 | </p> 35 | </Modal.Body> 36 | <Modal.Footer> 37 | <Button variant="secondary" onClick={this.closeModal}> 38 | Close 39 | </Button> 40 | </Modal.Footer> 41 | </Modal> 42 | 43 | <Container fluid="xxl"> 44 | <Row> 45 | <Col></Col> 46 | <Col> 47 | <Navbar fixed="top"> 48 | <Container> 49 | <Navbar.Brand href="/"> 50 | <img 51 | src="https://chains-invent-insanity-assets.sfo3.digitaloceanspaces.com/images/Icon%20Black.png" 52 | className='navbar-brand-logo' 53 | alt="Chains Invent Insanity" 54 | /> 55 | </Navbar.Brand> 56 | <Navbar.Collapse id="basic-navbar-nav"> 57 | <Nav className="ml-auto"> 58 | <Nav.Link href="/">Home</Nav.Link> 59 | <Nav.Link href="/about">Why??</Nav.Link> 60 | <Nav.Link onClick={this.openModal}>Instructions</Nav.Link> 61 | <Nav.Link href="/invent">Invent</Nav.Link> 62 | <Nav.Link href="http://localhost:8000/apidocs" target="_blank">API</Nav.Link> 63 | </Nav> 64 | </Navbar.Collapse> 65 | </Container> 66 | </Navbar> 67 | </Col> 68 | </Row> 69 | </Container> 70 | </> 71 | ); 72 | } 73 | }; 74 | -------------------------------------------------------------------------------- /ui/src/Components/Styles.js: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Styles = styled.div` 4 | html { 5 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 6 | } 7 | .body { 8 | color: white; 9 | } 10 | 11 | .jumbotron { 12 | background-color: lightgray; 13 | color: black; 14 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 15 | padding: 20px; 16 | padding-left: 50px; 17 | border-radius: 10px; 18 | } 19 | 20 | .jumbotron a { 21 | text-decoration: none; 22 | color: #555; 23 | } 24 | 25 | h1 { 26 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 27 | font-weight: bold; 28 | } 29 | 30 | h3 { 31 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 32 | font-weight: bold; 33 | } 34 | 35 | p { 36 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 37 | font-weight: bold; 38 | } 39 | 40 | hr { 41 | border-color: #ffffff; 42 | } 43 | 44 | .text-muted { 45 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 46 | } 47 | 48 | .form-label { 49 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 50 | } 51 | 52 | .form-control { 53 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 54 | } 55 | 56 | button { 57 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 58 | font-weight: bold; 59 | } 60 | 61 | .vertical-center { 62 | display: flex; 63 | justify-content: center; 64 | align-items: center; 65 | margin-top: 100px; 66 | } 67 | 68 | .modal-title { 69 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 70 | font-weight: bold; 71 | } 72 | 73 | .modal-body p { 74 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 75 | font-weight: bold; 76 | } 77 | 78 | .navbar-brand-logo { 79 | width: 50px; 80 | height: auto; 81 | } 82 | 83 | .nav-link { 84 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 85 | font-weight: bold; 86 | font-size: 36px; 87 | color: white !important; 88 | text-decoration: none; 89 | margin-left: 16px; 90 | } 91 | 92 | .section-title { 93 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 94 | font-weight: bold; 95 | padding-top: 25px; 96 | } 97 | 98 | .page-footer { 99 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 100 | font-weight: bold; 101 | background-color: black; 102 | color: gray; 103 | } 104 | 105 | .page-footer a { 106 | text-decoration: none; 107 | color: white; 108 | } 109 | 110 | .img-fluid { 111 | height: 70px; 112 | padding: 10px; 113 | } 114 | 115 | .cah_card { 116 | position: relative; 117 | float: left; 118 | width: 225px; 119 | height: 315px; 120 | padding: 1em; 121 | margin: .5em; 122 | background: white; 123 | border: .1em black solid; 124 | border-radius: 1em; 125 | background-image: url("https://chains-invent-insanity-assets.sfo3.digitaloceanspaces.com/images/Answer%20Card.svg"); 126 | background-size: cover; 127 | background-repeat: no-repeat; 128 | } 129 | 130 | .cah_card p { 131 | color: black; 132 | font-weight: bold; 133 | font-size: 16px; 134 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 135 | line-height: 1.6em; 136 | margin-top: 0; 137 | } 138 | 139 | .cah_card_inverted { 140 | position: relative; 141 | float: left; 142 | width: 225px; 143 | height: 315px; 144 | padding: 1em; 145 | margin: .5em; 146 | background: black; 147 | border: .1em white solid; 148 | border-radius: 1em; 149 | background-image: url("https://chains-invent-insanity-assets.sfo3.digitaloceanspaces.com/images/Question%20Card.svg"); 150 | background-size: cover; 151 | background-repeat: no-repeat; 152 | } 153 | 154 | .cah_card_inverted p { 155 | color: white; 156 | font-weight: bold; 157 | font-size: 16px; 158 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 159 | line-height: 1.6em; 160 | margin-top: 0; 161 | } 162 | 163 | .cah_card .cahlogo { 164 | position: absolute; 165 | bottom: 0.05em; 166 | left: 0em; 167 | } 168 | `; 169 | -------------------------------------------------------------------------------- /ui/src/Components/Title.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { HelmetProvider, Helmet } from 'react-helmet-async'; 3 | 4 | export default class Title extends Component { 5 | render() { 6 | return ( 7 | <HelmetProvider> 8 | <Helmet bodyAttributes={{style: 'background-color : #000000'}}> 9 | <meta charset="utf-8" /> 10 | <meta name="viewport" content="width=device-width, initial-scale=1" /> 11 | <meta name="theme-color" content="#000000" /> 12 | <meta name="description" content="Cards Against Humanity Generator" /> 13 | <title>Chains Invent Insanity 14 | 15 | 16 | 22 | 23 | 24 | ); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /ui/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | background-color: black; 9 | color: white; 10 | } 11 | 12 | .container { 13 | background-color: black; 14 | color: white; 15 | } 16 | 17 | code { 18 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 19 | monospace; 20 | } 21 | -------------------------------------------------------------------------------- /ui/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App.js'; 5 | import 'bootstrap/dist/css/bootstrap.min.css'; 6 | import ReactGA from 'react-ga'; 7 | import reportWebVitals from './reportWebVitals'; 8 | 9 | ReactGA.initialize(process.env.GA_PROPERTY_ID); 10 | ReactGA.pageview(window.location.pathname + window.location.search); 11 | 12 | ReactDOM.render( 13 | 14 | 15 | , 16 | document.getElementById('root') 17 | ); 18 | 19 | // If you want to start measuring performance in your app, pass a function 20 | // to log results (for example: reportWebVitals(console.log)) 21 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 22 | reportWebVitals(); 23 | -------------------------------------------------------------------------------- /ui/src/pages/404.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Container, Row, Col } from 'react-bootstrap'; 3 | 4 | export const FourOhFour = () => ( 5 | 6 | 7 |
8 | 9 |
10 |

11 | What happens when you go to a page that doesn't exist? 12 |

13 |
14 | 15 | 16 |
17 |

18 | A Pithy 404 Error Message. 19 |

20 |
21 | 22 |
23 |
24 |
25 | ) 26 | -------------------------------------------------------------------------------- /ui/src/pages/About.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Container, Row, Col } from 'react-bootstrap'; 3 | import { Explainer } from '../Components/Explainer'; 4 | 5 | export default class About extends Component { 6 | render() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | }; 13 | }; 14 | -------------------------------------------------------------------------------- /ui/src/pages/Home.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Container, Row, Col } from 'react-bootstrap'; 3 | import { Header } from '../Components/Header'; 4 | import { Explainer } from '../Components/Explainer'; 5 | import Controls from '../Components/Controls'; 6 | import { Cards } from '../Components/Cards'; 7 | 8 | export default class Home extends Component { 9 | render() { 10 | return( 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | jibby jabby 27 | {formData} 28 | 29 | 30 | 31 | 32 | ); 33 | } 34 | } 35 | 36 | // export default function Home() { 37 | 38 | // // const baseUrl = `http://localhost:8000/api/v1/answer?num_cards=1&attempts=10000`; 39 | 40 | // // const [post, setPost] = React.useState(null); 41 | 42 | // // React.useEffect(() => { 43 | // // axios.get(baseUrl).then((response) => { 44 | // // setPost(response.data); 45 | // // }); 46 | // // }, []); 47 | 48 | // // if (!post) return null; 49 | 50 | // }; 51 | -------------------------------------------------------------------------------- /ui/src/pages/Invent.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Container, Row, Col } from 'react-bootstrap'; 3 | import { Header } from '../Components/Header'; 4 | import Controls from '../Components/Controls'; 5 | import { Cards } from '../Components/Cards'; 6 | 7 | export default class Home extends Component { 8 | render() { 9 | return( 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | jibby jabby 19 | {post.answer} 20 | 21 | 22 | 23 | 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /ui/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /ui/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | --------------------------------------------------------------------------------