From f39fd729a87a2bf7194bff13d23396d28d3585e9 Mon Sep 17 00:00:00 2001 From: Justin Flannery Date: Thu, 26 Dec 2024 12:46:16 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B9=20remove=20lunchable=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE.md | 16 - .github/dependabot.yaml | 29 - .github/labels.yaml | 65 - .github/release-drafter.yaml | 35 - .github/semantic_release/package-lock.json | 12494 ---------------- .github/semantic_release/package.json | 9 - .github/semantic_release/release_notes.hbs | 93 - .github/workflows/docker.yaml | 43 - .github/workflows/labeler.yaml | 45 - .github/workflows/lint.yaml | 45 - .github/workflows/matchers/flake8.json | 16 - .github/workflows/matchers/mypy.json | 16 - .github/workflows/matchers/python.json | 18 - .github/workflows/publish.yaml | 76 - .github/workflows/release.yaml | 78 - .github/workflows/tests.yaml | 60 - .pre-commit-config.yaml | 16 - Dockerfile | 22 - docker-compose.yaml | 12 - docs/cli.md | 12 - docs/contributing.md | 189 - docs/gen_pages.py | 36 - docs/interacting.md | 73 - docs/plugins.md | 206 - docs/static/lunchable.png | Bin 124987 -> 0 bytes docs/usage.md | 128 - lunchable/__init__.py | 24 - lunchable/__main__.py | 8 - lunchable/_cli.py | 193 - lunchable/_config/__init__.py | 8 - lunchable/_config/api_config.py | 165 - lunchable/_config/file_config.py | 18 - lunchable/_config/logging_config.py | 79 - lunchable/_version.py | 8 - lunchable/exceptions.py | 29 - lunchable/models/__init__.py | 37 - lunchable/models/_base.py | 19 - lunchable/models/_core.py | 373 - lunchable/models/_descriptions.py | 719 - lunchable/models/_lunchmoney.py | 71 - lunchable/models/assets.py | 251 - lunchable/models/budgets.py | 215 - lunchable/models/categories.py | 488 - lunchable/models/crypto.py | 144 - lunchable/models/plaid_accounts.py | 139 - lunchable/models/recurring_expenses.py | 140 - lunchable/models/recurring_items.py | 190 - lunchable/models/tags.py | 62 - lunchable/models/transactions.py | 963 -- lunchable/models/user.py | 61 - lunchable/plugins/__init__.py | 10 - lunchable/plugins/app.py | 398 - lunchable/py.typed | 0 mkdocs.yaml | 82 - pyproject.toml | 240 - requirements.txt | 117 - requirements/requirements-all.py3.10.txt | 160 - requirements/requirements-all.py3.11.txt | 151 - requirements/requirements-all.py3.12.txt | 151 - requirements/requirements-all.py3.8.txt | 164 - requirements/requirements-all.py3.9.txt | 160 - requirements/requirements-docs.txt | 294 - requirements/requirements-lint.txt | 34 - requirements/requirements-test.txt | 209 - tests/__init__.py | 3 - tests/conftest.py | 176 - tests/models/cassettes/test_204_response.yaml | 52 - .../cassettes/test_add_to_category_group.yaml | 52 - ...t_create_and_delete_transaction_group.yaml | 102 - tests/models/cassettes/test_create_asset.yaml | 52 - .../cassettes/test_create_category.yaml | 52 - .../cassettes/test_create_category_group.yaml | 52 - .../models/cassettes/test_delete_budget.yaml | 52 - .../cassettes/test_delete_category.yaml | 52 - .../cassettes/test_delete_category_force.yaml | 52 - tests/models/cassettes/test_get_assets.yaml | 50 - tests/models/cassettes/test_get_budgets.yaml | 52 - .../models/cassettes/test_get_categories.yaml | 52 - .../test_get_categories_flattened.yaml | 54 - .../cassettes/test_get_categories_nested.yaml | 54 - tests/models/cassettes/test_get_category.yaml | 50 - tests/models/cassettes/test_get_crypto.yaml | 50 - .../cassettes/test_get_plaid_accounts.yaml | 52 - .../test_get_recurring_expenses.yaml | 52 - .../cassettes/test_get_recurring_items.yaml | 54 - tests/models/cassettes/test_get_tags.yaml | 52 - .../cassettes/test_get_transaction.yaml | 54 - .../cassettes/test_get_transaction_group.yaml | 54 - .../cassettes/test_get_transactions.yaml | 54 - .../test_get_transactions_no_paginate.yaml | 54 - .../test_get_uncleared_transactions.yaml | 54 - tests/models/cassettes/test_get_user.yaml | 50 - .../cassettes/test_insert_transactions.yaml | 52 - .../cassettes/test_split_transaction.yaml | 106 - .../test_trigger_fetch_from_plaid.yaml | 54 - .../cassettes/test_unsplit_transaction.yaml | 46 - tests/models/cassettes/test_update_asset.yaml | 52 - .../cassettes/test_update_category.yaml | 52 - .../models/cassettes/test_update_crypto.yaml | 52 - .../cassettes/test_update_transaction.yaml | 54 - .../models/cassettes/test_upsert_budget.yaml | 52 - tests/models/test_assets.py | 83 - tests/models/test_budgets.py | 58 - tests/models/test_categories.py | 130 - tests/models/test_crypto.py | 33 - tests/models/test_plaid_accounts.py | 32 - tests/models/test_recurring_expenses.py | 31 - tests/models/test_recurring_items.py | 28 - tests/models/test_tags.py | 23 - tests/models/test_transactions.py | 185 - tests/models/test_user.py | 22 - tests/test_cli.py | 38 - 112 files changed, 23178 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md delete mode 100644 .github/dependabot.yaml delete mode 100644 .github/labels.yaml delete mode 100644 .github/release-drafter.yaml delete mode 100644 .github/semantic_release/package-lock.json delete mode 100644 .github/semantic_release/package.json delete mode 100644 .github/semantic_release/release_notes.hbs delete mode 100644 .github/workflows/docker.yaml delete mode 100644 .github/workflows/labeler.yaml delete mode 100644 .github/workflows/lint.yaml delete mode 100644 .github/workflows/matchers/flake8.json delete mode 100644 .github/workflows/matchers/mypy.json delete mode 100644 .github/workflows/matchers/python.json delete mode 100644 .github/workflows/publish.yaml delete mode 100644 .github/workflows/release.yaml delete mode 100644 .github/workflows/tests.yaml delete mode 100644 Dockerfile delete mode 100644 docker-compose.yaml delete mode 100644 docs/cli.md delete mode 100644 docs/contributing.md delete mode 100644 docs/gen_pages.py delete mode 100644 docs/interacting.md delete mode 100644 docs/plugins.md delete mode 100644 docs/static/lunchable.png delete mode 100644 docs/usage.md delete mode 100644 lunchable/__init__.py delete mode 100644 lunchable/__main__.py delete mode 100644 lunchable/_cli.py delete mode 100644 lunchable/_config/__init__.py delete mode 100644 lunchable/_config/api_config.py delete mode 100644 lunchable/_config/file_config.py delete mode 100644 lunchable/_config/logging_config.py delete mode 100644 lunchable/_version.py delete mode 100644 lunchable/exceptions.py delete mode 100644 lunchable/models/__init__.py delete mode 100644 lunchable/models/_base.py delete mode 100644 lunchable/models/_core.py delete mode 100644 lunchable/models/_descriptions.py delete mode 100644 lunchable/models/_lunchmoney.py delete mode 100644 lunchable/models/assets.py delete mode 100644 lunchable/models/budgets.py delete mode 100644 lunchable/models/categories.py delete mode 100644 lunchable/models/crypto.py delete mode 100644 lunchable/models/plaid_accounts.py delete mode 100644 lunchable/models/recurring_expenses.py delete mode 100644 lunchable/models/recurring_items.py delete mode 100644 lunchable/models/tags.py delete mode 100644 lunchable/models/transactions.py delete mode 100644 lunchable/models/user.py delete mode 100644 lunchable/plugins/__init__.py delete mode 100644 lunchable/plugins/app.py delete mode 100644 lunchable/py.typed delete mode 100644 mkdocs.yaml delete mode 100644 pyproject.toml delete mode 100644 requirements.txt delete mode 100644 requirements/requirements-all.py3.10.txt delete mode 100644 requirements/requirements-all.py3.11.txt delete mode 100644 requirements/requirements-all.py3.12.txt delete mode 100644 requirements/requirements-all.py3.8.txt delete mode 100644 requirements/requirements-all.py3.9.txt delete mode 100644 requirements/requirements-docs.txt delete mode 100644 requirements/requirements-lint.txt delete mode 100644 requirements/requirements-test.txt delete mode 100644 tests/__init__.py delete mode 100644 tests/conftest.py delete mode 100644 tests/models/cassettes/test_204_response.yaml delete mode 100644 tests/models/cassettes/test_add_to_category_group.yaml delete mode 100644 tests/models/cassettes/test_create_and_delete_transaction_group.yaml delete mode 100644 tests/models/cassettes/test_create_asset.yaml delete mode 100644 tests/models/cassettes/test_create_category.yaml delete mode 100644 tests/models/cassettes/test_create_category_group.yaml delete mode 100644 tests/models/cassettes/test_delete_budget.yaml delete mode 100644 tests/models/cassettes/test_delete_category.yaml delete mode 100644 tests/models/cassettes/test_delete_category_force.yaml delete mode 100644 tests/models/cassettes/test_get_assets.yaml delete mode 100644 tests/models/cassettes/test_get_budgets.yaml delete mode 100644 tests/models/cassettes/test_get_categories.yaml delete mode 100644 tests/models/cassettes/test_get_categories_flattened.yaml delete mode 100644 tests/models/cassettes/test_get_categories_nested.yaml delete mode 100644 tests/models/cassettes/test_get_category.yaml delete mode 100644 tests/models/cassettes/test_get_crypto.yaml delete mode 100644 tests/models/cassettes/test_get_plaid_accounts.yaml delete mode 100644 tests/models/cassettes/test_get_recurring_expenses.yaml delete mode 100644 tests/models/cassettes/test_get_recurring_items.yaml delete mode 100644 tests/models/cassettes/test_get_tags.yaml delete mode 100644 tests/models/cassettes/test_get_transaction.yaml delete mode 100644 tests/models/cassettes/test_get_transaction_group.yaml delete mode 100644 tests/models/cassettes/test_get_transactions.yaml delete mode 100644 tests/models/cassettes/test_get_transactions_no_paginate.yaml delete mode 100644 tests/models/cassettes/test_get_uncleared_transactions.yaml delete mode 100644 tests/models/cassettes/test_get_user.yaml delete mode 100644 tests/models/cassettes/test_insert_transactions.yaml delete mode 100644 tests/models/cassettes/test_split_transaction.yaml delete mode 100644 tests/models/cassettes/test_trigger_fetch_from_plaid.yaml delete mode 100644 tests/models/cassettes/test_unsplit_transaction.yaml delete mode 100644 tests/models/cassettes/test_update_asset.yaml delete mode 100644 tests/models/cassettes/test_update_category.yaml delete mode 100644 tests/models/cassettes/test_update_crypto.yaml delete mode 100644 tests/models/cassettes/test_update_transaction.yaml delete mode 100644 tests/models/cassettes/test_upsert_budget.yaml delete mode 100644 tests/models/test_assets.py delete mode 100644 tests/models/test_budgets.py delete mode 100644 tests/models/test_categories.py delete mode 100644 tests/models/test_crypto.py delete mode 100644 tests/models/test_plaid_accounts.py delete mode 100644 tests/models/test_recurring_expenses.py delete mode 100644 tests/models/test_recurring_items.py delete mode 100644 tests/models/test_tags.py delete mode 100644 tests/models/test_transactions.py delete mode 100644 tests/models/test_user.py delete mode 100644 tests/test_cli.py diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 4c477ebc..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,16 +0,0 @@ -- lunchable version: -- Python version: -- Operating System: - -### Description - -Describe what you were trying to get done. - -Tell us what happened, what went wrong, and what you expected to happen. - -### What I Did - -``` -Paste the command(s) you ran and the output. -If there was a crash, please include the traceback here. -``` diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml deleted file mode 100644 index 43cef5d9..00000000 --- a/.github/dependabot.yaml +++ /dev/null @@ -1,29 +0,0 @@ -version: 2 -updates: -- package-ecosystem: github-actions - directory: / - schedule: - interval: monthly - labels: - - dependencies -- package-ecosystem: pip - directory: /.github/workflows - schedule: - interval: monthly - labels: - - dependencies -- package-ecosystem: pip - directory: /docs - schedule: - interval: monthly - labels: - - dependencies -- package-ecosystem: pip - directory: / - schedule: - interval: monthly - versioning-strategy: lockfile-only - allow: - - dependency-type: all - labels: - - dependencies diff --git a/.github/labels.yaml b/.github/labels.yaml deleted file mode 100644 index 87595b77..00000000 --- a/.github/labels.yaml +++ /dev/null @@ -1,65 +0,0 @@ -# The repository labels will be automatically configured using this file and -# the GitHub Action https://github.com/marketplace/actions/github-labeler. -- name: breaking - description: Breaking Changes - color: bfd4f2 -- name: bug - description: Something isn't working - color: d73a4a -- name: build - description: Build System and Dependencies - color: bfdadc -- name: ci - description: Continuous Integration - color: 4a97d6 -- name: dependencies - description: Pull requests that update a dependency file - color: 0366d6 -- name: documentation - description: Improvements or additions to documentation - color: 0075ca -- name: duplicate - description: This issue or pull request already exists - color: cfd3d7 -- name: enhancement - description: New feature or request - color: a2eeef -- name: github_actions - description: Pull requests that update Github_actions code - color: '000000' -- name: good first issue - description: Good for newcomers - color: 7057ff -- name: help wanted - description: Extra attention is needed - color: 008672 -- name: invalid - description: This doesn't seem right - color: e4e669 -- name: performance - description: Performance - color: '016175' -- name: python - description: Pull requests that update Python code - color: 2b67c6 -- name: question - description: Further information is requested - color: d876e3 -- name: refactoring - description: Refactoring - color: ef67c4 -- name: removal - description: Removals and Deprecations - color: 9ae7ea -- name: style - description: Style - color: c120e5 -- name: testing - description: Testing - color: b1fc6f -- name: wontfix - description: This will not be worked on - color: ffffff -- name: triage - description: This will looked at - color: 68bd3b diff --git a/.github/release-drafter.yaml b/.github/release-drafter.yaml deleted file mode 100644 index ca504b14..00000000 --- a/.github/release-drafter.yaml +++ /dev/null @@ -1,35 +0,0 @@ -name-template: v$RESOLVED_VERSION 🌈 -tag-template: v$RESOLVED_VERSION -categories: -- title: ':boom: Breaking Changes' - label: breaking -- title: ':rocket: Features' - label: enhancement -- title: ':fire: Removals and Deprecations' - label: removal -- title: ':beetle: Fixes' - label: bug -- title: ':racehorse: Performance' - label: performance -- title: ':rotating_light: Testing' - label: testing -- title: ':construction_worker: Continuous Integration' - label: ci -- title: ':books: Documentation' - label: documentation -- title: ':hammer: Refactoring' - label: refactoring -- title: ':lipstick: Style' - label: style -- title: ':package: Dependencies' - labels: - - dependencies - - build -exclude-labels: -- skip-changelog -change-template: '- $TITLE @$AUTHOR (#$NUMBER)' -change-title-escapes: \<*_& -template: | - ## Changes - - $CHANGES diff --git a/.github/semantic_release/package-lock.json b/.github/semantic_release/package-lock.json deleted file mode 100644 index 15442d1a..00000000 --- a/.github/semantic_release/package-lock.json +++ /dev/null @@ -1,12494 +0,0 @@ -{ - "name": "semantic_release", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "devDependencies": { - "@semantic-release/exec": "^6.0.3", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^8.0.7", - "semantic-release": "^21.0.1", - "semantic-release-gitmoji": "^1.6.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", - "dev": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.1.0.tgz", - "integrity": "sha512-+m6+376kp4gZAYtg64aXGHK2qM2LtIiZctqtbTnETdUaD7OSuX7zDV5kciqw1QIN13lg9jWz039OF7NZUdYEeQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", - "dev": true, - "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/types": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.1.0.tgz", - "integrity": "sha512-MPKlN20dSKZ2JGV8KHNO4Y9z6xs74p5sQ2a5++5/uVme44K/5UEntIpai2n1WIrVtMlafYLdfN27BiBs2taY6g==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^16.1.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.1.tgz", - "integrity": "sha512-yfRcuupmxxeDOSxvw4g+wFCrGiPD0L32f5WMzqMXp7Rl93EOCdFiDcaSNnZ10Up9GdNqkj70UTa8hfhPFphaZA==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/exec": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz", - "integrity": "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "parse-json": "^5.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/git": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", - "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/github": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz", - "integrity": "sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==", - "dev": true, - "dependencies": { - "@octokit/rest": "^19.0.0", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/npm": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.3.tgz", - "integrity": "sha512-Chbv3kX4o+y+r1X6hsqBVB8NFbSVfiNlYOqMG6o9Wc8r5Y4cjxfbaMCuJ++XAtw3YXYX/NVD05cPzBi4Orjusg==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^4.0.1", - "execa": "^7.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^9.5.0", - "rc": "^1.2.8", - "read-pkg": "^8.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@semantic-release/npm/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/env-ci": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-9.0.0.tgz", - "integrity": "sha512-Q3cjr1tX9xwigprw4G8M3o7PIOO/1LYji6TyGsbD1WfMmD23etZvhgmPXJqkP788yH4dgSSK7oaIMuaayUJIfg==", - "dev": true, - "dependencies": { - "execa": "^7.0.0", - "java-properties": "^1.0.2" - }, - "engines": { - "node": "^16.14 || >=18" - } - }, - "node_modules/env-ci/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/env-ci/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/env-ci/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", - "dev": true, - "dependencies": { - "semver-regex": "^4.0.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dev": true, - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", - "dev": true, - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/gitmojis": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/gitmojis/-/gitmojis-3.13.4.tgz", - "integrity": "sha512-TRYhqnD36Xs9GHuATVRmo7hzBb+6wXYC0zxBFvLs3nma7N1WQGWW2vPTQ0+3GsGcPwSp0XVGfe3Besn4a6ip5Q==", - "dev": true - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/issue-regex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-3.1.0.tgz", - "integrity": "sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", - "dev": true, - "dependencies": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.5.tgz", - "integrity": "sha512-0SYs9lz1ND7V3+Lz6EbsnUdZ4OxjQOHbaIKdWd8OgsbZ2hCC2ZeiXMEaBEPEVBaILW+huFA0pJ1YME+52iZI5g==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.2.8", - "@npmcli/config": "^6.1.6", - "@npmcli/map-workspaces": "^3.0.3", - "@npmcli/package-json": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.0.5", - "chalk": "^4.1.2", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.1", - "glob": "^9.3.2", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.0", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.16", - "libnpmexec": "^5.0.16", - "libnpmfund": "^4.0.16", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.3", - "libnpmpack": "^5.0.16", - "libnpmpublish": "^7.1.3", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.0", - "minimatch": "^7.4.6", - "minipass": "^4.2.8", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.3.1", - "nopt": "^7.1.0", - "npm-audit-report": "^4.0.0", - "npm-install-checks": "^6.1.1", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.4", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.1.1", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "read-package-json": "^6.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.5.0", - "ssri": "^10.0.3", - "tar": "^6.1.13", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.0", - "write-file-atomic": "^5.0.0" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "6.2.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^3.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^7.4.2", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "6.1.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^9.3.1", - "minimatch": "^7.4.2", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^7.4.6" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "17.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^9.3.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "3.8.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "9.3.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "6.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^7.4.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.11.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "5.0.16", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^7.4.2", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "5.0.16", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/run-script": "^6.0.0", - "chalk": "^4.1.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "4.0.16", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.8" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "9.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "5.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "5.0.16", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "7.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.0.0", - "ssri": "^10.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "5.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.18.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "11.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "7.4.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "4.2.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.3.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { - "version": "16.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "10.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "7.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "8.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "14.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "15.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.6.3", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^9.3.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.5.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/sigstore": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.13", - "dev": true, - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "10.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.13", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-pkg/node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.8.0.tgz", - "integrity": "sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/semantic-release": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-21.0.1.tgz", - "integrity": "sha512-UhGxTUXHJQCBFgEQRZszLOHDpMduDSHGq3Q+30Bu+g0GbXh/EW508+kuFHezP5m0mN8xINW8hooiR3dzSV5ZLA==", - "dev": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^10.0.2", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^4.0.1", - "cosmiconfig": "^8.0.0", - "debug": "^4.0.0", - "env-ci": "^9.0.0", - "execa": "^7.0.0", - "figures": "^5.0.0", - "find-versions": "^5.1.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^6.0.0", - "lodash-es": "^4.17.21", - "marked": "^4.1.0", - "marked-terminal": "^5.1.1", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-pkg-up": "^9.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^4.0.0", - "signale": "^1.2.1", - "yargs": "^17.5.1" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/semantic-release-gitmoji": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/semantic-release-gitmoji/-/semantic-release-gitmoji-1.6.4.tgz", - "integrity": "sha512-mPkeKGKXlqKhWrlzi3mgRogTKnzOJAakrCdfBrgpG7z7WiP8sZ6pZP5Su+IJbj1RWbNBier/isVzvwE5RhozbQ==", - "dev": true, - "dependencies": { - "dateformat": "^3.0.3", - "debug": "^4.3.2", - "emoji-regex": "^9.2.2", - "git-url-parse": "^13.0.0", - "gitmojis": "^3.13.4", - "handlebars": "^4.7.6", - "issue-regex": "^3.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.mergewith": "^4.6.2", - "lodash.uniq": "^4.5.0", - "node-emoji": "^1.11.0" - }, - "peerDependencies": { - "semantic-release": "<22" - } - }, - "node_modules/semantic-release/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/semantic-release/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/semantic-release/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", - "dev": true, - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0" - } - }, - "@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", - "dev": true, - "requires": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", - "dev": true, - "requires": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.1.0.tgz", - "integrity": "sha512-+m6+376kp4gZAYtg64aXGHK2qM2LtIiZctqtbTnETdUaD7OSuX7zDV5kciqw1QIN13lg9jWz039OF7NZUdYEeQ==", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", - "dev": true, - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", - "dev": true, - "requires": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" - } - }, - "@octokit/types": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.1.0.tgz", - "integrity": "sha512-MPKlN20dSKZ2JGV8KHNO4Y9z6xs74p5sQ2a5++5/uVme44K/5UEntIpai2n1WIrVtMlafYLdfN27BiBs2taY6g==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^16.1.0" - } - }, - "@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true - }, - "@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "requires": { - "graceful-fs": "4.2.10" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - } - } - }, - "@pnpm/npm-conf": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.1.tgz", - "integrity": "sha512-yfRcuupmxxeDOSxvw4g+wFCrGiPD0L32f5WMzqMXp7Rl93EOCdFiDcaSNnZ10Up9GdNqkj70UTa8hfhPFphaZA==", - "dev": true, - "requires": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - } - }, - "@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true - }, - "@semantic-release/exec": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz", - "integrity": "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "parse-json": "^5.0.0" - } - }, - "@semantic-release/git": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", - "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - } - }, - "@semantic-release/github": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz", - "integrity": "sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==", - "dev": true, - "requires": { - "@octokit/rest": "^19.0.0", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - } - }, - "@semantic-release/npm": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.3.tgz", - "integrity": "sha512-Chbv3kX4o+y+r1X6hsqBVB8NFbSVfiNlYOqMG6o9Wc8r5Y4cjxfbaMCuJ++XAtw3YXYX/NVD05cPzBi4Orjusg==", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^4.0.1", - "execa": "^7.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^9.5.0", - "rc": "^1.2.8", - "read-pkg": "^8.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "dependencies": { - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } - } - }, - "@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "requires": { - "type-fest": "^1.0.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "dev": true, - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "requires": { - "type-fest": "^1.0.1" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "env-ci": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-9.0.0.tgz", - "integrity": "sha512-Q3cjr1tX9xwigprw4G8M3o7PIOO/1LYji6TyGsbD1WfMmD23etZvhgmPXJqkP788yH4dgSSK7oaIMuaayUJIfg==", - "dev": true, - "requires": { - "execa": "^7.0.0", - "java-properties": "^1.0.2" - }, - "dependencies": { - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "requires": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", - "dev": true, - "requires": { - "semver-regex": "^4.0.5" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dev": true, - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "requires": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", - "dev": true, - "requires": { - "git-up": "^7.0.0" - } - }, - "gitmojis": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/gitmojis/-/gitmojis-3.13.4.tgz", - "integrity": "sha512-TRYhqnD36Xs9GHuATVRmo7hzBb+6wXYC0zxBFvLs3nma7N1WQGWW2vPTQ0+3GsGcPwSp0XVGfe3Besn4a6ip5Q==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", - "dev": true - }, - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "requires": { - "protocols": "^2.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - } - }, - "issue-regex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-3.1.0.tgz", - "integrity": "sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==", - "dev": true - }, - "java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true - }, - "marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", - "dev": true, - "requires": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "dependencies": { - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - } - } - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true - }, - "npm": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.5.tgz", - "integrity": "sha512-0SYs9lz1ND7V3+Lz6EbsnUdZ4OxjQOHbaIKdWd8OgsbZ2hCC2ZeiXMEaBEPEVBaILW+huFA0pJ1YME+52iZI5g==", - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.2.8", - "@npmcli/config": "^6.1.6", - "@npmcli/map-workspaces": "^3.0.3", - "@npmcli/package-json": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.0.5", - "chalk": "^4.1.2", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.1", - "glob": "^9.3.2", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.0", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.16", - "libnpmexec": "^5.0.16", - "libnpmfund": "^4.0.16", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.3", - "libnpmpack": "^5.0.16", - "libnpmpublish": "^7.1.3", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.0", - "minimatch": "^7.4.6", - "minipass": "^4.2.8", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.3.1", - "nopt": "^7.1.0", - "npm-audit-report": "^4.0.0", - "npm-install-checks": "^6.1.1", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.4", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.1.1", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "read-package-json": "^6.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.5.0", - "ssri": "^10.0.3", - "tar": "^6.1.13", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.0", - "write-file-atomic": "^5.0.0" - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "@gar/promisify": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "@npmcli/arborist": { - "version": "6.2.8", - "bundled": true, - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^3.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^7.4.2", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - } - }, - "@npmcli/config": { - "version": "6.1.6", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/map-workspaces": "^3.0.2", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - } - }, - "@npmcli/disparity-colors": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - } - }, - "@npmcli/installed-package-contents": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "@npmcli/map-workspaces": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^9.3.1", - "minimatch": "^7.4.2", - "read-package-json-fast": "^3.0.0" - } - }, - "@npmcli/metavuln-calculator": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "@npmcli/node-gyp": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "@npmcli/package-json": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0" - } - }, - "@npmcli/promise-spawn": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "which": "^3.0.0" - } - }, - "@npmcli/query": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "@npmcli/run-script": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - } - }, - "@sigstore/protobuf-specs": { - "version": "0.1.0", - "bundled": true, - "dev": true - }, - "@tootallnate/once": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "@tufjs/canonical-json": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "@tufjs/models": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^7.4.6" - } - }, - "abbrev": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "bundled": true, - "dev": true - }, - "bin-links": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "buffer": { - "version": "6.0.3", - "bundled": true, - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "builtins": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "17.0.5", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^9.3.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "ci-info": { - "version": "3.8.0", - "bundled": true, - "dev": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "cli-columns": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "cli-table3": { - "version": "0.6.3", - "bundled": true, - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clone": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "cmd-shim": { - "version": "6.0.1", - "bundled": true, - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "columnify": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true - } - } - }, - "defaults": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "depd": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "diff": { - "version": "5.1.0", - "bundled": true, - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "dev": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "events": { - "version": "3.3.0", - "bundled": true, - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "bundled": true, - "dev": true - }, - "fs-minipass": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^4.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "gauge": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "9.3.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - } - }, - "graceful-fs": { - "version": "4.2.11", - "bundled": true, - "dev": true - }, - "has": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "6.1.1", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "bundled": true, - "dev": true - }, - "ignore-walk": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "minimatch": "^7.4.2" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "ini": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "init-package-json": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - } - }, - "ip": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true, - "dev": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.11.0", - "bundled": true, - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "json-parse-even-better-errors": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true, - "dev": true - }, - "just-diff": { - "version": "6.0.2", - "bundled": true, - "dev": true - }, - "just-diff-apply": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "libnpmaccess": { - "version": "7.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmdiff": { - "version": "5.0.16", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^7.4.2", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - } - }, - "libnpmexec": { - "version": "5.0.16", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/run-script": "^6.0.0", - "chalk": "^4.1.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - } - }, - "libnpmfund": { - "version": "4.0.16", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^6.2.8" - } - }, - "libnpmhook": { - "version": "9.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmorg": { - "version": "5.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmpack": { - "version": "5.0.16", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - } - }, - "libnpmpublish": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "requires": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.0.0", - "ssri": "^10.0.1" - } - }, - "libnpmsearch": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmteam": { - "version": "5.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmversion": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - } - }, - "lru-cache": { - "version": "7.18.3", - "bundled": true, - "dev": true - }, - "make-fetch-happen": { - "version": "11.1.0", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minimatch": { - "version": "7.4.6", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "4.2.8", - "bundled": true, - "dev": true - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-fetch": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "ms": { - "version": "2.1.3", - "bundled": true, - "dev": true - }, - "mute-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "bundled": true, - "dev": true - }, - "node-gyp": { - "version": "9.3.1", - "bundled": true, - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "@npmcli/fs": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "cacache": { - "version": "16.1.3", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "gauge": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "make-fetch-happen": { - "version": "10.2.1", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "nopt": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "ssri": { - "version": "9.0.1", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "unique-filename": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "which": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "nopt": { - "version": "7.1.0", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "^2.0.0" - } - }, - "normalize-package-data": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-audit-report": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "npm-bundled": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "npm-normalize-package-bin": "^3.0.0" - } - }, - "npm-install-checks": { - "version": "6.1.1", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "npm-package-arg": { - "version": "10.1.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - } - }, - "npm-packlist": { - "version": "7.0.4", - "bundled": true, - "dev": true, - "requires": { - "ignore-walk": "^6.0.0" - } - }, - "npm-pick-manifest": { - "version": "8.0.1", - "bundled": true, - "dev": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - } - }, - "npm-profile": { - "version": "7.0.1", - "bundled": true, - "dev": true, - "requires": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-registry-fetch": { - "version": "14.0.4", - "bundled": true, - "dev": true, - "requires": { - "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-user-validate": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "npmlog": { - "version": "7.0.1", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "15.1.1", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - } - }, - "parse-conflict-json": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-scurry": { - "version": "1.6.3", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "bundled": true, - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "proc-log": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "process": { - "version": "0.11.10", - "bundled": true, - "dev": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-call-limit": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "read": "^2.0.0" - } - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "read": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "mute-stream": "~1.0.0" - } - }, - "read-cmd-shim": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "read-package-json": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "^9.3.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "read-package-json-fast": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "readable-stream": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "7.5.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true, - "dev": true - }, - "sigstore": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" - } - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true, - "dev": true - }, - "socks": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "spdx-correct": { - "version": "3.2.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "bundled": true, - "dev": true - }, - "ssri": { - "version": "10.0.3", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.13", - "bundled": true, - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - } - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "treeverse": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "tuf-js": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "@tufjs/models": "1.0.3", - "make-fetch-happen": "^11.0.1" - } - }, - "unique-filename": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "walk-up-path": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true, - "dev": true - } - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", - "dev": true - }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "requires": { - "p-map": "^2.0.0" - } - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "requires": { - "protocols": "^2.0.0" - } - }, - "parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "requires": { - "parse-path": "^7.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "dependencies": { - "json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true - }, - "lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true - }, - "normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - } - }, - "type-fest": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.8.0.tgz", - "integrity": "sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, - "requires": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - }, - "dependencies": { - "read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - } - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "requires": { - "@pnpm/npm-conf": "^2.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semantic-release": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-21.0.1.tgz", - "integrity": "sha512-UhGxTUXHJQCBFgEQRZszLOHDpMduDSHGq3Q+30Bu+g0GbXh/EW508+kuFHezP5m0mN8xINW8hooiR3dzSV5ZLA==", - "dev": true, - "requires": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^10.0.2", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^4.0.1", - "cosmiconfig": "^8.0.0", - "debug": "^4.0.0", - "env-ci": "^9.0.0", - "execa": "^7.0.0", - "figures": "^5.0.0", - "find-versions": "^5.1.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^6.0.0", - "lodash-es": "^4.17.21", - "marked": "^4.1.0", - "marked-terminal": "^5.1.1", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-pkg-up": "^9.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^4.0.0", - "signale": "^1.2.1", - "yargs": "^17.5.1" - }, - "dependencies": { - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "dev": true - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } - } - }, - "semantic-release-gitmoji": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/semantic-release-gitmoji/-/semantic-release-gitmoji-1.6.4.tgz", - "integrity": "sha512-mPkeKGKXlqKhWrlzi3mgRogTKnzOJAakrCdfBrgpG7z7WiP8sZ6pZP5Su+IJbj1RWbNBier/isVzvwE5RhozbQ==", - "dev": true, - "requires": { - "dateformat": "^3.0.3", - "debug": "^4.3.2", - "emoji-regex": "^9.2.2", - "git-url-parse": "^13.0.0", - "gitmojis": "^3.13.4", - "handlebars": "^4.7.6", - "issue-regex": "^3.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.mergewith": "^4.6.2", - "lodash.uniq": "^4.5.0", - "node-emoji": "^1.11.0" - } - }, - "semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "dependencies": { - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "tempy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", - "dev": true, - "requires": { - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "dependencies": { - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true - }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } - } -} diff --git a/.github/semantic_release/package.json b/.github/semantic_release/package.json deleted file mode 100644 index 7f4b489a..00000000 --- a/.github/semantic_release/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "devDependencies": { - "@semantic-release/exec": "^6.0.3", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^8.0.7", - "semantic-release": "^21.0.1", - "semantic-release-gitmoji": "^1.6.4" - } -} diff --git a/.github/semantic_release/release_notes.hbs b/.github/semantic_release/release_notes.hbs deleted file mode 100644 index e6d68c2b..00000000 --- a/.github/semantic_release/release_notes.hbs +++ /dev/null @@ -1,93 +0,0 @@ -{{#if compareUrl}} -# [v{{nextRelease.version}}]({{compareUrl}}) ({{datetime "UTC:yyyy-mm-dd"}}) -{{else}} -# v{{nextRelease.version}} ({{datetime "UTC:yyyy-mm-dd"}}) -{{/if}} - -{{#with commits}} - -{{#if boom}} -## 💥 Breaking Changes -{{#each boom}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if sparkles}} -## ✨ New Features -{{#each sparkles}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if bug}} -## 🐛 Bug Fixes -{{#each bug}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if ambulance}} -## 🚑 Critical Hotfixes -{{#each ambulance}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if lock}} -## 🔒 Security Issues -{{#each lock}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if arrow_up}} -## ⬆️ Dependency Upgrade -{{#each arrow_up}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if memo}} -## 📝️ Documentation -{{#each memo}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if construction_worker}} -## 👷 CI/CD -{{#each construction_worker}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if white_check_mark}} -## 🧪️ Add / Update / Pass Tests -{{#each white_check_mark}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if test_tube}} -## 🧪️ Add Failing Tests -{{#each test_tube}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if recycle}} -## ♻️Refactoring -{{#each recycle}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if truck}} -## 🚚 Moving/Renaming -{{#each truck}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{/with}} diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml deleted file mode 100644 index 58b58648..00000000 --- a/.github/workflows/docker.yaml +++ /dev/null @@ -1,43 +0,0 @@ -name: Docker CI/CD - -on: - pull_request: - branches: ['**'] - paths: - - lunchable/** - - pyproject.toml - - .github/workflows/docker.yaml - - Dockerfile -jobs: - docker-ci-test: - runs-on: ubuntu-latest - steps: - - name: Set up Github Workspace - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install -q --upgrade pip wheel - python -m pip install -q hatch pre-commit - hatch --version - - name: Declare Version Variable - run: | - PACKAGE_VERSION=$(hatch version) - PACKAGE_NAME=$(hatch project metadata | jq -r .name) - echo PACKAGE_VERSION=${PACKAGE_VERSION} >> $GITHUB_ENV - echo PACKAGE_NAME=${PACKAGE_NAME} >> $GITHUB_ENV - - name: Docker Image Building and Publishing - id: docker_build - uses: docker/build-push-action@v5 - with: - push: false - tags: juftin/${{ env.PACKAGE_NAME }}:latest diff --git a/.github/workflows/labeler.yaml b/.github/workflows/labeler.yaml deleted file mode 100644 index 42edd792..00000000 --- a/.github/workflows/labeler.yaml +++ /dev/null @@ -1,45 +0,0 @@ -name: Labeler - -on: - push: - branches: - - main - issues: - types: [opened] - pull_request: - types: - - opened - - reopened - - synchronize - - labeled - - unlabeled - branches: - - main - -jobs: - label-sync: - if: github.event_name == 'push' - runs-on: ubuntu-latest - steps: - - name: Check out the repository - uses: actions/checkout@v3 - - name: Run Labeler - uses: crazy-max/ghaction-github-labeler@v4.0.0 - with: - yaml-file: .github/labels.yaml - skip-delete: false - dry-run: false - - apply-triage-label: - if: github.event_name == 'issues' - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v6 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['triage'] - }) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml deleted file mode 100644 index 27d62785..00000000 --- a/.github/workflows/lint.yaml +++ /dev/null @@ -1,45 +0,0 @@ -name: Lint - -on: - pull_request: - branches: ['**'] - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - name: Set up Github Workspace - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Set up Python Environment - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install --upgrade pip wheel - python -m pip install -q hatch pre-commit - hatch --version - - name: Lint - id: lint - continue-on-error: true - run: | - echo "::add-matcher::.github/workflows/matchers/flake8.json" - hatch run lint:style - echo "::remove-matcher owner=flake8::" - - name: Type Checking - id: check - continue-on-error: true - run: | - echo "::add-matcher::.github/workflows/matchers/mypy.json" - hatch run lint:typing - echo "::remove-matcher owner=mypy::" - - name: Raise Errors For Failures - if: | - steps.lint.outcome != 'success' || - steps.check.outcome != 'success' - run: | - echo "Lint: ${{ steps.lint.outcome }}" - echo "Check: ${{ steps.check.outcome }}" - exit 1 diff --git a/.github/workflows/matchers/flake8.json b/.github/workflows/matchers/flake8.json deleted file mode 100644 index 52f94e05..00000000 --- a/.github/workflows/matchers/flake8.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "flake8", - "pattern": [ - { - "regexp": "^(.*?):(\\d+):(\\d+): (.*)$", - "file": 1, - "line": 2, - "column": 3, - "message": 4 - } - ] - } - ] -} diff --git a/.github/workflows/matchers/mypy.json b/.github/workflows/matchers/mypy.json deleted file mode 100644 index c1e81a9e..00000000 --- a/.github/workflows/matchers/mypy.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "mypy", - "pattern": [ - { - "regexp": "^(.+):(\\d+):\\s(error|warning|note):\\s(.+)$", - "file": 1, - "line": 2, - "severity": 3, - "message": 4 - } - ] - } - ] -} diff --git a/.github/workflows/matchers/python.json b/.github/workflows/matchers/python.json deleted file mode 100644 index 9c3095c0..00000000 --- a/.github/workflows/matchers/python.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "python", - "pattern": [ - { - "regexp": "^\\s*File\\s\\\"(.*)\\\",\\sline\\s(\\d+),\\sin\\s(.*)$", - "file": 1, - "line": 2 - }, - { - "regexp": "^\\s*raise\\s(.*)\\(\\'(.*)\\'\\)$", - "message": 2 - } - ] - } - ] -} diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml deleted file mode 100644 index 20d083db..00000000 --- a/.github/workflows/publish.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: Publishing - -on: - release: - types: - - published - -jobs: - pypi-publish: - name: PyPI - if: github.repository_owner == 'juftin' - runs-on: ubuntu-latest - environment: - name: pypi - url: https://pypi.org/p/lunchable - permissions: - id-token: write - steps: - - name: Check out the repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install --upgrade pip - python -m pip install -q hatch pre-commit - hatch --version - - name: Build package - run: | - hatch build - - name: Publish package on PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - - docker-hub-publish: - name: docker-hub - if: github.repository_owner == 'juftin' - runs-on: ubuntu-latest - steps: - - name: Check out the repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install -q --upgrade pip wheel - python -m pip install -q hatch pre-commit - hatch --version - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to DockerHub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - name: Declare Version Variable - run: | - PACKAGE_VERSION=$(hatch version) - PACKAGE_NAME=$(hatch project metadata | jq -r .name) - echo PACKAGE_VERSION=${PACKAGE_VERSION} >> $GITHUB_ENV - echo PACKAGE_NAME=${PACKAGE_NAME} >> $GITHUB_ENV - - name: Docker Image Building and Publishing - id: docker_build - uses: docker/build-push-action@v5 - with: - push: true - tags: juftin/${{ env.PACKAGE_NAME }}:latest,juftin/${{ env.PACKAGE_NAME }}:${{ env.PACKAGE_VERSION }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index f6b45290..00000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,78 +0,0 @@ -name: Release -on: - push: - branches: [main, next, beta, alpha, '*.x'] -jobs: - release: - name: Release - if: github.repository_owner == 'juftin' - runs-on: ubuntu-latest - permissions: - contents: write - issues: write - pull-requests: write - steps: - - name: Check out the repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - name: Setup Node.js - uses: actions/setup-node@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install --upgrade pip wheel - python -m pip install -q hatch pre-commit - python -m pip install -q "${{ github.workspace }}" - hatch --version - - name: Release - run: hatch run gen:release - env: - GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - GIT_AUTHOR_NAME: github-actions[bot] - GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com - GIT_COMMITTER_NAME: github-actions[bot] - GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com - - github-pages-publish: - runs-on: ubuntu-latest - needs: release - if: github.ref == 'refs/heads/main' && github.repository_owner == 'juftin' - permissions: - pages: write - id-token: write - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Checkout Latest Changes - uses: actions/checkout@v4 - with: - ref: ${{ github.ref }} - fetch-depth: 0 - - name: Set up Python Environment - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install --upgrade pip wheel - python -m pip install -q hatch pre-commit - python -m pip install -q "${{ github.workspace }}" - hatch --version - - name: Create Virtual Environment - run: hatch env create docs - - name: Build Site - run: hatch run docs:build - - name: Setup GitHub Pages - uses: actions/configure-pages@v4 - - name: Upload Artifact - uses: actions/upload-pages-artifact@v3 - with: - path: site/ - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml deleted file mode 100644 index 69728cf9..00000000 --- a/.github/workflows/tests.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: Tests - -on: - push: - branches: - - main - paths: - - lunchable/** - - pyproject.toml - - .github/workflows/tests.yaml - pull_request: - branches: ['**'] - paths: - - lunchable/** - - pyproject.toml - - .github/workflows/tests.yaml - schedule: - - cron: 0 12 1 * * - workflow_dispatch: -jobs: - test-suite: - runs-on: ubuntu-latest - strategy: - fail-fast: true - matrix: - include: - - {name: Python 3.12, python: '3.12'} - - {name: Python 3.11, python: '3.11'} - - {name: Python 3.10, python: '3.10'} - - {name: Python 3.9, python: '3.9'} - - {name: Python 3.8, python: '3.8'} - concurrency: - group: ${{ github.workflow }}-${{ matrix.python }}-${{ github.ref }} - cancel-in-progress: true - steps: - - name: Set up Github Workspace - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Set up Python Environment ${{ matrix.python }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python }} - - name: Install Hatch - run: | - python -m pip install -q --upgrade pip wheel - python -m pip install -q hatch pre-commit - hatch --version - - name: Test Suite - run: | - echo "::add-matcher::.github/workflows/matchers/python.json" - hatch run +py=${{ matrix.python }} all:cov --cov-report=xml tests - echo "::remove-matcher owner=python::" - env: - VCR_RECORD_MODE: none - - name: Upload coverage reports to Codecov - if: matrix.python == '3.11' - uses: codecov/codecov-action@v3 - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f96ebf94..049eefe8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,19 +34,3 @@ repos: PULL_REQUEST_TEMPLATE.md| .github/semantic_release/release_notes.hbs ) - -- repo: local - hooks: - - id: format - name: format - description: Runs Code Auto-Formatters - entry: hatch run lint:fmt - language: system - pass_filenames: false - - id: lint - name: lint - description: Runs Code Linters - entry: hatch run lint:style - language: system - pass_filenames: false - require_serial: false diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 9c6f02dd..00000000 --- a/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -ARG BASE_IMAGE -FROM ${BASE_IMAGE:-python:3.11-slim} - -MAINTAINER Justin Flannery "juftin@juftin.com" - -RUN apt-get update && apt-get install -y jq && apt-get clean - -COPY README.md /tmp/project/README.md -COPY pyproject.toml /tmp/project/pyproject.toml -COPY lunchable /tmp/project/lunchable -COPY requirements.txt /tmp/project/requirements.txt - -RUN pip install "/tmp/project[plugins]" \ - --constraint /tmp/project/requirements.txt && \ - rm -rf /tmp/project - -SHELL ["/bin/bash", "-c"] - -RUN _LUNCHABLE_COMPLETE=bash_source lunchable > ${HOME}/.lunchable-complete.bash && \ - echo "[[ ! -f ${HOME}/.lunchable-complete.bash ]] || source ${HOME}/.lunchable-complete.bash" >> /root/.bashrc - -CMD ["lunchable", "--help"] diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index 1042738e..00000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,12 +0,0 @@ -version: '3.7' -services: - lunchable: - container_name: lunchable - image: juftin/lunchable:latest - environment: - LUNCHMONEY_ACCESS_TOKEN: ${LUNCHMONEY_ACCESS_TOKEN} - SPLITWISE_CONSUMER_KEY: ${SPLITWISE_CONSUMER_KEY:-} - SPLITWISE_CONSUMER_SECRET: ${SPLITWISE_CONSUMER_SECRET:-} - SPLITWISE_API_KEY: ${SPLITWISE_API_KEY:-} - PUSHOVER_USER_KEY: ${PUSHOVER_USER_KEY:-} - command: lunchable plugins pushlunch notify --continuous --interval 60 diff --git a/docs/cli.md b/docs/cli.md deleted file mode 100644 index a7c4a7a4..00000000 --- a/docs/cli.md +++ /dev/null @@ -1,12 +0,0 @@ -# lunchable CLI - -```bash exec="on" source="above" result="markdown" -lunchable --help -``` - -::: mkdocs-click - :module: lunchable._cli - :command: cli - :prog_name: lunchable - :style: table - :list_subcommands: True diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index 0f03bad3..00000000 --- a/docs/contributing.md +++ /dev/null @@ -1,189 +0,0 @@ -# Contributing - -## Environment Setup - -> TIP: **pipx** -> -> This documentaion uses [pipx] to -> install and manage non-project command line tools like `hatch` and -> `pre-commit`. If you don't already have `pipx` installed, make sure to -> see their [documentation](https://pypa.github.io/pipx/installation/). -> If you prefer not to use `pipx`, you can use `pip` instead. - -1. Install [hatch](https://hatch.pypa.io/latest/) - - ```shell - pipx install hatch - ``` - - > NOTE: **pre-commit** - > - > Hatch will attempt to set up pre-commit hooks for you using - > [pre-commit]. If you don't already, - > make sure to install pre-commit as well: `pipx install pre-commit` - -2. Build the Virtual Environment - - ```shell - hatch env create - ``` - -3. If you need to, you can link a hatch virtual environment to your IDE. - They can be located by name with the `env find` command: - - ```shell - hatch env find test - ``` - -4. Activate the Virtual Environment - - ```shell - hatch shell - ``` - -## Using Hatch - -### Hatch Cheat Sheet - -| Command Description | Command | Notes | -| ------------------------------ | --------------------------- | ---------------------------------------------------------- | -| Run Tests | `hatch run cov` | Runs tests with `pytest` and `coverage` | -| Run Formatting | `hatch run lint:fmt` | Runs `ruff` code formatter | -| Run Linting | `hatch run lint:all` | Runs `ruff` and `mypy` linters / type checkers | -| Run Type Checking | `hatch run lint:typing` | Runs `mypy` type checker | -| Serve the Documentation | `hatch run docs:serve` | Serve the documentation using MkDocs | -| Run the `pre-commit` Hooks | `hatch run lint:precommit` | Runs the `pre-commit` hooks on all files | - -### Hatch Explanation - -Hatch is a Python package manager. It's most basic use is as a standardized build-system. -However, hatch also has some extra features which this project takes advantage of. -These features include virtual environment management and the organization of common -scripts like linting and testing. All the operations in hatch take place in one -of its managed virtual environments. - -Hatch has a variety of environments, to see them simply ask hatch: - -```bash exec="on" result="markdown" source="tabbed-left" tabs="hatch CLI|Output" -hatch env show -``` - -That above command will tell you that there are five environments that -you can use: - -- `default` -- `docs` -- `gen` -- `lint` -- `test` - -Each of these environments has a set of commands that you can run. -To see the commands for a specific environment, run: - -```bash exec="on" result="markdown" source="tabbed-left" tabs="hatch CLI|Output" -hatch env show default -``` - -Here we can see that the `default` environment has the following commands: - -- `cov` -- `test` - -The one that we're interested in is `cov`, which will run the tests -for the project. - -```bash -hatch run cov -``` - -Since `cov` is in the default environment, we can run it without -specifying the environment. However, to run the `serve` command in the -`docs` environment, we need to specify the environment: - -```bash -hatch run docs:serve -``` - -You can see what scripts are available using the `env show` command - -```bash exec="on" result="markdown" source="tabbed-left" tabs="hatch CLI|Output" -hatch env show docs -``` - -## Committing Code - -This project uses [pre-commit] to run a set of -checks on the code before it is committed. The pre-commit hooks are -installed by hatch automatically when you run it for the first time. - -This project uses [semantic-versioning] standards, managed by [semantic-release]. -Releases for this project are handled entirely by CI/CD via pull requests being -merged into the `main` branch. Contributions follow the [gitmoji] standards -with [conventional commits]. - -While you can denote other changes on your commit messages with [gitmoji], the following -commit message emoji prefixes are the only ones to trigger new releases: - -| Emoji | Shortcode | Description | Semver | -| ----- | ------------- | --------------------------- | ------ | -| 💥 | \:boom\: | Introduce breaking changes. | Major | -| ✨ | \:sparkles\: | Introduce new features. | Minor | -| 🐛 | \:bug\: | Fix a bug. | Patch | -| 🚑 | \:ambulance\: | Critical hotfix. | Patch | -| 🔒 | \:lock\: | Fix security issues. | Patch | - -Most features can be squash merged into a single commit on a pull-request. -When merging multiple commits, they will be summarized into a single release. - -If you're working on a new feature, your commit message might look like: - -```text -✨ New Feature Description -``` - -Bug fix commits would look like this: - -```text -🐛 Bug Fix Description -``` - -If you're working on a feature that introduces breaking changes, your -commit message might look like: - -```text -💥 Breaking Change Description -``` - -Other commits that don't trigger a release might look like this: - -```text -📝 Documentation Update Description -👷 CI/CD Update Description -🧪 Testing Changes Description -🚚 Moving/Renaming Description -⬆️ Dependency Upgrade Description -``` - -### Pre-Releases - -[semantic-release] supports pre-releases. To trigger a pre-release, you -would merge your pull request into an `alpha` or `beta` branch. - -### Specific Release Versions - -In some cases you need more advanced control around what kind of release you -need to create. If you need to release a specific version, you can do so by creating a -new branch with the version number as the branch name. For example, if the -current version is `2.3.2`, but you need to release a fix as `1.2.5`, you -would create a branch named `1.2.x` and merge your changes into that branch. - -See the [semantic-release documentation] for more information about -branch based releases and other advanced release cases. - -[pipx]: https://pypa.github.io/pipx/ -[pre-commit]: https://pre-commit.com/ -[gitmoji]: https://gitmoji.dev/ -[conventional commits]: https://www.conventionalcommits.org/en/v1.0.0/ -[semantic-release]: https://github.com/semantic-release/semantic-release -[semantic-versioning]: https://semver.org/ -[semantic-release documentation]: https://semantic-release.gitbook.io/semantic-release/usage/configuration#branches diff --git a/docs/gen_pages.py b/docs/gen_pages.py deleted file mode 100644 index af987f26..00000000 --- a/docs/gen_pages.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -Generate the code reference pages and navigation. -""" - -import logging -from pathlib import Path - -import mkdocs_gen_files - -logger = logging.getLogger(__name__) - -project_dir = Path(__file__).resolve().parent.parent -source_code = project_dir.joinpath("lunchable") - -for path in sorted(source_code.rglob("*.py")): - module_path = path.relative_to(project_dir).with_suffix("") - doc_path = path.relative_to(source_code).with_suffix(".md") - full_doc_path = Path("reference", doc_path) - - parts = tuple(module_path.parts) - if parts[-1] == "__init__": - parts = parts[:-1] - doc_path = doc_path.with_name("index.md") - full_doc_path = full_doc_path.with_name("index.md") - elif parts[-1] == "__main__": - continue - with mkdocs_gen_files.open(full_doc_path, "w") as fd: - fd.write(f"# `{parts[-1]}`\n\n::: {'.'.join(parts)}") - - mkdocs_gen_files.set_edit_path(full_doc_path, path) - -# Exclude parts that are between two exact `` lines -readme_content = Path("README.md").read_text() -readme_content = "\n".join(readme_content.split("\n\n")[::2]) -with mkdocs_gen_files.open("index.md", "w") as index_file: - index_file.write(readme_content) diff --git a/docs/interacting.md b/docs/interacting.md deleted file mode 100644 index 2c2e8f35..00000000 --- a/docs/interacting.md +++ /dev/null @@ -1,73 +0,0 @@ -# LunchMoney - -The `LunchMoney` client is the main entrypoint for interacting with the Lunch Money API. -It defaults to inheriting the `LUNCHMONEY_ACCESS_TOKEN` environment variable, but can be -created with an explicit `access_token` parameter. - -```python -from lunchable import LunchMoney - -lunch = LunchMoney(access_token="xxxxxxxxxxx") -``` - -## Methods - -| HTTP Verb | Name | Description | -|-----------|--------------------------------------------------------------------------------|--------------------------------------------------------------------------| -| GET | [get_assets](#lunchable.LunchMoney.get_assets) | Get Manually Managed Assets | -| GET | [get_budgets](#lunchable.LunchMoney.get_budgets) | Get Monthly Budgets | -| GET | [get_categories](#lunchable.LunchMoney.get_categories) | Get Spending categories | -| GET | [get_category](#lunchable.LunchMoney.get_category) | Get single category | -| GET | [get_crypto](#lunchable.LunchMoney.get_crypto) | Get Crypto Assets | -| GET | [get_plaid_accounts](#lunchable.LunchMoney.get_plaid_accounts) | Get Plaid Synced Assets | -| GET | [get_recurring_items](#lunchable.LunchMoney.get_recurring_items) | Get Recurring Items | -| GET | [get_tags](#lunchable.LunchMoney.get_tags) | Get Spending Tags | -| GET | [get_transaction](#lunchable.LunchMoney.get_transaction) | Get a Transaction by ID | -| GET | [get_transactions](#lunchable.LunchMoney.get_transactions) | Get Transactions Using Criteria | -| GET | [get_user](#lunchable.LunchMoney.get_user) | Get Personal User Details | -| POST | [insert_asset](#lunchable.LunchMoney.insert_asset) | Create a single (manually-managed) asset | -| POST | [insert_category](#lunchable.LunchMoney.insert_category) | Create a Spending Category | -| POST | [insert_category_group](#lunchable.LunchMoney.insert_category_group) | Create a Spending Category Group | -| POST | [insert_into_category_group](#lunchable.LunchMoney.insert_into_category_group) | Add to a Category Group | -| POST | [insert_transaction_group](#lunchable.LunchMoney.insert_transaction_group) | Create a Transaction Group of Two or More Transactions | -| POST | [insert_transactions](#lunchable.LunchMoney.insert_transactions) | Create One or Many Lunch Money Transactions | -| POST | [trigger_fetch_from_plaid](#lunchable.LunchMoney.trigger_fetch_from_plaid) | Trigger a Plaid Sync | -| POST | [unsplit_transactions](#lunchable.LunchMoney.unsplit_transactions) | Unsplit Transactions | -| PUT | [upsert_budget](#lunchable.LunchMoney.upsert_budget) | Upsert a Budget for a Category and Date | -| PUT | [update_asset](#lunchable.LunchMoney.update_asset) | Update a Single Asset | -| PUT | [update_category](#lunchable.LunchMoney.update_category) | Update a single category | -| PUT | [update_crypto](#lunchable.LunchMoney.update_crypto) | Update a Manual Crypto Asset | -| PUT | [update_transaction](#lunchable.LunchMoney.update_transaction) | Update a Transaction | -| DELETE | [remove_budget](#lunchable.LunchMoney.remove_budget) | Unset an Existing Budget for a Particular Category in a Particular Month | -| DELETE | [remove_category](#lunchable.LunchMoney.remove_category) | Delete a single category | -| DELETE | [remove_category_force](#lunchable.LunchMoney.remove_category_force) | Forcefully delete a single category | -| DELETE | [remove_transaction_group](#lunchable.LunchMoney.remove_transaction_group) | Delete a Transaction Group | - -## Low Level Methods - -| Name | Description | -|------------------------------------------------------------|-------------------------------------------------------| -| [request](#lunchable.LunchMoney.request) | Make an HTTP request | -| [arequest](#lunchable.LunchMoney.arequest) | Make an async HTTP request | -| [process_response](#lunchable.LunchMoney.process_response) | Process a Lunch Money response and raise any errors | -| [make_request](#lunchable.LunchMoney.make_request) | Make an HTTP request and `process` its response | -| [amake_request](#lunchable.LunchMoney.amake_request) | Make an async HTTP request and `process` its response | - -## Attributes - -| Name | Description | -|------------------------------------------------------|----------------------------------| -| [async_session](#lunchable.LunchMoney.async_session) | Authenticated Async HTTPX Client | -| [session](#lunchable.LunchMoney.session) | Authenticated HTTPX Client | - -## Class Documentation - -::: lunchable.LunchMoney - handler: python - options: - show_bases: false - allow_inspection: true - inherited_members: true - group_by_category: true - heading_level: 3 - show_source: false diff --git a/docs/plugins.md b/docs/plugins.md deleted file mode 100644 index 0762f4bb..00000000 --- a/docs/plugins.md +++ /dev/null @@ -1,206 +0,0 @@ -# Plugins - -`lunchable` plugins are Python packages outside of the `lunchable` package that -can be installed into the same environment as `lunchable` to add additional -functionality to the CLI. To install all the known plugins, and their dependencies, install -lunchable with the `plugins` extra: - -```shell -pipx install "lunchable[plugins]" -``` - -lunchable supports CLI plugins with other external packages. See below for what's been built -already. If you can't find what you're looking for, consider building it yourself and -opening a pull-request to add it to the list: - -- [PushLunch](https://github.com/juftin/lunchable-pushlunch): Push Notifications via Pushover -- [SplitLunch](https://github.com/juftin/lunchable-splitlunch): Splitwise Integration -- [PrimeLunch](https://github.com/juftin/lunchable-primelunch): Amazon Transaction Updater - -## LunchableApp - -Lunchable provides a [LunchableApp](#lunchable.plugins.LunchableApp) -class that can be used to easily build plugins, apps, -and more. Notice a few of the main attributes / methods of the `LunchableApp` class: - - attribute / method | description | type -------------------------------------------------------------------------------|--------------------------------------------------------------------------------|------------------------------------------------------- - **`lunch`** | The `LunchMoney` client | [LunchMoney](interacting.md#lunchmoney) - **`data`** ¹ | The `LunchableData` object | [LunchableData](#lunchable.plugins.app.LunchableData) - [refresh_data](#lunchable.plugins.LunchableApp.refresh_data) | Refresh all data (besides Transactions) | `method` - [refresh_transactions](#lunchable.plugins.LunchableApp.refresh_transactions) | Refresh transactions, takes same parameters as `LunchMoney.get_transactions()` | `method` - [refresh](#lunchable.plugins.LunchableApp.refresh) ² | Refresh the data for one particular model, takes **kwargs | `method` - [clear_transactions](#lunchable.plugins.LunchableApp.clear_transactions) ³ | Clear all transactions from the internal data | `method` - -> ¹ This attribute contains all of the data that is loaded from LunchMoney. It has attributes -> for `assets`, `categories`, `plaid_accounts`, `tags`, `transactions`, `crypto` and `user`. -> These attributes (except for `user`) are `dict[int, LunchableModel]` objects, where the key is -> the ID of the object and the value is the object itself. - -> ² This method refreshes all of the data for one particular model. For example, -> `refresh(AssetsObject)` will refresh the assets on the underling `data.assets` -> attribute and return a `dict[int, AssetsObject]` object. - -> ³ This the same as running `app.data.transactions.clear()` - -### An Example App - -```python -from __future__ import annotations - -from typing import Any - -from lunchable.models import AssetsObject, TransactionUpdateObject -from lunchable.plugins import LunchableApp - - -class MyCustomApp(LunchableApp): - """ - My Custom App - """ - - def do_something_with_assets(self) -> None: - """ - Do something with the assets - """ - if not self.data.assets: - # If the data hasn't been loaded yet, load it - # The following method loads all of the data besides Transactions - # (Assets, Categories, Plaid Accounts, Tags, Crypto, User) - self.refresh_data() - for asset_id, asset in self.data.assets.items(): - # Do something with the asset - print(asset_id, asset) - - def do_something_with_transactions(self) -> None: - """ - Do something with the transactions - """ - if not self.data.transactions: - # If the transactions haven't been loaded yet, load them - self.refresh_transactions(start_date="2021-01-01", end_date="2021-01-31") - # Refresh the latest assets - latest_assets: dict[int, AssetsObject] = self.refresh(model=AssetsObject) - for transaction_id, transaction in self.data.transactions.items(): - if transaction.asset_id: - asset = latest_assets[transaction.asset_id] - print(transaction_id, transaction, asset) - - def update_transaction(self, transaction_id: int, payee: str) -> dict[str, Any]: - """ - You can do anything you want with the `self - """ - update_transaction = TransactionUpdateObject(payee=payee) - response = self.lunch.update_transaction(transaction_id=transaction_id, - transaction=update_transaction) - return response - - -if __name__ == "__main__": - app = MyCustomApp(access_token="xxxxxxxx") - app.do_something_with_assets() - app.do_something_with_transactions() - app.update_transaction(transaction_id=12345, payee="New Payee") -``` - -#### Choose a subset of data to load - -If you don't want to load all of the data, you can specify which data you want to load by -specifying the `lunchable_models` attribute of the `LunchableApp` class. The following example -will only sync the `assets` and `plaid_accounts` data when the `refresh_data()` method is called: - -```python -from __future__ import annotations - -from typing import ClassVar - -from lunchable.models import AssetsObject, PlaidAccountObject, LunchableModel - -from lunchable.plugins import LunchableApp - - -class CustomApp(LunchableApp): - """ - Custom Lunchable App - - This app syncs Plaid Accounts and Assets when its `refresh_data` method - is called. - """ - - lunchable_models: ClassVar[list[type[LunchableModel]]] = [ - PlaidAccountObject, - AssetsObject, - ] - - def do_something_with_assets(self) -> None: - """ - Do something with the assets - """ - if not self.data.plaid_accounts: - self.refresh_data() - for plaid_account_id, plaid_account in self.data.plaid_accounts.items(): - print(plaid_account_id, plaid_account) -``` - -## Building a Plugin - -Plugins are built separate Python packages and are detected by lunchable via -the `lunchable.cli` entrypoint, these are -[click](https://github.com/pallets/click/) command line applications. -To add your own plugin to lunchable you'll need to add a new entrypoint to -your package. The below example shows how to do this with hatch, a modern, -standards-based Python package manager: - -```python -import click - - -@click.group -def plugin_name(): - """ - Plugin description - """ - pass - - -@plugin_name.command -def command(): - """ - Plugin description - """ - pass -``` - -```toml -[project.entry-points."lunchable.cli"] -your-package = "your_package.cli:plugin_name" -``` - -The above example will add a new `command` / `group` to the lunchable `plugins` CLI. When -your package is installed into the same environment as lunchable, your plugin will be -accessible via the `lunchable plugins` command: - -```shell -lunchable plugins plugin-name command -``` - -## API Documentation - -::: lunchable.plugins.LunchableApp - handler: python - options: - show_bases: false - allow_inspection: true - inherited_members: true - group_by_category: true - heading_level: 3 - show_source: false - -::: lunchable.plugins.app.LunchableData - handler: python - options: - show_bases: false - allow_inspection: true - group_by_category: true - heading_level: 3 - show_source: false diff --git a/docs/static/lunchable.png b/docs/static/lunchable.png deleted file mode 100644 index cd9236d7b5e34fa668f888d5cffd7d3973054987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124987 zcmb^YRX`n0&^C%L!QFzpyF+ky2o@6DEl6MmcXxMpch}$&+zIX)T!Y&t@Av)xKKuU6 zx>z;UJ=IfP-7{5B)r2Z5N+ToSBLDyZWLX&rRR9142LJ$#;b7i58Z_7D?|)F{qMt+o zfZAxpXG7@sb5dg&)lUF`8#Msn6951_zO#G|002i;0N}^~0N_gj0B|4~KUDKN}8 z;CrY4v02DT|LfvlB}lIENtsmK*3Oiao0*lFm0Spcl$2D!&cuvQRYK~2FMmH1B>(2% z0O4a{adviQcIIHVwKHd7lv!DR1h<6!8*WMfb9KSKVG90^l=6o zgN3aP=|8!KMz)R)g5>1?2Kv9p|JxhxfnZ2(bJc{Qu`>{zudQxbLb8AqcSi-)R#`0H66vPiduYJ;$T6#hx$d~mp&F%2VHO(>Hz0=siV3YjWD1n5j~D=R_GZ~&YG5jW z6Fz7nl^3TVWjril{dZ{HM!arx$MO3p#wT6*Zp6P>c1v1xyH*H+9wV$`KiDDyaC33D zjo_ri$PLB2F=W_Gu%I3CL(;JhVvTBj{*vCuG3;a42a4ICUpSCuD-q;gv~MB=Qp|3W zO)y4e^JS&t3lWD6qRcU_K@_oz>vFAa*f6456tnpnQ+U`DmRheT>ytN*TR5|64bYg! z@34RK{f}`VS_aqq8(~s5TG={7+|=8p-vk8tms8U5*AtF(YIzB(@fb~TRw9&31PMQJ z`nC^>uF6*(z$b3zyb%9^cLPJoyu7YbW$wC_ZQQKMI2;_#re?kChBEd_{4QWOKtTVCp60`9 zFvW&(OLaAis=hu+R(3Wj3nQb1eX9-+cDUr#g9q-VlmPL^Fb!@8eGOU0B>h8&pSUQ& z*Wuyet=~A)z@4l2_dE-Tt||#b?iap!=pdYi?%;Wl0YX#1P33Uo&F``36YV5R&BqY* z@C{-FY4zaVEvZWBU+Ra@E@EE&ORl);a>>n)=C)K<1ypqiKA-(q>~m_@1vGkwu&-M` zYve5o3fmp6a4``HkFsE!4WP7hx?2zG7s|tdH(=NPsUX^XP>oHpkzD(Ih1(bcnZm`# zC!a>`cswep2b{nCj8ePS9E1-s)o*8-y%dup#Q7&eUG>0}exyBV%5xr%%Q@gjgZiPr$A zC^cw|ef+Eq+4!bU3i;}rj9_0=E*+oliqQIu`$G03 za4Q(3Aqn~w@(N%_yor{ahgpu8V)NWGnj_~pe0kpEj=D&5jDZpe< z@tXZw*Cb@f$;_xIm|%VMV8?^8k~89;r7%yk|5TXhLq)=F)eZh($mq{6I=CYzUk!a1 zc?D8q$HbKv8NA0}kLPpG#FUK)}1AAPe5UoLwKq za`=?>m)BK`n5YP`0Y{aDW&jUf(2s&lv6KZU<{;NkKEAlH*Q}vd*b1W_lo-PqJU_?< z+1bT(b}!1+0kOV_TAL#_zNfi88&>jxVN&jlde?1R8sp~Tu?HA$+_gef8!Tl|j1NAN zVB!!&N4!;dK4NvP6{}xgC`$n;coQ72_bA9=MF`Ay%Br+u`}VC1*hRr_o?|j6);xSd zwZ?!KvY0DbvP-aVW z-2KkF&tJ!uI3H<9u>>iU@MVCtF1VmiqK}lY`R*+&cH@=Zl?9Nz-a}f_;LA#>vIe#K zW!uLz(&D~2HVLT@uRxHOi_4KvH5k*;(UBs?jZr~C!6cfHSByEEg!MWe5B_~wtJ@*s zdg?#EZQsN$RmteSoJ(yxcA>MAXM#TD9!2_1PQQu?hRSuvp~7=+`nK35_GISl{3vYf z_^Klrhv1XigQs}%eAcE!4E@l}rH!|WV01E!WtY0JKN$7>BSweq*~93@E`|kbXG{8{ z;Qi$6!#X&L^zc^$V1*Cr#g`S=7tU;Pdacd*qn`^iaO(stJ_V-E!7+MbUL8hjh@le+ zRwB~}B_AOJ;7hw~U1h=x1+7(?!(k(`qvJ~jvWCVeQI^Xx0`>Lyg&{Gaq|<+d_K|w+ zTa?7gSc9xM38ONk<`j1xCMPB)vM4KZa}CRii_K9Yz&E6<@I!mS!NG|9&S$&Qv!Yi0FoBeEAro#WwopUgCX7jAQz@laQQ9P)%iE1-Tf%VA9kF&d8U8t&e#|qu zHb7$1VSCoGd z?0p~nbH@)F_T8@;&4q?({vIuv&YvuKoZd+sHgL{LiN%pUdgoqGjQ68+n#y1}m=XU% zMCX$_%pH`V?})&M=?^}LzmunhT(Ne+>ei+Zr729-&o~JAi19mbWZ2_g#(yNv0|Xv$ zsgiu#hOi+px8VvTlx_FeIg7$xZ!dQXKJedsH9Bza5=s5aML5;BwZiXh&=iQ!WMn?^ zSz&w`Ix7_M^6|`4$xzaG5r*cq zDZcO(>6Lj78~3?GxH1wuvTYlg=q(yO>ej`g@P#N*m}s+8MK1?)8=yRw_{-HV%LmaP zx;mr^py3Lr#@@rpwJ0~G^>=^g7kA>CVuy#PX0s?nd2+3#2-qDcbq-uoKyao(S-@xV z8Ccng4UnO=u!3L9oJeU*8$yy%kN{x23A-jTg@^@~Yekz9aP_d_sAIpjRke1xQOIFD_D$KmEB zGx5GdE8O}yI`G%4rI^)*Eu(hjo>1{EX=yf*K2lqK zisUumSCMSM*$f!zoWme~%uu6V#QY1Tv&85k=>VORP;5!$aYZ`>duCw&tF`^Zq-s`{ z1#bhkT`;z}^s6I}z}@PE@J45jGR^nRODmv#`)xS90nQ4DOa{J$1a0sn$qnpJs*~P> zR1u(iU3f3F47A#W&P$fy`)+?Px|oPg8;3WvkHEtaXoBseY)ocR5iRR(uagE*l5oXB zz@DpfP1PS79n(=P`eAyVCXI(^3c4rj-g%+^zVF|kg7d13V9WRsmfF8%*!o*Ws8}k3 z98*JGx2!ImK@&h`*Qr086%VCDI}NNwyxH&Hk%$4~k2&DVqG41sl_rmegl-}_&d;7N z)T+!AfVz|dn;*a>VT_%Jb(Y2hYvvcxXDDNelGhQTo$By^{%`96(|L?Vv zKMxw%RDaE*TS|G1-jW#qGkt8lo~2c}qID7WjinpDbP)cb!IxoTukv+CBUHd5vB!pUqw8_t~5qZN_k&A$P20%^>D~f_(^lc=J7t`7KW?zlDYCG6mvOhGn|U z(iW*i_d2!G5BEBE->@2ZeOq5%UY;ZUdYq$PL(H+(NNU6CXjveFMn_dc2_ij6IWwNO z-R(w;5fM)o!3Yicy&(DScNBEckugQ8l$J-z(G$m7H<4n_hTGW)Fky0pv-79Nw+3bu z;P{Rfbypo>7VCxdVFZo`&_)bvrq?)1Qc!cmh?J7S7Lvv#WxJ2USEC`z6no4K!?`VW~=sbEig6dBeqK@jXIbUR=lWcsou; z>PC*bJHyAKM+%V@!H@}YvJi@2j1KV3=)1R%=*kLHL`f0-CqKcMEHfUOl@0N*LhtaQ zVr-(o)S8^a_%mK=>i7uZ%-F;qQ!LwyQ*%;-XkP1QL3jG8=Q4pe;f$1Rddgz(&>HCMSOUn&glWGF_j`9*p$FXVi z{cS`_34iEewskj4VgAO*TCr={$4;1THEsa+Riy7#3#}-6YdIo1 za|JzDT|_=G$4st4q+%S83x$CJH^bN7X&oRds$?!VUu7M$_YzrWWKqdz6)q3Fr0Irh zZ}V2YB}z$n88qAd-3pC1T@iM$^8?Ki&8(AkVwD#r2Awq-4zf%yM41HigqHOMmQ*9> zSA;bDmM+ZaBGV<}npx7MU>c{huv8E;LYKy0wTk0`<|dowQFM+p{Ah~H7r#ZTPf|~y$FOx8c?1 zmp(3|YABfhDe6?~@;+JdRVl19Yw#m91UtWChlmZ5!ly%bXzX+n8=Wwba_UGOz+74Y z+4A~*W?f%+c*-XX9t_yVp#ch*s_2K-p`&SgH|#A%vR}84^i*lS-=L>v4G-61*4rJh z;`;f=+uiS0AVn97%6xhOWlHWKs}w|MdohPorlowx>G234!y|qD$|&p5I8ac`L@iGi zd2m*mcw5EC3TjkUk1lWe8pqX$AwTbrUNXmk@yT~f2EcO4BpTSuo8_x3hWIN}0odn& zy^3`Iyh1{X2XjBngZp>IFy2t)lnNGxJo%IV{iG~62Sw_Gh3w>{m>4@leEclC5Fgdf zpQ63rQweXJYYjCpO>-$xF(T>mgWRXpd_#~{4pd|;|3z`YQ54#Y>qKTu(?Fn1VSoQa| z#d2-(-3H0;;n>lOFFUMtu%+Wgf|g}X*`B)mIemV>udBqpAMcMf^5FS}kIOhEr_j(f zsekW>)@mI_D1?0ir~r6*amg>#zYrddcr}t~at-gaX>E6d( z+yUuYZv+a|w%1;ArW=XH-})c^GZ*_;stJiB*+Yb+p3%{};iHigS>29jdQ;jKxz(r2 zY8F2IoZ=3I)?eUjbEUPQ!l3%~U<9!}3il~;>O*i~Q%XJZ*B z?#?=T9yb~7&-)=6JiPgG!IEQs@yapl(5}Pe%;pR1JDb1$|$v z8NQCxW(6@nx|(Yh^M}MeL9RMO-FTh0(l1qAMPHKsF8CWro0`!x45BIx%d=#}W_LJz zbvjLtvCp^A<<7}7LaNu}b244#91u*<_WndpsXL{lF{jUPyudxYc|@(**#3pD zO^Zrz1LaTzah){EmnBV_6PN5PufPGolZb1iI+l;2Y*E8jl{`M1_z{UB-N*Hd-G%eRg@VF(Nq0b3J2DwKJNoT^UGiU#t-)4XK5Gqqw zM5ed#6IcQHDD+3`?<3{eE$kjsxBmhrq_FdmcTNy~LEiLz6Ol$?*s2lGP)-V&8qpao{c+IbW29I8hHEagi> zJyQ}}))UL7F}5GR`cv9%7KR`C_$&8_87s6lchd+0BUOV4EGbm4uy7--bPnYHh~dxf zpBUWsdRtW~8VXu{sdF8o7kASh^eP2AjsBo$i5;+DjB zn<6F9^(00F6Nh3tM${|<1DX{yg!=rAQ3h|HttCn%uZH0K>CXWy%MQ;eg@#wk^RSYa zm@)mX@<06d$t~5)pyX-_# z&gU;ojE}D&3HqnAr;fQzMecn|<9Ui}%urTf@e48U$ug!h!0UfL7HzNA+hDX}tJj}b zrxA=H#a$F+{g@P+**38Iffc%KojBfKx@d1zMr+1|o;7}t9c12^fNhdvFH+>+h5`}u zuQ*j2PWys9BRoa!Il5esUyeD7DY)pjNR~^B3(CjdMNstvb-sWS5#O^^QoL;Qrr^(7 z2Az^#l=H_oo}-;29LK@8=htNFKFUfFE*jRNl`fi4S)(xMjM4$DOTp8U!-~e{{cu=> zN~5V9;&#uAF@(H4NW;CfP61=$=l_Ey8bpwMdXm*en|>XN14c?D6?WNSp7r|P$}$(qVbXE{{mN&?M`u!C*#rkxIU zZ<_<>+vl~eCGFmwKP$w`7cSOcDm<4+q~kIUO19Bq;gheS=(qmY68%jTA{-rgyr|61 zRD#0-zN$-3k6{N0B6Lb~kL>VLGe(929Q?2DZAoJSbSvOM$)*u$U%47$lAkL-9T{*A zlDi47%y1W4!5o9>Z2p7*q%@B*mymquFGe|G!D_fCmh!`M8d94Wy=F2+SV{O; z(5USqB%5O=j41(`JQi2H8Q@ELC!v$zs$R96p&@6qmT((j#;V&(-5^S^(WR*wv9rFD z@xPt$ONT7|^)fd3_2F_Fr;BZ8;)l@NX7Z~ijRMcxAf$a?#l!HoLX(apQ12h?(k-QS ztDDqaXuAUane$K2UIgsW&ikfHpkS1@l2#wy!IM5|xLuntHVD3b7A}e=dK%#uMk;`_ zCh9_8wrL!_A?~fH0oF@u3APg;^$wC*>iGv3W&zzo=zo4N99SF@KT$gN8joZPc_c77 zj?A=M7}u>s3JZqEdjdP|Svr7Q&by zm1s|OQPQc~eoG?YZXVr7&YWqikdM3RQ2ux%#x+J2V8j+>D(#^6nFL;A2rGsc!pFI8 z@W5cQ8fefTYJzj>Q%zW?ulMVL7>z;kqtU)&u%-;&7+qfwhafYvxQ`}nPuUM_{{ApF7M-4#o%tOj&S-{C@;H%aNM5}veUS-JEF@Z>>40X5-hWgVYO^|9 zT<6c#6+Vlre^{PSU0S|dDra3@NK;4u!={BMlxDN6 z?LTlK?|>fCWj^*NcqYCtd+BDO>&>rxiedgZB1l~X5tm1%6h%5>}wITQ%y=7UsifxT+c1YzQuElCoN z9xqw75zVkDqp*Tu8)a)4Z3MkUehjU~_pl;n335YrsA4h|7wi?C?4YZo6$AW%+mj_s zR)kvygtJa2$fa#_o%k|%f5Fj z*V5`OB{e#cP#{>X!-J+u!1&>Qr~gR+Y6nY)YJzz~)|{eE#O+_sZloHtkTS)PKOF?do9on{we0 zc9*@P9%|=pwjG`a=`6Y&_j}orR#rlx=>b?wRbvz6qu~b;03#;k2t*->+N+?gli-};SW6tC?e*!QV%$9N1Ovur#4RPxA zNBgi5a$fy`lOci#>K(IWIu1}4K{{3pNN;W!olocQA#9N0D1ggQiQ8lxGu>mIkhh5Rvih>^2x_%^f$l_r$cR|kGFbGOG@!LZtOlR>iSun0w}I`3l+HpPfy zk^B=FB})7gS~H~oK@?w&H9*tU9KMIV$wup-o%q&_ALP7&+7q@w@aw!qZFo`&M93KK zhV=79QP^ySGrB^X0{ABi$RC-1-tEA+QRW}1o(f0dSU+@06Vl6|}=eZ#7h zT?@921<6 z-GT8+1EimON0A*f%WJ3u26%inINw;ED7)QqeJOxQHm&M@V|oYya)2M|<~@H$YYaoC zm?9(UGiXp}HC;I2UpdRi0Vxr13fOrl8pR9Yj@@52C2>=s(ls|T$3US>=-Z0O!hCHy zAGc^Ya`w}QaYbt5%=rRHiE_ob6!`Pe8HLZ>*1@y>rBiZs>n6ll{9*N@Cb*{Yp~_Od zVGDm6UMkWPRcyI2%nCV!CVk8&#FWSe>#3Iwb$`n8B{9YF^FNuq1UZ|Iro);HPDTxn z#vl;!bFo~fX2gyf9|AGRvcNzU%-A?t18*&87(+m@j2B6<)Y($g_Z63%{*Zb2j5cT; zZGts}TVvWw5V=&&WfC&kQ2vBDZY>|8ogZUm3U_ZHhFbA^0v8=aQ? zTB$Y1!_V(d1as*PWMf19V(EXcmz~@M%g#F87Q*1m^~bSB|6)^DemB=WsoVO8V8e$W z6Top|f7*f{nZ#+y=H5kq}K+RrpJ0W*9JX%v2ZIlwa4E$P%E<8p-hk1+p6dL)IL^gM@7X9-F`(ZLhs1a%Cc+`Xc_y-e$u}he3KcxeNW9( zT~3<`lVm)cmXf(=2vDyK1<yITkvu zk`|1)m{4~@caoWK{&Em-a{mjD*9l)0yeVU_lGl+DQ^W+O zC3ouE-f~noEbgn!tlJ9`Iy}}T8~*trXGO4E$|@LrO78&22Q4`Xy@7VB#ZqD-=(^3x z**$QdEiRLt2F1-*J1xN4 z1ffEPH1|{Xdv3$2iwhV-O8DtaP)zC?{9`Gwb!~)n5o%4FaHIsFvG=u{C4cmaM|9A5 ztH$;}5Tk}8VWi|e^PJ*Z=A#QIucxG?Br@AiptbM^yK2zK-jsn}PZ7xvxKD~w+GBR2 z>kWwLS&PB7?jB^MP#6iKIuRe~Z=unUptY6@U<_3gDRbV~Qd8x-b&C&@|$>a5wTE+7-4M zQ(+zS;O?f2ko<^XXApS->CQ@Q)bi6(q|BqNye#>}lR;8I>`*!=0C5p1A0%Hn z_#rfdtK2w{yqL)LSnWs;qK6#k17*L(&Y#SQ&h%XUqYb+FNs|R%XI46$ks8=E!sCE5 z88cBlkPI%Z3Zwwh0DFk%8}1JQPgR!fx)kWjk~ybGxaS>7+)D=K&*)}0WRkC-acyyF zvfw%jR)s+Ss(Jl22s?-m^{|E?Y>F+ogxiw;qt-;6RFLmHPS} ziVN)E8G3-zuL;aAOiElX@P&^8!va8cF+@FdU0})Bj$cCi+|@&0{_syB@f=d8z_!ss z;O{12ihpEH*u5*#{GIq+4knTqF4!qn49E`4sS!qmVE2bf_i6|{YBG95q>8#H29^tC zNBkvrfHCG9LKt+@SL|h{+Iii#Q+Gavh5G8t)tACdr)+Krlt)l@?~@IaZ9N^}cHOMf zTWW9BKjMe2X<9?wUPXR{9RMKt_Bh(2koHfm7krf2a;p1J;Z|N~#7r%S67DnUt8FJ6y^_aM&56rpMTY)!Gy-NmsM<*-xuL2PRFj)oBx~BtH@VZ?zQhQ?Z+gvwet8 zJSNJQ{2a?Tm%iktJy48UzZ_9sRX7yPL_>4uk{uTS1t3MeHqcpg&nZiJOlCXMa}V_B zs98#29>X#p>`yWuh#V|WA8c{VAjfrUYLFYE35F3-3*QgXtrVnyw6^9hi+#zbY+Gef z>)|C-8>TLiRF&>sS(8Ri$Hq}lRA*83!p~XmHqjn;@4yF2QplfK1A1e0Q&J{sG6XLN zZ~|_dw6t`xapW2l;S8tZ{Tho^rqRhzx{-o6wI=3ULNms=4 zwmqLVoL@^s&%G`u@KTa;&Pr6y^{(sgl-* zEuDz}mvT3Ye|b;u#0giYOD;_druOd?YVRDJ7EGQ|=ym3v^zBFYqO#1!ipf@I%0&*( z^cEa4&!JBS)StFx1^{g~b_N(FIwcA~cb1FNl1!KHs{u=1MY-aOuhjHTyP6h)ngT$~ zU+$06uLxL9&^jS%Bbx~23nOrA0DD>J2bZ#Z6sU_8z7MG!*!6&6KX$}5?0TO<`0tob zwo|5aZKP3G2%0ywTm6$J&tQAsQ!@>x&D$ZVP%7>oC$V5oha1_qqmR2Z!pk(1ug?`f zE=*uXWmyX|BQ`~79R&KixAbOEU=kl$hzxK$8-MH!n5U(sO+dTB@0~wfq4aSVFZGPQ zm7yMoO8p6?CYX1!*7$6HM3v?KD$hswF*C!mjaXxZudDdCD%oRXq90YZk{gLKouFqG z)W0I;VS{(mHDca_e9I7Y>iHc0b2`G(}s+p%Wd&xEOqE9bFdGjae$~a~(1U^{QBx zHA}1}BpgLeNn(E}UGvJXIJNN6PvXd8^CL# z?B+AgW&iOkJC+Ymvhl(#D~NG0%2|MWQ~c*sLOJQz`Mr}ucp6^87^I7$?^0&I0oke_ zB63aAXmvv}K>kxf;i`d70R*wgGhdFlX!AGYXnD>Dm~k8-eSbZT#2Gg%l2*v$F`}4~ zo2sZ=Ev(8N8k&0+=d`b)h5bwiz>65IF&r3@gWVWb%YKDb(T1(LFbMUbhlhvRMhv?a z)`1d*4158)p_^WsjQ~Cs%>{0f>h}^>w0utjU2Y7`U_Ip86cL5{(NX{*`Svsyu=+Z|gq0o}0S<%Ysoa#C!-QP;|+R zo(pE1(pfr-GeK+lyj7U2r-hvNY$1ap6u7i3*FJzd=$sZ43&Z!ig1;PuO0iRLW@b{9sC;*Hu_)KxL@30~TD%!{aG1`AU5U18G_G>FrGCz&JD^#yjMqb0^ zV?i5fh@+4ad0WPn#0S?HWh$obLW$KRM$%k*epUQ_U4oWHo9XxiWTJUVDIh}BPtUkE z(jgsUb!(zIVWvp0(&T`bgVG)P8X`Nr<=rZ z1;a{V4{NBdf!$bd40LRJX4Da=)A)megWvGn;M>3*P;Fb){qCjFi5@3zg)!(+jJ}I@ z_10@%GEUagf4nv(N^EtUSnO!zapm?B3@%zn?z-1D0*JP9AOcPij^5Q5*QVuu$KXnq z(dLm-)r>EF3};TmY;YQ1Wqj!tA&-9#Ck-!NI8*$Y+jZO#DV%X|*%p}>YnoJu-~J-B zqTV9&rD0;^k&`EXV70^P0Vs&G*SK%AJkMLCO~A~Aj% zrXe|rg+0?{E}ySR(y#-E9rp!r!q>rgG|+WV6hgK8)sam=e`a}e`5~nc3Jm#z;%1GN zTpYa(`azK|(mUwzb3f`_I~C;9K+)z_yG^-z$qF%a?%Z|CSU>eaH02%oLZn`X=stR> zHtrkn!9tUkxycZBO#>Fmir06PEunoX3q%DUs+VCgi0DNxV5yzAwsd>jonxww<<}5! zxsClr;k9%*4rcwp^6<|nKK+dcGI{d z^!ZUJbU^bg*d%(E;rF>f%jUwFw+XQBzLczjkmTWVC1->a`tjrI?n-O}%euDmyD1*G@gB*QS;yzMc=PdfOyH@}m;<=xRYJ;am9ux((Os_yWBXywq; zw&PVu;3UqcU)!Pnz-lug99u5Rv4?j=*&`mfd2| z*I;Vin5X!@ScsN3c!DaA0P`0fVM-Wx5Tox}S?t;N&9h4Y)|kg$Sx8|EjT&EQJFfS) z!`Di(^}1F~uj6Y^yNwsC!s<7C-Qc25)S`m>A`9qgvoogNy#9cW2*W4E>bYw*BY;uS zh=Wf&dWvua5tgm^u;Is$WjeGRSB@?%%H6L*o#gD8ElY|jZ9pf9#I|z!EG(yvkX5O{ zHqTrQ?8*#`mO^r7e;rIl#AVhe6m2mxLdlQq)`W~xr{;^y$&g}$$E~utxroNs*pS16 ziqy`~puN0~6Yd@M0GpS7+)*mHmcgo?oy#>S`0W@)OFhSqo*&`J&N2;9dk|B(aKZDN-a0&8|9+6HvH2=TLNgY<_5d zwc=b}y{(RrIoUbzMdN=={!DcCIm^HIGJ%TTKN)%yL%YW^w5+?lAvv^yF`DK8zNO5l zhaoRq8ZovP(_HTvc&Dmcd!`yoimTD}iSYfK5-AxZq2OcUMbd+Q7vceTCbMtDteG76 zWOyzIXL=926r+2~<=O=(P#Zq4fC-xcb_WeR0}yphX6$}k7rbe|`j1Uj6f3x46E&`B z*KUj(WUcf(yE~@Jt3&CW-!3nf7T?x<9D9IMvD8yIs^}|4z;cQv2SF!?Jz=2FiYIXgUR(azB-hoDHK!WBQkN%<<3&-49HCNJo4T?0}fE zi&`J;L#px#dEb5ZvUsB5-;;kGz6Ri1h)=;-)ssdUb{s4qdS|qV%NZYi?^gQL@Bz$? z-P<8LVA&oI1%JXh(N>d6k0r5PZB|&i2@gYtEc?j_e#nue0CAJ0^>5DisN01?Sj1F< zE^G_X7zeSkGnX`SDF|gLY~ay!IILhb-ZEieA7*i6F>sb#dTAj>090PNi-81wNeW67 zf+<{vilCQlvR=B&CKq!J)}GQZQFVJv}SMcb6GiQce!MuG|wSnG$Lxpe_=Lc?|*6tI3`_} zkHzUWzFaf>a+hU=(`c^z)l_Rmn)m{eXt>+nYcLGi7ib)+3^u@ySg%T0MR|hBeo^bv zK`sx0@5ipS7NLNH!NRoH;Nyw(Pt5v7Ca>i2Cxjg~BsS3BRp+k*mI9LPeVG~Ji#o-O|rjiZK;>WKowjgOJ}qGW?B*!X>`T;Ka)D%;~! ztX|W2vs^zqGIQP8s;>0mcnDRorQ$6KfmcaQlbGhfWmRL7<-dY{hV1_e{r|x&o)m%> zg1+Ij8;O(`NhH9>X)AQ3tVUerYJS(N-Q?N=2noz0_JqLUOvBxfS5(D5o1)_srd zfRORLG?vzxc5GS(ea0}`4F#!JmT>x+Q-S*Ju1lB}Hfp@vMih>QRVopC>My%&&&WFd z!*g-ch(BsoLe`$TXju($1P~4`Lv+BW-kS=IIIQ6EvG~S_khy3!l@1=utoS#Z22aFs z$S`HhQqGKF3Wvt~2QUgPA${ax6S}e5-U|D4S*~NNS``n)7Od{9vs%u~+2U&`5h5zs zway%fY%XqQDn({?>|Ei9GnmZPtODVtc#ThhL!?s~#)2PC&{r|Cn>}haFu=BFs9V1T z-fp(xxc&*W6w3YD;h2elLhN}Of||sJTxQF4t3Fj!?{=6`J_W=gGQ|PV4N~a=C{cp{ z0D(Cb`X$vlu$JzGJC8)Akh?Z371Czd(6Kn5(2%!w9dj~CBmv78`Z~=Nrv)9_YsZQZ z*$vLpRGNocFuCE7tm4s#+0zj6+jp9WW;6tPcS^=JE)35kJo1TK^~ImVs*wlrjNlZ}VQy#S%Bz41 zPE97De{-O=wwA?@w*{xZ%FM$dBXHWfj<~DcCP%c%)2P)0VIht?qZ@8d3@AD)O2my) z=ZMbh<)-Hax5MrI(l44Z^AR@viBxa#S9dDMDS`6HdmN;4-<$7gw;;$+*l}z*bT^;t zEm|6R1zAzMbbSgcH;!f7j05r0CSwlaj-7%X2l!g#kkG2N&xdfQTCdW4!k?P!=`MRo zrZwY0GfRXa%o>;{2LTcQg{iUrybJ=}gnDB9TSR)29pZ!*0ga6AI2HO{jdpj$Fqv#uY6keB?OG$j4Ww z>JwhhXrlL!?84d_(_stk@vm7<=r(bWsM1ESs8WeUHzm&}_fmHqxv=?SBd4CS$-M&h z&x;%Cv>6c}8*HOZwY?~6dF~|M2#PzCpGWiwWgCp*70f151TM7n#eW?31%5lJ{r1VI zgQi|z^GjED-BqgkJ8}g34>_uQ&G|~Mqy?MW^+#|a`CHisNat1g-evWCBH*Qj9nP%^ zWTs()LJS)Zp@I30jr5CbnJ1+$>zXlSan34zmm~Wu+5KFLUhutE&0sa;9h>1INa@&T z6Bl$ak$b%i9^B2&;vZ1m=^C}nIz5yoEMundV zuwFJKZTvL6Ku$u=X!A@0X$1-d`6348OX@GO$HPoDM#64hhE)C=@M*%OIm-71h}IQ| z5-P7qGK9dst{B}v6zi-~d$C{bE>QIl|vbPz6t8 zqo#1Waor@TJ|?{}eC@?a1GHlXgN5~i%xgsOhc-$wsLbr>mslu+VgCEn?J+YGsC${a0C&}CY=ia;CZ@pH3>9tPRsj7YUZ_E>&|uQ9!f0rG>bymFEA;0??_$kPgx!YBl?7M=0bE(@`x6K81|nt+HvB69%CXd@IDU5%kL3-Q&i==)~o`Yb`mRq|J)w^e0(mBV~``rtM! zs{#B-3e!ol|1WZxdgZKy3)?TVk*FIIVSijK=N4n7!+|fVEeOweHj+UCdLbPyUX9zS z;89i1CVEVV7m@X4$Jh23^+ttmUXsX_GXCWqWVS;oeydAbl^c!TVELN6UW321tLWL=!Op3zdP^}u>VKwS9CZT%B{447eqc`z2$6DUOlBka zQl9fgjN5R(vYiqLx*OO3buXhtJdy|!hJZ^3KNBTR`2jlxzvK7T;eYZzcGy3UhnfY; zw0*YzCU`sdGGDvGHDR7_K;0f-|EuM1ARlebD5=v0f%E6@I7o5vto<`dO6EFcsd>&) zKnZGBj`J{R6?YRUL0{N}qPkpg?hINKGNW-08qP$*Ow%ifQQH5Z+Ev7S7NmWJNc&bs z)5MMl*u}&R(%|)Y!K9?2nJqaYqy&72cV7dG!76>igrLPgjNgTSKnBADPa6=ymh1b- zc*>m*hr~s1Sdsh3aTtg!U2#62b)zFRKvX_Eeo5ukkNqZzRn(A zRNrl6)b+?L3S!|M$qsw9LKGq1g3mJ(ST~@XMYT5Rv&EWYA8l%QrIY0PrKp3Fa;H)0 zVY)H?V9C{nau%Y!GGtI@sNkOhiN4-hB-mcjEaykEQB6rm7 zcT~zl9n;xqmN=!4hHo=`tiTGVU6}ua7?29m^749*v+TkkMx-2;6#l8KjV^F#egxJC zYs%X^sUf`&SAvLrMX||$I$L;W&r=f4SRKZ`N_tE{UA(;Sd0-fNGygFYJ2F6BO)LXX zF8^c$Nn)>0hVidNb5sBfjCq4g17OrbINW3X-C5F=Mi%T;Y@QVhJ-P`UkkAI~Q4#(` zwY1^&ryCAQ>nEJUGeLAEB`qJrIh5gbKI<0YrG|;0m4&$2{f<0tz}QbLZmy)`xVcGb z{I(fr-)WQkhsz1dMJMDsb&wRrY(Tdd9T1MLvo#3+V6MUPDf?a4-aCi=d3W{-+zkvs zhENH9aLMFx*^?EImpLnLv$Luq#Ofw}6DTU_aRPqr17;<9X+`tE9`!(}ob$6}cQ}Vo zn4cwFWo8Ps1b_kBCFsH=`GRfdMkSam4@~8WR57c~F3{&xMh84;@r+6aV}BPg;3Ul0 zC6k7k@|T$zy(<%z6l+?#iy+!wbC%PyC*?!1W8_zYO_U-r|4`j;e7~(JX`q~kGWLn-Nh3Yt}jB%}38H7n5`ZPCLtvOKHsY_Q&^V!0$Ra%?PVRBD2FANbW z;Gpiz7oiB@B}56+06P~WBlhzf54g==(^qe9@)x-8Is_qaEDv*5u@w5*EuLGHC_m`Q zA~hjm2AN++?93ZdMFscBGocRmy}U8f@GClSw>#ZVP|%Rm2v%#-8z^Sac|VAA5~hY` zG>-`r4(?QTL5Bd&cMCjhj??6An8V-a^1JuvJiAJ#NInbeYQ6o>x;yk8Ewl`EglG5@E#nd_2VhUjDeej_!~oXxy&+*}a5Dl_B2b5qofwM$!Fl&jiKjU%P`O&fc^T+BmQ5g^&m86v7rkNtipH+m` z6>T;_OwE88mtbbRcZj3O>noYLk zHyJj&)Sq-OP6SxqbixKYaVlKX9$k9gtQd$%D7W;e>_uB=mknG`tU*rhX zWI*wfCwh&@#Bj+ojpUAv@hP-!cyr@HU1W9Zw5-wWqwVnXl3z?zOg}!d1Y6B@%5a*x zM!2ig2|q9=C`(93WW=uK*KEaO+|9aCn_$_GPqw5*5jrdr~3C|iR#Nb{J3`Ec=# z5=cyR_egqylBpQxl!U5UEwh@|fs}iN-5W=D4%Od>%Bm@KoAEl+3ovU4H0BjY#wEvt zwzt%9M=gHX8?f)zBo*1{iRNrXzq_a!)L3!kW=R1C3Y#Bj;XhOP1hxlf)xZ5g34`%` z5j95)`Yf0R4T}5cb=MxRTP_878Nx}~aDNt&dEq6zERaRhk&$YE`BQE-kd?-OedN3* z!&NBZs~cksG7>ib1xRF_EB!EMilc_;=^YJhq-BNH2|Ib~W0nBpdC-V5%{7XUVQ>Kc zIf9&J$YVuZWLJfrd{-x6-NMfz|`*_(%8MMm$L-6p}kXNWY zd-)^}g2Qtr!4I}DuX}`7IAp)948u@m@jtuQD4LMpnCe1=2TwXS!EDw=>h#;=PIw9m z`VC!~L;*p-sg>7$B2Z_Tu=zhp5A?Ng`0ich#JDjm8$YxYP}?|!F}Lcu z-Aew0;e6Eke;o0|(q~?V5Qde#@lYXP6ta8&L$t7HwuO2c8gAukCZ5a-4ufE&&_(hl zJ6eS3@<*EnKUi}&W4GY5&79+plb|O%rp1KM1+`jKDXJ{+?*#jYrz0P)8NR9 zXzVa3+iTSE0cNT8n>}#T;AvR!3iC8lwXMo(gT4FuER zcp+@82rXOv=lhsqTU7m-yi)%TvF;PlMGG~kAmvbB0jM8kVGS*up(V9+ltdltdrppn zX+yrOh!OSRi=w{}S7Vc)GSKx9sDrq@WOT52sw_7()|aZLzw9n^IkmGUa6Q ztk`>-CHSzHB1)a|hQ2vU$Fj1k& zBlDJy`cbnn1*0mODm}j%=OjA?@vXLcK`dX9)&UkpUHD5;erM=zySPRB-`#y{f}0j2 zZ-wKSws^}^B7l*!)Ijtkow~VZjiG@Qm7$P%fEgg{mt=2eVF$u0z&~9>9aF%=&~WI+ zou1*wyDKLw{y;s3xK|8*K>-2NXsm#n%gjMj(Zy92kUbB5G(UkX^6}Nz9;c)vC<#0p z7sCRA={x5Hq-SIsrCznh9f0$@#i_4m4wk5%d6o;#y_0IL-QZT+e-GNb{T z;QQ*CsYm}Ma|{wSE)b_6>Gx+^me`25>|=P}N)%%)$QGqT^Ww$amL}@QTsEW8^@m$W znnE)$+xL|FZO%hZ(C^w`83TtKOP)6n=yR-NrYh|DPM(FMKwik>j6L4aC~C=rO>fp2 zBs)%N03(#6cIm96(`vgE2ML2*00EwC!gEpT9L@xBVcsF?AXEvmph*8`L20-LGh(U| z9F#lpHaJ?)|6hOyxVG?rU$H)Dg1<}qF8D&+^!Xnj^4NDK&4w9dJ{t>!IDb5@@R;7d z;{t|v!nOyNypb}7%m_z!MPMj|r%cH1FrJ?$aRSU+|F%+524|*EZd^S>SN1akRZD6zSu3B7ny&1ZTES8^X8DSm}!$#;A*wJ?yC?9_K%amsq&60(?+Epaq{{J;{0+ z{p5{&fr{I!0?@fpG4fCqGV>7@m~|U&uHs$8N04i<8F^9)0%k^)9 zbMj{l;j_YVU68K#Cqb4n(#uuEO?)RDuu&^g>vz@qN8kAv$C$ASk!O+qZ&x=54#Gwk z{+}!qB36lD-i|;#;)?Twntu4a7Da4!YV&(-kT0^GVFgDCb@KJa!RNbkZdT<+(T?wSZ7MLpq{*J3()jwVZ$H zl_x8cq|Rdyma+t_8oro_5YqZ`&V$ed&?9SWIrEw%T-R&s6dS~6>B6k=YWQLh9Q|IE z4~!t|V9al)9uDds55uNDZnGK6{&u7kCzr0s^07=A7CS#=vIRd^;dO<0VJ8N-#y61& zGk)<+gUf48ep}|^jDTf_NkLYfRs@D*@=Ukd%rH6_LV2R@n-D7}wgy8D(h+aAB5o^z z9Vf3If|-Ghg28}I@~zUZK0c-V+kbRnc?`9&~(wJ6X1H3^721rXqSiuf?*kgOR30P{huUmyThA`b07{*=x?n=g%Kr zn@!y;N*y$r{5_%K5I0tpT`l2YbDK|?{Jmha15diav8N3$=_i1dLdUmYo=Uzzwq_pI z8^Mz4YSP96Y#|O%5Jm?vAFOCIIGsHnZ^-bN-Cx_1sTh3TfC@(vK^vJbhS4W1@=m0i z;~y(&lIJrt3i6wcSy@0SP_vkLLDu-1b&^3abS5C-k?9%qK<|u`$3+ug+}!+t6d+Ws zSd3w$bWT@9XyE9`0Zp_tsjEOf!<73B5>L9zm;V#ul0KF^jp3{=VAu=_#Z#SpFgm|D ztP1-dc>WHdc7)z@=my_aB-E!22-3&VMn*x|iH2KpJ#H`xufkDyctwug&{@MG$=0X&gL`mR0qrM zSlx>9w#V)H!!bvij!{7pR771^+4npb({p>?(bH=Ou}qB9pp5b`s|ZmkmSU5b9s{1P zSn;?Wru(eU3b5T_2(MSp+M^p%zz)dZT9v8~bTQmlmlgHQ_0X_qIN$Dj740RP4it zTshcVOx^6fZ*PP}OeYpW2E;_f$pl;n7SLUL#ZM3LVtV;cPo%|ixL%b>>oylDx2s4e zjEUki7vC>bD7-@Y%|8SX$@DHp) zy*MY_1ss5DiX8}IxZow2OZoq$8~y(sWByYQG!6eR^T~_7bKk(I+(?;!!~B1Sk%Owu z9XDWPxgPilL!Ugc_Ukuw&B~Wl@XuCOSW-=CZEbCY7w~hU&G51?GRjq2ai|nHzM9F{ zY`r73oXL*YbFG}@XlC%cYUE|Y_R5q9s?g-}lf(Db##?j3e$Jnzp}vGYnBZ(jkujVl z%{~oA!r=OFD-Hu%qhYb6P*Xt^_A|R3Cx!}UHl8a5`C_3<2=r3afikR%3N9^gQF@qu`#6!2`nnPB1-lrh6?#D2# zoTs(WqiU!&H*t|5b-Ht2ottQj^?>I1U0p6@F9!+7a4CGfu@Yo>Dmf4BpzI4V!2^40 za9&UbA3B)XYQa9GXJv_t7Bul~-9{JbU2vq`=|a!vOh#h_hU~z}-enjnrR^&+D;&v~ z+PuW-7Ap+Kp$w@UST}A*yemS%SCie4E)Rz)He+=2;;K)Tl)#w*aW^l{_}@2DwFH#S ziHj&VpDFsA63^Yd7S9$IRNbonE35YAhigg?!Ru9om+C{8)ElLN1RU2O2$O|AIX%cjX zJaM?|y2zgYPm<5Sm@yDcvP5k{NqiYJ6hTKnxm2~@2hDlwe5Uy2mc&}gL;}%YI#z88 zropX3u0gExZosUp!WsC;c(b4LFC=*&HY+QlFPi{6EjTIKtxE)jyxVewz`62q;1u~u zL14#4E}hTkh}u@245ZlR`7#6=uLEL2f4SJ^IH{yss^=v)t`2&l9gKNLQCEp-G*hIz z)HKb5#_>Wl#9tJqNo$TsxHgg%By&ZdRmG3$*JrwFsNnee5m$R7c_B@_oI})QmdX-Y zIWdv-q91aajy?3uH^j3OGeXh#>)TR%uJrLkWerT&it13l@Ga2u=>Hc#nmskdgutTEJT#y=9SDid+N3U^h4Q^;5y1u;|QB0qt>0>ppQR zjH#C*G(dTA5|m(QG7f38%v^~2?F=>tZ;~Lzqxa48&M(b$nd8FH_v?9^i6V4wEy7+o zb&bo6yv#L#+#qk=4XFTs@q_}J_O5UhQ-A!-k)W7L0ed3I=F;$o#ZX7F9^?W{;K^nP znzDN`bdp!W1N{s5jd$N`oUjb^Qn0iWOCU_XbwaVcUh>0ubwjfb0z0nv!by~`wtxA# zIlA1nH+OC#sSXFz^THCs?q4b{>&)vjVq?C_$X!Osi6ihVj^rw?bJN<(OuTD zG$*IDk?LWhqHkaeMexfM9T@sV`LrvfxF_qpu3Qm>PT^pAI-u%r^@JX|Rd@8bAPh#D zDckFQ?OI?;<;v?q&#a!*Ki$E}@`XE^8?NTeM;^V!f)L&~4PGh(OQenjcNSQuB;;;~ zJiz(Fizq3!Ds7?64lCWOYCTc1IKQ^GcGuO_wa8lywJG<%3eN!#K&Fbp#M;kCb7SxN zI(g!3n_AJ6zLMm9k*a&_R`m!=@Oa zndx~6VR$1r&^#G(F9b!A8Ob6O>rPwpn9o%YT+Ffg0J<^wU8;7r<^;TVdrKGM!~~$| z#L%EpL0tBLk&9wgIr3QmM?GWYGJ)Fb8&1$~iz5pWR}OedDMD_< z03`?;FeXw(F$Q%@e$7GcQv+-AQ&_#+nT z^&l^Th|sno3+#?i!!?YPqB6LDH%?hxRdqc`YyE!QlS)~dwU=i}K!+A??p0=m-?WgW z8ac*nb5}=!oMN(jFK+Vrp=q?8n`-#p*%N3!aEIA~JdsQ4|Feb6Wp|aaE%sitI%d<& zuG`>;M+m1mHHnz^} z?st&1DHIa%01AH1+6h9zHde*L+-}h-0s&!Q3;q+oU&6Y|Jo12@t z8Q?(T=0c;MN?1x5shq~ZC4Y(QjdiAYV3F}M61N=TGDfrxfmU#Y_AmxQbi=Q{uelU| zm^S3z=V>_^xgPn{@~xkUWG6EOIn6-SI-Lh_~I~RU3}@zAsOWL zQWBw({~-Px5toq}D+~$>nlK-WD?EX^2Bi=R@c`enC})%JvMfcp0|#Ux;Ef3PaXU( zFZ=TU3QihK3Vd#;vZyV;S@nR{%u!c*E8>iAU~kLpJv24Q=0$*CA&7wE-@IL~iSKC> zWz~9=6Rjr1TQQRU`ICeuc&6y&D^{L}6B@I53ql92Cb%8HVztnRWPKjEe!K4c`qgB% zMcT5~XxFqF6YcHn;{M2+<_LK@P!op(^TH>K?5*ZnFdEM&97WVa7#}MHpv{EO60BQr z-1*9zi-P4>^2qW$VFriW804%IX)$XoRe1V#j_Tqj4am3vw1S!DS%H8-4&Dy{m&d%+ zzVY2zKaD9^yuz8oJX(jDbu!5}HGhMrPDFzYne@9af zMIAl=1{wQ5KIo88nG*P!Y6^+X6%EIlEvi^LGNVZSAZKthC_H%hbhQ!glBff9P4Nc; z0pr97X>9*XSFT2br5lnj5W#!qLGK&i3B(!;|N6JMDSa-#3f$ifpafpy^6P#dvbZB*9Rv6s|jMvM z$4LQyX9c5xN7_hcOg>C+Dl{*K)2Euc(~{b+P9BK4dxdno55<4_jkHMJoEyWL(69tZ zNf47_q!5p-#;}hp><#~I$Ipys>!_1*%*70a={TkO2KwyAw83q>)aeqW!jQ6cU`xgx zClp%;L*POx%b)poHQ=HB({2e=J~XXc1EZLOmEPk%b*>q`9}43#VKokRrA;I9riR+c zJ5m25VJqskImElNpRIyKSA07TGz4Lc*f!y4WwL;q6vd05MiB4Sdbxq&;X+6KqzSsJ z0&u4awsm;L$Q~%PndDY7QZi#?)54(vWQ8@GEu|9DV~gyuhPX~78KDrxosz+t0Cz8b zQ;|cqRTFbyc@Z5pTRu`mK8S zRr{1CS&(!-eya2W7Iu0jy2}F^H_?e8s%=ZW6qb$j<+0BL4ueSL zo!r;mH~5;Tph=OyWxwMKv2G2qM&u{5E`AE$O*;BoozV%=1=bi2(hiMK0g8?i(a~6a z`O0Kxcq>6haj`b6$!NOh%HpOP?)I(Ybr@8WOv1qFr~?0pkc_YmA{&+<8sGvUkJrE) zJO!Q__1ve$5wzsPgLKae0A1(YdPrRY!b8B@dp&TW$P7tF)zp4L^oR9N;aS2GR~k|| zTmq8tCMgg?|AMMl0Ccuv%u(FJh@-0KiZ(B=J+2!0FK7Es%zEUN`VO>>mi?T_9wbTV<0wCDZ66iYapMgMq!s->KnpF4urqXhMGLaQ9>OFgKf zk{qf$u=zE+oegH^Y48mE_yyc~UfaGT06-$94ag(H29m->rO=9{VJM^-Mph-Qf}HL- z@|TjuQA`5Nbd?o^d~q5sJ(1+Jb%jvsP;jWET4ppbq>a-itnajK-51Yk zJ{(X-og6#eTjeVG!tLEo&z+zTmYusEZ7cx~EOFg8eePk4R5a5OO{qk9Sw`ReNKH+D zi>7V>&2u+~Tn8OC&M!$z(US*jJXxIEi%eIr^RVD_pO1`D4wnO!>JlX>vuv}YH`bU+XwL@QDj!#BHK{i(^d6(spZ^2%dEKTO@P}?ussd=-s z9;MLm{pEv!H~ApR?=lmJ)i>5}3aRcfnq+;V5_fc%ZrI zMv0GSUt2c0o5dj|zO5Sg_yZKW*8X8ryy1MHe2MHx?)Nh;!hvNfMhDN2G%llt_j{aL=UecXIL|XHra}3BmBP19HJ%lLPW!p9io5q3dDYJ`0)JhR<5 zE+?c=4~r}D5nZAM=QggSx0NUjg1VgW#%G*S7%$hQox9C(!Xa9ADu!9cveh5G5$Z-YVdNNNYM)vWG{ zw3POP>_laixfbO!zJjuG4H$smfMCv>zyzsM7^8FVzPP8SrvUF`#0$NZ`U@`SR6EjY zv2i+8P;pvyIwCNSDig37L^1{NIIxArVe0HqD>AC-NfA*{o{f9F@5p*x17cZnz9IUo zx9(E2D%y|uem%q^b{l{9Da;>ehmRF6P+uXP!i}O22y=+7-;;lh{?WA~^e{=6&0AVF zR)`+*6w~cz75?5T;}Yh+qP#+w*H{psX`}~hjW_T@(*ZEk&Ac!p>FR!gAA}<@)?&l#Vcdxi@{jtUhrlT3K%k#d9$JLnfgF3$cLxk0zdz zY?ZU?+t!PZ=sa7s19Ibya5m|%zIWu-#R|GDsg{#g_^{O#A%KvUtq;^>R(lJ>N=cMw z4<#oS3HgL3VEW38UP~&*2o7Mo&9_ICIIKcCW@h+TwpRl4p`SKoqfN}=#?|;D!=eU+ zF3^f#651gYDOnRz<`(96h6|OcJh@{!Q0{soA;7h#gTN@WiPLWJSs}Jpwzhyze=0Rr z((%o{`3rUY<5I;&#UG>!)5L3>;L9{)`Q1}MDbAQSkp~Vn-gu9|Iw>g>j6!?W6(~w2 zi{jf_XS+$aHul=D@pU2O#}bs`cxO0CSU-?9J!5=~qBhHe5h7pYoV3A#}+=nlKFTphs! z5i^K^0~x|}7NVYa;nv9CmFnho)=>Cqdsjep@CfXouJH0-)EOL7RNo&Qf>!*N$WYXz#@xeM7)@;REH67&*0U^ zK7_iUg3Jm7E*n&__=3r{Udo&C1<}Vg%}$k_mHxDG{O4gejO%U|<@F>9p^rvzhoH1D z=?1A6;nA`a7Nu@ufA57YFE5r?Zx2-4R>tp5C6f)F2ncQ2;3j;bcn@qkgoHvFclf&% zJhIlz^Wpe=2fcpbo8T?5;qkHQ$ocsB)#9QRm5m;C%rQT1ED`Qlb}9DIPq+vVdjP)6 zj~Bj3{}63O4|K0nA)iS}#wYN~EL7P8S)K5VkfpwBpprZW!8Y#a$}oOh-%uM}M!g^? zZFa9nCyuZ+tL`iGciTdUtEi}utcU2ocCB#<2rQPkI3?BU;Rd9Hg=cLJq13ta*pKc6 z0mP_*-=bsF7kclHxF`DG|31)cCC?Ih(KL$9rAY(X4ELv@ZAgSY{nEP+>P%NST4L)f zO#$lma18>qHUdue30#BHnGl*+dg60jKIjwxPew&TfHJXwz8GPsw=_irybvn$?l;rV z6jZP>T|HiR*9Bm7v2Wie?`TBFZEczK#@;vYVnY2IFAE_n8vit^pD<|1nAk8JI%`wQ zqBT+**jK;M5wy@Y>y5RIAWaRc93hv0b4Zja6N*yOF3URQ{o@hzs5^kjQ;k$C^K zcX7bU8nAZY(UFaOKYE6&!eKk#J-xb#V{obu*Y!UU{_N5-bP=5RAZ5ZR2$eCZg#JyT zd^<=tM3L?x>GqrZ)tB$kyd(TQm>ZChv!dGcfbYE`981yUg@)~XaXRyW!Si3cy0YyD zH1_Pfb``1sSAQ8N$T|5BtUn+t%EP^sXQ2Nt;TPTblO@2 z<%SN6i*6^MXHLd%1x{U}!6ih2gXP3}XZ2Y&a?A!FC-K%Z?R7?WmcadKn|0HCyyF=T+@-YN-9Z&5Y zzi*gN2z`dYJ=7Xe1my;}hD9uMs;fl&MXt$yQ zRQ&UUwg2DsO&al5J5$vj)ZpXzpxrLkv%E*{zreA2YtrbUsKJ2Ahake~|LT|WfNdc+ z+n5)Ml43KBp||5!`8uN?_9-wL3W{_WZ%(k!NXQmG5e|?^KaOX+TrtY_eR|&ko-O4X z`&~Ak0iAxeI{Drh)mzQ7Jkg7$8;Y)WdpRwUeD0AT-(o$Wj`7}@IWOuWP~l-s65Zcc zVLy-4Xmw-hSZPn>kmxw8nP;i#&Wd>1Oy-dN`ge@y7RewXV)z!N&!c%m+)Id>!BCx=LhO9&AtH&R$^8_}z(A%W-sjR}B&EX25}5w!`|B$-f(I%%9vs~*q=~vl`Oq3 z18H$Be;y}P5IcxD^{Al49h4X^gSFpq&C-alm<&Cx)3W`xC`gRY;`04ha`zbFh}6S8 zm9#N#Hi<8R+e65EU{X!(?4QHhlf$#R0i)z_kWQWLRV+E)R!SRA{}!|Lv^G0zzII1a zn->>zdlDc0^X`7C59U8^l5ZkQnQQ5g2;*NEAk@+4^JNb8L)*wr>(~b!(afc3NoNyO zjlc{#^xj4diWT+i#48R6u|W^EAj$(&XTFU~sO8Du4n`Ij7&*dbNqsL4-Tcdr`qM;1 z+izdBHg#QTLBk~k=$e;uPJH9E)vUrqnjW@H?}0%eb}wEitpCojhqMP$DgoB zp{@7w+F9QtUgfx4_v5)c5{Ymo{Q)!Y$}n7GI5ZgtW$@ryUe8$9_zVedn)PvJ>4rL( zN|nWim?(l4(+wPHEFle%>^uSfi^RCDW@I1~5VB!T_CTHEOztD%nQq>ScFQyNZ5Y@B z4fnLJTt%%D^mlioUJxf`aR|r_`wV088$Ju4G~L3{@bz5QLNs0aHE^a7LGHEFb2Rwg zmzRw9yY6(QBhQ<=MIkg+%3G^+y_n9uMhFLM|%pn)t_~PI#d`_?S1>+yAf`W`Z)A!J?B#Yl% z~4;)V?S8h(ttP$+q9T-$6pFOsI3AQ>&is4p^C*Rv9G>Vqi{3W+Nd+g%8H zlWWMbNN_{Kx`DIE%hPxZlE|jykfn$!NSeKhdsFj4!roWp;}}(Pf_BNA98*026(sFR z>|MgJ{3v5ckn666tpcLh|5?(+kfXt57~i&txZ2O2FY>G3Va8N;-s9V^gx;NqKXQSD zPkILH=p>}c4xP}U=WZu6wTGmcGA~J{fHBs@#8?O24$l5y5}rwvErC;hzQo4iP$%0p zXH-PS_o}T#3X1DY5<)K#pRZt|{neOtqjJvksjIjvhwHs}?JlJap2jVEgv0Dt8_8vs zt|EM9l+U&r(8Vh%7ydq_;wt8Nn%dX@9+w0S>6%<3&BTNnmV|@REoZoTizlD=y7%+S z{MxXs|Lm3oj@dPUb5i>|g5Q-$fZwloXl0|GOrd9oOM?Wb5Lw>263j;n26i(Jt-p`E zOZDJNWm&!+l|+9w-+miO=jB$oelQYUcGd!d3PypCEYh0{gjB#tPkU+ox!{3asnB2T zeC%%s#sX$nJ}lg9Tb3QN#wlszZ?o*2b#D&0#yNuopAx)S?vVPSBJZr>{CiQakL|PR z%-XZ7?1UfHXASRbA*bb4Z&`i_ztVJn9$vEpJ0iMMP64^9#|wrrL-@ z@Xrg2fbiNoPu@F9`$ukPCrNM38D)5;1*8CJ2 z?9Fwo-#R}~I=+oz0+Lc#d+yzyGU(Z0VnS=ThMK(XDQM`zwR~ot_S@5 zHm}<2y_9mZ15wy6&o-ifHs_>8rrO@|{IRbByKGlrWkAG+n9L^ah)d)Y8p6~0)32}8=c^&jc?}AaGmzR5aPh~Aa15|xKJ*YW2!Vchjbq#2lbwtfklGd+ z+O~|3Xj#66vcqeoA4EyJ4b;b}%WdRnWa?i2>2IueFM+RMTCSF#ayzgfjUglcN_;J80w_s#EZ;inkQ5ZXw4&6;54iZDH(Jx;}X>}A+ zr7fDhKse89cH=Ml!|e?|Wt^d5%beb6IlqD{ef*4XF`u{J+;>A1uGdcDyLnjq7vi9E zyUNXdxDs|6de^pm-wQ7EJK;2bavjzljnUSnuZKb|ndn6C{oX}~au=N$22aD@o~I!n zf@y=*^HepOVxjK9#6~iQ|AfMDut%2miPPr$c^7RgvcE0FYnufLl#>Tbawct`AlX>j z4ftsOeLae#NYA^Ki8s#-IJM@Ja+lnWh`N2eu+oFH^~HtFk~Hh!6nNS1h`AGCPPAes za^)zG>*$K)aGb4myVfRlbZ@smSatq9)0Fi{#eVyVXq|shP+s4-`InxUv(f9&+bI-k z-N3==sIxTaxZNZc)U?9^An^j%?Z)LiM+u)@j z7UZ-yfP5Kjs>nTxwS@8oROA+fei#whRAa0_XSRQOW%9#AEe0tDCi}VnlVc`|+!m5x zqpKmm>7Y$i6u~bJfi`DcR%}FBGcaRA+nbBZ_g_NoPA|n)Usr}eHMJ?AF*g!KI2+eK zf>FqVa=`CzJ!R|YmSK_BC{G1KtD!+=LhFHicr@olA(=P+08KpqkKLo>Yh6Ne8@|HK z+TdoLcsSuz!wX>-<9z*g(~xQh9hK2*lcM$`=;D+&iCA0J)F)AF>jRRauOABe58#To zMGCQnayi{V-6nt5xZW2k>Y(}}KJRQdtd?T&s^f9eMr5QR2`}yrV@ve4&d%i}1>RkX zmfH_H`gi_+_{)KB5mCj(RrSsd3xxW{C)9ilVpg{LJ7zxCMKeq8o}B{ij~r+183oTn zK#ZV0asd+jB^2w^6C>f`tBX#zsvihTzOyKi&1r)18llp0z=I&ExPqoO26{4Zdr_1G0645)* zX2 ze18LY8ona8`Z})%a4b@KYP4w`jM;vppDa4z;o&8^{2@JXXwB8)<$O-wm$r{x_g6| z5a&LoUlC7@cwwy`PSG@fK&&l5WChEmnaHd)vPOOcp_A|R!)qIi8>F$sBwJP^-im<{&VVzZm4%yDV`rUvrT{+ z;1c8-Q1nMexBvX_Sd!y#A@I>^H*d8;Qy38&%+bxiYX@~6Zw(v2?tfo?GU|Xi&fB`#t8o@AJfUd@zbA$z2zGjW3X$dYM$sGCit~MF$j-soQrO{KVcf z3cV4Sr~FgoF=WVDkK?~50k>y@Tf7Ie4Se2GBH*^)wRo9wLHgR?j{C&o`H1dn>lM-K za8B@ll2pKKQ-ENoaHB{LrjZT*uZ_Zgki&?;q|k2jOT)_Tg0@peGC>|boQ~;#QK{s_ z$1Htd#sB`u%iad#b!0&1<;r-c?N@Zf{g^NKsC)nK;$?nxvTPOTMB4u?mT1o z@%h#8%O0AvB+-?j{|2l>SCJ{u6s?VKiIo995*$c$|cV^$8Edx5V*ll zSd>9Zy7wsX`7HT*HB%1Ccrsy3@o}PJwo=4kuk?uC2F=|Wb8Ffm(J54j!Qh7z%WdiIe_h{{4cwq^3SKqZKRD}?TtToD?a#0Y>f;xo16U1kW*w$ zRfewhBZKCWuFb~~INH55dytLdSTO_U15kpgLq%|#uw?%$WmQc>j-m^m=(r9@G{U;Q zMDr&VpPq|al_kTJk)ZNs6IYW*V;NK_r7DV)6%_=WTi5npY!eX~uf6MglNpR&L_tF- z+tmzyz0(5EpB-^m|FS|@o>rdmAdCwux;UQ|ljd=Mq9tY-3E zJPyJ)fjlZ5v)4Ax8!Jm3c#9*b=;vtE`l}-a%>=!X4>c#oe0KCd)+nqi=`YRx!dzf! z8=&p)$j-9}%ujE*D6jBTYbF_@*T6gsMUlerc&P(i0#m)Ko`cHm0{cqpCVPM$H8M7r<7_8LUdOUCO z?fP~T*o!M&N~d7<_j|&hu&hsg6zAt~6^edB@m|fxvfervt{h%>)b2bYp_pfMq{)x% z&P7P>XNOIks#D!@v_ggaLzLl-Hvu7ph|a_s!YJ6Tkt~-aGfjE#({5Iq+I_&yf5a^& zl5|+tm`~8f-V&e?^HAe|ykT}ce>$Z(DLfV3hL^=BJL4WW>cFWTcv)+MkS!Y+w)4dk z9_e;p=JG~VJ&rHwRycv4|^H!qwR6#?XKHv zVzd29s*E|PMNQZ~>2F|6!Q5<5$egCptfyL!Jl#{UjO)6P7lfypOeb<1bJtrvj$2*% z`b>kzeQ)tj_PVWC-8B|kg{XDG!e1ot+l8Xg&qV^y7&d(DHL&zozImCc-3g?* zi@5G?ryTeER~?K1AzK~f;_7*)i#fq13e?lp8z&K;!C%iaQan^wcpow;icDw;n)Wv7 zFHJM}uzbj|ViY&4x$Q+#9firwqPFt(c*w{yrBI8korFR z?5_y7Kao7cN@CC`94k<&H))BtK_zluX7QO@J2TQO{4o|9g04g8iQm?;hu~f5<|KMvYk( zUczxkCrX|b@nUs;Rq?UG^8Zowjp21h+q$ux#&+7+_KKaxw$s?QZQHi(q_J%@ZtULG z?tRXA?(en!jXA$L#;f78_o$ZMj7-;R^*^yH_- z)|FD|u9lE$l-<;%&#yOtv#J?bhnPkV99VXazW+S5w#YJ_%$SEIN>YR!HZuuVgjSx|8=tSKiO-L!L+isxRns1NadnT*%&$3ubZpBtw zm&v@S)?8GyJ=nqBg_nC4Ma6+x$loB=BS!Ab@zF@R`*XKdT-*D8EV$Au3g%dcaaDiw25UQ zlkEj9KP4ypfH3=59s~h|9T41sxdZzj94MJ6a5MnuHB+G1%a?J0Qb>;~{#Qr{Ry5zi zCMjxIFVcE;X;bMD+Dsr2lw+EfA~X)-6%!0OrYAuvGbS4gYSf?i^9wPmECB74)8DGi z#`FBo=V5P;g_}VamXS`pU!BcHi$5@f=4}qYY9Br_8-CS?3}%e}{Fq?t$BC-;w?=lJ z&{sA)%%RjIw>ct8Ljs+*SG-cDQ{2&9UM(VpbW4i@RH41kEu9}c>w&K^1~;B%?+Tm> z-EO3qAbF8>P@Z&j=30gLq&Vs!;Sg1cUr~<3huOkXP>`B*X+;`)pFh7o-AkKoVt1Ki zi5a`jj=_z3w<-7pCE}Ff{S^4L|3?x#qDJ1M(RUq@TBX85ZQUJ=n&pk6nR3!NkW8` zhTfi4#DzeNCp`~2`0vcvcS7x2$4m`_aijsl`7gP*9b6`t6CwO0funB%>!m)WMWNV8SvgBijafU&dCtRi2X7gwW zRty;G$<1=CJ&*?`&S?os!*es6#YF_bKh4vq=L>jF5O7bUF2F#u!60d>DnPGxw2XK^3IzrF1c9gE z9oLE1(Zm)LAHD9xS|gedh*zpa-xX%aU1{d1d4||zOu90@WRj3UMK2gVOLO`TZ8hx` zyxn)R{djxzVAXdLdKCp9@Jqps$<1(z^*w3xJn0KF!T|f8RwtmERpkKB09Enl*HWLL z17v4Ni_Nuz$OZ0vL#mhaY4*O%7h10^!WL3nxBYM`#F%+16}zPtH^Quv}0!_`dMDdFs?Wq^M)>3L@ylHsqto2lnr3$U8vMr$e$EYK2} zuMC7FFI^dAk=W>j`uap<9Y`|~(^Q9C(7e6o#u_8edIIkttd>MtiWvco_qxaiswS;eptCp65CF8ONqO6SYDU7%`sd z7I9C7^Bz&Ll{wb<7-s54-=BFA4FSC`{Nmktqs}nh(tz_G@d}zeD^OlA*VQeHXjO^vvyj zCl_PJ^zCxb)f)@H2$zWXEoFgv<^=|zz^!jmXUxk2BL|Lu^d3VxPPMgkTk{*bZ!g`R zDJ{e9_{l5C zCg?Zh*mdkGM=awk>QRvm_NKNC7sUN1{WK^WWZb1UzS$t4y=Wc?UxMj7#L|>Xa3@Ko z!Xge#^|G2;#-%(8ip%sqTv0q-n#r{ZYBiyQV|yTi80UsCq~q4gg4vtyl?#44ZRA#dQRxXIiFAOXdZVeBxph#ZYKQ4TlLKSOPexf5n0+ z2Xni>P;}Yit3V$5K4|x^BLRC?e}Tk4V&)A%PFkS-0_(UWc?4QazGSnisczA%>gkV*X2uVJ;h z=MZ?IOU`?fc|AaAaEvDI+t}3Xyaf4F-g&-BoKXiGB-w$mUe?EQDqWj93i4RQ6AoUZ zLHUEORplc0E;&<9t@Mywa&4+gXXWf_->(Vj3nVv%3K$qeuyI(AbSnMUSo_!W(9lo; zhZYzztk{QTR_9OoD8h=YRf^B{0WFm9&lLZoI6L%u7!BBZJM5pJCh-x(km>)1bk3Q- zL;9rt4+na?@COya$!ElWd_@Ur1NPT2V8?Q{W&{L11t&lfj<6_7rN&}I(j6^^{Oa}T z<-_j*JI?@qnF#70oZr@ulvo-M~hO)6fk`A}00bZ8n&Dw77Y41LykjYdtYeu7|z)O;ymX`6$HiJGk z=W2agtJ28vYyYt4QrY0}3DAT~?Pp@A2#B7YmK5O?c)U-UO#c%7fJ<`*LzB;WypyBR zZRG*Y#^lGm!s;RY9Y0xs4v1MFgPup3!-dD`Ni`H0iM(S)hN5sTY~eaA8J#d64|w`B zBBlkJA$SifZ2xff4Q;lUi_>DWOs*61MTUK=ZSBdkZ3~Yj9_>dbMkr3{jQra2=n5Cc zJ(~9vN!WmBUth9v?lYReyG)LM3%=)8a6V8Uxm$KNW{;-#WeMgEbG2QL00acJ!7 z(k90{kIGWBwbn%YqC$El0&S>ZM6(Jr5XqFdB_@(EtylkdQ-m`h?apn!-V!cBN1!Nq z7sKeSNlwa6L#me5exV`x1)?cPqx*M8pvFR>G+|QuE1Y6Rga^)gy8&*~yQLCpQU8Cb zp!uk_?yyS?4mTE5-da^{Esv50hjk(`QIH6@m1kVa>H3$&sKSlqPUy$R>@X(bGh3Zj zm&Lrf*YYNJ&;m;}Z10ww9^c8W>Puxk^NJz8*TxxCAWNB7|-Fb#3puHW9oH}4p7ov)43)F;tG zTeM;r%g&#VH(Hh*WSqOtZA28}6-mLnliD-zqe9%;d_J<4{cz<8gaW{9ED@#j5=JVZ z)Ie9slPo(WlC%AH4RRv|=<4)!LsFVx?u|Hn`m0Yl&#!ui>nrn-_WX`mF6@jW^Y}e) z#@gOKk>!A^4Hrly5{dZ%dKa`uXy|(;LJ-#;uV*EQHa}=iSewY|tY8(c3+FXV)r0+d zFE`sAiONkvWMeOM)K=zS@RR{B{uk{LXC>MOM<_VTsqJb=n}J@$$=`4O>1`m~;V0$e zRTmR){J$t65W(ztXzUI7z>G& zL=~uKYWt~>#+53DfDM0qn;T%}pJ?ISyrdPAL(q9wKT0^YhN`SRVh9;DztZ#A z%ueZiDGluPzgHSSgZ4YOE^%{-;|fZYVc42upxJVPA0j|0hsH*A5IIsO#yHg+d1>RY zH|TBHsBay%*j_tlgVSIq)XNSmZZts`m=xxKjfb-LLgO!-*O79N0HxZw0*Y=DBH3}d zFTDEtJ!2N}@{RQGuNzoX^|E~Lfc3y;H)$`RCb7kGnX@_{LK+^zNr;l261wi(*B8l3 zFq`~>nzbxQg+)`DsNBY}Sd106d9~j!kdU|!@hy(ex=K&VE~{{6T6ZMR zwZ>ALX@&dP%8{rhuxI4g)4Xc;utUmbcqS(3-nxfN$BZTk{0AAF!6-oC>+kcS;TQU> zWW<9Ijg5$-0baL}cDd~>#KOYD%1{B}NrY;=_U}N&-hPtre!`P&otmxsxF4_=}b#W%weavOMDm#_4>t-$)g|009$+5#SGgK-}vN z^EU3k!$81(#BI<`!6EC`rW*yWnlL9-El@a@Kn8BMfUQ}vxPXSQ4y*KNDCt>(b*L>h7{IE3@0i*?SA)E}2z5DUnws-7Ax++ENUNF<-3*-QJ8 z&*Yi@t;eYT=1@2atBEGG+Doo^%kHjZ$&x03PadTh>@tE+j{6y8ZAw0<3k0!`WTeOXh1?XL39ZAKUz|l8FDj_ z@`l@ja$X<{UoHcLEYpN1#Ekxr+`$@H!Hq)A=d;y`UDB0mHcKsjnV*s2NT!;dxT6vX zZY^CXR&IBMqgZd@=tfr`PpfBa?A1cw?DoN;d#*gHYIrtx`#@Z@_@Y{0!~E*zBw}@p z>*DbZ1V``W2;iHc^ZOKjxr<7*$X9*j0My;Dk{z!=0$IPoFdEOaIg2#ebYPuUlrR$`#tc6+^T80S1PE z&Ut>ZUMhsO?`;sxfU5uU!u<4gKDDQ*%w9j8Qzp)W=)BQ2%Mp8g05Wkozj^3d1)fXhW+ae5TXgK zq5C}k34ctbYxVJ3F;ELH7nT833h~u6i%i0EdPNFYZ>v|Ks-kzxStj{0vP^tGQxrCa zMfokQ`24M&&{{73IU(V3w_R<<5WsFT;GcroWR+i7Jki2-b=V}fFgykc{=Vv%L_{O^ z;qlC%fe5iB+Q?h+iiXRCfGO>qeFo7-POcsb!vn=Jx$8+(X+)d7XHsAMnzhkkx_G&+ zeV(x@XVrt6mya%uykCBYk%Egv2#6#GiXb7*byY{uzA5ttd0`W*rl!`ixA4~NMTKB| zxT!)=l0bs$3B0E!{Q&w0_GgJc=7{LlJKSOMF-DRBd|^P<>}kC^+~n3(Dsi_!-4oBvF-o0?$~X_ba}gf8Vb+u0BM3) zE_70Yf}E$O`fL3w&{_y6DC(NC9VJ<$HilM4u2^Tv-Zm^K!A2^KwuPz$N0A>N;HjJb zWSmU<^J3sH{N@%F`=^JP9E^)6mKjB9<_6)UJx%(jLZP?W89(9VN%3W}DG+)tBb3VB zQ-3zL-8XRxa=Um8j3>NjBa^G=DeS__QL#y_uEp>iX|=4_1K9LDU>KQYqAK|5T-A@y zeLvBb{4_I&5DD(}rW)2i!}x>=CJ~qDiq3L(wG~GdRw*BeYhMfKq-Av+KBi8#x;az~ zBK_1vA(YoH7Ns~xu8w8pJiIQe;qi&&{w&epb+d|YsUQ7xjprDP5v+1W?Kh%ehrtWc zI-16>jc|M)`lC$-HsCR>q~Ushsz|WgR93Ig&yJb6z1jMRwX4Bv7o3b+yTQ3RKu8nz zVoxG--}(iW=m9h~9hMek_(a3}WkTPH29-f76FMg|3qB|m%uV^}v%e-t?@yh*r4Xm8 zPeP*c&p4pHMCtyoU|~t5!5ytl(Se>(N@h!BbCZ@ypB5WM0u*fyKpvcvc+6Fi1f^8f zvo^5vXP#*1F>Z!iUY{vYnD4Dr&7r3Y$#j0S83F$T8@tqG9E@%Vd8!fh!kx7%2x9 zFh^k z(z@fRXoNx3s*&w^Z2!oZ8EuI`dV<&PIH0}B4st!Vhk zmrNlT0lZ=|njwZzTp@}i)xrs=VN0$Ob*!s8Z!3mFG*DQy#7(WOwfb6%E)YTNKK=xx zU;&H8x2ww=JI4Ho0Y{K+E&YiNI81?(F9B~~p(2d%slQJOat;P*Yq5>)F72{g|8k7R zred~+V#xBPMrP+76enbvJV-10rZOJ5K^HotEU!+YZ|4{RW8M< z)p)EY-FlFgTD2xyl-~`DhUseiQLW9eX+o+1Ytm2eN9H>GeS;59R6aK+d3{kqld#~0 zenvVh3aqxaTRvDK2__UEMv?4J?@s=E%x2)67BSyo2RIGScnvzpG=5p5#W=-Ey0m!i1DgoTS8oaEQZ@EjpYZPhq8d5D z*|%-_paz2>h$3DV*2nO2%bG20ibh7R;@ulvCBx2lqRPQyf(e0$>1R>Q>W3WBsl%=U zZ9xx@LB$rNi625d(?-iRmi8ind~R}!%VJ*pqdfJf4FdI=^)`?QUQ{S3^pJLI#8i=CZ-aY1I zT*T7C{3AihPTUJH`rB~+QV+4~A_o+5(|Yi-k&h?3bIPsh2Nl|Kl}t>b54lm6TrQp? z-4V<^+HH)J#UBmgbvaZW?jY zdN(Vd`-c~LCCZl+53x1|e@ZuPCrS1w4GDQtB~UA7Fh~#gkHAvZf$D{_?qPW_3e?}5 zP@wY;iH`m&VLLy;hurAzGLIM`fB$7@B$E|`5+?R&XaaLV)u+?P>m$iVXQZH8`)EX| zfFv832Ui|Ih<^(jZCq#rs|dF7=7W)$uJ_Ir`bq-rXRL*v`q*&$R}~TB8Y4yvK^lfP zf36-eU`qZ-30+JyC(iu#IiS>pG1thi$If!#acE;YSZ8FbDM2g$u-%8)1T2$GHkg3PI1xS)T%;WqRSRDjvbh_Ck!q$_aQa|@>S zls*9*7!B9JONmW$4I;E8cbH@%jJ)wnbatH^Ji}dX8C|qIB~s?4UKy*wn z_Gt7~apb!?E>18o|C8*gjneKAp%e$hfz0zV-L;AiC|P-gTgCbf5Sn~PnUst%L(E9- zsB?iiD+tmjJ`sLCaxgMtxgvG8x4&QxwK8xLC!~XKzI|6Z;<#H_R&kecDVl*5mmrnZ z!Pcp?13&shvIU{qASn@dtY4E-n161UH`KDuwSgoF4sf=5ic5Nhe=qwvKNf~}+I8xp z|NJ`GYPHq#!D32V7Ov%ky6thDz%#}?2-jp0?P0e1>M6QKXKi+;E0wDzaJ3KfSe?ne zwIIN2@-eD#s=Fxi^m2EyV#f}yns!AhAStqPh`W8asOCVs~CUHty4kc;L~Y$XH+R+F5`WUAS39GK|gE^i!{lR?*fH{5~*|Ep%3@&XQf zl@r*AW+JBHMzN)_%o7}&pNL%OW1EfoxhDm}e4=kE_-5k~UO7BWnImhXUw4NvH-{4{ zh!}Iqh$()*EV#<%C$hF-H4=j|*ZGC2Vt=$SoX0b{>z(p(;t)aJ3;pV`kotIvt&5*2 z#c5gLQfcBTnA7%1EW(l3X6?(iY_2 zAO1PgI(9*EkvGFVA0OA;iAI&9)4(O@R3?%hUu}uxA`M!C5}%Baff^24)Ys{A<#AU)$Lfe&F+rYCDH~cccmwZBlb&j%)tRKtuD3c-rL? zEEeFptT>tOl%>hsl0$IV;R>39zZM7gR@ktN%}sX@Feo>;3sL15OVNY%_9q}`O_>KR zY{5YG$fm9gcU1`)(z&qY^s(gKMPBFiWV?R6d47JrnVp@rN5BN9F>KJetaQ9fK~!O5 ztNifHpjMb6)ILJ7=llL21Ej>!UwIqIS0LAq*`J&xb*D%KV*zLd9+RK5;j@=Hf>Fg^ z`ryx{HU7B)4DY``|3`Bi7h1q8dc!=x(WFp6$;5`yLy78?FciM&)3^Q-(7 zhv~AREH;L@&SZME%lZhr;h@o=S}~#9FE?m4CREm!jY6XoEc#1|x0Y3vYSl2QSckO= z$ZEep**LAF55BZO1N%GJBMbNZ0g5k_sjxjo+h!;}v690r?6(h;{D);0mv+&e20C;h zM*E1E-&8e%8&XIl6IH^)ji4T$H7HqS@fmi3AvPQ{ow@kf&Y^O0ZPH{H*~pW?f(OK` z=`QW`Nd{zvxI2b!cw1qur<<;fH>#EAxcN+efg_vjJ6oav?W~CWRzBq3lZb!Od|gU* z6`Ga#JHsW{a+hNU^T_DH~Z;yGz#hlEdkQO zfw7LP?3C4tl3-bdZ5Q67@nU?3AtJ7PIENE{4%Q>N7jZDge{>%x$B?>7Npd%C{B>cs z-^=)M=O^NRf&}10?rs8N&%t{Z5qwakzJ-eZ2jhTjd(8xI9a8`65Q1?Gy4gI`CLV^q zspwe$5ZHby*0#|ECmQtvk%*Gl#Yy<5@quvS9fNi_1-?`)sw?ABDQRVzE=mu+555}> zuc*W`L%_U)++x}0S?@rUp`A7LZPPo z(k{zL-{*oW{pxMNt@-BnPx_vFc7x8khThEDPWm)60zNcT2dE7{#(_T8n&cxsMY)6~ z7U^?>ipFPRBYQU#f{)PDJFnp0=YzW|>Pdo*p~%M|4rZL|Rps-R$!k!z42kNTgL~Rh zm1po=!?_-Il3LQr=k@F$WLV~%*KOFRp~g~F1hGxX#a~8cg~N^=L}R;-x9=vvVa!0F z=TmP8b_RVW+vRCz?UK-4zYnq2eBTQ`1@C!YRo99NUOO^W8_-?8wJZ0K?@=xcLO}Jt z%#*rlcC%oeiy)re;jjYjyvF~Ir5akncrWlsa55|6#LU4C;5sJHjc z)tZ~c;u;g9bW@7YQI&8&z%IMP?Ed05d)U;_gs5S6y9RJyj$rrx0%|i12Q$WwYD5e!pAH+*S{;^kdPY}K zbK#KSk4k@`9LfBXBG|unM$ll<50j+oPIu`yc4lvduLoUVVCm8bgfw^Qxe9hd^5iy6D%@np_gp@=-hu%(?#dk`kQ(=D_7pS-j!FVV0_=O+@8!=h zZX808knf*ScBv2{CDgjNMuXQ7-TwU_&EE>*UoTfGm_HOO?(Z|M|tmSG#pr; z7p8%_-Yyj~YMuRdJ-3gnw~5x+c3T1OgyITG^tj^#X|`{kiQ|*0TN>}S_(nLwlW3)k z5bwdEP+KD^(b(ttLIw0-206K5yh} z&F3$`FRmuNk7{#NcDByc?S#prUDofgu;Oy^?X9RmKem^THPtQ4ijmKAojvw1ww=4g!5xleaLbc1sfbx+B>55nKS=>=}^Z)>T1@69$e zY$jZGR&R-Y5hVOx4)_cFmHh89DvM1aF`%Z31**|f$o{e&hB$%^QGZoV`;J=wmCY21 z{GatHVhofbGKOR*pkF$3NM;BKSpelvFJ*5%~*htWAH+5I?DBj_>lhwCriJ!8l>&U9@-cm!w^ zBnB*#@aOdc=K8iHv;op_iZf(jY9~rsVwdHHtp3VO2C@nlmH7L2*MIKo-Ue1;+q|!1 ze$wENnXr{wb%caKU3}v-<*7pVHu!V8B@J{s!&Tejy9f+aUw^SFX!csNRQ_CY9}rb& zhEsS;2?lTM2D#s)G280>m?wEE_4WBl09cK8$(tX3)T)epef5~;6(qx09;QIRJ$l;L z6L1;(fOY;o9eOVgA)d{My9nuoG1i@gLXJyc&*eBMqqEYq&TtyKADydW-B&u%%G=je z*e@&Bkx~)qrk3U4t<%I6F1*4Vh(Oo;;3Ci^TVWL94xZ5-r2-W)L&!`#jx{Ad?t+MD zSVs*GOt*%w^?(TSxj`s;o-pN`rRZQ$1C`E)e_qMMja%Mil&Kh>jB6HSqd1e{x0kf5d<^Nf0M@sSmahxYP|S5 zm*3~-^iT6^&68!a#a}4V8Vgc@2UiRt7yfxB%%bOVu{^xePv0oaqd(pkB2Sk@Sq@m7 z&Maq;?uX>qd!>U+?HW2|KkUwq zETRR*Io5eg--6M(Ry;rO17Y+9@o`}2j9SD66l8KbQY~1atE6_ky2Sd@CH$S_wEmQa z4@R{T$ef?aXLAp8Z>w}yoN0P;sH#Xq7SgPBgsWROz}gk|!d792f8iC5-Ejn}hGyyf zO5NCRLo|aJqW(+p^i>Yp{!sjDumtK(Qf^@Q733NffFm2`N+GjL-}-M(5G$FCj@-`Q-(fI!6$Cfi^bD|`kLr=D;G^FSN2>1- z5i-#@`jeBJ=cU-y8>lp%TU;M^N@?Y>ky!~Z4wlelyA{#3{k%P89SJ|)igDhR0gu;7 z{XGygGsF{$d2mDGMReoLKB=aBsH$OJiGtu#Rcp`ZrcfnJQBAQU^E*JNI?`hS>jOV= zU(!X@>u4snL%{bI!s;S9+N_vKz1}d`bJrhwlfZRzPqkL}5;Ev%$9ISCZRxI=hyYhxsT+T8at6ouMep}Vb4={HYUA=6S<|**Px6ZT(W`5rgCfg&m}CR z4l_=f^Lb9((l0)|-=@abo2|A)kogW>uD7QWR#0%Ozq#%WKu&M0UiW-H)ON1u`EKo_ zr4>#5Id+Yid$QcB_4*NfE>@{Tfi+eUP=<{4Q0dlxyqzhjZN@5-UE5QU*8ZBnaJ*78CNW?^Zf6wbfi*zpqr*XFX#xSl{3wQM*zObXDUb2$6UAU0y>tf%F2WB zNG?E2{4)M4zdwdFT>w0V%%tczq-OST*k}OPGgqE^h{FpQr5$>_dJ4*4{JqQLeWVR8 z;4U?HSV9O$LMjyx0eRwzTj0VoB{YbMuP+~w`FUrDKr)Z~qhmU*?6EsD5(5vdHz z&H4XPMYT1!2>>x`v+*x77?dq$Fp}4B%up;d|o*mAKEFER(2!>3sFmy?2A!z*l zP%%J2g>j+i7{(kn;}Doa3cdCyxTCh_4Yds$lGjzgSso?UFJtGRLI1|f zD@M+uP^r3(yLZ?OzzxD96!Jk@wfLpGzgu>qSe`r7M_=+f^@VDQORVr}PMpXYS>U}+ ztJkO7%Eo5+HXA&kq;yM`W6Kx}Trc2?;d7rsMuJfmY?4Or?a{tb^t7uT{XhnSrwN9g zOG_o>A^q!bOYlW?ZDq0WZ0ynJ2%lT%(yi|d6LB>TI;ZJe0h`{Rce$>)?}t=dH#dx< z(HtUD8+N6eQye=NudlD0SiR4pPxlM*3q&&;cb4r(8#@BwJCQCc9mRWK%%j_j>m8^U#HO42@&uX?uvGnDV;w%c zZ_1irjD9R}NBRCrbsU?5H&bOAW?$T8-Y-b0w8TR;*}f~9D=1P^uW>N zVT4jCprOuGBOg+pfYqY*!h4R;hW-^_`S~6a|3#nwDdc|cnt>RgzTC90{c3b%IS_D= z=Tmu3W}nsT4X}+{9imA1>QQbUv4-sdS^#9OtJ>f!_KO+0WOhfO9lr`K*B<4s?Q&WSFG~=dA}?9k=xg^?|gx$ zYdCo**2Ga6`mB&N1^H(=)LwdZ!9n(qd0Vq`dFz!j+oO zk=iD3DKxWl|D*QP7+GvuU0!i&s-Dl9MY{pM&0H)aj8}+5h#E&bXq1Qw7A37BItJUf zGd1mj=5n1Drshi+Y%>`_m~YC$!s>Z4ge=?5KgD)rbE*Gkrrhz92ZJ0-vS!Td$ysr`=MH|Kj3NURu4|)!DkjD zkBb8ja@pvEtSI@tU%-rvE*+a6MBMc5Skb$E<_7$!647D4Qo)7II`~^|!WevZiUT|D z9AL*?6!%4!S4tD8;=959P4fvi5liu3N!W8B)#Mn^=VP#qk^>~)!QR2@D5jJ7(;S+w zgMwIE#nV-|Gb&eRosGbRBlLk*pQ4EwN%Rol38L*5&R|xPdc4Pxs?Z)BQE}#gRd!0= znZ=Ldx$bI=@pnT>wqeZU?1l&jE_tF-G_pJi zpftltU%G2<$>2M?)VX}lvY;rvK>o(7$U18ot;P;>%%^DmhL)HmGO0w~9`^*35m;C? zIN977^_Afcg9=(QkPi*zrma*Gm_i_ee2W<;huJiw4#*Tw@idm*yqzH?>qtBa=>9F5 z#P(H61jU<9Iuk|4vO?HGFd)|&z3D!WBCNk(2ptpf9ewVuHrrJ|6eYa??(!XKMn0IG z+R(gx_lCH24BboUdNfU08UYA`wB>9 zWs~o5TYn9q#Xn4&pnn)HlOsLM^7JDmOio3YXs!f}7FPC&qfjYr%B>#J$#LnfF8nbV zfwQthrvD zzsbGw+TJ0gNR_gv;+5h~GHx>OF6_632^;WDNrYPdGuMv^{hRBVVj|}i%BE!aPITRm z+z_}>-#3Y_eh}j1>du$}p4m&x|M_RBfNtu(c^cxWm2Hd$&D_{xBN4>~WxdXqRv+m^ zyH6EGL4EI5!sZ7Q@X#U(t%4=Yc1nb-^*Lfz_WG1+Fr(o0x&Z)hKmQ%PSMwxYU4_yN z#UEDY7+gZ@p?YNTQ&pxiTw8X*Bge94FyI3vl<>mer$lU-8GxTMo%qY>9c2Trxrd>d z-%KVwZ+7T*V8S1Fxw6tGvP1@VKUM+YqOtca?kL#tqHZ;G;_Yy4JVF}&n-(sZY>3rz zl|iPiiIJlP8mHgr@?o*;Z1MQ6I1Cwgq@kfP<&6UMc(q|^W0l%NY_~<*8GkT(*~e-` z*5HW<#if7R+}-tN`@)%sSVS^C5}8A%%cTPW0j))_w^>s7Gha)bj~`<}b#1X`i{JE0 ztpi*^gv2pc5;z8^PtsO2hbRvA%A|8MER56ve4eu9iO#jTwRM$tKGz}^g2(;bSv|b? zieid2LBfjRYkn;VTK8%0!43CK9F~LNO5!$rA^K{JYYK;mHSo zt)3xTNh#nQe?uzh2BkoWf1=K7f=KEC46?(=E`I&0j~Cc!y_ODMZ=Bgt+}YmJX#JX6 z`|>PNL`BNvz;zS$BD^gU1gBB`$87-!VMTmnCM}2SZm?U8LzC_WQU@AzJWL`th7 zt_jgBEkV-ZzMWK1>mt=ZKCiF>F^OQlgn~d$zBnsc?9L;H*Imkfq)1BP{VNGo%CnJ>E|ciCPh;YD2dpDhK3oR>vUf=k~OkNrDMuTqSd*l~?2n6~@Oy zoczEIVqzY8%*&*J;&Ow%Kn8=luw|TYlQu`5CL;zwMa&yYLCy_eHePL;PQ#+eb9XDs zV;>^tV1OwuidhenfeMAP{3_7i1Gqs&e#8q3D}znIzBBHk3{Wcnrss$1u;YoeHv|V~ zF(NYtP-hWauSU#iPUo59%_J4WhL7t*Acr}CuxjiXE7s@1%2()LO3mi!I*9^X4+VMm z{S}jmB##e>fN>L9{)8+*O`0+9+ii$S$r*t5hR45kGVy)rz$-OJS}c9;uH0u|Sctdx zOt`J0^O*u#IaDqx)9CBe8hj?2NJu-Rx7wF-BOICu24UE0+~lte06*m@FN})Xnbc}K&u7?R@yGd0KygO=S6Y& zT)gky9`a`}Z#bro3Jp)@GRbTsFXj&TTtBXOwiY zlvOb>qDncEXo%@q;D$hVRBlf2XPt%dk|&AxTX|SGl>8V;hnTi%$T3qYLgehX`&rL# z-Gjus_X~~pI>9c_#^*LXE(cq@={?XzbmOA-BXG1G(LEFy))FfnTl~4a_NVLKVklix z=*Oezl1LZ*zQGIN`DPHgn!dmT-FxYUf>%~fsiY%cCFHCqPcAsVXQ;fLeCVU035Jqd zy*OkBr4WNJc{`sA$Gl{ui)Qn_3<5RlZiA19c41~!AC$l;soJ; zxFCgTJgY)xh5RgDs0n{6mSbbO3G@M$aU8++py3;<_HVNhIZQwWOIggm``1tissD=h zl-5rAXMhF*%I9X%k6e`8d?Oc^Fw*Id-E&utSUK5i(9$l5)c$D@FAEHy zfxiXp52?4wkwM*#+wVjH&W2LJ9YF`#yMrV)h&_bqLsi7g@2opd zOk++psc{-Ls1UD{0rv8^d}pW3Qk-{0B{FKRwgY!D!&lFt08? z6ndh4HRCLXfaf^J{TL?``yjDkwz(3}N%76O8oxme(pYb$K*n<%vX%03RW0tu^MA4c zp1-RDQ{*papMS^tT6ePUg9-5_p6yq+ZZ~wq*#G>>wW`?P0G0(+KgI)`@t@ZQ58658EzvA_Z7R z!?-Cfuh z7(}F-#E#rWy~ctAuZ`%#as(d-3MDf%A^$hZ`$C8x#S`V9umDv4sLmXWLwF2QxB`Tb zVPh&fHkbDkng6{pVjY}gQ*~o|P4%w6Z0Lfolopr^V9XAVRYbuQY1F><*ECG51jYEt z?&PYBh>2Ru3ImMKd~6t+1x3xe7E1c_nr3mW4-F0;h3Jf63Jc8w@?b-A9e%=4N1o>d zMP6Oa&ZcUwslx{qQH?!jkt zrI8ohjQfTDY&*mRDIqILOJjF^Ejk^P>vvRf(GdyA``TN*Wa)I~tR%J<;S&(qFul*) zR2#kCCfE$>LKEmMoXss@YTc$<&n?E&*0s+{3wH@5tc6d}(hIfrnVKbcrd~PxffZ<# zgKR+E>w$_RxMeWaNq=3oou4@5qJFu9Wz&MEnI+yxUD zPY|T?gs|H&23jrmhhyAj%q=L1KOjR8yW*Jd*FpBm>yFACu`*lha+0Mma>VkDyG$kj zT@7iQ-Cz?!1PG44pcm5-RvZk>FIxl>OqssPF%zJ(F(?i`NEwt@_mP*p;L!c$8(E4- z{cR-Y?=fIlk(Uxm7*Hf&*pmc51n~pFj0N)ply?Gi+l*e`$JW8?a6<^Re8}O8+E*44 zXJ?f`!X)C{Ft;S)xmHyisA*WiI}cSc2hq%R^lR^fzv2 zAAhLR-N~9CP*rnrwh|oSq74l>{iEZmV=De_WXGGD@lVOzOQnY24O-?t5 ziSikYeOR?NpvmVJIOgAE0}`@Cz0b9FCYFlEsO#F>F+H&__48O|b3l2LBj`*2A5U); z7U$YDjp7XMZiBnKy97vZcMI-1_~7mi!QI^Bul?T8_@5zQ@Lbd5O?q3D@jvZQY{5Xh?lk<^vtAg%FZU~ma+hlV>R+lKePJ>n zY9fu9C%2bZSjatw z%I$2+hx`Ff38p-WW71Mqa4`^b+KeI8{%)xc65{bm{i*G6x*7>K_x4K{bih6de#aFZ z&^d_lDHZtASiwGg_=k9P6$f<*Vyy9+=#yf4HG-qkSt6gSre2U6@vGK-iK zn=oI=0@q7Uk0CT6kJ;%+G!C6isjZ#cdD+E5(!{gb(g#dZ{Ge+nY~wQ7dDnR#EfyUo za^5M^L^X~3G?Mc%a_C`6Z@R|tBsppN^3$jr&dm}%(pXuT5Zk_tA#xU7zO^)<=Ct3& zW_e)6)Y#bg8vjWTESfSi%+U=BAW=-;6LhmEgv{&%!8I3p-$5E{OtfL2v)yI=e4HLIS~LPJu!D?_Ai=^BvTP@shB;5MW2 zwvF-ft)q>%^Hc~4(4^O6+R4$^f{J6UXFUI_UTVK^5y(8OK;$#|sFD*)>~VTCSXe^< zT~vbB^ubapi`KA4oGEjRzeHfjk*v*$%$nwS`l*=Q9gIew7~IhJC#P<38Y8$}RI#m| z7O`sUKKzUK31%T)z&$|Gvp&LiH)!eLcD_M~g(3fI>vzl}xG4Tv{fdqKgiyse1%s<$ zinn)wzJp_Fm)Xc_|*HaN&b>gEP`)joU0s;G-#^}Udg(19q z79Oew-r0`BHb|J5G|I6Clk~p7W}8KI3^?JXALdLJx>J~E=G;#QAj?t6XPCG!Q|-7> z?!%{ar?n`5ONN@vsz@EY*K3Y)gjNoY=0JRqx~jP{Iy7l~Wn2nCR8!eRRJZx3-R}B= z9mVMje`P=992ehfI-#F2j5`A9)n!@#+xi2}pos7@66nsRG6@ z1(LY3_L7Ugdy;CG?$tT|{=sDc%N91%yi2S@%Cq+m0USnr6Xk0JOfp%l1=K8KhaZ)utGl@bQzvg_~2?pj(nHUqd zv@d!S{#g^xlVNzjxy(y!R90F(cU2RzYFRh+85g!{I@G@qKxFuD)aqqIP84;%!#Ef6Mt5n;3>t%s<2UUfgql(&V;|kiOm2`c$5BcM3jJV+lq|5 zj-K1Fd2{*(E^<_BwNNstnzDnd7;!mjY>o#&$oR~zIJl_7xN)_6<_`C5)OE#~7D&ic z5T29KHoG1fJU^3Jf*^}_+HKw?O{H^*pI(-7q#I*fBG%#P=+5up;8_Py&4I07(TctD z7>_4&I(x?d4)sKfpX*a^K6opd^fQF-?6`IhSgqah8FNqYJJn34>&b~|n&-neBd7aD zucdim8WufoRZ+NCbIzsEpBfONgBLrP8ZCR`1X?pOo@;-JdAMjpJG>G25Jga zB8EZ}ogSx$@NZSH?Y}z+g24o|pqwg+xGhV?Y|OtzdfJ5V1ex+G?-%{-zta!?_UbGT z{#3bMXr`W2$u6hgmK57gWif>WlM?sFIr?^0p7I2OmqiI|&QDcnp^L&Bn(;MPmv6!< z!O~1{PqCSt+5KK2VD{27H-%MQFLc;JCFQ`yi=P{?wK-rl`#x5E^D7vsEdD_5z#_*I z8YDWPsW`TSCI*Lvg^@^29q3A?>ElB@AwTa2^~yJWoKX_GKc#k?M~> z?kM*R7o(zQZ_IG&#n+N?Gz{Lg$rPQ?Wa6LptfzN=PM77RFISO2VVf+L^)xGVLbFM8 zTKoskuBy@Ob0O}-LV}Ks{0+RVs5f>G9gV#oaBswG{U8z#fp3z!vhR{IY zu6t_3>WtvRC*Im6z<4K{PHVb=@E&nBy^%PKlt$<=Tq50|zOYNHG9THG^0XG?!CMWe zIp&L>Ac}QN>=14u%c!`CnZ$?w_(WKmyn{Zu@~!Ip+6p~6I zOqLC$liCo>_CHPRjJuOMTVo#mUt9_Gf6m$JUH{gfAl3y_pykZr8d7W^5jQR*p2II) zpeZ6zZ9%9yDK~f|&cJC8+?buYZ$^3KU+?B18i2P%@#noDsz`;V5zBgpKgV7=9cEVF z-)CwFzPBG)LiP}&6yUrea0;m;DM%?VQsWpu1s!6>>;3Yfx}s2gXFmt4_m7l+r?<1gSlezA;i0T z35yRU&D9NqqK{2t-rqB{-KPV1PtEbX&>uEd4xHq2sqC`^GfJ_!22;+&YZZuurd1c7 z9m1!yidrQdPq;R57hGKBqQVdkQq6wzHayLvR>J2^I-k8Y|ys!>(r^L zjj}DNNKy(mZNHUSTf4EE>70G}*8+s~Ah$77TgLCH+1HEpjvq7raEW8pn%y)n}%k59kf ze>gybh4ve@!UZQ2wBnnS&J!1c2aIq#;}moYapW;8FF9t#2#0uJ<;8W&kCJ|~>_82iOcL<~X zUYw4EUeXNo7$rM_FD1g3Or;5eZk3>6(%W6>%k|>^%ckFJH!*=c^6D??Ig?YLS(%Qd zmUq15^I6Ai5g4taQ{*_r&{>K`2W1@zH}jBT5w}G!%!#^LXF3{>Go@W6HY(#J;7E&( zxl6!!EQ`sPBx;1KkuJ?njWTBeY;6P}Pg-Z2(CPhX6rn^q_aM>Eqvd1L0oPvwdxgwg zHNI@D3Any^m4_4lD$OrtaAn)Lb}oV`q=hwLf*=LFh_HYEeP((Zmuj03+<*vC0G*FW z0PKy^PlLL#U6VN@!D~Wv^S`eZZ~MUZ5k1R^WVC>T_rUS|b?-Z}5pV0bgD76aS|j z{&0&&Er8QE-Z+O3)0ZQTxmCS!#G1AbK_$TwNMK7-$UnaGj&$C??K;d({$*4F^`XL~ zN1yay=ORk}f<$fWeU0_B-%k!#zR5PtCUma!op%-iL_IHg14B(h(xh?NB;QdLtK%XM zUmoq_ibaq=#oRM?ZW^itd;jYpvGOv4(hFn7|IW0=b~=xNQ4eV4)Q9!R4hZy6R^^*f1T+!t^$f0GoKj|auK&ccp zpLDoxpa!@L?L+Z-^=7cupPd!M7Ert7Ly`6F1=9fbLB+=m9P|9t3L(Eg-+H(Qp6Z<0 z4Zq*2KW+5-?(&=3Hhd#{iSFz3J|}_n(*AbRxSOaqgW!ELUGMg)cIV2P%OM`9+q1;?mtx=Na9dt@feyR+ z)h5Y}DDs;g3c_&LMxy{i4Z;!|Orhg4?!>!pY}RES0eXkCS8V(^ypTcin10wounVo=MO$<_hRJ( zDw(6i5(jP(u7aUupuZ$41D!JZ1D9;eJS2HqL1^5V1RnXo4B$2N2h53EnFTe|LT5S5 zoVWv=y0Y-CQN-KJL%K2R{MU1KGeTdZ`j>~GyOn}99{qs00`sK&ysWUmQXEaJekl1v znxDX8AILLp`$;50m!(7u1nYv~iBOY%c@o~ChU%7UNu=yhd2)|N)#CUs6n^c0swkc|jqHTcubxW8dkXvi zoa4?On2hBlw8hhLIFeTV=&D2CGYx&dPTZ=7#OSLeA)+ITPwJ=-jZ|LTUtaHGWD~fp zSe{SS;c8*(HIy2thQfok$?uN^b5+s}GgB+#pG+qI8pwkF4E=z*`1PYk>~VtbUYcUP zjC{mKk)qh1vccAY1BHg5o}ZmTehMeN_|qT&W?E44WufWh$Rrv=jFYT1>xR(H!Fwd# zrkOUADvLlhsYIcLqqFSHf{5{4C@+p2To8+c*l3k4Ow9E(*@8LKc$x>>$YYW z|0SV5b*4#h3En#Z;a}Yp$-rfU@dh59OkouuKJ@J+a*-pEY28qu z{9?D=BEkOCAaw-zeAL4G>p*gbzEmUvu|D~HD-|;iH1~DO?(ay~ftH7pi5p+H8L_Sb zM6^|ga(ME;1Nfdtn}PS4Cf&tvyVE*L$r`tI#G=N032qD6#2C2<3HXgEm(W`ragBd3 zh}E~A23d6kXZLRpreE9ZCoU<{n=qAyEWOUOFaVWQ=`p^kW9z4s;v2Bh5jW}|~${Bim? z=&W)pUR6CwJvBR9=bbChh$=JJS-T!TPFs25b>m7Rqnjy@>wls4%tx(&1i5B~9J&sV z2)@7m?wfrUxU=wfZ6y2OABeMIJwU~k3>;AyRvz7Ly;p`6T2C+MBiG`jKLWP|XMVHx zUljzZ^%n;F#DfXmr~Sy+dYj()r_#C5Wsx)3ylDlN^D1IXR0fdpwozOxKmA|Y?x@K^ zyz3<{a570nfbr!RDauIo)!A>naG?f-Jz_QO4kpGYZ6q9tY4TWJoyCwyH{@O6O6h2* zr5rIVAzLsHdb7ULC(`Z6rppbRVxbLivDp{nzOfb|jLjf0ZM$(O=Pm*%0|HEGhUfAH zTAWB7RPsOeqh^_olww%(ZnPmHG6dAhi$1oi-M=t%pB`AapYHzvdBQ`k2Nz}jGViAf zfX!+-a{cDl)+$9~u#3(Okw= zJkjiR=3}GnGUUP2B_oW-C%>qm>KW zv50mj$k$~qmvRa*9vze+BEwy=oqr4|2c}WbiN!F$=bYalLoBf$wryh^FrMTZfH{?X z(YO79eAqdy_1ozHl;P>Qmq~nO>X#A^rK76MtBiz~lb*|dPwOpbGocr9+_z5fxu$!* zY96GwRQ?qx&dKPXPDT&zc zHOPo-ZOzA%sTX^3Z`N4E5^^IJpHnV^2N^JtgH&tGZXvje&f_J_NijDZKWk*HPH?q{ z)yoqipfKc)+u35t9kJVCrf#MT zYUOIvfafl0-Z(Dq{MSN*)31%1O|K(Nwq1R70(REjykI)HxK{8$GOoi1b&_O)^^SW= zb{BVsPjM_Qgp}+)(OFJ^9E=MYGetPr2WT~|)6#aJM)_-9|Lo{Clm8eT5Q@0NHGgdO zKrP8zWp*?y96g(8`k1w(8fVA@N1&R&YD1-=zoEzL&vFxchT+lfjT7U4RF?pc{8wt_ z!g=p;%B^Lx2yb{Po;z)KP_$uoJgJ!k8PH>T{lA#oKI49fkoJgOlmi1*21Emdf3HZ{ zTV4B9X$pdK&aM`hxyK2t$7gGKG8>kjy*@oSZ+07QamaA{;#uDcOVf?R(Yg>Vl2Gh_ z4r%Ms@7XYBYg=bl`nKZ2PS<2@|1FhSUVG{CKn|M;mF^kV0i@aM2$n3FF=@|K8&`w@tmpKcn-AlV z3AP=ergJuUeKvm7LX{`qccJAtoBc4KC+ATp0oYT)9&3yrq35r{=ka0zUeG!i*ld4r zn`Y`^XuOS!pNMyJ7@)z%njDiGKbfYlqz>Y#8aru4o_+q544xlj zj1iCu*3w=5U?r~#Sb>8pX?H3bKPq7ic7NAO05_ZSgNvAa(Tthd#lh(_T*~ zn`f{v*D{u}@ef=}^gWL}G;Uz+ywZd`dAt(&Vd*^7w=b9?V~YnpvC8KDd+(elw!^0C zgrdo6EPPIZu;VXM#x8>uBH4m7G(~2xXh${*k>11gg6mSS1k@@%Gr}PzpOI-=cIe3h zOH~9F!WG8kK8uV}l#~xr>KFO9o01+^39uRucMW79bc|F;a!Rfugc@hrr=N(MKur;$ z^Q1V+i9L3|cBUxr9Ab{-Oo>1euul9M-ZP7p;so(F1VatTAoxH?47>ceeg;;w+V1!D zvXkle{w49}@bo`7Qf*5u{>R>dZ#hScErQqD0tK*$?~{F@?^o9!-yQyDJkM=^Cx(U> zTbuB62Oc4XBME@1tsrn{Mk)zWPyuXcvP!ClfC(2G9Lsq4ff!IplhcT12%Rp3j^tRh zkgAxz=!S<+g@DF}6LxxTcEV7F?sriew}xG;k7&uNm@@X(TKi%`tu%7IB*&BSIE)bT zX&?^Ea>=ZY)BfVlq~D!yZS9P**%q}m(`D%n#$(%=Xc_3HvVwaRg3L5TK|;&~CZ{GL zcgW7Xcd)u6pVl=t8H*WGClf~>Nl8G=`@ z96MmQ`SuqJcD9#<{6%j}5dI+0VQ@qkdl>yU{Z?$OK9#xUm>P6RSV@z>Lk22BuhooS zdJ(_;aUN`r?TUt%G2Go@xKO*6s2r}WX13g613S4+uZcCP8s1MrNr`L~n+xV7s|OcB zO=JQv3IojCq#>Ru0LaY5hP)&a2-%HkY3qH|xy?*?y?ws=GrZQ?b~SYQvhmZ&c)I#g z+vl6$)p1GnbI;eSe&_YhsyB87Kjw#Gi5rRKPWOgIkd)AWOa9^HTnGQsRCCp zkPwbX@U$t-LKf4L2i=AS>V#(TyVRxO1z(g~lazG8nSkmwfQ(737v8qCl+T(hxspE5 zaCg!%sAe7|XZV7{+y=N^CC}`keC~1kMseyYIvco^g1Y$_HsknhuQHeM<#S`lCNbiS z;JUC?m=N`lWy`&VaEKZlC%!3RBXl)tBj=*ZCMgRV_Kni+A;nwA4a0i*hy0&_lt+hY z+w0PR62a4i)^77*f1tvRq;&`{LN-QiB;YmJ< z->KIN*S4r=#P(LiNCMS8Tp_Uua@T=26Fa}6!IJ9zO3a}z`oWJkK@K!Vs8$Psf2QfH z7}RG6x8)t^UqXDkxmGT?VKAWyyndRS-;aC8+{UG74gV~OR=eptNZl%%DPu*vveD=S z7)oGure+M`4QMdXbMIY?{al&4xsBDCdo!==-*Gms&&$*L`j=ggYRiqE6A_)fx8q2D zt80fWmv8Cq??Ta3N6CI-@%e2Hms1~mnnTT%&*jG0Vn7K0q!XrEFQk9fcS1-)^4jC; z*Seb2hr;8??JVaxy;87(H(Px4Vud1$jSWjjlS9_kTLfiGHxMj6F2BVP(u+tsUe9B` z|Ilr8mAGe3uN!qEfM?!5b6wifE~h0#JO}etG@ZV1p-+EVqDK6}x1!5|U6rB`FKC<^%zWlO&r*vNaGlCo$5^CN~3jSkVV0W zr0twY#j(RA221flSOuXzDf2K1-1#Rsq_C=&EApcz-b-=Hpr9`A%NNsDGBs|7zp1h-llWs?Z zrU%-TVx9wD9{@8(c%Ru}ghkhtJV zQ}5`1@u!av*D-{0;V`+hkB{@eF_I+g-=pjQASgd1OBM3VJ4kea#%DOo;gn02eHp|V z?Tvrn>h^`6dM?y&vyx>8HEOZhKW>4b2b+!8x*Q|pFyn1|zE7#;blcfPzUrFVXZrGJ zfWF^-eE{QqpniQ5f`!%zGKIHV+zl=f)%Fpuu=bvzx<2#X`chvmf%C=_hpy;dN|iIz zBtP#y$P!GnZpEmOKXUgLh{G-)Htr%A_cP+Ga%+Y>|vV zaimx5YD{Bq1$8l%=7aD8L+ zl_2-Uojn>}-)uThA*WOJL`>A;QSg>W{F1$?#&As%W+_f~tZyg7Pj*NY1PTwxN>H!A zxCm8+sD)2O_2Vk+)#M8+YQK+!v^5^DXz75rG3Zg^{VI@(*j~AoIqz&536gUNgHOMd{ zzK;O50ThV$cynC+*!k!Y=oSkqW!M_(U$9)!WmLMeaESm)l??NV%K_Bdnxq1{yZH{A zfi%+l`8Lsr@zhLK`7?69xqxEJt6&%oMAO{)R{j0$MBd(|8@jl0rUW#EBQ06zs3d`_ zv^J#5V8;7yvV-Qg{j25=aL<`zC{P2B4Z{c&@u@N{H$)m~S{W)B3Kqfkq#3Rl2#NK( zQ6aiw{3F{~c$>jN%7>InYc1AqJZwV(g@Xv=3#5}OneV@lf(^ePEx-|h8I)O`1E`nK zsL^phj-PUX!*~%HG7AtZ#%oi#!UaaQ%gWBEI&fE?(jGBUc1H-#Q0%vGVT*o-GQnFj zPQ^AwUze1L!_!woW#XppUT^1ja0H&>&;L{?k*IL4_|@O(@^nX^S-~H8UsLd!eZPrf zO6@wQ5^!4d^FdT|>vc9#9zD*;vG;EVtLWv(4|?w%QL51UWbW=ezwqb{aE|1_q%0QpXi;lsSOb*xM){OmDV8%eC-EaY z7rj^3YnP=^Ipq98J=(*(HOvA3U{qX@daO!Eo0>5#1sQ5uCYV`=9SkwDOiQ>@OKLtd zkS-}2`=cxZ5l6$UOj}cXSM<~6soY2pbPCc@5T?P3>KwnHLWO=gzUl#AMdJ#ThL}eg z@fP&Wf+d*MiLD@S9CIzwV%{qAU@2wFONKbh=fO}xe|=3|t5y;dW{0|rUg8Dy*1AlF zimQ@ulX~UdYh41L?u9-lGO<}CDmI$CatQIMmb>|p_4FPsYN{nC$(wY#b0>isP^VAy zOI?L%j%2{S2{DYw0pTcQHnki>Aw(jdJ|+Ps85eDQV(|Pt-MwIhZG}ED;E#1ZC~}AZ zT};33Yu)P~$6UX!_Unhw4-XIN&azdCrKLmCuRi0oIZ4))Z&#Gmu zrVb>tB<)=5HSB+osox%)iD5rg&V#=hjhfwYhf?vyO0Y!gg%BHN%ma8)w2FplzhHeg z8Ki?TV2Ex2pETftAk0@~xfzYJk`=UGJ8Vni#>gORuU29@wFyHIkmGtGY5O9zwUC7Qk5n+!}PVf3g09ZnORnOJCRgt%5?oeL*Kdjzh; zTjCq0%Qwo-L2auPL3kCo+9#kJ-r!jUHXYau?;jGqv$_tb&c(oa5* zWiOXxbAGXDrq&l~FWzkP`kKVYs|qC8)H4`Rhs?wG?IHcYqNDq@u;n;3sLCm6A4l4T z_A1Oo?c?uE3I#`#)C0+qBTD0+CcQv~U)4@I350(3;xz*?xw!WJgRAuH(^Bd*_?P*> zI0z#lrsD_ly|FeU40sx)M>kG&y>brv{hOr!Otiy)uAQ~-y|lx4GqD=;s3yaQp4CpE zU;ZVUuU59(2=r>LJK-*eG4{a;Ry6E zR#v|AgZbM{%H%;LE0NfbA-Xa~7zf9aWdALDpYoNB{4jj7x^0A#v2C)fKMsXe6-@(W z8Ec=BM2g;@6??0fCoga(O45p&*nv%XL=)CKb7BG|^_#!-Tf-pdw4=217MQJiB4`YZ z75WqZ!qlb;x!TsXoydyx&lgU0&V+a^$`A`hOfZEi&u0QN)0^8u9JSzE{3T;$R!LZu z{_?K!ui6~@t}-r21d0@qdd0&;T#(UlY!OgdYQDBb~g8o^*S z^eYA?2ofqU(#`(zTvy|6{l2|{^R>xoZ+lMc)zQFdYvcCuO;q}wY-$m|Hxas*f)lyB zOS@1ylc6LiY#h=@9L-)uG9V!tgk-|i@aAD96Kevw|Ek9*$RdiT0GeP06X#5CfMA>_ zc!5*>u-Oyql0R7@4P%f!Iu3xY+3KA#F@P`-!Ug6C|2jDYz{o>y{J0v_6=h~OBFZr1 zx!c?D|Fc^b9#&uL?_+uXf?YwMGr`PqUflhXs)%B5r-%0$4UTIhj~)&_8KOi;*sI&~ zG0!)fQy`RuMHmX{+MZYr<8-YVaG+(fBL8p*h1fy)=MRsTd)PYJy=n((Mi_EI%^ZzA zLuR!iiVTJ!-|vBw2nwIjl6XyWnG(3+!hSL|oR^Uw&a(=OH~nRAIjFl)(5U6aa_&n` zgkb^=!3HYABB;@_DMU2li@6(IwNQkrVp|`kyqP0)?gt+w-gKH`ONHVD8qsAoG4|To zr>49xz=b2|omksrxH(HO>;A5fe9^y(< zpux?==xOOL@HRFkqy51iQ{(&r1sZ9tZeG@sQ=0V9jOD@B9n?3I`V2x#!~-+cAtFeL z%WbIU<;j?ths#M1 zuD94=OLPqMT4+d^JC4fxeQIuw|0=@jkY&5jPIChg^~)zv+wp}v=W+qf$q|6q89%oi zRU`(M8qHpq_TNS>gmA5h#<~Ve*D&eYs~_%YiR@te2$Fp#MAXKpX^sk2_)%xkp5sx% zjRdzT2&BZ@(vT$q5K00?R}q0sg!vqpE-mz5DZfCCgMO1EN9+OCMfyL~qwQvHENifu zzb0E(+dQAW_N?XDW3)zccic@FL`NZrgvU^Z@l8TK{cju?#}+KFrdD{!xkV%Q`S7qI z@6FlxIn-ouWG~0)BzsP*+j@27&E!XC(NT%d)^L1^~pHdZJUs@ljU2p zx-5LuR20Gx*O)42W%Lw#c`Zf>g;qwMEGn;~k|}kJsO0xyEYy)-!xlJ{QoE6)e>tY7IT zL?^%0p-qr95qU7D911x;+LJIq4q;J|2oe){*z=-FKt$$zmb?5fe80l3k4Sqn#OCL) z3@gUvtZ*krS$C7a4j8BxC5s@Ybm!cmppn>@V+j-3<#ODH8wc8BiMyYBM#>SdM$QWi z_@$KUW7UQX)+cI5pyp>q$wr9?HicA>`mv%&d2YHlF&M25ESoi{*EYj(a&cm!Zu&i1 z&cN`^O*2ENs;BKw5~tKBvRL@AU=6SR2O?3B{jKkexudB(b_6rN*||IRLa+>O94z1N zOdZLo?{vTh&gp%n=$DWzh=#))Q1p>Y!tH;04j9qC;D^^%;@cq2Iy7-3%%*X`Z?RXO zgU7=v@2&2d_xEb8X+PCP-&7_88BOtj`Wj0?i9%@}APc;|an9|_wo)^(47PKr>_0-w zE&&w?KmenH;N+1ZWS9OBQ_x_pC4UsdCgi)Yv4j=_*tj9O<*T9&!cWJiAV{_RAgx(F zvxrA{-n4-$i-gzfRRp>D>X|f6>&r6PMax#>F4>v`?}ii_$%6RGHl7+AJ3~C7&@=-# zOmbBT36DyJ$LmSQJ$96NgfO3CVWyK~!D2J(=DOOX)q>f-p)NN>@U6^n!3X-p8N8L4 z(X<%mtPS?Q0p=8pHY{0k#&@6nBrQUg>mTn^ONXZEHOrGJRhSgS$;ipbpN9qNzpKHa z@pbJ_e8wWt{Y1nmWSQXqKzDi;=VWxQo^}=a%vrZ+voqPA5ebY|g!i5N35yJ7H6R-B zlW#D&`Lu|r<*<4CL0(dAt!hLZYRpw{NwTEpwazzo zb2w-O81MD9zl2$V#OuRrgR~8b#>&RC-IPhwtKS&;MMHw2w9)8D;Cq_dFa=6xfEY&0^_HWP|V;xLE`AX8L7HM0Mhy~BZpj}A< zrO5~Nh)xL1ENh2yWk_UjFCp1p?nHq@{ycpTkbn)BH*i9D4yL8s7p*t$6Z&VoqQrqq ztXnw|gQ^W9G;r)VvyE)@M+9b}JjASwZ_QwIxlId_dZ1;(nvVK|?V|{q)EmD!WoZtn z{{}U6>mze4rCnh96Cyd#3S?~5O^S&5MDOY%Mp`0PLo5u}#cBb1JIx| zxMka((WXmho;Fu{gZ7bf;BF#3C9imd>&MB@s02i&g(ZF4!r}~~3R5W*)exE!g9MKR z!%PfkxF3fuN#X-@0}O0+_yQiPT_s()QKb%=^cwH{5(m@Lph6;xQo7H_90}$H4xApO zKNk9_1ws=OaN&|^VT>ePwv7`jn#yRrW(!U9zhp2nZ4W9{F$fh8$uar6&CIQ&na48G zG`z>a6w3z_QriwmJVe&FA8zzL;F8NK(D`2dK}3NhBWqYbHVfN`)<0OqqOc`S#lEV7 zuV)_O1SAHq8jx?y00%yRgQsVCOonBf5R8-@R~ct?>X1D1dFx21%I_UfjBr67{qmFS8b$blq@EbBWBM^efh5j)P#SA{QMJQq<4Oj3`80rpG_(W^=;(v zTkd#8MMalx^2df5xO*qm~k7y^^8w&fATsCS1c;NYCuo?m@f^Sk8hG_kcnxMhbM+dnP{_ew>_cQiDrPr zVOT%_WTqzSZK-WUYB1)T-2AhtPUm-jnab}qLmg>pt*)gQ;T>C+t9F^w(T55DQ#mDC ztW%g9CP3l~7Ac9&2Wm+dw_Q5ockI}u!&d=Ga~*zDmW-c+;4!#z$!G~% z$cP6&#}p~q`OB4N#NGwFegS zoiC&uxC_9ngwJ95yLsAq6FX zJi?2@1OEFOz}>4d%J9B4in@HbkN`sf8p2f8Yrizad1i1-dkTK@87PRJl{o! z*KQ*H#2S}Z7#HJ>$72923O7dbWXDxVuU|8Uqqc`30L%L7g%74V82{Z>7q}@{v3Lhi z(8(D8+{e)H+Y8=Gqd~H8)`JJrh7fgN{`a6pYoo$qZFz>mhZo5_LV}T~pD{U+-~p@> zrs>FJq&-uFt-omenDsLSa*Bv^_m025=+x%MgYx`-ARO3yp&#BG6m{;Hx16B;_t`AU zfD6A3JZ1A_h<)V7l)$3qA%(IKvY4{~L*gLckziE4qJ3CbqVcManWT#i!)+|0)liWU^_3&%L+J zQez?&EHo_Kmk3VGMt1!{2~&*5cwPV+FMlK!oTfRKr71JBB{=~Fx~Z;*Pi6V3O;Scv zp_(1}ybE~mJdP975_ynI-;+z_&$A@~?4?L~H4hV2G+l0ht7h7DiFvrrXF8udcO1JJ zw!+95HMsLuO3@JBV_lx}54R;HaFRPN1f2s#JQuehtDF5A5V$>hqCpyVUP;qjLswxH4uA zb`{=Q5<>Ld-!QF0{zumoej8R}|I~U&|Gu9-_k!Yp_MS=fWOg+{(7y*ZTL1gb8-tLs zM63r&rquWswT90Sk8D%Si6nWKQcM?^3R>J3UVo>^TZjMW1)%2jPZQeszxI&<^obGz z6DgzrAxODRKOLyYlv)JWk3NZ$x2Hbb|3;?WcJ<$NEP<^MbHhHD$EzLAT4`OG-AGPc zy8DT>k>;EMDcK+7RtC`8?3GKp$xY+jB8JlNI)jaGF&DfcPJu;b< z*-piwy8HGg0NcGRSp)~pwiPZLT*gR3{1MnrE+yXp7(r+Cfcm(3T=<>K}yDp zw6}euY4FYLf=oW$&T7(~o9ymZ-ILn_*-Gip$%yMu*>ZyUQ&Mr>npq?LB!r>QM7Qxz z9;ZVo-7%DJ4POQ7+MTN)F7yaXuZR)LJ)3;hPSUWVVIse)isfU+%4QcbEV zt6eI&AP&3m1)6>pRV3Nw>o#8>H>ZS5#_|#|mbnRpPwW$3h{UGGdU)Lz6gzOk<~7x9 zd)-%{^XBAVSdV-H0rJ$|9;FDd&|EaBXbthr%yym>CVc57!!2O=7>(5FHBs;adN3>U zr8`z^>Nvl{+CcgU|4P8MY0vF-fjAy=xUsUqk`*RIWk$pXDJ{He=%zmZ*oFaR|6f44 z_yl&|jCXWFy@|({prL!v5&L1ZqZy+ALm9?(KInymvdKtF2`V~#I7fH!u%uBuBFoNV+Z+XLys@V)J4` zqm3b;hE6gP0yyrDZ9H~_txb{XD{r#yb2;U{lmGBrg_jvIh81(LvAmUQy?QUjv=2Ul z?C{`VZL4YGR)QX#xX|giRsO70CjxtZ?0pzfL88m| z_b|$nmuv7+i!je?#J$2RlyRX^Q4aG77M%K*I1Z=(1$_V#bgo@00d;@?7{?!)EnAGt zQ|Oh=Tqz4wk8K^%ojZ=y4@VdUkcL1v=xWI-fog`e zw(L#$F-(F8PsWjCdz?_nJr<@m$kwVf zhUX^ui0d!%C(7M1k9-T35zDJ%p0+oX5-TXt6-Sa&JKXrSN1DTsh3CeK$$Ly34a2T) z2uOa@dY~37Cd{MQKM< z9bcZqeg@fp?SA+p>4_28adDwz(0*6Fuv0DQ4RbU=TobC}$G#^zQ=F#^d~Yz+$G6yq zCnRMjD@boc5J^sTtvy`hb6VHbdFXeP*)>l#bBmEf*G>glTn93lVp{x?tO)1j+eAko z!b?)P7Axgiz6>{r?2>RbYl;{R$+FuPma1R7bH#P|?vhxW+0ZPZxeCdeBLcl~mHW!~$bQI&3|Jiwpf_B`Sxp)89K~mF(@F1!D*dT{ zKozNrB}lj`*XxR$XzWZtN4d*lbfp>WU}lUk$vtMq1R)L$@gcxP_j06=7J`H>DzM8H zzUsHJi++V6<^==5CjwC;Pr7}jo2-hg&FNdL6)I5yG%yxdJ+(6Oy6A^vyJVUi!J4p6 z35@n3B*V4$9W>!=w8Y-*u$k;#o|1NSX8OQv@AcP5*b-6@Ya?_aeDmrw{ba1BJ!?od zWqWY2=$7rDy}H|N){+A7S=O`Zr0+qOJ-rR{PaSsML*2Y!GuGW2S49}JYw^O?XWW!> zZ+`9+6Wj*eB~1eOX-ESx2`Y=?NUN3ul9+-7+%Sfw*QLwvR$nDzyCAT7Z94GNMhFP{ zY4CNK`P^^{18DGc2}S0No}8!l=)^I1Q$3`57EdV2#;||ao$%wbT?}N}GAGLM>8(e+ z9Sa!)tHAT|M3YTe17*ZVJ034#N=^cmqm4!ryXAFBCV)?DJW zdS-`J(Mmix$qYK5M3-klZYVyFjd*jOW6u_Qf1+6fwK$>&UO}ey8x}84&4|B9M!cYz z8v|#W-JOJKB(Ub~fr{afK){**FY}vw33p>{=r9^QsRH4dEnzY3&M1&MV^&ou2HLz- zm(aQ|C4<9vm%|?-Ln1@6+h`A*KU7ur2EFT|g@4dCt=Se^ZO0Y-LG2mZIVfUnc@I@{ zg%)P2x!TIPe~AN(7*g@&=UpRzyaTcT{H(!~(;tw1%TcY#Lj6iEC}_d7gwzJG4Ni;u zowtXwu7`O4CfFGQ1f9_x0#6#TEG|5bP> z`W%Dk9YoB${imbU)lqH37yAu(s39GGetx#m(a~gPbPsl2re>A~Xs)=`!JP{+SFS(l z6sh8w55rM0;Q%}FGmEP*{l(iM*a%n=tgtJhCbjX{$%^?)qM{3VSXp984#a_~MlyLO z)p|lnT)HI{;7KHBdL{|K`fj-X1IxvhEJVPTLG{l(8k--vxMqbte3ws zMfD}!fRylIdT;~Ndg&DRo$wflPRz)%Tpu#*x=!e zdxSO-qoE{j1W0cfI*TZLM_3nEf>y}!3Gy^nl1U&FHm1tTRxPI|e(ik>#sZfEbM3|5 zCiu^FvVs5tjD340%Jqir{4H(YjUr7)CL8Lh(8QMF5_m_eWxU2$Mu7c@9|T}rlmvPm zUu&m>u1XK14P@n+vi|fGc0|YSqN&o~=uBICTzKnOn}RoTbIc?uzmNs+%Zg3D4v0$` z=EE?3|DyOcBnj;Dh>RbaPL(AgX9cr1d0*qi0A2qP0F|HLMl@Y0Xdm>Ui0E}ma>Fl( zIbM(ZYWn5quKM(Z{mpkL%UnofYCw1-8lc^86;*3nV~pOxXlwk>C_4JjXelwkJfpGf zI4}~F4ZmVBehBAZk4YR|II!oi&C>6r#-j#LuY{Kp1RqEwR%Wb5jz`A|)q{`b@6t0N zc#jVvOy>vv38(K4CGrR5@&{MPH7H_CW-3ERiPWYE4xxE+@f0qM+L=fQ5ravTQ(`5- z+Y7xz=(CkFP>LM%>CJi>EZUOS-E-mLpx?UsP5zy&GNmQeGPA8|5wul8+Ss5?O~Z$P zS(s3;_MR+?am3QDB7Xc4Uu5AyfQWyV}jl+}!-Oyfo)KZSLShZLXeH#&;hYSs^M%aK9su ze!7Q51*;pvsAX(^B9N#PDg6qid`&%q?lp)^!Z%zS$k{m2dGaG-!u_liGY#IYfo3^^ zy>Cij+&!TQEOE;J3b(5lQV^X8<7keh_tAQGXn-ihUYj7+Sm_ze=Am3S1QH3nJ<~!m zVAQZaiNAdyUoPu@W-_HjH0YBh2Xy{b$J$c|h(OIT1Con3br~prI$QVM8VU!wdGz9A ze;hI)FrPta|MRt@KEY=qch-Gc*!lb=p%!*dxK68-Z(%iCT9iC#a@ak(_hgjtK&d** z%X^=YEo#d?1Bns)&_HHH{)Ljda9LD}E!5Z?p3Qa(ZL&!L|(v>IzH|4Subg?mf&y^f)nLhTdDVvU++gQQrt9 z^n%F(Wb@y4%c{UunzDw8T>-3(E4i`4mzsD6Hc^(`9I&xlI|vk8^6_H#1KVx9auFf*fQf zLz8wFYLE&ZuEP{2atP;{ozaN|gTIzUcNuqUaz0N8$dF7C^1%ZOUx>w0mYJi5(}bKD z?QvtJrP^bdBg_>ZkFnWw4@j78IScXQfaoetus!!yS7vUC-v63EbI$)6>uEOrMT2*a zzZqo&A-(q25=w2;E4YLAY4%RAN$+_DeA>kK9$IIXhM*CZfQ{ej+{=$p65@xC><5<& znwd}GWE&W8)0nWmxM|+A{q(M`4|J9gg^;6Kgf$2Yt;9M~^+JiaknS6O^r;cY6zFqC zX^^nL#Hs`}g95wU$5lRDNReaqpTw%9E9>_9Z5BjCIlwJ{3zXY4igA#^Br3eg0=uEZ zi++KnmB>o(;d^N8u;G^gx_W z2!(Tw&GrTq1R1;mg0+yTA~5hrrkKx(D$Nrf7%Wp(b|yThUTZ|kk5-)@=zw1c-{yw8 z2?A6Znr_D+qPU}!5x?>XRcZt9t~*-F@;Vh zsDreo1;nGh>?(pqL7g(sHcH;ml(ll0G6F&`s9uK&{QvK z+{qgw79hRReD|01MwWKRUfJ|D829;1hK7Wcx7j z8GEjsLdwP)1yV$R9}c!*%JW(hxmQ|X(%0+Z#se`R%@FXJeeLlSMcy+aGa|Ae(K9VH;{|CijMy1Su8anTq(9g;AXtI3n z4n&brLr(3irSHAN_r$Ny=mEdQL=$+_FGTecN&)mjR`vh?7Kts!sq%Z^@C_rxvsmYsHpg3d-m+^E(*^@EIDNjuTT{3cH6Uqx0udW9l zE@)rc7p5||74fle(K8DGN7i;+1y@c=&vDPS!4QmH#33_8qY(6bZ1ee0v#(Nnnt!vD`JET?&X)Sw);?~WE#{vN7R%};NOmmIn5e3X zcYQll?)#KN!X<*L8Y;hlPgV%GkKOD*2n>{0ImnjbPM+;TPpF)641MS?|IWi5W|LzS z@l(=ngEG+yH_P9FaH0Yjlo%TuKHxURQmtblE*&mAC}qJsvV4e%{B&i41pH#CU+G&1#~R>0+@5vib(Ye6Y8^+-GQ@c~@Z>O`WEydID}B zWp1keko94>|JmKdS^2M#HXluNCDqR~QxOsCV8w6GK9~SabW-zyWcre9`Onxq7i9q^ z!O}sMKSISLD9L0#Ocpd1G5c;aVs@hH3K0OlR)8Bk0m+{aJxX)v@#~u^66Q<*3f4ey zjTO074vS+6xpE{zS>vTmzXtL8C=R?<7%ec@(sv#vndzZud7C_7tYO``07K3x$A zz&dy6U=CyBz6_ABJdPx7V=hkJEm8GNfqUBZ6GuX#4fe#2~&=h zZPlHQwj!kzyisrAox2qFA&r`eahM&NkT1s*e1<(vuX90}moudp?}G&=equqG>Lu>^ zd(R~w5m>3hXj4bi)=;}>v-Wh97Vh&iBmSP>PjIur`#=3Rh8=IlM%fOL8I>|JtVRy+ zWbt*}2hI=8<$3LTaXY<@hkrf`#)skvWg| z>fE4@W3mwrjbvNGeP(5>HEj>h?U-AYaOpZC`eTFS3rKM``3=k<{0C+vh4S{!ptxB> z6UKeKVedi{{C;vqp38P)t09!b6^s-l+_i7}?xVxUcU`G6TSyT}p2i{6{}EjW+ulz1 zZ+#u|LqC|MN%PD0qhzC70>2Y6%5Q9j9Z$_bs&_nysJ(i^|2aPHT@%rfB^wM^`6y0S zl^d)I$`(*;T|L_gZJyjAai)HT%^FvSgjdsEu}3mc023E`{{b1g$z(8qplqwg`^y=C z=w_CE_lH7Gt`ZhovUMGMd~pYeP3(~+@xC}o%(vgZ>O16TqL@gvC$6Cn`dATzx5U2I zyy6(vO!d^^h(OpLBJsdU6XKrH(u~6i-k&nNc_DfwkWKa+gH7SQay%gJL<#D%zS*h4 zdffGAv`?xAgD}$m&z~J{Rz_zIiBS1BAtm|XBP|FWDotuu%vfuq!Xm}B&Yq@JN%BeiS9v}tD&%eVLP-rk$<}WK6^cV_zcn}CW6qC2Ri26iu~AZ zxyhc5rhivC7q$%$h40n_dY<^W6{pRbI4}Z zoBWsER`L#oaSN@jJzp#>EOOwA?w$1Wc26(AJ3sY2cC(Y@wfHZ~*}qaKWG=8gPPTKZ z1c{&=Y^O5rm!$s8)B^=w6GaRAvdsqwSxnN@Hk#sVzzyQb zgIo@UJwRQNZh_Gm7;tF8@*Yzw|Sw95V-}bC{gw-f>JR-n(6&pLIBEieubQ#1Vf{laL>;oUt?=a9F?$AGFeCK00nI z^l;Pk3_UlOJv;B~?`V6R)k|=mBo?(M#iayet%dS9z%b&~{(#G#`-6qb;;ptMNC#r< z1)JAFx?Uwz5`?gznT*iDfN=r7*8rGdo+MTqJ^US17;xCrGxfk@9cl^P@~5MPGIGy& zL7l`sI0tz#L2+mJA|?6}uelL1@oq{x<^n1y^Qw zlFta?GXeo;#u3q@>QkT?JuT%ymhtmjcXqXo+(E`nay8X^cA(p*Zij;p&xhNg+}s_C z^P{$d<>?^P$!aXnn?1_C->_M?S&hXk0jmNa{5f@ImwiD1+RQU}$;Abzq4 z8daT_EiKorAE|>M%6)?x%sms{(0{W-}lHCFqkAfQx%It__c*YdkJ(wO%;8haXjU+YMC(EzJR8hFzS*L;Ky{ z)MEMtwh+m6BaRAh8*^GG+(7py*_-1Kqb`}R)}4)M|7mcq=g;h(p8r>ZAjhqTD;{87Z(7NAyodxO=>z7b>3ZT^Z$`_nc>z|CC7U zE;c~I6x2}%x8ovsnNjLP*9nIaCOBaNS;^N{F|wY;5ulKjnS28$=a;LyCB#xZ&FV&@ z7nJC5xG6T)-+@@8ddeMWIdHLcZbTst9`=w9pm_{z0pxk`x(gKN4Dd{!9;WHdxxz@( zuF@pJDwq2$v7s?n6xq5%jG&)_3;vQ?R*A-uTfsz79M#Q^rPe}UkUo>{EIdgtZ zt{yzpo4KA|t9@hVu6Yc1BoT?+`m?BwjzA?jJ^X9{a%zow46&g2TG#cHlc7&XJ(;=y z8jUA_yb&5@<^(9_LD0L+r=5z!(#)?I8*ya@^~c<89%Sez z&Dqe5;2(XahzwKZGT62f!}iW2aO$@^YI*+yF0Lo%EI=INy#qBITGwWe8bQF=TC8S3 z3qr?+(lHf2Q2`_@K%9W4HkQ7)Ra1VIesl8yxT$~ViOMgxQ!c@czPs7?nO3XFQbM4J zIl~pM#*o6!OqSB++;@!gahBe~MiZ{fq(T^yCA#G?pzy;}9j*ydNnZuc>8HCO)0E-D zZ@3@ZZoy|b2ZnCoz&?7fq&2!vj(v=zsHPE$`}|1I8+*u_u;FfPEa1ZGLBN_%%2QBymA|Fey@=7q!~ ztH~~AasU08;CPF#fsyqu@M7)=&en-?y8N3bCnA-oh*2AU)vhi1pWnb)8)rkvw9`a_ z#G|VX(VHaKXb9l^hL%lbfRhmb1c&!;X&FfZ$I4HKKVL79-4U?AgMS?oSX;gCPO+Fe zuEFR1;5K#uui@grYu~T8v)I?jFH88 zZw>O|pZ3r_W3X$h?4Ky(E*EKKmE0fKlpsq(hH+nZF~b#FaPf zbHlM3dx#1@w?KdR4jqe6$j?Y_)QOKfe23YXu>%onKnNRZtM&EE5j_4+!f|qp^xe&q zA!1o38hIw>WK*v|gi)UCeQ6vl{}%7tT?-Y5xs=b9X{@FS@ge ztCrFc3Y)bid5e{toMAOON(g?|hi>~RYeeV`Ouy2{rzc0`?aHkj18#8E`$(YZQ14lf zBr@hPZ?*x{Mf>-V2bWHRy+X8~FG2xuQC(MKB>WwoIiCp(d{#Q{hzZ>xgKar|Jl*pC z?%;o=25;O%3H+8b^AYVPCCa%J=Kn_g`dtWheBxX@#10rA7@EX-=`Bw?tLv|${kd<` zLS87ipdLN{VDO%6D?f%8zsY!iE0p)9QwvT{@g zi)9 zlXV=i+L$gwmUk*25Vxzd$;1{e_?}eZ#pOo45aBg}X@y|;B>V(+6|cF-utNlYKosUj zg=ebgE&v5_+c%REcF3LpuBY~$6dw=j$FSE+@85ge&Vdz|jor1e6DH7R&2|zyuB!(P z#+ah8JOnM4DSHI2RU7+*UO-QKeISyghP{**gdg4aK^;y5f_%m~+$&uLHRrNST_K;F+)?TYId^k`+>d z@wMnUsK%fV^`7P)Z>cxex4$jA;8(q$rZ`JA|Jt+Ki*AGv0oC~%l7oO&sW-v8MBw`j z_=z|2koKQEjcyG3|7g=Rj#B=E(j>tM_{7GyvVDUR(&rQ=U*DJ7!h2)~J=mV>>uUhr zgS}z#6@czDX9+$}mNhU_SDA@4Q`w^a9$~MnfVD`I?GA^OBY%mRh4ooOk!@U|u1n(#fpfTzkF<-n~WrNr&%s2Q^#e0m3 zhpYSVz@O>RpgL=~dFxrw zVZo~n_t7}vE=Qq6pVKddP9^l11H}vN1$NgX)7@Egd&=Z0P7* zHSV5}nbnL+8Yi-yEbE>qtQY5OBh*sx%${2+ZqN86;J`V?@_S_mx!bN~iF!lCnsiyL zy%+Oz@Qgi`1r^m*y#kezP(^J}B|8ob=@EKA{U#gB1nWXXz`;d82bJRI6pJ zj6Q#vjHDNU{Pf;Sh!10t=b(l9%Wd&42K)EQHdl`D+=np>b3-D&VA9ZLW=zF`z`79e z&7lkY7^<<&ENB|Y^q7r8NLmw&`S%Q}?Y@%<1pUJfC|W6Dx5Um%X|?RL^(I@Ong^)W z-$ciV=hH0?IwW7nvT4c#v@jaKrCGrO_dan!52Kg9D>k5$P@Sr>&7Yx}__ntpsQYde zmc&;ZUo2hcuuPO0U7u%8`54KeGZp7MyQMnG`dSj|!#eM;7Rq2KLFCG~2gj75=LQ!o zdNRtj_@kS>U$Gtg{U$st)>FGn(2Vkc1YUx#CIzxRwvR%J<=^VJ3gfboL=P8})gH{P znb9qY&XZd$&hoxPOXyvBS$s(qHhX{kOBvP`GOQX3Uz1sSoZ9i~P$s-|mH{;{>8{XK zl;up;=%m}Ripf}1PG)b;S#t}KBW}Z_*CR4bakBFBFl0>Jn}NhIX#PD{?^e)+2|}Br z1=*sZ{kI^sIoiG9oAwNzzYMT+PPCFHg-@IVN()US801zehVlVJV7zlxgY}^Jevd!k z_2^TEqv2+Z_z75C{*{cU{p#a1UeIMepcWm z2twO9Mvk-Tj7fx%XPbgJS2O+)mRo*)EfY4zic3FV&yf_3`^CD`hkS<=^u%mf1A7*p z<8Jc$>^F9CYXnMj?t~bQdP?5QI25ZAOYhA9ERov&@!{qTz7#D}9=E9(tUPz1>VkEZ|H2q~z+sI0s!cinugoTHOw5uxH>Zj%M#&E>&uhe-$74kQDh>@# zoD{hiKk>TvZQ!VRz-Hrs?{bJTdEb>tWXB1W5`iB0asRr2o;{8YHZJ$eXPr$=GwGvI z>SLHEp>f5H+kTw~IK;g3V z!j0d?Uss3frKP8ZO2#2(6yy%99yZbcgu%Ep^!J%kpxX4#vQQY zXxi)mp}yZp?kn77oa>fHtTEQ^b3?8`xSIW*dtk0rnFe!*!!1ReMyfqpsSMeN`|5Q< zKU|&k$sB>$P*824jojo5%6DYV9fZAeisNKdVn;nIE|jcnO__#%YtYjH z%Xq*tF|ERDJ?)Tb41;vY5+8G<1;x2GAF9g2$Ra=O;2%?};AKMk!x!&x$1;^4eUtrB z{LHW(e|i>WKDh4h;BZ7YqOY(+s~KM7 z4eLLl454dj=?%-RmGQUtsj_z`#Q-wn8=N-@hV!D~^uc?65rZt{J)ip6 zEt8=C0e3a-BCpsz-s4fU+a&YPjw0P)Ziohg4)*EPP<_g)&Dc}pgN4yTwpOBK_ z{|KXWfU>n&!dv&-ku**}_4BzTuoU0C{`q8zUghu-eDG!uHj~P-mlxZKuCF~tR)Qyn@uO$Vha7g`~1BMbDY%H7-73Kn_3Lrkx=8jwgZ)_Vh<887lpsHGg>S>oH#zwrk&^X zUaw&goZh3hnn$PvIS{d|&kq!)b8cG&Q2EaNR#AAqmG<_#T_fXdhe;~ugZO7k>_-oj z5Hbp@l15L0%SW~c`$#iJ!NXa?yxga^eojSOn=eVs$_G;=g7@Y%Bpmvt1bhFN>wFu~ z-YB%le0ckR8PH;;cf}urxHp3usumkJk-t7kc8VsEb;_n_(tGTu+Ku<>K~_G^+mYpM z9>m1PW)J=xtu?IJV0E#qXFWWjb+0kZ*sz(@>(@F%l0M}A9Z#uVPw-v$t`Vk(3tiS#sx5a42scV8;k=A$<9fU!^as3 z$N`G$@8uItEdJ8Wb=l&a#otxlQ|dW5ViM1Pn<2}jDEGbmqTD`jCcp^)`)qh>5Vc1L zUq4nL82E_b{4EF$JaM}a>qHiPv;Il~uqEB!&@CP$@G6T7#u&mkzmxxOWorMAy{@So zbG;|yqWxbMFq^alxLC4(#O~qaSgNjwjei?#wH7wM9_8;m9fz`LPpZ8%5VYbpgPqv% zCXO?XvK$Qg1>FLtQ4D{0-K@ol{XCV&jgNFBCZa<@D8Cs7-5AvaX1BV4)Iu=zQ2#vSl( zGX?K&G3Mf>zj)Qx?d#eq|L7U^F{Z;=g@<-iP;QK-!hL0u>kOR9Ln_;^gG-K&Vf9ucpTW& ziS-}952&lGeG}E=a5DV$ZT^+!tJA&BXnC2i7dYzxwGgH*mcakyc{Mo$vJF7w`(Pn) zT|nB_FNW^5A>IMYhtcKmQG=&$QXgZzHJ-|R8&?UIsB;E!G!I%4I1~mR)pVO|>#|yY z-Wo0zRPT+hcm$Bq(B^8%wDY>d% z#M;P_Xa-4Ba#=)}99f}Thv%v{Z;-K({N|fdp}ld4 z3%uh^8^v>AI~r|tAj0v99d)*FJl;PeFEkrrtwmyELz9DeMxz|S?#a^KL%8tkqfJ7V zU~M7r2M=l5MQ=v>&ulvZ0copO<>-C?b?Q-$&B%2S<8`XYI zd^^(=UWMjAT@ftmJlTkKqTgVT%OUQAly2{fY~~Yq7;9K+t}FltCF{=(>f`am5WU+_ z9XaZ*M{eOErn?aOG0$+CmM$zB3|Vx`O7QJHMlGD(8i1!u@r2#G&KWY=IFniWWL89Y z+Ji*}C)!=Z{AsSUQuGkKv{+E;W|g@!RUy02itOc*@vnVvlA=@C~BZ$hNg!vEmowth+7G^8piI>mM(gU*WI!2HBqHq_4R@3Cv{6@8 zDTuWFI0mVOKBWr&i9qvRPV_kf(L0(!IG#tUBH^*Oz)|(UeFW-=g{v53m zovWv)3iB8rFq!Pc@CjqRT3*G?zr zi@a{nV>;!~aIDe9F?0AE3O;$)lZ#u2+7dPj~7L=RjRTVTS@G z+V9XYZnnm#&Tk8Rr3Y&6jCd`cXU%Z^{mDy@EBE( z>g37r!AibI^B$~Hz9`by(o+Cb&aA4GS3v97E5%k5bA-ciwajSg^#x_>gu%g~*|zP( zMH;+36e|e6+%KRBTmZ(#e$9Tvo6Npnt8j0B4zJt9-z%RXH_%*nW_%NDG5)~^%YPK! zWw9=?0AAw|JjVL@Q}~L zvkhKt|L^vtPP8?2wW-__`KAB!T2^+I@x|;TvBYETA_oBww~GNXCOG_jB}5vnI*D$4 zBTS-(X~CDi$-Y}?KXD0N^tKG!W?{a6F}TzqT`{f3P>@^mIF(7?uhH2X?KZ?-`5C&6 z9P^G#a)M&R)Gf}>99H{N6?)oCEQqJo3EyzunaC4DuFDu&5mQ_QrjYn~VYq7MqVWC6|}Ht0Mnd#{w2Q2Ke|92{zHs`++) zZ*=d#a~*IGD+>@Tbce-b)~81mp+J$)VBdZ(_CF`PM$I15xv&rxI9t$T?ELN1+~Fuy zNVgYxL~@ZcyREP)s)1olf`j1LOIz~yvoby~;6K01Jt7fTCwm`lEaNqPdcM({><&JO z%T=$K$V-3=QXT%Fnq>|0u_f3;G_0pkSGpQ8(>f2&@kXnt@NEm9^S!fG>;-vwB8a}Y zJhxa~j1`;RTsNl8?qHRwHu48XC8^Qa0oCnuoP|B=8g%C=u1^AQx`|O_F-;LsoQVak z)U2Y`N&l>vN5anv8L06`DTO>a_&PF`h_v7aQj1=m7pdT796B55D3@N?7APga=qHHP zi)WQijo(R2Q#oCO@uIqWX|-{`Mu`t3gFy6lA^}=-r0^~jn2y5vj`CU=G6DW*JLf{VaGoI;qT?SL&E28{mbFizpb`fpv(;= z-VGeJS;Moz^CQH~=F_Er_cOA|P)0;FR3b&vdk3u+O6MF&KG+nntYW%dNfyH&iW>Zt zIAZ60gh_2Kf@X~5{2LXaPb~KzV?r4U?tcF}&I7kf<&6m`eALJ7w1@B+<4s_$cHyW$ z%d$72Z};aA%#RG&js4oLX=b(b-^9voiD1L%greMF@RQ@#s@Fe_*|G*-sPH@Ni|Mg! z1|r<*hmdD+y`C>~8O4hHur?yc2@`ISQy$+C?@z09+c?;pD0^si2EwloN2!ZtBKT+v z&LBevvU4y5gKx2rs-QN|#p6&?G!?mxbkFytUsdPHxWmm;wD0A|TAxh_e3R9KAl&bb zgVptULLth!{%p@!S?P>UfrR_BuZw<-Xs7BBx!$BlPl(>DdM7G=9=|3_w>7TS2E78IMWQHlm}ChPxp;Jv|iKr zx^Yx+Lx|(y!Pp<~Df5JeGQjhMvJwnt$6vqYUuDA)!l~D<7zK3jXJNt+dVm#F!^mwA zs4HmVWcv3J~YQ2lZ_ zZ05RrT0ziW%eeP0CDmgbi`aC^qz_5*B^}S4q@;NME2bcN+@R<8V=dC*pXW&Qsk#ig zKL@%m-)$qagML>Q1ZVf<2CvQg z+&=LYs;~aHtI%U{TRd3&TnZDOu#V^m0RRNp0AtjGk5PzUCACV9skw)5YkCC){ZoIP zc^Y;2R(@;0v?ex{nO~A_qEe=yRWb%hF(*R_ZD$4I%T8=ejLDt7R`$Bwot)w$o1=r8 z19fjB~agJX+K0=|G0|C9tYvhsdmpMMvdTX?|#{L#apG z`>FyWP!D+b+P&ep*xD>1Pb5HbBUefFqXpSu0v(e~vt`whqp2^@Xdn*(*Cq&)Lf*N^ z;ZfP{TpLJ*{~j*OV5x`_e`TG~K$)!Bu+r!*PQqv7AL5#TKHdoA|o=cvf+W!gtUETQ^^_Aaora z33hb7>$oPe>6S8K%$v)8)dx{fkK?WYRn6Skp#_Cx^+ks2$9=A&8$m`sBbH{M?s`Qz zqXS+-hlW0W`+DB3@ZzXjk*!NpNa|0(7YuL6x5~+PV)H>epyOfmKbZdx4wx&f2O?oDB5FnP44m_kmSC0`*8LV{mBe2!W4-sAOF=SwI4lK=8q3Me48msIG*d z2}LNA!b^u6;Yo$8iLa25-0=0q=v^Bw-*ZcTwTYsmi|3h2p?S|rU0t5N7!pCqM;!D;k~?7NjM{0)ktEc=|7HI|9K~_mJC0% zuit_ofD=|~l&XNd1VK)wt5hBrHb9U`Mr2q;Mg*uQ5S8(-lh4<~pM2h30~%gh-VtAs zV}5opst*~FMvph-fTTx2kYzZfC5tJYo<*$DZ@(CLCjE0=oBcRi>jU%Tjwk3sypU0$ z?@1pLVu*!}`zzn-_AbRsH^yRMQ2?(6ft3=K0%--))wF^7TN+miHkubb?F(cIw%Dp`Fj4Jpw9-%lQ6aSsKGyQYlAad;g8e7-L8Fnm_|#;cm0HmGqr zIc;d;(N8j#+_DMyEHocH(1@JJ>f#qD&Q^SV?o~8iM>?Sy#42rf{ZG(V$3_!RPftO% z-!)8djQEf1uzN{l(05bVF6vFm0*if?1j@qo097lZ!ssVq5Q*Vxuq5`|QQc$=qhgk9 zkoIL%fRNdb%IfTUQlg?Lal+H+n5pB#mfQ|e<%h9qE8uK1YC@GJSpYFx3gk^fQTgniB^-=wK{Pv^rFbOGBz+|5ovYD*EtaK#TKpBk$8iAzD~e-HR{pyy;D33;6zCR zjexwEDTY6-u)3u!I>xH1OWSUUM9$AkmDR!Ppc(?axNS+F?27cFCIeRoDc9RyvnsKX zp*%e?d)%=1Y^(t#mGD!Ica$OslVnLu9*BUk3GMbWsm0{uXrDQJo(lg zyrJ0r!P1@oeZ3jM6=b?Ob7KYuTt3XFNb4^R5Iofgf`X9UR3#HyV-X#?Ft=UhCHLzq1G5aj<0r<7#2OlSAexFkY~;CjvxGx= zuVb&mNf@KK&}E+r__=L1zMiRg8wfgd-P6rwu+RM19%{tl0sH6fHjD(KNXM8&-$5Ac zeywT2iwa+MbCJSpA1O98*UBdE8xf(seNC&S>BsbsRL0A57bD@I5?ymO{pe=P`%bT# z`aBU0t2tofJYPYF+u?p)$ql1!ysH}a9ni9r>Yf!GeX$d|j$E~{kr&F|+py`|tUg*0 z=ChNOF_C4t9QZ@DH2HFKdCLjvQ$D$$Bs%jnJxNSzdBb_y;7AJZdcB+GDsQma?-@m^ zKDB3g==mT#Rt2$(6v$8jXP4Iuu{){d2rt$NXdq$+$vQmfCXg`#&llTbF4lqX2iF_%N?*PuTS2MA0Ijq88zz*J0+?#_^X>^HG_1~?&?sCo3@i8jQy}tHUVRS zyB#k2eyyH-m0<|u=f5^Lhv)!dE2Yzu_#0-=^5+Bf4Xa*s6U2v~!#oT^GP6G|(@fRP zM}ckYnnC}kQtTS2w?w2*zw=+FqT>Z?n0dWOLff_d6-MTo;&8T6_u}QCEgeeKp4JYg(!X~93v42U*wCW5ielSI@{pDcP;H=N59Au`G!;##C^)(iWQ9{RYzbosm^d< zhMZ|1W?{AiJxIwJPPz;A#%2XE1SeCk-)1BTX|s!bo1BnNheUdn0 z{jCE%Vn8U?KW`EN04&sXAchn*WZspk%Y#rKv6&mef}f>>!hLoKvhcC;_d&+oD@Nh% zymL}C`+PDF6No*bxS19R7Ch-tEI1kF)(Lb4EfBCJtkiiYgpgAeXGwNb5Dica ziy)XplS`rrJ@zJJp^xQ{ius5Ojk8X0Xll!%pmb4Cr+8t2{PU*MrAn~keO=c!+;S-x z5i3rH=06U9UsjOxp(3HB=~VO1%TnWAg)^Uy0l_mk$f%B{z)V>|PKwLfM|T&oQQqFt z)WOAZm-anPB`y4&E^4}l>+9~ik}mVEATmP`&yt5VKoHr~<^PrN{ofK2E$TUpZ9vXP zptKv5*b@DU&Zl&5>EOB`rP%UhTKkg;*QIIBm0&V%F6p<+mdhQe7J_$Cz#YAFiroZc zUEu@<#C7v7w{6F|^O&L2!$27c8wPR14zyvDkl1&$s#_a{dG;`80lEYIFq%#dQ|!)2 zk~Z=w4U6sxO3nS|S?rKW4BY;db9huyO_7LfNY6q)!@%~cH;feS?G??mw7I=XhCOO9 z(5EbOsf}oZW;Qr`LF#yh0rCipdcL#|i8Xj6_?@LzUHh5wb!&{T0KP_ULuI#)%dtg0&_Ycm2xsE_9io zD5qU20{p@ygDe>6WpIT`Ay$GiV&n(1#4@eeqVZXj=r$oa*=XAp-tV>bP?`3HpZYj7 z8QUUMbK)gI5{36&Lh37^2(%!BZ zCU9Wj-z=&<*>wwP6Q<6u$DAf4e104It)Ze-^^2uEg!pfmPYOib#AzRDvy)Oyp57(y z!}^D=6omld2qo+;&B8-)QtAP&qr`;HhAu{U6vy$PTF8x|EXVVf?9XQWKn z$={jML7y@&M0$e!JIgl!A40uh03$t9Zrzbi=2J1#OLOE#r(pOOYP;58v@o0VAhyQ1 z(UByWDH+(6poWinHUdm}TIu-p$@Jj=_nj=*365wO%Sh|bynow&(r>i0AQJ@e2(RKn zN)-7#W&RMO85}xvE}JaLuH`%^{k4sI`)+>wg~+@0+Eb9e>a zM|zPeWUwZ&*pHYX+g&i1o9uYukD_!gc%j4vAvN>L$cWOr#9stx7&;%lGF?z)B{NEK z4cEwGwnA-E(}v&gQ?SqBtw$4kzp{tw0=q{<#aBIRHCDZD60UEF(p)TovWW)E>j}u# z=hrPz%<^LV@BmfiG5i0IthbDcYg^hzp>cP2cMa0Gy9D>(8VK$d8V&9iBu#L43zEj& zJ-ACkaEI`9_CDvlcZ~ac{hMo!Syhi!WKtb*FLDcoDh;e(m7pBY2WtgG(NGo{rE;#s zk@eQ4;i&UU_E-obKwZ!LsSt(@5eFG{6_b8%By-1o%U&x@F+_$CM6HKU9ZoD)sdtgc zY9^=C#p-ZPBg71l8yq)4`-~3vcG#9YS?3*GJL)f7fZ2)d^jP!$o8)#yXZTKq5PxLW zEDvopF@S>t4la8F$vaz%pQqqZt`!;q0s4rUd6 z-+=ci5RQYCCFtZt)XVbE#1zvC!=afuTKfBI{6@xf%o{1&e$#kpq0gGjD)eR*LlCCY zintzV47BSpgt3eK)ud!8|H}`58Ez=|a7LkqbgO9-?a&_=%LccnmQSK>cRVkrHFRd; zU6vQDlnbl6O0ntW*jNAtdb~IIji=0)#Pra~4IaOp!%`cr1c3xCi{v3BNTAiSR-1=* z-rBbU)TbBM)L32kA6m#(A6`xLrGp=zNrb$8OX&wMOu-%j&9zfLSz}vx{R;rj8wJPu zg*tg-C3Dl_;bFaRU9T{7S;o}ZTBMa$m*t84qo>?ob#!2C#%9tkP2L$HM@U((2D?gk z-(7$DCBj3qYjAZrKtHCVN2IzvU?zt#p3QKz{=bgdZuZR%;j{gVYeIvQ;Rh6s zLg=`43;5^P%ykY;kCA~cx&;%P62yNjNL-M;HoSBR=1{Hl6uNp)mI(DJm5Yc)W9n?u(NBK#)epHnRbv z&J$;)8}ebUl|(01qZ3v22rukq_aL$&D^!JaRdG-gp~{yz0OjaoOf0&BJ#};(#)?#J z8omWFi;l)8T;$wch(Kdko4rJ{Qs}MmA6N_f;YR+&dsQR5zg4+Sj@_|pP0`3+RZtKSVXVRhj?MNit9~K(cYlQZyMn59!v>S64BM1Ec!!g zh)+LPy#3XI+Quj>vgJ=Y+S%EMNQ-yB`Re%E^Q+b~{v_qk>1H$kO5L{A2P?WDE(`g= zu%2P}>%l`Q4M7vfMuwABl(9{wGw9mM@=|B&}F=!_>4x%Q2L ztkWrls+b_*)boR)=*!#9l`h98t`}2<*Tw3|L1DBnU3}u&hwMdLUo6h1r>EI=cX!eJ zDqztCiQzmbqM6cA4s0~kt14NN-V-yUCNQL%h2QAwkK~d4+_N706t~6JjXjuVSzm`9 z$GEp3Xk_y+D(0@DE4Eb(#S+A`U^Zf6{IbQiI}-1pp#V7G@`KI@SCV$}RiqAn`SCey zd{TUmh2xu?K_7ZC@!qCf-n6FRcjf5lOxDD<*_%IBn3^z^K4LsfixE?*jj5a^l+O|O zbXd7B^eRWIUiZRaytUaL7t$AA#zeePAEesdk9%yot7b2s&J zOHLys+@Z9hr2g)fQ_^R>Kn^>>JWkMhhgEj_E=Hukr9px~E(Z)&% zg1?Bq`Lh1JgcsfarojFWRU}<~0QE)sDjNT9RxornU_t|@s`oNk$*ySo+kQb?BB5xs zte_3Nkenp0#rrn<7wTH%`Cn&wp!l#ou1bkB?Vs`!S-%rnYK2KpQ^rS~$~O^)aG_5_ z>3L1t{IcvfEGj;VbJxy}Mv(^-T^sW=h$OgqU(#XI#D&40V(O1bCLq*l{oBnRhTz&c zpo+~DLwj@@UzKPM1^1MNQbdH7tLq2j7$LzJN9&>zO{-`@Y+YHm#_zUbQ&a!ScbMc< zAs^s#J;CeYo{Aek#ONoCp-C&nHx1Sw;7lXY&P}6I2r%f&J9?uusRDT|4=sbp=dlbDk$y+KRg0fut7FlP4o$OieEOvY~!VCDjpE-;i`M)u&*DhjmI!F?5Sbj-@7PuVg+J(~GuS zMAyh3vRe^K{L!@~!dHBU!S4avQrTM5tC&wGO-0QuS|`(-KeiXZq4{;AJRDw~XmLi2 zkDlw-I@95_z=lMoMSBQN*5|ZdO&PyzCnr-@eg2;LTXtj{?Ir(}ykIkFkZX3|W6t~y25WUsrtmuL*2+{wEF)uK=m9+*Z~x$HNb-h<({ z-Z=wVI3gRo^4{SYJ0)&vHb5%2Og~?JdVeHyelB8r<8EqyR`LAfQwrsqi~;GOL<)6G z=Z#Ki(zOTM5p5466}Y|J^*KM__sXkwxTkP8bsnZk#Cuu`_NlqE-dnNthVy;Ey$N%A zvDeyrh!QOK`a$}>`_K61QEzF%7Q)_vXQQY;(mq8)FBFSzW$lh zbLjEzBhEcMka9>)fF}0QPj!jYvRrS^BtkdvvDRIiv+3c2T`}ap9;^B;NVSPK>I7g9 zp#m^Ci^HH>IzNXv%Tiu%WA?{V>B+ugGU#du-2Fl#7Yrv4j6kUIhj&Fo2Mu-ts6uap zY2c&y)#Ba9MhV=tJsSC>&6x{WEUTai28~6(Anwe34uD?Ml}&f`<_Q-@n@sm@?Awcq zLHRhJdcGy8=}4HprQc|^7rgA-7em?sdl%|WRgM#VId=@WBeimc+cp|R-B_4kYNCqX zQ6S5Wx=xvUhL1&>(!sYSG#u8I#^Hq2B^Gng@eeGp_r@)w{L@i9nzZ7PuuS`5+-O#aa< z$baE8^}B$3OYn$D?*hI2&`2_gE9h9I3rp;J+9L{+!az(|SPvA1pUa82*B!hGk=^oI zmNTetk_|rIRoTWRHFE)WX<*nsUtn>i?Uo|$>$b%Xrl55%T4C>;+ zGE7!$2gEsBS#5`nv*X^mca{J)W|OX&gBPbISGn{|5H4K?a2e@fcErWVs1dev#Bba87u(1%#cx2K%(Y3O(I2@P^M&9jRtPr6_atfk3VNly zquJ*PDq!EaVq)j_>ac48FH6lfim8NdSU97;St^)MBEZL~9z-+c+Z#68PE46gI#}># zcM4`JXUMwA!g^!!mQKaP2Ved&H0&&sb#5;pRheI=8-%MT{9SO?UZ`ob&FlZlO+m2*F5}j zRK%hLP;IIb3&+V@SQ3mvYuU%JG*BN)nTDd3jq303rI@2JBoD`Er_<@wVtbfJbmxJ~ z5Dn#)PW~9*PA0fPae-v4lDikt+@KT+0OEp!`VL(h^TZ`cq(s` zF1UjaHNn~XRN8FixVSK2br~u>#pNOAssv9gtg)`2i^IZBsj`}-$y3UX{eG{@E~uJL zr8(3VdwH>r#Gz8i9!qNGIkAs5S-h>zYQHn9Ki5&aU#2wYoZ%3Re}b(G5p%uGJ>AK`g5ZBY)A6cjzrJ*+eNYx8@*D7iFcW3g4LSFdq$QH;b2pUGe;3m*&eMaM# zx}rWr3OflxYE_YgiP{z*wa#yjQnSZFaha+al$3PKb6h6z!0^rFJ{TESa1vxe!95^M zDK)$)W^8K}ZiokNxC1P1M%mV?o*nULW@=JN0V@l5c_5`2l0eBW*_$-`Q|5eMgBi~! zbL4TKdrVbuhOVm&74_4o2_FK2o((hWNxZ<1QDKtOE#7^BPwFCLM7$y`iDu>V62SHK zuv%SK({K9y&pOQH;h~5T;gcXKLjwfuY4)MKy%cE-+sUASKW#>?=O#JVl0z26sLA+o zi{@q$kvYn_$*(B_!uk&cKtOQgCRS99<%S>9*7G#|c&`Xdf;Axs!$rkckS)q@GcIJx zeYNV&4ZjkpR<>}a^qgQBb1-$VJW>+&7nLj4L%Y85enh4bHF}&PZcH3^3iX7BdFN9L zVtepAhK!>E<4@IyyxaDCv>bUT4-bt))=LRy!^6~Bfyk<+JX(1pcKl|C@1b-cHV!C7 z^1^HD1Wgi&u__#1943G5tyP?XP!cGd{R4Ya;)XsK)r&br0`Q=`FpICG-{xR+7Q5-k zT*H2z#lv8t{C@hKauFRy#ApgBc^QO=pM#f01Y<5}OY}$D!q5r=ar5QaqZ1bShi#Rd zyHT#B=*!qgdxfanqZ6%|zMWvF5qVJ_)d1U>i;M+Mo;Z(If0@CgfcRzvybEzAak9 z$@lHTG4%bXg{|ru9@rd$-cJPhl~$L{k%3sE@A#Neo4sh6ztJr&#Ii<)TA&NBaKtah z9sEvK=4KJClpWlS!W|cNhnXl%=qt_NfJ#yAqe7&mDSt6{K0AMZ-YZ{sx4!GRZxAae z$DRHSs}DCn*H=lo6f-wFst;fkjb~0@`}6`D7>+F1(h{dq=7saJ;ZfWz&HPHBu#^Dw zZZAWOOrw0CG9^AsKSo4kP9L}cW09v!7D!ErYn$^% zV58E`-K+7V8{GT{4}uTv%ROWWyh79F6xfJs0i9F7vu-31!S zUKVs_QIgEx;A$lG_^t@(7SA~A1z*6CB+P8~8F(MwhT>wEtfVb&n998g*NqbO&AG;7 zEio)|6lh7k3m1TKHu$D<;6cESK^$Cw6PdPayF8!*n`rR7t zwzDo-0;hOu0G2umpW-`*a-P_6?<4{Eo)l@6#J4F4ucB}o`08at1qaD0^1X(f`n+wp zZ*;+h+zGY9`N#TqItcscL@x026L+6s?ISPc1B=eJ z9s&O0`A|aQd@BsATY#6h0n^Nw;C{;}lhJn@n-$<23O_zwpiAgE zTW-9ScP-+T7XUq#XTUlLX7c398jgdwWE%|@vta&0q2Xitlyc!4d z<#xx0_~+SnmE|e<35g3?m*2LXop`zPpXly@5(6a})dNs!se}P}q!Z?2c|YGXOYElubz+=IqnqU7PO*)U`lq?q5=RBJ|p*F1zixsRv_0!|Pg))>UE z^I?H+n-b3Ze@3WBv@V<`8-gCZha>KukfE6vAUM=UsuRXDS zhM94QIqmuHfc4A9(zi+|3H+R4QA5P0DULO)nNPo+Qatipli=Z$lj$exb`ADqX=#xX z;z#d31}awkjJ4_GNY~P6!W^fpgd26@VQlbsxWck)xxq-_d&>jwCMx`qWM|oucr9`u z0#*P|%1nuxg32To0yYtaBMfn4I#!WX{4^Q{1Q_b#WVncV>)n!*>U5K#n)ma3!OWkI z%KwAX7Nb6z?csMh9YoOJ@S%I2$VbJuN*i#2L%uYaSu7lZpcnS74a2P*@IBIRFrN+S z@XM0l7a2`|aJX@8P!yHEaN3MXi5^8fox0S5;No zX8RN82Ybd!zKWK2RtEdNKesGa0!rjq+`q*mBzk68R#Cn{CK}vUc$U$ct`a;>sZtEAR7)cu}{nLVJR>Ub(P1G3NYQGtDhlc973D za~6Xti=e6|tXJc6DANzE8iopjeWg9q)X{t)%<9%x%C_LBu8+U*&y0^4aInt-yBt9G z)8-}d2(A)T-=JsgntjhB9r!0?JUk^o+{tWZwoC9w?34kOnC(|;>bvy?YL3&s**QT* zKCrCzx8gcAZa`w<*>930D)DY41yo0y2``4a?l$r@nDx1!cGV53Ny<8O8PhEv-iUB) zJ=_>`hvdQ3NFNIZSXSIoGJ&@^S=mgnGgj8>6@p>_W6v|21mp--dgmf z3@C%QGDfZfZdrI2x@}yOb5Ts&I#y5jJf*9Fi(JWPtyGS`Sr9GU19<75g2IaP4`>tIUh+b7n_a#~V`1aSkYlsJ;9C1s7`ObY$3&!2H39>~13Fxj6eP$?b8jh2 zUl?JCcT!0Mo@vV@X`~WKZOV48YXvi8(h;55(xgF`B|lk<+UQwh3Gs&)1v|iD*ijTn zzK#7Ea2#Bh_>faZqwF9m_~QHSn~^bPva+E>B`y+)EPf8oQmA3!aGS8>I1Amek9&;qj>~*c zhpK0`=#Q}W+hAdu`b*okzY~?Gq#!(#9W^`f$-c;8t^nyy_L$@RkH}-y)|`DHqSv{g zu6fQ%JYRPSbARqz*AAjXnJ;4^`gG>wvaOe(E1A@OyxRY?7R?aYI))D@3f>e^LzKw7 zI5Vq<(0}EK_v4e@JE=pNillsBitT@xrs_xbkYZhkgGxK$@^hSN3IV)TSwKJll76+( z%_7taPpY7xFjluv2jFTW?qsmF%y!*^L8ljsPQ_>nI6^~hfBR1%* zkiv4pfan9%rL3u$o1|RtSFTEnzV1*w__`H9qvJpWdPmB!TU+l5Pdq-mn4>i=U1KIO zpp&7H*Yd*kVd2QPSN9bb2r(Z<=qZ~6i)a6(81c6yW6n!0sZ$LQ|mprun} zZx|)FI;!JH^n_v0kqw2S3vYHI(dM~DRA@b!sr5q{$Sq&Aob@E#74Qv(+c0jxX}*u@ zq(c#;8W~qk6nDkUj*dBf0WVE>)kB;j8t#UpN^DkP{(-8M zOBeLPODHaS5d%eW=C4!!4A|A4bd@tVd|HXir|AzsO z7eKX*5qCYw%UGwecXXm}bF<$i64!ctfIm1j>t5w@xS#at_Nb|=JBLOWd)(&@Bn}}1 zuDg=-u}6N1@KQ_o?u2(<8s&KQRaiFh(UQ4VY-d`0_S2LppogRlxpgLWQz$E2HQX(? ziC)YVUJhmmTG!bTsf%K6!_&bd_vP{;!14O=!x9foS)*dpwyjH&q0B3NT5tq5_l5+X z+|w(@L3poe4G^=j(}~`2r_p00W^k}4y%jg$`V!zRP_KGm3DXHL2p$N57Bg1~&lmv10?H1QWzvJ0fne zDvEod(BW($uU)b;Bjz+5I>Y|zr zZIo?pp!k=d`_kVN=M7VG#kFJXA< zKNHwA1I?P;oC$t7@WCAGSnaUJjtSn^eQ-Y%Q@bn>AuVbVWh~^bNK>_)F9$KJi~SM? zvTy#mgKM~o*SGe(|71;TfB_z}dz3y$%cYu^+6tB`LI+6W9UWaHk9DS|BB7i?SO(0< z`NEXSAr}(?&b7&#FKf6DM_tWY`UC?N3d(uzAqsq1w3x~^C==Hu^|ZX~uh+{-&o5ZA zrfY^wr8^V6M$62gua?L{L@qTc^{p~Jt`hj@Bg6|!tt_$*?@BK>P=QE~zfN0+X$@5N zUfemGwXr~@BxOU>Xg|ZziE4?AM7sVobm4~|q10DVo8kR7;eA6Dfs!8y2KRe%?#Y`! z(rvvl3p~U<5>@(-Afx$K7&=_*eR1+N?$yjiL-y#a%qK z+`VMKra1Eu%lNJ6aOJarKS%gUd7-ySCu0FI3CxZ3KENY+>eqFFG#@M z@C*pkS?EdGhKnt3WJ|D0sOH6gYq?2=nFnSDil#+=kED6nz`9d5m1{N$l7UqftnI%- zwEYt5Bf+`C7HOwSY?6HdR~ZbXBncnrb1i42o>m7mesdFqE7|p%j|auk!xTga!(Y$2 z-c;a{kHrm#Mgshfn>mri!hU4H>0w(MynvknZ#kw_ugE%h-M@)3ELF!1m;7|JX7D27 z1#0pP^_T~Xu1?`0KN%aT!S?)OeC(?sl$py1^xmitj;(Std!nu)yE(BKL`5smI+SEb zW*ot$#AQ6a%8PldQB3VjoFcAW*)zxa?Q#Mu2xume;A<$0xLr8CR>efpWlRj|z*B5@ z@>Y`$bCU@F5kyxI?7#q1#0f%0*&2)AiMNeaByyfMft*lOUJrb(8?dpjjg!E$JKwy1 zUJecpT0;53I}n}zxvV5jM0m2b`Oj4f4N>$8u7w;I$E4<;m3ygFX0&+RM%T|jKa9rE zoU-7X@6#mcMsT>?DC(XHM9bH027W+%dS!!j)73Spma1bz!*8~DVdwi1RrrFalf=|{ zK&qG(>7`lNqazxMkR@-*A5H$6pfsYW;&K`@)1VGx?_U%l4##cin5Ag|I)rHC7RojR zw>?kPNU)ZB8wb1Kg6#gEWN_No1Qw(1+3e#m^udt@*!(4ljg{!aglP75nP`fEp%7mhwSjRB+5m*z7ZVWw9uz59mwD+ z*}lNCJdA|40OH0X{xO9Vd)?kJ=7Bmk_Jj+%!ybui~M$D(|}TiTPlh{ z7IcGW8HKOQS}dS!Tcb-d^1LKLpM)`UHzQ|5J?4F2HK=CN?uT&Q4ZOX5}nz7LQwYzV`7wI&3ye=EcfKQs%GfGP-Wb4dTPR=pgG!k-f5z zQ;T&z^?~5oR5~+z`3{N|8uIY;e7Q728c=822cH&>%$juAmQ!LT**hUg!52sa^Y{ zzTXdUb-zHJ!R=Lzjc+1P5y?M>pIL`1b1wyRzvyo`N4bAJSa<8Ij(3NHkJt>MEA7EC z=oVS4^~7yU(ZGbN5X7u5`==(Qw|rH^W4W&P9WNM=X<$(i4Fn^xx2)Su_#t``^bo#5 z5eSAk^(QA-belm?(X&)RNDE&^?orPd+3!PQW*$&!Ic0#7q?fJo4nDX+`Zp zh4F;PE5Btvd~QE*B;?R}$+=|snmjdPR`}M0LMTc%u?MH^P+kpj&4|TffZJ6EJHGsn zpX;LjofRB-?6-9I`}bp~?PLyipHzy6jVWWxdmG%ewg z+)(|GGI;K4cP8lPO#Z`5-Zye64$;pfKJ&T^jZygScV+7=DEWo24mK1J9dt8Hm(N)-=r!)w-oOQ_u|zOWk>uY>X2rG z{57%|LvOgfKV5{Rm*Q1{O$?qg@+2ObymqNJ9~v2uChe&tp7`(UT#GmgOeW zLW61^05SR<(X=W*21^U45agWLCh*5~H=;T>>~L}fZ`Heu1JRkpm93v7O%mSMLk$D| zD=ISKa9C%15*g@<5_Z!8u87H0;ok|;G3Vctuesj})TqGTw1ex3l3*6sV4XF+pJLJdV`Oaf z5et1t>oj67d<%hmqJ;?9_^D{m8*U|UG-*P%gkQhP8ecx^0L#X;cpR6fk=qUtd&9rjTa%nkOE z64_`YzQsQBkn#&ET8CdyGUcOy=QZDFM={2THwXe3d^KDjQ?N2X`k2PZvPdG;j29hk zjXL-xk_N_WEF-c$B;?M3Emz4$veo;~KaKsn?XYe3V(kSl{J-XWPsz`?ou{f4J)^;D2AuHAEp8EiO z_fuctEJEspH8x+74r~qz-}W=TC+@it=lADwab{EjDKc0`+-VC9ePr+o<02O{<~+4`NC&N^(yLNx2SM|VFfyDy%iCrmIET7TJ z=kqcI(Bv&P{HUA=Jux9|X%)j8E_zde^FsE_T>9f#=y(B=&>)dCJrpwuPhthK#-Cv5 z&e%C7q^+f`1A;M&S6E@{Zm!8+yld3tm@VnOYJzF3#|4@QX%iOv(P*f&P5H|h`(t89 zn~ttoO^4$o6Ba4P1tBDrs00xa4Y)7GWDeuV{I#Nr?ptff)`=l!Jlvb^S>n#8>cfe_!I(p|a>1wivkjJp<$HY$9+9~isSIFvxEHedEK&2& zMqGoqV%2mVxv+_3I2jET`Z@czlAqsS?a`fM3pK!ZljrxNfJ{$h#%0LRAZnC z3~=;yQaC$jZb5Gu<5JH}dgfLq1B=%XqxYHIAphv2%di8(_28k&T<{d5^@#HrJdN-b z-~(ALEG}yJD~m~nfaQ)BYXS!&5o^e*Vt_z!SLmiw!xp<{H9Zm}dAwrc@0A^B-^!8! ziMgVlh0)bB87cVgG#|9j8GmBe%d^8qlp8Hhno2C!Kk*d@S|w2PP8Ox21R1QA8V;uON*Iz?UKFweywy}UCDyecOsN@cStRP=wZ?HP_hZIzaiI3dI>b}XZKh_(g ztVRsr_!Q^V?&u6}3j{n?`Q$xAjh81znuHtwfJD{6zb(kZKlX_SQD4L@sOxX1^CJ6N zmUcbSt_{gsX$M$B-n;t_Hy*J9Oa=coARocMMT-u)8QHQtmnLRwE#g8)J`nc)Yi+k$cIT7A=eRzx|Dy2ukgkd zK=)hQncMFH@SpG##Ak>4Ob}4j3%R2M2^IbvwI{{pqR*2K8^mrAS@K_FDWh3@CRRix z7}N(EE0lb%=r&dN@>2O;69oxGq_aIcTDgE>=M#`I1C>&i-TBdoy%{Z$W}uL%&s&u2 zoIxZNw&b?2dLR~j?7cA1GiJN1F=kt0Hwm#y;9+nInN~_sIh5ZLRgnDh<<_Ah(*ima zrxN@XfkyuSB%*&6^+sr-e{At~vhyLK8};1<{ks>w{;Lqzis}kRZeC$x)cC~GQKBV< z%znIMBsOJfAH*S4jmm<}t*GCM6(Zoi%>QN?+1~ z3U+unkKc1S6g?AyQY2$GbmUUH8X*wYc3fQaNSOo3y$N?Tdp8`+E17GJ&Sa0M0I?-< zTqBvv`BS~b+f5W_^fW@8SW7>5UG1>6-to)5I{SF~eEFoB_wUn|z)_Im!2OCJzu;xx z1g>~^SqPdaZnpRr&!=ZtzWwMeJScD#KA;LW6e^K16OKoMWfBk{xbyh42tKGd+ool< zjp9u;okAuVEI&Y7&F>%e{Jj3ZCKYb4*rrl6_v(izgYD{bf263FI&-qc1i}s;)JRbZ&q&qTEJ!l`Rbd)v zQYcM4Dg24S!}dL+rbpi<-phf8rHhK+0%QzuyWzh3gQZ7tEtK$0@w6|;**NOtv(lo( zyH%Y#x|Cwff8Rez2y-gD#i+;>7n9FOmxuQKG%ikO;Ul}@y#1a?=v)iE%-Y0kC_3ai z9^-bL^=kU=Tkm138GrX>irxK84>7m+RpDZuU+ntcQ`f36O~x(JY$e8ubQciFaE+@c z6T&Rj?EysDMz4x8hD9=-?0LQ{d;D>TXOF)kR=@dEmowj^HR#y}t$= zto)5f4Ot4?$NV@L+uTFz{|c88C;o#B6Rmlk0rI^zx1tySYMM0?rMb_3l99ePc1u0X zoJ6(U_%1vQ(AcOH_Gl|Aq9^b3l$cD-wtl^r#zxked|!lVCMuiP`8lonCu*8 zghk{{>_1!Z6VWhB!Q3P%&1U0H(9GFmR|=iuER!Q$q}GT-kdI65n`}=!2bxutZFzaS<-t0#dG|_bferkBk_Y&A*d@KQ35Tuc zqtpwY&&7e>)Bmx!lT6SHKQVSMF9}|{I8v@ih^}~_E#G|E?77l@n)+iscc!CT`uz(L z1_ZU%|5O!MEkgpOaZt6B0QhlNzbXV`ytuk5@@aEba5L~~7zR4x1%R_!5V>9~fqtXm z7IJQ`uF@N;>lDP0bkx|Tt^Qslm+~-zL2#!JjBR%PtfZAPKJFI3779wAf!9%w+c47a z4=G-iqs7cr#+cLC;}D$&TQ(&(f>Vn+cLOFu9HMTww^_F`Er5%6=s3Fi@I=f z#Jzd&k_#c4T2znFVjyG{#Z!MGJvoP(xXP?a@mOA?6x1uF&Yg8ZF@p1%F2t}@O#+XX zm&Ob_+n3$cjU(Ydi^=0qp;GmIwh060A4|4^}*^DHo&t~t9UAmfs24V;fX_JRn zB&i?joHfePRiOa*NAz91^6~mP8PFVeU*HfU^Oqp7I%Qk6<|R1#HMXm3RG06R9^VQr z)EGZ10ZZ9uipL>LYqylrh;^wKiWsI5^=(<>M6? znQT+Ht$_>zNyF+3H92?OYy}!;jY)i0FwY=Ps3ta+CNuq8?E9QUCqAKVKoJ}wO`u{4 zZ%~xF>T_m}M5~P8drOxSKCSGtAg?8^;Ik>0`^=NeBdYRe+a;)RoERa$|Ki4eid#ba z3<+BGIX(7iZ|&`}l}5wZpk8 z*;qhFs#()oq=oR&BAzD&Wrx`eTfN}Y+}9yApKjmesZ8`zqj4?Rv5T+QP8$6d1>gw- z%UGJVM<5!%?8#aCrQaJ;f9s75`&%{dAqB__gz3WxhbY8L9G)kEQcoO|$y;mqIh17*%{sJXAO0~J=~lwCl#8A*|b~P-~s?#R36DT?*}1v z5>G1}P|@ER87b+GLljco=jo7WoId)Iy}n0mYZxJSe?>!6llCUrih?-bn^7$xZ+}@~ zx392=?+ZR)MesWbZ6RZL51ik*GQxE0a7!L&8?tqt0@qRnqI9Tj@(m zKUJ^lZT)oOI(^nj4fXU(^zS<=SZ6jl^+Of7PBR|8xhgm%Q={xGhR}E&F02JJ) zjh^G%8A+}*qD&6xxiLyq@a=x^}jhb3#0!t`2Y7@$-VCz4LCksxgR z8nt3x1GOYqnl#MR84bkIPoQ_M81Kx|nFxTt4NQnZ`(1qSpPDSqtuu=2YKRky_Dq(t zo&!~4J-r6@*;^a4MvQK0C9i|WUp5u^JcH#Bjpkl$onZi1tJaE&=*0Uy1{ zL}@*|=StKzQKI_H2G2GN`hAJx+=xS^Kl^)|s4;))Rm861%y%M5HqCVh(^|sY#y{|k zaA^mBIOq}e(6ynIjRkkMbgBF~IJ+B_c8}Pw5Jvj_I9k^41?CG~$jZ3E7 zmqwib`a539p+QAIZBiqA;!=9wrjJNjse~@3n*0lu&Hqs7v_#UnuqRy9d-0<;nqn~O zY@9OU-_SML&bs@F8v2dnUV0B5ykAXmw-Ml?Z*07(NgnYG%v!&J==Qcq!LK5_PT+?# z?5djME61(rfscm2$FNi|NqNxaB3Xn2v!2rq&BT~WjidI@FJK?e^Wq!Y+I3>UIoN|I zGBCeO97u&A3vdM2(Z1PLjAehMB#HZ$ZVMI#j){rq{gt){ahMhHrA88;ZV&N*-t1o# zDAxhsH;~MA>k&$6e^_i}%V(i$4?90_*%{oHwYO#j9k`5w?Y7DJuB=2~LM0Xxd82YF zamv`^jpCk&&tO`Au=`BmdW~gIWKqEX4IwegWt;Y?DNvoV{4W9d$OLO(pem?4#0Xo1 zkt@zktovhh1z!7xC&$uMdh)FL<38rheJoeEZ&O)W*~k6SbPn#SYYSvlAIrWV6vhCW zmRgxCu9#A`AixX5U3j~`zjIt?x6&)5L08e8SEDgvT&vz|hk6r+E?*=y#CSRJ@#YklD1k}@CJ+U*2l1DlNoQ3;Y+p`f|y%G3< zz2to`%#h56xW7*RW|w}t%fbilEXtvD`Bcp9d-_wHw27}XMdd$y3Vd7M-N>x39;cVI zh?ivQPRY@v{xtX_wSD8Ab$ZD(V!_pm+~k$m%3jttTIh!K&ZP+I98(vVA}A}g3(=+* z_snwH_($#LI?w@l_mre)jf#biHSuHAThsJYH_0!H!JsChH&j|za*`T%?!LZljzb9) zTu#e%1sGhjjd*x?KA||KaFav3NjT?0RxEjMNY6e7_c?&LOcA9o!4Tqzpa`B^YoMFA zfzhh`KC=@Oc?9onwcyf-?m4<4#y&l}w?-UqC)v2^SJ5^T&Jd5%ccqiV4o9R( zli29!MyS*;bcGFvs{1Prc$Z#e7||jIPf%?k#Ptxh1&{v%=+0 zd~Jso?c`6U_k;F7sX{Ip)7P5X59NCV&YA6CpRK2Bki10Pw=ao7nJr!ve}09j8Ci9@ z6uh;fko|kd%KH9Sk#eWVuXDZ_0>86PN4hd=wAPjRE;3$3Rw^$xINCz4b|^yTW;DKH zV#Xf?@{F^=_GA%bTTd9uk4i7+{+^FaE; z+}C)$yfLYms}`=uz=XHIH|FT>dH}m>g7d?nh^#z_G=3pMmj>dd&+h^5xG9OO(LGg` zlXQq-jCcj+bx-4lB;>I4fkK7Mj;4S-;Xb6x#GolixRl1>Ct7#XqgX&9jLtJ_6Kp)?6ot=t5R^ACF zY%O~h1gMXxw#qhlVuo-yr~n%}{)Og@P{coa3G2H<-*GPvb||?;jZ)dtT>HV%5&i{X zMT+~xOe4pq6lVx+FwRyXq!HW$Cry`pEf*|f*LtEQa{#4Sq$J#S`eD%7x)zp}e4e*@ z!nmNTb2np^+^9@1F|hHEsHx*T5gmr;vvcJJ1H*z4P!!+*X8V_m(BMFru5d47<9&fD z#NbNSasL{t(fTsD z%2;44%T8Q9O!ZKl zpM%V)-(^8E*F~|e^dz@}qAZFvP1JXm{C-xq=2MW9iz2^-uO@fH#??@M7ky5{vM@=n zGw0Si^_$I@K#7$D4~P6Dj$`xcU6~_W{kC_XZSgQLN!gA$@LMH2Nk(AJ_=J9jn+ zsg67rXBoUd|M~g4@+X<(l$E@UA#^I=&@>P)B01E>xM`?s&}w%3b~EA1Y#R~h5n_xk z_Fe>RhJqyjrIU5*LJJkv^Z~gvK2qGNOJn#mtA=D*D3MwM&6zQ$i76eoXl@{nvE+Hj z+cyvvT&iz>DUiU+muYh6fAJ%qAt?OuM(Z76(6yOh?d!>*z}Z)|9Fi!r4!es|%VhJg zMR8+>Ti$mX^{(c1b>v)Eev}8zA?EFObhY3A2*-Qmnl`^*D9~W`M7I6xGN|0En}k+z zF3%@5-X4TR66D+qP}nX2-T|+ji2iopj8OZCl;ZJ^eiId%yAh1$WdK=jXNe z*{fEqS#!?1CpsW2DjZ-Gy3?^E%oZ9GUE5@&37pvJiJjkHQl?_ex5G~Yjd%xKm;Bcw z?ILP4GNy)je((?6ieia~0|kT7y;NR9rZ*gcKn|}=7UcDtDX}^EqLrsjsI8HnYBFN0 zvS%u=#vIk$w#45b$9!~FGVEjXn_$)j|m7UU5|Dd(&Us~WdlHb}_F|KX`Gf2DW_r>u)S zc#pRZ&?Erxwb?SRxL*&NNnZ0b-h_CY7ypHc03V>vF#v+oA;ExW+x1aB612zo&NNB&{rs<*d-2-zAxrJ!Ll1*?#2HrezEOH}` z(XQxvdP{WeL#NK;wB)rs)Wens+d;v>-xxBCU<}jL?14yE^ki+9bly+eIh`q}$$bm$ z%*a}dq#UB55hG+ig6qQG4_ns=ehps?dQC!9dv!5^3qpC_rLGmmk~ob9BbKH`sTfHg z(0=T7y4cL+xutO9Jh7hJ##3;DWK2P&YEInWM?HN7_aNyZ@?xa{a-h`=C!j~aLy!7H zLhp`%>txwL#~p_ioJUdRe<_xLxq|5}6d*xelV^l}H|MxJJ0E*(8S5&|+DnmFAFI#i zusOv6$T48q6;~y;URka_iU)B!sOam_s`Y<%`v`X<%L)@i2e3# zsH#IkdwKa=V^}VWJ&V7cvOau#BzlPCIhD7-b!8SEY(sRfZ5-+4)J67qmN!|}u!^*i zxX<-N?(%GPUq97mGG*`&k(^1(+W%ggaV+TY&fuS^b&h`lL|cHfxae2Wnzphb{->d2 zfbX_^4(C*hpc$folj-pgc++=t57P&AkE8D!?!|Py#&390Z@*{ugK z^9@kJ0tj%w<4K^harX}hfP^x>`3|Ym)X2yPR0EAeSgHf#&Y5WzO9PWDe9z?swStQw zt9sDa%Qu+^M#)w+I#wSEYKI^?sLzT zyfl2jg#Q}zL6NPIJw}|07FBYdJ|n<;=CQ+M8)$~d##S^#@IZ{e+ZMbPRS?Sbh8bzM z-}Z)C*P)@ILHND0ax-W%^xRm~NH8=cGvGDf3B*K@peBc94Fl;5H<9*Rk4$wKnc!F< zn<4(t$(P+DcIeqv4{9BL31?bg{DYI@y6yMx+pe?2Ifklm8`-X3$rj;CqSD;5)&=~=9}vfEP#cw zZZP!*S}aqg(j2pU+WJCtS%?MYOYC5w{tE!9Rlq5L`eTx@sx1^4BZ~Q z?qU0^i1_dGp)@X3OJEfs_t9~N+9#vCCVLuEk0fvTKT6;geUUZ)+F}uxP8( z_bLc&7`_HJ7I}PSw^fz1zbAUE?r?gTJJ7F?l{#e8bS(JB&!^wcwEj*=*%q&s1bTtb zLPIU}Z%^#(7}UGc@Lt4O`2i9T&D}Sl`!Ug=Y z@*)t>!5cDz8}3AkJs7|-^*PPF;+dy>c4(Wx$+YWpw=1g+9cc6vk5Y>(F3q9>Y4n#Y z6fOW)M|ZxgPK&P6cEf|C=q|3u_zNjN$rxtS6PCpr{U}d!07+{bTL1ogdt< zRPl6NgzuqJ(P)-L_8+O8J_SHP!!Qy14+BkA08^kvXaD8zbZXcv%J2FAsY-3R_!NbE z7;Ix;L=!kLLj?fSP4T|tB1|g+PBUsCnnbV_DnQxG#EZ~9pKyi;f$*5RQmySO2yy;2 zCVE-W3EY1?2y$`UJ|lAdSmCVWj_v%FN?HgO$mqKdJNj=}>S9q*(KFY*BRd)>^x;g>#C`N!^|H)HK9ZjJJvQne&D_jxBYpZs+nm9x7-~TUOO0A!#?D={^^t; z`Es59b`KcwjrEk}YP6J0C~!a9GBsiTgdcQmxQkS!lm4Ale(@17^u^1k2ldf| zm{MT-=ub6k3shM$u+9~@`=uE0cgfO;E?FYuf|rLUUDR+Nhbh4g2_@T!UV@++O-xuc z4uplrlmfIA8m?!a&7~4({EKKzMT^VN9?a)~bWxR^WVJyHrY81H#9iR1kkm@$$_Rcv z$h9`c@KFtq?P6wj;(@Kawhd&9MGke0C)V2w$7IqJuqXaPp+RB6>9Bl#Shr|H6BRyR zZnEVFm~)iaEvFUEM8+srXqHUBhuyPo9H*@Yb{`+Ak>tBfWEM(%Z9NZ3?ERg)mAdkM zh}VpMpzv2RK>3uH%b75D+%(!m!PKZq!*Lk~kR$(ZU3B3DfUj!X@!lzIbl01pfcJJpV^YvTE}aa5wo^5RG;Q{&)M`Wq6##$EU|3^Bj zMgB#`9f4QTX#~uhTGTtImwAn>^||k%K* z%OnC{xjdqQ#A}hz8qf-rTgPMe!HFoPP67BYxwlYeM6TugDIqSA!Wq1s=xm8FTxH>p z^!ypSreG}J$Go>!UsH2iAKkPV=pVOAT#a&5r$eIv@8u@UDgZIyBo}pmU=eJ!`k!8_ zWD-P9J#%);?~I`*A**kH+2!=FeSm_iMS^@`iIf@&8ZMVNmp{p< zu$KsF%G#+$IqOp}L2!1vt$pW%u%Q3g!zuLEVZY#qn+E+@&hX`<=KhSF_K^!E-rMr| zZ;jtPm^}ZQSD#A%HC07h1jwBVf3o5!+Hr5Q{H0v=ySd}`IqpQ0BpR1zxaQk)79s`< zKNuU6xS&)MC8`W56iP^z_e|1Eph!t;O>&&cLpOge_)%GavG z|NkFFSsHquFTQi7Nx{lV#N6d&c`LC0ycU&gkvRV1ktAvl-os0Z$%)Qd221U zf%)MIr;ZjgI$47RFf-GM8od|>|04@ak_4c?S#$S&?k!<5dS;Rt4IPX9toII3Rz1Aq z!>N+}{d;=o-N46g6S4lg?pPM4Un`fe4^u=ZX$1=r0`P1d*3Ux;8snW7O#u7C)wX|3 z@&AxC_y%yAf&d-dFd(pfqecg+=jE)Mh5kTC#|=78%n6(zY5U}`NnnN)s6>KqY}MT9Nd(cWVc*PZW^0jfD1S9I6G*js;U^lob>@U5{ zOJpEH*j)dwm9B@M^S9_DA_cG!pwAuDH;4_4kD{`E_eRzEzUu!&UB$)x4=AJe^L=06 zkxux(RJ4#V>^E&LPNv+yr#oLyf($;MmYkSNE#b#sU2#J8;DdH*42)Qmj^#bYCXRQU zgnmEED~*8ZP6)$K0C~_ocq)u%j*LU4}zg48W;=gN)Xo4gge26Y5=Y$(Q3o> z&Ci>viRfIJzJWSZf;jMy=^|qh-!94TQc#%sT#hZ2HP-(< zPYz80uH_KzUwOiW#5k%50{ke7pFZzG51aV!?s+{ftXIBALoNSOnw)JWLxEgYz{jHm z_xAU`OCA2VBt=@e<^;$ZSp~HvM2{#D-QLAJoxZ^KMC*}BJWwbw449U-3Z-#JIKHqi zN#0Ez&167RW5-@M3x*&4U2DVf6C%TjpHtQ4`3x>hdVNBzZFK^FHX%Ge5NS<}<0Tup zgr)y(MBXhJWl+)zGV9PkQexc^KvD_Mz=c8$@K^=7rIO7`SW+aPrzb5;yXb#b-R587 z?RuRCtQF*}Zop^1?B)hCT^DuvvRG^w)ZG02{(2^5Vf#3b60_kqxI+g(JKx#vUB}wY z#hvfIf42H!wozt*AHP_Kyg+<#`Jh>mp}~1gy}Wc~E@=A+Y2$ja-%`Gd^1OQ1>ZX66 z@_;0K4rdqJW~Bb8q>ATL(?jb*6xkMebIxS*Wmz2p)-~@DpT_u)_j{4@ztJ1%r6m6v zZ{d$;q~*_^GV{9qh3>`vr%wCsA}}gu zAZ=`8^+yP{4Orluf< zBjuYRXY@67V(4Wf2c{;5&oG>!nMsrsDLI%6?{r$J9!h(ieGT_^zu?tzy@>f3J+5r^ zU6pn6pQ>M)=B$dX*2k z$?}>mnvbTCP$Eh1YhPpU-M63Ru3wM7$Lsd{%k|Bs`Ru97&X&jR^j4NjMK1U0bXH^z zazYnP8C zHa(6p8d6iuq!n)RZ-2U<2IS;v{`{!2eBczgTS2Knp)K=_`{aQr8k4$YaYu6mL?tQ= z+uuhweb#uMTG51~V9$U^N#@6ZOREaqA zxj@KOm@No(rl^cg^%F&F^WpX(O!Fushbfb4GsXO6u+HpI=hi$I4+Y_g^xUoF=Q!1r z6^D zaXVGuuN0(hT6Ap^YfrK!csXvU*1D{9_tQUyisk)y*w;H;H2qg7mmb{xzGgkN5$7Do z87M_eo#8}Ce8Dv#{`-e^l?g3om2{UUV5O%nRA@Fo?clR6{(X^Fv`gxvWbYPI&}ql4 zxc$W-x1DCH0vjWnyfi|`HhUzcWcmPO4y>!Bmz>;HQR(IFtZb38JcMwa@{m)?K{L&` zrP|`_=fB?t?*n5=KQUw2X)HSkx%*=(hjY&BqIPrcdgq2}@Bd*a^;0EA#wTY-h1P|w zKug9RjYz&y6!8`@NPu*iK}!SwrS&UG4)OHO;MQeshmrNIa74C^2Em@pOuvMyQ8)u|X8A zm8b3KZE}@^%R1#PsBw8$_6Rn`QCTV0?ZA;?2co7MJhCU<_@l6oUelL+_ zbbZu6_^o?+oupMQ&1~3hR>z(a@W8O4!F(896_xAimM$$Af4*Fw7!vxS@E6A@TcWM? z`*6BE0gJ{_3|5*`EjPs$Ocyv<(CK5a+mlFOt(C=OF?|4~q~qkZN7dGh&`N3HEu(-J zw~y%1NQpOe?nU08j3klD$v8WUCroW^_VMaQgrjAT@4OdI`@N1U7ZR%kP8?lCp-#^e z@cXJe>~FYPd|j|VyNlebPk0kpFA|qbtB)%(Wu03kS3~3lT5a@i_U!o2ElDP@tmZoQ zT;S+y$?13du2t`>v|cb~ttq0aj3%y;xsy|aijINfPgs}%_Jb?3oxy|>UPJtHg11V>waB7HSUox!o0vZ> zh8TWW%eYh_ygk|tnu_3%H>i({3{?Qz-C1H)4>empc(TwK&ukCL2{oKM9-omDL55;_$sS04o= zM}r^gTd+UGJhT+nM@&t9UVt;)uLQC&E<()q#9B$K<6CH^n6;|@bZzCsA6BB0oH9p8 z!yv%Ek+YPXQh|ns*~VyX|~wx|1y@`4_ZVn7TB7Kg*G(`PxCPnjC&z@gb8 zjn$$^D?J0e+ia$2ofQ3gWgJ{x>B}S%Ym2I0QKL@z*E}q7xl+09p<5Gi7nLQRDgSC} zU_?>Z1P?bqJM}4KC>iB%fEv`o1GD&t9+z&1o)%H92jJ^nRD`hfjK9ma@gIzm>6g(` zwydMGr6?50CMs9}TQC19C2%8H&&3Jl;x|GrBj<)7@7`l+3Vs_@lb@NL>l>p{+v~+} zQW$Kt+h5jYSlV4EEi3(}y0G%hUf-XpHYO-~FevRL^Qk3u>H#)7{)}ZzULRE<#sn?r2WRsM|OKR1(AxlJK+YR9k zB414ExNI(BRJ6;Up3fj<<2rl!hhQnZ8n_8U_Sv5qBORLy5Ad)s-zn;$>mfhr!eQYH z#8c1Dpvjo{K5L|6a+jz)#YGj>K6)y;zbRk+v}R69&*Ms=Vu0;S_A6t)nqEA`EI76N z!Gvw<7gjSXWyAz)vT&g)eoj)lyN7|WaKOlVlA}?<&dJ^2dzM0-PFDW)rgqlWb~O%LDWX+=P0UO_-fy(N^bD++us-dJI?V{+fPT{e|& z3^x=%4Q{TWe{P-PQmpGzgDNF6`*d^iQndnY`wwQ{soyXKf1VzHLO&}$^BMsE8u?pH zvC@C;oQz2JdV(8 zamkTFsXpq{e45!=qY<%GiJ<>{nl%0Nl;iyH*s%1>E7Cu0!&Lx;$y6d4z22qp%#-Pw z##~|zwR*K+llvlt`{B9c%W8W5lV$Gt)LF^RN8atdx84|S zXk^)~4ip8fPZY|E)0JoJQF#W(^21!yekbUdlKpJH--U9i!c=mJuenLP$+~&H!?fa$ z#UJO#om>Y|?J7SE420zZOBNN?-Bn)u1@_n0+%-qc^a~w45SsZ4>fSNH!@Zc8uD?~i(mEKw$_0IxC zAmfFpUcJJfFRbf%{DZBxTU4y|xWGZDp2%fq2o3z%eH*$k1^LgxT-FAF%auvNVAVx6 z?BoB8r+Un2#$agTGfysAxs~TPr#CS52keuRo)k9x#3g!KhRbvHtGmlEK|o6#no|&1 zz!Nm-z@G1Hwq7SweKx+S!@A)*{Q*C_IpblwlBroP&-wlJri!aPJ&2rLDYz`=mu25W zRXYJqsrsj&Py@2xfFY&IpTbyyw!TMr!xs_A)R?+E+j+Wgu~L@ z+GN}2q`|;6|NTSu@%#gP-z-~8Su>Zx!m9pa>S%bRD?=A%JoYpASjIrum<$yngh?yq zQlHpj)Iz|$U-%@sB!La`<;Je7GQZfbjPdh&J%v7`-Ru+Mabe4AUw~-iS*2Jrw03|H z$sTzOmdM*<|2(|SdmRB@HQ`j;^LUPF_5YB?IX?ULZhJHaJ%>mvZ9P)S4&CD*PSe7 zqQi3^`4Ao!4}*iArG{Xfk7l5wZq<{c;Qq%2+vAm`p=Scr?E*l7)=EA$-5$oyU4GwZ zBixv;TBrFtVZ?7#KVdgOkhf8cmYGLL5Y?;2m!yDjxjljVZ(xxGsL|0iOhfzij-9}p zyL~G*n4sIu@1hVd!t_0KPI42TkbsPUIuk80t}jLd8g-L6{qE7-z61|`byoHz|9VjkAWSMTB%uFW|Y}1F#bMb#F)fq_GE`Ah^<1uw?xvykdc-|T?E0!b0 zM`iw=%{$FErOY=3kZrm_R!K+h&P30(_RCW0Yd~wI-fhg?JnV%B$rwwzXL-kSnNN_G zio|1V6gdp?4WvH1+U;zSp{K6UX{YlTdwz)bpd2MH5Ng^V=`LoCQg$#VIDA1x91UP3$<_mlT}4Q+KCMm*CS1;?wKKUJFdr9GV{feLW`44n4$LVnMBNi;9WaUgCD1%A>%7mOoX+ILrec>(j=L!H z*}7%PQJw_3k^^85$9go>!gadFgF(YD5=;=TXpPyD_7HAXT4m0)6CV~h6L}0=k32Uu z3R2jJgQL=WC7l(e8I%rdp^_c!M&tVA>gtj^Udh!oW0OV>>U8Z{H08K7iVXv3kAAL$e@A$Jbr?ft z1{nCXX8E33vu23}2?xu)326JWYPB$_A9Wzmw9k7vqoPV#y|w42kvoY|@8wz(sO% zHCP{x1+17Weo^9#*cQsScy~UGWPwoY{4v=ZB|?L)utw<@rsdWcy@!B1RC@h5sb&4K zqSN}k9DO76Nv#{X25^*`o`&y!c*yJ_`%7qh)BQ#=b+kMJq^ykGp41H_Q9es{KE0rNz()r1}g6({w;9ek8L9nf%#RC3~} zG+b}G-If)+u;~Qd3fpqr?`MZOfvGmk2V_-AA3oJcn%Wg0pMtvXNt;dkEZ;75)Om*k z;3Joj#KDuB$2n$sTuUh!_4zI@3kr9Z&x51@{No_D3%z|pPeGedPKUmQTweRySj`2l zWjdy|*o)OwKF{@03&1t*YRdieB)?oARdBVyGuGCr4sa1VkeLn7!45IyWCq5%@M3C| z#hgMWJ*cBLN{hn>GI11w5IUtbg4V=;#=@vPwK-_v(WRKmnd95u5IXa(1Ew9A!|=7- zrTpt(6r(-Vp&Mg*e?jyao`hdQ8yudY1IPb&iIMrPW2*c%_mx4TC9 zz!LVdHi6EO?F}joMu3mp95W!&NCKa#2`Q_8L-#U<3}hzZdD;MjgIu?GIsZ_B5dKag zsI7`(A*zZ@CDN72#LnBT_-J}wF+W)aQ zoqBIn+C*|&1s`aS^^Uo|@9PG0FUo4g@f^N!=yUVAe$ z0U4LNPp|<#V^mcosO(tSC@@3V(k-llzOAFBmMa|4FFzJ?r4;G*ae&*{nskc{YxEI| z5C5VYxZJ@>D^#1vk&F`nw4(m0|>fb7Kci|I@SpcFKne?Bx#VD4=dEol?}Yumm1)!k~#JUzW2 z_L?-QL@H|{Rxyqki^^UMBmks(gFdRKS|d`P8+NgoW1Ry?uG z_9xsag6H8Swnb>H33Fi`6jlfFaKl#5dhJqM^XTR3X4LN(SX9Zp0xNnB{jAFSb;ja0;+z_?k0A9s3FM9k~YmBQ2nqvwUM#Npp& zJ0R}+1G$8ZrS-g_&%io1#!h_{&&FsNn>nJ8@K9vjffHXk0xacLrwh9~LwZ(>L}}em znI-h9)9rU9^2|S`)IWQIZ`s{h38G zT}LMm{%U<&vUWSo8oPyXzRP){kE!c%%>uhx-|S|#%SY>GwXFYst2}O$v7jB|A#P&0 z=>3H>g4a`ZFpY_!TJH%Of)1gQ225L2hRcz?Zqn!Y(4xO-sg1^b4>(e0@Rl1C<#>5K z8LJ^m*@#b>BdXvUU^z83(y3mvJTuVK7B7KHp#Vgo*B&jdijC7^Fx;^Gfe zWO4&L-$#`i$@@g`c0&<;pURqe&@K=&?yRVd0;U*>qk%XGMsqhu(qkh z)h$Y2ghcFoV)^6^6B+ynC@qKKh|QbGpJqkSo4&1%Nzczgq;=6i6~?OqFQI;+35hOa z_!e0m(FYPcB?)-dPS-ki*JE?BJ8nVw{WPToBl_D|f9wTUe2?OL6R^L#5N;2K=dNP6JHO_0qx~e zNHTufNsE}uX`M;^d`TN@G~fpeSt&3U-;`4R0I|cARQvHe<&m+ElqbR=O!#l%?&>J3 zfvq&6Ldr5joPcLO8L^!o&Z)?fW`&;}gWp|I^yFiwJp*R30PJwx+?Qr@co~aD-Vb%< zSbg=NzhUOZfOohgBc;BgYL*fxuTmT9s@?$mL}%=ZA0%^4LWu_Ms64e}z@w}ViW(+S z>OV&KT?_mthULIO5Z%NXXA57_+gTzx-Muk5eyG}qFiAG3t*^jcICp4QS_itQEpo+6 zHYNS*XR;Bv(~cp*-3(sh!(2nJaeVjZYxxv;MozbZ@47F;uo#6LADxYQvy^f<^kbB+ z?f?yHLfZKE%`8n8=;W}#8!e&#^49l>uID10nixf45XvE_34)gSE5^^_7<3~#45^C; zJnTmA{<|PZ`F`4lrt1cfhGGY59G=IL(9f_Q072f6T@qYyyx&=8w?Ta@#9tLs;sc@^weayWkT)_<@E=4MKzM&H-dnOhHwMNWn6{ zB0<4v6YA95W=~*JCg%T_{}W%*;y5$pJ#7ZcxEv`8>kmttE0O}nEOPd0#T?V?uVIGz zi4tIQV-Gk}6ryjO7U@X2J~tRQgFv3TULUVk>H)IxfzZ`qs1EJbmKTE|_aS=`HIROE zodIs7npGkR3pozIV^zX=4n~MS3L^b>9Z?7IzZoJ=DybXwB<%JvsVI377y{0ad4ob1 z>y$lv9b+345?PQ{UYo-L(9?r>M~UQm4jCR_+jpB@j~T!D^&4TL+{E=M0t5rJ(D%Q7 zqeg`<@|E3T5jW$92()Y)dbUC^b(8eHmuXJt7|x|W`zG1HgKDgI@LBxE0paRVyH$)e zPG2Mz*OKv8R7Xw1bTfVsF>wt}ycGh~rwd&n@UOVc2*ZS7MAv~xmlmFe3n&Th5!d1W z8MjusAQa{(>c45W{P8JflpOFkWe(1c7Q}v){W_UrqWy~cNYLkoe(SCwKo-4upn9yw zXJJS~K0Dj#p$*E)0JkFW#h~W-cpDf9H0?h7iq$IQD)M3J))+|{cVG*&NB{`bF~l*Q zNySEFSKREe=T2;&RAh79Aid@|_XFfh13GR=WhN6Cv=&DFGlhjTF9^CyRq6;)w<6Su zF+m|n<$lxkaX!_f_ZQp{X_yCe1*|3%avp1vKYfp?XSN2(x)lE1JAqjZ4sGVkgMFl6 zIKWhu(kGxe^txq;HLcY&cAte96_MD@GHhzH zH45qE41+jC%Ii&w(>=XkTlHJn!RYflgY)aOH`rl#z@rn%B23z&1n?mFceglnipbZe z7aM%f3*#Gp%F67XI?Q`;)j64=NKZ0NZ`x?YfC4=_j zp30t#$b#sk9scj`3?(3NNH6$UFwxd_v( z#AWC#5nxm}k>M1w_{mp;&xMQo1%?gS4q4?M+Kd|KhG;jU)O*!vil<32V=&j_Q~Tfu zp(HH84CRgO)P@x3*#2@;;(VRNDF@no`g(*uOge7tSGr@}motuPBneFOS4>&f=MxLy zb9lbE>wG~ckL;189J2Hc{Yo6Ix>`Gh8)ewBN#G(?;KGF*#v+jm<^ojBA6_0v>~x3viZpr)Nkb?9rlpka2BO+}8S zx~}U;mdo1PQQI~ms=Wr&wfmF_t7L@qYVsiio9EZ_y0r)njfEdJ7uqOzh{c}Y&0qyM zkU6&oy`D_pR|^{kh+@TY-yIB-@l}IMV?<>6-EWgrslxVJriJIS@bqXZzUxVf5!S*+ z>Q%V7=Jjo<41FHyRk;EIkvB<;39Bv3!Y~O>FQ*gw-hf`HAyR1#kbl<%{@{OC8VkZz zQXD9fldQOX#_Y2@@dWNHXR5<# zdogMbGV}DMMp~LTgQS2aK)*#&i!h*eMFd(Z_F#|MO6g@I z+-@Qj9mIxGU{$EkVo}eR%fexuE0lKEHs2O!Wi2{a^!=lX)$l;DT3YZ)oM*|fVwWTi zMRY+z`W@<%F3?jxPRP~f_b*%h^5;B|7qW>?mtGqtCpmNy;z$U%tEm>6fP_d`S2CId zzWxCNw_1PEd99)Xj_FXgM7AH@rm!Tm#Dan2JQ~yamCDvy(rO+oCL;NaW_wX#3raut z252lUibplP6Vr32X-?UTc7q&ZGKZ{t+`_Sj;dwtOmLP3X&0I|gq=Eaydm#9+FaezI zc1?J27Nq72f)6z&;P;@GR5jXlm{Gf8CWGgihi5snS|w%VUq+5OBqf)d>gL70h@5B1 zFP1yMWwP|yD+@k={N`1$rRzXSHr3B62>(t9j~++&L`pnpu{WGC^SEs%=f-mV4R!}<#Bee`wcR0SCbe021dR*U3`lQy-UhhDNnBYl0-{rZK! zsL^IP6LCJec7;OeeJD`SKMI*?6DMj`A=N>%?x)ujj<_|C_NIKNQbI~tfA~2Hf9%eQ&OXV)`z|ISm#Qt`IPinX*>+l2`$w? zPyM`B8X{=B_mqYq#5#Rx{gA9BloIp2;RW0WT)mqH*XzMZDNwjF+uQtP82T2Su|eSC zq8D9EpY^H2+v920}H91p;)nwwKo9+mt%ZrmpWN-Wk-bP;ePXTIZ7 zGK(U{y@3Gt?2!vLu$CDjRP3I432B*=B!Y0k{`mx;`3+p{Zdib&)x5MZHRRcL)jN~6 z_!-Su6|;@_$cz6nEP&WzQ16C;Q9Wc5)+AMRhKGBczTxbs`_ny2IC9oM+L#qzw-v5; z1BaS~ypC0ht-fIvYTw|h03>pI7dtxZZ zB8U659!Sz_*xj;r(BY{R6-nHZ$E82i-;`+=%Z+OnzGaRbSc@5yjV z$tptQ0ICXGMs}4v86>xN`?H1F$IN4&d+F$eodqR zP9r28lfqx?KplQBtV)UOA>g@!M5eXoi|r8Rp+7dn-UiQMyA^<<_)jr0(Cb#nRf33= zN`0@$Mldv!D3O6g*{)>Atc7~juAPKP(5lO)gf`72Wk$rt#^L|+BV(`i$?_r|ut6Jw z)w{vIt0RWG*Kqj-nc!M9UTj7}B0ctfd$(&d6fpTENya13xE?b(b3SuFROmmFVt;sH6#Rr0S^x$F-?pQEnD}{)WYMtdV{|#myna~ggp*586#E6|}_RLX>tdKuSD}EF}JZA0HhPO8D{JAq*doNl=9N0cX-X zi!%7KR}sO(a4rKqQ|2%Mip)@^x0DExcN%@p^rx|aaTuim8?hNA)wN&&xRlJ~X}+8{ zppe8Q9U3+y(8!}^1#Ct@1J^%Cx)LQldhbEr-N4gd+7%)wYLo@)O%cjOY>w;*erPfT zxT9Wkj=3E`QA|eGfqJvpj~eXG8XzV;0plj~R+|P!0i(t5_*zbx83B#h>^<}^6M@zn z7ZRsU67TUa5WCMu;URSf_zGsJJeOUmy;~ux{XVU8O-V^v8YNmjmubhl*FyVstK`h% z*U?0=L--)WjkTGj^1Yb!P?W-dcSdqi9SG7D0! z1$)wvf|1#ll))(qHkLA0CW+W>Q@x%|O*Yapj*{^Qs@QVmFLpktjQWntsnWmv8wbq; zx=t6wi-}C9kG;R5Ttb}uLO(PKYWz?{1An7>`z=;xKvfr8)`tIX~@^~Ymdg`S@ z1b9s_MT=#Th*IzeqRj#g75G)iq1O>Goo+x^9QJS3%!j~yrMCHNJkT2iq>!+3Bx1O^ z2%W#4Mxw&;VXj1=L1Y{dcf4Mj8K(tzyf~#6L*u8!Zt7w?)r^ZUQT?%Rwk63`*!m$2 ztXa>!U%0)AHv_Cyg?Fz@Jeeh_7vgcdJ)?|bODw`i9B--$f zV}(ATRegR(4%D5qo2b%VpC2O}NB~1XLoo6R|8>$h=*5<`!*=uvK-GOcO#8VXYNwW# zQZ@SzoWVAgkR*s4xvm_jibd@GjPJaS`xcMW-6dg?DAZ*Hw*^JAuLQnKrs2i49m&Zh z)8{Xa3M7)2E0#t!R(mkxvfd^h`t_DZGCe8qyzh?i7J#{hf=sLU9fO@yec%ys zpH+}{g*?G3aQB>_TTbh;T8d-b(SH7Ezti2;l&w9e!G@zphWD;2D`_^ckq$av`OAhJUxTBP4AA1I8ce7_Y`?>b;*L zO6B!p6RuYA7zOZ&wikAMSa%D_12!g$WS3m0rhVr0wESQiyNq}H`O#nwWu6xNDR5nX zUhC|UDb%zcnIZVEb8@V2;;fz{dWRaDAaogLuvQxy>gm5TAVCIxUe{44O#^p@b%!!R z?f2#%v(##$kZdr<_h)m=GC6C`lFeZqc=*3o&mN4} z_3O`Y0txj5-<0FNBeDs@6F{&Yj>PVVM!s{=51@n_@)Rd)SRt3YEavfUr|&RDs($`- zjLEXW8WG{~iuDV2S9uD^qk>Q{SWGJj=}-w&un>>K%S17rAbcjTdgxmrb~VY1J@&q0 zU}&qUtAy4My-*26zxOu__Bp!Qm_1wNfE*sKib>Cu-1XU|9Uks_%X5tLD5+Muh299L znXDhnSN?^O1xWjs96P{zjz5{Wg-1SPzcswqtF2X+=!W|h3EIAIej)Jg$cRA%4cQ@O z&+s<4;8v}zc22Z3uM~sNcS)z@+O4k}UOuQA>oY;2l_(S$IL)}pRKXZ1P>!-!SjtZu z8qWilmu1Eho9&85M2lgKI!y^bQv-zrniAPo%@&?$ZvCn8(4Td4eUokw0SKxko||F&ubHiQ)v)MW@J)27V6K$1;jRA-=ww)H9AG zWzQrhV>Lmr@|=%w@+$!2TvI=6&TwBGvr#ghU_Ia&arXzdC^l75c@RQ*x?E#Ur22g; z`*QEe1eJ5dZcgB;Rd<*}noFoIjiZ73_IOMC*^UJ!F$XL{c~F&XNUnsm^ismoA<`kSK)TN@2 z?8w%F>AR)-Bf0wSA4M~MBh>(zLdm;&P!P0H1B~mq^k*GXS@hWa75#RydGHrnLj6*8 zQj#mD1rp4u&dCA>8Feq-i_VOP#_?8TBa3^I-5I2%X^4h4T$~#flZVBBw6jf>0iNI3V+Z#_&Ib8Eu6?>y zfT#uOYj1s3j7dW#<@F7CPzgf{;mA7tG6Ic04`}hKj_Y6DFm{VHI$Q4w_~5W4>J0u7 z!iSiUzS*kX74e6WRYuSIDATb|7pTozo?`?_-s3ZTN8Wo2f*DU# z#xx;MpRgK!73+HafWTts^Qx%(nF^7CE>JL$u*yv8YJcmMr)6wX^iwB^s%_XVHw&NQFViHbXq-TvMiZo`HJrWW)PsCwx&)#=FF1Iug4*k6VAWOM=E z>e%g6nOL9u({KIOXh6MB5yFzd@Jpa7JsW{FE1g$>*6-0%(dK}Oo8psmKqf~fOAO-n z>2;zXfMduNu6pC4xp}%ahE7CUjJ|}G4tU_rr4frrSq`jy04@Xk>mbZW*O!NaXQAIO z;5_#V`l%9IW>YbmX-i(%#yqgnW@u#CsQ~%RW93Uf)B$BJFrU3Ro9qWm9?xG}&zuTB z*7c6TX=Vk#i$|2T#*YJbvTlWnCX6jTqq=^QGu+Sw2sQMch|G*nia#e$65 zbRH37Z)iP}gzN%wfNy3pfyAWZ$JMn&n%Gg`#`x!Ur1+jLmDA%F;?t*9w7o>ab?PE`?=63cyC{dMZduKI zh}!7<2SzK>m?AgX+P}C}>eQU1K7K2-XEiOn)yG)ZKgDmgy+g(78kEr>j-%3s?#EF8 zuKV#_G3o_c+oX+*HJhPY>wZfnptk0QdTb4hC$YkY(reI;S6UwhY-zbUzB+R~$dg!g zy#zWmEhxIFiIzkv<-Z&(xzm9=CrOdhaGYf9qQG5^ojug>#qX?39db!wg;%9QS_}+< z<`=(z`+5KSN2~IKA&$Y;fH#V7x~S@k45&~uP0_la@(e{^iz3E5)GXA;wyYCYWU!FB zgD}ffoRWYJ%c4|S%z32&q>HtzH73=Egx)r`dHcf0T~zAqENuFOWPP~wbgGXduhL*X zhtAHRH#IaG<}k!cd#!HS+zqmg`2ydS;#>r@s4#+{UK?qIzt!x91!Vn=?DIQ5lHkCC zNfZCe#Q*e+ml(x!A@bJdQuXrh-`4t;N*+{b?3?mv6c}qN2Q6eQ{e)dPmGvtQNrh?T zSNI;CC#-5j|2|lIBMftlTfl1RkC3^X9^!9PqWn|W*_AHQUWT;g32>t7PLk?*#`5{q zltq4kWb>z3i+9|=JzOZH|A_F-H>^@Sm zIk>Zhv4lOoqz6?adq<>@^vYk|HAG*m!r439-?&0Bzu@W6`NyLOxEp5m)G^fg9X}!z zx{@(mg^QHDv&;2^W#$$5?@KrHDAZ}hy42#Ier)C3&*H3AD?@C=6sMT=tZn|xLTslrPIl}zhqDdOrv91UoRujp71L> z)npn)`D2Gl+iLD@tYOEOPIx~9*dFXL>vK4qe3?ZVrRkc3#9r2eDlM|P^PSR>H+l%m^ocJqhZoeIGd>bcsy+qoj0v3Ldm zgmv3idDsc32QH^E1jHbwNG9-0pqqV*UMF~~l00Nl&3@N;G4@&bB_BTgJ~EL#rAjYu z75Vj{g1ZXW46o7Za`wIbvAMA!{o4~x!tS@*R_@b7#3h|x-G6U4RsWk^(3T$QdSb{< zR3`$(>Q~YV^{f0LtSj7;pF$iPu4P;;w-CxYOA9WL^}m;=q81^4o3$Vgh;0Bb{-2zcO(( zxP&Zeg4kOSd@~<_!{`dy6dVX3}REyI`FNzT)&EHsT)KJSLXNy0fXaz99Pfr&gp)Z;ZZ6{jMat7 z$AAeVIttHa4>}8fE8eycztg4ln58s7`>E?!e)eOxl=$mh&(P^xe2vfF ze!aFyql$&kSBdcZ-=@xiel@XF3}7qy-QEzw+Wg=ypr+S#I^|}Gygl~XY*+p}(23&{ zG`yq-l;eVUTB8+-TRiT0(=z1bDDc_cRXCl%k-F_6b%bP73Z|?+c>_OaToKo-`_7{O~Z|HL-A z=>&yC(G1Apd{pm`<#2bw?)Ncu>wW9Qb<#` z8-DiEDHU8rdaFdZn*o}s{F0qt`@vT`wOu$LT?Nk)l5ksq%fya^sPUoFS zQ&R@?p2Wk-LI8M|9ZT%rY{L}v z>B!`NEXd72ihcKrZaT}X_h|FXZ8XMk@Uia0Ch@}A#&kI7aexOJjTKbxEYowvSPR7p zOQBdReKouaS)~|~rPd|Nbd5rvaL)?>Kg-< zMg}YY(ur%LLY1GYR)5=kM=78xxrSQ7)r*aPhHOLVpde|xz;cPBYG{Vu4yuX8f)d88 zAeLXYD1Lyl^6*Qe=hNB9o2Yz3S{ua?kfM6+<&=(Q;`n99J$+qqo0b>$Las~4-_E-= z-^P|#CtNt_lgdJ^bbPdd*Q&L^U(GBLcs1Unaw)#^yMxXA6=sYu>AbFB)8Jj_KIeX5 z0n;(^BNB#>P9vaeFBsG5l3~Q0I1ekzPAx0h%$&`D&CkJBE|_=75*}b)jH%tgKaUCM zRy3>N4_Z1{gB8Gr|Fh?n%@Sq@X}|%)@ipw}<^$Zsk#wl;fY#GV*FA$}@oY&wM+5%FswCwQ71aO|jIwGA0}z{jO_l?|R4WdD}eUnPPp5)PIbi*Fiuk zj9&jHyZYOYBvKPSHS8*p;DBcRp+GP`X{z>($0|y@_bNQimfuu8g6H*Wj?^;V-LU4^ zx+B=8=3%hV3*A@;-d}dIU0af6P+Abh+EUMEGUSR>u*K%NGci2zt?24&TEOfgQ- zrf9#+L0KE4VDQd}04I@ECQ|YQM;V`LITMPTL^N(U+aVhU`QD~%XXK%2p|1*L6Wy%O z+j9Tzj<`;z63RGKL%EkcWoa>+G>|3emfuwo_x^%+*&h2kghYiR0~rTps<;F{B9Q1V zbOkxu&_x!WJH64d#W8!Am1QO5cc|DcXo#H6#THTwp<}!gj2_USf9u__J3G)Q4iew) zZc+%3fnAN?1E)Lu(D?w5@OLt8O6dzt9MLJ71x+Xaboyg0fe|i#Zus<=G1r0W-V=>J zWy)GtVam9rIN|j9pRhNb7)~AAzTrmfzsSD5*><>KeD^cxpZK+;+edFQ^TWlNj$HV~ zpus07_ni*~=8k#d5kB~OjdIM-z3Zw0tV7xS-2Kik?oS=+^zT9Rzsm0rV0Rw?DhwjBwr+$eU_@r87wW+^-UwnE$E>&?4TT<6-2bB5+PfinbQ%9`1 zW%sg2xwCIhbv@`twIS_Xla@nCh`%RV^qWC2E}L6DF>rWR$L8WCYvS65OawRH(mgMW zu!oAaKI3N*eae(r`FpB)WDOHgFlfQr_)SQb+mne`w=%~w*AxICY=-;s_IrIRm4q9sfAi&z^`!$yqx}e4A^^NhMQsPs5l}kMkW(7_+0R|OD(t8p3*YGIU`#Q z^7uh+B{&o04YI9@c2A7yg#B>aeb*SH{0v*yNP@>cUc8ntZKf?m+S3WB9ASv2nx!vI{dkPDgM#_ z)c44G>4kEoYD5LN=D!a4EvnmuJaKAz^Y#y|j?(~srS?ab|iClbYsc0d9tBAJC91^$u=-&%~ zg6=hr8=`Wp=4_mXNd|E1mT%UVoke^Uz3C?Q%UXAEd z&`6-1=_+x|7S+o18o=tiD8oPTdFns!Z&Me`_$FK;&12A%4 zsu%YES+F^XH)U6G+~)9JRV}QO1Q&N{9AhIDP=w7fDWlnbAD9PlCGKUh9IBi;v5ahD0Rz8SBHhbZlp` zAG^h|u|!7pcyW_1ZeAOSTgP9?rIuTS={)d!CY@?OU<*i?aipH3%w^{Y@el7oQ8M^T z;+@|r0kwNCjJmfi?aJqbv~ugScycHBxg5-5#bk;b7jVT4SP1z!p%+9OwGdlhvCahY zr~UK%$h9wRp7`(9WYwCKF=YanT+QVp5J|+-XGDKGIsdXcbyfPt?*xPSC5y|F3Atq(`;@Mu@6bwX19!@YPx z16l;(>I6YY72l%sc#G|i@ZhCJ_lOmSu`WADw(4KqT*w$9GPr9LLX*Pgdgw7FlvoTk zTuJe^GCH*S+j5u>(kd5aE*%2wlhka&+u;wAY;g)DD#is**J**`sN%*5#l}@o^ zo+i+^-R394Q>UN`q+M%rq{q{Az>>?CK6goMy5j02e#fARm{x{k63?L(Sd|^|`w7bz z)~FJg>EimDA!Hn;3TeR}MKYG>z?12bP=mR%BG4n7wb&RF6KFPt&fW(;6(;=rO^UI< zR`72P*Y|MzJD{=MzM74;s;N&xAnV7E@oEMefsm>5Xn%0&rWoZN1ZeNu`Kc#EmtNb` zvM8a8*sz9iA;vYvlYF~&Sr8Qu_728q&B;KCeYl>Xy3Wt^cbr(*GJ^}ny~#f z`_QfNq0BC%;xJ^IlUkMv%K{za(h&9?C|t%&#{f-tDLcj5Acxrrm=Qm5KB(PP*Hz4+ zU#)5`Do~*fxt9pIk?ZQ+;YnHLJDKVgy`BK-@sQLIO%sR6iYe^8))TvTFsaV*H$b!5J?{H`M7os=C`9H8Q-0Ffa$Mf+rCRdIuaibS!K None: - """ - Interactions with Lunch Money via lunchable 🍱 - """ - ctx.obj = LunchMoneyContext(debug=debug, access_token=access_token) - traceback.install(show_locals=debug) - set_up_logging(log_level=logging.DEBUG if debug is True else logging.INFO) - if ctx.invoked_subcommand is None: - click.echo(ctx.get_help()) - - -@cli.group() -def transactions() -> None: - """ - Interact with Lunch Money transactions - """ - - -@cli.group() -def plugins() -> None: - """ - Interact with Lunchable Plugins - - Install lunchable with the "plugins" extra to get - all the known plugins - - pipx install "lunchable[plugins]" - """ - - -@transactions.command("get") -@click.option( - "--start-date", - default=None, - help="Denotes the beginning of the time period to fetch transactions for. Defaults" - "to beginning of current month. Required if end_date exists. " - "Format: YYYY-MM-DD.", -) -@click.option( - "--end-date", - default=None, - help="Denotes the end of the time period you'd like to get transactions for. " - "Defaults to end of current month. Required if start_date exists." - "Format: YYYY-MM-DD.", -) -@click.option( - "--tag-id", default=None, help="Filter by tag. Only accepts IDs, not names." -) -@click.option("--recurring-id", default=None, help="Filter by recurring expense") -@click.option("--plaid-account-id", default=None, help="Filter by Plaid account") -@click.option( - "--category-id", - default=None, - help="Filter by category. Will also match category groups.", -) -@click.option("--asset-id", default=None, help="Filter by asset") -@click.option( - "--group-id", - default=None, - help="Filter by group_id (if the transaction is part of a specific group)", -) -@click.option( - "--is-group", default=None, help="Filter by group (returns transaction groups)" -) -@click.option( - "--status", - default=None, - help="Filter by status (Can be cleared or uncleared. For recurring " - "transactions, use recurring)", -) -@click.option("--offset", default=None, help="Sets the offset for the records returned") -@click.option( - "--limit", - default=None, - help="Sets the maximum number of records to return. Note: The server will not " - "respond with any indication that there are more records to be returned. " - "Please check the response length to determine if you should make another " - "call with an offset to fetch more transactions.", -) -@click.option( - "--debit-as-negative", - default=None, - help="Pass in true if you’d like expenses to be returned as negative amounts and " - "credits as positive amounts. Defaults to false.", -) -@click.option( - "--pending", - is_flag=True, - default=None, - help="Pass in true if you’d like to include imported transactions with a pending status.", -) -@click.pass_obj -def lunchmoney_transactions( - context: LunchMoneyContext, **kwargs: Dict[str, Any] -) -> None: - """ - Retrieve Lunch Money Transactions - """ - lunch = LunchMoney(access_token=context.access_token) - transactions = lunch.get_transactions(**kwargs) # type: ignore[arg-type] - json_data = to_jsonable_python(transactions) - print_json(data=json_data) - - -@cli.command() -@click.argument("URL") -@click.option("-X", "--request", default="GET", help="Specify request command to use") -@click.option("-d", "--data", default=None, help="HTTP POST data") -@click.pass_obj -def http(context: LunchMoneyContext, url: str, request: str, data: str) -> None: - """ - Interact with the LunchMoney API - - lunchable http /v1/transactions - """ - lunch = LunchMoney(access_token=context.access_token) - if not url.startswith("http"): - url = url.lstrip("/") - url_request = f"https://dev.lunchmoney.app/{url}" - else: - url_request = url - resp = lunch.request( - method=request, - url=url_request, - content=data, - ) - try: - resp.raise_for_status() - except httpx.HTTPError: - logger.error(resp) - print(resp.text) - sys.exit(1) - try: - response = resp.json() - except JSONDecodeError: - response = resp.text - json_data = to_jsonable_python(response) - print_json(data=json_data) - - -discovered_plugins = entry_points(group="lunchable.cli") -with_plugins(discovered_plugins)(plugins) diff --git a/lunchable/_config/__init__.py b/lunchable/_config/__init__.py deleted file mode 100644 index 38dd2d76..00000000 --- a/lunchable/_config/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Lunch Money Config Namespaces and Helpers -""" - -from .api_config import APIConfig -from .file_config import FileConfig - -__all__ = ["APIConfig", "FileConfig"] diff --git a/lunchable/_config/api_config.py b/lunchable/_config/api_config.py deleted file mode 100644 index d1007acf..00000000 --- a/lunchable/_config/api_config.py +++ /dev/null @@ -1,165 +0,0 @@ -""" -API Configuration Helper -""" - -import logging -from os import getenv -from typing import Dict, List, Optional, Union -from urllib import parse - -from lunchable._version import __version__ -from lunchable.exceptions import EnvironmentVariableError, LunchMoneyError - -logger = logging.getLogger(__name__) - - -class APIConfig: - """ - Configuration Helper Class for Connecting to the Lunchmoney API - """ - - LUNCHMONEY_SCHEME: str = "https" - LUNCHMONEY_NETLOC: str = "dev.lunchmoney.app" - LUNCHMONEY_API_PATH: str = "v1" - - LUNCHMONEY_TRANSACTIONS: str = "transactions" - LUNCHMONEY_TRANSACTION_GROUPS: str = "group" - LUNCHMONEY_PLAID_ACCOUNTS: str = "plaid_accounts" - LUNCH_MONEY_RECURRING_EXPENSES: str = "recurring_expenses" - LUNCH_MONEY_RECURRING_ITEMS: str = "recurring_items" - LUNCHMONEY_BUDGET: str = "budgets" - LUNCHMONEY_ASSETS: str = "assets" - LUNCHMONEY_CATEGORIES: str = "categories" - LUNCHMONEY_TAGS: str = "tags" - LUNCHMONEY_CRYPTO: str = "crypto" - LUNCHMONEY_CRYPTO_MANUAL: str = "manual" - LUNCHMONEY_ME: str = "me" - - LUNCHMONEY_CONTENT_TYPE_HEADERS: Dict[str, str] = { - "Content-Type": "application/json" - } - - _access_token_environment_variable = "LUNCHMONEY_ACCESS_TOKEN" - - @staticmethod - def get_access_token(access_token: Optional[str] = None) -> str: - """ - Method for Resolving Access Tokens: Hardcoded -> .env File -> Env Var - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token - - Returns - ------- - str - """ - if access_token is None: - logger.debug( - "Loading Lunch Money Developer API Access token from environment" - ) - access_token = getenv(APIConfig._access_token_environment_variable, None) - if access_token is None: - access_token_error_message = ( - "You must provide a Lunch Money Developer API Access Token directly or set your " - f"{APIConfig._access_token_environment_variable} environment variable." - ) - raise EnvironmentVariableError(access_token_error_message) - return access_token - - @staticmethod - def get_header(access_token: Optional[str] = None) -> Dict[str, str]: - """ - Get the header dict to pass to httpx - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token - - Returns - ------- - Dict[str, str] - """ - access_token = APIConfig.get_access_token(access_token=access_token) - lunchable_header = { - "Authorization": f"Bearer {access_token}", - "User-Agent": f"lunchable/{__version__}", - } - lunchable_header.update(APIConfig.LUNCHMONEY_CONTENT_TYPE_HEADERS) - return lunchable_header - - @staticmethod - def make_url(url_path: Union[List[Union[str, int]], str, int]) -> str: - """ - Make a Lunch Money API URL using path parts - - Parameters - ---------- - url_path: Union[List[Union[str, int]], str, int] - API Components, if a list join these sequentially - - Returns - ------- - str - """ - if isinstance(url_path, str): - url_path = [url_path] - if not isinstance(url_path, List): - raise LunchMoneyError( - "You must provide a string or list of strings to construct a URL" - ) - path_set = [ - str(item).lower() - for item in url_path - if str(item).lower() != APIConfig.LUNCHMONEY_API_PATH - ] - url = APIConfig._generate_url( - scheme=APIConfig.LUNCHMONEY_SCHEME, - netloc=APIConfig.LUNCHMONEY_NETLOC, - path="/".join([APIConfig.LUNCHMONEY_API_PATH, *path_set]), - ) - return url - - @classmethod - def _generate_url( - cls, - scheme: str, - netloc: str, - path: str = "", - params: str = "", - query: str = "", - fragment: str = "", - ) -> str: - """ - Build a URL - - Parameters - ---------- - scheme: str - URL scheme specifier - netloc: str - Network location part - path: str - Hierarchical path - params: str - Parameters for last path element - query: str - Query component - fragment: str - Fragment identifier - Returns - ------- - url: str - Compiled URL - """ - url_components = { - "scheme": scheme, - "netloc": netloc, - "path": path, - "params": params, - "query": query, - "fragment": fragment, - } - return parse.urlunparse(components=tuple(url_components.values())) diff --git a/lunchable/_config/file_config.py b/lunchable/_config/file_config.py deleted file mode 100644 index 1f1e4067..00000000 --- a/lunchable/_config/file_config.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -File Path Helper -""" - -from pathlib import Path - - -class FileConfig: - """ - Configuration Namespace for File Paths - """ - - HOME_DIR = Path.home() - _file_config_module = Path(__file__).resolve() - CONFIG_DIR = _file_config_module.parent - LUNCHMONEY_DIR = CONFIG_DIR.parent - PROJECT_DIR = LUNCHMONEY_DIR.parent - DATA_DIR = LUNCHMONEY_DIR.joinpath("data") diff --git a/lunchable/_config/logging_config.py b/lunchable/_config/logging_config.py deleted file mode 100644 index 853e903c..00000000 --- a/lunchable/_config/logging_config.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -Dynamic Logging Configuration -""" - -import logging -from os import getenv -from typing import Optional, Tuple, Union - -import click -from rich.console import Console -from rich.logging import RichHandler - -LOG_HANDLER = getenv("LOG_HANDLER", "rich").lower() - - -def get_log_handler( - log_level: Optional[int] = None, -) -> Tuple[logging.Handler, Union[int, str]]: - """ - Determine which logging handler should be used - - Parameters - ---------- - log_level: Optional[int] - Which logging level should be used. If none is provided the LOG_LEVEL environment - variable will be used, defaulting to "INFO". - - Returns - ------- - Tuple[logging.Handler, Union[int, str]] - """ - if log_level is None: - log_level = logging.getLevelName(getenv("LOG_LEVEL", "INFO").upper()) - rich_handler = RichHandler( - level=log_level, - rich_tracebacks=True, - omit_repeated_times=False, - show_path=False, - tracebacks_suppress=[click], - console=Console(stderr=True), - ) - httpx_logger = logging.getLogger("httpx") - if log_level != logging.DEBUG: - httpx_logger.setLevel(logging.WARNING) - python_handler = logging.StreamHandler() - python_formatter = logging.Formatter("%(asctime)s [%(levelname)8s]: %(message)s") - python_handler.setFormatter(python_formatter) - python_handler.setLevel(log_level) - _log_dict = { - "rich": rich_handler, - "python": python_handler, - } - if getenv("PYTEST_CURRENT_TEST", None) is not None: - handler = "python" - else: - handler = LOG_HANDLER - log_handler: logging.Handler = _log_dict.get(handler, rich_handler) - return log_handler, log_level - - -def set_up_logging(log_level: Optional[int] = None) -> None: - """ - Set Up a Root Logger - - Parameters - ---------- - log_level: Optional[int] - Which logging level should be used. If none is provided the LOG_LEVEL environment - variable will be used, defaulting to "INFO". - """ - log_handler, level_to_log = get_log_handler(log_level=log_level) - logging.root.handlers = [log_handler] - if isinstance(log_handler, RichHandler): - rich_formatter = logging.Formatter( - datefmt="[%Y-%m-%d %H:%M:%S]", fmt="%(message)s" - ) - logging.root.handlers[0].setFormatter(rich_formatter) - level_to_log = logging.NOTSET - logging.root.setLevel(level_to_log) diff --git a/lunchable/_version.py b/lunchable/_version.py deleted file mode 100644 index 96dc412e..00000000 --- a/lunchable/_version.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -lunchable Version file -""" - -__author__ = "Justin Flannery" -__email__ = "juftin@juftin.com" -__application__ = "lunchable" -__version__ = "1.4.1" diff --git a/lunchable/exceptions.py b/lunchable/exceptions.py deleted file mode 100644 index 6e360b80..00000000 --- a/lunchable/exceptions.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -Lunchmoney Exceptions -""" - -from httpx import HTTPError - - -class LunchMoneyError(Exception): - """ - Base Exception for Lunch Money - """ - - -class EnvironmentVariableError(LunchMoneyError, EnvironmentError): - """ - Lunch Money Missing Environment Variable Error - """ - - -class LunchMoneyHTTPError(LunchMoneyError, HTTPError): - """ - Lunch Money HTTP Error - """ - - -class LunchMoneyImportError(LunchMoneyError, ImportError): - """ - Lunch Money Import Error - """ diff --git a/lunchable/models/__init__.py b/lunchable/models/__init__.py deleted file mode 100644 index 94111ad6..00000000 --- a/lunchable/models/__init__.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -Lunch Money Python SDK and Associated Objects -""" - -from ._base import LunchableModel -from .assets import AssetsObject -from .budgets import BudgetObject -from .categories import CategoriesObject -from .crypto import CryptoObject -from .plaid_accounts import PlaidAccountObject -from .recurring_expenses import RecurringExpensesObject -from .tags import TagsObject -from .transactions import ( - TransactionBaseObject, - TransactionInsertObject, - TransactionObject, - TransactionSplitObject, - TransactionUpdateObject, -) -from .user import UserObject - -__all__ = [ - "AssetsObject", - "BudgetObject", - "CategoriesObject", - "CryptoObject", - "PlaidAccountObject", - "RecurringExpensesObject", - "TagsObject", - "TransactionBaseObject", - "TransactionObject", - "TransactionUpdateObject", - "TransactionInsertObject", - "TransactionSplitObject", - "UserObject", - "LunchableModel", -] diff --git a/lunchable/models/_base.py b/lunchable/models/_base.py deleted file mode 100644 index 07c6fef7..00000000 --- a/lunchable/models/_base.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Base Pydantic Object for Containers -""" - -from pydantic import BaseModel, ConfigDict - - -class LunchableModel(BaseModel): - """ - Hashable Pydantic Model - """ - - model_config = ConfigDict(extra="allow") - - def __hash__(self) -> int: - """ - Hash Method for Pydantic BaseModels - """ - return hash((type(self), *tuple(self.__dict__.values()))) diff --git a/lunchable/models/_core.py b/lunchable/models/_core.py deleted file mode 100644 index 2f1927c6..00000000 --- a/lunchable/models/_core.py +++ /dev/null @@ -1,373 +0,0 @@ -""" -Lunchmoney SDK Core -""" - -from __future__ import annotations - -from functools import cached_property -from typing import ( - Any, - AsyncIterable, - Iterable, - Mapping, - Optional, - Union, -) - -import httpx -import pydantic_core -from httpx import Client - -from lunchable._config import APIConfig -from lunchable.exceptions import LunchMoneyHTTPError - - -class LunchMoneyClient(Client): - """ - API HTTP Client - """ - - def __init__(self, access_token: str | None = None) -> None: - timeout = httpx.Timeout(connect=5, read=30, write=20, pool=5) - super().__init__(timeout=timeout) - api_headers = APIConfig.get_header(access_token=access_token) - self.headers.update(api_headers) - - -class LunchMoneyAsyncClient(httpx.AsyncClient): - """ - API Async HTTP Client - """ - - def __init__(self, access_token: str | None = None) -> None: - timeout = httpx.Timeout(connect=5, read=30, write=20, pool=5) - super().__init__(timeout=timeout) - api_headers = APIConfig.get_header(access_token=access_token) - self.headers.update(api_headers) - - -class LunchMoneyAPIClient: - """ - Core API Client Class - """ - - class Methods: - """ - HTTP Request Method Enumerations: GET, OPTIONS, HEAD, POST, PUT, PATCH, or DELETE - """ - - # This Helper Namespace Organizes and Tracks HTTP Requests by Method - GET = "GET" - OPTIONS = "OPTIONS" - HEAD = "HEAD" - POST = "POST" - PUT = "PUT" - PATCH = "PATCH" - DELETE = "DELETE" - - def __init__(self, access_token: str | None = None) -> None: - """ - Initialize a Lunch Money object with an Access Token. - - Tries to inherit from the Environment if one isn't provided - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token - """ - self.access_token = APIConfig.get_access_token(access_token=access_token) - - def __repr__(self) -> str: - """ - String Representation - - Returns - ------- - str - """ - return "" - - @cached_property - def session(self) -> httpx.Client: - """ - Lunch Money HTTPX Client - - Returns - ------- - httpx.Client - """ - return LunchMoneyClient(access_token=self.access_token) - - @cached_property - def async_session(self) -> httpx.AsyncClient: - """ - Lunch Money HTTPX Async Client - - Returns - ------- - httpx.AsyncClient - """ - return LunchMoneyAsyncClient(access_token=self.access_token) - - def request( - self, - method: str, - url: Union[httpx.URL, str], - *, - content: Optional[ - Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] - ] = None, - data: Optional[Mapping[str, Any]] = None, - json: Optional[Any] = None, - params: Optional[Mapping[str, Any]] = None, - **kwargs: Any, - ) -> httpx.Response: - """ - Make an HTTP request - - This is a simple method :class:`.LunchMoney` exposes to make HTTP requests. It - has the benefit of using an existing `httpx.Client` as well as as out of the box - auth headers that are used to connect to the Lunch Money Developer API. - - Parameters - ---------- - method: str - requests method: GET, OPTIONS, HEAD, POST, PUT, - PATCH, or DELETE - url: Union[httpx.URL, str] - URL for the new Request object. - content: Optional[Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]]] - Content to send in the body of the Request. - data: Optional[Mapping[str, Any]] - Dictionary, list of tuples, bytes, or file-like object to send - in the body of the Request. - json: Optional[Any] - A JSON serializable Python object to send in the body of the Request. - params: Optional[Mapping[str, Any]] - Dictionary, list of tuples or bytes to send in the query - string for the Request. - **kwargs: Any - Additional arguments to send to the request method. - - Returns - ------- - httpx.Response - - Examples - -------- - A recent use of this method was to delete a Tag (which isn't available via the - Developer API yet) - - ```python - import lunchable - - lunch = lunchable.LunchMoney() - - # Get All the Tags - all_tags = lunch.get_tags() - # Get All The Null Tags (a list of 1 or zero) - null_tags = [tag for tag in all_tags if tag.name in [None, ""]] - - # Create a Cookie dictionary from a browser session - cookies = {"cookie_keys": "cookie_values"} - del lunch.session.headers["authorization"] - - for null_tag in null_tags: - # use the httpx.client embedded in the class to make a request with cookies - response = lunch.request( - method=lunch.Methods.DELETE, - url=f"https://api.lunchmoney.app/tags/{null_tag.id}", - cookies=cookies - ) - # raise an error for 4XX responses - response.raise_for_status() - ``` - """ - response = self.session.request( - method=method, - url=url, - content=content, - data=data, - json=json, - params=params, - **kwargs, - ) - return response - - async def arequest( - self, - method: str, - url: Union[httpx.URL, str], - *, - content: Optional[ - Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] - ] = None, - data: Optional[Mapping[str, Any]] = None, - json: Optional[Any] = None, - params: Optional[Mapping[str, Any]] = None, - **kwargs: Any, - ) -> httpx.Response: - """ - Make an async HTTP request - - This is a simple method :class:`.LunchMoney` exposes to make HTTP requests. It - has the benefit of using an existing `httpx.Client` as well as as out of the box - auth headers that are used to connect to the Lunch Money Developer API. - - Parameters - ---------- - method: str - requests method: GET, OPTIONS, HEAD, POST, PUT, - PATCH, or DELETE - url: Union[httpx.URL, str] - URL for the new Request object. - content: Optional[Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]]] - Content to send in the body of the Request. - data: Optional[Mapping[str, Any]] - Dictionary, list of tuples, bytes, or file-like object to send - in the body of the Request. - json: Optional[Any] - A JSON serializable Python object to send in the body of the Request. - params: Optional[Mapping[str, Any]] - Dictionary, list of tuples or bytes to send in the query - string for the Request. - **kwargs: Any - Additional arguments to send to the request method. - - Returns - ------- - httpx.Response - """ - response = self.async_session.request( - method=method, - url=url, - content=content, - data=data, - json=json, - params=params, - **kwargs, - ) - return await response - - @classmethod - def process_response(cls, response: httpx.Response) -> Any: - """ - Process a Lunch Money response and raise any errors - - This includes 200 responses that are actually errors - - Parameters - ---------- - response: httpx.Response - An HTTPX Response Object - """ - try: - response.raise_for_status() - except httpx.HTTPError as he: - raise LunchMoneyHTTPError(response.text) from he - if response.content: - returned_data = response.json() - else: - returned_data = None - if isinstance(returned_data, dict) and any( - ["error" in returned_data.keys(), "errors" in returned_data.keys()] - ): - try: - errors = returned_data["error"] - except KeyError: - errors = returned_data["errors"] - raise LunchMoneyHTTPError(errors) - return returned_data - - def make_request( - self, - method: str, - url_path: Union[list[Union[str, int]], str, int], - params: Optional[Mapping[str, Any]] = None, - payload: Optional[Any] = None, - **kwargs: Any, - ) -> Any: - """ - Make an HTTP request and `process` its response - - This method is a wrapper around :meth:`.LunchMoney.request` that - also processes the response and checks for any errors. - - Parameters - ---------- - method: str - requests method: GET, OPTIONS, HEAD, POST, PUT, - PATCH, or DELETE - url_path: Union[List[Union[str, int]], str, int] - URL components to make into a URL - payload: Optional[Mapping[str, Any]] - Data to send in the body of the Request. - params: Optional[Mapping[str, Any]] - Dictionary, list of tuples or bytes to send in the query - string for the Request. - **kwargs: Any - Additional arguments to send to the request method. - - Returns - ------- - Any - """ - url = APIConfig.make_url(url_path=url_path) - json_safe_payload = pydantic_core.to_json(payload) if payload else None - json_safe_params = pydantic_core.to_jsonable_python(params) - response = self.request( - method=method, - url=url, - params=json_safe_params, - content=json_safe_payload, - **kwargs, - ) - data = self.process_response(response=response) - return data - - async def amake_request( - self, - method: str, - url_path: Union[list[Union[str, int]], str, int], - params: Optional[Mapping[str, Any]] = None, - payload: Optional[Any] = None, - **kwargs: Any, - ) -> Any: - """ - Make an async HTTP request and `process` its response - - This method is a wrapper around :meth:`.LunchMoney.arequest` that - also processes the response and checks for any errors. - - Parameters - ---------- - method: str - requests method: GET, OPTIONS, HEAD, POST, PUT, - PATCH, or DELETE - url_path: Union[List[Union[str, int]], str, int] - URL components to make into a URL - payload: Optional[Mapping[str, Any]] - Data to send in the body of the Request. - params: Optional[Mapping[str, Any]] - Dictionary, list of tuples or bytes to send in the query - string for the Request. - **kwargs: Any - Additional arguments to send to the request method. - - Returns - ------- - Any - """ - url = APIConfig.make_url(url_path=url_path) - json_safe_payload = pydantic_core.to_jsonable_python(payload) - json_safe_params = pydantic_core.to_jsonable_python(params) - response = await self.arequest( - method=method, - url=url, - params=json_safe_params, - data=json_safe_payload, - **kwargs, - ) - data = self.process_response(response=response) - return data diff --git a/lunchable/models/_descriptions.py b/lunchable/models/_descriptions.py deleted file mode 100644 index 836da2e7..00000000 --- a/lunchable/models/_descriptions.py +++ /dev/null @@ -1,719 +0,0 @@ -""" -Descriptions for LunchMoney Data Models - -This file contains descriptions for the data models used in the LunchMoney API. -Descriptions are seperated into a separate module to keep the code clean and -readable. -""" - - -class _AssetsDescriptions: - """ - Descriptions for Assets - """ - - type_name = """ - Primary type of the asset. Must be one of: [employee compensation, cash, vehicle, loan, - cryptocurrency, investment, other, credit, real estate] - """ - subtype_name = """ - Optional asset subtype. Examples include: [retirement, checking, savings, prepaid credit card] - """ - balance = """ - Current balance of the asset in numeric format to 4 decimal places" - """ - balance_as_of = """ - Date/time the balance was last updated in ISO 8601 extended format - """ - closed_on = """ - The date this asset was closed (optional) - """ - currency = """ - Three-letter lowercase currency code of the balance in ISO 4217 format - """ - created_at = """ - Date/time the asset was created in ISO 8601 extended format - """ - exclude_transactions = """ - If true, this asset will not show up as an option for assignment when - creating transactions manually - """ - - -class _BudgetDescriptions: - """ - Descriptions for Budget - """ - - category_group_name = "Name of the category group, if applicable" - is_income = """ - If true, this category is an income category (category properties - are set in the app via the Categories page) - """ - exclude_from_budget = """ - If true, this category is excluded from budget (category - properties are set in the app via the Categories page) - """ - exclude_from_totals = """ - If true, this category is excluded from totals (category - properties are set in the app via the Categories page) - """ - data = """ - For each month with budget or category spending data, there is a data object with the key - set to the month in format YYYY-MM-DD. For properties, see Data object below. - """ - config = """ - Object representing the category's budget suggestion configuration - """ - - -class _CategoriesDescriptions: - """ - Descriptions for Categories - """ - - name = """ - The name of the category. Must be between 1 and 40 characters. - """ - description = """ - The description of the category. Must not exceed 140 characters. - """ - is_income = """ - If true, the transactions in this category will be treated as income. - """ - exclude_from_budget = """ - If true, the transactions in this category will be excluded from the budget. - """ - exclude_from_totals = """ - If true, the transactions in this category will be excluded from totals. - """ - updated_at = """ - The date and time of when the category was last updated (in the ISO - 8601 extended format). - """ - created_at = """ - The date and time of when the category was created (in the ISO 8601 - extended format). - """ - is_group = """ - If true, the category is a group that can be a parent to other - categories. - """ - group_id = """ - The ID of a category group (or null if the category doesn't belong to - a category group). - """ - children = """ - For category groups, this will populate with the categories nested - within and include id, name, description and created_at fields. - """ - archived = """ - If true, the category is archived and not displayed in relevant - areas of the Lunch Money app. - """ - archived_on = """ - The date and time of when the category was last archived - (in the ISO 8601 extended format). - """ - order = """ - Numerical ordering of categories - """ - - -class _CryptoDescriptions: - """ - Descriptions for Crypto - """ - - id = """ - Unique identifier for a manual crypto account (no ID for synced accounts) - """ - zabo_account_id = """ - Unique identifier for a synced crypto account (no ID for manual accounts, - multiple currencies may have the same zabo_account_id) - """ - source = """ - `synced` (this account is synced via a wallet, exchange, etc.) or `manual` (this account - balance is managed manually) - """ - display_name = "Display name of the crypto asset (as set by user)" - balance_as_of = """ - Date/time the balance was last updated in ISO 8601 extended format - """ - status = """ - The current status of the crypto account. Either active or in error. - """ - created_at = """ - Date/time the asset was created in ISO 8601 extended format - """ - - -class _PlaidAccountDescriptions: - """ - Descriptions for Plaid Accounts - """ - - date_linked = """ - Date account was first linked in ISO 8601 extended format - """ - name = """ - Name of the account. Can be overridden by the user. Field is originally set by Plaid - """ - type = """ - Primary type of account. Typically one of: [credit, depository, brokerage, cash, - loan, investment]. This field is set by Plaid and cannot be altered. - """ - subtype = """ - Optional subtype name of account. This field is set by Plaid and cannot be altered - """ - mask = """ - Mask (last 3 to 4 digits of account) of account. This field is set by - Plaid and cannot be altered - """ - institution_name = """ - Name of institution associated with account. This field is set by - Plaid and cannot be altered - """ - status = """ - Denotes the current status of the account within Lunch Money. Must be one of: - active (Account is active and in good state), - inactive (Account marked inactive from user. No transactions fetched or - balance update for this account), - relink (Account needs to be relinked with Plaid), - syncing (Account is awaiting first import of transactions), - error (Account is in error with Plaid), - not found (Account is in error with Plaid), - not supported (Account is in error with Plaid) - """ - last_import = """ - Date of last imported transaction in ISO 8601 extended format (not necessarily - date of last attempted import) - """ - balance = """ - Current balance of the account in numeric format to 4 decimal places. This field is - set by Plaid and cannot be altered - """ - currency = """ - Currency of account balance in ISO 4217 format. This field is set by Plaid - and cannot be altered - """ - balance_last_update = """ - Date balance was last updated in ISO 8601 extended format. This field is set - by Plaid and cannot be altered - """ - limit = """ - Optional credit limit of the account. This field is set by Plaid and cannot be altered - """ - - -class _RecurringExpensesDescriptions: - """ - Descriptions for Recurring Expenses - """ - - id = """ - Unique identifier for recurring expense - """ - start_date = """ - Denotes when recurring expense starts occurring in ISO 8601 format. - If null, then this recurring expense will show up for all time - before end_date - """ - end_date = """ - Denotes when recurring expense stops occurring in ISO 8601 format. - If null, then this recurring expense has no set end date and will - show up for all months after start_date - """ - cadence = """ - One of: [monthly, twice a month, once a week, every 3 months, every 4 months, - twice a year, yearly] - """ - amount = """ - Amount of the recurring expense in numeric format to 4 decimal places - """ - currency = """ - Three-letter lowercase currency code for the recurring expense in ISO 4217 format - """ - description = """ - If any, represents the user-entered description of the recurring expense - """ - billing_date = """ - Expected billing date for this recurring expense for this month in ISO 8601 format - """ - type = """ - This can be one of two values: cleared (The recurring expense has been reviewed - by the user), suggested (The recurring expense is suggested by the system; - the user has yet to review/clear it) - """ - original_name = """ - If any, represents the original name of the recurring expense as - denoted by the transaction that triggered its creation - """ - source = """ - This can be one of three values: manual (User created this recurring expense - manually from the Recurring Expenses page), transaction (User created this by - converting a transaction from the Transactions page), system (Recurring expense - was created by the system on transaction import). Some older recurring expenses - may not have a source. - """ - plaid_account_id = """ - If any, denotes the plaid account associated with the creation of this " - recurring expense (see Plaid Accounts) - """ - asset_id = """ - If any, denotes the manually-managed account (i.e. asset) associated with the - creation of this recurring expense (see Assets) - """ - transaction_id = """ - If any, denotes the unique identifier for the associated transaction matching - this recurring expense for the current time period - """ - category_id = """ - If any, denotes the unique identifier for the associated category to this recurring expense - """ - - -class _SummarizedTransactionDescriptions: - """ - Descriptions for Summarized Transaction - """ - - id = """ - Unique identifier for the transaction that matched this recurring item - """ - date = """ - Date of transaction in ISO 8601 format - """ - amount = """ - Amount of the transaction in numeric format to 4 decimal places - """ - currency = """ - Three-letter lowercase currency code of the transaction in ISO 4217 format - """ - payee = """ - Payee or payer of the recurring item - """ - category_id = """ - Unique identifier of associated category - """ - recurring_id = """ - Unique identifier of associated recurring item - """ - to_base = """ - The amount converted to the user's primary currency. If the multicurrency - feature is not being used, to_base and amount will be the same. - """ - - -class _RecurringItemsDescriptions: - """ - Descriptions for Recurring Items - """ - - id = """ - Unique identifier for recurring item - """ - start_date = """ - Denotes when recurring item starts occurring in ISO 8601 format. - If null, then this recurring item will show up for all time before end_date - """ - end_date = """ - Denotes when recurring item stops occurring in ISO 8601 format. - If null, then this recurring item has no set end date and will - show up for all months after start_date - """ - payee = """ - Payee or payer of the recurring item - """ - currency = """ - Three-letter lowercase currency code for the recurring item in ISO 4217 format - """ - created_by = """ - The id of the user who created this recurring item. - """ - created_at = """ - The date and time of when the recurring item was created (in the ISO 8601 - extended format). - """ - updated_at = """ - The date and time of when the recurring item was updated (in the ISO 8601 extended format). - """ - billing_date = """ - Initial date that a transaction associated with this recurring item occured. - This date is used in conjunction with values of quantity and granularity to - determine the expected dates of recurring transactions in the period. - """ - original_name = """ - If any, represents the original name of the recurring item as denoted by - the transaction that triggered its creation - """ - description = """ - If any, represents the user-entered description of the recurring item - """ - plaid_account_id = """ - If any, denotes the plaid account associated with the creation of this - recurring item (see Plaid Accounts) - """ - asset_id = """ - If any, denotes the manually-managed account (i.e. asset) associated - with the creation of this recurring item (see Assets) - """ - source = """ - This can be one of four values: - - manual: User created this recurring item manually from the Recurring Items page - - transaction: User created this by converting a transaction from the Transactions page - - system: Recurring item was created by the system on transaction import - - null: Some older recurring items may not have a source. - """ - notes = """ - If any, the user-entered notes for the recurring item - """ - amount = """ - Amount of the recurring item in numeric format to 4 decimal places. - For recurring items with flexible amounts, this is the average of the - specified min and max amounts. - """ - category_id = """ - If any, denotes the unique identifier for the associated category to this recurring item - """ - category_group_id = """ - If any, denotes the unique identifier of associated category group - """ - is_income = """ - Based on the associated category's property, denotes if the recurring transaction - is treated as income - """ - exclude_from_totals = """ - Based on the associated category's property, denotes if the recurring transaction is excluded from totals - """ - granularity = """ - The unit of time used to define the cadence of the recurring item. - One of `weeks`, `months`, `years` - """ - quantity = """ - The number of granular units between each occurrence - """ - occurrences = """ - An object which contains dates as keys and lists as values. The dates will - include all the dates in the month that a recurring item is expected, as well - as the last date in the previous period and the first date in the next period. - The value for each key is a list of Summarized Transaction Objects that matched - the recurring item for that date (if any) - """ - transactions_within_range = """ - A list of all the Summarized Transaction Objects for transactions that that - have occurred in the query month for the recurring item (if any) - """ - missing_dates_within_range = """ - A list of date strings when a recurring transaction is expected but has not (yet) occurred. - """ - date = """ - Denotes the value of the start_date query parameter, or if none was provided, the date when - the request was made. This indicates the month used by the system when populating the response. - """ - to_base = """ - The amount converted to the user's primary currency. If the multicurrency feature is not being - used, to_base and amount will be the same. - """ - - -class _TransactionInsertDescriptions: - """ - Descriptions for TransactionInsertObject - """ - - date = """ - Must be in ISO 8601 format (YYYY-MM-DD). - """ - amount = """ - Numeric value of amount. i.e. $4.25 should be denoted as 4.25. - """ - category_id = """ - Unique identifier for associated category_id. Category must be associated with - the same account and must not be a category group. - """ - currency = """ - Three-letter lowercase currency code in ISO 4217 format. The code sent must exist - in our database. Defaults to user account's primary currency. - """ - asset_id = """ - Unique identifier for associated asset (manually-managed account). Asset must be - associated with the same account. - """ - recurring_id = """ - Unique identifier for associated recurring expense. Recurring expense must be associated - with the same account. - """ - status = """ - Must be either cleared or uncleared. If recurring_id is provided, the status will - automatically be set to recurring or recurring_suggested depending on the type of - recurring_id. Defaults to uncleared. - """ - external_id = """ - User-defined external ID for transaction. Max 75 characters. External IDs must be - unique within the same asset_id. - """ - tags = """ - Passing in a number will attempt to match by ID. If no matching tag ID is found, an error - will be thrown. Passing in a string will attempt to match by string. If no matching tag - name is found, a new tag will be created. - """ - - -class _TransactionUpdateDescriptions: - """ - Descriptions for TransactionUpdateObject - """ - - date = """ - Must be in ISO 8601 format (YYYY-MM-DD). - """ - category_id = """ - Unique identifier for associated category_id. Category must be associated - with the same account and must not be a category group. - """ - amount = """ - You may only update this if this transaction was not created from an automatic - import, i.e. if this transaction is not associated with a plaid_account_id - """ - currency = """ - You may only update this if this transaction was not created from an automatic - import, i.e. if this transaction is not associated with a plaid_account_id. - Defaults to user account's primary currency. - """ - asset_id = """ - Unique identifier for associated asset (manually-managed account). Asset must be - associated with the same account. You may only update this if this transaction was - not created from an automatic import, i.e. if this transaction is not associated - with a plaid_account_id - """ - recurring_id = """ - Unique identifier for associated recurring expense. Recurring expense must - be associated with the same account. - """ - status = """ - Must be either cleared or uncleared. Defaults to uncleared If recurring_id is - provided, the status will automatically be set to recurring or recurring_suggested - depending on the type of recurring_id. Defaults to uncleared. - """ - external_id = """ - User-defined external ID for transaction. Max 75 characters. External IDs must be - unique within the same asset_id. You may only update this if this transaction was - not created from an automatic import, i.e. if this transaction is not associated - with a plaid_account_id - """ - tags = """ - Passing in a number will attempt to match by ID. If no matching tag ID is found, - an error will be thrown. Passing in a string will attempt to match by string. - If no matching tag name is found, a new tag will be created. - """ - - -class _TransactionSplitDescriptions: - """ - Descriptions for TransactionSplitObject - """ - - date = "Must be in ISO 8601 format (YYYY-MM-DD)." - category_id = """ - Unique identifier for associated category_id. Category must be associated - with the same account. - """ - notes = "Transaction Split Notes." - amount = """ - Individual amount of split. Currency will inherit from parent transaction. All - amounts must sum up to parent transaction amount. - """ - - -class _TransactionDescriptions: - """ - Descriptions for TransactionObject - """ - - id = """ - Unique identifier for transaction - """ - date = """ - Date of transaction in ISO 8601 format - """ - payee = """ - Name of payee. If recurring_id is not null, this field will show the payee - of associated recurring expense instead of the original transaction payee - """ - amount = """ - Amount of the transaction in numeric format to 4 decimal places - """ - currency = """ - Three-letter lowercase currency code of the transaction in ISO 4217 format - """ - to_base = """ - The amount converted to the user's primary currency. If the multicurrency - feature is not being used, to_base and amount will be the same. - """ - category_id = """ - Unique identifier of associated category - """ - category_name = """ - Name of category associated with transaction - """ - category_group_id = """ - Unique identifier of associated category group, if any - """ - category_group_name = """ - Name of category group associated with transaction, if any - """ - is_income = """ - Based on the associated category's property, denotes if transaction is - treated as income - """ - exclude_from_budget = """ - Based on the associated category's property, denotes if transaction is - excluded from budget - """ - exclude_from_totals = """ - Based on the associated category's property, denotes if transaction is - excluded from totals - """ - created_at = """ - The date and time of when the transaction was created (in the ISO 8601 - extended format). - """ - updated_at = """ - The date and time of when the transaction was last updated (in the ISO 8601 - extended format). - """ - status = """ - One of the following:
    -
  • cleared: User has reviewed the transaction
  • -
  • uncleared: User has not yet reviewed the transaction
  • -
  • recurring: Transaction is linked to a recurring expense
  • -
  • recurring_suggested: Transaction is listed as a suggested transaction - for an existing recurring expense.
  • -
  • pending: Imported transaction is marked as pending. This should be a - temporary state.
  • -
- User intervention is required to change this to recurring. - """ - is_pending = """ - Denotes if transaction is pending (not posted) - """ - notes = """ - User-entered transaction notes If recurring_id is not null, this field will - be description of associated recurring expense - """ - original_name = """ - The transactions original name before any payee name updates. For synced - transactions, this is the raw original payee name from your bank. - """ - recurring_id = """ - Unique identifier of associated recurring item - """ - recurring_payee = """ - Payee name of associated recurring item - """ - recurring_description = """ - Description of associated recurring item - """ - recurring_cadence = """ - Cadence of associated recurring item (one of `once a week`, `every 2 weeks`, - `twice a month`, `monthly`, `every 2 months`, `every 3 months`, `every 4 months`, - `twice a year`, `yearly`) - """ - recurring_type = """ - Type of associated recurring (one of `cleared`, `suggested`, `dismissed`) - """ - recurring_amount = """ - Amount of associated recurring item - """ - recurring_currency = """ - Currency of associated recurring item - """ - parent_id = """ - Exists if this is a split transaction. Denotes the transaction ID of the - original transaction. Note that the parent transaction is not returned in - this call. - """ - has_children = """ - True if this transaction is a parent transaction and is split into 2 or - more other transactions - """ - group_id = """ - Exists if this transaction is part of a group. Denotes the parent’s - transaction ID - """ - is_group = """ - True if this transaction represents a group of transactions. If so, amount - and currency represent the totalled amount of transactions bearing this - transaction’s id as their group_id. Amount is calculated based on the - user’s primary currency. - """ - asset_id = """ - Unique identifier of associated manually-managed account (see Assets) - Note: plaid_account_id and asset_id cannot both exist for a transaction - """ - asset_institution_name = """ - Institution name of associated manually-managed account - """ - asset_name = """ - Name of associated manually-managed account - """ - asset_display_name = """ - Display name of associated manually-managed account - """ - asset_status = """ - Status of associated manually-managed account (one of `active`, `closed`) - """ - plaid_account_id = """ - Unique identifier of associated Plaid account (see Plaid Accounts) Note: - plaid_account_id and asset_id cannot both exist for a transaction - """ - plaid_account_name = """ - Name of associated Plaid account - """ - plaid_account_mask = """ - Mask of associated Plaid account - """ - institution_name = """ - Institution name of associated Plaid account - """ - plaid_account_display_name = """ - Display name of associated Plaid account - """ - plaid_metadata = """ - Metadata associated with imported transaction from Plaid - """ - source = """ - Source of the transaction (one of `api`, `csv`, `manual`,`merge`,`plaid`, - `recurring`,`rule`,`user`) - """ - display_name = """ - Display name for payee for transaction based on whether or not it is - linked to a recurring item. If linked, returns `recurring_payee` field. - Otherwise, returns the `payee` field. - """ - display_notes = """ - Display notes for transaction based on whether or not it is linked to a - recurring item. If linked, returns `recurring_notes` field. Otherwise, - returns the `notes` field. - """ - account_display_name = """ - Display name for associated account (manual or Plaid). If this is a synced - account, returns `plaid_account_display_name` or `asset_display_name`. - """ - tags = """ - Array of Tag objects - """ - external_id = """ - User-defined external ID for any manually-entered or imported transaction. - External ID cannot be accessed or changed for Plaid-imported transactions. - External ID must be unique by asset_id. Max 75 characters. - """ - children = """ - Array of Transaction objects. Only exists if this transaction is a parent - transaction and is split into 2 or more other transactions. Child transactions - do not contain all of the same fields as parent transactions. - """ - formatted_date = """ - Date of transaction in user's preferred format - """ diff --git a/lunchable/models/_lunchmoney.py b/lunchable/models/_lunchmoney.py deleted file mode 100644 index 5e24deb5..00000000 --- a/lunchable/models/_lunchmoney.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -Lunch Money Python Client - -This Module Leverages Class Inheritance to distribute API Methods Across a series of -clients. Ultimately, everything inherits from the -lunchable.models.core.LunchMoneyAPIClient class which facilitates interacting with -the API. - -For example: to see source code on interactions with the "transactions" API endpoint you -will refer to the TransactionsClient object. -""" - -from typing import Optional - -from .assets import AssetsClient -from .budgets import BudgetsClient -from .categories import CategoriesClient -from .crypto import CryptoClient -from .plaid_accounts import PlaidAccountsClient -from .recurring_expenses import RecurringExpensesClient -from .recurring_items import RecurringItemsClient -from .tags import TagsClient -from .transactions import TransactionsClient -from .user import UserClient - - -class LunchMoney( - AssetsClient, - BudgetsClient, - CategoriesClient, - CryptoClient, - PlaidAccountsClient, - RecurringExpensesClient, - TagsClient, - TransactionsClient, - UserClient, - RecurringItemsClient, -): - """ - Lunch Money Python Client. - - This class facilitates with connections to - the [Lunch Money Developer API](https://lunchmoney.dev/). Authenticate - with an Access Token. If an access token isn't provided one will attempt to - be inherited from a `LUNCHMONEY_ACCESS_TOKEN` environment variable. - - Examples - -------- - ```python - from typing import List - - from lunchable import LunchMoney - from lunchable.models import TransactionObject - - lunch = LunchMoney(access_token="xxxxxxx") - transactions: List[TransactionObject] = lunch.get_transactions() - ``` - """ - - def __init__(self, access_token: Optional[str] = None): - """ - Initialize a Lunch Money object with an Access Token. - - Tries to inherit from the Environment if one isn't provided - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token - """ - super(LunchMoney, self).__init__(access_token=access_token) diff --git a/lunchable/models/assets.py b/lunchable/models/assets.py deleted file mode 100644 index 2c6830eb..00000000 --- a/lunchable/models/assets.py +++ /dev/null @@ -1,251 +0,0 @@ -""" -Lunch Money - Assets - -https://lunchmoney.dev/#assets -""" - -import datetime -import logging -from typing import List, Optional, Union - -from pydantic import Field, field_validator - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _AssetsDescriptions - -logger = logging.getLogger(__name__) - - -class AssetsObject(LunchableModel): - """ - Manually Managed Asset Objects - - Assets in Lunch Money are similar to `plaid-accounts` except that they are manually managed. - - https://lunchmoney.dev/#assets-object - """ - - id: int = Field(description="Unique identifier for asset") - type_name: str = Field(description=_AssetsDescriptions.type_name) - subtype_name: Optional[str] = Field( - None, description=_AssetsDescriptions.subtype_name - ) - name: str = Field(description="Name of the asset") - display_name: Optional[str] = Field( - None, description="Display name of the asset (as set by user)" - ) - balance: float = Field(description=_AssetsDescriptions.balance) - balance_as_of: Optional[datetime.datetime] = Field( - None, description=_AssetsDescriptions.balance_as_of - ) - closed_on: Optional[datetime.date] = Field( - None, description=_AssetsDescriptions.closed_on - ) - currency: str = Field(description=_AssetsDescriptions.currency) - institution_name: Optional[str] = Field( - None, description="Name of institution holding the asset" - ) - exclude_transactions: bool = Field( - default=False, description=_AssetsDescriptions.exclude_transactions - ) - created_at: datetime.datetime = Field(description=_AssetsDescriptions.created_at) - - -class _AssetsParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#update-asset - """ - - type_name: Optional[str] = None - subtype_name: Optional[str] = None - name: Optional[str] = None - balance: Optional[float] = None - balance_as_of: Optional[datetime.datetime] = None - currency: Optional[str] = None - institution_name: Optional[str] = None - - @field_validator("balance", mode="before") - @classmethod - def result_check(cls, x: Union[float, int]) -> float: - """ - Check a result - """ - return round(x, 2) - - -class _AssetsParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#create-asset - """ - - type_name: str - subtype_name: Optional[str] = None - name: str - display_name: Optional[str] = None - balance: float - balance_as_of: Optional[datetime.datetime] = None - currency: Optional[str] = None - institution_name: Optional[str] = None - closed_on: Optional[datetime.date] = None - exclude_transactions: Optional[bool] = None - - @field_validator("balance", mode="before") - @classmethod - def result_check(cls, x: Union[float, int]) -> float: - """ - Check a result - """ - return round(x, 2) - - -class AssetsClient(LunchMoneyAPIClient): - """ - Lunch Money Assets Interactions - """ - - def get_assets(self) -> List[AssetsObject]: - """ - Get Manually Managed Assets - - Get a list of all manually-managed assets associated with the user's account. - - (https://lunchmoney.dev/#assets-object) - - Returns - ------- - List[AssetsObject] - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=[APIConfig.LUNCHMONEY_ASSETS] - ) - assets = response_data.get(APIConfig.LUNCHMONEY_ASSETS) - asset_objects = [AssetsObject.model_validate(item) for item in assets] - return asset_objects - - def update_asset( - self, - asset_id: int, - type_name: Optional[str] = None, - subtype_name: Optional[str] = None, - name: Optional[str] = None, - balance: Optional[float] = None, - balance_as_of: Optional[datetime.datetime] = None, - currency: Optional[str] = None, - institution_name: Optional[str] = None, - ) -> AssetsObject: - """ - Update a Single Asset - - Parameters - ---------- - asset_id: int - Asset Identifier - type_name: Optional[str] - Must be one of: cash, credit, investment, other, real estate, loan, vehicle, - cryptocurrency, employee compensation - subtype_name: Optional[str] - Max 25 characters - name: Optional[str] - Max 45 characters - balance: Optional[float] - Numeric value of the current balance of the account. Do not include any special - characters aside from a decimal point! - balance_as_of: Optional[datetime.datetime] - Has no effect if balance is not defined. If balance is defined, but balance_as_of - is not supplied or is invalid, current timestamp will be used. - currency: Optional[str] - Three-letter lowercase currency in ISO 4217 format. The code sent must exist in - our database. Defaults to asset's currency. - institution_name: Optional[str] - Max 50 characters - - Returns - ------- - AssetsObject - """ - payload = _AssetsParamsPut( - type_name=type_name, - subtype_name=subtype_name, - name=name, - balance=balance, - balance_as_of=balance_as_of, - currency=currency, - institution_name=institution_name, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[APIConfig.LUNCHMONEY_ASSETS, asset_id], - payload=payload, - ) - asset = AssetsObject.model_validate(response_data) - return asset - - def insert_asset( - self, - type_name: str, - name: Optional[str] = None, - subtype_name: Optional[str] = None, - display_name: Optional[str] = None, - balance: float = 0.00, - balance_as_of: Optional[datetime.datetime] = None, - currency: Optional[str] = None, - institution_name: Optional[str] = None, - closed_on: Optional[datetime.date] = None, - exclude_transactions: Optional[bool] = None, - ) -> AssetsObject: - """ - Create a single (manually-managed) asset. - - Parameters - ---------- - type_name: Optional[str] - Must be one of: cash, credit, investment, other, real estate, loan, vehicle, - cryptocurrency, employee compensation - name: Optional[str] - Max 45 characters - subtype_name: Optional[str] - Max 25 characters - display_name: Optional[str] - Display name of the asset (as set by user) - balance: float - Numeric value of the current balance of the account. Do not include any - special characters aside from a decimal point! Defaults to `0.00` - balance_as_of: Optional[datetime.datetime] - Has no effect if balance is not defined. If balance is defined, but - balance_as_of is not supplied or is invalid, current timestamp will be used. - currency: Optional[str] - Three-letter lowercase currency in ISO 4217 format. The code sent must exist - in our database. Defaults to user's primary currency. - institution_name: Optional[str] - Max 50 characters - closed_on: Optional[datetime.date] - The date this asset was closed - exclude_transactions: bool - If true, this asset will not show up as an option for assignment when - creating transactions manually. Defaults to False - - Returns - ------- - AssetsObject - """ - payload = _AssetsParamsPost( - type_name=type_name, - subtype_name=subtype_name, - name=name, - display_name=display_name, - balance=balance, - balance_as_of=balance_as_of, - currency=currency, - institution_name=institution_name, - closed_on=closed_on, - exclude_transactions=exclude_transactions, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=[APIConfig.LUNCHMONEY_ASSETS], - payload=payload, - ) - asset = AssetsObject.model_validate(response_data) - return asset diff --git a/lunchable/models/budgets.py b/lunchable/models/budgets.py deleted file mode 100644 index 54fbd666..00000000 --- a/lunchable/models/budgets.py +++ /dev/null @@ -1,215 +0,0 @@ -""" -Lunch Money - Budgets - -https://lunchmoney.dev/#budget -""" - -import datetime -import logging -from typing import Any, Dict, List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _BudgetDescriptions - -logger = logging.getLogger(__name__) - - -class BudgetDataObject(LunchableModel): - """ - Data Object within a Budget - """ - - budget_amount: Optional[float] = None - budget_currency: Optional[str] = None - budget_to_base: Optional[float] = None - spending_to_base: float = 0.00 - num_transactions: int = 0 - - -class BudgetConfigObject(LunchableModel): - """ - Budget Configuration Object - """ - - config_id: int - cadence: str - amount: Optional[float] = None - currency: Optional[str] = None - to_base: Optional[float] = None - auto_suggest: str - - -class BudgetObject(LunchableModel): - """ - Monthly Budget Per Category Object - - https://lunchmoney.dev/#budget-object - """ - - category_name: str = Field(description="Name of the category") - category_id: Optional[int] = Field( - None, description="Unique identifier for category" - ) - category_group_name: Optional[str] = Field( - None, description=_BudgetDescriptions.category_group_name - ) - group_id: Optional[int] = Field( - None, description="Unique identifier for category group" - ) - is_group: Optional[bool] = Field( - None, description="If true, this category is a group" - ) - is_income: bool = Field(description=_BudgetDescriptions.is_income) - exclude_from_budget: bool = Field( - description=_BudgetDescriptions.exclude_from_budget - ) - exclude_from_totals: bool = Field( - description=_BudgetDescriptions.exclude_from_totals - ) - data: Dict[datetime.date, BudgetDataObject] = Field( - description=_BudgetDescriptions.data - ) - config: Optional[BudgetConfigObject] = Field( - None, description=_BudgetDescriptions.config - ) - - -class BudgetParamsGet(LunchableModel): - """ - https://lunchmoney.dev/#get-budget-summary - """ - - start_date: datetime.date - end_date: datetime.date - - -class BudgetParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#upsert-budget - """ - - start_date: datetime.date - category_id: int - amount: float - currency: Optional[str] = None - - -class BudgetParamsRemove(LunchableModel): - """ - https://lunchmoney.dev/#remove-budget - """ - - start_date: datetime.date - category_id: int - - -class BudgetsClient(LunchMoneyAPIClient): - """ - Lunch Money Budget Interactions - """ - - def get_budgets( - self, start_date: datetime.date, end_date: datetime.date - ) -> List[BudgetObject]: - """ - Get Monthly Budgets - - Get full details on the budgets for all categories between a certain time - period. The budgeted and spending amounts will be an aggregate across this - time period. (https://lunchmoney.dev/#plaid-accounts-object) - - Returns - ------- - List[BudgetObject] - """ - params = BudgetParamsGet(start_date=start_date, end_date=end_date).model_dump() - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCHMONEY_BUDGET], - params=params, - ) - budget_objects = [BudgetObject.model_validate(item) for item in response_data] - return budget_objects - - def upsert_budget( - self, - start_date: datetime.date, - category_id: int, - amount: float, - currency: Optional[str] = None, - ) -> Optional[Dict[str, Any]]: - """ - Upsert a Budget for a Category and Date - - Use this endpoint to update an existing budget or insert a new budget for - a particular category and date. - - Note: Lunch Money currently only supports monthly budgets, so your date must - always be the start of a month (eg. 2021-04-01) - - If this is a sub-category, the response will include the updated category - group's budget. This is because setting a sub-category may also update - the category group's overall budget. - - https://lunchmoney.dev/#upsert-budget - - Parameters - ---------- - start_date : date - Start date for the budget period. Lunch Money currently only supports monthly budgets, - so your date must always be the start of a month (eg. 2021-04-01) - category_id: int - Unique identifier for the category - amount: float - Amount for budget - currency: Optional[str] - Currency for the budgeted amount (optional). If empty, will default to your primary - currency - - Returns - ------- - Optional[Dict[str, Any]] - """ - body = BudgetParamsPut( - start_date=start_date, - category_id=category_id, - amount=amount, - currency=currency, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[APIConfig.LUNCHMONEY_BUDGET], - payload=body, - ) - - return response_data["category_group"] - - def remove_budget(self, start_date: datetime.date, category_id: int) -> bool: - """ - Unset an Existing Budget for a Particular Category in a Particular Month - - Parameters - ---------- - start_date : date - Start date for the budget period. Lunch Money currently only supports monthly budgets, - so your date must always be the start of a month (eg. 2021-04-01) - category_id: int - Unique identifier for the category - - Returns - ------- - bool - """ - params = BudgetParamsRemove( - start_date=start_date, category_id=category_id - ).model_dump() - response_data = self.make_request( - method=self.Methods.DELETE, - url_path=[APIConfig.LUNCHMONEY_BUDGET], - params=params, - ) - return response_data diff --git a/lunchable/models/categories.py b/lunchable/models/categories.py deleted file mode 100644 index 71950a4b..00000000 --- a/lunchable/models/categories.py +++ /dev/null @@ -1,488 +0,0 @@ -""" -Lunch Money - Categories - -https://lunchmoney.dev/#categories -""" - -from __future__ import annotations - -import datetime -import json -import logging -from enum import Enum -from typing import List, Optional, Union - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.exceptions import LunchMoneyError -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _CategoriesDescriptions - -logger = logging.getLogger(__name__) - - -class ModelCreateCategory(LunchableModel): - """ - https://lunchmoney.dev/#create-category - """ - - name: str - description: Optional[str] = None - is_income: Optional[bool] = None - exclude_from_budget: Optional[bool] = None - exclude_from_totals: Optional[bool] = None - archived: Optional[bool] = None - group_id: Optional[int] = None - - -class CategoryChild(LunchableModel): - """ - Child Entry on the Category Object - """ - - id: int - name: str = Field(min_length=1, max_length=100) - description: Optional[str] = Field(None, max_length=140) - created_at: Optional[datetime.datetime] = None - - -class CategoriesObject(LunchableModel): - """ - Lunch Money Spending Categories - - https://lunchmoney.dev/#categories-object - """ - - id: int = Field(description="A unique identifier for the category.") - name: str = Field( - min_length=1, - max_length=100, - description=_CategoriesDescriptions.name, - ) - description: Optional[str] = Field( - None, max_length=140, description=_CategoriesDescriptions.description - ) - is_income: bool = Field(description=_CategoriesDescriptions.is_income) - exclude_from_budget: bool = Field( - description=_CategoriesDescriptions.exclude_from_budget - ) - exclude_from_totals: bool = Field( - description=_CategoriesDescriptions.exclude_from_totals - ) - archived: bool = Field(False, description=_CategoriesDescriptions.archived) - archived_on: Optional[datetime.datetime] = Field( - None, description=_CategoriesDescriptions.archived_on - ) - updated_at: Optional[datetime.datetime] = Field( - None, description=_CategoriesDescriptions.updated_at - ) - created_at: Optional[datetime.datetime] = Field( - None, description=_CategoriesDescriptions.created_at - ) - is_group: bool = Field(description=_CategoriesDescriptions.is_group) - group_id: Optional[int] = Field(None, description=_CategoriesDescriptions.group_id) - order: Optional[int] = Field(None, description=_CategoriesDescriptions.order) - children: Optional[List[Union[CategoriesObject, CategoryChild]]] = Field( - None, - description=_CategoriesDescriptions.children, - ) - - -class _CategoriesParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#update-category - """ - - name: Optional[str] = Field(None, min_length=1, max_length=100) - description: Optional[str] = Field(None, max_length=140) - is_income: Optional[bool] = None - exclude_from_budget: Optional[bool] = None - exclude_from_totals: Optional[bool] = None - archived: Optional[bool] = None - group_id: Optional[int] = None - - -class _CategoriesParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#create-category-group - """ - - name: str - description: Optional[str] = None - is_income: Optional[bool] = None - exclude_from_budget: Optional[bool] = None - exclude_from_totals: Optional[bool] = None - category_ids: Optional[List[int]] = None - new_categories: Optional[List[str]] = None - - -class _CategoriesAddParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#add-to-category-group - """ - - category_ids: Optional[List[int]] = None - new_categories: Optional[List[str]] = None - - -class CategoriesFormatEnum(str, Enum): - """ - Format Enum - """ - - nested: str = "nested" - flattened: str = "flattened" - - -class _GetCategoriesParams(LunchableModel): - """ - https://lunchmoney.dev/#get-all-categories - """ - - format: Optional[CategoriesFormatEnum] = None - - -class CategoriesClient(LunchMoneyAPIClient): - """ - Lunch Money Categories Interactions - """ - - def get_categories( - self, format: str | CategoriesFormatEnum | None = None - ) -> List[CategoriesObject]: - """ - Get Spending categories - - Use this endpoint to get a list of all categories associated with the user's account. - https://lunchmoney.dev/#get-all-categories - - Parameters - ---------- - format: str | CategoriesFormatEnum | None - Can either `flattened` or `nested`. If `flattened`, returns a singular - array of categories, ordered alphabetically. If `nested`, returns - top-level categories (either category groups or categories not part - of a category group) in an array. Subcategories are nested within - the category group under the property `children`. Defaults to None - which will return a `flattened` list of categories. - - Returns - ------- - List[CategoriesObject] - """ - response_data = self.make_request( - method=self.Methods.GET, - url_path=APIConfig.LUNCHMONEY_CATEGORIES, - params=_GetCategoriesParams(format=format).model_dump(exclude_none=True), - ) - categories = response_data["categories"] - category_objects = [ - CategoriesObject.model_validate(item) for item in categories - ] - return category_objects - - def insert_category( - self, - name: str, - description: Optional[str] = None, - is_income: Optional[bool] = None, - exclude_from_budget: Optional[bool] = None, - exclude_from_totals: Optional[bool] = None, - archived: Optional[bool] = None, - group_id: Optional[int] = None, - ) -> int: - """ - Create a Spending Category - - Use this to create a single category - https://lunchmoney.dev/#create-category - - Parameters - ---------- - name: str - Name of category. Must be between 1 and 100 characters. - description: Optional[str] - Description of category. Must be less than 140 categories. Defaults to None. - is_income: Optional[bool] - Whether or not transactions in this category should be treated as income. - Defaults to False. - exclude_from_budget: Optional[bool] - Whether or not transactions in this category should be excluded from budgets. - Defaults to False. - exclude_from_totals: Optional[bool] - Whether or not transactions in this category should be excluded from - calculated totals. Defaults to False. - archived: Optional[bool] - Whether or not category should be archived. - group_id: Optional[int] - Assigns the newly-created category to an existing category group. - - Returns - ------- - int - ID of the newly created category - """ - category_body = ModelCreateCategory( - name=name, - description=description, - is_income=is_income, - exclude_from_budget=exclude_from_budget, - exclude_from_totals=exclude_from_totals, - archived=archived, - group_id=group_id, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=APIConfig.LUNCHMONEY_CATEGORIES, - payload=category_body, - ) - return response_data["category_id"] - - def get_category(self, category_id: int) -> CategoriesObject: - """ - Get single category - - Use this endpoint to get hydrated details on a single category. Note that if - this category is part of a category group, its properties (is_income, - exclude_from_budget, exclude_from_totals) will inherit from the category group. - - https://lunchmoney.dev/#get-single-category - - Parameters - ---------- - category_id : int - Id of the Lunch Money Category - - Returns - ------- - CategoriesObject - """ - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, category_id], - ) - return CategoriesObject.model_validate(response_data) - - def remove_category(self, category_id: int) -> bool: - """ - Delete a single category - - Use this endpoint to delete a single category or category group. This will - only work if there are no dependencies, such as existing budgets for the - category, categorized transactions, categorized recurring items, etc. If - there are dependents, this endpoint will return what the dependents are - and how many there are. - - https://lunchmoney.dev/#delete-category - - Parameters - ---------- - category_id : int - Id of the Lunch Money Category - - Returns - ------- - bool - """ - response_data = self.make_request( - method=self.Methods.DELETE, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, category_id], - ) - if response_data is not True: - raise LunchMoneyError( - f"That Category ({category_id}) has Dependents: " - f"{json.dumps(response_data, indent=4)}" - ) - return response_data - - def remove_category_force(self, category_id: int) -> bool: - """ - Forcefully delete a single category - - Use this endpoint to force delete a single category or category group and - along with it, disassociate the category from any transactions, recurring - items, budgets, etc. - - Note: it is best practice to first try the Delete Category endpoint to ensure - you don't accidentally delete any data. Disassociation/deletion of the data - arising from this endpoint is irreversible! - - https://lunchmoney.dev/#force-delete-category - - Parameters - ---------- - category_id : int - Id of the Lunch Money Category - - Returns - ------- - bool - """ - response_data = self.make_request( - method=self.Methods.DELETE, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, category_id, "force"], - ) - return response_data - - def update_category( - self, - category_id: int, - name: Optional[str] = None, - description: Optional[str] = None, - is_income: Optional[bool] = None, - exclude_from_budget: Optional[bool] = None, - exclude_from_totals: Optional[bool] = None, - group_id: Optional[int] = None, - archived: Optional[bool] = None, - ) -> bool: - """ - Update a single category - - Use this endpoint to update the properties for a single category or category group - - https://lunchmoney.dev/#update-category - - Parameters - ---------- - category_id : int - Id of the Lunch Money Category - name: str - Name of category. Must be between 1 and 100 characters. - description: Optional[str] - Description of category. Must be less than 140 categories. Defaults to None. - is_income: Optional[bool] - Whether or not transactions in this category should be treated as income. - Defaults to False. - exclude_from_budget: Optional[bool] - Whether or not transactions in this category should be excluded from budgets. - Defaults to False. - exclude_from_totals: Optional[bool] - Whether or not transactions in this category should be excluded from - calculated totals. Defaults to False. - group_id: Optional[int] - For a category, set the group_id to include it in a category group - archived: Optional[bool] - Whether or not category should be archived. - - Returns - ------- - bool - """ - payload = _CategoriesParamsPut( - name=name, - description=description, - is_income=is_income, - exclude_from_budget=exclude_from_budget, - exclude_from_totals=exclude_from_totals, - group_id=group_id, - archived=archived, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, category_id], - payload=payload, - ) - return response_data - - def insert_category_group( - self, - name: str, - description: Optional[str] = None, - is_income: Optional[bool] = None, - exclude_from_budget: Optional[bool] = None, - exclude_from_totals: Optional[bool] = None, - category_ids: Optional[List[int]] = None, - new_categories: Optional[List[str]] = None, - ) -> int: - """ - Create a Spending Category Group - - Use this endpoint to create a single category group - https://lunchmoney.dev/#create-category-group - - Parameters - ---------- - name: str - Name of category. Must be between 1 and 100 characters. - description: Optional[str] - Description of category. Must be less than 140 categories. Defaults to None. - is_income: Optional[bool] - Whether or not transactions in this category should be treated as income. - Defaults to False. - exclude_from_budget: Optional[bool] - Whether or not transactions in this category should be excluded from budgets. - Defaults to False. - exclude_from_totals: Optional[bool] - Whether or not transactions in this category should be excluded from - calculated totals. Defaults to False. - category_ids: Optional[List[int]] - Array of category_id to include in the category group. - new_categories: Optional[List[str]] - Array of strings representing new categories to create and subsequently - include in the category group. - - Returns - ------- - int - ID of the newly created category group - """ - payload = _CategoriesParamsPost( - name=name, - description=description, - is_income=is_income, - exclude_from_budget=exclude_from_budget, - exclude_from_totals=exclude_from_totals, - category_ids=category_ids, - new_categories=new_categories, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, "group"], - payload=payload, - ) - return response_data["category_id"] - - def insert_into_category_group( - self, - category_group_id: int, - category_ids: Optional[List[int]] = None, - new_categories: Optional[List[str]] = None, - ) -> CategoriesObject: - """ - Add to a Category Group - - Use this endpoint to add categories (either existing or new) to a single - category group - - https://lunchmoney.dev/#add-to-category-group - - Parameters - ---------- - category_group_id: int - Id of the Lunch Money Category Group - category_ids: Optional[List[int]] - Array of category_id to include in the category group. - new_categories: Optional[List[str]] - Array of strings representing new categories to create and subsequently - include in the category group. - - Returns - ------- - CategoriesObject - """ - payload = _CategoriesAddParamsPost( - category_ids=category_ids, new_categories=new_categories - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=[ - APIConfig.LUNCHMONEY_CATEGORIES, - "group", - category_group_id, - "add", - ], - payload=payload, - ) - return CategoriesObject.model_validate(response_data) diff --git a/lunchable/models/crypto.py b/lunchable/models/crypto.py deleted file mode 100644 index ed7ba1c6..00000000 --- a/lunchable/models/crypto.py +++ /dev/null @@ -1,144 +0,0 @@ -""" -Lunch Money - Crypto - -https://lunchmoney.dev/#crypto -""" - -import datetime -import logging -from typing import List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _CryptoDescriptions - -logger = logging.getLogger(__name__) - - -class CryptoObject(LunchableModel): - """ - Crypto Asset Object - - https://lunchmoney.dev/#crypto-object - """ - - id: int = Field(description=_CryptoDescriptions.id) - zabo_account_id: Optional[int] = Field( - None, description=_CryptoDescriptions.zabo_account_id - ) - source: str = Field(description=_CryptoDescriptions.source) - name: str = Field(description="Name of the crypto asset") - display_name: Optional[str] = Field( - None, description=_CryptoDescriptions.display_name - ) - balance: float = Field(description="Current balance") - balance_as_of: Optional[datetime.datetime] = Field( - None, description=_CryptoDescriptions.balance_as_of - ) - currency: Optional[str] = Field( - None, description="Abbreviation for the cryptocurrency" - ) - status: Optional[str] = Field(None, description=_CryptoDescriptions.status) - institution_name: Optional[str] = Field( - default=None, description="Name of provider holding the asset" - ) - created_at: datetime.datetime = Field(description=_CryptoDescriptions.created_at) - - -class CryptoParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#update-manual-crypto-asset - """ - - name: Optional[str] = None - display_name: Optional[str] = None - institution_name: Optional[str] = None - balance: Optional[float] = None - currency: Optional[str] = None - - -class CryptoClient(LunchMoneyAPIClient): - """ - Lunch Money Tag Interactions - """ - - def get_crypto(self) -> List[CryptoObject]: - """ - Get Crypto Assets - - Use this endpoint to get a list of all cryptocurrency assets associated - with the user's account. Both crypto balances from synced and manual - accounts will be returned. - - https://lunchmoney.dev/#get-all-crypto - - Returns - ------- - List[CryptoObject] - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=APIConfig.LUNCHMONEY_CRYPTO - ) - crypto_data = response_data["crypto"] - crypto_objects = [CryptoObject.model_validate(item) for item in crypto_data] - return crypto_objects - - def update_crypto( - self, - crypto_id: int, - name: Optional[str] = None, - display_name: Optional[str] = None, - institution_name: Optional[str] = None, - balance: Optional[float] = None, - currency: Optional[str] = None, - ) -> CryptoObject: - """ - Update a Manual Crypto Asset - - Use this endpoint to update a single manually-managed crypto asset (does not include - assets received from syncing with your wallet/exchange/etc). These are denoted by - source: manual from the GET call above. - - https://lunchmoney.dev/#update-manual-crypto-asset - - Parameters - ---------- - crypto_id: int - ID of the crypto asset to update - name: Optional[str] - Official or full name of the account. Max 45 characters - display_name: Optional[str] - Display name for the account. Max 25 characters - institution_name: Optional[str] - Name of provider that holds the account. Max 50 characters - balance: Optional[float] - Numeric value of the current balance of the account. Do not include any - special characters aside from a decimal point! - currency: Optional[str] - Cryptocurrency that is supported for manual tracking in our database - - Returns - ------- - CryptoObject - """ - crypto_body = CryptoParamsPut( - name=name, - display_name=display_name, - institution_name=institution_name, - balance=balance, - currency=currency, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[ - APIConfig.LUNCHMONEY_CRYPTO, - APIConfig.LUNCHMONEY_CRYPTO_MANUAL, - crypto_id, - ], - payload=crypto_body, - ) - crypto = CryptoObject.model_validate(response_data) - return crypto diff --git a/lunchable/models/plaid_accounts.py b/lunchable/models/plaid_accounts.py deleted file mode 100644 index cef14fd8..00000000 --- a/lunchable/models/plaid_accounts.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -Lunch Money - Plaid Accounts - -https://lunchmoney.dev/#plaid-accounts -""" - -from __future__ import annotations - -import datetime -import logging -from typing import List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _PlaidAccountDescriptions - -logger = logging.getLogger(__name__) - - -class _PlaidFetchRequest(LunchableModel): - """ - Trigger Fetch from Plaid - - https://lunchmoney.dev/#trigger-fetch-from-plaid - """ - - start_date: Optional[datetime.date] = None - end_date: Optional[datetime.date] = None - plaid_account_id: Optional[int] = None - - -class PlaidAccountObject(LunchableModel): - """ - Assets synced from Plaid - - Similar to AssetObjects, these accounts are linked to remote sources in Plaid. - - https://lunchmoney.dev/#plaid-accounts-object - """ - - id: int = Field(description="Unique identifier of Plaid account") - date_linked: datetime.date = Field( - description=_PlaidAccountDescriptions.date_linked - ) - name: str = Field(description=_PlaidAccountDescriptions.name) - type: str = Field(description=_PlaidAccountDescriptions.type) - subtype: str = Field(description=_PlaidAccountDescriptions.subtype) - mask: Optional[str] = Field(None, description=_PlaidAccountDescriptions.mask) - institution_name: str = Field( - description=_PlaidAccountDescriptions.institution_name - ) - status: str = Field(description=_PlaidAccountDescriptions.status) - last_import: Optional[datetime.datetime] = Field( - None, description=_PlaidAccountDescriptions.last_import - ) - balance: Optional[float] = Field( - None, description=_PlaidAccountDescriptions.balance - ) - currency: str = Field(description=_PlaidAccountDescriptions.currency) - balance_last_update: datetime.datetime = Field( - description=_PlaidAccountDescriptions.balance_last_update - ) - limit: Optional[int] = Field(None, description=_PlaidAccountDescriptions.limit) - - -class PlaidAccountsClient(LunchMoneyAPIClient): - """ - Lunch Money Plaid Accounts Interactions - """ - - def get_plaid_accounts(self) -> List[PlaidAccountObject]: - """ - Get Plaid Synced Assets - - Get a list of all synced Plaid accounts associated with the user's account. - - Plaid Accounts are individual bank accounts that you have linked to Lunch Money via Plaid. - You may link one bank but one bank might contain 4 accounts. Each of these - accounts is a Plaid Account. (https://lunchmoney.dev/#plaid-accounts-object) - - Returns - ------- - List[PlaidAccountObject] - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=APIConfig.LUNCHMONEY_PLAID_ACCOUNTS - ) - accounts = response_data.get(APIConfig.LUNCHMONEY_PLAID_ACCOUNTS) - account_objects = [PlaidAccountObject.model_validate(item) for item in accounts] - return account_objects - - def trigger_fetch_from_plaid( - self, - start_date: Optional[datetime.date] = None, - end_date: Optional[datetime.date] = None, - plaid_account_id: Optional[int] = None, - ) -> bool: - """ - Trigger Fetch from Plaid - - ** This is an experimental endpoint and parameters and/or response may change. ** - - Use this endpoint to trigger a fetch for latest data from Plaid. - - Returns true if there were eligible Plaid accounts to trigger a fetch for. Eligible - accounts are those who last_fetch value is over 1 minute ago. (Although the limit - is every minute, please use this endpoint sparingly!) - - Note that fetching from Plaid is a background job. This endpoint simply queues up - the job. You may track the plaid_last_successful_update, last_fetch and last_import - properties to verify the results of the fetch. - - Parameters - ---------- - start_date: Optional[datetime.date] - Start date for fetch (ignored if end_date is null) - end_date: Optional[datetime.date] - End date for fetch (ignored if start_date is null) - plaid_account_id: Optional[int] - Specific ID of a plaid account to fetch. If left empty, - endpoint will trigger a fetch for all eligible accounts - - Returns - ------- - bool - Returns true if there were eligible Plaid accounts to trigger a fetch for. - """ - fetch_request = _PlaidFetchRequest( - start_date=start_date, end_date=end_date, plaid_account_id=plaid_account_id - ) - response: bool = self.make_request( - method=self.Methods.POST, - url_path=[APIConfig.LUNCHMONEY_PLAID_ACCOUNTS, "fetch"], - data=fetch_request.model_dump(exclude_none=True), - ) - return response diff --git a/lunchable/models/recurring_expenses.py b/lunchable/models/recurring_expenses.py deleted file mode 100644 index 457b5c9b..00000000 --- a/lunchable/models/recurring_expenses.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -Lunch Money - Recurring Expenses - -https://lunchmoney.dev/#recurring-expenses -""" - -import datetime -import logging -import warnings -from typing import List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _RecurringExpensesDescriptions - -logger = logging.getLogger(__name__) - - -class RecurringExpensesObject(LunchableModel): - """ - Recurring Expenses Object - - https://lunchmoney.dev/#recurring-expenses-object - """ - - id: int = Field(description=_RecurringExpensesDescriptions.id) - start_date: Optional[datetime.date] = Field( - None, description=_RecurringExpensesDescriptions.start_date - ) - end_date: Optional[datetime.date] = Field( - None, description=_RecurringExpensesDescriptions.end_date - ) - cadence: str = Field(description=_RecurringExpensesDescriptions.cadence) - payee: str = Field(description="Payee of the recurring expense") - amount: float = Field(description=_RecurringExpensesDescriptions.amount) - currency: str = Field( - max_length=3, description=_RecurringExpensesDescriptions.currency - ) - description: Optional[str] = Field( - None, description=_RecurringExpensesDescriptions.description - ) - billing_date: datetime.date = Field( - description=_RecurringExpensesDescriptions.billing_date - ) - type: str = Field(description=_RecurringExpensesDescriptions.type) - original_name: Optional[str] = Field( - None, description=_RecurringExpensesDescriptions.original_name - ) - source: str = Field(description=_RecurringExpensesDescriptions.source) - plaid_account_id: Optional[int] = Field( - None, description=_RecurringExpensesDescriptions.plaid_account_id - ) - asset_id: Optional[int] = Field( - None, description=_RecurringExpensesDescriptions.asset_id - ) - category_id: Optional[int] = Field( - None, description=_RecurringExpensesDescriptions.category_id - ) - - -class RecurringExpenseParamsGet(LunchableModel): - """ - https://lunchmoney.dev/#get-recurring-expenses - """ - - start_date: datetime.date - debit_as_negative: Optional[bool] = None - - -class RecurringExpensesClient(LunchMoneyAPIClient): - """ - Lunch Money Recurring Expenses Interactions - """ - - def get_recurring_expenses( - self, - start_date: Optional[datetime.date] = None, - debit_as_negative: Optional[bool] = None, - ) -> List[RecurringExpensesObject]: - """ - Get Recurring Expenses - - **DEPRECATED** - Use [LunchMoney.get_recurring_items()][lunchable.LunchMoney.get_recurring_items] - instead. - - Retrieve a list of recurring expenses to expect for a specified period. - - Every month, a different set of recurring expenses is expected. This is because recurring - expenses can be once a year, twice a year, every 4 months, etc. - - If a recurring expense is listed as “twice a month”, then that recurring expense will be - returned twice, each with a different billing date based on when the system believes that - recurring expense transaction is to be expected. If the recurring expense is listed as - “once a week”, then that recurring expense will be returned in this list as many times as - there are weeks for the specified month. - - In the same vein, if a recurring expense that began last month is set to “Every 3 - months”, then that recurring expense will not show up in the results for this month. - - Parameters - ---------- - start_date : Optional[datetime.date] - Date to search. By default will return the first day of the current month - debit_as_negative: bool - Pass in true if you'd like expenses to be returned as negative amounts and credits as - positive amounts. - - Returns - ------- - List[RecurringExpensesObject] - """ - warnings.warn( - message=( - "`LunchMoney.get_recurring_expenses` is deprecated, " - "use `LunchMoney.get_recurring_items` instead" - ), - category=DeprecationWarning, - stacklevel=2, - ) - if start_date is None: - start_date = datetime.datetime.now().date().replace(day=1) - params = RecurringExpenseParamsGet( - start_date=start_date, debit_as_negative=debit_as_negative - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCH_MONEY_RECURRING_EXPENSES], - params=params, - ) - recurring_expenses = response_data.get(APIConfig.LUNCH_MONEY_RECURRING_EXPENSES) - recurring_expenses_objects = [ - RecurringExpensesObject.model_validate(item) for item in recurring_expenses - ] - logger.debug( - "%s RecurringExpensesObjects retrieved", len(recurring_expenses_objects) - ) - return recurring_expenses_objects diff --git a/lunchable/models/recurring_items.py b/lunchable/models/recurring_items.py deleted file mode 100644 index d77c7679..00000000 --- a/lunchable/models/recurring_items.py +++ /dev/null @@ -1,190 +0,0 @@ -""" -Lunch Money - Recurring Expenses - -https://lunchmoney.dev/#recurring-expenses -""" - -from __future__ import annotations - -import datetime -import logging -from typing import Any, Dict, List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import ( - _RecurringItemsDescriptions, - _SummarizedTransactionDescriptions, -) - -logger = logging.getLogger(__name__) - - -class SummarizedTransactionObject(LunchableModel): - """ - Summarized Transaction Object - """ - - id: int = Field(description=_SummarizedTransactionDescriptions.id) - date: datetime.date = Field(description=_SummarizedTransactionDescriptions.date) - amount: float = Field(description=_SummarizedTransactionDescriptions.amount) - currency: str = Field( - max_length=3, description=_SummarizedTransactionDescriptions.currency - ) - payee: str = Field(description=_SummarizedTransactionDescriptions.payee) - category_id: Optional[int] = Field( - None, description=_SummarizedTransactionDescriptions.category_id - ) - recurring_id: Optional[int] = Field( - None, description=_SummarizedTransactionDescriptions.recurring_id - ) - to_base: float = Field(description=_SummarizedTransactionDescriptions.to_base) - - -class RecurringItemsObject(LunchableModel): - """ - Recurring Expenses Object - """ - - id: int = Field(description=_RecurringItemsDescriptions.id) - start_date: Optional[datetime.date] = Field( - None, description=_RecurringItemsDescriptions.start_date - ) - end_date: Optional[datetime.date] = Field( - None, description=_RecurringItemsDescriptions.end_date - ) - payee: str = Field(description=_RecurringItemsDescriptions.payee) - currency: str = Field( - max_length=3, description=_RecurringItemsDescriptions.currency - ) - created_by: int = Field(description=_RecurringItemsDescriptions.created_by) - created_at: datetime.datetime = Field( - description=_RecurringItemsDescriptions.created_at - ) - updated_at: datetime.datetime = Field( - description=_RecurringItemsDescriptions.updated_at - ) - billing_date: datetime.date = Field( - description=_RecurringItemsDescriptions.billing_date - ) - original_name: Optional[str] = Field( - None, description=_RecurringItemsDescriptions.original_name - ) - description: Optional[str] = Field( - None, description=_RecurringItemsDescriptions.description - ) - plaid_account_id: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.plaid_account_id - ) - asset_id: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.asset_id - ) - source: str = Field(description=_RecurringItemsDescriptions.source) - notes: Optional[str] = Field(None, description=_RecurringItemsDescriptions.notes) - amount: float = Field(description=_RecurringItemsDescriptions.amount) - category_id: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.category_id - ) - category_group_id: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.category_group_id - ) - is_income: bool = Field(description=_RecurringItemsDescriptions.is_income) - exclude_from_totals: bool = Field( - description=_RecurringItemsDescriptions.exclude_from_totals - ) - granularity: str = Field(description=_RecurringItemsDescriptions.granularity) - cadence: Optional[str] = Field(None) - quantity: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.quantity - ) - occurrences: Dict[datetime.date, List[SummarizedTransactionObject]] = Field( - description=_RecurringItemsDescriptions.occurrences - ) - transactions_within_range: Optional[List[SummarizedTransactionObject]] = Field( - None, description=_RecurringItemsDescriptions.transactions_within_range - ) - missing_dates_within_range: Optional[List[Any]] = Field( - None, description=_RecurringItemsDescriptions.missing_dates_within_range - ) - date: Optional[datetime.date] = Field( - None, description=_RecurringItemsDescriptions.date - ) - to_base: float = Field(description=_RecurringItemsDescriptions.to_base) - - -class RecurringItemsParamsGet(LunchableModel): - """ - https://lunchmoney.dev/#get-recurring-items - """ - - start_date: datetime.date - debit_as_negative: Optional[bool] = None - - -class RecurringItemsClient(LunchMoneyAPIClient): - """ - Lunch Money Recurring Items Interactions - """ - - def get_recurring_items( - self, - start_date: Optional[datetime.date] = None, - debit_as_negative: Optional[bool] = None, - ) -> List[RecurringItemsObject]: - """ - Get Recurring Items - - Use this to retrieve a list of recurring items to expect for a specified month. - - A different set of recurring items is expected every month. These can be once a year, - twice a year, every four months, etc. - - If a recurring item is listed as “twice a month,” then the recurring item object returned - will have an occurrences attribute populated by the different billing dates the system believes - recurring transactions should occur, including the two dates in the current month, the last - transaction date prior to the month, and the next transaction date after the month. - - If the recurring item is listed as “once a week,” then the recurring item object returned will - have an occurrences object populated with as many times as there are weeks for the specified - month, along with the last transaction from the previous month and the next transaction for - the next month. - - In the same vein, if a recurring item that began last month is set to “Every 3 months”, - then that recurring item object that occurred will not include any dates for this month. - - Parameters - ---------- - start_date : Optional[datetime.date] - Date to search. Whatever your start date, the system will automatically - return recurring items expected for that month. For instance, if you - input 2020-01-25, the system will return recurring items which are to - be expected between 2020-01-01 to 2020-01-31. By default will return - the first day of the current month - debit_as_negative: bool - Pass in true if you'd like items to be returned as negative amounts - and credits as positive amounts. Defaults to false. - - Returns - ------- - List[RecurringItemsObject] - """ - if start_date is None: - start_date = datetime.datetime.now().date().replace(day=1) - params = RecurringItemsParamsGet( - start_date=start_date, debit_as_negative=debit_as_negative - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCH_MONEY_RECURRING_ITEMS], - params=params, - ) - recurring_expenses_objects = [ - RecurringItemsObject.model_validate(item) for item in response_data - ] - logger.debug( - "%s RecurringExpensesObjects retrieved", len(recurring_expenses_objects) - ) - return recurring_expenses_objects diff --git a/lunchable/models/tags.py b/lunchable/models/tags.py deleted file mode 100644 index 40362b27..00000000 --- a/lunchable/models/tags.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Lunch Money - Tags - -https://lunchmoney.dev/#tags -""" - -import logging -from typing import List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient - -logger = logging.getLogger(__name__) - - -class TagsObject(LunchableModel): - """ - Lunchmoney Tags object - - https://lunchmoney.dev/#tags-object - """ - - id: int = Field(description="Unique identifier for tag") - name: str = Field(description="User-defined name of tag", min_length=1) - description: Optional[str] = Field( - None, description="User-defined description of tag" - ) - archived: bool = Field( - False, - description=( - "If true, the tag will not show up when creating or " - "updating transactions in the Lunch Money app" - ), - ) - - -class TagsClient(LunchMoneyAPIClient): - """ - Lunch Money Tag Interactions - """ - - def get_tags(self) -> List[TagsObject]: - """ - Get Spending Tags - - Use this endpoint to get a list of all tags associated with the - user's account. - - https://lunchmoney.dev/#get-all-tags - - Returns - ------- - List[TagsObject] - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=APIConfig.LUNCHMONEY_TAGS - ) - tag_objects = [TagsObject.model_validate(item) for item in response_data] - return tag_objects diff --git a/lunchable/models/transactions.py b/lunchable/models/transactions.py deleted file mode 100644 index 26077120..00000000 --- a/lunchable/models/transactions.py +++ /dev/null @@ -1,963 +0,0 @@ -""" -Lunch Money - Transactions - -https://lunchmoney.dev/#transactions -""" - -import datetime -import logging -from enum import Enum -from typing import Any, Dict, List, Optional, Union - -import pydantic_core -from pydantic import Field, field_validator - -from lunchable import LunchMoneyError -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import ( - _TransactionDescriptions, - _TransactionInsertDescriptions, - _TransactionSplitDescriptions, - _TransactionUpdateDescriptions, -) -from lunchable.models.tags import TagsObject - -logger = logging.getLogger(__name__) - - -class TransactionBaseObject(LunchableModel): - """ - Base Model For All Transactions to Inherit From - """ - - pass - - -class TransactionInsertObject(TransactionBaseObject): - """ - Object For Creating New Transactions - - https://lunchmoney.dev/#insert-transactions - """ - - class StatusEnum(str, Enum): - """ - Status Options, must be "cleared" or "uncleared" - """ - - cleared = "cleared" - uncleared = "uncleared" - - date: datetime.date = Field(description=_TransactionInsertDescriptions.date) - amount: float = Field(description=_TransactionInsertDescriptions.amount) - category_id: Optional[int] = Field( - None, description=_TransactionInsertDescriptions.category_id - ) - payee: Optional[str] = Field(None, description="Max 140 characters", max_length=140) - currency: Optional[str] = Field( - None, description=_TransactionInsertDescriptions.currency, max_length=3 - ) - asset_id: Optional[int] = Field( - None, description=_TransactionInsertDescriptions.asset_id - ) - recurring_id: Optional[int] = Field( - None, description=_TransactionInsertDescriptions.recurring_id - ) - notes: Optional[str] = Field(None, description="Max 350 characters", max_length=350) - status: Optional[StatusEnum] = Field( - None, description=_TransactionInsertDescriptions.status - ) - external_id: Optional[str] = Field( - None, description=_TransactionInsertDescriptions.external_id, max_length=75 - ) - tags: Optional[List[Union[str, int]]] = Field( - None, description=_TransactionInsertDescriptions.tags - ) - - -class TransactionUpdateObject(TransactionBaseObject): - """ - Object For Updating Existing Transactions - - https://lunchmoney.dev/#update-transaction - """ - - class StatusEnum(str, Enum): - """ - Status Options, must be "cleared" or "uncleared" - """ - - cleared = "cleared" - uncleared = "uncleared" - - date: Optional[datetime.date] = Field( - None, description=_TransactionUpdateDescriptions.date - ) - category_id: Optional[int] = Field( - None, description=_TransactionUpdateDescriptions.category_id - ) - payee: Optional[str] = Field(None, description="Max 140 characters", max_length=140) - amount: Optional[float] = Field( - None, description=_TransactionUpdateDescriptions.amount - ) - currency: Optional[str] = Field( - None, description=_TransactionUpdateDescriptions.currency - ) - asset_id: Optional[int] = Field( - None, description=_TransactionUpdateDescriptions.asset_id - ) - recurring_id: Optional[int] = Field( - None, description=_TransactionUpdateDescriptions.recurring_id - ) - notes: Optional[str] = Field(None, description="Max 350 characters", max_length=350) - status: Optional[StatusEnum] = Field( - None, description=_TransactionUpdateDescriptions.status - ) - external_id: Optional[str] = Field( - None, description=_TransactionUpdateDescriptions.external_id - ) - tags: Optional[List[Union[int, str]]] = Field( - None, description=_TransactionUpdateDescriptions.tags - ) - - -class TransactionSplitObject(TransactionBaseObject): - """ - Object for Splitting Transactions - - https://lunchmoney.dev/#split-object - """ - - date: datetime.date = Field(description=_TransactionSplitDescriptions.date) - category_id: Optional[int] = Field( - default=None, description=_TransactionSplitDescriptions.category_id - ) - notes: Optional[str] = Field(None, description=_TransactionSplitDescriptions.notes) - amount: float = Field(description=_TransactionSplitDescriptions.amount) - - -class FullStatusEnum(str, Enum): - """ - Status Options - """ - - cleared = "cleared" - uncleared = "uncleared" - recurring = "recurring" - recurring_suggested = "recurring_suggested" - pending = "pending" - - -class TransactionChildObject(TransactionBaseObject): - """ - Child Transaction Object for Transaction Groups - """ - - id: int = Field(description=_TransactionDescriptions.id) - amount: float = Field(description=_TransactionDescriptions.amount) - payee: Optional[str] = Field(None, description=_TransactionDescriptions.payee) - date: datetime.date = Field(description=_TransactionDescriptions.date) - formatted_date: Optional[str] = Field( - None, description=_TransactionDescriptions.formatted_date - ) - notes: Optional[str] = Field(None, description=_TransactionDescriptions.notes) - currency: Optional[str] = Field(None, description=_TransactionDescriptions.currency) - asset_id: Optional[int] = Field(None, description=_TransactionDescriptions.asset_id) - plaid_account_id: Optional[int] = Field( - None, description=_TransactionDescriptions.plaid_account_id - ) - to_base: Optional[float] = Field(None, description=_TransactionDescriptions.to_base) - - -class TransactionObject(TransactionBaseObject): - """ - Universal Lunch Money Transaction Object - - https://lunchmoney.dev/#transaction-object - """ - - id: int = Field(description=_TransactionDescriptions.id) - date: datetime.date = Field(description=_TransactionDescriptions.date) - payee: Optional[str] = Field(None, description=_TransactionDescriptions.payee) - amount: float = Field(description=_TransactionDescriptions.amount) - currency: Optional[str] = Field( - None, max_length=3, description=_TransactionDescriptions.currency - ) - to_base: Optional[float] = Field(None, description=_TransactionDescriptions.to_base) - category_id: Optional[int] = Field( - None, description=_TransactionDescriptions.category_id - ) - category_name: Optional[str] = Field( - None, description=_TransactionDescriptions.category_name - ) - category_group_id: Optional[int] = Field( - None, description=_TransactionDescriptions.category_group_id - ) - category_group_name: Optional[str] = Field( - None, description=_TransactionDescriptions.category_group_name - ) - is_income: Optional[bool] = Field( - None, description=_TransactionDescriptions.is_income - ) - exclude_from_budget: Optional[bool] = Field( - None, description=_TransactionDescriptions.exclude_from_budget - ) - exclude_from_totals: Optional[bool] = Field( - None, description=_TransactionDescriptions.exclude_from_totals - ) - created_at: datetime.datetime = Field( - description=_TransactionDescriptions.created_at - ) - updated_at: datetime.datetime = Field( - description=_TransactionDescriptions.updated_at - ) - status: Optional[str] = Field(None, description=_TransactionDescriptions.status) - is_pending: Optional[bool] = Field( - None, description=_TransactionDescriptions.is_pending - ) - notes: Optional[str] = Field(None, description=_TransactionDescriptions.notes) - original_name: Optional[str] = Field( - None, description=_TransactionDescriptions.original_name - ) - recurring_id: Optional[int] = Field( - None, description=_TransactionDescriptions.recurring_id - ) - recurring_payee: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_payee - ) - recurring_description: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_description - ) - recurring_cadence: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_cadence - ) - recurring_type: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_type - ) - recurring_amount: Optional[float] = Field( - None, description=_TransactionDescriptions.recurring_amount - ) - recurring_currency: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_currency - ) - parent_id: Optional[int] = Field( - None, description=_TransactionDescriptions.parent_id - ) - has_children: Optional[bool] = Field( - None, description=_TransactionDescriptions.has_children - ) - group_id: Optional[int] = Field(None, description=_TransactionDescriptions.group_id) - is_group: Optional[bool] = Field( - None, description=_TransactionDescriptions.is_group - ) - asset_id: Optional[int] = Field(None, description=_TransactionDescriptions.asset_id) - asset_institution_name: Optional[str] = Field( - None, description=_TransactionDescriptions.asset_institution_name - ) - asset_name: Optional[str] = Field( - None, description=_TransactionDescriptions.asset_name - ) - asset_display_name: Optional[str] = Field( - None, description=_TransactionDescriptions.asset_display_name - ) - asset_status: Optional[str] = Field( - None, description=_TransactionDescriptions.asset_status - ) - plaid_account_id: Optional[int] = Field( - None, description=_TransactionDescriptions.plaid_account_id - ) - plaid_account_name: Optional[str] = Field( - None, description=_TransactionDescriptions.plaid_account_name - ) - plaid_account_mask: Optional[str] = Field( - None, description=_TransactionDescriptions.plaid_account_mask - ) - institution_name: Optional[str] = Field( - None, description=_TransactionDescriptions.institution_name - ) - plaid_account_display_name: Optional[str] = Field( - None, description=_TransactionDescriptions.plaid_account_display_name - ) - plaid_metadata: Optional[Dict[str, Any]] = Field( - None, description=_TransactionDescriptions.plaid_metadata - ) - source: Optional[str] = Field(None, description=_TransactionDescriptions.source) - display_name: Optional[str] = Field( - None, description=_TransactionDescriptions.display_name - ) - display_notes: Optional[str] = Field( - None, description=_TransactionDescriptions.display_notes - ) - account_display_name: Optional[str] = Field( - None, description=_TransactionDescriptions.account_display_name - ) - tags: Optional[List[TagsObject]] = Field(None, description="Array of Tag objects") - external_id: Optional[str] = Field( - None, max_length=75, description=_TransactionDescriptions.external_id - ) - children: Optional[List[TransactionChildObject]] = Field( - None, description=_TransactionDescriptions.children - ) - - @field_validator("plaid_metadata", mode="before") - def to_json(cls, x: Optional[str]) -> Optional[Dict[str, Any]]: - """ - Check a result - """ - if x is None: - return None - elif isinstance(x, dict): - return x - else: - return pydantic_core.from_json(x) - - def get_update_object(self) -> TransactionUpdateObject: - """ - Return a TransactionUpdateObject - - Return a TransactionUpdateObject to update an expense. Simply - change one of the properties and perform an `update_transaction` with - your Lunchable object. - - Returns - ------- - TransactionUpdateObject - """ - update_dict = self.model_dump() - try: - TransactionUpdateObject.StatusEnum(self.status) - except ValueError: - update_dict["status"] = None - update_object = TransactionUpdateObject.model_validate(update_dict) - if update_object.tags is not None: - tags = [] if self.tags is None else self.tags - update_object.tags = [tag.name for tag in tags] - return update_object - - def get_insert_object(self) -> TransactionInsertObject: - """ - Return a TransactionInsertObject - - Return a TransactionInsertObject to update an expense. Simply - change some of the properties and perform an `insert_transactions` with - your Lunchable object. - - Returns - ------- - TransactionInsertObject - """ - insert_dict = self.model_dump() - try: - TransactionInsertObject.StatusEnum(self.status) - except ValueError: - insert_dict["status"] = None - insert_object = TransactionInsertObject.model_validate(insert_dict) - if insert_object.tags is not None: - tags = [] if self.tags is None else self.tags - insert_object.tags = [tag.name for tag in tags] - return insert_object - - -class _TransactionsResponse(LunchableModel): - """ - HTTP Response for Transactions - """ - - transactions: List[TransactionObject] - has_more: bool = False - - -class _TransactionParamsGet(LunchableModel): - """ - https://lunchmoney.dev/#get-all-transactions - """ - - tag_id: Optional[int] = None - recurring_id: Optional[int] = None - plaid_account_id: Optional[int] = None - category_id: Optional[int] = None - asset_id: Optional[int] = None - group_id: Optional[int] = None - is_group: Optional[bool] = None - status: Optional[FullStatusEnum] = None - offset: Optional[int] = None - limit: Optional[int] = None - start_date: Optional[datetime.date] = None - end_date: Optional[datetime.date] = None - debit_as_negative: Optional[bool] = None - pending: Optional[bool] = None - - -class _TransactionInsertParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#insert-transactions - """ - - transactions: List[TransactionInsertObject] - apply_rules: Optional[bool] = None - skip_duplicates: Optional[bool] = None - check_for_recurring: Optional[bool] = None - debit_as_negative: Optional[bool] = None - skip_balance_update: Optional[bool] = None - - -class _TransactionGroupParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#create-transaction-group - """ - - date: datetime.date - payee: str - category_id: Optional[int] = None - notes: Optional[str] = None - tags: Optional[List[int]] = None - transactions: List[int] - - -class _TransactionUpdateParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#update-transaction - """ - - split: Optional[List[TransactionSplitObject]] = None - transaction: Optional[TransactionUpdateObject] = None - debit_as_negative: Optional[bool] = None - skip_balance_update: Optional[bool] = None - - -class _TransactionsUnsplitPost(LunchableModel): - """ - https://lunchmoney.dev/#unsplit-transactions - """ - - parent_ids: List[int] - remove_parents: Optional[bool] = None - - -class TransactionsClient(LunchMoneyAPIClient): - """ - Lunch Money Transactions Interactions - """ - - def get_transactions( - self, - start_date: Optional[Union[datetime.date, datetime.datetime, str]] = None, - end_date: Optional[Union[datetime.date, datetime.datetime, str]] = None, - tag_id: Optional[int] = None, - recurring_id: Optional[int] = None, - plaid_account_id: Optional[int] = None, - category_id: Optional[int] = None, - asset_id: Optional[int] = None, - group_id: Optional[int] = None, - is_group: Optional[bool] = None, - status: Optional[str] = None, - offset: Optional[int] = None, - limit: Optional[int] = None, - debit_as_negative: Optional[bool] = None, - pending: Optional[bool] = None, - params: Optional[Dict[str, Any]] = None, - ) -> List[TransactionObject]: - """ - Get Transactions Using Criteria - - Use this to retrieve all transactions between a date range (this method handles - pagination automatically unless you specify a limit / offset argument). Returns - list of Transaction objects. If no query parameters are set, this will return - transactions for the current calendar month. If either start_date or end_date are - datetime.datetime objects, they will be reduced to dates. If a string is provided, - it will be attempted to be parsed as YYYY-MM-DD format. - - Parameters - ---------- - start_date: Optional[Union[datetime.date, datetime.datetime, str]] - Denotes the beginning of the time period to fetch transactions for. Defaults - to beginning of current month. Required if end_date exists. Format: YYYY-MM-DD. - end_date: Optional[Union[datetime.date, datetime.datetime, str]] - Denotes the end of the time period you'd like to get transactions for. - Defaults to end of current month. Required if start_date exists. - tag_id: Optional[int] - Filter by tag. Only accepts IDs, not names. - recurring_id: Optional[int] - Filter by recurring expense - plaid_account_id: Optional[int] - Filter by Plaid account - category_id: Optional[int] - Filter by category. Will also match category groups. - asset_id: Optional[int] - Filter by asset - group_id: Optional[int] - Filter by group_id (if the transaction is part of a specific group) - is_group: Optional[bool] - Filter by group (returns transaction groups) - status: Optional[str] - Filter by status (Can be cleared or uncleared. For recurring - transactions, use recurring) - offset: Optional[int] - Sets the offset for the records returned (disables - automatic pagination) - limit: Optional[int] - Sets the maximum number of records to return. Defaults to 1000 - (disables automatic pagination) - debit_as_negative: Optional[bool] - Pass in true if you'd like expenses to be returned as negative amounts and - credits as positive amounts. Defaults to false. - pending: Optional[bool] - Pass in true if you'd like to include imported transactions with a pending status. - params: Optional[dict] - Additional Query String Params - - Returns - ------- - List[TransactionObject] - A list of transactions - - Examples - -------- - Retrieve a list of - [TransactionObject][lunchable.models.transactions.TransactionObject] - - ```python - from lunchable import LunchMoney - - lunch = LunchMoney(access_token="xxxxxxx") - transactions = lunch.get_transactions(start_date="2020-01-01", - end_date="2020-01-31") - ``` - """ - search_params = _TransactionParamsGet( - tag_id=tag_id, - recurring_id=recurring_id, - plaid_account_id=plaid_account_id, - category_id=category_id, - asset_id=asset_id, - group_id=group_id, - is_group=is_group, - status=status, - offset=offset, - limit=limit, - start_date=start_date, - end_date=end_date, - debit_as_negative=debit_as_negative, - pending=pending, - ).model_dump(exclude_none=True) - search_params.update(params if params is not None else {}) - auto_paginate = all( - [ - offset is None, - search_params.get("offset") is None, - limit is None, - search_params.get("limit") is None, - ] - ) - transactions = self._get_transactions( - search_params=search_params, - paginate=auto_paginate, - ) - return transactions - - def _get_transactions( - self, - search_params: Dict[str, Any], - existing_transactions: Optional[List[TransactionObject]] = None, - paginate: bool = True, - ) -> List[TransactionObject]: - """ - Paginate Transactions - """ - existing_transactions = existing_transactions or [] - transaction_response = self.make_request( - method=self.Methods.GET, - url_path=APIConfig.LUNCHMONEY_TRANSACTIONS, - params=search_params, - ) - transaction_response = _TransactionsResponse.model_validate( - transaction_response - ) - existing_transactions.extend(transaction_response.transactions) - if transaction_response.has_more and paginate: - search_params["offset"] = len(existing_transactions) - return self._get_transactions( - existing_transactions=existing_transactions, - search_params=search_params, - paginate=True, - ) - return existing_transactions - - def get_transaction( - self, transaction_id: int, debit_as_negative: Optional[bool] = None - ) -> TransactionObject: - """ - Get a Transaction by ID - - Parameters - ---------- - transaction_id: int - Lunch Money Transaction ID - debit_as_negative: Optional[bool] - Pass in true if you'd like expenses to be returned as negative - amounts and credits as positive amounts. Defaults to false. - - Returns - ------- - TransactionObject - - Examples - -------- - Retrieve a single transaction by its ID - - ```python - from lunchable import LunchMoney - - lunch = LunchMoney(access_token="xxxxxxx") - transaction = lunch.get_transaction(transaction_id=1234) - ``` - - The above code returns a - [TransactionObject][lunchable.models.transactions.TransactionObject] - with ID # 1234 (assuming it exists) - """ - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCHMONEY_TRANSACTIONS, transaction_id], - params={"debit_as_negative": debit_as_negative} - if debit_as_negative is not None - else {}, - ) - return TransactionObject.model_validate(response_data) - - ListOrSingleTransactionUpdateObject = Optional[ - Union[TransactionUpdateObject, TransactionObject] - ] - - ListOrSingleTransactionInsertObject = Union[ - TransactionObject, - TransactionInsertObject, - List[TransactionObject], - List[TransactionInsertObject], - List[Union[TransactionObject, TransactionInsertObject]], - ] - - def update_transaction( - self, - transaction_id: int, - transaction: ListOrSingleTransactionUpdateObject = None, - split: Optional[List[TransactionSplitObject]] = None, - debit_as_negative: Optional[bool] = None, - skip_balance_update: Optional[bool] = None, - ) -> Dict[str, Any]: - """ - Update a Transaction - - Use this endpoint to update a single transaction. You may also use this - to split an existing transaction. If a TransactionObject is provided it will be - converted into a TransactionUpdateObject. - - PUT https://dev.lunchmoney.app/v1/transactions/:transaction_id - - Parameters - ---------- - transaction_id: int - Lunch Money Transaction ID - transaction: ListOrSingleTransactionUpdateObject - Object to update with - split: Optional[List[TransactionSplitObject]] - Defines the split of a transaction. You may not split an already-split - transaction, recurring transaction, or group transaction. - debit_as_negative: Optional[bool] - If true, will assume negative amount values denote expenses and - positive amount values denote credits. Defaults to false. - skip_balance_update: Optional[bool] - If false, will skip updating balance if an asset_id - is present for any of the transactions. - - Returns - ------- - Dict[str, Any] - - Examples - -------- - Update a transaction with a - [TransactionUpdateObject][lunchable.models.transactions.TransactionUpdateObject] - - ```python - from datetime import datetime - - from lunchable import LunchMoney, TransactionUpdateObject - - lunch = LunchMoney(access_token="xxxxxxx") - transaction_note = f"Updated on {datetime.now()}" - notes_update = TransactionUpdateObject(notes=transaction_note) - response = lunch.update_transaction(transaction_id=1234, - transaction=notes_update) - ``` - - Update a - [TransactionObject][lunchable.models.transactions.TransactionObject] - with itself - - ```python - from datetime import datetime, timedelta - - from lunchable import LunchMoney - - lunch = LunchMoney(access_token="xxxxxxx") - transaction = lunch.get_transaction(transaction_id=1234) - - transaction.notes = f"Updated on {datetime.now()}" - transaction.date = transaction.date + timedelta(days=1) - response = lunch.update_transaction(transaction_id=transaction.id, - transaction=transaction) - ``` - """ - payload = _TransactionUpdateParamsPut( - split=split, - debit_as_negative=debit_as_negative, - skip_balance_update=skip_balance_update, - ).model_dump(exclude_none=True) - if transaction is None and split is None: - raise LunchMoneyError("You must update the transaction or provide a split") - elif transaction is not None: - if isinstance(transaction, TransactionObject): - transaction = transaction.get_update_object() - payload["transaction"] = transaction.model_dump(exclude_unset=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[APIConfig.LUNCHMONEY_TRANSACTIONS, transaction_id], - payload=payload, - ) - return response_data - - def insert_transactions( - self, - transactions: ListOrSingleTransactionInsertObject, - apply_rules: Optional[bool] = None, - skip_duplicates: Optional[bool] = None, - debit_as_negative: Optional[bool] = None, - check_for_recurring: Optional[bool] = None, - skip_balance_update: Optional[bool] = None, - ) -> List[int]: - """ - Create One or Many Lunch Money Transactions - - Use this endpoint to insert many transactions at once. Also accepts - a single transaction as well. If a TransactionObject is provided it will be - converted into a TransactionInsertObject. - - https://lunchmoney.dev/#insert-transactions - - Parameters - ---------- - transactions: ListOrSingleTransactionTypeObject - Transactions to insert. Either a single TransactionInsertObject object or - a list of them - apply_rules: Optional[bool] - If true, will apply account's existing rules to the inserted transactions. - Defaults to false. - skip_duplicates: Optional[bool] - If true, the system will automatically dedupe based on transaction date, - payee and amount. Note that deduping by external_id will occur regardless - of this flag. - check_for_recurring: Optional[bool] - if true, will check new transactions for occurrences of new monthly expenses. - Defaults to false. - debit_as_negative: Optional[bool] - If true, will assume negative amount values denote expenses and - positive amount values denote credits. Defaults to false. - skip_balance_update: Optional[bool] - If false, will skip updating balance if an asset_id - is present for any of the transactions. - - Returns - ------- - List[int] - - Examples - -------- - Create a new transaction with a - [TransactionInsertObject][lunchable.models.transactions.TransactionInsertObject] - - ```python - from lunchable import LunchMoney, TransactionInsertObject - - lunch = LunchMoney(access_token="xxxxxxx") - - new_transaction = TransactionInsertObject(payee="Example Restaurant", - amount=120.00, - notes="Saturday Dinner") - new_transaction_ids = lunch.insert_transactions(transactions=new_transaction) - ``` - """ - insert_objects = [] - if not isinstance(transactions, list): - transactions = [transactions] - for item in transactions: - if isinstance(item, TransactionObject): - insert_objects.append(item.get_insert_object()) - elif isinstance(item, TransactionInsertObject): - insert_objects.append(item) - else: - raise LunchMoneyError( - "Only TransactionObjects or TransactionInsertObjects are " - "supported by this function." - ) - payload = _TransactionInsertParamsPost( - transactions=insert_objects, - apply_rules=apply_rules, - skip_duplicates=skip_duplicates, - check_for_recurring=check_for_recurring, - debit_as_negative=debit_as_negative, - skip_balance_update=skip_balance_update, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=APIConfig.LUNCHMONEY_TRANSACTIONS, - payload=payload, - ) - ids: List[int] = response_data["ids"] if response_data else [] - return ids - - def insert_transaction_group( - self, - date: datetime.date, - payee: str, - transactions: List[int], - category_id: Optional[int] = None, - notes: Optional[str] = None, - tags: Optional[List[int]] = None, - ) -> int: - """ - Create a Transaction Group of Two or More Transactions - - Returns the ID of the newly created transaction group - - Parameters - ---------- - date: datetime.date - Date for the grouped transaction - payee: str - Payee name for the grouped transaction - category_id: Optional[int] - Category for the grouped transaction - notes: Optional[str] - Notes for the grouped transaction - tags: Optional[List[int]] - Array of tag IDs for the grouped transaction - transactions: Optional[List[int]] - Array of transaction IDs to be part of the transaction group - - Returns - ------- - int - """ - if len(transactions) < 2: - raise LunchMoneyError( - "You must include 2 or more transactions " "in the Transaction Group" - ) - transaction_params = _TransactionGroupParamsPost( - date=date, - payee=payee, - category_id=category_id, - notes=notes, - tags=tags, - transactions=transactions, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=[ - APIConfig.LUNCHMONEY_TRANSACTIONS, - APIConfig.LUNCHMONEY_TRANSACTION_GROUPS, - ], - payload=transaction_params, - ) - return response_data - - def remove_transaction_group(self, transaction_group_id: int) -> List[int]: - """ - Delete a Transaction Group - - Use this method to delete a transaction group. The transactions within the - group will not be removed. - - Returns the IDs of the transactions that were part of the deleted group - - https://lunchmoney.dev/#delete-transaction-group - - Parameters - ---------- - transaction_group_id: int - Transaction Group Identifier - - Returns - ------- - List[int] - """ - response_data = self.make_request( - method=self.Methods.DELETE, - url_path=[ - APIConfig.LUNCHMONEY_TRANSACTIONS, - APIConfig.LUNCHMONEY_TRANSACTION_GROUPS, - transaction_group_id, - ], - ) - return response_data["transactions"] - - def unsplit_transactions( - self, parent_ids: List[int], remove_parents: Optional[bool] = None - ) -> List[int]: - """ - Unsplit Transactions - - Use this endpoint to unsplit one or more transactions. - - Returns an array of IDs of deleted transactions - - https://lunchmoney.dev/#unsplit-transactions - - Parameters - ---------- - parent_ids: List[int] - Array of transaction IDs to unsplit. If one transaction is unsplittable, - no transaction will be unsplit. - remove_parents: Optional[bool] - If true, deletes the original parent transaction as well. Note, - this is unreversable! - - Returns - ------- - List[int] - """ - response_data = self.make_request( - method=self.Methods.POST, - url_path=[APIConfig.LUNCHMONEY_TRANSACTIONS, "unsplit"], - payload=_TransactionsUnsplitPost( - parent_ids=parent_ids, remove_parents=remove_parents - ).model_dump(exclude_none=True), - ) - return response_data - - def get_transaction_group(self, transaction_id: int) -> TransactionObject: - """ - Get a Transaction Group - - Parameters - ---------- - transaction_id: int - Transaction ID of either the parent or any of the children - in the transaction group - - Returns - ------- - TransactionObject - The transaction group as a `TransactionObject` - """ - response_data = self.make_request( - method=self.Methods.GET, - params={"transaction_id": transaction_id}, - url_path=[ - APIConfig.LUNCHMONEY_TRANSACTIONS, - APIConfig.LUNCHMONEY_TRANSACTION_GROUPS, - ], - ) - return TransactionObject.model_validate(response_data) diff --git a/lunchable/models/user.py b/lunchable/models/user.py deleted file mode 100644 index 6830368c..00000000 --- a/lunchable/models/user.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -Lunch Money - User - -https://lunchmoney.dev/#user -""" - -import logging -from typing import Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient - -logger = logging.getLogger(__name__) - - -class UserObject(LunchableModel): - """ - The LunchMoney `User` object - - https://lunchmoney.dev/#user-object - """ - - user_id: int = Field(description="Unique identifier for user") - user_name: str = Field(description="User's' name") - user_email: str = Field(description="User's' Email") - account_id: int = Field( - description="Unique identifier for the associated budgeting account" - ) - budget_name: str = Field(description="Name of the associated budgeting account") - api_key_label: Optional[str] = Field( - None, - description="User-defined label of the developer API key used. " - "Returns null if nothing has been set.", - ) - - -class UserClient(LunchMoneyAPIClient): - """ - Lunch Money Interactions for Non Finance Operations - """ - - def get_user(self) -> UserObject: - """ - Get Personal User Details - - Use this endpoint to get details on the current user. - - https://lunchmoney.dev/#get-user - - Returns - ------- - UserObject - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=APIConfig.LUNCHMONEY_ME - ) - me = UserObject.model_validate(response_data) - return me diff --git a/lunchable/plugins/__init__.py b/lunchable/plugins/__init__.py deleted file mode 100644 index e79bd437..00000000 --- a/lunchable/plugins/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -""" -Optional Plugins for LunchMoney -""" - -from lunchable.plugins.app import LunchableApp, LunchableModelType - -__all__ = [ - "LunchableApp", - "LunchableModelType", -] diff --git a/lunchable/plugins/app.py b/lunchable/plugins/app.py deleted file mode 100644 index 424e454e..00000000 --- a/lunchable/plugins/app.py +++ /dev/null @@ -1,398 +0,0 @@ -""" -Base Classes for lunchable-app -""" - -from __future__ import annotations - -import datetime -import functools -import logging -from abc import ABC, abstractmethod -from typing import Any, Callable, ClassVar, Dict, List, Tuple, Type, TypeVar, overload - -from pydantic import BaseModel, Field - -from lunchable import LunchMoney -from lunchable.models import ( - AssetsObject, - CategoriesObject, - CryptoObject, - LunchableModel, - PlaidAccountObject, - TagsObject, - TransactionObject, - UserObject, -) - -logger = logging.getLogger(__name__) - -LunchableModelType = TypeVar("LunchableModelType", bound=LunchableModel) - - -class LunchableData(BaseModel): - """ - Data Container for Lunchable App Data - """ - - plaid_accounts: Dict[int, PlaidAccountObject] = Field( - default_factory=dict, description="Plaid Accounts" - ) - transactions: Dict[int, TransactionObject] = Field( - default_factory=dict, description="Transactions" - ) - categories: Dict[int, CategoriesObject] = Field( - default_factory=dict, description="Categories" - ) - assets: Dict[int, AssetsObject] = Field(default_factory=dict, description="Assets") - tags: Dict[int, TagsObject] = Field(default_factory=dict, description="Tags") - crypto: Dict[int, CryptoObject] = Field(default_factory=dict, description="Crypto") - user: UserObject = Field( - UserObject( - user_id=0, user_name="", user_email="", account_id=0, budget_name="" - ), - description="User", - ) - - @property - def asset_map(self) -> Dict[int, PlaidAccountObject | AssetsObject]: - """ - Asset Mapping Across Plaid Accounts and Assets - - Returns - ------- - Dict[int, Union[PlaidAccountObject, AssetsObject]] - """ - return { - **self.plaid_accounts, - **self.assets, - } - - @property - def plaid_accounts_list(self) -> List[PlaidAccountObject]: - """ - List of Plaid Accounts - - Returns - ------- - List[PlaidAccountObject] - """ - return list(self.plaid_accounts.values()) - - @property - def assets_list(self) -> List[AssetsObject]: - """ - List of Assets - - Returns - ------- - List[AssetsObject] - """ - return list(self.assets.values()) - - @property - def transactions_list(self) -> List[TransactionObject]: - """ - List of Transactions - - Returns - ------- - List[TransactionObject] - """ - return list(self.transactions.values()) - - @property - def categories_list(self) -> List[CategoriesObject]: - """ - List of Categories - - Returns - ------- - List[CategoriesObject] - """ - return list(self.categories.values()) - - @property - def tags_list(self) -> List[TagsObject]: - """ - List of Tags - - Returns - ------- - List[TagsObject] - """ - return list(self.tags.values()) - - @property - def crypto_list(self) -> List[CryptoObject]: - """ - List of Crypto - - Returns - ------- - List[CryptoObject] - """ - return list(self.crypto.values()) - - -class BaseLunchableApp(ABC): - """ - Abstract Base Class for Lunchable Apps - """ - - @property - def _lunchable_data_mapping( - self, - ) -> Dict[ - Type[LunchableModel], - Tuple[str, Callable[[], List[LunchableModel] | LunchableModel]], - ]: - """ - Mapping of Lunchable Objects to their Data Collecting Info - """ - return { - PlaidAccountObject: ("plaid_accounts", self.lunch.get_plaid_accounts), - TransactionObject: ("transactions", self.lunch.get_transactions), - CategoriesObject: ("categories", self.lunch.get_categories), - AssetsObject: ("assets", self.lunch.get_assets), - TagsObject: ("tags", self.lunch.get_tags), - UserObject: ("user", self.lunch.get_user), - CryptoObject: ("crypto", self.lunch.get_crypto), - } - - def __init__(self, access_token: str | None = None): - """ - Lunchable App Initialization - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token. Inherited from - `LUNCHMONEY_ACCESS_TOKEN` environment variable if not provided - """ - self.lunch = LunchMoney(access_token=access_token) - self.data = LunchableData() - - @property - @abstractmethod - def lunchable_models(self) -> List[Type[LunchableModel]]: - """ - Every LunchableApp should define which data objects it depends on - - Returns - ------- - List[LunchableDataModel] - """ - - @overload - def refresh(self, model: Type[UserObject], **kwargs: Any) -> UserObject: - ... - - @overload - def refresh( - self, model: Type[LunchableModelType], **kwargs: Any - ) -> Dict[int, LunchableModelType]: - ... - - def refresh( - self, model: Type[LunchableModel], **kwargs: Any - ) -> LunchableModel | Dict[int, LunchableModel]: - """ - Refresh a Lunchable Model - - Parameters - ---------- - model: Type[LunchableModel] - Type of Lunchable Model to refresh - kwargs: Any - Additional keyword arguments to pass to the function that - fetches the data. - - Returns - ------- - LunchableModel | Dict[int, LunchableModel] - Unless you're requesting the `UserObject`, this method will return a - dictionary of the refreshed data, keyed by the object's ID. - - Examples - -------- - ```python - from typing import Dict - - from lunchable.models import CategoriesObject - from lunchable.plugins import LunchableApp - - app = LunchableApp() - categories: Dict[int, CategoriesObject] = app.refresh(CategoriesObject) - ``` - """ - try: - attr_name, data_getter = self._lunchable_data_mapping[model] - fetch_data_function = functools.partial(data_getter, **kwargs) - except KeyError as e: - msg = f"Model not supported by Lunchable App: {model.__name__}" - raise NotImplementedError(msg) from e - fetched_data = fetch_data_function() - if isinstance(fetched_data, UserObject): - data_mapping = fetched_data - else: - data_mapping = {item.id: item for item in fetched_data} # type: ignore[assignment] - setattr(self.data, attr_name, data_mapping) - return data_mapping - - def refresh_data(self, models: List[Type[LunchableModel]] | None = None) -> None: - """ - Refresh the data in the Lunchable App - - Parameters - ---------- - models: List[Type[LunchableModel]] | None - Explicit list of Lunchable Models to refresh. If not provided, - all models defined in will be refreshed (which by default is - all of them except for transactions) - - Examples - -------- - ```python - from typing import Dict - - from lunchable.models import PlaidAccountObject - from lunchable.plugins import LunchableApp - - app = LunchableApp() - app.refresh_data() - plaid_accounts: Dict[int, PlaidAccountObject] = app.data.plaid_accounts - ``` - - ```python - from typing import Dict - - from lunchable.models import AssetsObject - from lunchable.plugins import LunchableApp - - app = LunchableApp() - app.refresh_data(models=[AssetsObject]) - assets: Dict[int, AssetsObject] = app.data.assets - ``` - """ - refresh_models = models or self.lunchable_models - for model in refresh_models: - self.refresh(model) - - def refresh_transactions( - self, - start_date: datetime.date | datetime.datetime | str | None = None, - end_date: datetime.date | datetime.datetime | str | None = None, - tag_id: int | None = None, - recurring_id: int | None = None, - plaid_account_id: int | None = None, - category_id: int | None = None, - asset_id: int | None = None, - group_id: int | None = None, - is_group: bool | None = None, - status: str | None = None, - debit_as_negative: bool | None = None, - pending: bool | None = None, - params: Dict[str, Any] | None = None, - ) -> Dict[int, TransactionObject]: - """ - Refresh App data with the latest transactions - - Parameters - ---------- - start_date: Optional[Union[datetime.date, datetime.datetime, str]] - Denotes the beginning of the time period to fetch transactions for. - Defaults to beginning of current month. Required if end_date exists. - Format: YYYY-MM-DD. - end_date: Optional[Union[datetime.date, datetime.datetime, str]] - Denotes the end of the time period you'd like to get transactions for. - Defaults to end of current month. Required if start_date exists. - tag_id: Optional[int] - Filter by tag. Only accepts IDs, not names. - recurring_id: Optional[int] - Filter by recurring expense - plaid_account_id: Optional[int] - Filter by Plaid account - category_id: Optional[int] - Filter by category. Will also match category groups. - asset_id: Optional[int] - Filter by asset - group_id: Optional[int] - Filter by group_id (if the transaction is part of a specific group) - is_group: Optional[bool] - Filter by group (returns transaction groups) - status: Optional[str] - Filter by status (Can be cleared or uncleared. For recurring - transactions, use recurring) - debit_as_negative: Optional[bool] - Pass in true if you'd like expenses to be returned as negative amounts and - credits as positive amounts. Defaults to false. - pending: Optional[bool] - Pass in true if you'd like to include imported transactions with a - pending status. - params: Optional[dict] - Additional Query String Params - - Returns - ------- - Dict[int, TransactionObject] - - Examples - -------- - ```python - from typing import Dict - - from lunchable.models import TransactionObject - from lunchable.plugins import LunchableApp - - app = LunchableApp() - transactions: Dict[int, TransactionObject] = app.refresh_transactions( - start_date="2021-01-01", end_date="2021-01-31" - ) - ``` - """ - transactions = self.lunch.get_transactions( - start_date=start_date, - end_date=end_date, - tag_id=tag_id, - recurring_id=recurring_id, - plaid_account_id=plaid_account_id, - category_id=category_id, - asset_id=asset_id, - group_id=group_id, - is_group=is_group, - status=status, - debit_as_negative=debit_as_negative, - pending=pending, - params=params, - ) - transaction_map = {item.id: item for item in transactions} - self.data.transactions.update(transaction_map) - return transaction_map - - def clear_transactions(self) -> None: - """ - Clear Transactions from the App - """ - self.data.transactions.clear() - - -class LunchableApp(BaseLunchableApp): - """ - Pre-Built Lunchable App - - This app comes with a `data` property which represents all the base data - the app should need. - - This app comes with a `refresh_data` method which will refresh all of the - data in the app, except for transactions. To refresh transactions, use the - `refresh_transactions` method. - """ - - lunchable_models: ClassVar[List[Type[LunchableModel]]] = [ - PlaidAccountObject, - CategoriesObject, - AssetsObject, - TagsObject, - UserObject, - CryptoObject, - ] diff --git a/lunchable/py.typed b/lunchable/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/mkdocs.yaml b/mkdocs.yaml deleted file mode 100644 index 72ff4005..00000000 --- a/mkdocs.yaml +++ /dev/null @@ -1,82 +0,0 @@ -# $schema: https://squidfunk.github.io/mkdocs-material/schema.json - -site_name: lunchable -nav: -- Home 🏠: index.md -- Usage 📖: usage.md -- LunchMoney 🍽️: interacting.md -- Apps and Plugins 🧩: plugins.md -- Command Line Interface ⌨️: cli.md -- API Documentation 🤖: reference/ -- Contributing 🤝: contributing.md -theme: - favicon: https://juftin.com/favicon.ico - logo: https://raw.githubusercontent.com/juftin/juftin/main/static/juftin.png - name: material - features: - - navigation.tracking - - content.code.annotate - - content.code.copy - - navigation.indexes - palette: - - media: '(prefers-color-scheme: light)' - scheme: default - accent: purple - toggle: - icon: material/weather-sunny - name: Switch to dark mode - - media: '(prefers-color-scheme: dark)' - scheme: slate - primary: black - toggle: - icon: material/weather-night - name: Switch to light mode -repo_url: https://github.com/juftin/lunchable -repo_name: lunchable -edit_uri: blob/main/docs/ -site_author: juftin -remote_branch: gh-pages -#copyright: Copyright © 2023 Justin Flannery -extra: - generator: false -markdown_extensions: -- toc: - permalink: '#' -- pymdownx.snippets: -- pymdownx.magiclink -- attr_list -- md_in_html -- pymdownx.highlight: - anchor_linenums: true -- pymdownx.inlinehilite -- pymdownx.superfences -- markdown.extensions.attr_list -- pymdownx.keys -- pymdownx.tasklist -- pymdownx.tilde -- callouts -- pymdownx.details -- pymdownx.emoji -- pymdownx.tabbed: - alternate_style: true -- mkdocs-click: -plugins: -- search -- markdown-exec -- section-index -- autorefs -- mkdocstrings: - handlers: - python: - import: - - https://docs.python.org/3/objects.inv - - https://pandas.pydata.org/docs/objects.inv - options: - docstring_style: numpy - extensions: - - griffe_fieldz -- gen-files: - scripts: - - docs/gen_pages.py -- literate-nav: - nav_file: SUMMARY.md diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 9bd55549..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,240 +0,0 @@ -[build-system] -build-backend = "hatchling.build" -requires = ["hatchling"] - -[project] -authors = [ - {name = "Justin Flannery", email = "juftin@juftin.com"} -] -classifiers = [ - "License :: OSI Approved :: MIT License", - "Development Status :: 5 - Production/Stable", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy" -] -dependencies = [ - "click>=8.0.1", - "pydantic>=2,<3", - "rich>=10.0.0", - "httpx", - "importlib_metadata>=3.6", - "click-plugins>=1.1.1" -] -description = "A simple Python SDK around the Lunch Money Developer API" -dynamic = ["version"] -keywords = ["lunchmoney", "python", "pydantic", "api-client"] -license = "MIT" -name = "lunchable" -readme = "README.md" -requires-python = ">=3.8,<4" - -[project.optional-dependencies] -all = [ - "lunchable-primelunch", - "lunchable-pushlunch", - "lunchable-splitlunch" -] -plugins = [ - "lunchable-primelunch", - "lunchable-pushlunch", - "lunchable-splitlunch" -] -primelunch = ["lunchable-primelunch"] -pushlunch = ["lunchable-pushlunch"] -splitlunch = ["lunchable-splitlunch"] - -[project.scripts] -lunchable = "lunchable._cli:cli" - -[project.urls] -Changelog = "https://github.com/juftin/lunchable/releases" -Discussions = "https://github.com/juftin/lunchable/discussions" -Docker = "https://hub.docker.com/r/juftin/lunchable" -Documentation = "https://github.com/juftin/lunchable#readme" -Issues = "https://github.com/juftin/lunchable/issues" -Source = "https://github.com/juftin/lunchable" - -[tool.coverage.paths] -lunchable = ["lunchable", "*/lunchable/lunchable"] -tests = ["tests", "*/lunchable/tests"] - -[tool.coverage.report] -exclude_lines = [ - "no cov", - "if __name__ == .__main__.:", - "if TYPE_CHECKING:" -] - -[tool.coverage.run] -branch = true -omit = [ - "lunchable/_version.py" -] -parallel = true -source_pkgs = ["lunchable", "tests"] - -[tool.hatch.env] -requires = ["hatch-pip-compile", "hatch-mkdocs"] - -[tool.hatch.env.collectors.mkdocs.docs] -path = "mkdocs.yaml" - -[tool.hatch.envs.all] -pip-compile-constraint = "" -template = "test" - -[[tool.hatch.envs.all.matrix]] -python = ["3.8", "3.9", "3.10", "3.11", "3.12"] - -[tool.hatch.envs.default] -features = ["all"] -pip-compile-args = [ - "--unsafe-package", - "lunchable" -] -pip-compile-constraint = "default" -post-install-commands = [ - "- pre-commit install" -] -type = "pip-compile" - -[tool.hatch.envs.default.scripts] -cov = "hatch run test:cov {args:}" -test = "hatch run test:test {args:}" - -[tool.hatch.envs.docs] -detached = false -extra-dependencies = [ - "griffe-fieldz" -] -features = ["all"] -pip-compile-args = [ - "--unsafe-package", - "lunchable" -] -pip-compile-constraint = "default" -template = "docs" -type = "pip-compile" - -[tool.hatch.envs.gen] -detached = true - -[tool.hatch.envs.gen.scripts] -release = [ - "npm install --prefix .github/semantic_release/", - "npx --prefix .github/semantic_release/ semantic-release {args:}" -] - -[tool.hatch.envs.lint] -dependencies = [ - "mypy>=1.6.1", - "ruff~=0.1.7", - "pydantic" -] -detached = true -pip-compile-constraint = "default" -type = "pip-compile" - -[tool.hatch.envs.lint.scripts] -all = [ - "style", - "typing" -] -fmt = [ - "ruff format {args:.}", - "ruff --fix {args:.}", - "style" -] -precommit = [ - "pre-commit run --all-files" -] -style = [ - "ruff {args:.}", - "ruff format --check --diff {args:.}" -] -typing = [ - """ - mypy \ - --install-types \ - --ignore-missing-imports \ - --follow-imports=skip \ - --strict-optional \ - --non-interactive \ - {args:lunchable/} - """ -] - -[tool.hatch.envs.test] -dependencies = [ - "pytest", - "pytest-cov", - "pytest-mock", - "vcrpy~=5.1.0" -] - -[tool.hatch.envs.test.scripts] -cov = "pytest --cov --cov-config=pyproject.toml --cov-report term-missing {args:tests}" -test = "pytest {args:tests}" - -[tool.hatch.version] -path = "lunchable/_version.py" - -[tool.mypy] -check_untyped_defs = true -disallow_any_generics = true -disallow_untyped_defs = true -follow_imports = "silent" -no_implicit_reexport = true -plugins = [ - "pydantic.mypy" -] -warn_redundant_casts = true -warn_unused_ignores = true - -[[tool.mypy.overrides]] -ignore_missing_imports = true -module = [ - "pytest.*" -] - -[tool.pydantic-mypy] -init_forbid_extra = true -init_typed = true -warn_required_dynamic_aliases = true -warn_untyped_fields = true - -[tool.ruff] -ignore = [ - "E501", # line too long, handled by black - "PLR0913", # Too many arguments to function call - "PLW2901", # Outer for loop variable overwritten by inner assignment target - "RUF001", # String contains ambiguous unicode character `’` - "PLR2004", # Magic value used in comparison - "RUF012" # Mutable class attributes should be annotated with `typing.ClassVar` -] -select = [ - "E", # pycodestyle errors - "W", # pycodestyle warnings - "F", # pyflakes - "I", # isort - "C", # flake8-comprehensions - "Q", # flake8-quotes - "B", # flake8-bugbear - "PLE", # pylint - "PLR", # pylint - "PLW", # pylint - "RUF", # ruff - "C90" # mccabe -] - -[tool.ruff.per-file-ignores] -"tests/**" = [ - "PLR2004" # Magic value used in comparison -] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index b9f7ed4b..00000000 --- a/requirements.txt +++ /dev/null @@ -1,117 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.default - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.default - # lunchable -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.default - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests -importlib-metadata==7.0.1 - # via - # hatch.envs.default - # lunchable -lunchable-primelunch==1.0.1 - # via hatch.envs.default -lunchable-pushlunch==1.0.1 - # via hatch.envs.default -lunchable-splitlunch==1.0.1 - # via hatch.envs.default -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -pandas==2.2.0 - # via lunchable-primelunch -pydantic==2.6.0 - # via - # hatch.envs.default - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.default - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -typing-extensions==4.9.0 - # via - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==2.1.0 - # via requests -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.10.txt b/requirements/requirements-all.py3.10.txt deleted file mode 100644 index 970802b6..00000000 --- a/requirements/requirements-all.py3.10.txt +++ /dev/null @@ -1,160 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.10 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.10 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.10 - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -exceptiongroup==1.2.0 - # via - # anyio - # pytest -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.10 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.10 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.10 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.10 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.10 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.10 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.10 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.10 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.10 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.10 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -tomli==2.0.1 - # via - # coverage - # pytest -typing-extensions==4.9.0 - # via - # anyio - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==2.1.0 - # via requests -vcrpy==5.1.0 - # via hatch.envs.all.py3.10 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.11.txt b/requirements/requirements-all.py3.11.txt deleted file mode 100644 index 48366d14..00000000 --- a/requirements/requirements-all.py3.11.txt +++ /dev/null @@ -1,151 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.11 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.11 - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.11 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.11 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.11 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.11 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.11 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.11 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.11 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.11 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.11 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.11 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -typing-extensions==4.9.0 - # via - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==2.1.0 - # via requests -vcrpy==5.1.0 - # via hatch.envs.all.py3.11 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.12.txt b/requirements/requirements-all.py3.12.txt deleted file mode 100644 index beaa61ab..00000000 --- a/requirements/requirements-all.py3.12.txt +++ /dev/null @@ -1,151 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.12 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.12 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.12 - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.12 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.12 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.12 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.12 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.12 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.12 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.12 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.12 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.12 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.12 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -typing-extensions==4.9.0 - # via - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==2.1.0 - # via requests -vcrpy==5.1.0 - # via hatch.envs.all.py3.12 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.8.txt b/requirements/requirements-all.py3.8.txt deleted file mode 100644 index c391317e..00000000 --- a/requirements/requirements-all.py3.8.txt +++ /dev/null @@ -1,164 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.8 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.8 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.8 - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -exceptiongroup==1.2.0 - # via - # anyio - # pytest -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.8 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.8 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.8 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.8 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.8 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.24.4 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.0.3 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.8 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.8 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.8 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.8 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.8 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -tomli==2.0.1 - # via - # coverage - # pytest -typing-extensions==4.9.0 - # via - # annotated-types - # anyio - # pydantic - # pydantic-core - # rich -tzdata==2023.4 - # via pandas -urllib3==1.26.18 - # via - # requests - # vcrpy -vcrpy==5.1.0 - # via hatch.envs.all.py3.8 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.9.txt b/requirements/requirements-all.py3.9.txt deleted file mode 100644 index 5885f4de..00000000 --- a/requirements/requirements-all.py3.9.txt +++ /dev/null @@ -1,160 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.9 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.9 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.9 - # lunchable -coverage==7.4.1 - # via pytest-cov -exceptiongroup==1.2.0 - # via - # anyio - # pytest -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.9 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.9 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.9 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.9 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.9 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.9 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.9 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.9 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.9 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.9 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -tomli==2.0.1 - # via - # coverage - # pytest -typing-extensions==4.9.0 - # via - # anyio - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==1.26.18 - # via - # requests - # vcrpy -vcrpy==5.1.0 - # via hatch.envs.all.py3.9 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-docs.txt b/requirements/requirements-docs.txt deleted file mode 100644 index 61994b5c..00000000 --- a/requirements/requirements-docs.txt +++ /dev/null @@ -1,294 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# [constraints] requirements.txt (SHA256: acd01d83136975a189aa0febb52cc548a7e3f3fab4bbc2a61aaf4f2ff45ab979) -# -# - markdown-callouts -# - markdown-exec -# - mkdocs -# - mkdocs-autorefs -# - mkdocs-click -# - mkdocs-gen-files -# - mkdocs-literate-nav -# - mkdocs-material -# - mkdocs-section-index -# - mkdocstrings -# - mkdocstrings-python -# - pymdown-extensions -# - griffe-fieldz -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via - # -c requirements.txt - # pydantic -anyio==4.2.0 - # via - # -c requirements.txt - # httpx -babel==2.14.0 - # via mkdocs-material -certifi==2023.11.17 - # via - # -c requirements.txt - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via - # -c requirements.txt - # requests -click==8.1.7 - # via - # -c requirements.txt - # hatch.envs.docs - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch - # mkdocs - # mkdocs-click - # mkdocstrings -click-plugins==1.1.1 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable -colorama==0.4.6 - # via - # griffe - # mkdocs-material -fieldz==0.0.2 - # via griffe-fieldz -ghp-import==2.1.0 - # via mkdocs -griffe==0.40.0 - # via - # griffe-fieldz - # mkdocstrings-python -griffe-fieldz==0.1.2 - # via hatch.envs.docs -h11==0.14.0 - # via - # -c requirements.txt - # httpcore -httpcore==1.0.2 - # via - # -c requirements.txt - # httpx -httpx==0.26.0 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable -idna==3.6 - # via - # -c requirements.txt - # anyio - # httpx - # requests -importlib-metadata==7.0.1 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable -jinja2==3.1.3 - # via - # mkdocs - # mkdocs-material - # mkdocstrings -lunchable-primelunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.docs -lunchable-pushlunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.docs -lunchable-splitlunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.docs -markdown==3.5.2 - # via - # markdown-callouts - # mkdocs - # mkdocs-autorefs - # mkdocs-click - # mkdocs-material - # mkdocstrings - # pymdown-extensions -markdown-callouts==0.4.0 - # via hatch.envs.docs -markdown-exec==1.8.0 - # via hatch.envs.docs -markdown-it-py==3.0.0 - # via - # -c requirements.txt - # rich -markupsafe==2.1.5 - # via - # jinja2 - # mkdocs - # mkdocstrings -mdurl==0.1.2 - # via - # -c requirements.txt - # markdown-it-py -mergedeep==1.3.4 - # via mkdocs -mkdocs==1.5.3 - # via - # hatch.envs.docs - # mkdocs-autorefs - # mkdocs-gen-files - # mkdocs-literate-nav - # mkdocs-material - # mkdocs-section-index - # mkdocstrings -mkdocs-autorefs==0.5.0 - # via - # hatch.envs.docs - # mkdocstrings -mkdocs-click==0.8.1 - # via hatch.envs.docs -mkdocs-gen-files==0.5.0 - # via hatch.envs.docs -mkdocs-literate-nav==0.6.1 - # via hatch.envs.docs -mkdocs-material==9.5.8 - # via hatch.envs.docs -mkdocs-material-extensions==1.3.1 - # via mkdocs-material -mkdocs-section-index==0.3.8 - # via hatch.envs.docs -mkdocstrings==0.24.0 - # via - # hatch.envs.docs - # mkdocstrings-python -mkdocstrings-python==1.8.0 - # via hatch.envs.docs -numpy==1.26.3 - # via - # -c requirements.txt - # pandas -oauthlib==3.2.2 - # via - # -c requirements.txt - # requests-oauthlib -packaging==23.2 - # via mkdocs -paginate==0.5.6 - # via mkdocs-material -pandas==2.2.0 - # via - # -c requirements.txt - # lunchable-primelunch -pathspec==0.12.1 - # via mkdocs -platformdirs==4.2.0 - # via - # mkdocs - # mkdocstrings -pydantic==2.6.0 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable -pydantic-core==2.16.1 - # via - # -c requirements.txt - # pydantic -pygments==2.17.2 - # via - # -c requirements.txt - # mkdocs-material - # rich -pymdown-extensions==10.7 - # via - # hatch.envs.docs - # markdown-exec - # mkdocs-material - # mkdocstrings -python-dateutil==2.8.2 - # via - # -c requirements.txt - # ghp-import - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via - # -c requirements.txt - # pandas -pyyaml==6.0.1 - # via - # mkdocs - # pymdown-extensions - # pyyaml-env-tag -pyyaml-env-tag==0.1 - # via mkdocs -regex==2023.12.25 - # via mkdocs-material -requests==2.31.0 - # via - # -c requirements.txt - # mkdocs-material - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via - # -c requirements.txt - # splitwise -rich==13.7.0 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via - # -c requirements.txt - # python-dateutil -sniffio==1.3.0 - # via - # -c requirements.txt - # anyio - # httpx -splitwise==2.5.0 - # via - # -c requirements.txt - # lunchable-splitlunch -typing-extensions==4.9.0 - # via - # -c requirements.txt - # fieldz - # pydantic - # pydantic-core -tzdata==2023.4 - # via - # -c requirements.txt - # pandas -urllib3==2.1.0 - # via - # -c requirements.txt - # requests -watchdog==4.0.0 - # via mkdocs -zipp==3.17.0 - # via - # -c requirements.txt - # importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-lint.txt b/requirements/requirements-lint.txt deleted file mode 100644 index b89cde56..00000000 --- a/requirements/requirements-lint.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# [constraints] requirements.txt (SHA256: acd01d83136975a189aa0febb52cc548a7e3f3fab4bbc2a61aaf4f2ff45ab979) -# -# - mypy>=1.6.1 -# - ruff~=0.1.7 -# - pydantic -# - -annotated-types==0.6.0 - # via - # -c requirements.txt - # pydantic -mypy==1.8.0 - # via hatch.envs.lint -mypy-extensions==1.0.0 - # via mypy -pydantic==2.6.0 - # via - # -c requirements.txt - # hatch.envs.lint -pydantic-core==2.16.1 - # via - # -c requirements.txt - # pydantic -ruff==0.1.14 - # via hatch.envs.lint -typing-extensions==4.9.0 - # via - # -c requirements.txt - # mypy - # pydantic - # pydantic-core diff --git a/requirements/requirements-test.txt b/requirements/requirements-test.txt deleted file mode 100644 index 8d528777..00000000 --- a/requirements/requirements-test.txt +++ /dev/null @@ -1,209 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# [constraints] requirements.txt (SHA256: acd01d83136975a189aa0febb52cc548a7e3f3fab4bbc2a61aaf4f2ff45ab979) -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via - # -c requirements.txt - # pydantic -anyio==4.2.0 - # via - # -c requirements.txt - # httpx -certifi==2023.11.17 - # via - # -c requirements.txt - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via - # -c requirements.txt - # requests -click==8.1.7 - # via - # -c requirements.txt - # hatch.envs.test - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -h11==0.14.0 - # via - # -c requirements.txt - # httpcore -httpcore==1.0.2 - # via - # -c requirements.txt - # httpx -httpx==0.26.0 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable -idna==3.6 - # via - # -c requirements.txt - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.test -lunchable-pushlunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.test -lunchable-splitlunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.test -markdown-it-py==3.0.0 - # via - # -c requirements.txt - # rich -mdurl==0.1.2 - # via - # -c requirements.txt - # markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via - # -c requirements.txt - # pandas -oauthlib==3.2.2 - # via - # -c requirements.txt - # requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via - # -c requirements.txt - # lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable -pydantic-core==2.16.1 - # via - # -c requirements.txt - # pydantic -pygments==2.17.2 - # via - # -c requirements.txt - # rich -pytest==8.0.0 - # via - # hatch.envs.test - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.test -pytest-mock==3.12.0 - # via hatch.envs.test -python-dateutil==2.8.2 - # via - # -c requirements.txt - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via - # -c requirements.txt - # pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # -c requirements.txt - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via - # -c requirements.txt - # splitwise -rich==13.7.0 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via - # -c requirements.txt - # python-dateutil -sniffio==1.3.0 - # via - # -c requirements.txt - # anyio - # httpx -splitwise==2.5.0 - # via - # -c requirements.txt - # lunchable-splitlunch -typing-extensions==4.9.0 - # via - # -c requirements.txt - # pydantic - # pydantic-core -tzdata==2023.4 - # via - # -c requirements.txt - # pandas -urllib3==2.1.0 - # via - # -c requirements.txt - # requests -vcrpy==5.1.0 - # via hatch.envs.test -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via - # -c requirements.txt - # importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index 2d1cd253..00000000 --- a/tests/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -Lunchmoney Tests -""" diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index 28fcacac..00000000 --- a/tests/conftest.py +++ /dev/null @@ -1,176 +0,0 @@ -""" -Pytest Fixtures Shared Across all Unit Tests -""" - -import datetime -import os -import pathlib -from typing import List - -import pytest -from vcr import VCR - -from lunchable import LunchMoney -from lunchable.models import TransactionObject - -obscure_start_date_object = datetime.datetime(year=2022, month=11, day=1) -beginning_of_this_month = datetime.datetime.now().replace(day=1) -module_scope = pytest.fixture(scope="module") - - -@pytest.fixture(autouse=True) -def set_test_env_vars(monkeypatch: pytest.MonkeyPatch) -> None: - """ - Set Environment Variables for Testing if they are not already set - """ - testing_env_vars = [ - "LUNCHMONEY_ACCESS_TOKEN", - "PUSHOVER_USER_KEY", - "SPLITWISE_API_KEY", - "SPLITWISE_CONSUMER_KEY", - "SPLITWISE_CONSUMER_SECRET", - ] - for env_var in testing_env_vars: - if not os.getenv(env_var): - monkeypatch.setenv(env_var, f"{env_var}_PLACEHOLDER") - - -@pytest.fixture -def obscure_start_date() -> datetime.datetime: - """ - An Obscure Hardcoded Date - - Returns - ------- - datetime.datetime - """ - return obscure_start_date_object - - -@pytest.fixture -def lunch_money_obj() -> LunchMoney: - """ - Static LunchMoney Instance - - Returns - ------- - LunchMoney - """ - lunch_money_obj = LunchMoney() - assert isinstance(lunch_money_obj, LunchMoney) - return lunch_money_obj - - -@pytest.fixture -def test_transactions() -> List[TransactionObject]: - """ - Load some example transactions - """ - transaction_dict_1 = { - "amount": 1.0, - "asset_id": 49335, - "category_id": 658761, - "currency": "usd", - "date": "2021-09-19", - "external_id": None, - "fees": None, - "group_id": None, - "id": 546434801, - "is_group": False, - "notes": "Test Transaction 1", - "original_name": "Test 1", - "parent_id": None, - "payee": "Test 1", - "plaid_account_id": None, - "price": None, - "quantity": None, - "status": "uncleared", - "subtype": None, - "tags": None, - "type": None, - "created_at": "2021-09-19T20:00:00.000Z", - "updated_at": "2021-09-19T20:00:00.000Z", - } - transaction_dict_2 = { - "amount": 2.0, - "asset_id": 23043, - "category_id": 229146, - "currency": "usd", - "date": "2021-09-19", - "external_id": None, - "fees": None, - "group_id": None, - "id": 546452296, - "is_group": False, - "notes": "Test Transaction 2", - "original_name": "Test 2", - "parent_id": None, - "payee": "Test 2", - "plaid_account_id": None, - "price": None, - "quantity": None, - "status": "uncleared", - "subtype": None, - "tags": None, - "type": None, - "created_at": "2021-09-19T20:00:00.000Z", - "updated_at": "2021-09-19T20:00:00.000Z", - } - transaction_dict_3 = { - "amount": 3.0, - "asset_id": 23043, - "category_id": 229140, - "currency": "usd", - "date": "2021-09-19", - "external_id": None, - "fees": None, - "group_id": None, - "id": 546434806, - "is_group": False, - "notes": "Test Transaction 3", - "original_name": "Test 3", - "parent_id": None, - "payee": "Test 3", - "plaid_account_id": None, - "price": None, - "quantity": None, - "status": "uncleared", - "subtype": None, - "tags": None, - "type": None, - "created_at": "2021-09-19T20:00:00.000Z", - "updated_at": "2021-09-19T20:00:00.000Z", - } - transaction_1 = TransactionObject.model_validate(transaction_dict_1) - transaction_2 = TransactionObject.model_validate(transaction_dict_2) - transaction_3 = TransactionObject.model_validate(transaction_dict_3) - return [transaction_1, transaction_2, transaction_3] - - -########################################################### -# VCR Configuration : Offload Epic API Calls to Cassettes # -########################################################### - - -def path_transformer(path: str) -> str: - """ - Cassette Path Transformer - """ - suffix = ".yaml" - if not path.endswith(suffix): - path = path + suffix - cassette_path = pathlib.Path(path) - cassette_path = cassette_path.parent / "cassettes" / cassette_path.name - return str(cassette_path) - - -vcr = VCR( - filter_headers=(("authorization", "XXXXXXXXXX"),), - filter_query_parameters=(("user", "XXXXXXXXXX"), ("token", "XXXXXXXXXX")), - path_transformer=path_transformer, - record_mode=os.getenv("VCR_RECORD_MODE", "once"), -) - -# Decorator Object to Use pyvcr Cassettes on Unit Tests -# pass `--vcr-record=none` to pytest CI runs to ensure new cassettes are generated -lunchable_cassette = vcr.use_cassette diff --git a/tests/models/cassettes/test_204_response.yaml b/tests/models/cassettes/test_204_response.yaml deleted file mode 100644 index 8cf1bb89..00000000 --- a/tests/models/cassettes/test_204_response.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"transactions":[{"date":"2023-12-17","amount":3.5,"payee":"Test","notes":"Test Transaction Group"}],"apply_rules":false,"skip_duplicates":true,"check_for_recurring":false,"debit_as_negative":false,"skip_balance_update":true}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-length: - - '225' - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.1 - method: POST - uri: https://dev.lunchmoney.app/v1/transactions - response: - content: '' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Sun, 17 Dec 2023 15:58:07 GMT - Etag: - - W/"13-wFA9Dx4FmHqyjCvL9k0g9w+7+E0" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702828687&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=fEMUT%2FofMtfxWVkKFLbxjXEBTFvUTnApoF86q3Dt%2By8%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702828687&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=fEMUT%2FofMtfxWVkKFLbxjXEBTFvUTnApoF86q3Dt%2By8%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 204 -version: 1 diff --git a/tests/models/cassettes/test_add_to_category_group.yaml b/tests/models/cassettes/test_add_to_category_group.yaml deleted file mode 100644 index b14c026c..00000000 --- a/tests/models/cassettes/test_add_to_category_group.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"category_ids": [443128], "new_categories": ["Another Another Test Category"]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '79' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/categories/group/658694/add - response: - content: '{"id":658694,"name":"Test Category Group","description":"Test Category Group!!","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"is_group":true,"group_id":null,"children":[{"id":658761,"name":"Another Another Test Category","description":null,"created_at":"2023-12-15T02:42:01.147Z","archived":false,"archived_on":null},{"id":443128,"name":"Groceries","description":"Test Category Description Updated","created_at":"2023-03-07T02:10:27.268Z","archived":false,"archived_on":null}],"archived":false,"archived_on":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '541' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:42:01 GMT - Etag: - - W/"21d-JdapYXJpKm5jckYYF084zl/FWR8" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702608121&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=IhPV7bOJdhOd%2BTJ73mF%2BY5R1AE8%2BA1EFE91jTMBZ51A%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702608121&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=IhPV7bOJdhOd%2BTJ73mF%2BY5R1AE8%2BA1EFE91jTMBZ51A%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_create_and_delete_transaction_group.yaml b/tests/models/cassettes/test_create_and_delete_transaction_group.yaml deleted file mode 100644 index ad316382..00000000 --- a/tests/models/cassettes/test_create_and_delete_transaction_group.yaml +++ /dev/null @@ -1,102 +0,0 @@ -interactions: -- request: - body: '{"date": "2023-12-14", "payee": "Test", "notes": "Test Transaction Group", "transactions": [546452296, 546434806]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '114' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/transactions/group - response: - content: '561178199' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '9' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:57:39 GMT - Etag: - - W/"9-QgM8UlEG9Jko03c9j304G1eR1wE" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609059&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=a%2FD%2FxKu%2FI8HJf1kkNWFJCRTzav%2B8PV5EZXdEDkFV7nQ%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609059&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=a%2FD%2FxKu%2FI8HJf1kkNWFJCRTzav%2B8PV5EZXdEDkFV7nQ%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: DELETE - uri: https://dev.lunchmoney.app/v1/transactions/group/561178199 - response: - content: '{"transactions":[546452296,546434806]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '38' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:57:40 GMT - Etag: - - W/"26-MZMWmBEzSYlditcq8Wp4EJp/buM" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609060&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=v%2FTNRGIUsGut5fPkA5odLxpk9OeFYkVrqG1ZFEBeXVU%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609060&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=v%2FTNRGIUsGut5fPkA5odLxpk9OeFYkVrqG1ZFEBeXVU%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_create_asset.yaml b/tests/models/cassettes/test_create_asset.yaml deleted file mode 100644 index 7901d1d3..00000000 --- a/tests/models/cassettes/test_create_asset.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"type_name": "cash", "name": "test-account-1", "display_name": "Test Account #1", "balance": 5.2, "currency": "usd", "institution_name": "Test Institution", "exclude_transactions": false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '188' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/assets - response: - content: '{"id":78214,"type_name":"depository","subtype_name":null,"name":"test-account-1","display_name":"Test Account #1","balance":"4.2000","balance_as_of":"2023-12-15T02:24:12.156Z","closed_on":null,"created_at":"2023-12-15T02:24:12.158Z","currency":"usd","institution_name":"Test Institution","exclude_transactions":false}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '317' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:24:12 GMT - Etag: - - W/"13d-I4VftM8ABzkTAssGeLYE2y4XTiQ" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607052&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=xQy4m01Fec%2Ftq0pERUcOBacTAIiGJvX4B1DxwzkRJ8c%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607052&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=xQy4m01Fec%2Ftq0pERUcOBacTAIiGJvX4B1DxwzkRJ8c%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_create_category.yaml b/tests/models/cassettes/test_create_category.yaml deleted file mode 100644 index bd2ff9f0..00000000 --- a/tests/models/cassettes/test_create_category.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"name": "Test Category", "description": "Test Category Description", "is_income": false, "exclude_from_budget": true, "exclude_from_totals": false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/categories - response: - content: '{"category_id":658693}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '22' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:23 GMT - Etag: - - W/"16-ZnEdZgTnX+RwcMA5fK15qZ8ce/Y" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607543&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=yQ2QW5jL8oIBvz3F32j5ipJbpFJs8z%2FSLeBCL2gGZXk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607543&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=yQ2QW5jL8oIBvz3F32j5ipJbpFJs8z%2FSLeBCL2gGZXk%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_create_category_group.yaml b/tests/models/cassettes/test_create_category_group.yaml deleted file mode 100644 index 456b4ed1..00000000 --- a/tests/models/cassettes/test_create_category_group.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"name": "Test Category Group", "description": "Test Category Group!!", "is_income": false, "exclude_from_budget": true, "exclude_from_totals": false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '150' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/categories/group - response: - content: '{"category_id":658694}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '22' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:24 GMT - Etag: - - W/"16-QagnRiI64XjF7P0O60ZwTSKAWaY" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607544&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RniK8WNVAIRVvFxngSDlgZr4DZle61%2FVPl1Qsd2Phig%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607544&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RniK8WNVAIRVvFxngSDlgZr4DZle61%2FVPl1Qsd2Phig%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_delete_budget.yaml b/tests/models/cassettes/test_delete_budget.yaml deleted file mode 100644 index 0aedf80c..00000000 --- a/tests/models/cassettes/test_delete_budget.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: DELETE - uri: https://dev.lunchmoney.app/v1/budgets?category_id=443127&start_date=2022-11-01 - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:31:55 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607515&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=qdKNFnbZ1V3jxHxyZrsmx53HANFaCDyW8UVsFbofofE%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607515&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=qdKNFnbZ1V3jxHxyZrsmx53HANFaCDyW8UVsFbofofE%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_delete_category.yaml b/tests/models/cassettes/test_delete_category.yaml deleted file mode 100644 index a85f4d60..00000000 --- a/tests/models/cassettes/test_delete_category.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: DELETE - uri: https://dev.lunchmoney.app/v1/categories/343088 - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:23 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607543&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=yQ2QW5jL8oIBvz3F32j5ipJbpFJs8z%2FSLeBCL2gGZXk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607543&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=yQ2QW5jL8oIBvz3F32j5ipJbpFJs8z%2FSLeBCL2gGZXk%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_delete_category_force.yaml b/tests/models/cassettes/test_delete_category_force.yaml deleted file mode 100644 index dffbbb7e..00000000 --- a/tests/models/cassettes/test_delete_category_force.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: DELETE - uri: https://dev.lunchmoney.app/v1/categories/343089/force - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:24 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607544&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RniK8WNVAIRVvFxngSDlgZr4DZle61%2FVPl1Qsd2Phig%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607544&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RniK8WNVAIRVvFxngSDlgZr4DZle61%2FVPl1Qsd2Phig%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_assets.yaml b/tests/models/cassettes/test_get_assets.yaml deleted file mode 100644 index c2977143..00000000 --- a/tests/models/cassettes/test_get_assets.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/assets - response: - content: '{"assets":[{"id":49335,"type_name":"cash","subtype_name":"checking","name":"Test Account","display_name":null,"balance":"-16513.5500","balance_as_of":"2023-03-07T02:43:48.383Z","closed_on":null,"currency":"usd","institution_name":null,"exclude_transactions":false,"created_at":"2023-03-07T02:05:23.670Z"}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '306' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:24:11 GMT - Etag: - - W/"132-iRGsYXgd9Lq/WtxFtW/wUKm/z0U" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607051&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=xrm8MxWAZkRuo3Rg1wWpj49%2BSPanStLfcU6QTrTk6IU%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607051&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=xrm8MxWAZkRuo3Rg1wWpj49%2BSPanStLfcU6QTrTk6IU%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_budgets.yaml b/tests/models/cassettes/test_get_budgets.yaml deleted file mode 100644 index 8877774c..00000000 --- a/tests/models/cassettes/test_get_budgets.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/budgets?end_date=2022-11-29&start_date=2022-11-01 - response: - content: '[{"category_name":"Uncategorized","category_id":null,"is_group":false,"group_id":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"archived":false,"data":{"2022-11-01":{}},"config":null,"order":0},{"category_name":"Uncategorized","category_id":null,"is_group":false,"group_id":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"archived":false,"data":{"2022-11-01":{}},"config":null,"order":1},{"category_name":"Groceries","category_id":443128,"category_group_name":null,"group_id":null,"is_group":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"order":2,"archived":false,"data":{"2022-11-01":{"num_transactions":1,"spending_to_base":28.15}},"config":null},{"category_name":"Home","category_id":443125,"category_group_name":null,"group_id":null,"is_group":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"order":3,"archived":false,"data":{"2022-11-01":{"num_transactions":0,"spending_to_base":0}},"config":null},{"category_name":"Income","category_id":443129,"category_group_name":null,"group_id":null,"is_group":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"order":4,"archived":false,"data":{"2022-11-01":{"num_transactions":0,"spending_to_base":0}},"config":null},{"category_name":"Personal Care","category_id":443127,"category_group_name":null,"group_id":null,"is_group":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"order":5,"archived":false,"data":{"2022-11-01":{"num_transactions":0,"spending_to_base":0}},"config":null},{"category_name":"Shopping","category_id":443126,"category_group_name":null,"group_id":null,"is_group":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"order":6,"archived":false,"data":{"2022-11-01":{"num_transactions":10,"spending_to_base":711.69}},"config":null}]' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:27:54 GMT - Etag: - - W/"777-j13A3UPLJEkv40D3zVVD3YExCGQ" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607273&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RSz%2Fe9doIkUZ4FD3SjpFfTFCW97iSWZ59QBjTe4lZFY%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607273&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RSz%2Fe9doIkUZ4FD3SjpFfTFCW97iSWZ59QBjTe4lZFY%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - content-length: - - '1911' - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_categories.yaml b/tests/models/cassettes/test_get_categories.yaml deleted file mode 100644 index ee4ce41e..00000000 --- a/tests/models/cassettes/test_get_categories.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/categories - response: - content: '{"categories":[{"id":443128,"name":"Groceries","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:27.268Z","created_at":"2023-03-07T02:10:27.268Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443125,"name":"Home","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:09:42.960Z","created_at":"2023-03-07T02:09:42.960Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443129,"name":"Income","description":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:40:15.216Z","created_at":"2023-03-07T02:40:15.216Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443127,"name":"Personal Care","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:17.225Z","created_at":"2023-03-07T02:10:17.225Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443126,"name":"Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:12.260Z","created_at":"2023-03-07T02:10:12.260Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:22 GMT - Etag: - - W/"5aa-MbmNEXQ+cwhlZ4ywOUrmZ68sek0" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607542&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=8xQJI4s4EliWDIdvpGOmgBgTV2jgVm9BOMwhWYO5vYk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607542&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=8xQJI4s4EliWDIdvpGOmgBgTV2jgVm9BOMwhWYO5vYk%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - content-length: - - '1450' - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_categories_flattened.yaml b/tests/models/cassettes/test_get_categories_flattened.yaml deleted file mode 100644 index 70de1bd4..00000000 --- a/tests/models/cassettes/test_get_categories_flattened.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: GET - uri: https://dev.lunchmoney.app/v1/categories?format=flattened - response: - content: '{"categories":[{"id":658761,"name":"Another Another Test Category","description":null,"is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:42:01.147Z","created_at":"2023-12-15T02:42:01.147Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null},{"id":443128,"name":"Groceries","description":"Test Category Description Updated","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:27.268Z","created_at":"2023-03-07T02:10:27.268Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null},{"id":443125,"name":"Home","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:09:42.960Z","created_at":"2023-03-07T02:09:42.960Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443129,"name":"Income","description":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:40:15.216Z","created_at":"2023-03-07T02:40:15.216Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443127,"name":"Personal Care","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:17.225Z","created_at":"2023-03-07T02:10:17.225Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443126,"name":"Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:12.260Z","created_at":"2023-03-07T02:10:12.260Z","is_group":false,"group_id":680257,"archived":false,"archived_on":null,"order":null},{"id":660672,"name":"Splitwise","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-12-15T20:45:04.146Z","created_at":"2023-12-15T20:45:04.146Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":0},{"id":680257,"name":"Sub Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-12-22T05:45:15.233Z","created_at":"2023-12-22T05:45:15.233Z","is_group":true,"group_id":null,"archived":false,"archived_on":null,"order":null,"children":[{"id":443126,"name":"Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:12.260Z","created_at":"2023-03-07T02:10:12.260Z","is_group":false,"group_id":680257,"archived":false,"archived_on":null,"order":null}]},{"id":658693,"name":"Test Category","description":"Test Category Description","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:32:23.352Z","created_at":"2023-12-15T02:32:23.352Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":658694,"name":"Test Category Group","description":"Test Category Group!!","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:32:24.849Z","created_at":"2023-12-15T02:32:24.849Z","is_group":true,"group_id":null,"archived":false,"archived_on":null,"order":null,"children":[{"id":658761,"name":"Another Another Test Category","description":null,"is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:42:01.147Z","created_at":"2023-12-15T02:42:01.147Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null},{"id":443128,"name":"Groceries","description":"Test Category Description Updated","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:27.268Z","created_at":"2023-03-07T02:10:27.268Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null}]}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 05:46:34 GMT - Etag: - - W/"f65-tCC2ArgL9RN/F4CiaAh1Lpc4NyA" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703223994&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=VcDy3EU92mcCuB%2Fhy80hehxszNKBE8gPpWAO5na%2BUTY%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703223994&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=VcDy3EU92mcCuB%2Fhy80hehxszNKBE8gPpWAO5na%2BUTY%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_categories_nested.yaml b/tests/models/cassettes/test_get_categories_nested.yaml deleted file mode 100644 index b72b940c..00000000 --- a/tests/models/cassettes/test_get_categories_nested.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: GET - uri: https://dev.lunchmoney.app/v1/categories?format=nested - response: - content: '{"categories":[{"id":660672,"name":"Splitwise","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-12-15T20:45:04.146Z","created_at":"2023-12-15T20:45:04.146Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":0},{"id":443125,"name":"Home","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:09:42.960Z","created_at":"2023-03-07T02:09:42.960Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443129,"name":"Income","description":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:40:15.216Z","created_at":"2023-03-07T02:40:15.216Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443127,"name":"Personal Care","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:17.225Z","created_at":"2023-03-07T02:10:17.225Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":680257,"name":"Sub Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-12-22T05:45:15.233Z","created_at":"2023-12-22T05:45:15.233Z","is_group":true,"group_id":null,"archived":false,"archived_on":null,"order":null,"children":[{"id":443126,"name":"Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:12.260Z","created_at":"2023-03-07T02:10:12.260Z","is_group":false,"group_id":680257,"archived":false,"archived_on":null,"order":null}]},{"id":658693,"name":"Test Category","description":"Test Category Description","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:32:23.352Z","created_at":"2023-12-15T02:32:23.352Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":658694,"name":"Test Category Group","description":"Test Category Group!!","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:32:24.849Z","created_at":"2023-12-15T02:32:24.849Z","is_group":true,"group_id":null,"archived":false,"archived_on":null,"order":null,"children":[{"id":658761,"name":"Another Another Test Category","description":null,"is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:42:01.147Z","created_at":"2023-12-15T02:42:01.147Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null},{"id":443128,"name":"Groceries","description":"Test Category Description Updated","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:27.268Z","created_at":"2023-03-07T02:10:27.268Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null}]}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 05:46:34 GMT - Etag: - - W/"bcf-cA7oyT1dg2Kx1YJwRekcvQ+hszA" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703223994&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=VcDy3EU92mcCuB%2Fhy80hehxszNKBE8gPpWAO5na%2BUTY%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703223994&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=VcDy3EU92mcCuB%2Fhy80hehxszNKBE8gPpWAO5na%2BUTY%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_category.yaml b/tests/models/cassettes/test_get_category.yaml deleted file mode 100644 index 1caa2f7f..00000000 --- a/tests/models/cassettes/test_get_category.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/categories/443128 - response: - content: '{"id":443128,"name":"Groceries","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '207' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:39:55 GMT - Etag: - - W/"cf-ArqdB5r7uq6fsA6ObfnDkpwwGrE" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607995&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RRRHUkoD06vvLyGFuk78%2BkCInj2SL%2FBT%2BL9cD8td%2F4g%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607995&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RRRHUkoD06vvLyGFuk78%2BkCInj2SL%2FBT%2BL9cD8td%2F4g%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_crypto.yaml b/tests/models/cassettes/test_get_crypto.yaml deleted file mode 100644 index df3509bd..00000000 --- a/tests/models/cassettes/test_get_crypto.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/crypto - response: - content: '{"crypto":[{"id":7286,"source":"manual","created_at":"2023-12-15T03:02:18.331Z","name":"Bitcoin","display_name":null,"balance":"1.000000000000000000","balance_as_of":"2023-12-15T03:00:08.292Z","currency":"BTC","status":"active","institution_name":null}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '254' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 03:02:44 GMT - Etag: - - W/"fe-gWd945unYRZrDjreifrq6CEXmUc" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609364&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=D2SqsIheCBS9moU68CE44YICCUb1SCHSza2L8Wt0hE8%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609364&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=D2SqsIheCBS9moU68CE44YICCUb1SCHSza2L8Wt0hE8%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_plaid_accounts.yaml b/tests/models/cassettes/test_get_plaid_accounts.yaml deleted file mode 100644 index 7a51a818..00000000 --- a/tests/models/cassettes/test_get_plaid_accounts.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/plaid_accounts - response: - content: '{"plaid_accounts": [{"id": 71394, "date_linked": "2023-12-15", "name": "Chase - Freedom", "display_name": "Chase Freedom", "type": "credit", "subtype": "creditcard", "mask": "5678", "institution_name": "Chase", "status": "active", "limit": 12345, "balance": "123.0900", "currency": "usd", "balance_last_update": "2023-12-14T15:55:00.753Z", "import_start_date": "2023-02-06", "last_import": "2023-12-14T15:55:03.163Z", "last_fetch": "2023-12-14T15:55:03.301Z", "plaid_last_successful_update": "2023-12-13T15:51:37.490Z"}, {"id": 71395, "date_linked": "2023-12-15", "name": "Chase - Sapphire", "display_name": "Chase Sapphire", "type": "credit", "subtype": "creditcard", "mask": "1234", "institution_name": "Chase", "status": "active", "limit": 12345, "balance": "456.0900", "currency": "usd", "balance_last_update": "2023-12-14T15:55:00.753Z", "import_start_date": "2023-02-06", "last_import": "2023-12-14T15:55:03.163Z", "last_fetch": "2023-12-14T15:55:03.301Z", "plaid_last_successful_update": "2023-12-13T15:51:37.490Z"}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 03:04:46 GMT - Etag: - - W/"1f58-hipJFRmyr9x6gdp2aLKh5viwTAU" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609486&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=1cXBwXEaoZ%2Fm4ZhVbC9Kz5VVT8hDCwaBZH8pnT4DXyQ%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609486&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=1cXBwXEaoZ%2Fm4ZhVbC9Kz5VVT8hDCwaBZH8pnT4DXyQ%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - content-length: - - '8024' - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_recurring_expenses.yaml b/tests/models/cassettes/test_get_recurring_expenses.yaml deleted file mode 100644 index b28df476..00000000 --- a/tests/models/cassettes/test_get_recurring_expenses.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: GET - uri: https://dev.lunchmoney.app/v1/recurring_expenses?start_date=2022-11-01 - response: - content: '{"recurring_expenses":[{"id":585244,"start_date":"2021-12-01","end_date":null,"cadence":"monthly","payee":"Test Item","amount":"100.0000","currency":"usd","created_at":"2023-12-15T02:38:04.131Z","description":"Video Streaming","billing_date":"2022-11-01","type":"cleared","original_name":null,"source":"manual","plaid_account_id":null,"asset_id":null,"category_id":443126,"transaction_id":null}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '396' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 15:42:08 GMT - Etag: - - W/"18c-Y2ukKiTxVJNnFDEIhjY0XlrmVgc" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703259728&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=p8MMyvC2toZx7NhSpdaXza7UayhtI%2BrgAKK4o%2Bn1Vmo%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703259728&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=p8MMyvC2toZx7NhSpdaXza7UayhtI%2BrgAKK4o%2Bn1Vmo%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_recurring_items.yaml b/tests/models/cassettes/test_get_recurring_items.yaml deleted file mode 100644 index a2a446f3..00000000 --- a/tests/models/cassettes/test_get_recurring_items.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.3.3 - method: GET - uri: https://dev.lunchmoney.app/v1/recurring_items?start_date=2022-11-01 - response: - content: '[{"id":585244,"start_date":"2021-12-01T00:00:00.000Z","end_date":null,"payee":"Test Item","currency":"usd","created_by":12126,"created_at":"2023-12-15T02:38:04.131Z","updated_at":"2023-12-15T02:38:04.131Z","billing_date":"2023-12-01","original_name":null,"description":"Video Streaming","plaid_account_id":null,"asset_id":null,"source":"manual","amount":"100.0000","notes":null,"category_id":443126,"category_group_id":680257,"is_income":false,"exclude_from_totals":false,"cadence":"monthly","granularity":"month","quantity":1,"occurrences":{"2022-11-01":[],"2022-12-01":[],"2023-01-01":[],"2023-02-01":[],"2023-03-01":[],"2023-04-01":[],"2023-05-01":[],"2023-06-01":[],"2023-07-01":[],"2023-08-01":[],"2023-09-01":[],"2023-10-01":[],"2023-11-01":[],"2023-12-01":[],"2024-01-01":[],"2024-02-01":[],"2024-03-01":[],"2024-04-01":[],"2024-05-01":[],"2024-06-01":[],"2024-07-01":[],"2024-08-01":[]},"transactions_within_range":[],"missing_dates_within_range":["2022-11-01","2022-12-01","2023-01-01","2023-02-01","2023-03-01","2023-04-01","2023-05-01","2023-06-01","2023-07-01","2023-08-01","2023-09-01","2023-10-01","2023-11-01","2023-12-01","2024-01-01","2024-02-01","2024-03-01","2024-04-01","2024-05-01","2024-06-01","2024-07-01"],"date":"2024-07-19","to_base":100}]' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 19 Jul 2024 03:53:07 GMT - Etag: - - W/"4f1-jaQOBXD6F728udtE/T3Pci04HP4" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1721361187&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=YtEpFVLeE%2BZqjZemsRdPEXAIOqgIB6TUtRVb%2FNYrMoc%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1721361187&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=YtEpFVLeE%2BZqjZemsRdPEXAIOqgIB6TUtRVb%2FNYrMoc%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_tags.yaml b/tests/models/cassettes/test_get_tags.yaml deleted file mode 100644 index 8f36362d..00000000 --- a/tests/models/cassettes/test_get_tags.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: GET - uri: https://dev.lunchmoney.app/v1/tags - response: - content: '[{"id":66845,"name":"test","description":null,"archived":false}]' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '64' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 15:48:41 GMT - Etag: - - W/"40-46wK3k5iVXZWvLGgrDEZnekjOD0" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703260121&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=Alw2L4p%2Fd6gFPGo1NnJ9A%2BPaXUGilV4ZtG%2B3wh7FCpE%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703260121&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=Alw2L4p%2Fd6gFPGo1NnJ9A%2BPaXUGilV4ZtG%2B3wh7FCpE%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_transaction.yaml b/tests/models/cassettes/test_get_transaction.yaml deleted file mode 100644 index d2aaef94..00000000 --- a/tests/models/cassettes/test_get_transaction.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions/546434806 - response: - content: '{"id":546434806,"date":"2024-12-11","amount":"120.0000","currency":"usd","to_base":120,"payee":"Example Restaurant","category_id":null,"category_name":null,"category_group_id":null,"category_group_name":null,"is_income":null,"exclude_from_budget":null,"exclude_from_totals":null,"created_at":"2023-12-12T16:40:12.286Z","updated_at":"2024-01-23T23:19:49.127Z","status":"cleared","is_pending":false,"notes":"Saturday Dinner","original_name":"Example Restaurant","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":true,"group_id":null,"is_group":false,"asset_id":null,"asset_institution_name":null,"asset_name":null,"asset_display_name":null,"asset_status":null,"plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Example Restaurant","display_notes":"Saturday Dinner","account_display_name":" ","tags":[],"external_id":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:23:39 GMT - Etag: - - W/"452-JxRED/ZAoEZSX3h3KkuCa/XiEE0" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052219&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=eFqPqlndjy%2F2%2B%2FP0fpYgnnD58U35QSNISXcwx5ZeXMk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052219&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=eFqPqlndjy%2F2%2B%2FP0fpYgnnD58U35QSNISXcwx5ZeXMk%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_transaction_group.yaml b/tests/models/cassettes/test_get_transaction_group.yaml deleted file mode 100644 index dc32e903..00000000 --- a/tests/models/cassettes/test_get_transaction_group.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions/group?transaction_id=856827078 - response: - content: '{"id":856827078,"date":"2024-01-11","amount":"66.45","currency":"usd","to_base":66.45,"payee":"Skinix","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2024-01-24T03:15:39.118Z","updated_at":"2024-01-24T03:15:39.118Z","status":"cleared","is_pending":false,"notes":"Phasellus sit amet erat.","original_name":null,"recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":true,"asset_id":null,"asset_institution_name":null,"asset_name":null,"asset_display_name":null,"asset_status":null,"plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"user","display_name":"Skinix","display_notes":"Phasellus sit amet erat.","account_display_name":" ","tags":[],"children":[{"id":179018293,"payee":"Skinix","amount":"30.4100","currency":"usd","date":"2024-01-11","formatted_date":"2024-01-11","notes":"Phasellus sit amet erat.","asset_id":49335,"plaid_account_id":null,"to_base":30.41},{"id":179018477,"payee":"Fadeo","amount":"36.0400","currency":"usd","date":"2024-01-10","formatted_date":"2024-01-10","notes":null,"asset_id":49335,"plaid_account_id":null,"to_base":36.04}],"external_id":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 24 Jan 2024 03:19:25 GMT - Etag: - - W/"5e1-0z/UXlyVUxPEmy5ZiLGu3uduZqg" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706066365&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=oJiXq5%2FCJrt%2FxFYEl20oSruOMIz%2Fw0LEQqBpC0Z03xc%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706066365&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=oJiXq5%2FCJrt%2FxFYEl20oSruOMIz%2Fw0LEQqBpC0Z03xc%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_transactions.yaml b/tests/models/cassettes/test_get_transactions.yaml deleted file mode 100644 index 92896b76..00000000 --- a/tests/models/cassettes/test_get_transactions.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions - response: - content: '{"transactions":[{"id":179018371,"date":"2024-01-01","amount":"114.4800","currency":"usd","to_base":114.48,"payee":"Browsebug","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.681Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Browsebug","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Browsebug","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018392,"date":"2024-01-01","amount":"87.9700","currency":"usd","to_base":87.97,"payee":"Babbleblab","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.348Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Babbleblab","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Babbleblab","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018398,"date":"2024-01-01","amount":"5.3200","currency":"usd","to_base":5.32,"payee":"Voomm","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.809Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","original_name":"Voomm","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":"{\"account_id\":\"xxxxxxxxxxxx\",\"account_owner\":\"1234\"}","source":"api","display_name":"Voomm","display_notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018399,"date":"2024-01-01","amount":"22.5000","currency":"usd","to_base":22.5,"payee":"Fivechat","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.885Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":"Donec vitae nisi.","original_name":"Fivechat","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Fivechat","display_notes":"Donec vitae nisi.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018437,"date":"2024-01-01","amount":"102.3200","currency":"usd","to_base":102.32,"payee":"Skivee","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:59.823Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Skivee","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skivee","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018458,"date":"2024-01-01","amount":"78.9800","currency":"usd","to_base":78.98,"payee":"Oyoloo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:01.466Z","updated_at":"2024-01-23T23:19:10.517Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Oyoloo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Oyoloo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018469,"date":"2024-01-01","amount":"90.2900","currency":"usd","to_base":90.29,"payee":"Quimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.328Z","updated_at":"2024-01-23T23:20:02.345Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Quimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Quimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":855353975,"date":"2024-01-01","amount":"115.78999999999999","currency":"usd","to_base":115.79,"payee":"Babbleblab","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2024-01-23T22:46:48.656Z","updated_at":"2024-01-23T23:20:01.854Z","status":"uncleared","is_pending":false,"notes":null,"original_name":null,"recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":true,"asset_id":null,"asset_institution_name":null,"asset_name":null,"asset_display_name":null,"asset_status":null,"plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"user","display_name":"Babbleblab","display_notes":null,"account_display_name":" ","tags":[],"children":[{"id":179018392,"payee":"Babbleblab","amount":"87.9700","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":null,"asset_id":49335,"plaid_account_id":null,"to_base":87.97},{"id":179018398,"payee":"Voomm","amount":"5.3200","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","asset_id":49335,"plaid_account_id":null,"to_base":5.32},{"id":179018399,"payee":"Fivechat","amount":"22.5000","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":"Donec vitae nisi.","asset_id":49335,"plaid_account_id":null,"to_base":22.5}],"external_id":null},{"id":179018424,"date":"2024-01-05","amount":"2.9100","currency":"usd","to_base":2.91,"payee":"Twitterworks","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:58.822Z","updated_at":"2024-01-23T23:19:11.916Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Twitterworks","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Twitterworks","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018468,"date":"2024-01-07","amount":"42.7600","currency":"usd","to_base":42.76,"payee":"Blogspan","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.249Z","updated_at":"2024-01-23T23:19:13.193Z","status":"uncleared","is_pending":false,"notes":"Integer ac leo.","original_name":"Blogspan","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogspan","display_notes":"Integer ac leo.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018477,"date":"2024-01-10","amount":"36.0400","currency":"usd","to_base":36.04,"payee":"Fadeo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.969Z","updated_at":"2024-01-23T23:19:14.338Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Fadeo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Fadeo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018293,"date":"2024-01-11","amount":"30.4100","currency":"usd","to_base":30.41,"payee":"Skinix","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:48.939Z","updated_at":"2024-01-23T23:19:15.467Z","status":"uncleared","is_pending":false,"notes":"Phasellus sit amet erat.","original_name":"Skinix","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skinix","display_notes":"Phasellus sit amet erat.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018351,"date":"2024-01-11","amount":"72.5000","currency":"usd","to_base":72.5,"payee":"Skaboo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.175Z","updated_at":"2024-01-23T23:19:16.672Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Skaboo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skaboo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018428,"date":"2024-01-11","amount":"150.0000","currency":"usd","to_base":150,"payee":"Livetube","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:59.122Z","updated_at":"2024-01-23T23:19:17.775Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Livetube","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Livetube","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018320,"date":"2024-01-12","amount":"84.9000","currency":"usd","to_base":84.9,"payee":"Linkbuzz","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:50.896Z","updated_at":"2024-01-23T23:19:18.953Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Linkbuzz","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Linkbuzz","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018356,"date":"2024-01-19","amount":"50.9300","currency":"usd","to_base":50.93,"payee":"Divanoodle","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.557Z","updated_at":"2024-01-23T23:19:20.121Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Divanoodle","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Divanoodle","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018330,"date":"2024-01-22","amount":"112.9100","currency":"usd","to_base":112.91,"payee":"Blogpad","category_id":443128,"category_name":"Groceries","category_group_id":658694,"category_group_name":"Test Category Group","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:51.634Z","updated_at":"2024-01-23T23:19:21.239Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Blogpad","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogpad","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018374,"date":"2024-01-24","amount":"64.2000","currency":"usd","to_base":64.2,"payee":"Devshare","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.909Z","updated_at":"2024-01-23T23:19:22.372Z","status":"uncleared","is_pending":false,"notes":"Nam nulla.","original_name":"Devshare","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Devshare","display_notes":"Nam nulla.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018343,"date":"2024-01-25","amount":"58.6200","currency":"usd","to_base":58.62,"payee":"Agimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:52.582Z","updated_at":"2024-01-23T23:19:23.495Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Agimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Agimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null}],"has_more":false}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:20:58 GMT - Etag: - - W/"5534-/ugOb4U7RUc9/qQHHfMVYPdqD94" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052057&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=ifKfasFhY%2FtzIamTz%2BqgOilIKCwalX1P45BnuJvMJow%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052057&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=ifKfasFhY%2FtzIamTz%2BqgOilIKCwalX1P45BnuJvMJow%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_transactions_no_paginate.yaml b/tests/models/cassettes/test_get_transactions_no_paginate.yaml deleted file mode 100644 index a413c8c4..00000000 --- a/tests/models/cassettes/test_get_transactions_no_paginate.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.2.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions?limit=5 - response: - content: '{"transactions":[{"id":855616912,"date":"2024-01-12","amount":"42.4500","currency":"usd","to_base":42.45,"payee":"Linkbuzz","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2024-01-23T23:35:23.222Z","updated_at":"2024-01-23T23:35:23.222Z","status":"uncleared","is_pending":false,"notes":null,"original_name":null,"recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":179018320,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Linkbuzz","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018356,"date":"2024-01-19","amount":"50.9300","currency":"usd","to_base":50.93,"payee":"Divanoodle","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.557Z","updated_at":"2024-01-23T23:19:20.121Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Divanoodle","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Divanoodle","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018330,"date":"2024-01-22","amount":"112.9100","currency":"usd","to_base":112.91,"payee":"Blogpad","category_id":443128,"category_name":"Groceries","category_group_id":658694,"category_group_name":"Test Category Group","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:51.634Z","updated_at":"2024-01-23T23:19:21.239Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Blogpad","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogpad","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018374,"date":"2024-01-24","amount":"64.2000","currency":"usd","to_base":64.2,"payee":"Devshare","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.909Z","updated_at":"2024-01-23T23:19:22.372Z","status":"uncleared","is_pending":false,"notes":"Nam nulla.","original_name":"Devshare","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Devshare","display_notes":"Nam nulla.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018343,"date":"2024-01-25","amount":"58.6200","currency":"usd","to_base":58.62,"payee":"Agimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:52.582Z","updated_at":"2024-01-23T23:19:23.495Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Agimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Agimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null}],"has_more":true}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 29 Jan 2024 20:16:28 GMT - Etag: - - W/"15bb-w/S+ZfgoXzS4bjZcTsCa7+RxlsE" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706559388&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=uxWXextWvcB0V571A7mUK617Gljjk1%2B2EhZwyfYd4ew%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706559388&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=uxWXextWvcB0V571A7mUK617Gljjk1%2B2EhZwyfYd4ew%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_uncleared_transactions.yaml b/tests/models/cassettes/test_get_uncleared_transactions.yaml deleted file mode 100644 index 58c9dd92..00000000 --- a/tests/models/cassettes/test_get_uncleared_transactions.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions?status=uncleared - response: - content: '{"transactions":[{"id":179018371,"date":"2024-01-01","amount":"114.4800","currency":"usd","to_base":114.48,"payee":"Browsebug","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.681Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Browsebug","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Browsebug","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018392,"date":"2024-01-01","amount":"87.9700","currency":"usd","to_base":87.97,"payee":"Babbleblab","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.348Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Babbleblab","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Babbleblab","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018398,"date":"2024-01-01","amount":"5.3200","currency":"usd","to_base":5.32,"payee":"Voomm","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.809Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","original_name":"Voomm","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Voomm","display_notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018399,"date":"2024-01-01","amount":"22.5000","currency":"usd","to_base":22.5,"payee":"Fivechat","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.885Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":"Donec vitae nisi.","original_name":"Fivechat","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Fivechat","display_notes":"Donec vitae nisi.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018437,"date":"2024-01-01","amount":"102.3200","currency":"usd","to_base":102.32,"payee":"Skivee","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:59.823Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Skivee","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skivee","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018458,"date":"2024-01-01","amount":"78.9800","currency":"usd","to_base":78.98,"payee":"Oyoloo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:01.466Z","updated_at":"2024-01-23T23:19:10.517Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Oyoloo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Oyoloo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018469,"date":"2024-01-01","amount":"90.2900","currency":"usd","to_base":90.29,"payee":"Quimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.328Z","updated_at":"2024-01-23T23:20:02.345Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Quimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Quimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":855353975,"date":"2024-01-01","amount":"115.78999999999999","currency":"usd","to_base":115.79,"payee":"Babbleblab","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2024-01-23T22:46:48.656Z","updated_at":"2024-01-23T23:20:01.854Z","status":"uncleared","is_pending":false,"notes":null,"original_name":null,"recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":true,"asset_id":null,"asset_institution_name":null,"asset_name":null,"asset_display_name":null,"asset_status":null,"plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"user","display_name":"Babbleblab","display_notes":null,"account_display_name":" ","tags":[],"children":[{"id":179018392,"payee":"Babbleblab","amount":"87.9700","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":null,"asset_id":49335,"plaid_account_id":null,"to_base":87.97},{"id":179018398,"payee":"Voomm","amount":"5.3200","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","asset_id":49335,"plaid_account_id":null,"to_base":5.32},{"id":179018399,"payee":"Fivechat","amount":"22.5000","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":"Donec vitae nisi.","asset_id":49335,"plaid_account_id":null,"to_base":22.5}],"external_id":null},{"id":179018424,"date":"2024-01-05","amount":"2.9100","currency":"usd","to_base":2.91,"payee":"Twitterworks","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:58.822Z","updated_at":"2024-01-23T23:19:11.916Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Twitterworks","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Twitterworks","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018468,"date":"2024-01-07","amount":"42.7600","currency":"usd","to_base":42.76,"payee":"Blogspan","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.249Z","updated_at":"2024-01-23T23:19:13.193Z","status":"uncleared","is_pending":false,"notes":"Integer ac leo.","original_name":"Blogspan","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogspan","display_notes":"Integer ac leo.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018477,"date":"2024-01-10","amount":"36.0400","currency":"usd","to_base":36.04,"payee":"Fadeo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.969Z","updated_at":"2024-01-23T23:19:14.338Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Fadeo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Fadeo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018293,"date":"2024-01-11","amount":"30.4100","currency":"usd","to_base":30.41,"payee":"Skinix","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:48.939Z","updated_at":"2024-01-23T23:19:15.467Z","status":"uncleared","is_pending":false,"notes":"Phasellus sit amet erat.","original_name":"Skinix","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skinix","display_notes":"Phasellus sit amet erat.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018351,"date":"2024-01-11","amount":"72.5000","currency":"usd","to_base":72.5,"payee":"Skaboo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.175Z","updated_at":"2024-01-23T23:19:16.672Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Skaboo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skaboo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018428,"date":"2024-01-11","amount":"150.0000","currency":"usd","to_base":150,"payee":"Livetube","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:59.122Z","updated_at":"2024-01-23T23:19:17.775Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Livetube","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Livetube","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018320,"date":"2024-01-12","amount":"84.9000","currency":"usd","to_base":84.9,"payee":"Linkbuzz","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:50.896Z","updated_at":"2024-01-23T23:19:18.953Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Linkbuzz","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Linkbuzz","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018356,"date":"2024-01-19","amount":"50.9300","currency":"usd","to_base":50.93,"payee":"Divanoodle","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.557Z","updated_at":"2024-01-23T23:19:20.121Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Divanoodle","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Divanoodle","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018330,"date":"2024-01-22","amount":"112.9100","currency":"usd","to_base":112.91,"payee":"Blogpad","category_id":443128,"category_name":"Groceries","category_group_id":658694,"category_group_name":"Test Category Group","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:51.634Z","updated_at":"2024-01-23T23:19:21.239Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Blogpad","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogpad","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018374,"date":"2024-01-24","amount":"64.2000","currency":"usd","to_base":64.2,"payee":"Devshare","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.909Z","updated_at":"2024-01-23T23:19:22.372Z","status":"uncleared","is_pending":false,"notes":"Nam nulla.","original_name":"Devshare","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Devshare","display_notes":"Nam nulla.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018343,"date":"2024-01-25","amount":"58.6200","currency":"usd","to_base":58.62,"payee":"Agimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:52.582Z","updated_at":"2024-01-23T23:19:23.495Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Agimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Agimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null}],"has_more":false}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:26:11 GMT - Etag: - - W/"5534-/ugOb4U7RUc9/qQHHfMVYPdqD94" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052371&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=v8DgdVmXC7N7fbv0OyaM9Xms0oE%2FX7TUnR6G%2FU3yFL4%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052371&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=v8DgdVmXC7N7fbv0OyaM9Xms0oE%2FX7TUnR6G%2FU3yFL4%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_user.yaml b/tests/models/cassettes/test_get_user.yaml deleted file mode 100644 index dbf5b5db..00000000 --- a/tests/models/cassettes/test_get_user.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/me - response: - content: '{"user_name":"Justin Flannery","user_email":"juftin@gmail.com","user_id":12126,"account_id":18286,"budget_name":"🤖 Juftin - Sandbox","api_key_label":"Lunchable"}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:30 GMT - Etag: - - W/"a4-M9AgMOS8/DALNuYYUdWJdJyoQWA" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607550&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=hqyTjOanwQpiN09wgseHis1OammhecJUOY0Q4M6NHTo%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607550&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=hqyTjOanwQpiN09wgseHis1OammhecJUOY0Q4M6NHTo%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_insert_transactions.yaml b/tests/models/cassettes/test_insert_transactions.yaml deleted file mode 100644 index 3aecbd47..00000000 --- a/tests/models/cassettes/test_insert_transactions.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"transactions": [{"date": "2023-12-14", "amount": 3.5, "payee": "Random Test", "asset_id": 49335, "notes": "Random Test Description: 2023-12-14 20:01:42.588685"}], "apply_rules": false, "skip_duplicates": true, "check_for_recurring": false, "debit_as_negative": false, "skip_balance_update": true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '298' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/transactions - response: - content: '{"ids":[561205301]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '19' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 03:01:42 GMT - Etag: - - W/"13-IEhtY6cV9Nou10x7E28a09w0Jjo" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609302&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=DlFFyKJ9CWq6yahw%2F2Su1%2Brvs49X7NBjpdmCZruyI%2Bo%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609302&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=DlFFyKJ9CWq6yahw%2F2Su1%2Brvs49X7NBjpdmCZruyI%2Bo%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_split_transaction.yaml b/tests/models/cassettes/test_split_transaction.yaml deleted file mode 100644 index e2ea8b21..00000000 --- a/tests/models/cassettes/test_split_transaction.yaml +++ /dev/null @@ -1,106 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions/179018320 - response: - content: '{"id":179018320,"date":"2024-01-12","amount":"84.9000","currency":"usd","to_base":84.9,"payee":"Linkbuzz","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:50.896Z","updated_at":"2024-01-23T23:19:18.953Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Linkbuzz","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Linkbuzz","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:35:23 GMT - Etag: - - W/"44e-mfkledHpOThw11jMES6+wQLrz/c" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052922&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=kSc8x3ilVsl5CAvd6qDPkmalC5Nqzc6dSrt79Sfnqlw%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052922&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=kSc8x3ilVsl5CAvd6qDPkmalC5Nqzc6dSrt79Sfnqlw%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"split":[{"date":"2024-01-12","category_id":443126,"amount":42.45},{"date":"2024-01-12","category_id":443126,"amount":42.45}]}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-length: - - '127' - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: PUT - uri: https://dev.lunchmoney.app/v1/transactions/179018320 - response: - content: '{"updated":true,"split":[855616911,855616912]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '46' - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:35:23 GMT - Etag: - - W/"2e-6YReKqNZ92GDgxDo0hopTaOS3gs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052923&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=w67Q6pk3jzwGCdAlFiRmvUOwzc5ljrEvqHCRySv8o5o%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052923&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=w67Q6pk3jzwGCdAlFiRmvUOwzc5ljrEvqHCRySv8o5o%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_trigger_fetch_from_plaid.yaml b/tests/models/cassettes/test_trigger_fetch_from_plaid.yaml deleted file mode 100644 index 5288ec0f..00000000 --- a/tests/models/cassettes/test_trigger_fetch_from_plaid.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-length: - - '0' - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: POST - uri: https://dev.lunchmoney.app/v1/plaid_accounts/fetch - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 05:19:16 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703222356&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=6dOowV5gM%2BCZbs2abGbSVvPMS5g9g24RA5aQ7uyfidE%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703222356&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=6dOowV5gM%2BCZbs2abGbSVvPMS5g9g24RA5aQ7uyfidE%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_unsplit_transaction.yaml b/tests/models/cassettes/test_unsplit_transaction.yaml deleted file mode 100644 index 6704d8b0..00000000 --- a/tests/models/cassettes/test_unsplit_transaction.yaml +++ /dev/null @@ -1,46 +0,0 @@ -interactions: -- request: - body: '{"parent_ids": [103958497], "remove_parents": true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '51' - Content-Type: - - application/json - User-Agent: - - python-requests/2.27.1 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/transactions/unsplit - response: - content: '[103958755,103958756,103958497]' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '31' - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 23 Jun 2022 22:46:25 GMT - Etag: - - W/"1f-b4P8tB4xecZztGw/TqD+42bEHHA" - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_update_asset.yaml b/tests/models/cassettes/test_update_asset.yaml deleted file mode 100644 index 0d8be0fa..00000000 --- a/tests/models/cassettes/test_update_asset.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"balance": "5.2"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '18' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: PUT - uri: https://dev.lunchmoney.app/v1/assets/78214 - response: - content: '{"id":78214,"type_name":"cash","subtype_name":null,"name":"test-account-1","display_name":"Test Account #1","balance":"5.2000","balance_as_of":"2023-12-15T02:26:08.599Z","closed_on":null,"currency":"usd","institution_name":"Test Institution","exclude_transactions":false,"created_at":"2023-12-15T02:24:12.158Z"}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '311' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:26:08 GMT - Etag: - - W/"137-vgmerT4uhwJMofHaAk5n1BfisE4" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607168&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=ONA%2BVAcCxV3HxqlYICzA6ESFKT7wA9KQOKCexC0sAHk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607168&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=ONA%2BVAcCxV3HxqlYICzA6ESFKT7wA9KQOKCexC0sAHk%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_update_category.yaml b/tests/models/cassettes/test_update_category.yaml deleted file mode 100644 index 31475522..00000000 --- a/tests/models/cassettes/test_update_category.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"description": "Test Category Description Updated"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '52' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: PUT - uri: https://dev.lunchmoney.app/v1/categories/443128 - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:40:49 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702608049&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=o92%2FZ2oruGWKC9AbdAPC1Yn5QoZmlUIwe%2FTp3jDlq4Y%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702608049&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=o92%2FZ2oruGWKC9AbdAPC1Yn5QoZmlUIwe%2FTp3jDlq4Y%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_update_crypto.yaml b/tests/models/cassettes/test_update_crypto.yaml deleted file mode 100644 index b67480f2..00000000 --- a/tests/models/cassettes/test_update_crypto.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"balance": 0.5}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '16' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: PUT - uri: https://dev.lunchmoney.app/v1/crypto/manual/7286 - response: - content: '{"id":7286,"source":"manual","created_at":"2023-12-15T03:02:18.331Z","name":"Bitcoin","display_name":null,"balance":"0.500000000000000000","institution_name":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '163' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 03:03:14 GMT - Etag: - - W/"a3-z5Y92F7xf8dXvBC55j1tofFPP3M" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609394&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=kha7eBfWgP9ohByRW9jj3Zv64Cqe%2B6X335ctENBQy2Q%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609394&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=kha7eBfWgP9ohByRW9jj3Zv64Cqe%2B6X335ctENBQy2Q%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_update_transaction.yaml b/tests/models/cassettes/test_update_transaction.yaml deleted file mode 100644 index cfbac8cf..00000000 --- a/tests/models/cassettes/test_update_transaction.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '{"transaction":{"notes":"Updated on 2024-01-23 16:30:37.701144"}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-length: - - '65' - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: PUT - uri: https://dev.lunchmoney.app/v1/transactions/546452296 - response: - content: '{"updated":true}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '16' - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:30:37 GMT - Etag: - - W/"10-dkPpo4JFIcQ3LWuPXbQ1isdU9JU" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052637&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=6xx3hIyL%2BdwV%2BHTkQzPYGmuGTj8sQppv0SnpHMYmTKo%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052637&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=6xx3hIyL%2BdwV%2BHTkQzPYGmuGTj8sQppv0SnpHMYmTKo%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_upsert_budget.yaml b/tests/models/cassettes/test_upsert_budget.yaml deleted file mode 100644 index 9a3b24e8..00000000 --- a/tests/models/cassettes/test_upsert_budget.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"start_date": "2022-11-01", "category_id": 443127, "amount": 100.0}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '68' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: PUT - uri: https://dev.lunchmoney.app/v1/budgets - response: - content: '{"category_group":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '23' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:31:37 GMT - Etag: - - W/"17-5ALBl+bKXJaccIUKdwiYXHJOenY" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607496&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=9SzrWb%2BXV2D%2BK80PrVC2H4sgzEiU%2B0CPIBSaP82e4XQ%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607496&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=9SzrWb%2BXV2D%2BK80PrVC2H4sgzEiU%2B0CPIBSaP82e4XQ%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/test_assets.py b/tests/models/test_assets.py deleted file mode 100644 index b58468b2..00000000 --- a/tests/models/test_assets.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -Run Tests on the Assets Endpoint -""" - -import datetime -import logging - -import pytest - -from lunchable import LunchMoney -from lunchable.models.assets import AssetsObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@pytest.fixture -def lunchmoney_asset() -> AssetsObject: - """ - Static lunchable.models.AssetsObject - - Returns - ------- - AssetsObject - """ - splitwise_asset = AssetsObject( - id=78214, - type_name="cash", - subtype_name="digital wallet (paypal, venmo)", - name="Splitwise Balance", - display_name="Splitwise", - balance=-1.0, - balance_as_of=datetime.datetime( - 2021, 8, 28, 16, 6, 35, tzinfo=datetime.timezone.utc - ), - closed_on=None, - currency="usd", - institution_name="Splitwise", - created_at=datetime.datetime( - 2021, 8, 28, 16, 6, 2, 701000, tzinfo=datetime.timezone.utc - ), - ) - return splitwise_asset - - -@lunchable_cassette -def test_get_assets(lunch_money_obj: LunchMoney): - """ - Get Assets and Assert that they're assets - """ - assets = lunch_money_obj.get_assets() - assert len(assets) >= 1 - for asset in assets: - assert isinstance(asset, AssetsObject) - logger.info("%s Assets returned", len(assets)) - - -@lunchable_cassette -def test_update_asset(lunch_money_obj: LunchMoney, lunchmoney_asset: AssetsObject): - """ - Update an Asset - """ - response = lunch_money_obj.update_asset(asset_id=lunchmoney_asset.id, balance=5.20) - assert isinstance(response, AssetsObject) - logger.info(response) - - -@lunchable_cassette -def test_create_asset(lunch_money_obj: LunchMoney): - """ - Create an Asset - """ - response = lunch_money_obj.insert_asset( - type_name="cash", - name="test-account-1", - subtype_name=None, - display_name="Test Account #1", - balance=4.20, - currency="usd", - institution_name="Test Institution", - ) - assert isinstance(response, AssetsObject) - logger.info(response) diff --git a/tests/models/test_budgets.py b/tests/models/test_budgets.py deleted file mode 100644 index 11280ee4..00000000 --- a/tests/models/test_budgets.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -Run Tests on the Budgets Endpoint -""" - -import datetime -import logging - -from lunchable import LunchMoney -from lunchable.models import BudgetObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_upsert_budget( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Test upserting some budgets - """ - # Ride Sharing - response = lunch_money_obj.upsert_budget( - start_date=obscure_start_date, category_id=443127, amount=100.00 - ) - assert isinstance(response, dict) or response is None - - -@lunchable_cassette -def test_get_budgets( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Test Getting some budgets - """ - budgets = lunch_money_obj.get_budgets( - start_date=obscure_start_date, - end_date=obscure_start_date + datetime.timedelta(days=28), - ) - assert len(budgets) >= 1 - for budget in budgets: - assert isinstance(budget, BudgetObject) - logger.info("%s Budgets Found", len(budgets)) - logger.info(budgets) - - -@lunchable_cassette -def test_delete_budget( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Delete a Budget - """ - deleted = lunch_money_obj.remove_budget( - start_date=obscure_start_date, category_id=443127 - ) - logger.info("Budget Deleted") - assert deleted is True diff --git a/tests/models/test_categories.py b/tests/models/test_categories.py deleted file mode 100644 index 7eff3d38..00000000 --- a/tests/models/test_categories.py +++ /dev/null @@ -1,130 +0,0 @@ -""" -Run Tests on the Categories Endpoint -""" - -import logging - -from lunchable import LunchMoney -from lunchable.models.categories import CategoriesObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_categories(lunch_money_obj: LunchMoney): - """ - Get Categories and Assert that they're categories - """ - categories = lunch_money_obj.get_categories() - assert len(categories) >= 1 - for category in categories: - assert isinstance(category, CategoriesObject) - logger.info("%s Categories returned", len(categories)) - - -@lunchable_cassette -def test_create_category(lunch_money_obj: LunchMoney): - """ - Create A Single Category - """ - name = "Test Category" - category = lunch_money_obj.insert_category( - name=name, description="Test Category Description", exclude_from_budget=True - ) - logger.info("Category ID # %s was just created: %s", category, name) - assert isinstance(category, int) - - -@lunchable_cassette -def test_get_category(lunch_money_obj: LunchMoney): - """ - Get a Single Category - """ - category_id = 443128 - category = lunch_money_obj.get_category(category_id=category_id) - logger.info("Category ID # %s was just fetched: %s", category.id, category.name) - assert isinstance(category, CategoriesObject) - - -@lunchable_cassette -def test_delete_category(lunch_money_obj: LunchMoney): - """ - Delete a Category - """ - category_id = 343088 - deleted = lunch_money_obj.remove_category(category_id=category_id) - logger.info("Category ID # %s was just deleted", category_id) - assert deleted is True - - -@lunchable_cassette -def test_delete_category_force(lunch_money_obj: LunchMoney): - """ - Forcefully Delete a Category - """ - category_id = 343089 - deleted = lunch_money_obj.remove_category_force(category_id=category_id) - logger.info("Category ID # %s was just deleted", category_id) - assert deleted is True - - -@lunchable_cassette -def test_update_category(lunch_money_obj: LunchMoney): - """ - Update a Single Category - """ - category_id = 443128 - updated = lunch_money_obj.update_category( - category_id=category_id, description="Test Category Description Updated" - ) - assert isinstance(updated, bool) - - -@lunchable_cassette -def test_create_category_group(lunch_money_obj: LunchMoney): - """ - Create A Single Category Group - """ - name = "Test Category Group" - category_id = lunch_money_obj.insert_category_group( - name=name, description="Test Category Group!!", exclude_from_budget=True - ) - logger.info("Category Group ID # %s was just created: %s", category_id, name) - assert isinstance(category_id, int) - - -@lunchable_cassette -def test_add_to_category_group(lunch_money_obj: LunchMoney): - """ - Create A Single Category Group - """ - name = "Test Category Group" - category = lunch_money_obj.insert_into_category_group( - category_group_id=658694, - new_categories=["Another Another Test Category"], - category_ids=[443128], - ) - logger.info("Category Group ID # %s was just created: %s", category.id, name) - assert isinstance(category, CategoriesObject) - - -@lunchable_cassette -def test_get_categories_nested(lunch_money_obj: LunchMoney): - """ - Get Categories and Assert that they're categories - """ - categories = lunch_money_obj.get_categories(format="nested") - categories_with_children = list(filter(lambda x: x.children, categories)) - assert len(categories_with_children) >= 1 - - -@lunchable_cassette -def test_get_categories_flattened(lunch_money_obj: LunchMoney): - """ - Get Categories and Assert that they're categories - """ - categories = lunch_money_obj.get_categories(format="flattened") - assert len(categories) >= 1 - for category in categories: - assert isinstance(category, CategoriesObject) diff --git a/tests/models/test_crypto.py b/tests/models/test_crypto.py deleted file mode 100644 index c64cdfa7..00000000 --- a/tests/models/test_crypto.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Run Tests on the Crypto Endpoint -""" - -import logging - -from lunchable import LunchMoney -from lunchable.models.crypto import CryptoObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_crypto(lunch_money_obj: LunchMoney): - """ - Get Crypto and assert its Crypto - """ - cryptos = lunch_money_obj.get_crypto() - assert len(cryptos) >= 1 - for crypto in cryptos: - assert isinstance(crypto, CryptoObject) - logger.info("%s Crypto Accounts returned", len(cryptos)) - - -@lunchable_cassette -def test_update_crypto(lunch_money_obj: LunchMoney): - """ - Update a Crypto Object - """ - crypto = lunch_money_obj.update_crypto(crypto_id=7286, balance=0.50) - assert isinstance(crypto, CryptoObject) - logger.info("Crypto Asset Updated: %s", crypto.id) diff --git a/tests/models/test_plaid_accounts.py b/tests/models/test_plaid_accounts.py deleted file mode 100644 index b1846ffa..00000000 --- a/tests/models/test_plaid_accounts.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -Run Tests on the Plaid Accounts Endpoint -""" - -import logging - -from lunchable import LunchMoney -from lunchable.models.plaid_accounts import PlaidAccountObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_plaid_accounts(lunch_money_obj: LunchMoney): - """ - Get Plaid Account and Assert it's a Plaid Account - """ - plaid_accounts = lunch_money_obj.get_plaid_accounts() - assert len(plaid_accounts) >= 1 - for plaid_account in plaid_accounts: - assert isinstance(plaid_account, PlaidAccountObject) - logger.info("%s Plaid Accounts returned", len(plaid_accounts)) - - -@lunchable_cassette -def test_trigger_fetch_from_plaid(lunch_money_obj: LunchMoney): - """ - Trigger Plaid Fetch - """ - plaid_fetch_request = lunch_money_obj.trigger_fetch_from_plaid() - assert plaid_fetch_request is True diff --git a/tests/models/test_recurring_expenses.py b/tests/models/test_recurring_expenses.py deleted file mode 100644 index 24e2c016..00000000 --- a/tests/models/test_recurring_expenses.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -Run Tests on the Recurring Expenses Endpoint -""" - -import datetime -import logging - -import pytest - -from lunchable import LunchMoney -from lunchable.models.recurring_expenses import RecurringExpensesObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_recurring_expenses( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Get Recurring Expense and Assert it's a Recurring Expense - """ - with pytest.warns(DeprecationWarning): - recurring_expenses = lunch_money_obj.get_recurring_expenses( - start_date=obscure_start_date - ) - assert len(recurring_expenses) >= 1 - for recurring_expense in recurring_expenses: - assert isinstance(recurring_expense, RecurringExpensesObject) - logger.info("%s Recurring Expenses returned", len(recurring_expenses)) diff --git a/tests/models/test_recurring_items.py b/tests/models/test_recurring_items.py deleted file mode 100644 index 08cb0d75..00000000 --- a/tests/models/test_recurring_items.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -Run Tests on the Recurring Items Endpoint -""" - -import datetime -import logging - -from lunchable import LunchMoney -from lunchable.models.recurring_items import RecurringItemsObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_recurring_items( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Get Recurring Items, and ensure they are returned as RecurringItemsObject - """ - recurring_expenses = lunch_money_obj.get_recurring_items( - start_date=obscure_start_date - ) - assert len(recurring_expenses) >= 1 - for recurring_expense in recurring_expenses: - assert isinstance(recurring_expense, RecurringItemsObject) - logger.info("%s Recurring Expenses returned", len(recurring_expenses)) diff --git a/tests/models/test_tags.py b/tests/models/test_tags.py deleted file mode 100644 index 07a88a6c..00000000 --- a/tests/models/test_tags.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Run Tests on the Tags Endpoint -""" - -import logging - -from lunchable import LunchMoney -from lunchable.models.tags import TagsObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_tags(lunch_money_obj: LunchMoney): - """ - Get Plaid Account and Assert it's a Plaid Account - """ - tags = lunch_money_obj.get_tags() - assert len(tags) >= 1 - for tag in tags: - assert isinstance(tag, TagsObject) - logger.info("%s Plaid Accounts returned", len(tags)) diff --git a/tests/models/test_transactions.py b/tests/models/test_transactions.py deleted file mode 100644 index 515f3209..00000000 --- a/tests/models/test_transactions.py +++ /dev/null @@ -1,185 +0,0 @@ -""" -Run Tests on the Transactions Endpoint -""" - -import datetime -import logging -from time import sleep -from typing import List - -from lunchable import LunchMoney -from lunchable.models.transactions import ( - TransactionChildObject, - TransactionInsertObject, - TransactionObject, - TransactionSplitObject, - TransactionUpdateObject, -) -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_transactions(lunch_money_obj: LunchMoney): - """ - Get Transactions and assert they're Transactions - """ - transactions = lunch_money_obj.get_transactions() - assert len(transactions) >= 1 - for transaction in transactions: - assert isinstance(transaction, TransactionObject) - logger.info("%s Transactions returned", len(transactions)) - - -@lunchable_cassette -def test_get_transaction(lunch_money_obj: LunchMoney): - """ - Get Transaction (singular) and assert it's a Transaction - """ - transaction = lunch_money_obj.get_transaction(transaction_id=546434806) - assert isinstance(transaction, TransactionObject) - logger.info("Transaction returned: %s", transaction.id) - - -@lunchable_cassette -def test_insert_transactions( - lunch_money_obj: LunchMoney, test_transactions: List[TransactionObject] -): - """ - Insert a Transaction into Lunch Money - """ - random_note = f"Random Test Description: {datetime.datetime.now()}" - new_transaction = TransactionInsertObject( - date=datetime.datetime.now().date(), - payee="Random Test", - notes=random_note, - amount=3.50, - asset_id=test_transactions[0].asset_id, - ) - response = lunch_money_obj.insert_transactions(transactions=new_transaction) - string_ints = [str(integer) for integer in response] - logger.info("Transactions(s) Created: %s", ", ".join(string_ints)) - for transaction_id in response: - assert isinstance(transaction_id, int) - - -@lunchable_cassette -def test_update_transaction( - lunch_money_obj: LunchMoney, test_transactions: List[TransactionObject] -): - """ - Update a Transaction in Lunch Money - """ - transaction_note = f"Updated on {datetime.datetime.now()}" - transaction_update_obj = TransactionUpdateObject(notes=transaction_note) - response = lunch_money_obj.update_transaction( - transaction_id=test_transactions[1].id, transaction=transaction_update_obj - ) - assert response["updated"] is True - - -@lunchable_cassette -def test_create_and_delete_transaction_group( - lunch_money_obj: LunchMoney, test_transactions: List[TransactionObject] -): - """ - Create a transaction group - """ - group_id = lunch_money_obj.insert_transaction_group( - date=datetime.datetime.now().date(), - payee="Test", - notes="Test Transaction Group", - transactions=[test_transactions[1].id, test_transactions[2].id], - ) - assert isinstance(group_id, int) - logger.info("Transaction Group created, ID# %s", group_id) - sleep(1) - response = lunch_money_obj.remove_transaction_group(transaction_group_id=group_id) - for transaction_id in response: - assert isinstance(transaction_id, int) - logger.info("Transactions part of group: %s", response) - - -@lunchable_cassette -def test_split_transaction(lunch_money_obj: LunchMoney): - """ - Try to split a transaction - """ - transaction_to_split = lunch_money_obj.get_transaction(179018320) - amount_1 = transaction_to_split.amount / 2 - split_object = TransactionSplitObject( - date=transaction_to_split.date, - category_id=transaction_to_split.category_id, - notes=transaction_to_split.notes, - amount=amount_1, - ) - split_object_2 = split_object.model_copy() - new_split = lunch_money_obj.update_transaction( - transaction_id=transaction_to_split.id, split=[split_object, split_object_2] - ) - assert len(new_split["split"]) == 2 - - -@lunchable_cassette -def test_unsplit_transaction(lunch_money_obj: LunchMoney): - """ - Try to unsplit a transaction - """ - transaction_ids = [179018299] - response = lunch_money_obj.unsplit_transactions( - parent_ids=transaction_ids, remove_parents=True - ) - assert len(response) == 3 - - -@lunchable_cassette -def test_get_uncleared_transactions(lunch_money_obj: LunchMoney) -> None: - """ - Get uncleared transactions - - Enum values previously weren't getting JSON encoded - """ - uncleared_transactions = lunch_money_obj.get_transactions(status="uncleared") - assert len(uncleared_transactions) >= 1 - for transaction in uncleared_transactions: - assert isinstance(transaction, TransactionObject) - - -@lunchable_cassette -def test_204_response(lunch_money_obj: LunchMoney) -> None: - """ - Test that a 204 response is handled correctly - - This test includes a hand-edited cassette to simulate a 204 response - """ - test_transaction = TransactionInsertObject( - date=datetime.date.today(), - payee="Test", - notes="Test Transaction Group", - amount=3.50, - ) - response = lunch_money_obj.insert_transactions(transactions=test_transaction) - assert response == [] - - -@lunchable_cassette -def test_get_transaction_group(lunch_money_obj: LunchMoney) -> None: - """ - Test get_transaction_group - """ - transaction_group = lunch_money_obj.get_transaction_group(transaction_id=856827078) - assert isinstance(transaction_group, TransactionObject) - assert transaction_group.is_group is True - assert isinstance(transaction_group.children[0], TransactionChildObject) - - -@lunchable_cassette -def test_get_transactions_no_paginate(lunch_money_obj: LunchMoney) -> None: - """ - Test get_transactions with no pagination - """ - transactions = lunch_money_obj.get_transactions(limit=5) - assert len(transactions) >= 1 - for transaction in transactions: - assert isinstance(transaction, TransactionObject) diff --git a/tests/models/test_user.py b/tests/models/test_user.py deleted file mode 100644 index 649a619c..00000000 --- a/tests/models/test_user.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Run Tests on the Miscellaneous Endpoints -""" - -import logging - -from lunchable import LunchMoney -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_user(lunch_money_obj: LunchMoney): - """ - Get Me Object - """ - me = lunch_money_obj.get_user() - assert isinstance(me.user_id, int) - assert isinstance(me.user_email, str) - assert isinstance(me.budget_name, str) - assert me.api_key_label == "Lunchable" diff --git a/tests/test_cli.py b/tests/test_cli.py deleted file mode 100644 index 2a1d7d8a..00000000 --- a/tests/test_cli.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Test cases for the __main__ module. -""" - -import pytest -from click.testing import CliRunner - - -@pytest.fixture -def runner() -> CliRunner: - """ - Fixture for invoking command-line interfaces. - """ - return CliRunner() - - -@pytest.mark.filterwarnings("ignore:datetime.datetime.utcfromtimestamp") -def test_main_succeeds(runner: CliRunner) -> None: - """ - It exits with a status code of zero. - """ - from lunchable._cli import cli - - result = runner.invoke(cli) - assert result.exit_code == 0 - - -def test_registered_plugins(runner: CliRunner) -> None: - """ - Assert that all registered plugins are available. - """ - from lunchable._cli import cli - - builtin_plugins = ["primelunch", "splitlunch", "pushlunch"] - - for plugin in builtin_plugins: - result = runner.invoke(cli, ["plugins", plugin, "--help"]) - assert result.exit_code == 0