commit 33ff3d5cc71fb68b516a8db91d5931baa2f905da Author: sonali Date: Thu Dec 19 18:17:59 2024 +0530 " new project set " diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..0607215 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +node_modules +npm-debug.log +build +.dockerignore +**/.git +**/.DS_Store +**/node_modules \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..60b9f0a --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage +/backend + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/backend \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ca0d552 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,58 @@ +# syntax=docker/dockerfile:1.4 + +# 1. For build React app +FROM node:lts AS development + +# Set working directory +WORKDIR /app + +# +COPY package.json /app/package.json +COPY package-lock.json /app/package-lock.json + +# Same as npm install +RUN npm ci + +COPY . /app + +ENV CI=true +ENV PORT=3000 + +CMD [ "npm", "start" ] + +FROM development AS build + +RUN npm run build + + +FROM development as dev-envs +RUN < into src/components/external/ +- Use this repo: https://git.humbingo.in/Humbingo/api-manager.git + + +Get started + +- Just clone current repo to your system +- Create project repo to your Version Control System (git/bitbucket) +- Open react-placeholder repo into vscode +- Create Local branch transfer1 +- Remove origin of react-placeholder +- Add new origin to your repo +NOTE: Direct Merging to masterbranch can cause empty reference push to your repo. +- Push transfer1 branch +- Create pr to master branch of your repo +- Merge transfer1 to master + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7a751e8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,25106 @@ +{ + "name": "react-placeholder", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-placeholder", + "version": "1.0.0", + "dependencies": { + "@emotion/react": "^11.13.0", + "@emotion/styled": "^11.13.0", + "@fortawesome/free-solid-svg-icons": "^6.6.0", + "@fortawesome/react-fontawesome": "^0.2.2", + "@mui/icons-material": "^5.16.7", + "@mui/material": "^5.16.7", + "@stripe/react-stripe-js": "^3.0.0", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "antd": "^5.22.2", + "axios": "^1.7.4", + "chart.js": "^4.4.6", + "jwt-decode": "^4.0.0", + "libphonenumber-js": "^1.11.8", + "moment": "^2.30.1", + "multiselect-react-dropdown": "^2.0.25", + "react": "^18.3.1", + "react-bootstrap": "^2.10.4", + "react-chartjs-2": "^5.2.0", + "react-country-state-city": "^1.1.3", + "react-datepicker": "^7.4.0", + "react-dom": "^18.3.1", + "react-hook-form": "^7.53.0", + "react-modal": "^3.16.1", + "react-phone-input-2": "^2.15.1", + "react-phone-number-input": "^3.4.5", + "react-qr-barcode-scanner": "^2.0.0", + "react-router": "^6.26.1", + "react-router-dom": "^6.26.1", + "react-scripts": "5.0.1", + "react-tel-input": "^0.1.14", + "react-toastify": "^10.0.5", + "recharts": "^2.13.3", + "sweetalert2": "^11.14.4", + "web-vitals": "^2.1.4" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", + "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.6.1" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.22.0.tgz", + "integrity": "sha512-W9XSFeRPR0mAN3OuxfuS/xhENCYKf+8s+QyNNER0FSWoK9OpISTag6CCweg6lq0hASQ/2Vcza0Z8/kGivCP0Ng==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.1.tgz", + "integrity": "sha512-2HAiyGGGnM0es40SxdszeQAU5iWp41wBIInq+ONTCKjlSKOrzQfnw4JDtB8IBmqE6tQaEKwmzTP2LGdt5DSwYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/cssinjs/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@ant-design/cssinjs/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@ant-design/cssinjs/node_modules/stylis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", + "license": "MIT" + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.5.1.tgz", + "integrity": "sha512-0UrM02MA2iDIgvLatWrj6YTCYe0F/cwXvVE0E2SqGrL7PZireQwgEKTKBisWpZyal5eXZLvuM98kju6YtYne8w==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz", + "integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", + "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz", + "integrity": "sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-decorators": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", + "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", + "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", + "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-flow": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.1.tgz", + "integrity": "sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.0", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", + "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "license": "MIT" + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", + "license": "CC0-1.0" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", + "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", + "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", + "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.9.0", + "@emotion/utils": "^1.4.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", + "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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==", + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", + "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.24", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.24.tgz", + "integrity": "sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", + "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz", + "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz", + "integrity": "sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", + "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/console/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/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==", + "license": "MIT" + }, + "node_modules/@jest/console/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/core/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/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==", + "license": "MIT" + }, + "node_modules/@jest/core/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils/node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/reporters/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/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==", + "license": "MIT" + }, + "node_modules/@jest/reporters/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/transform/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/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==", + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@jest/transform/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/types/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/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==", + "license": "MIT" + }, + "node_modules/@jest/types/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", + "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.7.tgz", + "integrity": "sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", + "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.16.7", + "@mui/system": "^5.16.7", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/@mui/private-theming": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.6", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", + "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", + "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", + "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.5.tgz", + "integrity": "sha512-F1EJ4KjFpGAHAjuKvOyZB/6IZDkVx0bHl0M4fQM5wXcmm7lgTgVSSnR3bXwdmS6jOJGHOqfDxIJW3WUvwMIXhQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.5.tgz", + "integrity": "sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", + "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.8.0.tgz", + "integrity": "sha512-xJEOXUOTmT4FngTmhdjKFRrVVF0hwCLNPdatLCHkyS4dkiSK12cEu1Y0fjxktjJrdst9jJIc5J6ihMJCoWEN/g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@popperjs/core": "^2.11.6", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.4.9", + "@types/warning": "^3.0.0", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.14.0" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@stripe/react-stripe-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-3.0.0.tgz", + "integrity": "sha512-Crn9t+uvfEJnFSEE8Le9Boj3+J4QdB7DrIa+VyhDgTAHC1z9fk7d/cfSrjNO2RcdRh9zN9Blk/XKccHq9kUlTw==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "@stripe/stripe-js": "^1.44.1 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@stripe/stripe-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-5.2.0.tgz", + "integrity": "sha512-2ZpEaezx3S0QPtnske175NDaLvUvaVKd4ePHpUN0QF/uV4BBBBRUy5BvQONDym+utbbW0QhSJoiRPnp4FS+4Vg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.16" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "license": "MIT", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/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==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "peer": true, + "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/@testing-library/dom/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==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/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==", + "license": "MIT", + "peer": true + }, + "node_modules/@testing-library/dom/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==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/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==", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/jest-dom/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==", + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/react/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/react/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@testing-library/react/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/react/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==", + "license": "MIT" + }, + "node_modules/@testing-library/react/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "8.56.11", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz", + "integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@types/jest/node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/jest/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@types/jest/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@types/jest/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==", + "license": "MIT" + }, + "node_modules/@types/jest/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/jest/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/@types/jest/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.2.tgz", + "integrity": "sha512-nAvM3Ey230/XzxtyDcJ+VjvlzpzoHwLsF7JaDRfoI0ytO0mVheerNmM45CtA0yOILXwXXxOrcUWH3wltX+7PSw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", + "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "license": "MIT", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/warning": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/@zxing/library": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.21.3.tgz", + "integrity": "sha512-hZHqFe2JyH/ZxviJZosZjV+2s6EDSY0O24R+FQmlWZBZXP9IqMo7S3nb3+2LBWxodJQkSurdQGnqE7KXqrYgow==", + "license": "MIT", + "dependencies": { + "ts-custom-error": "^3.2.1" + }, + "engines": { + "node": ">= 10.4.0" + }, + "optionalDependencies": { + "@zxing/text-encoding": "~0.9.0" + } + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "license": "(Unlicense OR Apache-2.0)", + "optional": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/align-text/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "license": "BSD-3-Clause OR MIT", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/antd": { + "version": "5.22.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.22.2.tgz", + "integrity": "sha512-vihhiJbm9VG3d6boUeD1q2MXMax+qBrXhgqCEC+45v8iGUF6m4Ct+lFiCW4oWaN3EABOsbVA6Svy3Rj/QkQFKw==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.1.0", + "@ant-design/cssinjs": "^1.21.1", + "@ant-design/cssinjs-utils": "^1.1.1", + "@ant-design/icons": "^5.5.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.25.7", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.2.5", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.30.0", + "rc-checkbox": "~3.3.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.2.0", + "rc-dropdown": "~4.2.0", + "rc-field-form": "~2.5.1", + "rc-image": "~7.11.0", + "rc-input": "~1.6.3", + "rc-input-number": "~9.3.0", + "rc-mentions": "~2.17.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.9.3", + "rc-notification": "~5.6.2", + "rc-pagination": "~4.3.0", + "rc-picker": "~4.8.1", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.5.0", + "rc-select": "~14.16.3", + "rc-slider": "~11.1.7", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.48.1", + "rc-tabs": "~15.4.0", + "rc-textarea": "~1.8.2", + "rc-tooltip": "~6.2.1", + "rc-tree": "~5.10.1", + "rc-tree-select": "~5.24.4", + "rc-upload": "~4.8.1", + "rc-util": "^5.43.0", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/babel-jest/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/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==", + "license": "MIT" + }, + "node_modules/babel-jest/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause" + }, + "node_modules/browserify-aes": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", + "integrity": "sha512-hnvbMhZ/Ete34qnoKKyjikiYQfZbl89d5UZ29cz3EG13cv/8VRyM8Zs84luB/O7BRzC3qSng9dVovJ6jghcAvg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "license": "MIT", + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "license": "MIT", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chart.js": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz", + "integrity": "sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "license": "MIT" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "license": "MIT" + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compression/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==", + "license": "MIT" + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", + "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/country-flag-icons": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.5.13.tgz", + "integrity": "sha512-4JwHNqaKZ19doQoNcBjsoYA+I7NqCH/mC/6f5cBWvdKzcK5TMmzLpq3Z/syVHMHJuDGFwJ+rPpGizvrqJybJow==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", + "integrity": "sha512-9n5nGl6D8zb29Ui8Ji8pVdUIE3RUe6A9zQf2iLPjFKftnkkkJBCGb7TkYAFNjt9nfsvZTLL52CwxzS9Tw7Bujw==", + "license": "MIT", + "dependencies": { + "browserify-aes": "0.4.0", + "pbkdf2-compat": "2.0.1", + "ripemd160": "0.2.0", + "sha.js": "2.2.6" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "license": "MIT", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/csso/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "license": "MIT" + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "license": "MIT" + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "license": "MIT" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "license": "BSD-2-Clause" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.12.tgz", + "integrity": "sha512-tIhPkdlEoCL1Y+PToq3zRNehUaKp3wBX/sr7aclAWdIWjvqAe/Im/H0SiCM4c1Q8BLPHCdoJTol+ZblflydehA==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/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==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", + "license": "MIT", + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/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==", + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/eslint/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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==", + "license": "MIT" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "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/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", + "license": "BSD-3-Clause" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "license": "MIT", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "license": "MIT", + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "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/fast-glob/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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT", + "optional": true + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/fork-ts-checker-webpack-plugin/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "license": "MIT" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "license": "MIT", + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "license": "ISC", + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-base/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "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/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/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==", + "license": "MIT", + "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/hpack.js/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==", + "license": "MIT" + }, + "node_modules/hpack.js/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha512-EjDQFbgJr1vDD/175UJeSX3ncQ3+RUnCL5NkthQGHvF4VNHlzTy8ifJfTqz47qiPRqaFH58+CbuG3x51WuB1XQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/input-format": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/input-format/-/input-format-0.3.10.tgz", + "integrity": "sha512-5cFv/kOZD7Ch0viprVkuYPDkAU7HBZYBx8QrIpQ6yXUWbAQ0+RQ8IIojDJOf/RO6FDJLL099HDSK2KoVZ2zevg==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", + "integrity": "sha512-Vg6X07U0AOZb4HF6CWHa+jnJU8j71buKQ9Pc0C75qBXgvCYbxWBkGo4jnTS3O0MIc9FZtt0mB7h+uclojqdw1Q==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "license": "MIT", + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isobject/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jake/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/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==", + "license": "MIT" + }, + "node_modules/jake/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-circus/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/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==", + "license": "MIT" + }, + "node_modules/jest-circus/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-cli/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/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==", + "license": "MIT" + }, + "node_modules/jest-cli/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-config/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/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==", + "license": "MIT" + }, + "node_modules/jest-config/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-diff/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/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==", + "license": "MIT" + }, + "node_modules/jest-diff/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-each/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/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==", + "license": "MIT" + }, + "node_modules/jest-each/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-jasmine2/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/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==", + "license": "MIT" + }, + "node_modules/jest-jasmine2/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-matcher-utils/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/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==", + "license": "MIT" + }, + "node_modules/jest-matcher-utils/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-message-util/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/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==", + "license": "MIT" + }, + "node_modules/jest-message-util/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-resolve/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/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==", + "license": "MIT" + }, + "node_modules/jest-resolve/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-runner/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/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==", + "license": "MIT" + }, + "node_modules/jest-runner/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-runtime/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/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==", + "license": "MIT" + }, + "node_modules/jest-runtime/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-snapshot/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "license": "MIT" + }, + "node_modules/jest-snapshot/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-util/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/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==", + "license": "MIT" + }, + "node_modules/jest-util/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-validate/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/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==", + "license": "MIT" + }, + "node_modules/jest-validate/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watch-typeahead/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-watch-typeahead/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watch-typeahead/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==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-watcher/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/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==", + "license": "MIT" + }, + "node_modules/jest-watcher/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz", + "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.8.tgz", + "integrity": "sha512-0fv/YKpJBAgXKy0kaS3fnqoUVN8901vUYAKIGD/MWZaDfhJt1nZjPL3ZzdZBt/G8G8Hw2J1xOIrXWdNHFHPAvg==", + "license": "MIT" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "node_modules/lodash.startswith": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", + "integrity": "sha512-XClYR1h4/fJ7H+mmCKppbiBmljN/nGs73iq2SjCT9SF4CBPoUHzLvWmH1GtZMhMBZSiRkHXfeA2RY1eIlJ75ww==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "license": "MIT" + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memory-fs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", + "integrity": "sha512-QTNXnl79X97kZ9jJk/meJrtDuvgvRakX5LU7HZW1L7MsXHuSTwoMIzN9tOLLH3Xfsj/gbsSqX/ovnsqz246zKQ==", + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/memory-fs/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==", + "license": "MIT", + "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/memory-fs/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==", + "license": "MIT" + }, + "node_modules/memory-fs/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multiselect-react-dropdown": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/multiselect-react-dropdown/-/multiselect-react-dropdown-2.0.25.tgz", + "integrity": "sha512-z8kUSyBNOuV7vn4Dk35snzXWtIfTdSEEXhgDdLMvOmR+xJFx35vc1voUlSuOvrk3khb+hXC219Qs9szOvNm25Q==", + "license": "MIT", + "peerDependencies": { + "react": "^16.7.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "license": "MIT", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-libs-browser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", + "integrity": "sha512-V0EeBff5/nauAta4yGYMdn/CYXpn2KYcE8r6rwU9qJDXG6wMrBhtWVfoKWphSvsnX+mZk6DzaGSO+Yz/MGBAGQ==", + "license": "MIT", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.1.4", + "buffer": "^4.9.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "3.3.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "0.0.1", + "os-browserify": "^0.2.0", + "path-browserify": "0.0.0", + "process": "^0.11.0", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.0.5", + "stream-browserify": "^2.0.1", + "stream-http": "^2.3.1", + "string_decoder": "^0.10.25", + "timers-browserify": "^2.0.2", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "node_modules/node-libs-browser/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/node-libs-browser/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, + "node_modules/node-libs-browser/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==", + "license": "MIT", + "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/node-libs-browser/node_modules/readable-stream/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/node-libs-browser/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==", + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "license": "MIT", + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "ISC", + "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==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "license": "MIT/X11", + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha512-vHbnbzdqWJWvGOm7aOMDXHVUykPG0GdhfLkn5ZDmvbRI+wPj/XoB0/CRAkP9v28eZ7REIPPHJa+8ZEYixsWKmQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "license": "MIT", + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "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/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha512-WA3pxi1olUQcsl82W576vkqhUSGp0uBtr/381pxx5WXLp3NC+AB99hUG3aGW7H0Kg9PFr1D8wv1iJeICe+9Mhw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2-compat": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", + "integrity": "sha512-JYubxYhymODUUWVq9/Tmo9VQFZ8LyrD/pbXVpwmt1Npr2z29KZwp7+IBT3/PRjr1xpecX4W1EcbjFjp8nE3stQ==", + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/postcss-svgo/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "license": "MIT", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "license": "MIT", + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc-cascader": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.30.0.tgz", + "integrity": "sha512-rrzSbk1Bdqbu+pDwiLCLHu72+lwX9BZ28+JKzoi0DWZ4N29QYFeip8Gctl33QVd2Xg3Rf14D3yAOG76ElJw16w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.10.1", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.3.0.tgz", + "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", + "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", + "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.5.1.tgz", + "integrity": "sha512-33hunXwynQJyeae7LS3hMGTXNeRBjiPyPYgB0824EbmLHiXC1EBGyUwRh6xjLRy9c+en5WARYN0gJz5+JAqwig==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.11.0.tgz", + "integrity": "sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.6.3.tgz", + "integrity": "sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.3.0.tgz", + "integrity": "sha512-JQ363ywqRyxwgVxpg2z2kja3CehTpYdqR7emJ/6yJjRdbvo+RvfE83fcpBCIJRq3zLp8SakmEXq60qzWyZ7Usw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.6.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.17.0.tgz", + "integrity": "sha512-sfHy+qLvc+p8jx8GUsujZWXDOIlIimp6YQz7N5ONQ6bHsa2kyG+BLa5k2wuxgebBbH97is33wxiyq5UkiXRpHA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.6.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.8.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.0.tgz", + "integrity": "sha512-vAL0yqPkmXWk3+YKRkmIR8TYj3RVdEt3ptG2jCJXWNAvQbT0VJJdRyHZ7kG/l1JsZlB+VJq/VcYOo69VR4oD+w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.3.tgz", + "integrity": "sha512-rkW47ABVkic7WEB0EKJqzySpvDqwl60/tdkY7hWP7dYnh5pm0SzJpo54oW3TDUGXV5wfxXFmMkxrzRRbotQ0+w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.2.tgz", + "integrity": "sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.3.0.tgz", + "integrity": "sha512-UubEWA0ShnroQ1tDa291Fzw6kj0iOeF26IsUObxYTpimgj4/qPCWVFl18RLZE+0Up1IZg0IK4pMn6nB3mjvB7g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.8.1.tgz", + "integrity": "sha512-lj9hXXMSkbjFUIhfQh8XH698ybxnoBOfq7pdM1FvfSyDwdFhdQa7dvsIYwo6Uz7Zp1wVkfw5rOJO3MpdWzoHsg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", + "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.38.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.5.0.tgz", + "integrity": "sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.3", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.3.tgz", + "integrity": "sha512-51+j6s3fJJJXB7E+B6W1hM4Tjzv1B/Decooz9ilgegDBt3ZAth1b/xMwYCTrT5BbG2e53XACQsyDib2+3Ro1fg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.7", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.7.tgz", + "integrity": "sha512-ytYbZei81TX7otdC0QvoYD72XSlxvTihNth5OeZ6PMXyEDq/vHdWFulQmfDGyXK1NwKwSlKgpvINOa88uT5g2A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.48.1", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.48.1.tgz", + "integrity": "sha512-Z4mDKjWg+xz/Ezdw6ivWcbqRpaJ0QfCORRoRrlrw65KSGZLK8OcTdacH22/fyGb8L4It/0/9qcMm8VrVAk/WBw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.41.0", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.4.0.tgz", + "integrity": "sha512-llKuyiAVqmXm2z7OrmhX5cNb2ueZaL8ZyA2P4R+6/72NYYcbEgOXibwHiQCFY2RiN3swXl53SIABi2CumUS02g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.8.2.tgz", + "integrity": "sha512-UFAezAqltyR00a8Lf0IPAyTd29Jj9ee8wt8DqXyDMal7r/Cg/nDt3e1OOv3Th4W6mKaZijjgwuPXhAfVNTN8sw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.6.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.1.tgz", + "integrity": "sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.10.1.tgz", + "integrity": "sha512-FPXb3tT/u39mgjr6JNlHaUTYfHkVGW56XaGDahDpEFLGsnPxGcVLNTjcqoQb/GNbSCycl7tD7EvIymwOTP0+Yw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.24.4", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.24.4.tgz", + "integrity": "sha512-MzljkSkk7weKOcE853UtYlXB6uyUEzcEQhhpaCwE6jQPbmBUgGiRURuKWpYUnM/dXrwTTlCK969M6Pgjj35MLA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.10.1", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.8.1.tgz", + "integrity": "sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.43.0.tgz", + "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/rc-virtual-list": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.15.0.tgz", + "integrity": "sha512-dF2YQztqrU3ijAeWOqscTshCEr7vpimzSqAVjO1AyAmaqcHulaXpnGR0ptK5PXfxTUy48VkJOiglMIxlkYGs0w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "license": "MIT", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/react-bootstrap": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.4.tgz", + "integrity": "sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.6.9", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-country-state-city": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/react-country-state-city/-/react-country-state-city-1.1.3.tgz", + "integrity": "sha512-/P3afDKRJ6gMe4SfYZ8FockUDmQfjLNgxYzqYtsP0vPggFJyq1eI/XoV2ArdvV6ISsbE04dPO/PiKl5Y2LLIcA==", + "license": "MIT", + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/react-datepicker": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.4.0.tgz", + "integrity": "sha512-vSSok4DTZ9/Os8O4HjZLxh4SZVFU6dQvoCX6mfbNdBqMsBBdzftrvMz0Nb4UUVVbgj9o8PfX84K3/31oPrTqmg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.26.23", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/react-dev-utils/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-dev-utils/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==", + "license": "MIT" + }, + "node_modules/react-dev-utils/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", + "license": "MIT" + }, + "node_modules/react-hook-form": { + "version": "7.53.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz", + "integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, + "node_modules/react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "license": "MIT", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" + } + }, + "node_modules/react-onclickoutside": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-4.9.0.tgz", + "integrity": "sha512-q9H25qcZakiJF0jgw9Ql2CKnCl7cr6kdqetTITeuxoGhXoNWqegnfUdA8LXfPDRVGerwb3m+Ow2OXpduH7ZvCw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.0.1" + } + }, + "node_modules/react-phone-input-2": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/react-phone-input-2/-/react-phone-input-2-2.15.1.tgz", + "integrity": "sha512-W03abwhXcwUoq+vUFvC6ch2+LJYMN8qSOiO889UH6S7SyMCQvox/LF3QWt+cZagZrRdi5z2ON3omnjoCUmlaYw==", + "license": "MIT", + "dependencies": { + "classnames": "^2.2.6", + "lodash.debounce": "^4.0.8", + "lodash.memoize": "^4.1.2", + "lodash.reduce": "^4.6.0", + "lodash.startswith": "^4.2.1", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0", + "react-dom": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0" + } + }, + "node_modules/react-phone-number-input": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/react-phone-number-input/-/react-phone-number-input-3.4.5.tgz", + "integrity": "sha512-IlLTG0F/2P+72drqGNiYaguV3KOD4EVxQWGJ7YSofbOb6vyCWWLJqQIQsFFNpfrMrXzYtB3G+aHL9tprGfisFw==", + "license": "MIT", + "dependencies": { + "classnames": "^2.5.1", + "country-flag-icons": "^1.5.11", + "input-format": "^0.3.10", + "libphonenumber-js": "^1.11.5", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-qr-barcode-scanner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-qr-barcode-scanner/-/react-qr-barcode-scanner-2.0.0.tgz", + "integrity": "sha512-H+bjAi9ulYpW3RE3/I15CBkFQbQulkvFkyin1LO+cwEpbbZmRU/UQ+cDuvIdPpXXc1XvBT46uqYnHra7PMXgXw==", + "license": "MIT", + "dependencies": { + "@types/react": "^18.2.0", + "@zxing/library": "^0.21.3", + "react-webcam": "^7.1.1" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", + "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", + "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.1", + "react-router": "6.26.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-smooth": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz", + "integrity": "sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-tel-input": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/react-tel-input/-/react-tel-input-0.1.14.tgz", + "integrity": "sha512-mhxv4lDgWZ5PM476lR8qxe1emoWtJz0pymastBwP4kahom1ETEsyf//JFhK9Bc2IWwcgKqy9b58PFSfS9BFT+A==", + "license": "MIT", + "dependencies": { + "classnames": "^2.1.2", + "lodash": "^3.0.0", + "react": ">=0.14.7", + "react-dom": ">=0.14.7", + "react-onclickoutside": "^4.5.0", + "webpack": "^1.12.6" + } + }, + "node_modules/react-tel-input/node_modules/acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/react-tel-input/node_modules/anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "license": "ISC", + "dependencies": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "node_modules/react-tel-input/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "license": "MIT" + }, + "node_modules/react-tel-input/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/react-tel-input/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "license": "MIT", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "license": "MIT", + "dependencies": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "optionalDependencies": { + "fsevents": "^1.0.0" + } + }, + "node_modules/react-tel-input/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/react-tel-input/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react-tel-input/node_modules/enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/react-tel-input/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", + "license": "MIT" + }, + "node_modules/react-tel-input/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/react-tel-input/node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "license": "ISC", + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/react-tel-input/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/react-tel-input/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/react-tel-input/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "license": "MIT", + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/react-tel-input/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "license": "MIT" + }, + "node_modules/react-tel-input/node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "license": "MIT", + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/react-tel-input/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/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==", + "license": "MIT", + "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/react-tel-input/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/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==", + "license": "MIT" + }, + "node_modules/react-tel-input/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/react-tel-input/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "license": "MIT", + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/react-tel-input/node_modules/tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/react-tel-input/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tel-input/node_modules/watchpack": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", + "integrity": "sha512-hmLWdxNfe0Ou1xaRj+ublbOYUaZJfVz1VuHQfERLVlUrLS21gUaGa2gWRl8L5Ej1aUS3KxFN+1qoWK4kZLMvKw==", + "license": "MIT", + "dependencies": { + "async": "^0.9.0", + "chokidar": "^1.0.0", + "graceful-fs": "^4.1.2" + } + }, + "node_modules/react-tel-input/node_modules/watchpack/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "license": "MIT" + }, + "node_modules/react-tel-input/node_modules/webpack": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", + "integrity": "sha512-+8bxNSHMZCWBa6hi++2A2pw9GmLUWY6lII+aIXlgUPpB+ClNrUKgP8hx0w+hxjWhX81hclUYPGFg+7NxgLTUYQ==", + "license": "MIT", + "dependencies": { + "acorn": "^3.0.0", + "async": "^1.3.0", + "clone": "^1.0.2", + "enhanced-resolve": "~0.9.0", + "interpret": "^0.6.4", + "loader-utils": "^0.2.11", + "memory-fs": "~0.3.0", + "mkdirp": "~0.5.0", + "node-libs-browser": "^0.7.0", + "optimist": "~0.6.0", + "supports-color": "^3.1.0", + "tapable": "~0.1.8", + "uglify-js": "~2.7.3", + "watchpack": "^0.2.1", + "webpack-core": "~0.6.9" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/react-toastify": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.5.tgz", + "integrity": "sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-webcam": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.2.0.tgz", + "integrity": "sha512-xkrzYPqa1ag2DP+2Q/kLKBmCIfEx49bVdgCCCcZf88oF+0NPEbkwYk3/s/C7Zy0mhM8k+hpdNkBLzxg8H0aWcg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.2.0", + "react-dom": ">=16.2.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.13.3.tgz", + "integrity": "sha512-YDZ9dOfK9t3ycwxgKbrnDlRC4BHdjlY73fet3a0C1+qGMjXVZe6+VXmpOIIhzkje5MMEL8AN4hLIe4AMskBzlA==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.0", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "license": "MIT", + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "license": "ISC" + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "license": "MIT" + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "license": "MIT", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", + "integrity": "sha512-JJsJ74Mw4sUDDisXGDnNNyN9xWmt5HcH6Kwvb/0m/IvTKjnLAtZfzeoLdpxk44AxQZki54oCCd+Kt0nPQ2AF2g==" + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + "license": "CC0-1.0" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", + "integrity": "sha512-GC+qN4sf/O6bDwz6CHaz8HVQfLbbNyIsXpTZLiD5c1badnWA63WVAH1msoCq+fXcV0dZ50jxTqKA8seu40845A==", + "license": "MIT", + "bin": { + "sha.js": "bin.js" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "license": "MIT" + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/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==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/stream-browserify/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==", + "license": "MIT", + "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/stream-browserify/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==", + "license": "MIT" + }, + "node_modules/stream-browserify/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/stream-http/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==", + "license": "MIT", + "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/stream-http/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==", + "license": "MIT" + }, + "node_modules/stream-http/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "license": "MIT" + }, + "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==", + "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/string-width-cjs": { + "name": "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==", + "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/string-width-cjs/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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/sweetalert2": { + "version": "11.14.4", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.14.4.tgz", + "integrity": "sha512-8QMzjxCuinwm18EK5AtYvuhP+lRMRxTWVXy8om9wGlULsXSI4TD29kyih3VYrSXMMBlD4EShFvNC7slhTC7j0w==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", + "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "license": "MIT" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", + "integrity": "sha512-RvbIYn4DIadCg1MV7YP7OrpxnVrtEieZzbK0KSQvwWGAHojqWJxInkQhmtYGRo9PTwwkJkljIgzMyA1VitEc4Q==", + "license": "BSD-2-Clause", + "dependencies": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "node_modules/uglify-js/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js/node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "license": "ISC", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "license": "MIT/X11", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/uglify-js/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "license": "MIT", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, + "node_modules/url/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha512-NyZNR3WDah+NPkjh/YmhuWSsT4a0mF0BJYgUmvrJ70zxjTXh5Y2Asobxlh0Nfs0PCFB5FVpRJft7NozAWFMwLQ==", + "license": "MIT", + "dependencies": { + "indexof": "0.0.1" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha512-P6ZUGXn5buTEZyTStCHHLwtWGKSm/jA629Zgp4pcHSsy60CCsT9MaHDxNIPL+GGJ2KwOgI6ORwQtHcrYHAt2UQ==", + "dependencies": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/webpack-core/node_modules/source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha512-cabwdhnSNf/tTDMh/DXZXlkeQLvdYT5xfGYBohqHG7wb3bBQrQlHQNWM9NWSOboXXK1zgwz6JzS5e4hZq9vxMw==", + "license": "MIT" + }, + "node_modules/webpack-core/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "license": "BSD-3-Clause", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "license": "MIT", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "license": "MIT" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "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==", + "license": "MIT", + "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-cjs": { + "name": "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==", + "license": "MIT", + "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-cjs/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "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==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "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==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6c7d874 --- /dev/null +++ b/package.json @@ -0,0 +1,67 @@ +{ + "name": "react-placeholder", + "version": "1.0.0", + "private": true, + "dependencies": { + "@emotion/react": "^11.13.0", + "@emotion/styled": "^11.13.0", + "@fortawesome/free-solid-svg-icons": "^6.6.0", + "@fortawesome/react-fontawesome": "^0.2.2", + "@mui/icons-material": "^5.16.7", + "@mui/material": "^5.16.7", + "@stripe/react-stripe-js": "^3.0.0", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "antd": "^5.22.2", + "axios": "^1.7.4", + "chart.js": "^4.4.6", + "jwt-decode": "^4.0.0", + "libphonenumber-js": "^1.11.8", + "moment": "^2.30.1", + "multiselect-react-dropdown": "^2.0.25", + "react": "^18.3.1", + "react-bootstrap": "^2.10.4", + "react-chartjs-2": "^5.2.0", + "react-country-state-city": "^1.1.3", + "react-datepicker": "^7.4.0", + "react-dom": "^18.3.1", + "react-hook-form": "^7.53.0", + "react-modal": "^3.16.1", + "react-phone-input-2": "^2.15.1", + "react-phone-number-input": "^3.4.5", + "react-qr-barcode-scanner": "^2.0.0", + "react-router": "^6.26.1", + "react-router-dom": "^6.26.1", + "react-scripts": "5.0.1", + "react-tel-input": "^0.1.14", + "react-toastify": "^10.0.5", + "recharts": "^2.13.3", + "sweetalert2": "^11.14.4", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..641f2f1 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine On +RewriteBase /subdirectory +RewriteRule ^index\.html$ - [L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME} !-l +RewriteRule . /index.html [L] \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..7f471dc Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..7e1c132 --- /dev/null +++ b/public/index.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Ezhisab + + + + +
+ + + + diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..1f2f141 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000..b760fca --- /dev/null +++ b/src/App.js @@ -0,0 +1,21 @@ +import React from 'react'; +import { BrowserRouter} from 'react-router-dom'; +import { AuthProvider } from './utils/secure-route/AuthContext'; +import RouteManager from './utils/secure-route/routeManager/RouteManager'; +import './assets/css/App.css' +import { ToastContainer } from 'react-toastify'; +import 'react-toastify/dist/ReactToastify.css'; +const App = () => { + return ( + <> + + + + + + + + ); +}; + +export default App; diff --git a/src/assets/Image/paisavala.png b/src/assets/Image/paisavala.png new file mode 100644 index 0000000..c719820 Binary files /dev/null and b/src/assets/Image/paisavala.png differ diff --git a/src/assets/Image/settings.png b/src/assets/Image/settings.png new file mode 100644 index 0000000..5183099 Binary files /dev/null and b/src/assets/Image/settings.png differ diff --git a/src/assets/css/App.css b/src/assets/css/App.css new file mode 100644 index 0000000..2e2b4a9 --- /dev/null +++ b/src/assets/css/App.css @@ -0,0 +1,964 @@ +body { + margin: 0px; + padding: 0px; +} +.form-container { + max-width: 1328px; + margin: 20px auto; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + background: #fff; + border-radius: 8px; + overflow: auto; +} + +@media (max-width: 768px) { + .form-container { + width: 100%; + max-width: 100%; + } +} + + + +.custom-dropdown-menu { + font-size: 22px; + background-color: white !important; + border: none; + box-shadow: none; +} +.custom-dropdown-menu .dropdown-item { + color: black; + box-shadow: none; + font-size: 16px; + /* Set font size to 16px for dropdown items */ +} +.custom-dropdown-menu .dropdown-item:hover { + background-color: transparent !important; + color: #000; + box-shadow: none; +} +.btn-primary { + + width: 100px; + background-color: #4545db !important; + border: none; + border-radius: 50px; + box-shadow: none; + outline: 0 none; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #4545db !important; +} +.btn-outline-secondary { + box-shadow: none; + outline: 0 none; + border: none; +} +.btn-outline-secondary:hover, +.btn-outline-secondary:focus { + box-shadow: none; + background-color: transparent; + color: #000; +} +.dropdown, +.dropdown-toggle { + background-color: transparent; + border: none; + color: #000; + box-shadow: none; + font-size: 22px; +} +.dropdown:hover, +.dropdown:focus, +.dropdown-toggle:hover, +.dropdown-toggle:focus { + background-color: transparent; + color: #000; + border: none; + box-shadow: none; +} +.header-container { + width: 1800px; + margin: 0 auto; + opacity: 1; + gap: 5%; + display: flex; + justify-content: space-between; /* Ensures left and center are spaced apart */ + align-items: center; /* Aligns items vertically */ +} + +.navbar-left { + display: flex; + + align-items: center; + background-color: #FFFFFF; + width: 400px; + height: 90px; + + margin-top: 20px; + padding: 10px 20px; + border-radius: 20px; +} +.navbar { + margin-top: 20px; + width: 1200px; + height: 90px; + background-color: #FFFFFF; + padding: 10px 20px; + border-radius: 10px; + display: flex; + justify-content: space-between; + box-shadow: 0px 0px 10px rgba(66, 71, 76, 0.08); + align-items: center; + box-sizing: border-box; + flex: 1; /* Takes the remaining space between navbar-left and the center header */ + +} +.navbar-nav { + margin-left: auto; +} +.navbar .nav-item.active .nav-link { + color: #ffffff; /* Active link color */ + background-color: #282e26; + border-radius: 20px; + font-weight: bold; /* Bold text for active link */ +} +.nav-list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; +} +.nav-item { + margin: 0 15px; + position: relative; + display: flex; + align-items: center; +} +.nav-link { + font-family: "Manrope"; + font-size: 18px !important; + color: #002300; + text-decoration: none; +} +.nav-link:hover { + color: #005600; +} +/* Logo styles */ +.logo { + width:95px; + height: 70px; +} +.dropdown-menu { + display: none; + position: absolute; + top: 100%; + left: 0; + border-radius: 10px; + background-color: #ffffff; + list-style: none; + padding: 0; + margin: 0; + box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2); + z-index: 1000; +} +.dropdown-menu li { + padding: 10px 15px; + align-items: center; +} +.dropdown-menu li a { + color: #002300; + text-decoration: none; + display: flex; + align-items: center; +} +.avatar-dropdown-menu .dropdown-item { + background-color: transparent !important; + color: #002300; +} +.avatar-dropdown-menu .dropdown-item:hover { + background-color: transparent !important; + color: #005600; +} +.avatar-container .avatar { + width: 50px; + height: 50px; + + border-radius: 50%; +} +.dropdown-menu li a:hover { + background-color: #4545db; +} +.dropdown-menu li i { + margin-right: 10px; +} +.nav-item:hover .dropdown-menu { + display: block; +} +.trail { + width: 170px; + height: 40px; + /* background-color: #e8bbbb; */ + color:#fff; + border-radius: 10px; + display: flex; + /* border:1px solid #4545db; */ + justify-content: center; + align-items: center; + margin-right: 15px; +} +.trail p { + margin: 0; + font-size: 15px; + font-weight: 500; + text-align: center; + cursor: pointer; +} +.notification-container { + display: flex; + align-items: center; + margin-right: 15px; +} +.avatar-container { + display: flex; + align-items: center; + position: relative; + gap:120px; +} +.avatar { + + width: 50px; + height: 50px; + border-radius: 50%; + object-fit: cover; +} +.alignright { + padding: 10px; + display: flex; + align-items: center; +} +.avatar-dropdown-menu { + position: absolute; + top: 100%; + right: 0; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + list-style: none; + padding: 0; + margin: 0; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + z-index: 1000; +} +.avatar-dropdown-menu li { + padding: 8px 12px; +} +.avatar-dropdown-menu li a { + text-decoration: none; + color: #333; +} +.avatar-dropdown-menu li:hover { + background-color: #f1f1f1; +} +.notification-dropdown-menu { + position: absolute; + top: 100%; + right: 0; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + list-style: none; + padding: 0; + margin: 0; + z-index: 1000; +} +.notification-dropdown-menu li { + padding: 10px; +} +.notification-dropdown-menu li a { + text-decoration: none; + color: #333; + display: block; +} +.notification-dropdown-menu li a:hover { + background-color: #f5f5f5; +} +/*----------------------------------------------------------------------------------setting dropdown-----------------------------------------------------------------*/ +.nav-item { + position: relative; /* Allows absolute positioning of dropdowns */ +} +.nav-menu-drop { + white-space: nowrap; /* Prevent wrapping */ +} + +.nav-menu-drop { + list-style-type: none; + padding: 0; + margin: 0; + position: absolute; + + top: 100%; /* Positions dropdown below the parent */ + left: 0; + background-color: #FFFFFF; + border: 1px solid #F6F6F6; + z-index: 1000; + border-radius: 10px; + min-width: 120px; /* Optional minimum width */ + filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25)); + +} + +.nav-menu-drop-item { + padding: 10px 15px; + text-decoration: none; + color: #002300; + filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25)); + display: block; + + width: auto; + box-sizing: border-box; + border-bottom: 1px solid rgba(230, 230, 230, 0.3); + transition: none; +} +.nav-menu-drop-item:hover { + background-color: transparent; /* Prevent background change */ + color: #002300; /* Maintain original text color */ + cursor: default; /* Maintain default cursor */ +} + +/* Responsive adjustments */ +@media (max-width: 1600px) { + .header-container, + .navbar { + width: 100%; + max-width: 100%; + } +} +@media (max-width: 768px) { + .navbar { + flex-direction: column; + height: auto; + } + .nav-list { + flex-direction: column; + align-items: flex-start; + } + .nav-item { + margin: 10px 0; + } +} +/* Form Row and Column css With Table Css */ +.dynamic-form-element { + display: block; + margin-bottom: 10px; + width: 100%; +} +/* Grid system */ +.row { + display: flex; + flex-wrap: wrap; +} +.col-2 { + flex: 0 0 16.6667%; + max-width: 16.6667%; +} +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} +.col-4 { + flex: 0 0 33.3333%; + max-width: 33.3333%; +} +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} +.dynamic-form-element { + margin-bottom: 10px; +} +.table-container { + border-radius: 20px; + padding: 20px; + background-color: white; + width: auto; +} +.table-darkcustom th { + vertical-align: middle; + background-color: #f4f4f4; + color: #000000; + height: 60px; + text-align: start; + font-size: 18px; + width: 1248px; +} +.table-darkcustom td { + text-align: start; + vertical-align: middle; + font-size: 16px; +} +/* Styling for the last header cell */ +.table-darkcustom th.last-header { + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} +.tables > :not(:last-child) > :last-child > * { + border-bottom-color: transparent; +} +.table-darkcustom th { + border: none; + height: 60px; +} +.table-darkcustom th:last-child { + border-top-right-radius: 60px; + border-bottom-right-radius: 60px; +} +.table-darkcustom th:first-child { + padding-left: 20px; + border-top-left-radius: 60px; + border-bottom-left-radius: 60px; +} +.table-darkcustom th:first-child { + border-top-left-radius: 60px; + border-bottom-left-radius: 60px; +} +.tdclass { + border-bottom: 0.5px solid #f4f4f4; +} +.tables { + --bs-table-accent-bg: transparent; + --bs-table-striped-color: #212529; + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: #212529; + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: #212529; + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: #212529; + vertical-align: top; + border-color: #dee2e6; + border-top: none; +} +/* ==================================================================================================Search Container ============================================================ */ +/* .filter-dropdown-btn{ + margin: 10px; + padding: 10px; + display: flex; + align-items: center; + justify-content: center; + height: 60px; + border-radius: 60px; + background-color: #F4F4F4; +} */ +.search-filter-container { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; +} + + +.position-relative { + position: relative; +} + +.search-icon { + position: absolute; + top: 50%; + left: 15px; /* Adjust as needed */ + transform: translateY(-50%); + pointer-events: none; /* Prevent clicks on the icon */ +} + +.search-container { + position: relative; + flex: 3; + max-width: 300px; +} +.search-container input { + width: 100%; + height: 50px; + background: #f4f4f4; + border-radius: 50px; + border: none; + padding-left: 40px; + font-size: 16px; + box-sizing: border-box; +} +.search-container input::placeholder { + color: #a9a9a9; +} +.search-container input:focus { + outline: none; +} +.search-container-icon { + position: absolute; + left: 10px; + top: 50%; + transform: translateY(-50%); + pointer-events: none; +} +/* ======================================================================================Search Container================================== */ +.filter-dropdown-btn { + box-shadow: none; + outline: 0 none; + justify-content: flex-end; + display: flex; + align-items: center; + /* Center vertically */ +} +.filter-dropdown-btn svg { + margin-right: 8px; + /* Space between icon and text */ +} +.filter-dropdown-btn h4 { + margin: 0; + /* Remove default margin */ + text-align: center; + /* Center the text */ + flex-grow: 1; + /* Allow the text to take available space */ +} +/* ======================================================================================Filter Start =========================================================================== */ +.filter-container { + justify-content: center; + width: auto; + height: 50px; + background: #f4f4f4; + border-radius: 50px; + border: none; + padding-left: 20px; + margin-left: 20px; + align-items: center; + height: 50px; + display: flex; + background-color: #f0f0f0; + border-radius: 50px; + margin: 10px; + gap: 15px; +} +.filterdropdown-container { + position: absolute; + top: 100%; + left: auto; + right: 0; + width: 294px; + height: auto; + background-color: #ffffff; + border: 1px solid #ced4da; + border-radius: 15px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + padding: 10px; + display: flex; + flex-direction: column; + align-items: center; +} +.filter-container2 { + position: relative; + width: 130px; /* Set width to 130 pixels */ + height: 50px; + display: flex; + background-color: #f0f0f0; + margin-left: 30px; + border-radius: 50px; + justify-content: center; + align-items: center; +} +.dropdown-menu2 { + margin-bottom: 10px; +} +.custom-select-form { + padding: 10px; + width: 260px; + border: 1px solid #d9d9d9; + border-radius: 50px; + height: 44px; +} +.from-btn { + box-shadow: none; + outline: 0 none; + display: flex; + justify-content: space-evenly; + width: 144px; + padding: 10px; + background-color: transparent; + border: 1px solid #d9d9d9; /* Add border with desired color */ + border-radius: 30px; + cursor: pointer; +} + +.btn-container svg { + margin-left: 10px; /* Optional: Add space between text and icon */ +} +.apply-filter-button { + border: none; + display: flex; + justify-content: center; + background-color: #4545db; + height: 42px; + width: 163px; + color: #ffff; + margin-top: 10px; + border-radius: 60px; + align-items: center; +} +.from-to { + display: flex; + justify-content: space-between; + align-items: center; +} +.form-check-input:checked { + width: 18px; + height: 18px; + background-color: #4545db; + border-color: #4545db; +} +.form-check-input[type="radio"] { + border-radius: 50%; +} +.filter-button { + background-color: transparent; + border: none; + height: 40px; + padding: 3px 3px; + /* Top and bottom, left and right */ + padding-left: 15px; + /* Add left padding */ + border-radius: 50px; + cursor: pointer; + display: flex; + align-items: center; + font-size: 14px; + text-align: center; +} +.filter-button:hover { + background-color: #e0e0e0; +} +.filter-button.active { + background-color: white; +} +.count { + margin: 5px; + width: 30px; + height: 30px; + background-color: #5045e5; + color: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; +} +.filter-button:nth-child(1) .count { + background-color: #4caf50; /* Green */ +} +.filter-button:nth-child(2) .count { + background-color: #e91e63; /* Blue */ +} +.filter-button:nth-child(3) .count { + background-color: #d1d1ef; /* Amber */ +} +.filter-button:nth-child(4) .count { + background-color: #e91e63; /* Pink */ +} +.filter-button:nth-child(5) .count { + background-color: #9c27b0; /* Purple */ +} +.filter-button:nth-child(n + 6) .count { + background-color: #5045e5; /* Original color */ +} +/* ======================================================================Filterbtn======================================================================================== */ + + + + +/* =============================================Expense Screen CSS Start ======================= */ +.expensecontainer { + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + border-radius: 10px; + margin: auto; + background-color: white; + width: 90%; + /* Changed from 1600px to a percentage */ + max-width: 1600px; + /* Maximum width for larger screens */ + height: auto; + /* Change to auto for flexible height */ + border: 1px solid #dee2e6; + padding: 30px; + justify-content: start; +} +h3 { + font-weight: 800; + margin: 0; + font-size: 22px; + color: #343a40; +} +.cus { + box-shadow: none; + outline: none; + width: auto; + height: 42px; + padding: 8px 12px; + font-size: 16px; + border: none; + border-radius: 60px; + background-color: #007bff; + color: white; + cursor: pointer; + transition: background-color 0.3s; +} +.expense-searchcontainerstart { + width: 90%; +} +.custbtn { + box-shadow: none; + outline: 0 none; + border-radius: 40px; + margin-left: 10px; + margin-top: 3px; + width: auto; + /* Change to auto for responsiveness */ + height: 45px; + color: #4545db; + border: 1px solid #4545db; + background-color: transparent; + transition: color 0.3s, background-color 0.3s; +} +.custbtn2 { + box-shadow: none; + outline: 0 none; + color: #f0f0f0; + background-color: #4545db; + margin-left: 10px; + width: auto; + /* Change to auto for responsiveness */ + height: 48px; + border-radius: 10px; +} +.custbtn2:hover { + color: #f0f0f0; + background-color: #4545db; +} +.custbtn:hover { + color: #4545db; + background-color: transparent; + border: 1px solid #4545db; +} + +.selectoptions { + margin-left: 10px; + border-radius: 10px; + width: auto; + /* Change to auto for responsiveness */ + height: 50px; + border: transparent; + background-color: #f4f4f4; + text-align: center; +} +.scontainerdropdownd { + justify-items: center; + align-items: center; + display: flex; +} + + + +.table-responsive th { + background-color: #f4f4f4; +} +.table-responsives { + border: 0.5px solid #f4f4f4; + border-radius: 24px 24px 0 0; /* top-left and top-right corners to 24px */ +} +.table-responsive { + + border-radius: 24px 24px 0 0; /* top-left and top-right corners to 24px */ +} +.expensetableheader th:first-child { + border-top-left-radius: 24px; + /* Adjust as needed */ +} +.expensetableheader th:last-child { + border-top-right-radius: 24px; + /* Adjust as needed */ +} +/* Responsive Styles */ +@media (max-width: 768px) { + .expensecontainer { + padding: 15px; + width: 95%; + } + .expensetableheader th { + font-size: 14px; + /* Adjust font size for headers */ + } + +} +.totalcalculation { + border-top: none; +} +.tdnexp { + border-right: 0.5px solid #f4f4f4; + border-bottom: 0.5px solid #f4f4f4; + border-left: 0.5px solid #f4f4f4; +} +.totalcont { + align-items: end; + justify-content: end; + border-color: transparent; +} +h5 { + text-align: end; + align-items: end; + justify-items: end; + font-size: 18px; +} +.semibold { + font-weight: 600; +} +.modal-overlay { + display: flex; + align-items: center; + justify-content: center; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); +} +.modal-container { + max-width: 768px; /* Updated to 768px */ + margin: 0; + background-color: white; + border-radius: 0.5rem; +} +.modal-header, +.modal-body, +.modal-footer { + padding: 1rem; +} +.modal-close-btn { + cursor: pointer; +} +.modal-save-btn { + box-shadow: none; + outline: 0 none; + background-color: #007bff; + color: white; +} + + +/* store drop down style */ + +.store-menu { + position: relative; +} + +.dropdown-container { + position: absolute; + top: 60%; + right: 100%; + background: #fff; + border-radius: 10px; + border: 1px solid #ccc; + padding: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + z-index: 1000; + width: 200px; + transform: translateX(-10px); +} + +.dropdown-list { + list-style: none; + margin: 0; + padding: 0; +} + +.dropdown-item { + margin: 5px 0; + border-bottom: 1px solid rgba(230, 230, 230, 0.3); +} + +.dropdown-link { + text-decoration: none; + color: #333; + padding: 5px 10px; + display: block; + overflow: hidden; + white-space: wrap; + /* text-overflow: ellipsis; */ +} + +.dropdown-link:hover { + background-color: #f0f0f0; +} + + + +/* =============================================Expense Screen CSS End ======================= */ + + /* Slim scrollbar */ + div::-webkit-scrollbar { + width: 8px; /* Slim width */ + + } + + /* Track */ + div::-webkit-scrollbar-track { + background-color: #d6ebff; + } + + /* Handle */ + div::-webkit-scrollbar-thumb { + background: #5c9ad8; /* Darker handle */ + border-radius: 10px; /* Rounded handle */ + } + + /* Handle on hover */ + div::-webkit-scrollbar-thumb:hover { + background: #555; /* Darker on hover */ + } + + + .printBtn{ + opacity: 0.3; + } + + + .printBtn:hover{ + opacity: 1; + } + + + .settings-button { + + width: 32px; + height: 32px; /* Ensure square dimensions for consistency */ + left: 1912px; + top: 40px; + background: url("../Image/settings.png") no-repeat center center; + + border: none; /* Remove default button border */ + cursor: pointer; + + } + + + .settings-icon { + font-size: 24px; + color: transparent; /* Icon text hidden since an image is used */ + } + + + \ No newline at end of file diff --git a/src/assets/img/BackgroundBody.png b/src/assets/img/BackgroundBody.png new file mode 100644 index 0000000..de093e3 Binary files /dev/null and b/src/assets/img/BackgroundBody.png differ diff --git a/src/assets/img/BackgroundBody.svg b/src/assets/img/BackgroundBody.svg new file mode 100644 index 0000000..597d7dd --- /dev/null +++ b/src/assets/img/BackgroundBody.svg @@ -0,0 +1,896 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/EZHISAB.png b/src/assets/img/EZHISAB.png new file mode 100644 index 0000000..31d96b8 Binary files /dev/null and b/src/assets/img/EZHISAB.png differ diff --git a/src/assets/img/EZHISAB_White.png b/src/assets/img/EZHISAB_White.png new file mode 100644 index 0000000..f36cef2 Binary files /dev/null and b/src/assets/img/EZHISAB_White.png differ diff --git a/src/assets/img/Frame 812.png b/src/assets/img/Frame 812.png new file mode 100644 index 0000000..e43e4dc Binary files /dev/null and b/src/assets/img/Frame 812.png differ diff --git a/src/assets/img/Group 228723.png b/src/assets/img/Group 228723.png new file mode 100644 index 0000000..35028ac Binary files /dev/null and b/src/assets/img/Group 228723.png differ diff --git a/src/assets/img/Layer_1.png b/src/assets/img/Layer_1.png new file mode 100644 index 0000000..ec04833 Binary files /dev/null and b/src/assets/img/Layer_1.png differ diff --git a/src/assets/img/Mask group.png b/src/assets/img/Mask group.png new file mode 100644 index 0000000..72a4b7d Binary files /dev/null and b/src/assets/img/Mask group.png differ diff --git a/src/assets/img/Success.png b/src/assets/img/Success.png new file mode 100644 index 0000000..131618a Binary files /dev/null and b/src/assets/img/Success.png differ diff --git a/src/assets/img/back-to-plan.png b/src/assets/img/back-to-plan.png new file mode 100644 index 0000000..22c4434 Binary files /dev/null and b/src/assets/img/back-to-plan.png differ diff --git a/src/assets/img/bankImage.png b/src/assets/img/bankImage.png new file mode 100644 index 0000000..7ff4b27 Binary files /dev/null and b/src/assets/img/bankImage.png differ diff --git a/src/assets/img/board.png b/src/assets/img/board.png new file mode 100644 index 0000000..aa9207c Binary files /dev/null and b/src/assets/img/board.png differ diff --git a/src/assets/img/cylinder.png b/src/assets/img/cylinder.png new file mode 100644 index 0000000..e33c152 Binary files /dev/null and b/src/assets/img/cylinder.png differ diff --git a/src/assets/img/ezhisab (2).png b/src/assets/img/ezhisab (2).png new file mode 100644 index 0000000..451fc0f Binary files /dev/null and b/src/assets/img/ezhisab (2).png differ diff --git a/src/assets/img/graph.png b/src/assets/img/graph.png new file mode 100644 index 0000000..2402811 Binary files /dev/null and b/src/assets/img/graph.png differ diff --git a/src/assets/img/loader.gif b/src/assets/img/loader.gif new file mode 100644 index 0000000..aaac076 Binary files /dev/null and b/src/assets/img/loader.gif differ diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png new file mode 100644 index 0000000..eca0634 Binary files /dev/null and b/src/assets/img/logo.png differ diff --git a/src/assets/img/mask_group.png b/src/assets/img/mask_group.png new file mode 100644 index 0000000..77ce256 Binary files /dev/null and b/src/assets/img/mask_group.png differ diff --git a/src/assets/img/shopkeeper.png b/src/assets/img/shopkeeper.png new file mode 100644 index 0000000..8ead05f Binary files /dev/null and b/src/assets/img/shopkeeper.png differ diff --git a/src/assets/img/tick-subscription.png b/src/assets/img/tick-subscription.png new file mode 100644 index 0000000..3a0f870 Binary files /dev/null and b/src/assets/img/tick-subscription.png differ diff --git a/src/assets/img/tickets.png b/src/assets/img/tickets.png new file mode 100644 index 0000000..911a43f Binary files /dev/null and b/src/assets/img/tickets.png differ diff --git a/src/components/Pages/AppPAges/Account/Accounting.js b/src/components/Pages/AppPAges/Account/Accounting.js new file mode 100644 index 0000000..8b774ac --- /dev/null +++ b/src/components/Pages/AppPAges/Account/Accounting.js @@ -0,0 +1,17 @@ +import React from 'react'; + +export default function Accounting() { + const centerStyle = { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + height: '100vh', // Full viewport height + }; + + return ( +
+

Accounting Page

+
+ ); +} + \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Auditrail/AuditTrail.js b/src/components/Pages/AppPAges/Auditrail/AuditTrail.js new file mode 100644 index 0000000..11c5f76 --- /dev/null +++ b/src/components/Pages/AppPAges/Auditrail/AuditTrail.js @@ -0,0 +1,45 @@ +import React, { useEffect, useState } from "react"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuditTrailTable from "./AuditTrailTable"; + +export default function AuditTrail() { + const { Get } = useApi(); + const [auditLogs, setAuditLogs] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const handleGetMethod = async () => { + try { + const response = await Get("auditLog"); + // Ensure response and results exist before setting state + if (response) { + setAuditLogs(response); // Update auditLogs with the data + } else { + setAuditLogs([]); // Set an empty array if data is undefined + } + } catch (error) { + setError(error.message); + } finally { + setLoading(false); + } + }; + + handleGetMethod(); + }, ); + + return ( +
+ {loading ? ( +

Loading...

+ ) : error ? ( +

Error: {error}

+ ) : ( + + )} +
+ ); +} diff --git a/src/components/Pages/AppPAges/Auditrail/AuditTrailTable.js b/src/components/Pages/AppPAges/Auditrail/AuditTrailTable.js new file mode 100644 index 0000000..6d414a0 --- /dev/null +++ b/src/components/Pages/AppPAges/Auditrail/AuditTrailTable.js @@ -0,0 +1,153 @@ +// import React from 'react'; +// // import 'bootstrap/dist/css/bootstrap.min.css'; + +// export default function AuditTrailTable({ auditLogs }) { +// return ( +//
+//

Audit Logs

+// +// +// +// +// +// +// +// +// {/* */} +// +// +// +// +// {auditLogs.map((log) => ( +// +// +// +// +// +// {/* */} +// {/* */} +// +// +// +// ))} +// +//
IDService NameEndpointMethodUserResponse DataTimestamp
{log.id}{log.service_name}{log.endpoint}{log.method} +// {JSON.stringify(log.request_data, null, 2)} +// */} +// {/* {JSON.stringify(log.response_data.message, null, 2)} */} +// {/* +// {log.user ? ( +// <>{JSON.stringify(log.user.username, null, 2)} +// ) : ( +// 'N/A' +// )} +// {new Date(log.timestamp).toLocaleString()}
+//
+// ); +// } + + + +import React, { useState, useEffect } from 'react'; + +import useApi from '../../../../utils/api-manager/Helper/useApi'; + +export default function AuditTrailTable() { + const [logs, setLogs] = useState([]); + const [count, setCount] = useState(0); + const [nextPage, setNextPage] = useState(null); + const [previousPage, setPreviousPage] = useState(null); + const [currentPageUrl, setCurrentPageUrl] = useState('/api/v1/auditLog/?page=1'); + let {getHost, Get} =useApi(); + useEffect(() => { + + // Fetch data from the server when the component mounts or the page changes + const fetchLogs = async () => { + try { + console.log("My URL: ", `${getHost()}${currentPageUrl}`); + const response = await Get(`${getHost()}${currentPageUrl}`); + + setLogs(response.results); + setCount(response.count); + setNextPage(removeHostFromUrl(response.next)); + setPreviousPage(removeHostFromUrl(response.previous)); + } catch (error) { + console.error('Error fetching audit logs:', error); + } + }; + + fetchLogs(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentPageUrl]); + + const handlePageChange = (url) => { + if (url) { + setCurrentPageUrl(url); + } + }; + function removeHostFromUrl(url) { + try { + const parsedUrl = new URL(url); + return parsedUrl.pathname + parsedUrl.search; + } catch (error) { + console.error('Invalid URL:', error); + return null; + } + } + return ( +
+

Audit Logs

+

Total logs: {count}

+ + + + + + + + {/* + */} + + + + + + + {logs.map((log) => ( + + + + + + + + + + ))} + +
IDService NameEndpointMethodRequest DataResponse DataUserTimestamp
{log.id}{log.service_name}{log.endpoint}{log.method} + {log.user ? ( + <>{JSON.stringify(log.user.email, null, 2)} + ) : ( + 'N/A' + )} + {new Date(log.timestamp).toLocaleString()}
+ + {/* Pagination Controls */} + +
+ ); +} diff --git a/src/components/Pages/AppPAges/Dashboard/CurrentStore/CurrentStore.js b/src/components/Pages/AppPAges/Dashboard/CurrentStore/CurrentStore.js new file mode 100644 index 0000000..fd4a040 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/CurrentStore/CurrentStore.js @@ -0,0 +1,93 @@ +import React, { useState, useEffect } from 'react'; +import { MoreVert } from '@mui/icons-material'; +import useApi from '../../../../../utils/api-manager/Helper/useApi' +import StoreCashTable from './StoreCashTable'; + +const StoreCashBalance = () => { + const [showTable, setShowTable] = useState(false); + const [storeData, setStoreData] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [otherStoreCash, setOtherStoreCash] = useState(null); + + const{Get} = useApi() + + const toggleTable = () => { + setShowTable(!showTable); + }; + + useEffect(() => { + + const fetchDashboardCashBalance = async () => { + try { + setLoading(true); + const response = await Get('dashboardCashBalance'); + setStoreData(response); + setOtherStoreCash(response.additional_stores); + } catch (err) { + setError('Failed to fetch data'); + console.error(err); + } finally { + setLoading(false); + } + }; + + fetchDashboardCashBalance(); + }, []); + + return ( +
+
+
+ Current Store Cash
+ Balance +
+ {/* */} +
+ +
+
+ USD Amount + +
+ +
+ {loading ? ( +

Loading...

+ ) : error ? ( +

{error}

+ ) : ( + <> +
+ {storeData?.store_name || 'N/A'} +
+ +
+

+ {storeData?.address || 'N/A'} +

+ +
+ ${storeData?.total_current_cash?.toLocaleString() || '0.00'} +
+
+ + )} +
+
+ + +
+ ); +}; + +export default StoreCashBalance; diff --git a/src/components/Pages/AppPAges/Dashboard/CurrentStore/ExpenseBreakdown.js b/src/components/Pages/AppPAges/Dashboard/CurrentStore/ExpenseBreakdown.js new file mode 100644 index 0000000..f029539 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/CurrentStore/ExpenseBreakdown.js @@ -0,0 +1,139 @@ +import React, { useEffect, useState } from 'react'; +import useApi from '../../../../../utils/api-manager/Helper/useApi'; +import { MoreHoriz } from '@mui/icons-material'; +import { toast ,ToastContainer} from "react-toastify"; + +const ExpenseBreakdown = () => { + const [vendors, setVendors] = useState([]); + const { Post } = useApi(); + + useEffect(() => { + fetchExpenseData(); + }, []); + + const fetchExpenseData = async () => { + try { + const response = await Post('dashboardExpense'); + // console.log("API Response:", response); + + if (Array.isArray(response?.data?.top_vendors)) { + setVendors(response.data.top_vendors); + // toast.success("Expense data loaded successfully!"); + } else { + console.error("Expected top_vendors to be an array."); + toast.error("Error: Expected top vendors data to be an array."); + } + } catch (error) { + console.error("Error fetching expense data:", error); + toast.error("Error fetching expense data: " + (error.response ? error.response.data : error.message)); + } + }; + + + + // Calculate combined percentage (e.g., average percentage) + const combinedPercentage = vendors.reduce((total, vendor) => total + vendor.percentage, 0) / vendors.length; + + return ( +
+ {/* Header */} +
+
Expense Breakdown
+ +
+ + {/* Vendor Data */} +
+ {Array.isArray(vendors) && vendors.length > 0 ? ( + vendors.map((vendor) => ( +
+ {/* Vendor Name */} +

+ {vendor.vendor_name} +

+ {/* Vendor Percentage */} +

+ {vendor.percentage}% +

+
+ )) + ) : ( +

No vendors available

+ )} +
+ + {/* Stacked Progress Bar */} +
+ {Array.isArray(vendors) && vendors.length > 0 ? ( + vendors.map((vendor, index) => { + // Define styles for each vendor + let backgroundStyle = ''; + if (index === 0) { + backgroundStyle = 'rgba(0, 0, 255, 0.5)'; // Blue color for the first vendor + } else if (index === 1) { + backgroundStyle = 'repeating-linear-gradient(90deg, lightgray 0, lightgray 5px, transparent 5px, transparent 10px)'; // Light gray with repeating gradient for the second + } else if (index === 2) { + backgroundStyle = 'repeating-linear-gradient(90deg, black 0, black 5px, transparent 5px, transparent 10px)'; // Black with repeating gradient for the third + } + + return ( +
+ ); + }) + ) : ( +
+ +
+ )} +
+
+ ); +}; + +export default ExpenseBreakdown diff --git a/src/components/Pages/AppPAges/Dashboard/CurrentStore/ProgressBar.css b/src/components/Pages/AppPAges/Dashboard/CurrentStore/ProgressBar.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Pages/AppPAges/Dashboard/CurrentStore/ProgressBar.js b/src/components/Pages/AppPAges/Dashboard/CurrentStore/ProgressBar.js new file mode 100644 index 0000000..9f15edc --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/CurrentStore/ProgressBar.js @@ -0,0 +1,33 @@ +import React from 'react'; + +const ProgressBar = ({ percentage, index }) => { + + const getBackgroundStyle = () => { + if (index % 3 === 0) { + return 'linear-gradient(to right, #5A55FF, #7688FF)'; + } else if (index % 2 === 0) { + return 'repeating-linear-gradient(90deg, black 0, black 5px, transparent 5px, transparent 10px)'; + } else { + return 'repeating-linear-gradient(90deg, lightgray 0, lightgray 5px, transparent 5px, transparent 10px)'; + } +}; + + + + console.log('ProgressBar - Percentage:', percentage, 'Index:', index); + + return ( +
0 ? percentage : 0}%`, + background: getBackgroundStyle(), + borderRadius: '4px', + transition: 'width 0.5s ease-in-out', + }} + /> + ); +}; + +export default ProgressBar; diff --git a/src/components/Pages/AppPAges/Dashboard/CurrentStore/StoreCashTable.js b/src/components/Pages/AppPAges/Dashboard/CurrentStore/StoreCashTable.js new file mode 100644 index 0000000..8b298c4 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/CurrentStore/StoreCashTable.js @@ -0,0 +1,47 @@ +import React from 'react'; + +const StoreCashTable = ({ showTable, otherStoreCash }) => { + if (!showTable) return null; + + return ( +
+
+ + + + + + + + + + + { + otherStoreCash.map((item)=>{ + return ( + + + + ) + }) + } + + + +
Store NameCash BalanceDate
{item.store_name}${item.total_current_cash}{item.address}
+ +
+
+ ); +}; + +export default StoreCashTable; diff --git a/src/components/Pages/AppPAges/Dashboard/Dashboard.js b/src/components/Pages/AppPAges/Dashboard/Dashboard.js new file mode 100644 index 0000000..4b0834c --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Dashboard.js @@ -0,0 +1,236 @@ +import React, { useState, useEffect, useRef } from 'react'; +import useAPI from '../../../../utils/api-manager/Helper/useApi'; +import { Bar } from 'react-chartjs-2'; +import { Chart as ChartJS, BarElement, CategoryScale, LinearScale, Title, Tooltip, Legend } from 'chart.js'; +import { DatePicker, Space, Typography, Empty } from 'antd'; +import CurrentStore from './CurrentStore/CurrentStore'; + +ChartJS.register(BarElement, CategoryScale, LinearScale, Title, Tooltip, Legend); + +const { RangePicker } = DatePicker; +const { Title: AntdTitle } = Typography; + +export default function StackedBarChart() { + const [dateRange, setDateRange] = useState(null); + const [filteredData, setFilteredData] = useState([]); + const [loading, setLoading] = useState(false); + const chartRef = useRef(); + + const { Post } = useAPI(); + + const fetchDashboardData = async (startDate, endDate) => { + setLoading(true); + try { + const payload = { + start_date: startDate, + end_date: endDate, + }; + + const response = await Post('dashboardChart', payload); + const data = response.data; + + const businessReports = data.business_reports || []; + const lotteryReports = data.lottery_reports || []; + + + const mappedData = businessReports.map((entry, index) => ({ + name: entry.date, + outflow: parseFloat(entry.cash_to_account || 0), + inflow: parseFloat(lotteryReports[index]?.total_balance || 0), + })); + + + const filtered = mappedData.filter( + (entry) => new Date(entry.name) >= new Date(startDate) && new Date(entry.name) <= new Date(endDate) + ); + + + if (filtered.length === 0) { + setFilteredData([]); + } else { + setFilteredData(filtered); + } + } catch (error) { + console.error('Error fetching dashboard data:', error); + setFilteredData([]); + } finally { + setLoading(false); + } + }; + + const handleDateChange = (dates) => { + setDateRange(dates); + if (!dates || dates.length === 0) { + setFilteredData([]); + } else if (dates.length === 2) { + const [start, end] = dates; + fetchDashboardData(start.format('YYYY-MM-DD'), end.format('YYYY-MM-DD')); + } + }; + + + + + useEffect(() => { + if (dateRange && dateRange.length === 2) { + const [start, end] = dateRange; + fetchDashboardData(start.format('YYYY-MM-DD'), end.format('YYYY-MM-DD')); + } + }, [dateRange]); + + const netCashFlow = filteredData.reduce((acc, curr) => acc + curr.outflow + curr.inflow, 0); + const formattedCashFlow = netCashFlow.toLocaleString(); + const totalOutflow = filteredData.reduce((acc, curr) => acc + curr.inflow, 0); + const profitPercentage = totalOutflow !== 0 ? ((netCashFlow / totalOutflow) * 100).toFixed(2) : 0; + const arrow = profitPercentage > 0 ? '↗' : profitPercentage < 0 ? '↓' : '↘'; + const arrowColor = profitPercentage > 0 ? 'green' : profitPercentage < 0 ? 'red' : 'gray'; + + const data = { + labels: filteredData.map((entry) => entry.name), + datasets: [ + { + label: 'Business Report', + stack: 'positive', + data: filteredData.map((entry) => entry.outflow), + + backgroundColor: (context) => { + const { ctx, chartArea } = context.chart; + if (!chartArea) return null; + + const gradient = ctx.createLinearGradient(0, chartArea.top, 0, chartArea.bottom); + gradient.addColorStop(0.02, 'rgba(255, 255, 255, 0.4)'); + gradient.addColorStop(0.90, 'rgba(0, 0, 255, 0)'); + gradient.addColorStop(0.30, 'rgba(0, 0, 255, 0.1)'); + gradient.addColorStop(0.48, 'rgba(0, 0, 255, 0.03)'); + gradient.addColorStop(0.95, 'rgba(0, 0, 255, 0.0)'); + + return gradient; + }, + + borderColor: 'blue', + borderWidth: { + top: 2, + left: 0, + right: 0, + bottom: 0, + }, + stack: 'stack1', + hoverBackgroundColor: 'rgba(0, 0, 255, 0.5)', + hoverBorderWidth: 0, + }, + { + label: 'Lottery Report', + stack: 'negative', + data: filteredData.map((entry) => -entry.inflow), + backgroundColor: (context) => { + const { ctx, chartArea } = context.chart; + if (!chartArea) return null; + + const gradient = ctx.createLinearGradient(0, chartArea.top, 0, chartArea.bottom); + gradient.addColorStop(0.0, 'rgba(255, 255, 255, 0)'); + gradient.addColorStop(0.02, 'rgba(160, 160, 160, 0.2)'); + gradient.addColorStop(0.59, 'rgba(160, 160, 160, 0.03)'); + gradient.addColorStop(0.95, 'rgba(160, 160, 160, 0.2)'); + + return gradient; + }, + borderColor: 'black', + borderWidth: { + top: 0, + left: 0, + right: 0, + bottom: 2, + }, + stack: 'stack1', + hoverBackgroundColor: 'rgba(0, 0, 0, 0.7)', + hoverBorderWidth: 0, + + }, + ], + }; + + const options = { + responsive: true, + plugins: { + legend: { display: false }, + tooltip: { + callbacks: { + label: ({ raw, dataset }) => `${dataset.label}: $${Math.abs(raw)}`, + }, + }, + }, + scales: { + x: { + stacked: true, + }, + y: { + beginAtZero: true, + stacked: true, + ticks: { + callback: (value) => value === 0 ? '0' : `$${Math.abs(value)}k`, + }, + }, + }, + interaction: { + mode: 'index', + intersect: false, + }, + }; + + + const customAnnotations = ( + <> +
+ Business Report +
+
+ Lottery + +
+ + ); + + return ( +
+ +
+
+ + Cashflow: + +
+ = 0 ? 'black' : 'green', fontSize: '30px', marginRight: '10px' }}> + ${formattedCashFlow} + + + {arrow} + {profitPercentage}% + +
+
+ + + +
+ {filteredData.length > 0 ? ( +
+ {customAnnotations} + +
+) : ( +
+ +
+)} +
+ + + ); +} diff --git a/src/components/Pages/AppPAges/Dashboard/FormModal.js b/src/components/Pages/AppPAges/Dashboard/FormModal.js new file mode 100644 index 0000000..1949eff --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/FormModal.js @@ -0,0 +1,25 @@ +import React from 'react'; +import Form from '../../../../utils/api-manager/Forms/Form'; + +const FormModalAlwaysOpen = (props) => { + const { data, submitBtnTitle, globalConfig, token, refreshData, inputFields, api } = props; + + return ( +
+
+
+
+
+ ); +}; + +export default FormModalAlwaysOpen; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/ATMDepositTable.js b/src/components/Pages/AppPAges/Dashboard/Invoice/ATMDepositTable.js new file mode 100644 index 0000000..e6232db --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/ATMDepositTable.js @@ -0,0 +1,738 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useEffect, useState } from "react"; +import "./Invoice.css"; +import Swal from "sweetalert2"; +import { toast } from "react-toastify"; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; + +const ATMDepositTable = (props) => { + const [invoices, setInvoices] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const [selectedStatus, setSelectedStatus] = useState("All"); + const [sortOrder, setSortOrder] = useState({ column: "", direction: "asc" }); + const [currentPage, setCurrentPage] = useState(1); + const invoicesPerPage = 10; + const [selectedVendor, setSelectedVendor] = useState(""); + const [vendors, setVendors] = useState([]); + const [fromDate, setFromDate] = useState(""); + const [toDate, setToDate] = useState(""); + const { Get, Delete } = useApi(); + function filterByTransactionType(dataArray, transactionType) { + return dataArray.filter(record => record.transaction_type === transactionType); +} + useEffect(() => { + const fetchInvoices = async () => { + await Get("transactionData") + .then((response) => { + let type = (props.transaction_type)?props.transaction_type:"Bank Deposit"; + setInvoices(filterByTransactionType(response, type)); + const uniqueVendors = [ + ...new Set(response.map((invoice) => invoice.vendor_department_name)), + ]; + setVendors(uniqueVendors); + }) + .catch((error) => { + console.error(error); + }); + }; + fetchInvoices(); + }, [props.reloadData]); + const applyFilters = () => { + let filteredInvoices = invoices; + + if (selectedStatus !== "All") { + filteredInvoices = filteredInvoices.filter( + (invoice) => invoice.status === selectedStatus + ); + } + if (selectedVendor) { + filteredInvoices = filteredInvoices.filter( + (invoice) => invoice.vendor_department_name === selectedVendor + ); + } + + if (fromDate) { + filteredInvoices = filteredInvoices.filter( + (invoice) => new Date(invoice.date) >= new Date(fromDate) + ); + } + if (toDate) { + filteredInvoices = filteredInvoices.filter( + (invoice) => new Date(invoice.date) <= new Date(toDate) + ); + } + + setInvoices(filteredInvoices); + }; + + const handleSort = (column) => { + const direction = + sortOrder.column === column && sortOrder.direction === "asc" + ? "desc" + : "asc"; + setSortOrder({ column, direction }); + + const sortedInvoices = [...filteredInvoices].sort((a, b) => { + if (a[column] < b[column]) return direction === "asc" ? -1 : 1; + if (a[column] > b[column]) return direction === "asc" ? 1 : -1; + return 0; + }); + + setInvoices(sortedInvoices); + }; + + const filteredInvoices = (invoices || []).filter((invoice) => { + const vendorName = invoice.date || ""; + const invoiceNumber = invoice.bank_deposite_type || ""; + const matchesSearch = + vendorName.toLowerCase().includes(searchQuery.toLowerCase()) || + invoiceNumber.toLowerCase().includes(searchQuery.toLowerCase()); + + const matchesStatus = + selectedStatus === "All" || invoice.bank_deposite_type === selectedStatus; + + return matchesSearch && matchesStatus; + }); + + const totalInvoices = filteredInvoices.length; + + const totalPages = Math.ceil(totalInvoices / invoicesPerPage); + const startIndex = (currentPage - 1) * invoicesPerPage; + const currentInvoices = filteredInvoices.slice( + startIndex, + startIndex + invoicesPerPage + ); + + const handleNextPage = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrevPage = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + + try { + await Delete(`transactionData`, id); + + const updatedInvoices = invoices.filter((invoice) => invoice.id !== id); + setInvoices(updatedInvoices); + + // Show success notification + toast.success("Invoice successfully deleted!"); + } catch (error) { + if (error.response) { + toast.error(`Error deleting invoice: ${error.response.data}`); + toast.error(`Status code: ${error.response.status}`); + } else if (error.request) { + toast.error("No response received"); + } else { + toast.error(`Error setting up request: ${error.message}`); + } + } +}; + + + const handleEdit = (invoice) => { + console.log("Edit invoice:", invoice); + toast.error("You don't have permission to edit this invoice."); // Show error notification + }; + + const getSortIcon = (column) => { + if (sortOrder.column === column) { + return ( + + + + + ); + } + return null; + }; + const renderPagination = () => { + const paginationItems = []; + const totalPages = Math.ceil(totalInvoices / invoicesPerPage); + + if (totalPages <= 3) { + // If there are 3 or fewer pages, show all + for (let i = 1; i <= totalPages; i++) { + paginationItems.push( + + ); + } + } else { + // More than 3 pages + if (currentPage > 1) { + paginationItems.push( + + ); + } + + if (currentPage > 2) { + paginationItems.push(...); + } + + // Show the current page and surrounding pages + if (currentPage > 1) { + paginationItems.push( + + ); + } + + paginationItems.push( + + ); + + if (currentPage < totalPages) { + paginationItems.push( + + ); + } + + if (currentPage < totalPages - 1) { + paginationItems.push(...); + } + } + + return ( +
+ + + {paginationItems} + + +
+ ); + }; + + return ( +
+
+ {/* Search Bar */} +
+
+ + + + + + + setSearchQuery(e.target.value)} + /> +
+
+ +
+
+ {["All","Business cash", "Lottery cash", "Gas cash"].map((bank_deposite_type) => ( + + ))} +
+ +
+ + +
    +
  • +
    + +
    +
  • + {/*
  • +
    + +
    +
  • */} +
  • +
    +
    + setFromDate(e.target.value)} + /> +
    +
    + setToDate(e.target.value)} + /> +
    +
    +
  • +
  • + +
  • +
+
+
+ +
+ + {/* Table of Invoices */} + + + + {["date", "bank_deposite_type", "amount","Transaction Type", "actions"].map( + (header, index) => ( + + ) + )} + + + + + {currentInvoices.length !== 0? + currentInvoices.map((invoice) => ( + + + + + + + + + )) + + :( + + + + ) + } + +
handleSort(header)} + style={{ + paddingLeft: index === 0 ? "30px" : "0", + cursor: "pointer", + borderTopLeftRadius: index === 0 ? "60px" : "0", + borderBottomLeftRadius: index === 0 ? "60px" : "0", + borderTopRightRadius: index === 4 ? "60px" : "0", + borderBottomRightRadius: index === 4 ? "60px" : "0", + textAlign: "start", + alignContent: "center", + }} + > + {header + .replace(/_/g, " ") + .replace(/\b\w/g, (char) => char.toUpperCase())}{" "} + {getSortIcon(header)} +
+ {invoice.date} + + + {invoice.bank_deposite_type + ? invoice.bank_deposite_type.charAt(0).toUpperCase() + + invoice.bank_deposite_type.slice(1) + : "N/A"} + + {invoice.total_amount} + + {invoice.transaction_type ? + invoice.transaction_type.charAt(0).toUpperCase() + invoice.transaction_type.slice(1) : + 'N/A'} + + + +
+ No data found +
+ + {renderPagination()} +
+ ); +}; + +const paymentMethodStyles = { + bank: { backgroundColor: "#57A09C" }, + "Business cash": { backgroundColor: "#38400B" }, + "Credit Card": { backgroundColor: "#28a745" }, + "Gas cash": { backgroundColor: "#57A09C" }, + "Lottery cash": { backgroundColor: "#CAC59D" }, + cheque: { backgroundColor: "#38400B" }, + pay_later: { backgroundColor: "#E55477" }, + pay_now: { backgroundColor: "#A9B0F0" }, + credit_invoice: { backgroundColor: "#CFCC76" }, +}; + +const getPaymentMethodStyle = (method) => ({ + ...(paymentMethodStyles[method] || { backgroundColor: "#6c757d" }), + borderRadius: "30px", + padding: "5px 10px", + color: "#fff", +}); + + +const statusStyles = { + All: { backgroundColor: "#4545DB" }, + "Business cash": { backgroundColor: "#38400B" }, + "Lottery cash": { backgroundColor: "#CAC59D" }, + "Gas cash": { backgroundColor: "#57A09C" }, +}; + +const getStatusStyle = (status) => ({ + ...(statusStyles[status] || { backgroundColor: "#6c757d" }), + borderRadius: "30px", + padding: "5px 10px", + color: "#fff", +}); + +const getCountClass = (status) => ({ + ...statusStyles[status], + padding: "10px", +}); +export default ATMDepositTable; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/AddInvoice.js b/src/components/Pages/AppPAges/Dashboard/Invoice/AddInvoice.js new file mode 100644 index 0000000..4cc6ee8 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/AddInvoice.js @@ -0,0 +1,818 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState, useEffect, useContext, useRef } from "react"; +import { useNavigate } from "react-router-dom"; +import { toast, ToastContainer } from "react-toastify"; +import "./Invoice.css"; +import { useLocation } from 'react-router-dom'; +import TableComponent from "./InvoiceTable"; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../../utils/secure-route/AuthContext"; +import AddVendorModal from "../../ReusableForm/AddVendorModal"; + +function AddInvoice() { + const { Get, Post } = useApi(); + let { user } = useContext(AuthContext); + const [isOpen, setIsOpen] = useState(false); + const today = new Date().toISOString().split("T")[0]; // Formats date as YYYY-MM-DD + const [reloadData, setReloadData] = useState(false); + const dropdownRef = useRef(null); + const toggleDropdown = () => { + setIsOpen(!isOpen); + }; + + const [showModal, setShowModal] = useState(false); + + const handleShow = () => setShowModal(true); + const handleClose = () => setShowModal(false); + + const [activeButton, setActiveButton] = useState(''); + + const location = useLocation(); + + useEffect(() => { + setActiveButton(location.pathname); // Set the active button based on the current location + }, [location.pathname]); + + const handleVendorAdded = (newVendor) => { + setVendors((prevVendors) => [...prevVendors, newVendor]); // Add new vendor to the list + setFormData({ ...formData, vendor_department: newVendor.id }); // Set the newly added vendor as the selected one + }; + + const navigate = useNavigate(); + + const [formData, setFormData] = useState({ + date: today, + vendor_department: "", + vendor_department_name: "", + invoice_no: "", // This will now have a default value from the last invoice + pay_method_status: "", + prepaid_tax: false, + prepaid_tax_percentage: "", + amount: "", + remaining_amount: "", + pay_method: "", + due_date: null, + note: "", + bank: "", + status: "", + cheque_no: null, + type: "", + }); + + const makeBlank = () => { + setFormData({ + date: today, + vendor_department: "", + vendor_department_name: "", + invoice_no: "", + pay_method_status: "", + prepaid_tax: false, + prepaid_tax_percentage: "", + amount: "", + remaining_amount: "", + pay_method: "", + due_date: null, + note: "", + bank: "", + status: "", + cheque_no: null, + type: "", + }); + } + + + useEffect(() => { + setFormData((prevData) => ({ + ...prevData, + remaining_amount: prevData.amount, // Automatically set remaining_amount to the value of amount + })); + }, [formData.amount]); + + const [vendors, setVendors] = useState([]); + const [banks, setBanks] = useState([]); + const [dueDays, setDueDays] = useState([]); + + + const handleSubmit = async (e) => { + e.preventDefault(); + + // Check for required fields + if (!formData.vendor_department) { + toast.error("Please select a vendor before submitting."); + return; // Prevent form submission if vendor is not selected + } + + if (!formData.invoice_no) { + toast.error("Invoice number is required."); + return; // Prevent form submission if invoice number is not provided + } + + if (!formData.amount) { + toast.error("Amount is required."); + return; // Prevent form submission if amount is not provided + } + + // Check if the payment method is selected + if (!formData.pay_method) { + toast.error("Please select a payment method before submitting."); + return; // Prevent form submission if payment method is not selected + } + + const invoiceStatus = + formData.pay_method_status === "pay_now" && + (formData.pay_method === "cash" || + formData.pay_method === "bank" || + formData.pay_method === "cheque") + ? "paid" + : "unpaid"; + + // Automatically update remaining_amount based on status + const remainingAmount = + invoiceStatus === "paid" ? 0 : formData.amount || ""; + + // Prepare data for submission + const invoiceDataToSubmit = { + ...formData, + store: user.store, + status: invoiceStatus, + remaining_amount: remainingAmount, // Ensure consistency with calculated status + ...(formData.pay_method === "cash" && { + payment_details: { + bank: formData.bank, + cheque: formData.cheque_no, + }, + }), + ...(formData.pay_method === "bank" && { + payment_details: { + bank: formData.bank, + }, + }), + ...(formData.pay_method === "cheque" && { + payment_details: { + cheque_no: formData.cheque_no, + }, + }), + }; + + + await Post("createInvoiceAndPrepaidTax", invoiceDataToSubmit).then((response) => { + toast.success("Invoice submitted successfully!"); + // Reload the component by navigating to the same route + setReloadData(!reloadData); + makeBlank(); + // navigate(0); + + }).catch((error) => { + setReloadData(!reloadData); + toast.error( + "An error occurred while submitting the invoice. Please check your network and try again." + ); + }); + + }; + + + + const fetchData = async () => { + try { + const [dueDaysResponse, vendorResponse, bankResponse] = await Promise.all( + [ + Get("dueDaysData"), + Get("vendorDepartmentData"), + Get("bank"), + // Get("invoiceData"), + ] + ); + + setDueDays(dueDaysResponse); + setVendors(vendorResponse); + setBanks(bankResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + + useEffect(() => { + fetchData(); + }, [reloadData]); + + const handleChange = (e) => { + const { name, value, type, checked } = e.target; + + if (name === "vendor_department") { + const selectedVendor = vendors.find((vendor) => vendor.id === value); + setFormData((prevData) => ({ + ...prevData, + [name]: value, + vendor_department_name: selectedVendor ? selectedVendor.name : "", + type: selectedVendor ? selectedVendor.type : "", + })); + } else if (name === "due_days") { + const selectedDueDays = parseInt(value, 10); + const today = new Date(); + const dueDate = new Date(today); + dueDate.setDate(dueDate.getDate() + selectedDueDays); + + // Format due date as YYYY-MM-DD + const formattedDueDate = dueDate.toISOString().split("T")[0]; + + setFormData((prevData) => ({ + ...prevData, + [name]: value, + due_date: formattedDueDate, + })); + } else { + setFormData((prevData) => ({ + ...prevData, + [name]: type === "checkbox" ? checked : value, + })); + } + + }; + const handlePaymentMethodChange = (e) => { + const value = e.target.value; + + // Set the pay method based on the selected payment method status + const newPayMethod = + value === "credit_invoice" + ? "credit_invoice" + : value === "pay_later" + ? "pay_later" + : ""; + + setFormData((prevData) => ({ + ...prevData, + + pay_method_status: value, + pay_method: newPayMethod, // Set pay_method to "pay_later" for "Pay Later" and "Credit Invoice" + due_date: null, // Resetting due date + note: "", // Clear the note when changing payment method + bank: "", + cheque_no: "", + })); + }; + + const handleCancel = () => { + makeBlank() + navigate("/"); + }; + + const fields = [ + { + row: 1, + column: "col-md-2", + label: "Bill Date", + type: "date", + name: "date", + placeholder: "Bill Date", + }, + { + row: 1, + column: "col-md-5", + label: "Vendor", + type: "select-vendor", + name: "vendor_department_name", + placeholder: "Select Vendor", + options: vendors, + }, + { + row: 1, + column: "col-md-5", + label: "Invoice Number", + type: "invoice_no", + name: "invoice_no", + placeholder: formData.invoice_no || "Invoice Number", + }, + { + row: 2, + column: "col-md-12", + name: "pay_method_status", + label: "Payment Method:", + type: "radio", + options: [ + { value: "pay_later", label: "Pay Later" }, + { value: "pay_now", label: "Pay Now" }, + { value: "credit_invoice", label: "Credit Invoice" }, + ], + }, + { + row: 3, + column: "col-md-12", + label: "Payment Method Options", + type: "payment-method-options", + }, + { + row: 4, + column: "col-md-12", + label: "Payment Method Options", + type: "pay-bank-options", + }, + { + row: 4, + column: "col-md-6", + label: "Due Days", + type: "select-dueDays", + name: "due_days", + placeholder: "Select Due Days", + options: dueDays, + }, + // The "Notes" field is conditionally rendered based on pay_method_status + ...(formData.pay_method_status !== "pay_now" + ? [ + { + row: 5, + column: "col-md-6", + label: "Notes", + type: "text", + name: "note", + placeholder: "Notes", + }, + ] + : []), + { + row: 5, + column: "col-md-12", + label: "Do you want to add Prepaid Tax?", + type: "checkbox", + name: "prepaid_tax", + }, + { + row: 6, + column: "col-md-6", + label: "Amount", + name: "amount", + type: "prefix-input", + placeholder: "Amount", + prefixText: "USD", + }, + ]; + + const paymentMethodOptions = [ + { value: "cash", label: "Cash" }, + { value: "cheque", label: "Cheque" }, + { value: "bank", label: "Bank Card (ACH/EFT)" }, + ]; + + const groupedFields = fields.reduce((acc, field) => { + const row = field.row; + if (!acc[row]) { + acc[row] = []; + } + acc[row].push(field); + return acc; + }, {}); + + useEffect(() => { + const handleClickOutside = (event) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setIsOpen(false); + } + }; + + document.addEventListener("click", handleClickOutside); + + return () => { + document.removeEventListener("click", handleClickOutside); + }; + }, []); + + const handleLinkClick = (path) => { + // setActiveButton(path); + setIsOpen(false); // Close the dropdown after clicking a link + + navigate(path); // Navigate to the clicked path + + }; + + const renderField = (field) => { + switch (field.type) { + case "text": + if ( + field.name === "note" && + (formData.pay_method === "cheque" || formData.pay_method === "bank") + ) { + return null; // Don't render Notes + } + return ( +
+ +
+ ); + case "invoice_no": + return ( +
+ +
+ ); + + + case "date": + return ( +
+ +
+ ); + case "prefix-input": + return ( +
+
+ + {field.prefixText} + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
+
+ ); + + case "select-vendor": + return ( +
+ + +
+ ); + + case "select": + return ( +
+ +
+ ); + case "select-dueDays": + // Show Select Due Days when 'Pay Later' or 'Credit Invoice' is selected + return ( + (formData.pay_method_status === "pay_later" || + formData.pay_method_status === "credit_invoice") && ( +
+ + + + + + + + + + + + +
+ ) + ); + + case "radio": + return ( +
+ + {field.options.map((option, index) => ( +
+ {" "} + + +
+ ))} +
+ ); + + case "payment-method-options": + return ( + formData.pay_method_status === "pay_now" && ( +
+ {/* Align items vertically */} + {" "} + {/* Extra space after the main label */} + {paymentMethodOptions.map((option, index) => ( +
+ {" "} + {/* Space between options */} + + {" "} + {/* Space between radio and label */} +
+ ))} +
+ ) + ); + + case "checkbox": + return ( +
+ + +
+ ); + + case "pay-bank-options": + return ( + (formData.pay_method === "cheque" || + formData.pay_method === "bank") && ( +
+
+
+ +
+
+ + {formData.pay_method === "cheque" && ( // Only show this if pay_method is cheque +
+
+ +
+
+ )} +
+
+ +
+
+
+ ) + ); + + default: + return null; + } + }; + + return ( +
+
+
+ + + + +
+
+
+
+ +
+ {/* Action Buttons */} +
+ + +
+
+ {/* Render Fields */} + {Object.keys(groupedFields).map((rowKey) => ( +
+ {groupedFields[rowKey].map((field, index) => ( +
+ {renderField(field)} +
+ ))} +
+ ))} + + {/* Prepaid Tax Field */} + {formData.prepaid_tax && ( +
+
+
+ + { + // Allow only numbers and one decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Ensure only two decimal places + .slice(0, 12); // Limit input length + }} + /> +
+
+
+ )} + +
+
+ + + +
+ + +
+
+); +} + +export default AddInvoice; \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/AtmDeposit.js b/src/components/Pages/AppPAges/Dashboard/Invoice/AtmDeposit.js new file mode 100644 index 0000000..f4fe8e9 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/AtmDeposit.js @@ -0,0 +1,319 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState, useEffect, useContext, useRef } from "react"; +import { useNavigate } from "react-router-dom"; +import { ToastContainer, toast } from "react-toastify"; +import "./Invoice.css"; +import { useLocation } from 'react-router-dom'; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../../utils/secure-route/AuthContext"; +import ATMDepositTable from "./ATMDepositTable"; + +function AtmDeposit() { + const { user } = useContext(AuthContext); + const { Get, Post } = useApi(); + const storeid = user.store; + const navigate = useNavigate(); + const today = new Date().toISOString().split("T")[0]; // Formats date as YYYY-MM-DD + + const [activeButton, setActiveButton] = useState(''); + + const location = useLocation(); + + useEffect(() => { + setActiveButton(location.pathname); // Set the active button based on the current location + }, [location.pathname]); + + const [isOpen, setIsOpen] = useState(false); + const [banks, setBanks] = useState([]); + + const dropdownRef = useRef(null); + const toggleDropdown = () => { + setIsOpen(!isOpen); + }; + + const [reloadData, setReloadData] = useState(false); + const [formData, setFormData] = useState({ + date: "" || today, + transaction_type: "ATM Deposit", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + total_amount: "", + note: "", + atm_commission: "", + income_type: null, + bank_deposite_type: null, + owner: null, + }); + + + + const makeBlank = () => { + setFormData({ + date: "" || today, + transaction_type: "ATM Deposit", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + total_amount: "", + note: "", + atm_commission: "", + income_type: null, + bank_deposite_type: null, + owner: null, + }); + }; + + useEffect(() => { + const fetchBanks = async () => { + try { + const data = await Get("bank"); + setBanks(data); + } catch (error) { + console.error("Error fetching banks:", error); + } + }; + fetchBanks(); + }, []); + + useEffect(() => { + const handleClickOutside = (event) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setIsOpen(false); + } + }; + + document.addEventListener("click", handleClickOutside); + + return () => { + document.removeEventListener("click", handleClickOutside); + }; + }, []); + + const handleLinkClick = (path) => { + setIsOpen(false); // Close the dropdown after clicking a link + navigate(path); // Navigate to the clicked path + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + + // Validate the selected type + if (!formData.bank_deposite_type || formData.bank_deposite_type === "") { + toast.error("Please select a valid Deposite type."); // Show error toast + return; // Stop the submission if validation fails + } + + // Validate cash amount + if (!formData.cash_amount || formData.cash_amount <= 0) { + toast.error("Please enter a valid Cash amount."); // Show error toast for cash_amount + return; // Stop the submission if validation fails + } + + try { + const updatedFormData = { ...formData, store: storeid }; + await Post("transactionData", updatedFormData) + .then((resp) => { + toast.success("Submission successful!"); + setReloadData(!reloadData); + // setTimeout(() => { + // window.location.reload(); + // }, 100); + makeBlank(); + }) + .catch((error) => { + setReloadData(!reloadData); + console.error("Error submitting form:", error); + toast.error("Submission failed: " + error.message); + }); + } catch (error) { + setReloadData(!reloadData); + toast.error("Submission failed: " + error.message); + } + }; + + return ( +
+ +
+
+ + + + +
+
+
+
+
+
+ + +
+ + +
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+
+ Type:      + {["Business cash", "Lottery cash", "Gas cash"].map((type) => ( +
+ + +
+ ))} +
+
+ {/*
+ +
*/} +
+
+
+ + USD + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + + /> +
+
+
+
+
+
+ +
+
+ ); +} + +export default AtmDeposit; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/BankDeposit.js b/src/components/Pages/AppPAges/Dashboard/Invoice/BankDeposit.js new file mode 100644 index 0000000..b7e2d55 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/BankDeposit.js @@ -0,0 +1,351 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useEffect, useState, useContext, useRef } from "react"; +import { useNavigate } from "react-router-dom"; +import { ToastContainer, toast } from "react-toastify"; +import "./Invoice.css"; +import { useLocation } from 'react-router-dom'; +import TableComponent from "./BankDepositTable"; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../../utils/secure-route/AuthContext"; + +function BankDeposit() { + const { user } = useContext(AuthContext); + const { Get, Post } = useApi(); + const storeid = user.store; + const navigate = useNavigate(); + const [activeButton, setActiveButton] = useState(''); + const today = new Date().toISOString().split("T")[0]; // Formats date as YYYY-MM-DD + const [isOpen, setIsOpen] = useState(false); + const [reloadData, setReloadData] = useState(false); + const location = useLocation(); + useEffect(() => { + setActiveButton(location.pathname); // Set the active button based on the current location + }, [location.pathname]); + + const dropdownRef = useRef(null); + const toggleDropdown = () => { + setIsOpen(!isOpen); + }; + const [formData, setFormData] = useState({ + date: "" || today, + transaction_type: "Bank Deposit", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + total_amount: "", + note: "", + atm_commission: "", + income_type: null, + bank_deposite_type: null, + owner: null + }); + + const [banks, setBanks] = useState([]); + + useEffect(() => { + const fetchBanks = async () => { + try { + const data = await Get("bank"); + setBanks(data); + } catch (error) { + console.error("Error fetching banks:", error); + } + }; + + + fetchBanks(); + }, []); + + useEffect(() => { + const handleClickOutside = (event) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setIsOpen(false); + } + }; + + document.addEventListener("click", handleClickOutside); + + return () => { + document.removeEventListener("click", handleClickOutside); + }; + }, []); + + const handleLinkClick = (path) => { + setIsOpen(false); // Close the dropdown after clicking a link + navigate(path); // Navigate to the clicked path + setActiveButton(path); + }; + + + const handleChange = (e) => { + const { name, value } = e.target; + + // Allow only numbers and restrict the input to 10 digits + if (name === 'cash_amount' || name === 'cheque_amount') { + // If the value is numeric and length is <= 10, update the formData + if (/^\d{0,10}(\.\d{0,2})?$/.test(value)) { + setFormData((prevData) => ({ + ...prevData, + [name]: value + })); + } + } else { + // For other fields, handle the change normally + setFormData((prevData) => ({ + ...prevData, + [name]: value + })); + } + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + + // Validate the selected type + if (!formData.bank_deposite_type || formData.bank_deposite_type === "") { + toast.error("Please select a valid Deposite type."); // Show error toast + return; // Stop the submission if validation fails + } + + try { + const updatedFormData = { ...formData, store: storeid }; + console.log("Submitting data:", updatedFormData); // Log the data being submitted + + const response = await Post("transactionData", updatedFormData); + + // Assuming response is an object that includes a status property + if (response && (response.status === 200 || response.status === 201)) { + toast.success("Submission successful!"); // Success toast + + // Clear the form data + setFormData({ + date: today, + transaction_type: "Bank Deposit", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + total_amount: "", + note: "", + atm_commission: "", + income_type: null, + bank_deposite_type: null, + owner: null + }); + + setReloadData(!reloadData); // Optionally reload the data + + // Optionally close dropdown and reset other states + setIsOpen(false); + } else { + setReloadData(!reloadData); + // Handle unexpected status codes + throw new Error(`Error: ${response.statusText || "Unknown error"}`); // Improved error handling + } + } catch (error) { + setReloadData(!reloadData); + console.error("Error submitting form:", error); // Log the error details + toast.error("Submission failed: " + error.message); // Show error toast + } + }; + + + return ( +
+ +
+
+ + + + +
+
+
+
+
+
+ +
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ Type:      + {["Business cash", "Lottery cash", "Gas cash"].map((type) => ( +
+ + +
+ ))} +
+
+
+
+
+ + USD + + +
+ +
+
+
+ + USD + + +
+
+
+
+
+
+
+
+ +
+
+ ); +} + +export default BankDeposit; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/BankDepositTable.js b/src/components/Pages/AppPAges/Dashboard/Invoice/BankDepositTable.js new file mode 100644 index 0000000..d1bb014 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/BankDepositTable.js @@ -0,0 +1,741 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useEffect, useState } from "react"; +import "./Invoice.css"; +import Swal from "sweetalert2"; +import { toast } from "react-toastify"; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; + +const BankDepositTable = (props) => { + const [invoices, setInvoices] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const [selectedStatus, setSelectedStatus] = useState("All"); + const [sortOrder, setSortOrder] = useState({ column: "", direction: "asc" }); + const [currentPage, setCurrentPage] = useState(1); + const invoicesPerPage = 10; + const [selectedVendor, setSelectedVendor] = useState(""); + const [vendors, setVendors] = useState([]); + const [fromDate, setFromDate] = useState(""); + const [toDate, setToDate] = useState(""); + + const { Get, Delete } = useApi(); + function filterByTransactionType(dataArray, transactionType) { + return dataArray.filter(record => record.transaction_type === transactionType); + } + useEffect(() => { + const fetchInvoices = async () => { + await Get("transactionData") + .then((response) => { + let type = (props.transaction_type) ? props.transaction_type : "Bank Deposit"; + setInvoices(filterByTransactionType(response, type)); + const uniqueVendors = [ + ...new Set(response.map((invoice) => invoice.vendor_department_name)), + ]; + setVendors(uniqueVendors); + }) + .catch((error) => { + console.error(error); + }); + }; + fetchInvoices(); + }, [props.reloadData]); + const applyFilters = () => { + let filteredInvoices = invoices; + + if (selectedStatus !== "All") { + filteredInvoices = filteredInvoices.filter( + (invoice) => invoice.bank_deposite_type === selectedStatus + ); + } + if (selectedVendor) { + filteredInvoices = filteredInvoices.filter( + (invoice) => invoice.vendor_department_name === selectedVendor + ); + } + + if (fromDate) { + filteredInvoices = filteredInvoices.filter( + (invoice) => new Date(invoice.date) >= new Date(fromDate) + ); + } + if (toDate) { + filteredInvoices = filteredInvoices.filter( + (invoice) => new Date(invoice.date) <= new Date(toDate) + ); + } + + setInvoices(filteredInvoices); + }; + + const handleSort = (column) => { + const direction = + sortOrder.column === column && sortOrder.direction === "asc" + ? "desc" + : "asc"; + setSortOrder({ column, direction }); + + const sortedInvoices = [...filteredInvoices].sort((a, b) => { + if (a[column] < b[column]) return direction === "asc" ? -1 : 1; + if (a[column] > b[column]) return direction === "asc" ? 1 : -1; + return 0; + }); + + setInvoices(sortedInvoices); + }; + + const filteredInvoices = (invoices || []).filter((invoice) => { + const date = invoice.date || ""; + const bankName = invoice.bank_name || ""; + const invoiceNumber = invoice.bank_deposite_type || ""; + const matchesSearch = + date.toLowerCase().includes(searchQuery.toLowerCase()) || + bankName.toLowerCase().includes(searchQuery.toLowerCase()) || + invoiceNumber.toLowerCase().includes(searchQuery.toLowerCase()); + + const matchesStatus = + selectedStatus === "All" || invoice.bank_deposite_type === selectedStatus; + + return matchesSearch && matchesStatus; + }); + + const totalInvoices = filteredInvoices.length; + + const totalPages = Math.ceil(totalInvoices / invoicesPerPage); + const startIndex = (currentPage - 1) * invoicesPerPage; + const currentInvoices = filteredInvoices.slice( + startIndex, + startIndex + invoicesPerPage + ); + + const handleNextPage = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrevPage = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + const handleDelete = async (id) => { + try { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + if (!result.isConfirmed) return; // Exit if the user cancels + + // Perform the delete operation + await Delete(`transactionData`, id); + + // Update the invoice list + const updatedInvoices = invoices.filter((invoice) => invoice.id !== id); + setInvoices(updatedInvoices); + + // Show success notification + toast.success("Invoice successfully deleted!"); + } catch (error) { + // Handle errors + if (error.response) { + toast.error(`Error deleting invoice: ${error.response.data}`); + toast.error(`Status code: ${error.response.status}`); + } else if (error.request) { + toast.error("No response received from the server."); + } else { + toast.error(`Error setting up request: ${error.message}`); + } + } + }; + + + const handleEdit = (invoice) => { + console.log("Edit invoice:", invoice); + toast.error("You don't have permission to edit this invoice."); // Show error notification + }; + + const getSortIcon = (column) => { + if (sortOrder.column === column) { + return ( + + + + + ); + } + return null; + }; + const renderPagination = () => { + const paginationItems = []; + const totalPages = Math.ceil(totalInvoices / invoicesPerPage); + + if (totalPages <= 3) { + // If there are 3 or fewer pages, show all + for (let i = 1; i <= totalPages; i++) { + paginationItems.push( + + ); + } + } else { + // More than 3 pages + if (currentPage > 1) { + paginationItems.push( + + ); + } + + if (currentPage > 2) { + paginationItems.push(...); + } + + // Show the current page and surrounding pages + if (currentPage > 1) { + paginationItems.push( + + ); + } + + paginationItems.push( + + ); + + if (currentPage < totalPages) { + paginationItems.push( + + ); + } + + if (currentPage < totalPages - 1) { + paginationItems.push(...); + } + } + + return ( +
+ + + {paginationItems} + + +
+ ); + }; + + return ( +
+
+ {/* Search Bar */} +
+
+ + + + + + + setSearchQuery(e.target.value)} + /> +
+
+ +
+
+ {["All","Business cash", "Lottery cash", "Gas cash"].map((bank_deposite_type) => ( + + ))} +
+ +
+ + +
    +
  • +
    + +
    +
  • + {/*
  • +
    + +
    +
  • */} +
  • +
    +
    + setFromDate(e.target.value)} + /> +
    +
    + setToDate(e.target.value)} + /> +
    +
    +
  • +
  • + +
  • +
+
+
+
+ + {/* Table of Invoices */} + + + + {["date", "bank_name", "bank_deposite_type", "amount", "Transaction Type","actions"].map( + (header, index) => ( + + ) + )} + + + + + {currentInvoices.length !== 0 ? + currentInvoices.map((invoice) => ( + + + + + + + + + )) + : ( + + + + ) + } + +
handleSort(header)} + style={{ + paddingLeft: index === 0 ? "30px" : "0", + cursor: "pointer", + borderTopLeftRadius: index === 0 ? "60px" : "0", + borderBottomLeftRadius: index === 0 ? "60px" : "0", + borderTopRightRadius: index === 5 ? "60px" : "0", + borderBottomRightRadius: index === 5 ? "60px" : "0", + textAlign: "start", + alignContent: "center", + }} + > + {header + .replace(/_/g, " ") + .replace(/\b\w/g, (char) => char.toUpperCase())}{" "} + {getSortIcon(header)} +
+ {invoice.date} + + {invoice.bank_name} + + + {invoice.bank_deposite_type + ? invoice.bank_deposite_type.charAt(0).toUpperCase() + + invoice.bank_deposite_type.slice(1) + : "N/A"} + + {invoice.total_amount} + + {invoice.transaction_type ? + invoice.transaction_type.charAt(0).toUpperCase() + invoice.transaction_type.slice(1) : + 'N/A'} + + + +
+ No data found +
+ + {renderPagination()} +
+ ); +}; + +const paymentMethodStyles = { + bank: { backgroundColor: "#57A09C" }, + "Business cash": { backgroundColor: "#38400B" }, + "Credit Card": { backgroundColor: "#28a745" }, + "Gas cash": { backgroundColor: "#57A09C" }, + "Lottery cash": { backgroundColor: "#CAC59D" }, + cheque: { backgroundColor: "#38400B" }, + pay_later: { backgroundColor: "#E55477" }, + pay_now: { backgroundColor: "#A9B0F0" }, + credit_invoice: { backgroundColor: "#CFCC76" }, +}; + +const getPaymentMethodStyle = (method) => ({ + ...(paymentMethodStyles[method] || { backgroundColor: "#6c757d" }), + borderRadius: "30px", + padding: "5px 10px", + color: "#fff", +}); + +const statusStyles = { + All: { backgroundColor: "#4545DB" }, + "Business cash": { backgroundColor: "#38400B" }, + "Lottery cash": { backgroundColor: "#CAC59D" }, + "Gas cash": { backgroundColor: "#57A09C" }, +}; + +const getStatusStyle = (status) => ({ + ...(statusStyles[status] || { backgroundColor: "#6c757d" }), + borderRadius: "30px", + padding: "5px 10px", + color: "#fff", +}); + +const getCountClass = (status) => ({ + ...statusStyles[status], + padding: "10px", +}); +export default BankDepositTable; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/Invoice.css b/src/components/Pages/AppPAges/Dashboard/Invoice/Invoice.css new file mode 100644 index 0000000..74dd668 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/Invoice.css @@ -0,0 +1,346 @@ +.dashboard-container { + justify-content: center; + align-items: center; + padding: 20px; +} + +.container { + padding: 30px; + border-radius: 10px; +} + +.dropdown-toggle::after { + display: none; /* This will remove the default dropdown arrow */ +} + +.nav-item { + position: relative; /* Allows absolute positioning of dropdowns */ +} +.button-groups { + display: flex; + margin-left: 35%; + gap: 10px; /* Adjust the spacing between buttons */ + background-color: #ffffff; + width: auto; + border-radius: 20px; + padding: 10px 50px; + + + } + + + /* Active button styles */ + .btn.active { + background-color: #ffaf32; /* Yellow background */ + border-radius: 20px; + color: black; /* Black text */ + } + + +.dash-drop-menu { + white-space: nowrap; /* Prevent wrapping */ + list-style-type: none; + padding: 0; + margin: 0; + position: absolute; + top: 100%; /* Positions dropdown below the parent */ + left: 0; + background-color: #FFFFFF; + border: 1px solid #F6F6F6; + z-index: 1000; + border-radius: 10px; + min-width: 190px; /* Optional minimum width */ + filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25)); +} + +.dash-drop-menu-item { + padding: 10px 15px; + text-decoration: none; + color: #002300; + filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25)); + display: block; + width: auto; + font-size: 16px; + box-sizing: border-box; + border-bottom: 1px solid rgba(230, 230, 230, 0.3); + transition: none; +} + +.dash-drop-menu-item:hover { + background-color: transparent; /* Prevent background change */ + color: #002300; /* Maintain original text color */ + cursor: default; /* Maintain default cursor */ +} + +.form-container { + width: 1328px; + height: 461px; +} + +.form-group { + margin-bottom: 20px; + /* Add spacing between form groups */ +} + +.btn { + min-width: 120px; + /* Ensure buttons have a minimum width */ +} + +.form-control-borderless { + display: block; + width: 100%; + padding: .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: none; + border-bottom: 0.5px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0.5px; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + box-shadow: none; + outline: 0 none; + + cursor: auto; +} + + +.formcontainer .btn { + transition: background-color 0.3s, color 0.3s; +} + +.formcontainer .btn-primary:hover { + background-color: #0056b3; + color: white; +} + +.input-group { + flex-wrap: nowrap; + border-radius: 50px; + background-color: #f4f4f4; +} + +.input-group .form-control { + border: none; + background-color: transparent; + outline: none; /* Removes the outline */ + +} + +.table th { + justify-content: center; + height: 60px; + background-color: #f9f9f9; + font-weight: bold; +} + +.table td { + border-bottom: .5px solid #f4f4f4; + text-align: left; + vertical-align: middle; +} + +.table tbody tr:hover { + background-color: #f1f1f1; +} + +.badge { + justify-content: center; + align-items: center; + border-radius: 60px; + margin-left: 5px; +} + +.pagination { + border-end-start-radius: 24px; + border-end-end-radius: 24px; + padding: 10px; + + background-color: #f4f4f4; + justify-content: center; + align-items: center; +} + +.pgbtn { + + background-color: #b6d7a8; + border: #ced4da; + width: 30px; + height: 30px; + border-radius: 30px; +} + +.active-pgbtn { + background-color: #ffaf32; /* White background for active button */ + border: 1px solid #00230007; + width: 30px; + height: 30px; + border-radius: 30px; +} + +.filterbutton { + background-color: #f4f4f4; +} + +.dropdown-item { + cursor: pointer; + background-color: transparent; /* Ensure background is transparent */ +} + +.dropdown-item:hover { + /* Remove hover effects */ + background-color: transparent !important; /* Override any other styles */ + color: inherit; /* Keep text color the same */ + text-decoration: none; /* Remove underline or other text effects */ +} + +.filtercontainer { + display: flex; + flex-wrap: wrap; +} + +.btn.dropdown-vertical:focus, +.btn.dropdown-vertical:active { + border: none; + box-shadow: none; +} + + +.btn.dropdown-vertical:hover { + border: none; +} + + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + box-shadow: none; + outline: 0 none; +} + +/* Media Queries */ + +/* For devices with screen width max 768px (tablets and mobile) */ +@media (max-width: 768px) { + .filtercontainer { + display: none; /* Hide the filter buttons in mobile view */ + } + + .filterbutton { + display: block; /* Show the filter button */ + } + + .dropdown-menu { + width: 100% !important; + position: static; + margin-top: 0; + } + + .dashboard-container { + padding: 15px; /* Adjust padding for smaller screens */ + } + + .form-container { + width: 100%; /* Make form container responsive */ + height: auto; /* Allow height to adjust for smaller devices */ + } + + .table { + font-size: 14px; /* Reduce table font size */ + } + + .pagination { + display: flex; + justify-content: center; + padding: 8px; /* Adjust padding for smaller screens */ + } + + .pgbtn { + width: 25px; /* Smaller pagination button */ + height: 25px; + } + + .active-pgbtn { + width: 25px; + height: 25px; + } + + .btn { + min-width: 100px; /* Adjust button width for mobile */ + } +} + +/* For devices with screen width max 820px (larger tablets) */ +@media (max-width: 993px) { + .filtercontainer { + display: none; /* Hide filter buttons */ + } + + .filterbutton { + display: block; /* Show the filter button */ + } + + .dropdown-menu { + width: 100% !important; + position: static; + margin-top: 0; + } + + .dashboard-container { + padding: 20px; + } + + .form-container { + width: 100%; /* Adjust form container width */ + height: auto; /* Allow height to adjust */ + } + + .table th, .table td { + padding: 8px; /* Reduce padding for better spacing */ + } + + .pagination { + justify-content: center; + padding: 8px; + } + + .pgbtn { + width: 25px; + height: 25px; + } + + .active-pgbtn { + width: 25px; + height: 25px; + } +} +/* Assuming .searchcontainer is initially defined somewhere */ +.flexiblesearch { + width: 300px; /* or any other value as needed */ +} + +/* For mobile devices with screen width max 768px */ +@media (max-width: 412px) { + .flexiblesearch { + width:.30%; /* Make it 30% smaller (i.e., 70% width) */ + } +} diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/InvoiceForm.js b/src/components/Pages/AppPAges/Dashboard/Invoice/InvoiceForm.js new file mode 100644 index 0000000..86f85fc --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/InvoiceForm.js @@ -0,0 +1,731 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState, useEffect, useContext, useRef } from "react"; +import { useNavigate } from "react-router-dom"; +import { toast } from "react-toastify"; +import "./Invoice.css"; +import TableComponent from "./InvoiceTable"; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../../utils/secure-route/AuthContext"; +import AddVendorModal from "../../ReusableForm/AddVendorModal"; + +function InvoiceForm({ onCancel }) { + const { Get, Post } = useApi(); + let { user } = useContext(AuthContext); + const [isOpen, setIsOpen] = useState(false); + const today = new Date().toISOString().split("T")[0]; // Formats date as YYYY-MM-DD + + const dropdownRef = useRef(null); + const toggleDropdown = () => { + setIsOpen(!isOpen); + }; + + const [showModal, setShowModal] = useState(false); + + const handleShow = () => setShowModal(true); + const handleClose = () => setShowModal(false); + const handleVendorAdded = (newVendor) => { + setVendors((prevVendors) => [...prevVendors, newVendor]); // Add new vendor to the list + setFormData({ ...formData, vendor_department: newVendor.id }); // Set the newly added vendor as the selected one + }; + + const navigate = useNavigate(); + + const [formData, setFormData] = useState({ + date: today, + vendor_department: "", + vendor_department_name: "", + invoice_no: "", // This will now have a default value from the last invoice + pay_method_status: "", + prepaid_tax: false, + prepaid_tax_percentage: "", + amount: "", + remaining_amount: "", + pay_method: "", + due_date: null, + note: "", + bank: "", + status: "", + cheque_no: null, + type: "", + }); + useEffect(() => { + setFormData((prevData) => ({ + ...prevData, + remaining_amount: prevData.amount, // Automatically set remaining_amount to the value of amount + })); + }, [formData.amount]); + const [vendors, setVendors] = useState([]); + const [banks, setBanks] = useState([]); + const [dueDays, setDueDays] = useState([]); + const handleSubmit = async (e) => { + e.preventDefault(); + + // Check for required fields + if (!formData.vendor_department) { + toast.error("Please select a vendor before submitting."); + return; // Prevent form submission if vendor is not selected + } + + if (!formData.invoice_no) { + toast.error("Invoice number is required."); + return; // Prevent form submission if invoice number is not provided + } + + if (!formData.amount) { + toast.error("Amount is required."); + return; // Prevent form submission if amount is not provided + } + + // Check if the payment method is selected + if (!formData.pay_method) { + toast.error("Please select a payment method before submitting."); + return; // Prevent form submission if payment method is not selected + } + + const invoiceStatus = + formData.pay_method_status === "pay_now" && formData.pay_method === "cash" + ? "paid" + : "unpaid"; + + const invoiceDataToSubmit = { + ...formData, + store: user.store, + status: invoiceStatus, + }; + + try { + const response = await Post("invoiceData", invoiceDataToSubmit); + + if (response && response.status === 201) { + toast.success("Invoice submitted successfully!"); + // Reload the component by navigating to the same route + navigate(0); + } else { + console.error("Failed to submit:", response?.data); + toast.error("Failed to submit invoice. Please try again."); + } + } catch (error) { + console.error("Error:", error); + toast.error( + "An error occurred while submitting the invoice. Please check your network and try again." + ); + } + }; + + const fetchData = async () => { + try { + const [ + dueDaysResponse, + vendorResponse, + bankResponse, + ] = await Promise.all([ + Get("dueDaysData"), + Get("vendorDepartmentData"), + Get("bank"), + Get("invoiceData"), + ]); + + setDueDays(dueDaysResponse); + setVendors(vendorResponse); + setBanks(bankResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; +const [reloaData, setReloadData] =useState(false); + useEffect(() => { + fetchData(); + }, [reloaData]); + + const handleChange = (e) => { + const { name, value, type, checked } = e.target; + + if (name === "vendor_department") { + const selectedVendor = vendors.find((vendor) => vendor.id === value); + setFormData((prevData) => ({ + ...prevData, + [name]: value, + vendor_department_name: selectedVendor ? selectedVendor.name : "", + type: selectedVendor ? selectedVendor.type : "", + })); + } else if (name === "due_days") { + const selectedDueDays = parseInt(value, 10); + const today = new Date(); + const dueDate = new Date(today); + dueDate.setDate(dueDate.getDate() + selectedDueDays); + + // Format due date as YYYY-MM-DD + const formattedDueDate = dueDate.toISOString().split("T")[0]; + + setFormData((prevData) => ({ + ...prevData, + [name]: value, + due_date: formattedDueDate, + })); + } else { + setFormData((prevData) => ({ + ...prevData, + [name]: type === "checkbox" ? checked : value, + })); + } + setReloadData(!reloaData); + }; + const handlePaymentMethodChange = (e) => { + const value = e.target.value; + setFormData((prevData) => ({ + ...prevData, + pay_method_status: value, + pay_method: "cash", // Resetting pay method to "cash" by default + due_date: null, // Resetting due date + note: "", // Clear the note when changing payment method + bank: "", + cheque_no: "", + })); + }; + + + const handleCancel = () => { + onCancel(); + }; + + const fields = [ + { + row: 1, + column: "col-md-2", + label: "Bill Date", + type: "date", + name: "date", + placeholder: "Bill Date", + }, + { + row: 1, + column: "col-md-5", + label: "Vendor", + type: "select-vendor", + name: "vendor_department_name", + placeholder: "Select Vendor", + options: vendors, + }, + { + row: 1, + column: "col-md-5", + label: "Invoice Number", + type: "text", + name: "invoice_no", + placeholder: formData.invoice_no || "Invoice Number", + }, + { + row: 2, + column: "col-md-12", + name: "pay_method_status", + label: "Payment Method:", + type: "radio", + options: [ + { value: "pay_later", label: "Pay Later" }, + { value: "pay_now", label: "Pay Now" }, + { value: "credit_invoice", label: "Credit Invoice" }, + ], + }, + { + row: 3, + column: "col-md-12", + label: "Payment Method Options", + type: "payment-method-options", + }, + { + row: 4, + column: "col-md-12", + label: "Payment Method Options", + type: "pay-bank-options", + }, + { + row: 4, + column: "col-md-6", + label: "Due Days", + type: "select-dueDays", + name: "due_days", + placeholder: "Select Due Days", + options: dueDays, + }, + // The "Notes" field is conditionally rendered based on pay_method_status + ...(formData.pay_method_status !== "pay_now" + ? [ + { + row: 5, + column: "col-md-6", + label: "Notes", + type: "text", + name: "note", + placeholder: "Notes", + }, + ] + : []), + { + row: 5, + column: "col-md-12", + label: "Do you want to add Prepaid Tax?", + type: "checkbox", + name: "prepaid_tax", + }, + { + row: 6, + column: "col-md-6", + label: "Amount", + name: "amount", + type: "prefix-input", + placeholder: "Amount", + prefixText: "USD", + }, + ]; + + + const paymentMethodOptions = [ + { value: "cash", label: "Cash" }, + { value: "cheque", label: "Cheque" }, + { value: "bank", label: "Bank Card (ACH/EFT)" }, + ]; + + const groupedFields = fields.reduce((acc, field) => { + const row = field.row; + if (!acc[row]) { + acc[row] = []; + } + acc[row].push(field); + return acc; + }, {}); + + useEffect(() => { + const handleClickOutside = (event) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setIsOpen(false); + } + }; + + document.addEventListener("click", handleClickOutside); + + return () => { + document.removeEventListener("click", handleClickOutside); + }; + }, []); + + const handleLinkClick = (path) => { + setIsOpen(false); // Close the dropdown after clicking a link + navigate(path); // Navigate to the clicked path + }; + + const renderField = (field) => { + switch (field.type) { + case "text": + if ( + field.name === "note" && + (formData.pay_method === "cheque" || formData.pay_method === "bank") + ) { + return null; // Don't render Notes + } + return ( +
+ + +
+ ); + + case "date": + return ( +
+ +
+ ); + case "prefix-input": + return ( +
+
+ + {field.prefixText} + + +
+
+ ); + + case "select-vendor": + return ( +
+ +
+ ); + + case "select": + return ( +
+ +
+ ); + case "select-dueDays": + // Show Select Due Days when 'Pay Later' or 'Credit Invoice' is selected + return ( + (formData.pay_method_status === "pay_later" || + formData.pay_method_status === "credit_invoice") && ( +
+ + + + + + + + + + + + +
+ ) + ); + + case "radio": + return ( +
+ {/* Align items vertically */} + {" "} + {/* Extra space after the main label */} + {field.options.map((option, index) => ( +
+ {" "} + {/* Space between options */} + + {" "} + {/* Space between radio and label */} +
+ ))} +
+ ); + + case "payment-method-options": + return ( + formData.pay_method_status === "pay_now" && ( +
+ {/* Align items vertically */} + {" "} + {/* Extra space after the main label */} + {paymentMethodOptions.map((option, index) => ( +
+ {" "} + {/* Space between options */} + + {" "} + {/* Space between radio and label */} +
+ ))} +
+ ) + ); + + case "checkbox": + return ( +
+ + +
+ ); + + case "pay-bank-options": + return ( + (formData.pay_method === "cheque" || + formData.pay_method === "bank") && ( +
+
+
+ +
+
+ + {formData.pay_method === "cheque" && ( // Only show this if pay_method is cheque +
+
+ +
+
+ )} +
+
+ +
+
+
+ ) + ); + + default: + return null; + } + }; + + return ( +
+ +
+
+
+ + {Object.keys(groupedFields).map((rowKey) => ( +
+ {groupedFields[rowKey].map((field, index) => ( +
+ {renderField(field)} +
+ ))} +
+ ))} + {formData.prepaid_tax && ( +
+
+
+ + +
+
+
+ )} +
+
+
+ +
+ ); +} + +export default InvoiceForm; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/InvoiceTable.js b/src/components/Pages/AppPAges/Dashboard/Invoice/InvoiceTable.js new file mode 100644 index 0000000..931398d --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/InvoiceTable.js @@ -0,0 +1,680 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useEffect, useState } from "react"; +import "./Invoice.css"; +import Swal from "sweetalert2"; + +import { toast } from "react-toastify"; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; +import { FilterButton } from "../../../../../utils/api-manager/Forms/SvgIcons"; + +const InvoiceTable = ({ reloadData }) => { + const { Get, Post } = useApi(); + + const [invoices, setInvoices] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const [selectedStatus, setSelectedStatus] = useState("All"); + const [sortOrder, setSortOrder] = useState({ column: "", direction: "asc" }); + const [currentPage, setCurrentPage] = useState(1); + const invoicesPerPage = 10; + const [selectedVendor, setSelectedVendor] = useState(""); + const [vendors, setVendors] = useState([]); + const [fromDate, setFromDate] = useState(""); + const [toDate, setToDate] = useState(""); + const [originalInvoices, setOriginalInvoices] = useState([]); + + const [reloaData, setReloadData] = useState(false); + + const fetchInvoices = async () => { + try { + const response = await Get("invoiceData"); + + // Filter out invoices where is_deleted is true + const filteredData = response.filter((invoice) => !invoice.is_deleted); + + setOriginalInvoices(filteredData); + setInvoices(filteredData); + + // Extract unique vendor names from the filtered invoices + const uniqueVendors = [ + ...new Set(filteredData.map((invoice) => invoice.vendor_department_name)), + ]; + setVendors(uniqueVendors); + } catch (error) { + console.error("Error fetching invoices:", error); + toast.error("An error occurred while fetching invoices. Please try again."); + } + }; + + + + useEffect(() => { + fetchInvoices(); + }, [reloadData]); + + const applyFilters = () => { + let filteredInvoices = originalInvoices; + + // Apply status filter + if (selectedStatus !== "All") { + filteredInvoices = filteredInvoices.filter( + (invoice) => invoice.status === selectedStatus + ); + } + + // Apply vendor filter + if (selectedVendor) { + filteredInvoices = filteredInvoices.filter( + (invoice) => invoice.vendor_department_name === selectedVendor + ); + } + + // Apply date filters + if (fromDate) { + filteredInvoices = filteredInvoices.filter( + (invoice) => new Date(invoice.date) >= new Date(fromDate) + ); + } + if (toDate) { + filteredInvoices = filteredInvoices.filter( + (invoice) => new Date(invoice.date) <= new Date(toDate) + ); + } + + // Update the state with filtered invoices + setInvoices(filteredInvoices); + }; + + const handleSort = (column) => { + const direction = + sortOrder.column === column && sortOrder.direction === "asc" + ? "desc" + : "asc"; + setSortOrder({ column, direction }); + + const sortedInvoices = [...filteredInvoices].sort((a, b) => { + if (a[column] < b[column]) return direction === "asc" ? -1 : 1; + if (a[column] > b[column]) return direction === "asc" ? 1 : -1; + return 0; + }); + + setInvoices(sortedInvoices); + }; + + const filteredInvoices = invoices.filter((invoice) => { + const vendorName = invoice.vendor_department_name || ""; + const invoiceNumber = invoice.invoice_no || ""; + const matchesSearch = + vendorName.toLowerCase().includes(searchQuery.toLowerCase()) || + invoiceNumber.toLowerCase().includes(searchQuery.toLowerCase()); + + const matchesStatus = + selectedStatus === "All" || invoice.status === selectedStatus; + + return matchesSearch && matchesStatus; // Include status filter + }); + + const totalInvoices = filteredInvoices.length; + + const totalPages = Math.ceil(totalInvoices / invoicesPerPage); + const startIndex = (currentPage - 1) * invoicesPerPage; + const currentInvoices = filteredInvoices.slice( + startIndex, + startIndex + invoicesPerPage + ); + + const handleNextPage = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrevPage = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + const handleDelete = async (id) => { + // Show confirmation dialog using SweetAlert + const { isConfirmed } = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Exit if the user cancels + if (!isConfirmed) return; + + try { + // Call the delete function + await Post(`deleteInvoice`, { "invoice_id": id }); + + // Update the invoices state + const updatedInvoices = invoices.filter((invoice) => invoice.id !== id); + setInvoices(updatedInvoices); + + // Show success notification + toast.success("Invoice successfully deleted!"); + } catch (error) { + if (error.response) { + toast.error("Error deleting invoice:", error.response.data); + toast.error("Status code:", error.response.status); + } else if (error.request) { + toast.error("No response received:", error.request); + } else { + toast.error("Error setting up request:", error.message); + } + } + }; + + const getSortIcon = (column) => { + if (sortOrder.column === column) { + return ( + + + + + ); + } + return null; + }; + const renderPagination = () => { + const paginationItems = []; + const totalPages = Math.ceil(totalInvoices / invoicesPerPage); + + if (totalPages <= 3) { + // If there are 3 or fewer pages, show all + for (let i = 1; i <= totalPages; i++) { + paginationItems.push( + + ); + } + } else { + // More than 3 pages + if (currentPage > 1) { + paginationItems.push( + + ); + } + + if (currentPage > 2) { + paginationItems.push(...); + } + + // Show the current page and surrounding pages + if (currentPage > 1) { + paginationItems.push( + + ); + } + + paginationItems.push( + + ); + + if (currentPage < totalPages) { + paginationItems.push( + + ); + } + + if (currentPage < totalPages - 1) { + paginationItems.push(...); + } + } + + return ( +
+ + + + + {paginationItems} + + +
+ ); + }; + + return ( +
+
+
+
+ + + + + + + setSearchQuery(e.target.value)} + /> +
+
+ +
+
+ {["All", "unpaid", "partially_paid"].map((status) => ( + + ))} +
+ +
+ + +
    +
  • +
    + +
    +
  • +
  • +
    + +
    +
  • +
  • +
    +
    + setFromDate(e.target.value)} + /> +
    +
    + setToDate(e.target.value)} + /> +
    +
    +
  • +
  • + +
  • +
+
+
+
+ + {/* Table of Invoices */} +
+
+ + + + {[ + "date", + "vendor Name", + "amount", + "remaining_amount", + "payment_method", + "status", + "actions", + ].map((header, index) => ( + + ))} + + + + + {currentInvoices.length > 0 ? ( + currentInvoices.map((invoice) => ( + + + + + + + + + + )) + ) : ( + + + + )} + +
handleSort(header)} + style={{ + paddingLeft: index === 0 ? "30px" : "0", + cursor: "pointer", + + textAlign: "start", + alignContent: "center", + backgroundColor:'#282e26', + color:'#ffffff' + }} + > + {header + .replace(/_/g, " ") + .replace(/\b\w/g, (char) => char.toUpperCase())}{" "} + {getSortIcon(header)} +
{invoice.date}{invoice.vendor_department_name}{invoice.amount}{invoice.remaining_amount} + + {invoice.pay_method + .replace(/_/g, " ") + .split(" ") + .map( + (word) => + word.charAt(0).toUpperCase() + word.slice(1) + ) + .join(" ")} + + + + {invoice.status + .replace(/_/g, " ") + .split(" ") + .map( + (word) => + word.charAt(0).toUpperCase() + word.slice(1) + ) + .join(" ")} + + + +
+ No data found +
+
+
+ + + {renderPagination()} +
+ ); +}; + +const paymentMethodStyles = { + bank: { backgroundColor: "#57A09C" }, + "Business Cash": { backgroundColor: "#38400B" }, + "Credit Card": { backgroundColor: "#28a745" }, + cash: { backgroundColor: "#CAC59D" }, + cheque: { backgroundColor: "#38400B" }, + pay_later: { backgroundColor: "#E55477" }, + pay_now: { backgroundColor: "#A9B0F0" }, + credit_invoice: { backgroundColor: "#CFCC76" }, +}; + +const getPaymentMethodStyle = (method) => ({ + ...(paymentMethodStyles[method] || { backgroundColor: "#6c757d" }), + borderRadius: "5px", + padding: "10px 20px", + color: "#fff", +}); + +const statusStyles = { + All: { backgroundColor: "#4545DB" }, + // draft: { backgroundColor: '#4545DB7C' }, + unpaid: { backgroundColor: "#ff2024" }, + partially_paid: { backgroundColor: "#0c8ce9" }, +}; + +const getStatusStyle = (status) => ({ + ...(statusStyles[status] || { backgroundColor: "#198f51" }), + borderRadius: "5px", + padding: "10px 20px", + color: "#fff", +}); + +const getCountClass = (status) => ({ + ...statusStyles[status], + padding: "10px", +}); +export default InvoiceTable; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/PayInvoice.js b/src/components/Pages/AppPAges/Dashboard/Invoice/PayInvoice.js new file mode 100644 index 0000000..7da52ca --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/PayInvoice.js @@ -0,0 +1,637 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState, useEffect, useContext, useRef } from "react"; +import { useNavigate } from "react-router-dom"; +import "./Invoice.css"; +import { useLocation } from 'react-router-dom'; +import AuthContext from "../../../../../utils/secure-route/AuthContext"; +import TableComponent from "./PayInvoice_Table"; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; +import { toast, ToastContainer } from "react-toastify"; +import AddVendorModal from "../../ReusableForm/AddVendorModal"; + +function PayInvoice() { + const { Get, Patch } = useApi(); + const [reloadData, setReloadData] = useState(false); + let { user } = useContext(AuthContext); + const today = new Date().toISOString().split("T")[0]; // Formats date as YYYY-MM-DD + const navigate = useNavigate(); + + + const [activeButton, setActiveButton] = useState(''); + + const location = useLocation(); + + useEffect(() => { + setActiveButton(location.pathname); // Set the active button based on the current location + }, [location.pathname]); + + const [isOpen, setIsOpen] = useState(false); + const dropdownRef = useRef(null); + const toggleDropdown = () => { + setIsOpen(!isOpen); + }; + + const [showModal, setShowModal] = useState(false); + + const handleShow = () => setShowModal(true); + const handleClose = () => setShowModal(false); + const handleVendorAdded = (newVendor) => { + setVendors((prevVendors) => [...prevVendors, newVendor]); // Add new vendor to the list + setFormData({ ...formData, vendor_department: newVendor.id }); // Set the newly added vendor as the selected one + }; + + const [formData, setFormData] = useState({ + store_id: user.store, + invoice_no: "", + date: "", + status: "paid", + pay_method_status: "pay_now", + pay_method: "", + amount: "", + remaining_amount: "", // Initialize as empty string or 0 + discount: 0, + pay_amount: 0, + after_discount: 0, + prepaid_tax: true, + vendor_department: "", + vendor_department_name: "", + cheque_no: null, + note: "", + due_date: null, + bank: "", + }); + + const makeBlank = ()=>{ + setFormData({ + store_id: user.store, + invoice_no: "", + date: "", + status: "paid", + pay_method_status: "pay_now", + pay_method: "", + amount: "", + remaining_amount: "", // Initialize as empty string or 0 + discount: 0, + pay_amount: 0, + after_discount: 0, + prepaid_tax: true, + vendor_department: "", + vendor_department_name: "", + cheque_no: null, + note: "", + due_date: null, + bank: "", + }); + } + const [vendors, setVendors] = useState([]); + const [banks, setBanks] = useState([]); + const [filteredInvoices, setFilteredInvoices] = useState([]); + const [selectedVendor, setSelectedVendor] = useState(""); + const [initialAmount, setInitialAmount] = useState(null); + + useEffect(() => { + const fetchData = async () => { + try { + const [vendorResponse, bankResponse, invoiceResponse] = + await Promise.all([ + Get("vendorDepartmentData"), + Get("bank"), + Get("invoiceData"), + ]); + + setVendors(vendorResponse); + setBanks(bankResponse); + setFilteredInvoices(invoiceResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + fetchData(); + }, [reloadData]); + + useEffect(() => { + if (selectedVendor) { + setFilteredInvoices((prevInvoices) => + prevInvoices.filter( + (invoice) => invoice.vendor_department === selectedVendor + ) + ); + } + }, [selectedVendor]); + + const handleChange = (e) => { + const { name, value } = e.target; + const parsedValue = parseFloat(value) || 0; + + if (name === "vendor_department") { + setSelectedVendor(value); + setFormData((prevData) => ({ + ...prevData, + vendor_department: value, + invoice_no: "", + amount: "", + pay_amount: 0, + discount: 0, + after_discount: 0, + })); + } else if (name === "discount") { + setFormData((prevData) => { + const newDiscount = parsedValue; + const newPayAmount = + prevData.pay_amount || prevData.remaining_amount || 0; // Use pay_amount or remaining_amount + const newAfterDiscount = Math.max(0, newPayAmount - newDiscount); // Calculate after_discount + + return { + ...prevData, + discount: newDiscount, + after_discount: newAfterDiscount, // Update after_discount when discount changes + }; + }); + } else if (name === "pay_amount") { + setFormData((prevData) => { + const newPayAmount = parsedValue; + + const newAfterDiscount = Math.max(0, newPayAmount - prevData.discount); // Recalculate after_discount + + return { + ...prevData, + pay_amount: newPayAmount, + after_discount: newAfterDiscount, + }; + }); + } else { + setFormData((prevData) => ({ ...prevData, [name]: value })); + } + }; + + const handleInvoiceSelect = (invoice) => { + if (invoice) { + // Populate form data with the selected invoice details + setFormData((prevData) => ({ + ...prevData, + id: invoice.id, + invoice_no: invoice.invoice_no, + amount: invoice.amount, + remaining_amount: invoice.remaining_amount || invoice.amount, // Set to invoice's remaining amount + pay_amount: invoice.remaining_amount || invoice.amount, + discount: 0, + after_discount: invoice.remaining_amount || invoice.amount, + vendor_department: invoice.vendor_department, + vendor_department_name: invoice.vendor_department_name, + date: invoice.date || "", + })); + setInitialAmount(invoice.amount); + } else { + // Clear the form state + setFormData({ + id: "", + invoice_no: "", + amount: "", + remaining_amount: "", + pay_amount: "", + discount: 0, + after_discount: "", + vendor_department: "", + vendor_department_name: "", + date: "", + }); + setInitialAmount(""); + } + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + + // Check if the payment method is selected + if (!formData.pay_method) { + toast.error("Please select a payment method before submitting."); + return; // Prevent form submission if payment method is not selected + } + + const payAmount = parseFloat(formData.pay_amount); + const previousRemainingAmount = parseFloat(formData.remaining_amount) || 0; + + + const newRemainingAmount = previousRemainingAmount - payAmount; + + + if (newRemainingAmount < 0) { + toast.error("Payment amount exceeds the remaining amount. Please enter a valid amount."); + return; // Prevent form submission if payment exceeds remaining amount + } + + const status = newRemainingAmount <= 0 ? "paid" : "partially_paid"; // If remaining is 0 or less, mark it as 'paid' + const finalRemainingAmount = + newRemainingAmount <= 0 ? "0.00" : newRemainingAmount.toFixed(2); // If fully paid, remaining should be 0 + + let updatedFormData = { + ...formData, + remaining_amount: finalRemainingAmount, // Update the remaining amount + status: status, // Set the status based on the remaining amount + cheque_no: formData.pay_method === "cheque" ? formData.cheque_no : null, + bank: formData.pay_method === "bank" ? formData.bank : null, + }; + + // Check if the pay_method_status is 'credit_invoice' + if (updatedFormData.pay_method_status !== "credit_invoice") { + updatedFormData = { + ...updatedFormData, + pay_method_status: "credit_invoice", // Force setting pay_method_status to 'credit_invoice' + }; + } + + console.log("Submitting:", updatedFormData); + + try { + if (!updatedFormData.id) { + toast.error("No invoice selected. Please select an invoice before submitting."); + return; + } + + const response = await Patch(`invoiceData`, updatedFormData.id, updatedFormData); + + if (response && response.status === 200) { + console.log("Submission successful:", response.data); + toast.success("Invoice payment submitted successfully!"); + setReloadData(!reloadData); + makeBlank(); + // window.location.reload(); // Reload the page to reflect changes + } else { + setReloadData(!reloadData); + + console.error("Failed to submit:", response.data); + toast.error(`Error: ${response.data.message || "Failed to update invoice."}`); + } + } catch (error) { + setReloadData(!reloadData); + console.error("Error:", error); + toast.error(`An unexpected error occurred: ${error.message || "Please try again later."}`); + } +}; + + const handleCancel = () => { + navigate("/"); + }; + + useEffect(() => { + const handleClickOutside = (event) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setIsOpen(false); + } + }; + + document.addEventListener("click", handleClickOutside); + + return () => { + document.removeEventListener("click", handleClickOutside); + }; + }, []); + + const handleLinkClick = (path) => { + setIsOpen(false); // Close the dropdown after clicking a link + navigate(path); // Navigate to the clicked path + }; + const grandTotal = formData.after_discount || formData.pay_amount || 0; + // const grandTotal = formData.remaining_amount > 0 + // ? formData.remaining_amount + // : formData.after_discount || formData.pay_amount || 0; + + return ( +
+
+
+ + + + +
+
+
+
+
+
+ +
+ + +
+
+
+
+ +
+ +
+ +
+ +
+ + {/* */} +
+
+
+ Payment Method: +
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+ { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 10); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
+
+ { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 7); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> + + +
+
+
+ +
+ +
+ + +
+
+
+
+ {formData.pay_method === "cheque" && ( +
+
+
+ +
+
+ +
+
+
+ )} + + {formData.pay_method === "bank" && ( +
+
+
+ +
+
+
+ )} + + {formData.pay_method === "Bank Card (ACH/EFT)" && ( +
+
+
+ +
+
+
+ )} +
+
+
+
+
+ + + +
+
+ ); +} + +export default PayInvoice; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/PayInvoice_Table.js b/src/components/Pages/AppPAges/Dashboard/Invoice/PayInvoice_Table.js new file mode 100644 index 0000000..f6c2a1f --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/PayInvoice_Table.js @@ -0,0 +1,794 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useEffect, useState } from "react"; +import "./Invoice.css"; +import { toast, ToastContainer } from "react-toastify"; +import useApi from "../../../../../utils/api-manager/Helper/useApi"; +import Swal from "sweetalert2"; +const PayInvoiceTable = ({ onEdit, reloadData }) => { + const { Get, Delete } = useApi(); + + const [invoices, setInvoices] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const [selectedStatus, setSelectedStatus] = useState("All"); + const [sortOrder, setSortOrder] = useState({ column: "", direction: "asc" }); + const [currentPage, setCurrentPage] = useState(1); + const invoicesPerPage = 10; + const [selectedVendor, setSelectedVendor] = useState(""); + const [vendors, setVendors] = useState([]); + const [fromDate, setFromDate] = useState(""); + const [toDate, setToDate] = useState(""); + + + + const fetchInvoices = async () => { + try { + const response = await Get("invoiceData"); + + // Filter out invoices where is_deleted is true + const filteredData = response.filter((invoice) => !invoice.is_deleted); + setInvoices(filteredData); + // Extract unique vendor names from the filtered invoices + const uniqueVendors = [ + ...new Set(filteredData.map((invoice) => invoice.vendor_department_name)), + ]; + setVendors(uniqueVendors); + } catch (error) { + console.error("Error fetching invoices:", error); + toast.error("An error occurred while fetching invoices. Please try again."); + } + }; + + useEffect(() => { + fetchInvoices(); + }, [reloadData]); + + const applyFilters = () => { + let filteredInvoices = invoices; + + if (selectedStatus !== "All") { + filteredInvoices = filteredInvoices.filter( + (invoice) => invoice.status === selectedStatus + ); + } + + if (selectedVendor) { + filteredInvoices = filteredInvoices.filter( + (invoice) => invoice.vendor_department_name === selectedVendor + ); + } + + // Apply date filters + if (fromDate) { + filteredInvoices = filteredInvoices.filter( + (invoice) => new Date(invoice.date) >= new Date(fromDate) + ); + } + if (toDate) { + filteredInvoices = filteredInvoices.filter( + (invoice) => new Date(invoice.date) <= new Date(toDate) + ); + } + + // Update the state with filtered invoices + setInvoices(filteredInvoices); + }; + + const handleSort = (column) => { + const direction = + sortOrder.column === column && sortOrder.direction === "asc" + ? "desc" + : "asc"; + setSortOrder({ column, direction }); + + const sortedInvoices = [...filteredInvoices].sort((a, b) => { + if (a[column] < b[column]) return direction === "asc" ? -1 : 1; + if (a[column] > b[column]) return direction === "asc" ? 1 : -1; + return 0; + }); + + setInvoices(sortedInvoices); + }; + + const filteredInvoices = invoices.filter((invoice) => { + const vendorName = invoice.vendor_department_name || ""; + const invoiceNumber = invoice.invoice_no || ""; + const matchesSearch = + vendorName.toLowerCase().includes(searchQuery.toLowerCase()) || + invoiceNumber.toLowerCase().includes(searchQuery.toLowerCase()); + + const matchesStatus = + selectedStatus === "All" || invoice.status === selectedStatus; + + return matchesSearch && matchesStatus; // Include status filter + }); + + const totalInvoices = filteredInvoices.length; + + const totalPages = Math.ceil(totalInvoices / invoicesPerPage); + const startIndex = (currentPage - 1) * invoicesPerPage; + const currentInvoices = filteredInvoices.slice( + startIndex, + startIndex + invoicesPerPage + ); + + const handleNextPage = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrevPage = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + const handleDelete = async (id) => { + try { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + if (!result.isConfirmed) return; // Exit if the user cancels + + await Delete(`invoiceData`, id) + .then((resp) => { + const updatedInvoices = invoices.filter((invoice) => invoice.id !== id); + + setInvoices(updatedInvoices); + onEdit(null); + toast.success("Invoice successfully deleted!"); + + }) + .catch((error) => { + if (error.response) { + toast.error(`Error deleting invoice: ${error.response.data}`); + toast.error(`Status code: ${error.response.status}`); + } else if (error.request) { + toast.error("No response received from the server."); + } else { + toast.error(`Error setting up request: ${error.message}`); + } + }); + } catch (error) { + toast.error("An unexpected error occurred."); + } + }; + + + const handleRowClick = (invoice) => { + onEdit(invoice); + }; + + const handleCellClick = (invoice, cellKey) => { + // Handle cell click if needed + console.log(`Clicked cell ${cellKey} for invoice`, invoice); + onEdit(invoice); + }; + + const getSortIcon = (column) => { + if (sortOrder.column === column) { + return ( + + + + + ); + } + return null; + }; + const renderPagination = () => { + const paginationItems = []; + const totalPages = Math.ceil(totalInvoices / invoicesPerPage); + + if (totalPages <= 3) { + // If there are 3 or fewer pages, show all + for (let i = 1; i <= totalPages; i++) { + paginationItems.push( + + ); + } + } else { + // More than 3 pages + if (currentPage > 1) { + paginationItems.push( + + ); + } + + if (currentPage > 2) { + paginationItems.push(...); + } + + // Show the current page and surrounding pages + if (currentPage > 1) { + paginationItems.push( + + ); + } + + paginationItems.push( + + ); + + if (currentPage < totalPages) { + paginationItems.push( + + ); + } + + if (currentPage < totalPages - 1) { + paginationItems.push(...); + } + } + + return ( +
+ + + {paginationItems} + + +
+ ); + }; + + return ( +
+ +
+ {/* Search Bar */} +
+
+ + + + + + + setSearchQuery(e.target.value)} + /> +
+
+ + {/* Filter and Actions */} +
+
+ {["All", "unpaid", "partially_paid"].map((status) => ( + + ))} +
+ +
+ + +
    +
  • +
    + +
    +
  • +
  • +
    + +
    +
  • +
  • +
    +
    + setFromDate(e.target.value)} + /> +
    +
    + setToDate(e.target.value)} + /> +
    +
    +
  • +
  • + +
  • +
+
+
+
+ + {/* Table of Invoices */} + + + + {[ + "date", + "vendor_department_name", + "amount", + "remaining_amount", + "updated date", + "payment_method", + "status", + "actions", + ].map((header, index) => ( + + ))} + + + + + + {currentInvoices.length !== 0 ? ( + currentInvoices.map((invoice) => ( + handleRowClick(invoice)}> + + + + + + + + + + + )) + ) : ( + + + + )} + +
handleSort(header)} + style={{ + paddingLeft: index === 0 ? "30px" : "0", + cursor: "pointer", + borderTopLeftRadius: index === 0 ? "60px" : "0", + borderBottomLeftRadius: index === 0 ? "60px" : "0", + borderTopRightRadius: index === 7 ? "60px" : "0", + borderBottomRightRadius: index === 7 ? "60px" : "0", + textAlign: "start", + alignContent: "center", + }} + > + {header + .replace(/_/g, " ") + .replace(/\b\w/g, (char) => char.toUpperCase())}{" "} + {getSortIcon(header)} +
handleCellClick(invoice, "date")}> + {invoice.date} + + handleCellClick(invoice, "vendor_department_name") + } + > + {invoice.vendor_department_name} + handleCellClick(invoice, "amount")}> + {invoice.amount} + handleCellClick(invoice, "remaining_amount")} + > + {invoice.remaining_amount} + handleCellClick(invoice, "updated_at")}> + {invoice.updated_at ? invoice.updated_at.split("T")[0] : ""} + handleCellClick(invoice, "payment_method")}> + + {invoice.pay_method && + invoice.pay_method + .split("_") // Split the string into words by underscores + .map( + (word) => + word.charAt(0).toUpperCase() + + word.slice(1).toLowerCase() + ) // Capitalize the first letter of each word + .join(" ")} + + handleCellClick(invoice, "status")}> + + {invoice.status && + invoice.status + .split("_") // Split the string into words by underscores + .map( + (word) => + word.charAt(0).toUpperCase() + + word.slice(1).toLowerCase() + ) // Capitalize the first letter of each word + .join(" ")} + + + +
+ No data found +
+ + {renderPagination()} +
+ ); +}; + +const paymentMethodStyles = { + bank: { backgroundColor: "#57A09C" }, + "Business Cash": { backgroundColor: "#38400B" }, + "Credit Card": { backgroundColor: "#28a745" }, + cash: { backgroundColor: "#CAC59D" }, + cheque: { backgroundColor: "#38400B" }, + pay_later: { backgroundColor: "#E55477" }, + pay_now: { backgroundColor: "#A9B0F0" }, + credit_invoice: { backgroundColor: "#CFCC76" }, +}; + +const getPaymentMethodStyle = (method) => ({ + ...(paymentMethodStyles[method] || { backgroundColor: "#6c757d" }), + borderRadius: "30px", + padding: "5px 10px", + color: "#fff", +}); + +const statusStyles = { + All: { backgroundColor: "#4545DB" }, + // draft: { backgroundColor: "#4545DB7C" }, + unpaid: { backgroundColor: "#EF3E49" }, + partially_paid: { backgroundColor: "#4545DB7C" }, +}; + +const getStatusStyle = (status) => ({ + ...(statusStyles[status] || { backgroundColor: "#6c757d" }), + borderRadius: "30px", + padding: "5px 10px", + color: "#fff", +}); + +const getCountClass = (status) => ({ + ...statusStyles[status], + padding: "10px", +}); +export default PayInvoiceTable; diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/schema/atm_deposit.json b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/atm_deposit.json new file mode 100644 index 0000000..22f2a00 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/atm_deposit.json @@ -0,0 +1,172 @@ +{ + "api": "transactionData", + "showField": [ + { + "label": "Date", + "key": "date" + }, + { + "label": "sr no", + "key": "sr_no" + }, + { + "label": "Type", + "key": "type" + }, + + { + "label": "Note", + "key": "note" + }, + { + "label": "Status", + "key": "type" + } + ], + "createField": [ + { "row": 1, + "column": "col-3", + "label": "", + "type": "date", + "varient": "standard", + "name": "date" + }, + { + "row": 1, + "column": "col-3", + "label":"", + "placeholder": "Notes", + "type": "text", + "varient": "standard", + "name": "notes" + }, + { + "row": 2, + "column": "col-10", + "name": "deposite_type", + "label": "Type:", + "type": "radio", + "varient": "standard", + "options": [ + { + "value": "pay_later", + "label": "Business Cash" + }, + { + "value": "pay_now", + "label": "Lottery Cash" + }, + { + "value": "credit_invoice", + "label": "Gas Cash" + } + ] + }, + + { + "row": 3, + "column": "col-3", + "label": "", + "placeholder": "Select Bank", + "type": "advance-select", + "varient": "standard", + "name": "bank_name" + }, + { + "row": 4, + "column": "col-3", + "label": "", + "type": "prefix-input", + "prefixOptions": [ + { "value": "USD", "label": "USD" }, + { "value": "inr", "label": "INR" } + + ], + "prefixDefaultValue": "option1", + "inputType":"text", + "placeholder": "Amount" + } + ], + "editField": [ + { + "label": "Id", + "type": "text", + "varient": "standard", + "name": "id" + }, + { + "label": "Deposite_type", + "type": "text", + "varient": "standard", + "name": "deposite_type" + }, + { + "label": "Amount", + "type": "number", + "varient": "standard", + "name": "amount" + }, + { + "label": "Notes", + "type": "text", + "varient": "standard", + "name": "notes" + }, + { + "label": "Date", + "type": "date", + "varient": "standard", + "name": "date" + }, + { + "label": "Type", + "type": "text", + "varient": "standard", + "name": "type" + }, + { + "label": "Bank", + "type": "text", + "varient": "standard", + "name": "bank" + }, + { + "label": "Bank_name", + "type": "text", + "varient": "standard", + "name": "bank_name" + }, + { + "label": "Cash_amount", + "type": "number", + "varient": "standard", + "name": "cash_amount" + }, + { + "label": "Cheque_amount", + "type": "text", + "varient": "standard", + "name": "cheque_amount" + }, + { + "label": "Cheque_number", + "type": "text", + "varient": "standard", + "name": "cheque_number" + } + ], + "filterBtns": [ + { + "key": "", + "title": "All Invoice" + }, + { + "key": "draft", + "title": "Draft" + }, + { + "key": "unpaid", + "title": "Unpaid" + } + ] +} \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/schema/bank_deposit.json b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/bank_deposit.json new file mode 100644 index 0000000..ca671be --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/bank_deposit.json @@ -0,0 +1,172 @@ +{ + "api": "atm", + "showField": [ + { + "label": "Date", + "key": "date" + }, + { + "label": "Bank_name", + "key": "bank_name" + }, + { + "label": "Type", + "key": "type" + }, + + { + "label": "Cash_amount", + "key": "cash_amount" + }, + { + "label": "Status", + "key": "type" + } + ], + "createField": [ + { "row": 1, + "column": "col-3", + "label": "", + "type": "date", + "varient": "standard", + "name": "date" + }, + { + "row": 1, + "column": "col-3", + "label":"", + "placeholder": "Notes", + "type": "text", + "varient": "standard", + "name": "notes" + }, + { + "row": 2, + "column": "col-10", + "name": "deposite_type", + "label": "Type:", + "type": "radio", + "varient": "standard", + "options": [ + { + "value": "pay_later", + "label": "Business Cash" + }, + { + "value": "pay_now", + "label": "Lottery Cash" + }, + { + "value": "credit_invoice", + "label": "Gas Cash" + } + ] + }, + + { + "row": 3, + "column": "col-3", + "label": "", + "placeholder": "Select Bank", + "type": "advance-select", + "varient": "standard", + "name": "bank_name" + }, + { + "row": 3, + "column": "col-3", + "label": "", + "type": "prefix-input", + "prefixOptions": [ + { "value": "USD", "label": "USD" }, + { "value": "inr", "label": "INR" } + + ], + "prefixDefaultValue": "option1", + "inputType":"text", + "placeholder": "Amount" + } + ], + "editField": [ + { + "label": "Id", + "type": "text", + "varient": "standard", + "name": "id" + }, + { + "label": "Deposite_type", + "type": "text", + "varient": "standard", + "name": "deposite_type" + }, + { + "label": "Amount", + "type": "number", + "varient": "standard", + "name": "amount" + }, + { + "label": "Notes", + "type": "text", + "varient": "standard", + "name": "notes" + }, + { + "label": "Date", + "type": "date", + "varient": "standard", + "name": "date" + }, + { + "label": "Type", + "type": "text", + "varient": "standard", + "name": "type" + }, + { + "label": "Bank", + "type": "text", + "varient": "standard", + "name": "bank" + }, + { + "label": "Bank_name", + "type": "text", + "varient": "standard", + "name": "bank_name" + }, + { + "label": "Cash_amount", + "type": "number", + "varient": "standard", + "name": "cash_amount" + }, + { + "label": "Cheque_amount", + "type": "text", + "varient": "standard", + "name": "cheque_amount" + }, + { + "label": "Cheque_number", + "type": "text", + "varient": "standard", + "name": "cheque_number" + } + ], + "filterBtns": [ + { + "key": "", + "title": "All Invoice" + }, + { + "key": "draft", + "title": "Draft" + }, + { + "key": "unpaid", + "title": "Unpaid" + } + ] +} \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/schema/invoice copy.json b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/invoice copy.json new file mode 100644 index 0000000..5042ba0 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/invoice copy.json @@ -0,0 +1,211 @@ +{ + "api": "invoice", + "showField": [ + { + "label": "Date", + "key": "date" + }, + { + "label": "Invoice Number", + "key": "invoice_no" + }, + { + "label": "Vendor Name", + "key": "vendor_customer_name" + }, + { + "label": "Payment Method", + "key": "payment_method", + "search":{ + "api":"transaction", + "label":"pay_method_title", + "key":"pay_method" + } + }, + { + "label": "Bank", + "key": "bank" + }, + { + "label": "Status", + "key": "status" + } + ], + "createField": [ + { + "label": "Date", + "type": "date", + "varient": "standard", + "name": "date" + }, + { + "label": "Vendor Name", + "type": "advance-select", + "varient": "standard", + "name": "vendor_customer_name", + "search": { + "api": "vendorCustomer", + "label": "vendor_name", + "key": "name" + } + }, + { + "label": "Invoice_no", + "type": "text", + "varient": "standard", + "name": "invoice_no" + }, + { + "label": "Status", + "type": "text", + "varient": "standard", + "name": "status" + }, + { + "label": "Prepaid_tax", + "type": "text", + "varient": "standard", + "name": "prepaid_tax" + }, + { + "label": "Bank", + "type": "text", + "varient": "standard", + "name": "bank" + }, + { + "label": "Bank_name", + "type": "text", + "varient": "standard", + "name": "bank_name" + }, + { + "label": "Cheque_number", + "type": "text", + "varient": "standard", + "name": "cheque_number" + }, + { + "label": "Due_days", + "type": "number", + "varient": "standard", + "name": "due_days" + }, + { + "label": "Store", + "type": "text", + "varient": "standard", + "name": "store" + }, + { + "label": "Sotre_name", + "type": "text", + "varient": "standard", + "name": "sotre_name" + }, + { + "label": "Lotto", + "type": "text", + "varient": "standard", + "name": "lotto" + }, + { + "label": "Lotto_title", + "type": "text", + "varient": "standard", + "name": "lotto_title" + } + ], + "editField": [ + { + "label": "Id", + "type": "text", + "varient": "standard", + "name": "id" + }, + { + "label": "Vendor_customer", + "type": "text", + "varient": "standard", + "name": "vendor_customer" + }, + { + "label": "Vendor_customer_name", + "type": "advance-select", + "varient": "standard", + "name": "vendor_customer_name" + }, + { + "label": "Invoice_no", + "type": "text", + "varient": "standard", + "name": "invoice_no" + }, + { + "label": "Date", + "type": "datetime-local", + "varient": "standard", + "name": "date" + }, + { + "label": "Status", + "type": "text", + "varient": "standard", + "name": "status" + }, + { + "label": "Prepaid_tax", + "type": "text", + "varient": "standard", + "name": "prepaid_tax" + }, + { + "label": "Bank", + "type": "text", + "varient": "standard", + "name": "bank" + }, + { + "label": "Bank_name", + "type": "text", + "varient": "standard", + "name": "bank_name" + }, + { + "label": "Cheque_number", + "type": "text", + "varient": "standard", + "name": "cheque_number" + }, + { + "label": "Due_days", + "type": "number", + "varient": "standard", + "name": "due_days" + }, + { + "label": "Store", + "type": "text", + "varient": "standard", + "name": "store" + }, + { + "label": "Sotre_name", + "type": "text", + "varient": "standard", + "name": "sotre_name" + }, + { + "label": "Lotto", + "type": "text", + "varient": "standard", + "name": "lotto" + }, + { + "label": "Lotto_title", + "type": "text", + "varient": "standard", + "name": "lotto_title" + } + ] +} \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/schema/invoice.json b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/invoice.json new file mode 100644 index 0000000..dbcd3ef --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/invoice.json @@ -0,0 +1,237 @@ + { + "api": "invoice", + "showField": [ + { + "label": "Sr", + "key": "sr_no" + }, + { + "label": "Date", + "key": "date" + }, + { + "label": "Invoice_no", + "key": "invoice_no" + }, + { + "label": " Some Random Data", + "key": "vendor_name" + }, + { + "label": "Payment Method", + "key": "payment_method", + "search":{ + "api":"transaction", + "label":"pay_method_title", + "key":"pay_method" + } + }, + { + "label": "Amount", + "key": "amount" + }, + { + "label": "Status", + "key": "status" + }, + { + "label": "Action", + "key": "action" + } + ], + "createField": [ + { + "row": 1, + "column": "col-3", + "label": "", + "type": "date", + "varient": "standard", + "name": "date", + "placeholder": "Bill Date" + }, + { + "row": 1, + "column": "col-3", + "label": "", + "type": "advance-select", + "varient": "standard", + "name": "vendor", + "placeholder": "Select Vendor", + "search":{ + "api":"newInvoice", + "label":"vendor_name", + "key":"vendor" + } + + + }, + { + "row": 1, + "column": "col-3", + "label": "", + "type": "text", + "varient": "standard", + "name": "invoice_no", + "placeholder": "Invoice Number" + }, + { + "row": 3, + "column": "col-10", + "name": "pay_method", + "label": "Payment Method", + "type": "radio", + "varient": "standard", + "options": [ + { + "value": "pay_later", + "label": "Pay Later" + }, + { + "value": "pay_now", + "label": "Pay Now" + }, + { + "value": "credit_invoice", + "label": "Credit Invoice" + } + ] + }, + { + "row": 3, + "column": "col-3", + "label": "", + "type": "advance-select", + "varient": "standard", + "name": "due_days", + "placeholder": "Select due days" + }, + { + "row": 3, + "column": "col-3", + "label": "", + "type": "text", + "varient": "standard", + "name": "notes", + "placeholder": "Enter notes" + }, + { + "row": 4, + "column": "col-12", + "label": "Do you want to add Prepaid Tax?", + "type": "checkbox", + "varient": "standard", + "name": "prepaid_tax" + }, + { + "row": 5, + "column": "col-6", + "label": "", + "name": "cash_amount", + "type": "prefix-input", + "prefixOptions": [ + { "value": "usd", "label": "USD" } + + ], + "placeholder": "Amount" + } + ], + "editField": [ + { + "row": 1, + "column": "col-3", + "label": "", + "type": "date", + "varient": "standard", + "name": "date", + "placeholder": "Select date" + }, + { + "row": 1, + "column": "col-3", + "label": "", + "type": "text", + "varient": "standard", + "name": "vendor_name", + "placeholder": "Select Vendor" + }, + { + "row": 1, + "column": "col-3", + "label": "", + "type": "text", + "varient": "standard", + "name": "invoice_no", + "placeholder": "Invoice Number" + }, + { + "row" : 2, + "column": "col-3", + "name": "pay_method", + "label": "Pay Method", + "type": "radio", + "options": [ + { + "value": "pay_later", + "label": "Pay Later" + }, + { + "value": "pay_now", + "label": "Pay Now" + }, + { + "value": "credit_invoice", + "label": "Credit Invoice" + } + ] + }, + { + "row": 3, + "column": "col-3", + "label": "", + "type": "number", + "varient": "standard", + "name": "due_days", + "placeholder": "Enter due days" + }, + { + "row": 3, + "column": "col-3", + "label": "", + "type": "text", + "varient": "standard", + "name": "notes", + "placeholder": "Enter notes" + }, + { + "row": 4, + "column": "col-12", + "label": "Do you want to add Prepaid Tax?", + "type": "checkbox", + "varient": "standard", + "name": "prepaid_tax" + }, + { + "row": 5, + "column": "col-3", + "label": "", + "type": "number", + "varient": "standard", + "name": "cash_amount", + "placeholder": "Enter cash amount" + } + ], + "filterBtns": [ + { + "key": "", + "title": "All Invoice" + }, + { + "key": "unpaid", + "title": "Unpaid" + }, + { + "key": "draft", + "title": "Draft" + } + ] + } \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Dashboard/Invoice/schema/pay_bill.json b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/pay_bill.json new file mode 100644 index 0000000..eff8427 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/Invoice/schema/pay_bill.json @@ -0,0 +1,142 @@ +{ + "api": "newInvoice", + "showField": [ + { + "label": "Date", + "key": "date" + }, + { + "label": "Invoice_no", + "key": "invoice_no" + }, + { + "label": "Vendor_name", + "key": "vendor_name" + }, + { + "label": "Pay_method", + "key": "pay_method", + + "options": [ + { + "value": "pay_later", + "label": "Check" + }, + { + "value": "pay_now", + "label": "Cash" + }, + { + "value": "credit_invoice", + "label": "Bank Card/ACH/EFT" + } + ] + }, + { + "label": "Amount", + "key": "amount" + }, + { + "label": "Status", + "key": "status" + } + ], + "createField": [ + { + "row": 1, + "column": "col-2", + "label": "", + "type": "date", + "varient": "standard", + "name": "date", + "placeholder": "Select date" + }, + { + "row": 1, + "column": "col-5", + "label": "", + "type": "advance-select", + "varient": "standard", + "name": "vendor_name", + "placeholder": "Select Vendor" + }, + { + "row": 1, + "column": "col-4", + "label": "", + "type": "advance-select", + "varient": "standard", + "name": "invoice_no", + "placeholder": "Select Invoice" + }, + { + "row": 2, + "column": "col-10", + "name": "pay_method", + "label": "Payment Method", + "type": "radio", + "varient": "standard", + "options": [ + { + "value": "pay_later", + "label": "Check" + }, + { + "value": "pay_now", + "label": "Cash" + }, + { + "value": "credit_invoice", + "label": "Bank Card/ACH/EFT" + } + ] + }, + { + "row": 3, + "column": "col-3", + "label": "", + "type": "advance-select", + "varient": "standard", + "name": "select_bank", + "placeholder": "Select bank" + }, + { + "row": 3, + "column": "col-3", + "label": "", + "type": "text", + "varient": "standard", + "name": "notes", + "placeholder": "Check Number" + }, + + { + "row": 5, + "column": "col-3", + "label": "", + "type": "prefix-input", + "prefixOptions": [ + { "value": "USD", "label": "USD" }, + { "value": "inr", "label": "INR" } + + ], + "prefixDefaultValue": "option1", + "inputType":"text", + "placeholder": "Amount" + } + ], + "filterBtns": [ + { + "key": "", + "title": "All Invoice" + }, + { + "key": "draft", + "title": "Draft" + }, + { + "key": "unpaid", + "title": "Unpaid" + } + ] +} \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Dashboard/MainDashboard.js b/src/components/Pages/AppPAges/Dashboard/MainDashboard.js new file mode 100644 index 0000000..978cc74 --- /dev/null +++ b/src/components/Pages/AppPAges/Dashboard/MainDashboard.js @@ -0,0 +1,49 @@ +import React from "react"; +import CurrentStore from "./CurrentStore/CurrentStore"; +import Dashboard from "../../AppPAges/Dashboard/Dashboard"; +import ExpenseBreakdown from "./CurrentStore/ExpenseBreakdown"; +import InvoiceTable from "./Invoice/InvoiceTable"; + +function MainDashboard() { + return ( +
+ +
+ +
+ +
+ +
+ + +
+
+ + +
+ +
+
+ ); +} + +export default MainDashboard; diff --git a/src/components/Pages/AppPAges/Dashboard/Table.js b/src/components/Pages/AppPAges/Dashboard/Table.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Pages/AppPAges/Expense/expense copy.js b/src/components/Pages/AppPAges/Expense/expense copy.js new file mode 100644 index 0000000..df22bef --- /dev/null +++ b/src/components/Pages/AppPAges/Expense/expense copy.js @@ -0,0 +1,723 @@ +import React, { useState, useRef } from 'react'; +import schema from "../Dashboard/Invoice/schema/invoice.json"; + +const statusStyles = { + Draft: { backgroundColor: '#D1D1EF', color: '#fff' }, // Yellow + UnPaid: { backgroundColor: '#EF3E49', color: '#fff' }, // Red + Paid: { backgroundColor: '#5856AC', color: '#fff' } // Green +}; +export default function Expense() { + + const [billDate, setBillDate] = useState('2024-09-20'); // Example default date + const [showPaymentOptions, setShowPaymentOptions] = useState(false); + const [showAdditionalFields, setShowAdditionalFields] = useState(false); + const [showCheckFields, setShowCheckFields] = useState(false); + const [showBankFields, setShowBankFields] = useState(false); + + + const dateInputRef = useRef(null); + + const handleDateChange = (event) => { + const selectedDate = event.target.value; // Get the selected date + setBillDate(selectedDate); // Update the state + console.log("Selected date:", selectedDate); // Log to console for verification + }; + + + const handlePaymentMethodChange = (e) => { + const value = e.target.value; + setShowPaymentOptions(value === 'payNow'); + setShowAdditionalFields(value === 'creditInvoice' || value === 'payLater'); + setShowCheckFields(false); + setShowBankFields(false); + + }; + + const handleSpecificPaymentMethodChange = (e) => { + const value = e.target.value; + setShowCheckFields(value === 'check'); + setShowBankFields(value === 'bankCard'); // Show bank fields only when "Bank" is selected + + + }; + + + const openDatePicker = () => { + if (dateInputRef.current) { + dateInputRef.current.showPicker(); // Open date picker (if supported) + } + }; + + + const [currentPage, setCurrentPage] = useState(1); + + const [showModal, setShowModal] = useState(false); + + const toggleModal = () => setShowModal(!showModal); + + const itemsPerPage = 5; // Change this to how many items you want per page + const exampleData = [ + { + sr_no: "1", + date: "2024-09-01", + invoice_no: "INV-001", + vendor_name: "Vendor A", + pay_method: "pay_later", + amount: "$1000", + status: "Paid", + action: ` + + + ` + }, + { + sr_no: "2", + + date: "2024-09-02", + invoice_no: "INV-002", + vendor_name: "Vendor B", + pay_method: "pay_now", + amount: "$500", + status: "UnPaid", + action: ` + + + ` + }, + { + sr_no: "3", + + date: "2024-09-02", + invoice_no: "INV-002", + vendor_name: "Vendor B", + pay_method: "pay_now", + amount: "$500", + status: "Draft", + action: ` + + + ` + }, { + sr_no: "4", + + date: "2024-09-02", + invoice_no: "INV-002", + vendor_name: "Vendor B", + pay_method: "pay_now", + amount: "$500", + status: "UnPaid", + action: ` + + + ` + }, { + sr_no: "5", + + date: "2024-09-02", + invoice_no: "INV-002", + vendor_name: "Vendor B", + pay_method: "pay_now", + amount: "$500", + status: "UnPaid", + action: ` + + + ` + }, { + sr_no: "6", + + date: "2024-09-02", + invoice_no: "INV-002", + vendor_name: "Vendor B", + pay_method: "pay_now", + amount: "$500", + status: "UnPaid", + action: ` + + + ` + }, + { + sr_no: "7", + date: "2024-09-03", + invoice_no: "INV-003", + vendor_name: "Vendor C", + pay_method: "credit_invoice", + amount: "$700", + status: "Draft", + action: ` + + + ` + } + ]; + + // Calculate the index of the last item on the current page + const indexOfLastItem = currentPage * itemsPerPage; + const indexOfFirstItem = indexOfLastItem - itemsPerPage; + const currentItems = exampleData.slice(indexOfFirstItem, indexOfLastItem); + + const totalPages = Math.ceil(exampleData.length / itemsPerPage); + + // Handler for changing pages + const handlePageChange = (pageNumber) => { + setCurrentPage(pageNumber); + }; + + + + return ( +
+
+
+
+

Expense

+ +
+ +
+
+
+ + + + + +
+ + +
+
+

Show

+
+ +
+
+
+
+ + + + {schema.showField.map((field, index) => ( + + ))} + + + + {currentItems.map((item, index) => ( + + {schema.showField.map((field, fieldIndex) => ( + + ))} + + ))} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{field.label}
+ {field.key === "status" ? ( +
+ {item[field.key]} +
+ ) : ( +
+ )} +
+
Total Amount Paid
+
+
$4200
+
+
Total Received Credit
+
+
$0
+
+
Total UnPaid
+
+
$0
+
+
Total Outstanding Credit
+
+
$0
+
+
Total Due
+
+
$0
+
+
Total Credit
+
+
$0
+
+
Total Purchase
+
+
$4200
+
+
+ + + {totalPages <= 5 ? ( + Array.from({ length: totalPages }, (_, index) => ( + + )) + ) : ( + <> + {currentPage > 2 && ( + <> + + {currentPage > 3 && ...} + + )} + {Array.from({ length: 3 }, (_, index) => { + const pageNumber = currentPage - 1 + index; + if (pageNumber <= totalPages && pageNumber > 0) { + return ( + + ); + } + return null; + })} + {currentPage < totalPages - 2 && ...} + {currentPage < totalPages - 1 && ( + + )} + + )} + + +
+
+ {(showModal && ( +
+
e.stopPropagation()} style={{ width: '700px' }}> +
+
Add Expense
+ +
+
+
+
+ +
+ {/* Icon or text can go here */} +
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+

Payment Method :

+ + + +
+ + {showPaymentOptions && ( +
+ + + +
+ )} + {showAdditionalFields && ( +
+ + +
+ )} + + + {showCheckFields && ( +
+ + + +
+ )} + + + {showBankFields && ( +
+ + +
+ )} + +
+ +
+ +
+
+
+ USD +
+ +
+
+
+
+
+ + +
+
+
+ ) + )} +
+
+
+ ); +} diff --git a/src/components/Pages/AppPAges/Expense/expense.js b/src/components/Pages/AppPAges/Expense/expense.js new file mode 100644 index 0000000..dd3e4b3 --- /dev/null +++ b/src/components/Pages/AppPAges/Expense/expense.js @@ -0,0 +1,1141 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import DataTable from "../ManageSettings/DataTables"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import { toast, ToastContainer } from "react-toastify"; +import { useNavigate } from "react-router-dom"; +import AddExpenseTypeModal from "../ReusableForm/AddExpenseModal"; +import AddVendorModal from "../ReusableForm/AddVendorModal"; +import Swal from "sweetalert2"; + +export default function Expense() { + const { user } = useContext(AuthContext); + const storeId = user.store; + + const [showPaymentOptions, setShowPaymentOptions] = useState(false); + const [showAdditionalFields, setShowAdditionalFields] = useState(false); + const [showCheckFields, setShowCheckFields] = useState(false); + const [showBankFields, setShowBankFields] = useState(false); + const [showModal, setShowModal] = useState(false); + const [showModalVendor, setShowModalVendor] = useState(false); + const [showModalExpense, setShowModalExpense] = useState(false); + const [vendors, setVendors] = useState([]); + const [serviceData, setServiceData] = useState([]); + const [dueDays, setDueDays] = useState([]); + const [bank, setBank] = useState([]); + const today = new Date().toISOString().split("T")[0]; + + const [invoicesExpense, setInvoicesExpense] = useState([]); + const [totalPaid, setTotalPaid] = useState(0.0); + const [totalReceivedCredit, setTotalReceivedCredit] = useState(0.0); + const [totalUnpaid, setTotalUnpaid] = useState(0.0); + const [totalOutstandingCredit, setTotalOutstandingCredit] = useState(0.0); + const [totalDue, setTotalDue] = useState(0.0); + const [totalCredit, setTotalCredit] = useState(0.0); + const [totalExpense, setTotalExpense] = useState(0.0); + + const [formData, setFormData] = useState({ + store: storeId, + type: "expense", + invoice_no: "", + date: today, + status: "", + pay_method_status: "", + pay_method: "", + amount: "", + pay_amount: "", + discount: null, + remaining_amount: null, + after_discount: null, + prepaid_tax: false, + prepaid_tax_percentage: "", + vendor_department: "", + vendor_department_name: "", + cheque_no: "", + note: "", + due_date: null, + bank: "", + } + + ); + + const [invoices, setInvoices] = useState([]); + const [editingInvoiceId, setEditingInvoiceId] = useState(null); + const { Get, Post, Delete, Patch, Put } = useApi(); + const [filteredExpenseTypes, setFilteredExpenseTypes] = useState([]); + + + function calculateDaysDifference(startDate, endDate) { + const start = new Date(startDate); + const end = new Date(endDate); + const timeDiff = end - start; // Difference in milliseconds + const daysDiff = Math.floor(timeDiff / (1000 * 3600 * 24)); // Convert to days + return daysDiff; + } + useEffect(() => { + if (formData.date && formData.due_date) { + // Calculate the number of days between date and due_date + const startDate = new Date(formData.date); + const dueDate = new Date(formData.due_date); + + const timeDiff = dueDate - startDate; // Difference in milliseconds + const daysDiff = Math.floor(timeDiff / (1000 * 3600 * 24)); // Convert to days + + // Update the formData with the calculated days + setFormData((prevData) => ({ + ...prevData, + days: daysDiff, // Set the 'days' field to the calculated number of days + })); + } + }, [formData.date, formData.due_date]); + // Handle checkbox change + const handleCheckboxChange = (e) => { + const { checked } = e.target; + setFormData((prevData) => ({ + ...prevData, + prepaid_tax: checked, + })); + }; + const [reloadData, setReloadData] = useState(false); + useEffect(() => { + const getInvoiceData = async () => { + try { + const response = await Get("invoiceData"); + const activeInvoices = response.filter((invoice) => !invoice.is_deleted); + setInvoices(activeInvoices); + } catch (error) { + console.error("Error fetching invoices:", error); + } + }; + + getInvoiceData(); + }, [reloadData]); + + + const [reloadTotal, setReloadTotal] = useState(false); + const getExpenseCalculation = async () => { + Get("expenseCalculation") + .then((response) => { + setInvoicesExpense(response); + setTotalPaid(response.total_paid); + setTotalReceivedCredit(response.total_received_credit); + setTotalUnpaid(response.total_unpaid); + setTotalOutstandingCredit(response.total_outstanding_credit); + setTotalDue(response.total_due); + setTotalCredit(response.total_credit); + setTotalExpense(response.total_purchase || 0); // Default to 0 if not in response + // setTotalPurchase(response.total_purchase); + }) + .catch((error) => { + console.error("Error fetching invoices:", error); + }); + }; + useEffect(() => { + getExpenseCalculation(); + }, [reloadTotal]); + + const fetchData = async () => { + try { + const [vendorsResponse, serviceResponse, dueDaysResponse, bankResponse] = + await Promise.all([ + Get("vendorDepartmentData"), + Get("vendorDepartmentServiceData"), + Get("dueDaysData"), + Get("bank"), + ]); + setVendors(vendorsResponse); + setServiceData(serviceResponse); + setDueDays(dueDaysResponse); + setBank(bankResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + + useEffect(() => { + fetchData(); + }, []); + + const handleNewExpenseType = (newExpenseType) => { + // Add the new expense type to the serviceData array dynamically + setServiceData((prevData) => [ + ...prevData, + { + id: newExpenseType.id, // Assuming the response contains the `id` + title: newExpenseType.title, + type: "expense type", + }, + ]); + + // Reset the formData (dropdown) so the modal can open again + setFormData((prevData) => ({ + ...prevData, + vendor_department_service_titles: "", // Reset the value to allow re-opening the modal next time + })); + + setShowModalExpense(true); // Keep modal open + }; + const handlePaymentMethodChange = (e) => { + const value = e.target.value; + setFormData((prevData) => ({ + ...prevData, + pay_method_status: value, + pay_method: + value === "pay_later" + ? "pay_later" + : value === "credit_invoice" + ? "credit_invoice" + : "", + status: value === "pay_now" ? "paid" : "unpaid", + })); + setShowPaymentOptions(value === "pay_now"); + setShowAdditionalFields( + value === "credit_invoice" || value === "pay_later" + ); + setShowCheckFields(false); + setShowBankFields(false); + }; + + const handleSpecificPaymentMethodChange = (e) => { + const value = e.target.value; + setShowCheckFields(value === "cheque"); + setShowBankFields(value === "bank"); + + setFormData((prevData) => ({ + ...prevData, + pay_method: value, + })); + }; + + const toggleModal = () => { + setShowModal(!showModal); + if (showModal) { + setFormData({ + type: "expense", + invoice_no: "", + date: today, + status: "", + pay_method_status: "", + pay_method: "", + amount: "", + pay_amount: null, + discount: null, + remaining_amount: null, + after_discount: null, + prepaid_tax: false, + prepaid_tax_percentage: "", + vendor_department: "", + vendor_department_name: "", + cheque_no: "", + note: "", + due_date: "", + bank: "", + }); + setEditingInvoiceId(null); + } + }; + + const handleChange = (e) => { + const { name, value, type, checked } = e.target; + const updatedData = { + ...formData, + [name]: type === "checkbox" ? checked : value, + }; + + if (name === "vendor_department") { + const selectedVendor = vendors.find((vendor) => vendor.id === value); + updatedData.vendor_department_name = selectedVendor?.name || ""; + + const vendorExpenseTypes = serviceData.filter( + (service) => + selectedVendor?.vendor_department_service_title?.includes(service.title) && + service.type === "expense type" + ); + + setFilteredExpenseTypes(vendorExpenseTypes); + updatedData.vendor_department_service_titles = vendorExpenseTypes.length > 0 ? vendorExpenseTypes[0].title : ""; + } + + if (name === "days") { + const selectedDueDays = parseInt(value, 10); + if (!isNaN(selectedDueDays)) { + const today = new Date(); + const dueDate = new Date(today); + dueDate.setDate(dueDate.getDate() + selectedDueDays); + updatedData.due_date = dueDate.toISOString().split("T")[0]; + } + } + + if (value === "add-expense") { + setShowModalExpense(true); + } + + setFormData(updatedData); + }; + + + const handleEdit = (invoice) => { + // Check if the invoice is 'partially_paid' + if (invoice.status === "partially_paid") { + // Show an error message and return without opening the modal + toast.error("Cannot edit partially paid invoice."); + return; // Prevent editing + } + + const vendorId = invoice.vendor_department; + const vendorDepartmentServiceTitles = invoice.vendor_department_service_titles || []; + const selectedVendor = vendors.find((vendor) => vendor.id === vendorId); + + // Update form data with the invoice information + const updatedFormData = { + ...invoice, + type: "expense", + vendor_department_name: selectedVendor?.name || "", + vendor_department_service_titles: vendorDepartmentServiceTitles, + due_date: invoice.due_date || "", + amount: invoice.amount || "", + }; + + // Filter expense types based on the selected vendor's department + const vendorExpenseTypes = serviceData.filter( + (service) => + selectedVendor?.vendor_department_service_title?.includes(service.title) && + service.type === "expense type" + ); + + // Set filtered expense types + setFilteredExpenseTypes(vendorExpenseTypes); + console.log(updatedFormData) + // Set the updated form data and open the modal + setFormData(updatedFormData); + setEditingInvoiceId(invoice.id); + setShowModal(true); // Open the modal + }; + + + const handleShow = () => setShowModalExpense(true); + const handleCloseModal = () => { + setShowModalExpense(false); + }; + const handleShowVendor = () => setShowModalVendor(true); + const handleCloseVendor = () => { + setShowModalVendor(false); + }; + const handleVendorAdded = (newVendor) => { + setVendors((prevVendors) => [...prevVendors, newVendor]); + setFormData({ ...formData, vendor_department: newVendor.id }); + }; + const handleSubmit = async (e) => { + e.preventDefault(); + + // Check for duplicate invoice number when creating a new invoice + if (!editingInvoiceId) { + const isDuplicateInvoiceNo = invoices.some( + (invoice) => invoice.invoice_no === formData.invoice_no + ); + if (isDuplicateInvoiceNo) { + toast.error("Invoice number must be unique."); + return; + } + } + + // Validate required fields + if (!formData.vendor_department) { + toast.error("Please Select a Vendor."); + return; + } + if (!formData.invoice_no) { + toast.error("Invoice number is required."); + return; + } + if (!formData.vendor_department_service_titles) { + toast.error("Please select an expense type"); + return; + } + if (formData.pay_method_status === "pay_later") { + if (!formData.pay_method) { + toast.error("Please select a payment method."); + return; + } + + if (!formData.due_date) { + toast.error("Please select a Due Date"); + return; + } + if (!formData.amount) { + toast.error("Please fill in the Amount"); + return; + } + } + + if (formData.pay_method_status === "pay_now") { + if (!formData.pay_method) { + toast.error("Please select a payment method."); + return; + } + + if (formData.pay_method === "cash") { + if (!formData.amount) { + toast.error("Please fill in the Amount"); + return; + } + } + + + if (formData.pay_method_status === "pay_now") { + if (!formData.pay_method) { + toast.error("Please select a payment method."); + return; + } + + if (formData.pay_method === "bank") { + if (!formData.bank) { + toast.error("Please select a Bank."); + return; + } + if (!formData.amount) { + toast.error("Please fill in the Amount"); + return; + } + } + } + + if (formData.pay_method_status === "pay_now") { + if (!formData.pay_method) { + toast.error("Please select a payment method."); + return; + } + + if (formData.pay_method === "cheque") { + if (!formData.bank) { + toast.error("Please select a Bank."); + return; + } + + if (!formData.cheque_no) { + toast.error("Please fill in the Cheque No"); + return; + } + if (!formData.amount) { + toast.error("Please fill in the Amount"); + return; + } + } + } + } + // Set the amounts and status based on payment method + + formData.due_date = null; + + let adjustedAmount = formData.amount; + + // If it's a credit invoice, adjust amounts to be negative + + + const updatedFormData = { + ...formData, + amount: formData.amount, + }; + + // Special handling for 'pay_now' + if (formData.pay_method_status === "pay_now") { + updatedFormData.status = "paid"; // Explicitly set to "paid" for "pay_now" + updatedFormData.due_date = null; // No due date for "pay_now" + } + + try { + let response; + if (editingInvoiceId) { + // Editing an existing invoice + const originalInvoice = invoices.find((invoice) => invoice.id === editingInvoiceId); + if (!originalInvoice) { + console.error("Invoice not found for editingInvoiceId:", editingInvoiceId); + return; + } + + // Determine the new status based on payment method and remaining amount + const newRemainingAmount = Math.max(0, originalInvoice.amount - (formData.pay_amount || 0)); + let newStatus = originalInvoice.status; // Start with the original status + + if (formData.pay_method_status === "pay_now") { + newStatus = "paid"; // Always "paid" if paid now + } else if (formData.pay_method_status === "pay_later") { + newStatus = "unpaid"; // Ensure unpaid if paying later + } else if (newRemainingAmount < originalInvoice.amount) { + newStatus = "partially_paid"; // Adjust if partially paid + } + + + // Ensure pay_amount is included when editing + updatedFormData.pay_amount = formData.pay_amount !== undefined + ? formData.pay_amount + : formData.remaining_amount; // Use remaining_amount if pay_amount is undefined + + // Update status for pay_now + if (formData.pay_method_status === "pay_now") { + updatedFormData.status = "paid"; // Ensure "paid" status for "pay_now" + } + if (formData.pay_method_status === "pay_later") { + updatedFormData.status = "unpaid"; // Ensure "paid" status for "pay_now" + } + const updatedInvoice = { + ...updatedFormData, + invoice_id: editingInvoiceId, + status: newStatus, + }; + + + // Call PUT request to update the invoice + response = await Post("editInvoice", updatedInvoice); + + if (response.status === 200) { + setInvoices((prevInvoices) => + prevInvoices.map((invoice) => + invoice.id === editingInvoiceId ? { ...invoice, ...updatedInvoice } : invoice + ) + ); + console.log(updatedInvoice) + toast.success("Invoice updated successfully!"); + setReloadData(!reloadData); + setReloadTotal(!reloadTotal); + toggleModal(); // Close the modal after saving + + } + } else { + // Creating a new invoice + const duplicateInvoice = invoices.some( + (invoice) => invoice.invoice_no === formData.invoice_no + ); + if (duplicateInvoice) { + toast.error("Invoice number must be unique."); + return; + } + + // Post the data for a new invoice + Post("createInvoiceAndPrepaidTax", formData) + .then((response) => { + toast.success("Invoice submitted successfully!"); + + setReloadData(!reloadData); + setReloadTotal(!reloadTotal); + toggleModal(); + }) + }; + // Close the modal after submitting + } catch (error) { + console.error("Error submitting invoice:", error); + toast.error( + "Error submitting invoice: " + + (error.response ? error.response.data : error.message) + ); + } + }; + + + + // const handleDelete = async (id) => { + // const result = await Swal.fire({ + // title: "Are you sure?", + // text: "You won't be able to revert this!", + // icon: "warning", + // showCancelButton: true, + // confirmButtonColor: "#d33", + // cancelButtonColor: "#3085d6", + // confirmButtonText: "Yes, delete it!", + // }); + + // // Check if the user clicked the confirm button + // if (!result.isConfirmed) return; // Exit if the user cancels + // try { + // const response = await Post(`deleteInvoice`, { invoice_id: id }); + // toast.success("Invoice deleted successfully!"); + // setInvoices((prevInvoices) => + // prevInvoices.filter((invoice) => invoice.id !== id) + // ); + // await getExpenseCalculation(); + // } catch (error) { + // console.error("Error deleting invoice:", error); + // toast.error( + // "Error deleting invoice: " + + // (error.response ? error.response.data : error.message) + // ); + // } + // }; + + + + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + if (!result.isConfirmed) return; + + try { + + const payload = { + invoice_id: id, + is_deleted: true, + }; + + const response = await Post(`deleteInvoice`, payload); + toast.success("Invoice deleted successfully!"); + setInvoices((prevInvoices) => + prevInvoices.filter((invoice) => invoice.id !== id) + ); + await getExpenseCalculation(); + } catch (error) { + console.error("Error deleting invoice:", error); + toast.error( + "Error deleting invoice: " + + (error.response ? error.response.data : error.message) + ); + } + }; + + + + + const expenseInvoice = invoices.filter( + (invoice) => invoice.type === "expense" && !invoice.is_deleted + ); + /*=========================================*/ + + const columns = [ + { header: "Date", field: "date" }, + { header: "Invoice Number", field: "invoice_no" }, + { header: "Vendor Name", field: "vendor_department_name" }, + { header: "Expense Type", field: "vendor_department_service_titles" }, + { header: "Note", field: "note" }, + { header: "Due Date", field: "due_date" }, + { header: "Amount", field: "amount" }, + { header: "Remaining Amount", field: "remaining_amount" }, + { header: "Payment Method", field: "pay_method" }, + { header: "Status", field: "status" }, + ]; + + return ( +
+
+
+
+

Expense

+ +
+ +
+ + +
+ + {showModal && ( +
+
e.stopPropagation()} + style={{ + width: "700px", + backgroundColor: "white", + margin: "100px auto", + padding: "20px", + borderRadius: "8px", + position: "relative", + boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", + }} + > +
+
+ {editingInvoiceId ? "Edit Expense" : "Add New Expense"} +
+ + + + +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+

Payment Method :

+ + + +
+ + {showPaymentOptions && ( +
+ + + +
+ )} + + {(formData.pay_method_status === "pay_later" || + formData.pay_method_status === "credit_invoice") && ( +
+ + + +
+ )} + + {showCheckFields && ( +
+
+ +
+
+ +
+
+ +
+
+ )} + + {showBankFields && ( +
+
+ +
+
+ +
+
+ )} + +
+ +
+ + {formData.prepaid_tax && ( +
+
+
+ + USD + +
+ { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
+
+ )} + +
+
+
+ + USD + +
+ { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + onChange={handleChange} + /> +
+
+
+ +
+
+ + +
+
+
+ )} +
+
+ + +
+ ); +} diff --git a/src/components/Pages/AppPAges/Gas/Gas.css b/src/components/Pages/AppPAges/Gas/Gas.css new file mode 100644 index 0000000..e9e04b0 --- /dev/null +++ b/src/components/Pages/AppPAges/Gas/Gas.css @@ -0,0 +1,11 @@ +.gas-invoice-add-button { + padding: 8px 16px; + background-color: #4545db; /* Bootstrap primary color */ + color: white; + border: none; + border-radius: 40px; + cursor: pointer; + width: 175px; + height: 42px; + font-size: 18px; + } \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Gas/GasInvoice.js b/src/components/Pages/AppPAges/Gas/GasInvoice.js new file mode 100644 index 0000000..d0942a8 --- /dev/null +++ b/src/components/Pages/AppPAges/Gas/GasInvoice.js @@ -0,0 +1,870 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable array-callback-return */ +import React, { useState, useEffect, useContext } from "react"; +import ReusableModal from "../ManageSettings/ReusableModal"; +import "./Gas.css"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import SettingTable from "../ManageSettings/SettingTable"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import { toast ,ToastContainer} from "react-toastify"; +import Swal from "sweetalert2"; + + + +function GasInvoice() { + const [gas, setGas] = useState([]); + const [reloadData, setReloadData] = useState(false); + const { user } = useContext(AuthContext); + const storeid = user.store; + const { Get, Post, Delete } = useApi(); + const [showGasModal, setShowGasModal] = useState(false); + const handleShowGas = () => setShowGasModal(true); + const handleCloseGas = () => setShowGasModal(false); + + + + const handleOnDelete = async (id) => { + + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + await Delete("gasInvoiceData", id) + .then((resp) => { + setReloadData(!reloadData); + toast.success("Gas invoice removed."); + }) + .catch((err) => { + toast.error("Something went wrong."); + }); + }; + const [formData, setFormData] = useState({ + date: "", + invoice_no: "", + freight_diesel_gross_units: "", + freight_diesel_unit_price: "", + freight_diesel_total: "", + freight_gas_gross_units: "", + freight_gas_unit_price: "", + freight_gas_total: "", + freight_both_gross_units: "", + freight_both_unit_price: "", + freight_both_total: "", + minimum_load_penalty: "", + misc_cost: "", + invoice_total: "", + }); + const [gasTypes, setGasTypes] = useState([]); + const [gasFreights, setGasFreights] = useState([]); + const [gasTaxes, setGasTaxes] = useState([]); + + const [myJson, setMyJson] = useState({}); + + const [freightGrossUnits, setFreightGrossUnits] = useState({ + all: 0, + diesel: 0, + withOutDiesel: 0, + }); + + const [generalTotalObj, setGeneralTotalObj] = useState({}); + const [generalTotalObjFre, setGeneralTotalObjFre] = useState({}); + const [generalTotalObjTax, setGeneralTotalObjTax] = useState({}); + const updateGeneralTotal = (type, value) => { + setGeneralTotalObj((prev) => ({ ...prev, [type]: value })); + }; + + const updateTaxTotal = (type, value) => { + setGeneralTotalObjTax((prev) => ({ ...prev, [type]: value })); + }; + + const [finalTotal, setFinalTotal] = useState(0); + + useEffect(() => { + fetchGasData(); + fetchInvoiceValues(); + settle(); + }, [reloadData]); + + useEffect(() => { + settle(); + }, [myJson, generalTotalObj, finalTotal]); + + const handleDateChange = (e) => { + const { value } = e.target; + setFormData((prevData) => ({ + ...prevData, + date: value, + })); + }; + + function groupAndSum(data) { + const result = { all: 0 }; + for (const [key, value] of Object.entries(data)) { + const [prefix] = key.split("_"); + if (result[prefix]) { + result[prefix] += value; + } else { + result[prefix] = value; + } + result.all += value; + } + return result; + } + const fetchGasData = async () => { + try { + const response = await Get("gasInvoiceData"); + setGas(Array.isArray(response) ? response : []); + } catch (error) { + console.error("Error fetching gas data:", error); + } + }; + const handleOnUpdate = () => { } + + const fetchInvoiceValues = async () => { + await Get("getValuesForInvoice") + .then((response) => { + if (response.gas_types) { + setGasTypes(response.gas_types); + setFormData((prevData) => { + const updatedData = { ...prevData }; + response.gas_types.forEach((gasType) => { + const fieldName = `gas_${gasType.gas_type_title.toLowerCase()}_unit_price`; + updatedData[fieldName] = gasType.cost_per_gallon || ""; + }); + // console.log(response.gas_types) + return updatedData; + }); + } + + if (response.gas_freights) { + setGasFreights(response.gas_freights); + setFormData((prevData) => { + const updatedData = { ...prevData }; + response.gas_freights.forEach((freight) => { + const fieldName = `freight_${freight.freight_name.toLowerCase()}_unit_price`; + updatedData[fieldName] = freight.freight_value || ""; + }); + + return updatedData; + }); + } + + if (response.gas_taxes) { + setGasTaxes(response.gas_taxes); + setFormData((prevData) => { + const updatedData = { ...prevData }; + response.gas_taxes.forEach((tax) => { + updatedData[`${tax.tax_name.toLowerCase()}_basic`] = ""; + updatedData[`${tax.tax_name.toLowerCase()}_rate`] = ""; + updatedData[`${tax.tax_name.toLowerCase()}_total`] = "0.00"; // Adjust this logic if necessary + }); + + return updatedData; + }); + } + }) + .catch((error) => { + console.error("Error fetching invoice values:", error); + }); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + + // Update the form data with the new unit price + setFormData((prevData) => { + const updatedData = { ...prevData, [name]: value }; + + // Recalculate the totals based on the updated unit price + // Extract gas type from the name + const gasTypeMatch = name.match(/gas_(.*)_unit_price/); + if (gasTypeMatch) { + const gasType = gasTypeMatch[1]; // e.g., 'diesel' from 'gas_diesel_unit_price' + const newUnitPrice = parseFloat(value); + + // Calculate the new total for this gas type based on the current gross unit + const grossUnit = gasGrossUnits[gasType] || 0; // Get the current gross unit + const newTotal = newUnitPrice * grossUnit; + + // Update the total for this gas type in the form data + updatedData[`gas_${gasType}_total`] = newTotal; + + // Optionally, update general totals if necessary + updateGeneralTotal(`gas_${gasType}`, newTotal); + } + + return updatedData; + }); + + // If you need to recalculate final invoice totals, do it here + settle(); + }; + + + + + + + const calculateInvoiceTotal = (data) => { + let total = 0; + + // Sum all gas type totals + gasTypes.forEach((gasType) => { + const type = gasType.gas_type_title.toLowerCase(); + const gasTotal = Number(data[`gas_${type}_total`] || 0); + + total += gasTotal; + }); + + // Add freight totals + gasFreights.forEach((freight) => { + const type = freight.freight_name.toLowerCase(); + const freightTotal = Number(data[`freight_${type}_total`] || 0); + + total += freightTotal; + }); + + // Add tax totals + gasTaxes.forEach((tax) => { + const taxTotal = Number(data[`${tax.tax_name.toLowerCase()}_total`] || 0); + + total += taxTotal; + }); + + // Add any additional costs + total += Number(data.minimum_load_penalty || 0); + total += Number(data.misc_cost || 0); + + + return total; + }; + + + + const handleSubmit = async (e) => { + e.preventDefault(); + const dieselGrossUnitTotal = + freightGrossUnits.freight_diesel * + (formData.freight_diesel_unit_price || 0); + const gasGrossUnitTotal = + freightGrossUnits.freight_withOutDiesel * + (formData.freight_gas_unit_price || 0); + const bothGrossUnitTotal = + freightGrossUnits.freight_all * (formData.freight_both_unit_price || 0); + + // const minimumLoadPenalty = parseFloat(formData.minimum_load_penalty) || 0; + // const miscCost = parseFloat(formData.misc_cost) || 0; + // const invoiceTotal = parseFloat(formData.invoice_total) || 0; + + const updatedFormData = { + ...formData, + store: storeid, + freight_diesel_gross_units: freightGrossUnits.freight_diesel, + freight_diesel_total: dieselGrossUnitTotal.toFixed(2), + freight_gas_gross_units: freightGrossUnits.freight_withOutDiesel, + freight_gas_total: gasGrossUnitTotal.toFixed(2), + freight_both_gross_units: freightGrossUnits.freight_all, + freight_both_total: bothGrossUnitTotal.toFixed(2), + minimum_load_penalty: Number(minLoadCap), + misc_cost: Number(miscCost), + invoice_total: Number(finalTotal) + Number(minLoadCap) + Number(miscCost), + }; + + try { + const response = await Post("gasInvoiceData", updatedFormData).then( + (resp) => { + setReloadData(!reloadData); + setFormData((prevData) => ({ + ...prevData, + ...response, + })); + setFormData({ + date: "", + invoice_no: "", + freight_diesel_gross_units: "", + freight_diesel_unit_price: "", + freight_diesel_total: "", + freight_gas_gross_units: "", + freight_gas_unit_price: "", + freight_gas_total: "", + freight_both_gross_units: "", + freight_both_unit_price: "", + freight_both_total: "", + minimum_load_penalty: "", + misc_cost: "", + invoice_total: "", + store: "", + }); + handleCloseGas(); + } + ); + } catch (error) { + toast.error("Error posting data:", error); + } + }; + + const [gasGrossUnits, setGasGrossUnits] = useState({}); + + const calculateTotals = (data) => { + let totalOnlyDiesel = 0; + let totalWithoutDiesel = 0; + let totalWithDiesel = 0; + + for (const [key, value] of Object.entries(data)) { + if (key === "diesel") { + totalOnlyDiesel = value; + } else { + totalWithoutDiesel += value; + } + + totalWithDiesel += value; + } + + setGeneralTotalObjFre({ + freight_diesel: formData.freight_diesel_unit_price * totalOnlyDiesel, + freight_gas: formData.freight_gas_unit_price * totalWithoutDiesel, + freight_both: formData.freight_both_unit_price * totalWithDiesel, + }); + gasTaxes.map((tax, index) => { + let type = tax.gas_type; + const grossUnit = + type === "both" + ? freightGrossUnits.freight_all + : type === "diesel" + ? freightGrossUnits.freight_diesel + : type === "gas" + ? freightGrossUnits.freight_withOutDiesel + : 0; + + const rate = + formData[`${tax.tax_name.toLowerCase()}_rate`] || tax.tax_value; // Fetch rate + + updateTaxTotal(`gasTax_${type}`, grossUnit * rate); + + }); + + setFreightGrossUnits({ + freight_all: totalWithDiesel, + freight_diesel: totalOnlyDiesel, + freight_withOutDiesel: totalWithoutDiesel, + }); + + return [ + { label: "diesel", total: totalOnlyDiesel }, + { label: "withOutDiesel", total: totalWithoutDiesel }, + { label: "all", total: totalWithDiesel }, + ]; + }; + + const settle = () => { + calculateTotals(myJson); + let obj = { + gasTotal: groupAndSum(generalTotalObj).all, + freight: groupAndSum(generalTotalObjFre).all, + tax: groupAndSum(generalTotalObjTax).all, + }; + + setFinalTotal(groupAndSum(obj).all); + + }; + + const handleGrossUnitChange = async (e, gasType) => { + let newGrossUnit = e.target.value; + + // Check if the input is numeric and doesn't exceed 10 digits in total (including 2 decimal places) + if (/^\d{1,8}(\.\d{0,2})?$/.test(newGrossUnit)) { + newGrossUnit = parseFloat(newGrossUnit); + + // Update the total cost based on the gross unit change + formData[`gas_${gasType}_total`] = formData[`gas_${gasType}_unit_price`] * newGrossUnit; + + updateGeneralTotal( + "gas_" + gasType, + formData[`gas_${gasType}_unit_price`] * newGrossUnit + ); + + await updateGrossUnit(newGrossUnit, gasType); + + setMyJson((prev) => ({ + ...prev, + [gasType]: newGrossUnit, + })); + + settle(myJson); + } else { + // Optionally handle invalid input (e.g., show an error message or ignore the change) + console.log("Invalid input: Must be a number with up to 8 digits before the decimal and 2 digits after."); + } + }; + + const updateGrossUnit = async (newGrossUnit, gasType) => { + if (!isNaN(newGrossUnit)) { + setGasGrossUnits((prev) => ({ + ...prev, + [gasType]: newGrossUnit, + })); + } else { + setGasGrossUnits((prev) => ({ + ...prev, + [gasType]: 0, + })); + + } + }; + + const columns = [ + { header: "Purchase Date", field: "date" }, + { header: "Invoice no", field: "invoice_no" }, + { header: "Total Gas Gallons", field: "freight_gas_gross_units" }, + { header: "Total Diesel Gallons", field: "freight_diesel_gross_units" }, + { header: "Amount", field: "invoice_total" }, + ]; + const [minLoadCap, setMinLoadCap] = useState(0); + const [miscCost, setMiscCost] = useState(0); + return ( + <> + +
+
+
Gas Invoice
+ +
+ +
+
+
+ + + + + +
+ +
+
+ + + + + + + + + + + {gasTypes.map((gasType, index) => { + const type = gasType.gas_type_title.toLowerCase(); + return ( + + + + + + + ); + })} + +
DescriptionGross UnitsUnit PriceTotal
{gasType.gas_type_title} + handleGrossUnitChange(e, type)} + className="input-field" + style={{ width: "150px", height: "36px" }} + /> + + + + {formData[`gas_${type}_total`] || + gasGrossUnits[type] * + formData[`gas_${type}_unit_price`] || + "0.00"} +
+
+
+ +
+
+ + + + + + + + + + + {gasFreights.map((freight, index) => { + const type = freight.freight_name.toLowerCase(); + const freightUnitPrice = + formData[`freight_${type}_unit_price`] || 0; + const grossUnitValue = + type === "both" + ? freightGrossUnits.freight_all + : type === "diesel" + ? freightGrossUnits.freight_diesel + : type === "gas" + ? freightGrossUnits.freight_withOutDiesel + : 0; + + return ( + + + + + + + + ); + })} + +
Freight SummaryGross UnitsUnit PriceTotal
{freight.freight_name} + {type === "both" ? ( + + ) : ( + "" + )} + {type === "diesel" ? ( + + ) : ( + "" + )} + {type === "gas" ? ( + + ) : ( + "" + )} + + + + + {formData[`freight_${type}_total`] || + grossUnitValue * freightUnitPrice || + "0.00"} +
+
+
+ +
+
+ + + + + + + + + + + {gasTaxes.map((tax, index) => { + let type = tax.gas_type; + + const calculateTotal = () => { + const grossUnit = + type === "both" + ? freightGrossUnits.freight_all + : type === "diesel" + ? freightGrossUnits.freight_diesel + : type === "gas" + ? freightGrossUnits.freight_withOutDiesel + : 0; + + const rate = + formData[`${tax.tax_name.toLowerCase()}_rate`] || + tax.tax_value; // Fetch rate + + return grossUnit * rate; + }; + return ( + + + + + + + ); + })} + +
+ Tax & Other
+ Charges Summary +
BasicRateTotal
{tax.tax_name} + {type === "both" ? ( + + ) : ( + "" + )} + {type === "diesel" ? ( + + ) : ( + "" + )} + {type === "gas" ? ( + + ) : ( + "" + )} + + + {calculateTotal().toFixed(2)}
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Minimum Load Penalty + {" "} + { + setMinLoadCap(e.target.value); + }} // Assuming handleChange is already defined to update formData + className="input-field" + style={{ + width: "110px", + height: "36px", + marginLeft: "450px", + }} + /> +
Misc Cost + { + setMiscCost(e.target.value); + }} // Assuming handleChange is already defined to update formData + className="input-field" + style={{ + width: "110px", + height: "36px", + marginLeft: "450px", + }} + /> +
Invoice Total + +
+
+
+ + +
+
+
+ +
+ + ); +} + +export default GasInvoice; diff --git a/src/components/Pages/AppPAges/Gas/GasSettings.js b/src/components/Pages/AppPAges/Gas/GasSettings.js new file mode 100644 index 0000000..a615baa --- /dev/null +++ b/src/components/Pages/AppPAges/Gas/GasSettings.js @@ -0,0 +1,685 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import ReusableModal from "../ManageSettings/ReusableModal"; +import { toast,ToastContainer } from "react-toastify"; +import "./Gas.css"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import SettingTable from "../ManageSettings/SettingTable"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import GasTypeTable from "./GasTypeTable"; +import Swal from "sweetalert2"; + +function GasSettings() { + let { user } = useContext(AuthContext); + const storeId = user.store; + + const [gasTypeTitle, setGasTypeTitle] = useState(""); + const [costPerGallon, setCostPerGallon] = useState(""); + const [gasTypeData, setGasTypeData] = useState([]); + + const [gasCompany, setGasCompany] = useState(""); + const [companyContact, setCompanyContact] = useState(""); + const [companyEmail, setcompanyEmail] = useState(""); + const [companyData, setCompanyData] = useState([]); + + const [gasName, setGasName] = useState(""); + const [gasCommission, setGasCommission] = useState(""); + const [commissionDate, setCommissionDate] = useState(""); + const [commissionData, setCommissionData] = useState([]); + + const { Get, Post, Put, Delete,Patch } = useApi(); + + const [showGasTypeModal, setShowGasTypeModal] = useState(false); + const [showCompanyModal, setShowCompanyModal] = useState(false); + const [showCommissionModal, setShowCommissionModal] = useState(false); + + const handleShowGasType = () => setShowGasTypeModal(true); + const handleCloseGasType = () => { + setGasTypeTitle(""); + setCostPerGallon(""); + setSelectedGasType(null); + setShowGasTypeModal(false); + }; + const handleShowCompany = () => setShowCompanyModal(true); + const handleCloseCompany = () => { + setGasCompany(""); + setCompanyContact(""); + setcompanyEmail(""); + setSelectedCompany(null); + setShowCompanyModal(false); + }; + const handleShowCommission = () => setShowCommissionModal(true); + const handleCloseCommission = () => { + setGasName(""); + setGasCommission(""); + setCommissionDate(""); + setSelectedCommission(null); + setShowCommissionModal(false); + }; + const [selectedGasType, setSelectedGasType] = useState(null); + const [selectedCompany, setSelectedCompany] = useState(null); + const [selectedCommission, setSelectedCommission] = useState(null); + + // Handle edit for Gas Type + const handleEditGasType = (gasType) => { + setSelectedGasType(gasType); + setGasTypeTitle(gasType.gas_type_title); + setCostPerGallon(gasType.cost_per_gallon); + handleShowGasType(); + + }; + + // Handle edit for Company + const handleEditCompany = (company) => { + setSelectedCompany(company); + setGasCompany(company.name); + setCompanyContact(company.contact_no); + setcompanyEmail(company.email); + handleShowCompany(); + }; + + // Handle edit for Commission + const handleEditCommission = (commission) => { + setSelectedCommission(commission); + setGasName(commission.gas_type); + setGasCommission(commission.commission_percentage); + setCommissionDate(commission.date_from); + handleShowCommission(); + }; + + useEffect(() => { + const fetchData = async () => { + try { + const gasTypeResponse = await Get("gasTypeData"); + setGasTypeData(gasTypeResponse); + + const companyResponse = await Get("gasCompanyData"); + setCompanyData(companyResponse); + + const commissionResponse = await Get("gasCommissionData"); + setCommissionData(commissionResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + fetchData(); + }, []); + const handleGasTypeChange = (e) => { + const { name, value } = e.target; + + // Handle gas type title change + if (name === "gas_type_title") { + setGasTypeTitle(value); + } + + // Handle cost per gallon change with validation for 10 digits (8 before decimal, 2 after) + if (name === "cost_per_gallon") { + // Regular expression to allow up to 8 digits before the decimal and 2 digits after the decimal + const validCostPerGallon = /^\d{1,8}(\.\d{0,2})?$/; + + if (validCostPerGallon.test(value)) { + setCostPerGallon(value); + } else { + + } + } + }; + + const handleCompanyChange = (e) => { + const { name, value } = e.target; + + // Handle 'name' change (company name) + if (name === "name") { + setGasCompany(value); + } + + // Handle 'contact_no' change (company contact number) + if (name === "contact_no") { + // Remove non-digit characters (optional, in case you want to allow formatting like dashes) + const cleanedValue = value.replace(/\D/g, ""); + + // Only allow 12 digits for contact number + if (cleanedValue.length <= 12) { + setCompanyContact(cleanedValue); // Set the contact number with up to 12 digits + } else { + // Optionally, handle the case where the number exceeds 12 digits + } + } + + // Handle 'email' change (company email) + if (name === "email") { + setcompanyEmail(value); + } + }; + + + const handleCommissionChange = (e) => { + const { name, value } = e.target; + + // Handle gas type change + if (name === "gas_type") { + setGasName(value); + } + + // Validate and handle commission percentage + if (name === "commission_percentage") { + let commissionValue = parseFloat(value); + + // Ensure the commission percentage doesn't exceed 100 + if (commissionValue > 100) { + commissionValue = 100; // Or display an error message, if preferred + toast.info("Commission percentage cannot exceed 100%. It has been set to 100%."); + } else if (commissionValue < 0) { + commissionValue = 0; // Prevent negative commission values + toast.error("Commission percentage cannot be negative. It has been set to 0%."); + } + + setGasCommission(commissionValue); + } + + // Handle date change + if (name === "date_from") { + setCommissionDate(value); + } + }; + + + const handleGasTypeSubmit = async (e) => { + e.preventDefault(); + const gasData = { + gas_type_title: gasTypeTitle, + cost_per_gallon: costPerGallon, + is_enable: false, + store: storeId, + }; + try { + if (selectedGasType) { + // Update existing gas type + await Put("gasTypeData", selectedGasType.id, gasData); + setGasTypeData((prevData) => + prevData.map((item) => + item.id === selectedGasType.id ? { ...item, ...gasData } : item + ) + ); + + toast.success("Gas type data updated successfully!"); + + } else { + // Add new gas type + const response = await Post("gasTypeData", gasData); + setGasTypeData((prevData) => [...prevData, response.data]); + toast.success("Gas type data added successfully!"); + } + handleCloseGasType(); // Close modal after submission + } catch (error) { + console.error("Error posting gas type data:", error); + toast.error("Error adding/updating gas type data."); + } + }; + + const handleEnableDisable = async (id, isActive) => { + try { + // Toggle the is_enable value (true to false or false to true) + const updatedStatus = !isActive; + + // Update the gas type data (you can call an API to update it on the server) + await Patch("gasTypeData", id, { is_enable: updatedStatus }); + + // Update the local state to reflect the change + setGasTypeData((prevData) => + prevData.map((item) => + item.id === id ? { ...item, is_enable: updatedStatus } : item + ) + ); + + // Optionally show a toast or notification + toast.success(`Gas Type ${updatedStatus ? "Enabled" : "Disabled"} successfully!`); + } catch (error) { + console.error("Error updating status:", error); + toast.error("Failed to update status."); + } + }; + + const handleDeleteGasType = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("gasTypeData", id); // Call delete API with the gas type ID + setGasTypeData((prevGasTypes) => + prevGasTypes.filter((gasType) => gasType.id !== id) + ); + toast.success("Gas type deleted successfully"); + } catch (error) { + console.error("Error deleting gas type data:", error); + toast.error("Error deleting gas type"); + } + }; + + const handleCompanySubmit = async (e) => { + e.preventDefault(); + const gasCompanyData = { + store: storeId, + name: gasCompany, + contact_no: companyContact, + email: companyEmail, + }; + try { + if (selectedCompany) { + // Update existing company + await Put("gasCompanyData", selectedCompany.id, gasCompanyData); + setCompanyData((prevData) => + prevData.map((company) => + company.id === selectedCompany.id + ? { ...company, ...gasCompanyData } + : company + ) + ); + toast.success("Company data updated successfully!"); + } else { + // Add new company + const response = await Post("gasCompanyData", gasCompanyData); + setCompanyData((prevData) => [...prevData, response.data]); + toast.success("Company data added successfully!"); + } + handleCloseCompany(); // Close modal after submission + } catch (error) { + toast.error("Error adding/updating company data."); + } + }; + + const handleDeleteCompanyData = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("gasCompanyData", id); // Call delete API with the gas type ID + setCompanyData((prevGasCompanyData) => + prevGasCompanyData.filter((gasCompanyData) => gasCompanyData.id !== id) + ); + toast.success("Gas Coompany deleted successfully"); + } catch (error) { + console.error("Error deleting gas company:", error); + toast.error("Error deleting gas company"); + } + }; + const handleCommissionSubmit = async (e) => { + e.preventDefault(); + + const gasCommissionData = { + gas_type: gasName, + commission_percentage: gasCommission, + date_from: commissionDate, + store: storeId, + }; + + try { + if (selectedCommission) { + // Update existing commission + await Put( + "gasCommissionData", + selectedCommission.id, + gasCommissionData + ); + setCommissionData((prevData) => + prevData.map((commission) => + commission.id === selectedCommission.id + ? { ...commission, ...gasCommissionData } + : commission + ) + ); + toast.success("Commission data updated successfully!"); + } else { + // Add new commission + const response = await Post("gasCommissionData", gasCommissionData); + setCommissionData((prevData) => [...prevData, response.data]); + toast.success("Commission data added successfully!"); + } + handleCloseCommission(); // Close modal after submission + } catch (error) { + toast.error("Error adding/updating commission data."); + } + }; + const handleDeleteGasCommision = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("gasCommissionData", id); // Call delete API with the gas type ID + setCommissionData((prevGasCommision) => + prevGasCommision.filter((gasCommission) => gasCommission.id !== id) + ); + toast.success("Gas Commission deleted successfully"); + } catch (error) { + console.error("Error deleting gas commission:", error); + toast.error("Error deleting gas commission"); + } + }; + const gasTypeColumns = [ + { header: "Gas Type Title", field: "gas_type_title" }, + { header: "Cost Per Gallon", field: "cost_per_gallon" }, + { header: "Is Blended", field: "is_blended" }, + { header: "Blended", field: "is_blended" }, + + ]; + const companyColumns = [ + { header: "Company Name", field: "name" }, + { header: "Contact No", field: "contact_no" }, + { header: "Email", field: "email" }, + ]; + const commissionColumns = [ + { header: "Gas Type", field: "gas_type_title" }, + { header: "Commission Percentage", field: "commission_percentage" }, + { header: "Date From", field: "date_from" }, + ]; + const handleToggleEnable = async (id, currentStatus) => { + try { + const updatedStatus = !currentStatus; + await Put("gasTypeData", id, { is_enable: updatedStatus }); + setGasTypeData((prevData) => + prevData.map((item) => + item.id === id ? { ...item, is_enable: updatedStatus } : item + ) + ); + toast.success(`Gas type ${updatedStatus ? "enabled" : "disabled"} successfully!`); + } catch (error) { + console.error("Error toggling gas type enable status:", error); + toast.error("Failed to update gas type status."); + } + } + return ( + <> + +
+
+
Gas Types
+ +
+ +
+
+ + + + +
+
+
+ + +
+
Gas Companies (For House Charges)
+ +
+ +
+
+ + + + + +
+
+
+ + +
+
Gas Type Commision
+ +
+ +
+
+ + + + + +
+
+
+ +
+ + ); +} + +export default GasSettings; diff --git a/src/components/Pages/AppPAges/Gas/GasTaxSettings.js b/src/components/Pages/AppPAges/Gas/GasTaxSettings.js new file mode 100644 index 0000000..6155611 --- /dev/null +++ b/src/components/Pages/AppPAges/Gas/GasTaxSettings.js @@ -0,0 +1,365 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import React, { useState, useEffect, useContext } from "react"; +import ReusableModal from "../ManageSettings/ReusableModal"; +import { toast ,ToastContainer} from "react-toastify"; +import "./Gas.css"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import SettingTable from "../ManageSettings/SettingTable"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import Swal from "sweetalert2"; + + +function GasTaxSettings() { + let { user } = useContext(AuthContext); + const storeId = user.store; + + const [freightData, setFreightData] = useState([]); + const { Get, Post, Put, Delete } = useApi(); + + const [gasTypeData, setGasTypeData] = useState([]); + const [gasType, setGasType] = useState(""); + const [taxName, setTaxName] = useState(""); + const [taxValue, setTaxValue] = useState(""); + const [gas, setGas] = useState([]); + + const [selectedGasTax, setSelectedGasTax] = useState(null); + const [showTaxModal, setShowTaxModal] = useState(false); + const [selectedFreight, setSelectedFreight] = useState(null); // New state for selected freight + const [freightName, setFreightName] = useState(""); // New state for freight name + const [showFreightModal, setShowFreightModal] = useState(false); + + // Function to show modal + const handleShowTax = () => setShowTaxModal(true); + + // Function to close modal and reset state + const handleCloseTax = () => { + setTaxName(""); + setTaxValue(""); + setGasType(""); + setSelectedGasTax(null); + setShowTaxModal(false); + }; + + const handleShowFreight = () => setShowFreightModal(true); + + // Function to close freight modal and reset state + const handleCloseFreight = () => { + setSelectedFreight(null); + setShowFreightModal(false); + }; + + useEffect(() => { + const fetchData = async () => { + try { + const gasTypeResponse = await Get("gasTypeData"); + setGasTypeData(gasTypeResponse); + + const taxResponse = await Get("gasTaxData"); + setGas(taxResponse); + + const freightResponse = await Get("gasFreightData"); // Adjust the endpoint as necessary + setFreightData(freightResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + fetchData(); + }, []); + + // Handle form field changes + const handleChange = (e) => { + const { name, value } = e.target; + + if (name === "gas_type") { + setGasType(value); + } + + if (name === "tax_name") { + setTaxName(value); + } + + if (name === "tax_value") { + let taxValue = parseFloat(value); + + if (taxValue > 100) { + taxValue = 100; + } else if (taxValue < 0) { + taxValue = 0; + } + + // Update the tax value in state + setTaxValue(taxValue); + } + + if (name === "freight_name") { + setFreightName(value); + } + + if (name === "freight_value" && selectedFreight) { + setSelectedFreight({ ...selectedFreight, freight_value: value }); + } + }; + + // Handle when user wants to edit an existing gas tax + const handleEditGasTax = (gasTax) => { + setSelectedGasTax(gasTax); + setGasType(gasTax.gas_type); + setTaxName(gasTax.tax_name); + setTaxValue(gasTax.tax_value); + handleShowTax(); // Show modal for editing + }; + + // Handle form submit (both add and edit) + const handleSubmit = async (e) => { + e.preventDefault(); + const gasTax = { + gas_type: gasType, + tax_name: taxName, + tax_value: taxValue, + store: storeId, + }; + + try { + if (selectedGasTax) { + // Update existing gas tax + await Put("gasTaxData", selectedGasTax.id, gasTax); + setGas((prevData) => + prevData.map((item) => + item.id === selectedGasTax.id ? { ...item, ...gasTax } : item + ) + ); + toast.success("Tax data updated successfully!"); + } else { + // Add new gas tax + const response = await Post("gasTaxData", gasTax); + setGas((prevData) => [...prevData, response.data]); + toast.success("Tax data added successfully!"); + } + handleCloseTax(); // Close modal after submission + } catch (error) { + console.error("Error posting gas type data:", error); + toast.error("Error adding/updating gas type data."); + } + }; + + // Handle delete action for a gas tax + const handleDeleteGasTax = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("gasTaxData", id); + setGas((prevGasTax) => prevGasTax.filter((gasTax) => gasTax.id !== id)); + toast.success("Gas Commission deleted successfully"); + } catch (error) { + console.error("Error deleting gas commission:", error); + toast.error("Error deleting gas commission"); + } + }; + + const handleEditFreight = (freight) => { + setSelectedFreight(freight); + setFreightName(freight.freight_name); // Set freight name for editing + handleShowFreight(); // Show modal for editing freight value + }; + const handleSubmitFreight = async (e) => { + e.preventDefault(); + const updatedFreight = { + ...selectedFreight, + freight_name: freightName, // Include freight name + store: storeId, + }; + + try { + await Put("gasFreightData", selectedFreight.id, updatedFreight); + setFreightData((prevData) => + prevData.map((item) => + item.id === selectedFreight.id ? { ...item, ...updatedFreight } : item + ) + ); + toast.success("Freight data updated successfully!"); + handleCloseFreight(); + } catch (error) { + console.error("Error updating freight data:", error); + toast.error("Error updating freight data."); + } + }; + + // Columns for setting table + const columns = [ + { header: "Tax Name", field: "tax_name" }, + { header: "Tax Value", field: "tax_value" }, + { header: "Gas Type", field: "gas_type" }, + ]; + + const freightColumns = [ + { header: "Freight Name", field: "freight_name" }, + { header: "Freight Value", field: "freight_value" }, + ]; + + return ( +
+ +
+
Gas Tax Settings
+ +
+ + +
+
+ + + + + + + +
+
+
+ + + + +
+
+ + + + +
+
+
+
+
Gas Freight Settings
+
+ +
+ ); +} + +export default GasTaxSettings; diff --git a/src/components/Pages/AppPAges/Gas/GasTypeTable.js b/src/components/Pages/AppPAges/Gas/GasTypeTable.js new file mode 100644 index 0000000..a10046c --- /dev/null +++ b/src/components/Pages/AppPAges/Gas/GasTypeTable.js @@ -0,0 +1,510 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState } from "react"; + +const GasTypeTable = ({ + data, + columns, + showAction, + showFooter, + onEdit, + onDelete, + showExport, + showFilter, + handleEnableDisable, +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + const statusStyles = { + enable: { + backgroundColor: "#6CBE1C", // Green background for Enable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + disable: { + backgroundColor: "#F4F4F4", // Red background for Disable + color: "#000", + borderRadius: "30px", + padding: "5px 10px", + }, + }; + + const downloadCSV = () => { + const headers = columns.map((col) => col.header).join(",") + "\n"; + const rows = data + .map((row) => + columns.map((col) => String(row[col.field] || "")).join(",") + ) + .join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const [showDropdown, setShowDropdown] = useState(false); + const handleFilterClick = () => { + setShowDropdown(!showDropdown); // Toggle the dropdown + }; + + const renderFilterDropdown = () => { + return ( +
    + + + + +
    + ); + }; + + const dropdownStyles = { + position: "absolute", + top: "100%", + left: "0", + backgroundColor: "white", + border: "1px solid #ddd", + padding: "10px", + boxShadow: "0px 4px 8px rgba(0,0,0,0.1)", + borderRadius: "4px", + zIndex: "1", + }; + + return ( +
    +
    +
    +
    + setSearchTerm(e.target.value)} + placeholder="Search" + /> + + + + +
    + {showExport && ( // Conditionally render the button based on showExport prop + + )} + {showFilter && ( +
    + + {showDropdown && renderFilterDropdown()} +
    + )} +
    +
    +

    Show

    + +
    +
    + + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.length === 0 ? ( + + + + ) : ( + sortedDisplayedData.map((item) => ( + + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + )) + )} + +
    + No + handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    + No data found +
    + {(currentPage - 1) * rowsPerPage + + sortedDisplayedData.indexOf(item) + + 1} + + {col.field === "status" ? ( +
    + {typeof item[col.field] === "string" && item[col.field] + ? item[col.field].charAt(0).toUpperCase() + + item[col.field].slice(1) + : "-"} +
    + ) : item[col.field] !== undefined && + item[col.field] !== null ? ( + typeof item[col.field] === "function" ? ( + item[col.field]() + ) : ( + item[col.field] + ) + ) : ( + "-" + )} +
    + + + +
    + {showFooter && ( + + )} +
    + ); +}; + +export default GasTypeTable; diff --git a/src/components/Pages/AppPAges/Gas/HouseChargeTable.js b/src/components/Pages/AppPAges/Gas/HouseChargeTable.js new file mode 100644 index 0000000..5d35efb --- /dev/null +++ b/src/components/Pages/AppPAges/Gas/HouseChargeTable.js @@ -0,0 +1,532 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState } from "react"; + +const HouseChargeTable = ({ + data, + columns, + showAction, + showFooter, + onEdit, + onDelete, + showExport, + showFilter, + handleEnableDisable, +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + const statusStyles = { + enable: { + backgroundColor: "#6CBE1C", // Green background for Enable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + disable: { + backgroundColor: "#F6F6F6", // Red background for Disable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + draft: { + backgroundColor: "#D1D1EF", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + unpaid: { + backgroundColor: "#EF3E49", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + paid: { + backgroundColor: "#5856AC", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + }; + + const downloadCSV = () => { + const headers = columns.map((col) => col.header).join(",") + "\n"; + const rows = data + .map((row) => + columns.map((col) => String(row[col.field] || "")).join(",") + ) + .join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const [showDropdown, setShowDropdown] = useState(false); + const handleFilterClick = () => { + setShowDropdown(!showDropdown); // Toggle the dropdown + }; + + const renderFilterDropdown = () => { + return ( +
    + + + + +
    + ); + }; + + const dropdownStyles = { + position: "absolute", + top: "100%", + left: "0", + backgroundColor: "white", + border: "1px solid #ddd", + padding: "10px", + boxShadow: "0px 4px 8px rgba(0,0,0,0.1)", + borderRadius: "4px", + zIndex: "1", + }; + // Calculate the total net sales from the data + // const totalNetSales = data.reduce((acc, item) => { + // const amount = Number(item.total_net_sales) || 0; // Make sure to handle non-numeric values + // return acc + amount; + // }, 0).toFixed(2); // + return ( +
    +
    +
    House Charges
    +
    +
    +
    +
    + setSearchTerm(e.target.value)} + placeholder="Search" + /> + + + + +
    + {showExport && ( // Conditionally render the button based on showExport prop + + )} + {showFilter && ( +
    + + {showDropdown && renderFilterDropdown()} +
    + )} +
    +
    +

    Show

    + +
    +
    + + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.length === 0 ? ( + + + + ) : ( + sortedDisplayedData.map((item) => ( + + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + )) + )} + +
    + No + handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    + No data found +
    + {(currentPage - 1) * rowsPerPage + + sortedDisplayedData.indexOf(item) + + 1} + + {col.field === "status" ? ( +
    + {typeof item[col.field] === "string" && item[col.field] + ? item[col.field].charAt(0).toUpperCase() + + item[col.field].slice(1) + : "-"} +
    + ) : item[col.field] !== undefined && + item[col.field] !== null ? ( + typeof item[col.field] === "function" ? ( + item[col.field]() + ) : ( + item[col.field] + ) + ) : ( + "-" + )} +
    + {/* + */} + +
    + {showFooter && ( + + )} +
    + ); +}; + +export default HouseChargeTable; diff --git a/src/components/Pages/AppPAges/Gas/HouseCharges.js b/src/components/Pages/AppPAges/Gas/HouseCharges.js new file mode 100644 index 0000000..3e08520 --- /dev/null +++ b/src/components/Pages/AppPAges/Gas/HouseCharges.js @@ -0,0 +1,422 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect } from "react"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import HouseChargeTable from "./HouseChargeTable"; +import Modal from "react-modal"; +import { toast } from "react-toastify"; + +function HouseCharges() { + const [gas, setGas] = useState([]); + const [isModalOpen, setIsModalOpen] = useState(false); + const [selectedCharge, setSelectedCharge] = useState(null); // Store selected row data + const [paymentType, setPaymentType] = useState(""); // To track the selected payment type + const [selectedBank, setSelectedBank] = useState(""); // To track the selected bank + const [chequeNumber, setChequeNumber] = useState(""); // To track the cheque number + const { Get, Patch, Delete } = useApi(); + const [banks, setBanks] = useState([]); + + useEffect(() => { + const fetchGasData = async () => { + try { + const response = await Get("houseChargeData"); + + setGas(response); + // setGas(Array.isArray(response) ? response : []); + } catch (error) { + console.error("Error fetching gas data:", error); + } + }; + fetchGasData(); + fetchBank(); + }, []); + const handleDeleteHouseCharge = async () => { + if (!selectedCharge) return; + + try { + const response = await Delete("houseChargeData", selectedCharge.id); + + setGas((prevGas) => + prevGas.filter((item) => item.id !== selectedCharge.id) + ); + closeModal(); + toast.success("House charge deleted successfully!"); + } catch (error) { + // console.error("Error deleting house charge:", error); + toast.error("An error occurred while deleting the charge."); + } finally { + // Ensure the modal closes after submission, even if there's an error + closeModal(); + } + }; + + const handleEnableDisable = (id, currentStatus) => { + const selectedCharge = gas.find((item) => item.id === id); + if (selectedCharge) { + openModal(selectedCharge); + } + }; + + const fetchBank = async () => { + try { + const [bankResponse] = await Promise.all([Get("bank")]); + setBanks(bankResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + + const handleFormSubmit = async (e) => { + e.preventDefault(); + if (!selectedCharge) return; + + try { + const response = await Patch("houseChargeData", selectedCharge.id, { + ...selectedCharge, + pay_method: paymentType, + bank: selectedBank, + cheque_no: chequeNumber, + notes: selectedCharge.notes, + is_paid: true, + }); + + // Update the state with the updated charge details + setGas((prevGas) => + prevGas.map((item) => + item.id === selectedCharge.id + ? { + ...item, + pay_method: paymentType, + bank: selectedBank, + cheque_no: chequeNumber, + notes: selectedCharge.notes, + is_paid: true, + } + : item + ) + ); + + // Close the modal based on the response status + response.success && closeModal(); + } catch (error) { + console.error("Error updating charge:", error); + } finally { + // Ensure the modal closes after submission, even if there's an error + closeModal(); + } + }; + + const openModal = (charge) => { + setSelectedCharge(charge); // Set selected row data + setPaymentType(charge.pay_method || ""); // Set payment type from selected row + setSelectedBank(charge.bank || ""); // Set selected bank from row data + setChequeNumber(charge.cheque_no || ""); // Set cheque number if available + setIsModalOpen(true); // Open the modal + }; + + const closeModal = () => { + setSelectedCharge(null); // Clear selected charge + setIsModalOpen(false); // Close the modal + }; + + const handlePaymentTypeChange = (e) => { + setPaymentType(e.target.value); + setSelectedBank(""); // Reset the bank selection when payment type changes + setChequeNumber(""); // Reset cheque number when payment type changes + }; + const columns = [ + { header: "Date", field: "bill_date" }, + { header: "Gas Company", field: "company_title" }, + { header: "Amount", field: "amount" }, + ]; + + return ( + <> +
    + +
    + + {/* Modal for Charge Details */} + {isModalOpen && selectedCharge && ( + + {selectedCharge.is_paid ? ( +
    +
    +

    Transaction Details

    + + + +
    + + + + + + + + + + + + + + + + + +
    + Date + + Type + + Amount + + Action +
    + {selectedCharge.bill_date} + + {selectedCharge.pay_method} + ${selectedCharge.amount} + + + +
    +
    + ) : ( +
    +
    +

    Mark As Receiver

    +
    + + +
    +
    + +
    + {/* Bill Date */} +
    + + setSelectedCharge({ + ...selectedCharge, + bill_date: e.target.value, + }) + } + required + /> +
    +
    + + setSelectedCharge({ + ...selectedCharge, + amount: e.target.value, + }) + } + placeholder="Amount" + required + /> +
    +
    + + setSelectedCharge({ + ...selectedCharge, + company_title: e.target.value, + }) + } + placeholder="Notes" + /> +
    +
    + + {/* Payment Type */} +
    +
    + Payment Method:    + {["cheque", "cash", "bank"].map((type) => ( +
    + + +
    + ))} +
    +
    +
    + + setSelectedCharge({ + ...selectedCharge, + notes: e.target.value, + }) + } + placeholder="Notes" + /> +
    + {/* Conditional Bank Selection and Cheque Number */} + {(paymentType === "cheque" || paymentType === "bank") && ( +
    +
    + +
    +
    + {paymentType === "cheque" && ( + setChequeNumber(e.target.value)} + placeholder="Cheque Number" + required + /> + )} +
    +
    + )} +
    + )} +
    + )} + + ); +} + +export default HouseCharges; diff --git a/src/components/Pages/AppPAges/GeneralLedger/GeneralLedger.css b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedger.css new file mode 100644 index 0000000..4f47a2f --- /dev/null +++ b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedger.css @@ -0,0 +1,16 @@ +.gas-invoice-add-button-bank-deposit{ + padding: 8px 16px; + background-color: #4545db; /* Bootstrap primary color */ + color: white; + border: none; + border-radius: 40px; + cursor: pointer; + width: 226px; + height: 42px; + font-size: 18px; +} +.modal-title{ + font-size: 22px; + font-weight: 600; + color: #000; +} \ No newline at end of file diff --git a/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerATM.js b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerATM.js new file mode 100644 index 0000000..fdc378b --- /dev/null +++ b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerATM.js @@ -0,0 +1,597 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import React, { useState, useContext, useEffect } from "react"; +import { toast,ToastContainer } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../.././../utils/secure-route/AuthContext"; +import SettingTable from "../ManageSettings/SettingTable"; +import Swal from "sweetalert2"; + +export default function GeneralLedgerATM() { + const { user } = useContext(AuthContext); + const { Get, Post, Delete, Put } = useApi(); + const storeid = user.store; + const [banks, setBanks] = useState(); + const [isEditing, setIsEditing] = useState(false); // Track if editing + const [currentRecord, setCurrentRecord] = useState(null); + const [isChecked, setIsChecked] = useState(false); + + const [showModalAtm, setShowModalAtm] = useState(false); + + const toggleModal = () => { + if (showModalAtm) { + resetFormData(); // Clear form data only when closing the modal + } + setShowModalAtm(!showModalAtm); + // Prevent automatic focus when modal is opened + + if (!showModalAtm) { + setTimeout(() => { + document.activeElement.blur(); + }, 0); + } + }; + const [atmDeposit, setAtmDeposit] = useState(); + useEffect(() => { + // fetchBanks(); + fetchAtmData(); + }, []); + + + const handleCheckboxChange = async (event) => { + const isChecked = event.target.checked; + setIsChecked(isChecked); // Set checkbox state + + // Call the bank API only if the checkbox is checked + if (isChecked) { + try { + await fetchBanks(); + } catch (error) { + console.error("Error fetching banks:", error); + } + } + }; + + const fetchAtmData = async () => { + try { + const atmDepositResponse = await Get("transactionData"); + setAtmDeposit(filterByTransactionType(atmDepositResponse, "ATM Deposit")); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + + + function filterByTransactionType(dataArray, transactionType) { + return dataArray.filter(record => record.transaction_type === transactionType); +} + + const fetchBanks = async () => { + try { + const data = await Get("bank"); + setBanks(data); + } catch (error) { + console.error("Error fetching banks:", error); + } + }; + const handleDateChange = (e) => { + const { value } = e.target; + + // Ensure the date value is properly formatted to YYYY-MM-DD + setFormData((prevData) => ({ + ...prevData, + date: value, // This will be in the correct format for the + })); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + }; + + + const today = new Date().toISOString().split("T")[0]; + + const [formData, setFormData] = useState({ + store: storeid, + sr_no: 3, + date: today, // default to today + transaction_type: "ATM Deposit", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + cheque_no: "", + total_amount: "", + note: "", + atm_commission: "", + income_type: null, + bank_deposite_type: null, + owner: null, + }); + + const handleAtmDeposit = async (event) => { + event.preventDefault(); // Prevent page reload + + const { sr_no, ...formDataWithoutSrNo } = formData; + + // Always set pay_method_status to null + formDataWithoutSrNo.pay_method_status = null; + + // If the checkbox is not checked, set pay_method to null + if (!isChecked) { + formDataWithoutSrNo.pay_method = null; // Set pay_method to null if checkbox is not checked + } + + if (!formData.bank_deposite_type) { + toast.error("Please select a valid Deposit type."); + return; + } + if (!formData.amount) { + toast.error("Please Enter Amount") + return; // Stop form submission if the amount is invalid + } + + try { + const updatedFormData = { + ...formDataWithoutSrNo, + store: storeid, + }; + + if (isEditing) { + // Update request (PUT) + const response = await Put( + "transactionData", + currentRecord.id, + updatedFormData + ); + if (response && (response.status === 200 || response.status === 204)) { + toast.success("ATM Deposit updated successfully!"); + // Optionally reset form after successful update + resetFormData(); + setIsEditing(false); // Reset edit flag + setShowModalAtm(false); + fetchAtmData() + } + } else { + // Create request (POST) + const response = await Post("transactionData", updatedFormData); + if (response && (response.status === 200 || response.status === 201)) { + toast.success("ATM Deposit added successfully!"); + resetFormData(); + setShowModalAtm(false); + fetchAtmData(); + } + } + } catch (error) { + console.error("Error submitting form:", error); + toast.error("Submission failed: " + error.message); + } + }; + + // Reset the form data after submission + const resetFormData = () => { + setIsChecked(false); + setFormData({ + ...formData, + date: today, + amount: "", + total_amount: "", + cheque_no: "", + note: "", + atm_commission: " ", + owner: null, + bank: "", + cash_amount: "", + cheque_amount: "", + income_type: null, + bank_deposite_type: null, + pay_method: "", // Reset this correctly + pay_method_status: null, // Reset this to null + store: storeid, + }); + }; + + const handleEditAtmDeposit = (record) => { + setIsEditing(true); + setCurrentRecord(record); + setFormData({ + ...record, + date: record.date || "", + bank: record.bank || "", + atm_commission: record.atm_commission || "", + note: record.note || "", + amount: record.amount || "", + cheque_no: record.cheque_no || "", + }); + setShowModalAtm(true); + }; + + const handleDeleteAtmDeposit = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + + try { + await Delete("transactionData", id); // Call delete API with the ATM deposit ID + setAtmDeposit((prevAtmDeposit) => + prevAtmDeposit.filter((atmDeposit) => atmDeposit.id !== id) + ); + toast.success("ATM Deposit deleted successfully"); + } catch (error) { + console.error("Error deleting ATM Deposit:", error); + toast.error("Error deleting ATM Deposit"); + } +}; + + const columns = [ + { header: "Sr", field: "sr_no" }, + { header: "Date", field: "date" }, + { header: "Type", field: "bank_deposite_type" }, + { header: "Note", field: "note" }, + { header: "Atm Commission", field: "atm_commission" }, + { header: "Amount", field: "amount" }, + ]; + return ( + <> + +
    +
    +
    ATM Deposit
    + +
    + + {showModalAtm && ( +
    +
    e.stopPropagation()} // Prevent close when clicking inside modal + style={{ + width: "700px", + backgroundColor: "white", + margin: "100px auto", + // padding: "20px", + borderRadius: "8px", + position: "relative", + boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", + }} + > +
    +
    + {isEditing ? "Edit ATM Deposit" : "Add ATM Deposit"} +
    + + + +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    + {isChecked && ( +
    + {/* USD Amount Field for ATM Commission */} +
    +
    +
    +
    + + USD + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + + /> +
    +
    +
    + + {/* Payment Method Radio Buttons */} +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    + {/* Bank Dropdown - only visible for Bank Card or Cheque */} + {(formData.pay_method === "bank" || formData.pay_method === "cheque") && ( +
    + +
    + )} + + {/* Cheque Number Input - only visible for Cheque */} + {formData.pay_method === "cheque" && ( +
    + +
    + )} +
    +
    +)} +
    + +
    + +
    +
    +
    +
    + + USD + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + )} + +
    + + ); +} diff --git a/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerBank.js b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerBank.js new file mode 100644 index 0000000..7b5dc1c --- /dev/null +++ b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerBank.js @@ -0,0 +1,620 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import React, { useState, useRef, useContext, useEffect } from "react"; +import { toast,ToastContainer } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../.././../utils/secure-route/AuthContext"; +import SettingTable from "../ManageSettings/SettingTable"; +import "./GeneralLedger.css"; +import Swal from "sweetalert2"; + +export default function GeneralLedgerBank() { + const { user } = useContext(AuthContext); + const { Get, Post, Delete , Put} = useApi(); + const storeid = user.store; + const [banks, setBanks] = useState(); + const [isEditing, setIsEditing] = useState(false); // Track if editing + const [currentRecord, setCurrentRecord] = useState(null); + const [showModal, setShowModal] = useState(false); + const [bankDeposits, setBankDeposits] = useState([]); // State to hold bank deposit records + + + const toggleModal = () => setShowModal(!showModal); + const [bankDeposit, setBankDeposit] = useState(); + const today = new Date().toISOString().split("T")[0]; + + const [formData, setFormData] = useState({ + store: storeid, + sr_no: "", + date: today, // default to today + transaction_type: "Bank Deposit", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + total_amount: "", + note: "", + bank_deposite_type: null, + owner: null, + }); + + + useEffect(() => { + + fetchBankData(); + }, []); + + const fetchBankData = async () => { + try { + const resp = await Get("transactionData"); + const filteredData = filterByTransactionType(resp, "Bank Deposit"); + setBankDeposit(filteredData); // Assuming this is for another purpose + setBankDeposits(filteredData); // Store the fetched deposits in state + } catch (error) { + console.error("Error fetching data:", error); + } + }; + + + + function filterByTransactionType(dataArray, transactionType) { + return dataArray.filter(record => record.transaction_type === transactionType); +} + const fetchBanks = async () => { + try { + const data = await Get("bank"); + setBanks(data); + } catch (error) { + console.error("Error fetching banks:", error); + } + }; + const handleDateChange = (e) => { + const { value } = e.target; + + // Ensure the date value is properly formatted to YYYY-MM-DD + setFormData((prevData) => ({ + ...prevData, + date: value, // This will be in the correct format for the + })); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + }; + + const handleTotalAmountChange = (e) => { + const { name, value } = e.target; + + // Update the state with the new value for the respective field + setFormData((prevData) => { + const newFormData = { ...prevData, [name]: value }; + + // Automatically calculate total_amount when either cash_amount or cheque_amount changes + if (name === "cash_amount" || name === "cheque_amount") { + const cashAmount = parseFloat(newFormData.cash_amount) || 0; + const chequeAmount = parseFloat(newFormData.cheque_amount) || 0; + newFormData.total_amount = cashAmount + chequeAmount; // Sum of cash_amount and cheque_amount + } + + return newFormData; + }); + }; + const handleBankDeposit = async (event) => { + event.preventDefault(); // Prevent page reload + const { sr_no, ...formDataWithoutSrNo } = formData; + + // Validation checks + if (!formData.cash_amount && !formData.cheque_amount) { + toast.error("Please Enter Cash Amount or Cheque Amount."); + return; + } + + // Ensure that if one field is provided, the other is also valid (greater than zero) + if (formData.cash_amount && parseFloat(formData.cash_amount) <= 0) { + toast.error("Cash Amount must be greater than 0."); + return; + } + + if (formData.cheque_amount && parseFloat(formData.cheque_amount) <= 0) { + toast.error("Cheque Amount must be greater than 0."); + return; + } + + // Check if the deposit type is selected + if (!formData.bank_deposite_type) { + toast.error("Please select a valid Deposit type."); + return; + } + + try { + const updatedFormData = { + ...formDataWithoutSrNo, + store: storeid, + pay_method_status: null, // Explicitly set to null + pay_method: null, // Explicitly set to null + }; + + let response; + if (isEditing) { + // If editing, perform an update request (PUT) + response = await Put("transactionData", currentRecord.id, updatedFormData); + + // Show success message only for update + toast.success("Bank Deposit updated successfully!"); + } else { + // If not editing, perform a create request (POST) + response = await Post("transactionData", updatedFormData); + + // Show success message only for addition + toast.success("Bank Deposit added successfully!"); + } + + if (response && (response.status === 200 || response.status === 201)) { + fetchBankData(); + + // Optionally, reset the form data after successful submission + setFormData({ + ...formData, + date: "", + amount: "", + total_amount: "", + cheque_no: "", + note: "", + owner: null, + store: storeid, + }); + } + setShowModal(false); // Close the modal after submission + } catch (error) { + console.error("Error submitting form:", error); + toast.error("Submission failed: " + error.message); + setShowModal(false); // Close the modal after an error + } + }; + + + // Edit function to open the modal with the selected record + const handleEditBankDeposit = (record) => { + setIsEditing(true); + setCurrentRecord(record); + setFormData({ + ...record, + date: record.date, + bank: record.bank || "", + note: record.note || "", + }); + handleModalToggle(); // Open the modal for editing + }; + + + + + const handleDeleteBankDeposit = async (id) => { + + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("transactionData", id); // Call delete API with the gas type ID + setBankDeposit((prevBankDeposit) => + prevBankDeposit.filter((bankdeposit) => bankdeposit.id !== id) + ); + toast.success("Bank Deposit deleted successfully"); + } catch (error) { + console.error("Error deleting Bank Deosit:", error); + toast.error("Error deleting Bank Deposit"); + } + }; + + const handleModalToggle = () => { + setShowModal(!showModal); + }; + + const resetFormData = () => { + setFormData({ + store: storeid, + sr_no: "", + date: today, // default to today + transaction_type: "Bank Deposit", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + total_amount: "", + note: "", + bank_deposite_type: null, + owner: null, + }); + setIsEditing(false); + setCurrentRecord(null); + }; + + + const openAddModal = async () => { + resetFormData(); // Reset the form data + + if (!showModal) { + try { + await fetchBanks(); // Call the bank API only if the modal is not already open + } catch (error) { + console.error("Error fetching banks:", error); + } + } + + handleModalToggle(); // Toggle the modal state + }; + + + const columns = [ + { header: "Sr", field: "sr_no" }, + { header: "Date", field: "date" }, + { header: "Bank", field: "bank_name" }, + { header: "Note", field: "note" }, + { header: "Type", field: "bank_deposite_type" }, + { header: "Cash Amount", field: "cash_amount" }, + { header: "Cheque Amount", field: "cheque_amount" }, + { header: "Total Amount", field: "total_amount" }, + ]; + return ( + <> + +
    +
    +
    Bank Deposit
    + +
    + + {showModal && ( +
    +
    e.stopPropagation()} + style={{ + width: "700px", + backgroundColor: "white", + margin: "100px auto", + // padding: "20px", + borderRadius: "8px", + position: "relative", + boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", + }} + > +
    +
    + {isEditing ? "Edit Bank Deposit" : "Add Bank Deposit"} + +
    + + + + +
    +
    +
    +
    + +
    +
    +
    + +
    + +
    + +
    +
    + +
    + {/* First Field */} +
    +
    +
    + + USD + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
    +
    + + {/* Second Field */} +
    +
    +
    + + USD + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
    +
    +
    + + {/* Third Field Centered */} +
    +
    +
    +
    + + USD + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
    +
    +
    + +
    + +
    + +
    + + +
    +
    +
    +
    +
    + )} + +
    + + ); +} diff --git a/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerBankLedger.js b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerBankLedger.js new file mode 100644 index 0000000..5a50491 --- /dev/null +++ b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerBankLedger.js @@ -0,0 +1,385 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useRef, useEffect,useContext } from "react"; + +import BankImage from "../../../../assets/img/bankImage.png"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import SettingTable from "../ManageSettings/SettingTable"; +import AuthContext from "../../.././../utils/secure-route/AuthContext"; +import { toast,ToastContainer } from "react-toastify"; +export default function GeneralLedgerBankLedger() { + const [billDate, setBillDate] = useState("2024-09-20"); // Example default date + const dateInputRef = useRef(null); + const { user } = useContext(AuthContext); + const { Post ,Get} = useApi(); + const [bankLedger, setBankLedger] = useState([]); + const [banks, setBanks] = useState([]); + const [selectedBank, setSelectedBank] = useState(""); + const [startDate, setStartDate] = useState(""); + const [endDate, setEndDate] = useState(""); + const storeid = user.store; + + const [bankBalances, setBankBalances] = useState({}); + + + useEffect(() => { + const fetchBankBalances = async () => { + try { + const response = await Post('bankLedger'); // Replace with your actual API endpoint + setBankBalances(response.data.total_current_balances); + + // Show success message + toast.success("Bank balances fetched successfully!"); + } catch (error) { + console.error('Error fetching bank balances:', error); + + // Show error message + toast.error("Error fetching bank balances. Please try again."); + } + }; + + + fetchBankBalances(); + }, []); + + const fetchBanks = async () => { + try { + const data = await Get("bank"); // Replace with your actual API call + setBanks(data); + } catch (error) { + console.error("Error fetching banks:", error); + } + }; + + const getBankLedger = async () => { + if (selectedBank && startDate && endDate) { + try { + const requestData = { + bank: selectedBank, + start_date: startDate, + end_date: endDate, + }; + + const response = await Post("bankLedger", requestData); + if (response.status === 200) { + const bankCashData = response.data.bank_cash || []; + setBankLedger(Array.isArray(bankCashData) ? bankCashData : []); + } else { + console.error("Error: Response status is not 200", response); + } + } catch (error) { + console.error("Error fetching bank ledger data:", error); + } + } + }; + useEffect(() => { + getBankLedger(); + fetchBanks(); + },[selectedBank, startDate, endDate]); + + const handleCashSubmit = async (e) => { + e.preventDefault(); // Prevents default page reload + // Create FormData object directly from the event target (form element) + const formData = new FormData(e.target); + // Convert FormData to a plain object + const payload = Object.fromEntries(formData.entries()); + payload.store = storeid; + payload.type = "bank_ledger"; + + await Post("bankCashAdjustmentData", payload).then((resp) => { + setShowModal(false); + }); + }; + + const handleDateChange = (event) => { + const selectedDate = event.target.value; + setBillDate(selectedDate); + console.log("Selected date:", selectedDate); + }; + + const openDatePicker = () => { + if (dateInputRef.current) { + dateInputRef.current.showPicker(); + } + }; + + const [showModal, setShowModal] = useState(false); + + const toggleModal = () => setShowModal(!showModal); + + const columns = [ + // { header: "No", field: "index" }, // Optional, you can generate index dynamically + { header: "Date", field: "date" }, + { header: "Invoice Number", field: "invoice_no" }, + { header: "Debit", field: "debit" }, + { header: "Credit", field: "credit" }, + { header: "Current Balance", field: "current_balance" }, + { header: "Reason", field: "reason" }, + ]; + + return ( + <> + +
    +
    +
    +
    +

    Bank Ledger

    + +
    + +
    + {Object.entries(bankBalances).map(([bankName, balance]) => ( +
    +
    +

    + {bankName} +

    +

    + Current Balance: ${balance.toFixed(2)} +

    +
    +
    + Bank Icon +
    +
    + ))} +
    + + +
    + {/* Bank Selection */} + + + {/* Start Date */} + setStartDate(e.target.value)} + style={{ + backgroundColor: "#0023000C", + borderRadius: "10px", + height: "52px", + }} + /> + + {/* End Date */} + setEndDate(e.target.value)} + style={{ + backgroundColor: "#0023000C", + borderRadius: "10px", + height: "52px", + }} + /> +
    + + + + {showModal && ( +
    +
    e.stopPropagation()} + style={{ width: "700px" }} + > +
    +
    + Adjust Balance +
    + + + + + {/* */} +
    +
    +
    +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + + /> +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + )} +
    +
    +
    + + ); +} diff --git a/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerCashLedger.js b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerCashLedger.js new file mode 100644 index 0000000..65f285b --- /dev/null +++ b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerCashLedger.js @@ -0,0 +1,497 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import React, { useState, useEffect, useContext } from "react"; +import SettingTable from "../ManageSettings/SettingTable"; +import tickets from "../../../../assets/img/tickets.png"; +import board from "../../../../assets/img/board.png"; +import cylinder from "../../../../assets/img/cylinder.png"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../.././../utils/secure-route/AuthContext"; +import { toast,ToastContainer } from "react-toastify"; +function GeneralLedgerCashLedger() { + const [showModal, setShowModal] = useState(false); + const { user } = useContext(AuthContext); + const [cashLedger, setCashLedger] = useState([]); + const [startDate, setStartDate] = useState(""); + const [endDate, setEndDate] = useState(""); + const [businessCash, setBusinessCash] = useState(); + const [gasCash, setCashCash] = useState(); + const [cashType, setCashType] = useState(""); + const [lottoCash, setLottoCash] = useState(); + const storeid = user.store; + const { Post } = useApi(); + + const [data, setData] = useState([]); + const cashTypeMapping = { + "Business cash": "business_cash", + "Gas cash": "gas_cash", + "Lottery cash": "lottery_cash", + }; + + const getCashLedger = async () => { + if (!startDate || !endDate || !cashType) return; + + const requestData = { + start_date: startDate, + end_date: endDate, + cash_type: cashType, + }; + + console.log("Request Data:", requestData); + + try { + const resp = await Post("cashLedger", requestData); + + // Update cash values + setBusinessCash(resp.data.current_business_cash); + setCashCash(resp.data.current_gas_cash); + setLottoCash(resp.data.current_lottery_cash); + + // Set all cash data + setData((dt) => [ + ...dt, + ...resp.data.business_cash, + ...resp.data.gas_cash, + ...resp.data.lottery_cash, + ]); + + // Filter data based on selected cash type + const CashData = resp.data[cashTypeMapping[cashType]] || []; + if (Array.isArray(CashData)) { + setCashLedger(CashData); + } else { + console.error("Error: Selected cash type data is not an array", CashData); + } + } catch (error) { + console.error("Error getting data", error); + } + }; + + useEffect(() => { + getCashLedger(); + }, [startDate, endDate, cashType]); // Monitor state changes + + const handleCashTypeChange = (e) => setCashType(e.target.value); + const handleStartDateChange = (e) => setStartDate(e.target.value); + const handleEndDateChange = (e) => setEndDate(e.target.value); + + + const toggleModal = () => setShowModal(!showModal); + + const handleCashSubmit = async (e) => { + e.preventDefault(); // Prevents default page reload + + // Create FormData object directly from the event target (form element) + const formData = new FormData(e.target); + + // Convert FormData to a plain object + const payload = Object.fromEntries(formData.entries()); + payload.store = storeid; + payload.type = "cash_ledger"; + + try { + const resp = await Post("bankCashAdjustmentData", payload); + + // Show success message + toast.success("Cash adjustment data submitted successfully!"); + + // Close modal + setShowModal(false); + } catch (error) { + // Handle error + if (error.response && error.response.data) { + // Optionally, handle specific error messages here + toast.error("Error submitting cash adjustment data: " + (error.response.data.message || "Unknown error")); + } else { + toast.error("Error submitting cash adjustment data!"); + } + } + }; + + + const columns = [ + { header: "Date", field: "date" }, + { header: "Invoice No", field: "invoice_no" }, + { header: "Debit", field: "debit" }, + { header: "Credit", field: "credit" }, + { header: "Current Balance", field: "curent_balance" }, + { header: "Reason", field: "reason" }, + ]; + + return ( + <> + +
    +
    +
    +
    +

    Cash Ledger

    + +
    + +
    + {/* Business Card */} +
    +
    +

    Business

    +

    + Current Balance: $ {businessCash} +

    +
    +
    + Business Icon +
    +
    + + {/* Lottery Card */} +
    +
    +

    Lottery

    +

    + Current Balance: $ {gasCash} +

    +
    +
    + Ticket Icon +
    +
    + + {/* Gas Card */} +
    +
    +

    Gas

    +

    + Current Balance: $ {lottoCash} +

    +
    +
    + Gas Icon +
    +
    +
    + {/*
    +
    + +
    + +
    + + +
    +
    */} +
    + + + {/* Start Date Input */} + + + {/* End Date Input */} + +
    + +
    +
    + + {/* Modal */} + {showModal && ( +
    +
    e.stopPropagation()} + style={{ + width: "700px", + backgroundColor: "white", + margin: "100px auto", + borderRadius: "8px", + position: "relative", + boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", + padding: "20px", + }} + > +
    +
    + Adjust Cash +
    + + + +
    + +
    +
    +
    +
    + +
    + +
    + +
    + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + + /> +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + )} +
    + + ); +} +export default GeneralLedgerCashLedger; diff --git a/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerOtherIncome.js b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerOtherIncome.js new file mode 100644 index 0000000..101d14d --- /dev/null +++ b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerOtherIncome.js @@ -0,0 +1,594 @@ +/* eslint-disable no-mixed-operators */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import React, { useState, useRef, useContext, useEffect } from "react"; +import { toast, ToastContainer } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../.././../utils/secure-route/AuthContext"; +import SettingTable from "../ManageSettings/SettingTable"; +import "./GeneralLedger.css"; +import Swal from "sweetalert2"; + + +export default function GeneralLedgerOtherIncome() { + const { user } = useContext(AuthContext); + const { Get, Post, Delete, Put } = useApi(); + const storeid = user.store; + const [banks, setBanks] = useState(); + const [isEditing, setIsEditing] = useState(false); // Track if editing + const [currentRecord, setCurrentRecord] = useState(null); + const [showModal, setShowModal] = useState(false); + const [otherIncomeType, setOtherIncomeType] = useState(); + + const toggleModal = () => setShowModal(!showModal); + const [otherIncome, setOtherIncome] = useState(); + + const handleToggleModal = () => { + if (showModal) { + // Reset form data and editing state when closing modal + setFormData({ + store: storeid, + sr_no: "", + date: today, + transaction_type: "Other Income", + bank: "", + amount: "", + + cash_amount: "", + cheque_amount: "", + total_amount: "", + note: "", + owner: null, + income_type: "", + income_type_title: "", + }); + setIsEditing(false); // Reset to not editing + } + setShowModal(!showModal); + }; + const handleAddOtherIncome = async () => { + try { + // Fetch other income types when the button is clicked + await fetchOtherIncomeType(); + await fetchBanks(); + } catch (error) { + console.error("Error fetching other income types:", error); + } + + // Reset editing state and form data + setIsEditing(false); + setFormData({ + store: storeid, + sr_no: "", + date: today, + transaction_type: "Other Income", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + total_amount: "", + note: "", + owner: null, + income_type: "", + income_type_title: "", + }); + + // Open the modal + setShowModal(true); + }; + + useEffect(() => { + fetchOtherIncomeData(); + }, []); + + + const fetchOtherIncomeData = async () => { + try { + const otherIncomeResponse = await Get("transactionData"); + setOtherIncome(filterByTransactionType(otherIncomeResponse, "Other Income")); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + + + function filterByTransactionType(dataArray, transactionType) { + return dataArray.filter(record => record.transaction_type === transactionType); + } + const fetchBanks = async () => { + try { + const data = await Get("bank"); + setBanks(data); + } catch (error) { + console.error("Error fetching banks:", error); + } + }; + const fetchOtherIncomeType = async () => { + try { + const data = await Get("otherIncomeData"); + setOtherIncomeType(data); + } catch (error) { + console.error("Error fetching banks:", error); + } + }; + const handleDateChange = (e) => { + const { value } = e.target; + + // Ensure the date value is properly formatted to YYYY-MM-DD + setFormData((prevData) => ({ + ...prevData, + date: value, // This will be in the correct format for the + })); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + + if (name === 'amount') { + // Allow only numeric characters and limit to 10 digits + const numericValue = value.replace(/[^0-9]/g, '').slice(0, 10); + setFormData((prevData) => ({ + ...prevData, + [name]: numericValue, + })); + } else { + // For other fields, handle normally (no validation) + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + } + }; + + const handleIncomeChange = (e) => { + const { name, value } = e.target; + + if (name === "income_type_title") { + const selectedIncome = otherIncomeType?.find( + (income) => income.income_type_title === value + ); + + // If no match is found, log a message to debug and set a default value for income_type + if (!selectedIncome) { + console.warn(`Income type for "${value}" not found.`); + } + + setFormData((prevData) => ({ + ...prevData, + [name]: value, + income_type: selectedIncome ? selectedIncome.income_type : "", // Ensure fallback to empty string if not found + })); + } else { + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + } + }; + + const today = new Date().toISOString().split("T")[0]; + + const [formData, setFormData] = useState({ + store: storeid, + sr_no: "", + date: today, // default to today + transaction_type: "Other Income", + bank: "", + amount: "", + cash_amount: "", + cheque_amount: "", + + total_amount: "", + note: "", + owner: null, + income_type: "", // Initialize as empty string + income_type_title: "", // Initialize as empty string + }); + + const handleOtherIncome = async (event) => { + event.preventDefault(); + const { sr_no, bank_deposite_type, ...updatedFormData } = formData; + + updatedFormData.other_income = updatedFormData.income_type_title; + updatedFormData.pay_method_status = null; + + + const cleanedFormData = Object.fromEntries( + Object.entries(updatedFormData).filter( + ([key, value]) => + value !== "" && value !== null || key === "pay_method_status" + ) + ); + + if (!formData.amount) { + toast.error("Please enter amount") + return; + } + if (formData.pay_method === "cheque") { + if (!formData.bank) { + toast.error("Please select a Bank."); + return; + } + if (!formData.cheque_no) { + toast.error("Please enter cheque no"); + return; + } + + } + if (formData.pay_method === "bank") { + if (!formData.bank) { + toast.error("Please select a Bank."); + return; + } + } + + console.log("Payload being sent:", cleanedFormData); + + try { + let response; + if (isEditing) { + response = await Put("transactionData", currentRecord.id, updatedFormData); + toast.success("Other Income updated successfully!"); + } else { + response = await Post("transactionData", updatedFormData); + toast.success("Other Income added successfully!"); + } + + if (response && (response.status === 200 || response.status === 201)) { + setShowModal(false); + fetchOtherIncomeData(); + } + } catch (error) { + console.error("Error submitting form:", error); + toast.error("Submission failed: " + error.message); + } + }; + + + // Edit handler remains unchanged + const handleEditOtherIncome = (record) => { + setIsEditing(true); + setCurrentRecord(record); + setFormData({ + ...record, + date: record.date, + bank: record.bank || "", + income_type_title: record.other_income || "", + other_commission: record.other_commission || "", + note: record.note || "", + }); + setShowModal(true); // Open the modal for editing + }; + + const handleDeleteOtherIncome = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("transactionData", id); // Call delete API with the gas type ID + setOtherIncome((prevotherIncome) => + prevotherIncome.filter((otherincome) => otherincome.id !== id) + ); + toast.success("other income deleted successfully"); + } catch (error) { + console.error("Error deleting other Income:", error); + toast.error("Error deleting other Income"); + } + }; + const columns = [ + { header: "SR", field: "sr_no" }, + { header: "Date", field: "date" }, + { header: "Amount", field: "amount" }, + { header: "Type", field: "other_income" }, + { header: "Payment Type", field: "pay_method" }, + { header: "Note", field: "note" }, + ]; + + return ( + <> + +
    +
    +
    Other Income
    + +
    + + {showModal && ( +
    +
    e.stopPropagation()} + style={{ + width: "700px", + backgroundColor: "white", + margin: "100px auto", + // padding: "20px", + borderRadius: "8px", + position: "relative", + boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", + }} + > +
    +
    + {isEditing ? "Edit Other Income" : "Add Other Income"} +
    + + + + + + + {/* */} + +
    +
    +
    +
    + +
    + +
    + + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    + {/* Bank dropdown - only visible for Bank Card or Cheque */} + {(formData.pay_method === "bank" || + formData.pay_method === "cheque") && ( +
    + +
    + )} + + {/* Cheque number input - only visible for Cheque */} + {formData.pay_method === "cheque" && ( +
    + +
    + )} +
    +
    + +
    +
    +
    +
    +
    + USD +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
    +
    +
    + +
    + + +
    +
    +
    +
    +
    + )} + +
    + + ); +} diff --git a/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerOwnerDistribution.js b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerOwnerDistribution.js new file mode 100644 index 0000000..05c4f0e --- /dev/null +++ b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerOwnerDistribution.js @@ -0,0 +1,564 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-self-compare */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import SettingTable from "../ManageSettings/SettingTable"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../.././../utils/secure-route/AuthContext"; +import { toast, ToastContainer } from "react-toastify"; +import Swal from "sweetalert2"; + +export default function OwnerDistribution() { + const { Post, Get, Delete, Put } = useApi(); + const { user } = useContext(AuthContext); + const storeid = user.store; + + // State for data and modal + const [distributions, setDistributions] = useState([]); + const [showModal, setShowModal] = useState(false); + const [isEditing, setIsEditing] = useState(false); + const [ownerList, setOwnerList] = useState([]); + const [banks, setBanks] = useState([]); + + // Form data state + const [formData, setFormData] = useState({ + date: "", + transaction_type: "Owner Distributions", + owner: "", + pay_method: "", + bank: "", + pay_method_status:"", + cheque_no: "", + note: "", + amount: "", + }); + + // Columns for the table + const columns = [ + { header: "Date", field: "date" }, + { header: "Owner", field: "owner_name" }, + { header: "Payment Method", field: "pay_method" }, + { header: "Amount", field: "amount" }, + { header: "Bank", field: "bank_name" }, + { header: "Cheque No", field: "cheque_no" }, + { header: "Notes", field: "note" }, + ]; + + // Fetch initial data + useEffect(() => { + fetchOwnerDistributions(); + fetchOwnerList(); + fetchBanks(); + }, []); + + const fetchOwnerDistributions = async () => { + try { + // Fetch transaction data from the API + const response = await Get("transactionData"); + + // Filter the data to get only "ATM Deposit" transactions + const filteredDistributions = filterByTransactionType(response, "Owner Distributions"); + setDistributions(filteredDistributions); // Update state with the filtered data + + + } catch (err) { + // Handle errors that occur during the fetch or processing + console.error("Error fetching owner distributions:", err); + toast.error("Failed to fetch owner distributions"); // Display error message to the user + setDistributions([]); // Set state to an empty array on error + } + }; + + function filterByTransactionType(dataArray, transactionType) { + return dataArray.filter(record => record.transaction_type === transactionType); + } + const fetchOwnerList = async () => { + try { + const response = await Get("user"); + + // Check if the response has the structure with `results` + if (response && Array.isArray(response.results)) { + // Filter only store owners + const storeOwners = response.results.filter( + owner => owner.ms_role_name === "store owner" + ); + setOwnerList(storeOwners); + } else { + console.error("Invalid response structure:", response); + toast.error("Failed to fetch owner list"); + } + } catch (err) { + console.error("Error fetching owner list:", err); + toast.error("Failed to fetch owner list"); + } + }; + + + const fetchBanks = async () => { + try { + const response = await Get("bank"); + + + if (response && Array.isArray(response) && response.length > 0) { + // Directly setting the banks data + setBanks(response); + } else { + toast.error("No bank data found"); + } + } catch (err) { + console.error("Error fetching banks:", err); + toast.error("Failed to fetch bank list"); + } + }; + + + const today = new Date().toISOString().split("T")[0]; + // Toggle Modal + const toggleModal = () => { + setShowModal(!showModal); + if (!showModal) { + // Reset form when opening modal + setFormData({ + date: today, + owner: "", + pay_method: "", + bank: "", + cheque_no: "", + pay_method_status:"", + note: "", + amount: "", + }); + setIsEditing(false); + } + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData(prevState => { + const updatedFormData = { + ...prevState, + [name]: value + }; + + // Log the pay_method when it changes + if (name === "pay_method") { + console.log("Pay method updated to:", updatedFormData.pay_method); + + } + + return updatedFormData; + }); + }; + + + // Handle date change + const handleDateChange = (e) => { + const { value } = e.target; + + // Ensure the date value is properly formatted to YYYY-MM-DD + setFormData((prevData) => ({ + ...prevData, + date: value, // This will be in the correct format for the + })); + }; + const handleOwnerDistribution = async (e) => { + e.preventDefault(); + + + formData.pay_method_status = null; + // Validate form data + if (!formData.date || !formData.owner || !formData.pay_method || !formData.amount) { + toast.error("Please fill in all required fields"); + return; + } + + // Find the owner by full name + let selectedOwner = ownerList.find(owner => + `${owner.first_name} ${owner.last_name}`.trim().toLowerCase() === formData.owner.trim().toLowerCase() + ); + + // If no full name match, try matching by first name + if (!selectedOwner) { + selectedOwner = ownerList.find(owner => + owner.first_name.trim().toLowerCase() === formData.owner.trim().toLowerCase() + ); + } + + // Prepare the payload with the owner details + const payload = { + ...formData, + transaction_type: "Owner Distributions", + store: storeid, + owner_name: formData.owner, + owner: selectedOwner ? selectedOwner.id : null, + pay_method_status: null + }; + + + Object.keys(payload).forEach(key => { + if ((payload[key] === undefined || payload[key] === null) && key !== "pay_method_status") { + delete payload[key]; + } + }); + + try { + let response; + + if (isEditing && formData.id) { + // Update existing distribution (PUT request) + response = await Put(`transactionData`, formData.id, payload); + } else { + // Create new distribution (POST request) + response = await Post("transactionData", payload); + } + + if (response) { + toast.success(isEditing ? "Distribution Updated" : "Distribution Added"); + fetchOwnerDistributions(); // Refresh the list + toggleModal(); // Close modal + } else { + toast.error("Failed to submit distribution"); + } + } catch (err) { + console.error("Error submitting owner distribution:", err); + toast.error("Error submitting distribution"); + } + }; + + const handleEditDistribution = (distribution) => { + // Find the owner based on the owner_name in the distribution + const selectedOwner = ownerList.find(owner => + `${owner.first_name} ${owner.last_name}`.trim().toLowerCase() === distribution.owner_name.trim().toLowerCase() + ); + + // Prepare the form data for editing + setFormData({ + ...distribution, + // Explicitly set the owner to the full name + owner: distribution.owner_name, + // Ensure other fields are correctly mapped + date: distribution.date, + amount: distribution.amount, + pay_method: distribution.pay_method, + bank: distribution.bank, + cheque_no: distribution.cheque_no, + note: distribution.note + }); + + setIsEditing(true); + setShowModal(true); + }; + + const handleDeleteDistribution = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("transactionData", id); + + setDistributions((prevDistributions) => + prevDistributions.filter((distribution) => distribution.id !== id) + ); + + toast.success("Owner Distribution deleted successfully"); + } catch (error) { + // Log the error and show an error message + console.error("Error deleting Owner Distribution:", error); + toast.error("Error deleting Owner Distribution"); + } + }; + + + return ( + <> + +
    +
    +
    +
    +

    Owner Distribution

    + +
    + + + + {/* Modal content remains the same as in the previous version */} + {showModal && ( +
    + +
    e.stopPropagation()} + style={{ + width: "700px", + backgroundColor: "white", + margin: "100px auto", + borderRadius: "8px", + position: "relative", + boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", + }} + > +
    +
    + {isEditing ? "Edit Owner Distribution" : "Add Owner Distribution"} +
    + + + + +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    + {(formData.pay_method === "bank" || formData.pay_method === "cheque") && ( +
    + +
    + )} + + {formData.pay_method === "cheque" && ( +
    + +
    + )} +
    + +
    + +
    + +
    +
    +
    +
    + USD +
    + +
    +
    +
    + +
    + + +
    +
    +
    +
    +
    + )} +
    +
    +
    + + ); +} \ No newline at end of file diff --git a/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerSalesTax.js b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerSalesTax.js new file mode 100644 index 0000000..2031af1 --- /dev/null +++ b/src/components/Pages/AppPAges/GeneralLedger/GeneralLedgerSalesTax.js @@ -0,0 +1,349 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import SettingTable from "../ManageSettings/SettingTable"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../.././../utils/secure-route/AuthContext"; +import { toast,ToastContainer } from "react-toastify"; +export default function GeneralLedgerSalesTax() { + // const [billDate, setBillDate] = useState("2024-09-20"); // Example default date + // const dateInputRef = useRef(null); + const [tax, setTax] = useState([]); + const { Post } = useApi(); + const { user } = useContext(AuthContext); + // State for selected month and year + const [selectedMonth, setSelectedMonth] = useState(getCurrentDateInfo("month")); + const [selectedYear, setSelectedYear] = useState(getCurrentDateInfo("year")); + const storeid = user.store; + + function getCurrentDateInfo(type) { + const currentDate = new Date(); + + if (type === "month") { + const monthNames = [ + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + ]; + return monthNames[currentDate.getMonth()]; // Returns month as string + } else if (type === "year") { + return currentDate.getFullYear().toString(); // Returns year as string + } else { + return "Invalid type. Use 'month' or 'year'."; + } + } + + + // Modify the getSalesTax function to use selected month and year + const getSalesTax = async () => { + try { + const requestData = { + months: selectedMonth, // Use the selected month + year: selectedYear, // Use the selected year + }; + + const response = await Post("salesTax", requestData); + + if (response && response.status === 200) { + setTax(Array.isArray(response.data) ? response.data : [response.data]); + } else { + // Handle error response here (optional) + } + } catch (err) { + // Handle error here + console.error("Error fetching sales tax:", err); + } + }; + + const [showModal, setShowModal] = useState(false); + // Fetch the sales tax data when selectedMonth or selectedYear changes + useEffect(() => { + getSalesTax(); // Fetch data whenever the selected month/year changes + }, [selectedMonth, selectedYear, showModal]); // Re-fetch data when selectedMonth or selectedYear changes + + const toggleModal = () => setShowModal(!showModal); + const columns = [ + { header: "Collected Tax", field: "collected_tax" }, + { header: "Taxable Sales", field: "taxable_sales" }, + { header: "Mon Taxable Sales", field: "mon_taxable_sales" }, + { header: "Total Net Sales", field: "total_net_sales" }, + { header: "Prepaid Tax", field: "prepaid_tax" }, + { header: "Due Tax", field: "due_tax" }, + ]; + + // Array for months (used in the select dropdown) + const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + // Array for years (you can modify this as needed) + const currentYear = new Date().getFullYear(); + const years = Array.from({ length: 10 }, (_, index) => currentYear - index); + + useEffect(()=>{ + setSelectedMonth(getCurrentDateInfo("month")) + setSelectedYear(getCurrentDateInfo("year")) + },[]) + + const handlePrepaidTaxSubmit = async (e) => { + e.preventDefault(); // Prevents default page reload + // Create FormData object directly from the event target (form element) + const formData = new FormData(e.target); + // Convert FormData to a plain object + const payload = Object.fromEntries(formData.entries()); + payload.store = storeid; + payload.month = selectedMonth.toLowerCase(); + payload.year = selectedYear; + + const prepaidTaxAmount = parseFloat(payload.prepaid_tax); + if (isNaN(prepaidTaxAmount) || prepaidTaxAmount < 0) { + toast.error("Please enter a valid prepaid tax amount."); + return; + } + await Post("prepaidTaxData", payload) + .then((resp) => { + setShowModal(false); + }) + .catch((err) => { + console.error(err); + }); + }; + + return ( + <> + +
    +
    +
    +
    +

    Sales Tax

    + +
    + +
    + + + +
    + + + + {showModal && ( +
    +
    e.stopPropagation()} + style={{ width: "740px" }} + > +
    +
    + Add Prepaid Tax +
    + + + + + + {/* */} +
    +
    +
    +
    +
    + +
    + + +
    + +
    +
    +
    +
    + + USD + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    + )} +
    +
    +
    + + ); +} diff --git a/src/components/Pages/AppPAges/Lottery/BookMovement.js b/src/components/Pages/AppPAges/Lottery/BookMovement.js new file mode 100644 index 0000000..0777d5c --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/BookMovement.js @@ -0,0 +1,53 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect } from "react"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import LotteryInventoryTable from "./LotteryInventoryTable"; +function BookMovement() { + const [games, setGames] = useState([]); + const { Get } = useApi(); + + const fetchGameData = async () => { + try { + const response = await Get("getBookMovement"); + setGames(response.lottery_inventory); // Accessing the lottery_inventory from the response + } catch (error) { + console.error("Error fetching game data:", error); + // Optionally show an error message or toast + } + }; + + useEffect(() => { + fetchGameData(); + }, []); + + const columns = [ + { header: "Date", field: "active_date" }, + { header: "Game No", field: "game_no" }, + { header: "Game Name", field: "game_name" }, + { header: "Game Price", field: "game_price" }, + { header: "Book No", field: "book_no" }, + { header: "Receive Date", field: "game_receive_date" }, + { header: "Activated Date", field: "active_date" }, + { header: "Settlement Date", field: "instant_settlement_date" }, + { header: "Status", field: "status" }, + ]; + + + return ( +
    +
    +
    Book Movement
    +
    + handleShowUserModal(handleEdit)} // Open modal for editing user + // onDelete={handleDelete} + /> +
    + ); +} + +export default BookMovement; diff --git a/src/components/Pages/AppPAges/Lottery/Lottery.css b/src/components/Pages/AppPAges/Lottery/Lottery.css new file mode 100644 index 0000000..2b2fc79 --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/Lottery.css @@ -0,0 +1,154 @@ +.lottery-table-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + border-radius: 10px; + margin: 30px auto; + background-color: #ffffff; + width: 1600px; + max-width: 100%; +} +.lottery-weekly-add-button { + padding: 8px 16px; + background-color: #4545db; /* Bootstrap primary color */ + color: white; + border: none; + border-radius: 40px; + cursor: pointer; + width: 344px; + height: 42px; + font-size: 18px; +} +.lottery-book-settle-button { + padding: 8px 16px; + background-color: #4545db; /* Bootstrap primary color */ + color: white; + border: none; + border-radius: 40px; + cursor: pointer; + width: 324px; + height: 42px; + font-size: 18px; +} +/*========================================Manage Game=========================================================================*/ +.lottery-game-add-button { + padding: 8px 16px; + background-color: #4545db; /* Bootstrap primary color */ + color: white; + border: none; + border-radius: 40px; + cursor: pointer; + width: 204px; + height: 42px; + font-size: 18px; +} +/*========================================================== lottry popupcard=========================================*/ +.card { + border: 1px solid #ccc; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.input-field { + border: 1px solid #ccc; + border-radius: 4px; + padding: 8px; + box-sizing: border-box; /* Ensures padding is included in total width */ +} +/*=========================lotteryinventorytablecss*/ +/* styles.css */ +.rounded-table { + border-radius: 20px; + overflow: hidden; + border: 1px solid #ccc; +} +.table-head { + background-color: #f4f4f4; +} +.table-head th { + padding: 10px; + font-size: 18px; + font-weight: 600; +} +.table-body td { + font-size: 16px; + padding: 10px; +} +/*============================================scanned data=========================================================================*/ +.lottery-game-details { + padding: 15px; + border: 2px solid #f4f4f4; +} + +.game-details-row { + display: flex; + align-items: center; + gap: 8px; /* Reduced space between elements */ + flex-wrap: wrap; /* Allow elements to wrap to the next line on smaller screens */ +} + +.game-details-cell { + display: flex; + flex-direction: column; + margin-bottom: 10px; /* Adds spacing between rows */ + width: 12%; /* Adjust width for normal screens */ +} + +/* Media queries for responsiveness */ +@media (max-width: 1200px) { + .game-details-cell { + width: 18%; /* Increase width on medium screens */ + } +} + +@media (max-width: 992px) { + .game-details-row { + gap: 5px; /* Reduce space between elements */ + } + + .game-details-cell { + width: 22%; /* Increase width for smaller devices */ + } +} + +@media (max-width: 768px) { + .game-details-row { + flex-direction: column; /* Stack the form inputs vertically */ + align-items: flex-start; /* Align items to the left */ + gap: 12px; /* Add more space between rows */ + } + + .game-details-cell { + width: 100%; /* Make each input take full width */ + } + + .input-field, + .input-game { + width: 100%; /* Inputs take full width */ + } + + .btn-activate { + width: 100%; /* Make the button take full width */ + margin-left: 0; /* Remove the left margin */ + } +} + +@media (max-width: 480px) { + .game-details-row { + gap: 8px; /* Adjust the gap for small screens */ + } + + .game-details-cell { + width: 100%; /* Stack items vertically and take full width */ + } + + .input-field, + .input-game { + width: 100%; /* Inputs will fill the available space */ + } + + .btn-activate { + width: 100%; /* Button takes full width on small screens */ + } +} diff --git a/src/components/Pages/AppPAges/Lottery/LotteryBookOnHold.js b/src/components/Pages/AppPAges/Lottery/LotteryBookOnHold.js new file mode 100644 index 0000000..2601b11 --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/LotteryBookOnHold.js @@ -0,0 +1,13 @@ +import React from 'react' + +function LotteryBookOnHold() { + return ( +
    +
    +
    Lottery Book On Hold
    +
    +
    + ) +} + +export default LotteryBookOnHold \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Lottery/LotteryInventory.js b/src/components/Pages/AppPAges/Lottery/LotteryInventory.js new file mode 100644 index 0000000..55f5efc --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/LotteryInventory.js @@ -0,0 +1,636 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useEffect, useState, useContext } from "react"; +import SettingTable from "../ManageSettings/SettingTable"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import { toast, ToastContainer } from "react-toastify"; +import "./Lottery.css"; +import ReusableModal from "../ManageSettings/ReusableModal"; +import ManageGameModal from "../ReusableForm/ManageGameModal"; +import Swal from "sweetalert2"; + +function LotteryInventory() { + const [games, setGames] = useState([]); + const { Get, Post, Delete } = useApi(); + const [showModal, setShowModal] = useState(false); + const [lotteryGameAdd, setLotteryGamesAdd] = useState([]); + const [selectedDate, setSelectedDate] = useState(""); + const [scanNumber, setScanNumber] = useState(""); + + const [isGameFound, setIsGameFound] = useState(false); + const [gameNo, setGameNo] = useState(); + const [bookNo, setBookNo] = useState(); + const [gamePrice, setGamePrice] = useState(); + const [gameTotalTickets, setGameTotalTickets] = useState(); + const [gameTotalPrice, setGameTotalPrice] = useState(); + const [gameId, setGameId] = useState(); + + const [debounceTimeout, setDebounceTimeout] = useState(null); + const [gameName, setGameName] = useState(); + let { user } = useContext(AuthContext); + + const [showModalGame, setShowModalGame] = useState(false); // Modal state + const handleShowGame = () => setShowModalGame(true); // Show modal + const handleCloseGame = () => { + setShowModalGame(false); + makeBlank(); + }; // Close modal + const [lotteryGameData, setLotteryGameData] = useState(null); + const [formData, setFormData] = useState({ + inventory_date: "", + lottery_game: "", + book_no: "", + // game_name:"" + }); + + const activateBook = async (data) => { + await Get("isShiftActive").then(async (response) => { + const payload = { + game_no: data.game_no, + book_no: data.book_no, + active_date: selectedDate, + status: "activated", + activated_book_shift: response.shift_id, + }; + await Post("updateGameAndInventory", payload).then((response) => { + fetchGameData(); + toast.success("Book activated"); + }); + }); + }; + const columns = [ + { header: "Date", field: "inventory_date" }, + { header: "Game No", field: "game_no" }, + { header: "Game Name", field: "game_name" }, + { header: "None Active Books", field: "book_no" }, + { header: "Game Price", field: "game_price" }, + { header: "Total Value", field: "game_total_price" }, + ]; + const columns2 = [ + { header: "Date Added", field: "game_receive_date" }, + { header: "Scan No", field: "scan_no" }, + { header: "Game No", field: "game_no" }, + { header: "Game Price", field: "game_price" }, + { header: "Status", field: "status" }, + ]; + + const storeId = user.store; + function filterBooksByStatus(dataArray, transactionType) { + return dataArray.filter((record) => record.status === transactionType); + } + const fetchGameData = async () => { + try { + const response = await Get("lotteryInventoryData"); + setGames(filterBooksByStatus(response, "non activated")); + } catch (error) { + console.error("Error fetching game data:", error); + // toast.error("Error fetching game data."); + } + }; + + const fetchGameID = async () => { + try { + const response = await Get("lotteryGameData"); + setLotteryGamesAdd(response); // Store game options separately + } catch (error) { + console.error("Error fetching game data:", error); + } + }; + + useEffect(() => { + fetchGameData(); + fetchGameID(); + const today = new Date().toISOString().split("T")[0]; // Format today's date as YYYY-MM-DD + setSelectedDate(today); + }, []); + useEffect(() => { + fetchLotteryGameData(); + }, [gameNo]); + + const makeBlank = () => { + setScanNumber(""); + setIsGameFound(false); + setGameNo(""); + setBookNo(""); + setGameName(""); + setFormData({ + inventory_date: "", + lottery_game: "", + book_no: "", + // game_name:"" + }); + setLotteryGameData({}); + }; + + // Handle date change + const handleDateChange = (e) => { + setSelectedDate(e.target.value); // Update the state when the user selects a date + }; + const handleShow = () => setShowModal(true); + const handleClose = () => { + setShowModal(false); + }; + + // Handle input changes + const handleInputChange = (e) => { + const { id, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [id]: value, + })); + }; + + function getTicketWithGameAndBook(input) { + // Convert the input to a string + let str = input.toString().slice(0, 14); + // Extract parts of the string + let start = str.slice(0, 3); // First 3 digits + let middle = str.slice(4, -4); // Middle part (excluding first 3 and last 3 digits) + let end = str.slice(-3); // Last 3 digits + // Combine with "-" separators + let obj = { + gameNo: start, + bookNo: middle, + ticket_no: end, + }; + return obj; + } + + const handleScanAddGame = async () => { + // Find the ID that matches the entered game name + + const newGame = { + inventory_date: selectedDate, + lottery_game: gameId, // Use the matched game ID + book_no: bookNo, + game_name: gameName, + store: storeId, + scan_no: formatString(scanNumber), + }; + + function formatString(input) { + // Convert the input to a string + let str = input.toString().slice(0, 14); + // Extract parts of the string + let start = str.slice(0, 3); // First 3 digits + let middle = str.slice(4, -4); // Middle part (excluding first 3 and last 3 digits) + let end = str.slice(-3); // Last 3 digits + // Combine with "-" separators + return `${start}-${middle}-${end}`; + } + + try { + await Post("lotteryInventoryData", newGame) + .then((resp) => { + toast.success("Game added successfully"); + makeBlank(); + }) + .catch((err) => { + makeBlank(); + console.error(err); + toast.error("Unable to add game."); + }); + await fetchGameData(); // Fetch the latest data immediately + } catch (error) { + makeBlank(); + toast.error("Error adding game"); + } + }; + + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("lotteryInventoryData", id); // Call delete API with the game ID + setGames((prevGames) => prevGames.filter((game) => game.id !== id)); + toast.success("Game deleted successfully"); + } catch (error) { + toast.error("Error deleting game"); + } + }; + + const checkScannedNumber = async (GameNo) => { + try { + await Post("checkForGames", { game_no: GameNo }).then((resp) => { + if (resp.status === 200) { + let gameObj = resp.data[0]; + setIsGameFound(true); + setGameNo(gameObj.game_no); + setGameName(gameObj.game_name); + setGamePrice(gameObj.value); + setGameTotalTickets(gameObj.total_no_of_tickets); + setGameTotalPrice(gameObj.total_value); + setGameId(gameObj.id); + } + }); // Call your API to check for games + } catch (error) { + console.error("Error fetching game data:", error); + + setIsGameFound(false); + handleShowGame(); + setScanNumber(""); + + // toast.error("Error checking scanned number."); // Show an error toast if the API fails + } + }; + + const checkScannedNumberManual = async (GameNo) => { + try { + if (GameNo.length < 3) return; + await Post("checkForGames", { game_no: GameNo }).then((resp) => { + let gameObj = resp.data[0]; + setIsGameFound(true); + setGameNo(gameObj.game_no); + setGameName(gameObj.game_name); + setGamePrice(gameObj.value); + setGameTotalTickets(gameObj.total_no_of_tickets); + setGameTotalPrice(gameObj.total_value); + setGameId(gameObj.id); + }); + } catch (error) { + console.error("Error fetching game data:", error); + + setIsGameFound(false); + handleShowGame(); + setScanNumber(""); + + // toast.error("Error checking scanned number."); // Show an error toast if the API fails + } + }; + + const handleScanNumberChange = (e) => { + // 40301394400391010070000000068 + // 403-139440-039 + const newScanNumber = e.target.value; + setScanNumber(newScanNumber); + if (debounceTimeout) { + clearTimeout(debounceTimeout); + } + if (newScanNumber.length >= 14) { + // const _gameNo = + // newScanNumber.substring(4, 7).toString().replace(/^0+/, "") || "0"; + // const _bookNo = newScanNumber.substring(7, 14); + + const _gameNo = getTicketWithGameAndBook(newScanNumber).gameNo; + const _bookNo = getTicketWithGameAndBook(newScanNumber).bookNo; + // alert(JSON.stringify(getTicketWithGameAndBook(newScanNumber))) + setGameNo(_gameNo); + setBookNo(_bookNo); + const timeout = setTimeout(() => { + checkScannedNumber(_gameNo); + }, 500); + setDebounceTimeout(timeout); + } + }; + + const fetchLotteryGameData = async () => { + try { + await Get("lotteryGameData") + .then((resp) => { + if (resp && Array.isArray(resp)) { + setLotteryGameData(resp[0]); + } + }) + .catch((err) => { + toast.error("No data found for the lottery game."); + }); // Call the lotteryGameData API + } catch (error) { + console.error("Error fetching lottery game data:", error); + toast.error("Error fetching lottery game data."); + } + }; + + return ( + <> + +
    +
    +
    Lottery Inventory
    + +
    +
    +

    Lottery Activated Books

    +
    +
    +
    +

    Scan Now

    +
    +
    +

    Manually

    +
    +
    +
    +
    +
    +
    + + + {/* */} + + +
    +
    +
    +
    +
    + + + {!isGameFound ? ( + setShowModalGame(true)} + > + Add new game + + ) : ( + "" + )} +
    +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, "") // Remove non-numeric characters except the decimal point + + .slice(0, 6); + }} + onBlur={(e) => { + checkScannedNumberManual(e.target.value); + }} + onChange={handleInputChange} + /> +
    +
    + setBookNo(e.target.value)} + onChange={handleInputChange} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, "") // Remove non-numeric characters except the decimal point + + .slice(0, 6); + }} + /> + {/* */} +
    +
    + + {isGameFound && lotteryGameData && ( +
    +
    +
    + Game No + {gameNo} + {/* + setFormData({ ...formData, game_no: gameNo }) + } + /> */} +
    +
    + Game Name + {gameName} + {/* + setFormData({ ...formData, game_name: gameName}) + } + /> */} +
    +
    + Game Price {gamePrice} +
    +
    + Total Value {gamePrice * gameTotalTickets} +
    +
    + Inventory Date + + setFormData({ + ...formData, + inventory_date: e.target.value, + }) + } + /> +
    +
    + Book Number + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, "") // Remove non-numeric characters except the decimal point + .slice(0, 6); + }} + onBlur={(e) => setBookNo(e.target.value)} + onChange={handleInputChange} + id="book_no" + /> +
    +
    + +
    +
    +
    + )} +
    +
    +

    Non Active Books

    +
    +
    + +
    { + e.preventDefault(); + // handleSave(); + }} + > +
    + + setVendorName(e.target.value)} + style={{ + width: "270px", + marginRight: "10px", + height: "44px", + }} + /> + setVendorName(e.target.value)} + style={{ + width: "270px", + marginRight: "10px", + height: "44px", + }} + /> + +
    +
    +
    + + activateBook(handleEdit)} // Open modal for editing user + onDelete={handleDelete} + /> +
    +
    +

    Lottery Inventory History

    +
    + handleShowUserModal(handleEdit)} // Open modal for editing user + // onDelete={handleDelete} + /> +
    + + ); +} + +export default LotteryInventory; diff --git a/src/components/Pages/AppPAges/Lottery/LotteryInventoryTable.js b/src/components/Pages/AppPAges/Lottery/LotteryInventoryTable.js new file mode 100644 index 0000000..4cda55b --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/LotteryInventoryTable.js @@ -0,0 +1,200 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +/* eslint-disable no-unused-vars */ +import React, { useState } from "react"; +import "./Lottery.css"; + +const LotteryInventoryTable = ({ + data, + columns, + onEdit, + onDelete, + showAction, + showFooter, +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + const dataToSort = data.slice(startIndex, endIndex); + return sortDisplayedData(dataToSort); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + const displayedData = getDisplayedData(); + + return ( +
    + + + + {columns.map((col, index) => ( + + ))} + {showAction && } + + + + {displayedData.length === 0 ? ( + + + + ) : ( + displayedData.map((item, index) => ( + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + )) + )} + +
    handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && ( + + {sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + )} + + )} + Action
    + No data found +
    {item[col.field] || "-"} + + +
    + {showFooter && ( + + )} +
    + ); +}; + +export default LotteryInventoryTable; diff --git a/src/components/Pages/AppPAges/Lottery/LotteryReportTable.js b/src/components/Pages/AppPAges/Lottery/LotteryReportTable.js new file mode 100644 index 0000000..5b92997 --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/LotteryReportTable.js @@ -0,0 +1,387 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +/* eslint-disable no-unused-vars */ +import React, { useEffect, useState } from "react"; + +const LotteryReportTable = ({ + lottoData, + columns, + showAction, + showFooter, + onEdit, + onDelete, + reloadLottoTable + +}) => { + + + useEffect(() => { + // If lottoData exists and is not empty, update the data + if (lottoData && lottoData.length > 0) { + setData(lottoData); + } else { + // If no data, set to an empty array to trigger "No data found" + setData([]); + } + }, [lottoData, reloadLottoTable]); + const [data, setData] = useState([]); + + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + const totalPaid = data.reduce((acc, item) => { + const amount = Number(item.amount) || 0; // Convert to number, default to 0 if NaN + return item.status === "paid" ? acc + amount : acc; + }, 0); + + const totalUnpaid = data.reduce((acc, item) => { + const amount = Number(item.amount) || 0; + return item.status === "unpaid" ? acc + amount : acc; + }, 0); + + const totalOutstandingCredit = data.reduce((acc, item) => { + const amount = Number(item.amount) || 0; + return item.status === "outstanding" ? acc + amount : acc; // Change 'outstanding' based on your data + }, 0); + + const totalDue = data.reduce((acc, item) => { + const amount = Number(item.amount) || 0; + return item.due ? acc + amount : acc; // Assuming 'due' is a boolean or condition in your data + }, 0); + + const totalExpense = data.reduce((acc, item) => { + const amount = Number(item.amount) || 0; + return item.type === "expense" ? acc + amount : acc; // Assuming 'type' specifies if it's an expense + }, 0); + + const statusStyles = { + enable: { + backgroundColor: "#6CBE1C", // Green background for Enable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + disable: { + backgroundColor: "#F6F6F6", // Red background for Disable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + draft: { + backgroundColor: "#D1D1EF", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + unpaid: { + backgroundColor: "#EF3E49", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + paid: { + backgroundColor: "#5856AC", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + }; + + const downloadCSV = () => { + const headers = columns.map((col) => col.header).join(",") + "\n"; + const rows = data + .map((row) => + columns.map((col) => String(row[col.field] || "")).join(",") + ) + .join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + + return ( +
    +
    +
    +
    + + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.length === 0 ? ( + + + + ) : ( + sortedDisplayedData.map((item) => ( + + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + )) + )} + +
    + No + handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    + No data found +
    + {(currentPage - 1) * rowsPerPage + + sortedDisplayedData.indexOf(item) + + 1} + + {col.field === "status" ? ( +
    + {typeof item[col.field] === "string" && item[col.field] + ? item[col.field].charAt(0).toUpperCase() + + item[col.field].slice(1) + : "-"} +
    + ) : item[col.field] !== undefined && + item[col.field] !== null ? ( + typeof item[col.field] === "function" ? ( + item[col.field]() + ) : ( + item[col.field] + ) + ) : ( + "-" + )} +
    + + +
    + {showFooter && ( + + )} +
    + ); +}; + +export default LotteryReportTable; diff --git a/src/components/Pages/AppPAges/Lottery/LotteryTable.js b/src/components/Pages/AppPAges/Lottery/LotteryTable.js new file mode 100644 index 0000000..0643463 --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/LotteryTable.js @@ -0,0 +1,293 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState } from "react"; +import "../ManageSettings/Settings.css" +import { SearchIcon, PrevIcon, NextIcon } from "../../../../utils/api-manager/Forms/SvgIcons"; + +const LotteryTable = ({ + data, + columns, + showAction, + showFooter, + onEdit, + onDelete, +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + const statusStyles = { + activate: { backgroundColor: "#D1D1EF", color: "#fff", borderRadius: "30px", padding: "5px 10px" }, + non_activated: { backgroundColor: "#EF3E49", color: "#fff", borderRadius: "30px", padding: "5px 10px" }, + settled: { backgroundColor: "#5856AC", color: "#fff", borderRadius: "30px", padding: "5px 10px" }, + return: { backgroundColor: "#FFB830", color: "#fff", borderRadius: "30px", padding: "5px 10px" }, + }; + + const downloadCSV = () => { + const headers = columns.map(col => col.header).join(",") + "\n"; + const rows = data.map(row => + columns.map(col => String(row[col.field] || "")).join(",") + ).join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + + return ( +
    +
    +
    +
    + setSearchTerm(e.target.value)} + placeholder="Enter Invoice Number..." + /> + +
    + + +
    +
    +

    Show

    + +
    +
    + + + + {columns.map((col, index) => ( + + ))} + {showAction && } + + + + {sortedDisplayedData.map((item) => ( + {/* Use item.id or item.index for key */} + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + ))} + + +
    handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && ( + sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ) + )} + Action
    + {col.field === "status" ? ( +
    + {item[col.field]?.charAt(0).toUpperCase() + item[col.field]?.slice(1) || "-"} +
    + ) : ( + item[col.field] !== undefined && item[col.field] !== null ? item[col.field] : "-" + )} +
    + + +
    + + +
    + ); +}; + +export default LotteryTable; diff --git a/src/components/Pages/AppPAges/Lottery/ManageGames.js b/src/components/Pages/AppPAges/Lottery/ManageGames.js new file mode 100644 index 0000000..7006d61 --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/ManageGames.js @@ -0,0 +1,241 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useEffect, useState, useContext } from "react"; +import SettingTable from "../ManageSettings/SettingTable"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import { toast, ToastContainer } from "react-toastify"; +import ReusableModal from "../ManageSettings/ReusableModal"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import Swal from "sweetalert2"; + +function ManageGames() { + const [games, setGames] = useState([]); + const { user } = useContext(AuthContext); + const storeId = user.store; + const { Get, Post, Delete, Put } = useApi(); + const [showModal, setShowModal] = useState(false); + const [gameName, setGameName] = useState(""); + const [gameNumber, setGameNumber] = useState(""); + const [totalTickets, setTotalTickets] = useState(""); + const [gamePrice, setGamePrice] = useState(""); + const [editingGame, setEditingGame] = useState(null); + + // Function to fetch game data + const fetchGameData = async () => { + try { + const response = await Get("getMyGames"); + setGames(response.games); + } catch (error) { + console.error("Error fetching game data:", error); + // toast.error("Error fetching game data."); + } + }; + + useEffect(() => { + fetchGameData(); + }, []); + + const handleShow = (game = null) => { + setShowModal(true); + if (game) { + // If editing, set the game data + setEditingGame(game); + setGameName(game.game_name); + setGameNumber(game.game_no); + setTotalTickets(game.total_no_of_tickets); + setGamePrice(game.value); + } else { + // Reset form fields for a new game + setEditingGame(null); + setGameName(""); + setGameNumber(""); + setTotalTickets(""); + setGamePrice(""); + } + }; + + const handleClose = () => { + setShowModal(false); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); // Prevent the default form submission behavior + const today = new Date().toISOString().split("T")[0]; + const gameData = { + game_name: gameName, + game_no: gameNumber, + total_no_of_tickets: totalTickets, + value: gamePrice, + store: storeId, + receive_date: today, + }; + + try { + if (editingGame) { + // Update existing game + const response = await Put("lotteryGameData", editingGame.id, gameData); // Use the ID of the game to update + setGames( + games.map((game) => + game.id === editingGame.id ? response.data : game + ) + ); + toast.success("Game updated successfully!"); + } else { + // Add new game + const response = await Post("lotteryGameData", gameData); + setGames((prevGames) => [...prevGames, response.data]); + toast.success("Game added successfully!"); + } + handleClose(); // Close modal after submission + } catch (error) { + console.error("Error adding/updating game:", error); + + // Check if the error response contains the specific message + if (error.response && error.response.data.game_no) { + const errorMessage = error.response.data.game_no[0]; // Get the specific error message + toast.error(errorMessage); // Display the error message in a toast + } else { + toast.error("Error adding/updating game."); // Generic error message + } + } + }; + + + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("lotteryGameData", id); + setGames(games.filter((game) => game.id !== id)); + toast.success("Game deleted successfully!"); + } catch (error) { + toast.error( + "Error deleting game: " + + (error.response ? error.response.data : error.message) + ); + } + }; + + const columns = [ + { header: "Game No", field: "game_no" }, + { header: "Game Name", field: "game_name" }, + { header: "Total Ticket Count", field: "total_no_of_tickets" }, + { header: "Ticket Value", field: "value" }, + ]; + + return ( + <> +
    +
    +
    Manage Games
    + +
    + +
    +
    +
    + setGameName(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + required + + /> + setGameNumber(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + required + /> +
    +
    + setTotalTickets(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + required + /> + setGamePrice(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + required + /> +
    +
    + +
    +
    +
    +
    + +
    + + + ); +} + +export default ManageGames; diff --git a/src/components/Pages/AppPAges/Lottery/VendingBookMovement.js b/src/components/Pages/AppPAges/Lottery/VendingBookMovement.js new file mode 100644 index 0000000..3dbf4ac --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/VendingBookMovement.js @@ -0,0 +1,13 @@ +import React from 'react' + +function VendingBookMovement() { + return ( +
    +
    +
    Vending Book Movement
    +
    +
    + ) +} + +export default VendingBookMovement \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Lottery/WeeklyInvoiceSettlement.js b/src/components/Pages/AppPAges/Lottery/WeeklyInvoiceSettlement.js new file mode 100644 index 0000000..25d1d32 --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/WeeklyInvoiceSettlement.js @@ -0,0 +1,1032 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import React, { useState, useEffect, useContext } from "react"; +import SettingTable from "../ManageSettings/SettingTable"; +import { toast, ToastContainer } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import ReusableModal from "../ManageSettings/ReusableModal"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import WeeklyInvoiceTable from "./WeeklyInvoiceTable"; +import Swal from "sweetalert2"; + + +function WeeklyInvoiceSettlement() { + const [games, setGames] = useState([]); + const { Get, Post, Put, Delete } = useApi(); + const { user } = useContext(AuthContext); + const storeId = user.store; + const [showModal, setShowModal] = useState(false); + const [weeklyInvoice, setWeeklyInvoice] = useState([]); + const [editingInvoice, setEditingInvoice] = useState(null); // Store the invoice being edited + const [editMode, setEditMode] = useState(false); + + const handleShow = (invoice = null) => { + setShowModal(true); + if (invoice) { + setEditingInvoice(invoice); + setEditMode(true); + // Set form fields from existing invoice data + setWeekStarting(invoice.week_starting); + setNetSales(invoice.net_sales); + setCommissionSR61(invoice.commission_sr_61); + setCashes(invoice.cashes); + setCashBonus(invoice.cash_bonus); + setClaimBonus(invoice.claim_bonus); + setAdjustment61(invoice.adjustment61); + setServiceFee(invoice.service_fee); + setBondingFee(invoice.bonding_fee); + setOnlineDue(invoice.online_due); + setInstantDue(invoice.instant_due); + setNetDue(invoice.net_due); + setTotalSales(invoice.total_sales); + setTotalReturn(invoice.total_return); + setCommissionSR38(invoice.commission_sr_38); + setSr31Total(invoice.sr_31_total); + setAdjustment38(invoice.adjustment38); + setAmountDue(invoice.amount_due); + } else { + setEditMode(false); + // Reset form fields for a new invoice + setWeekStarting(""); + setNetSales(0); + setCommissionSR61(0); + setCashes(0); + setCashBonus(0); + setClaimBonus(0); + setAdjustment61(0); + setServiceFee(0); + setBondingFee(0); + setOnlineDue(0); + setInstantDue(0); + setNetDue(0); + setTotalSales(0); + setTotalReturn(0); + setCommissionSR38(0); + setSr31Total(0); + setAdjustment38(0); + setAmountDue(0); + } + }; + const handleClose = () => { + setShowModal(false); + setEditMode(false); // Reset edit mode + setEditingInvoice(null); // Clear the current editing invoice + }; + const [showBookModal, setShowBookModal] = useState(false); + const handleShowBook = () => setShowBookModal(true); + const handleCloseBook = () => setShowBookModal(false); + + const [weekStarting, setWeekStarting] = useState(""); + const [weekEnding, setWeekEnding] = useState(""); + const [netSales, setNetSales] = useState(0); + const [commissionSR61, setCommissionSR61] = useState(0); + const [cashes, setCashes] = useState(0); + const [cashBonus, setCashBonus] = useState(0); + const [claimBonus, setClaimBonus] = useState(0); + const [adjustment61, setAdjustment61] = useState(0); + const [serviceFee, setServiceFee] = useState(0); + const [bondingFee, setBondingFee] = useState(0); + const [onlineDue, setOnlineDue] = useState(); + const [instantDue, setInstantDue] = useState(0); + const [netDue, setNetDue] = useState(0); + const [totalSales, setTotalSales] = useState(0); + const [totalReturn, setTotalReturn] = useState(0); + const [commissionSR38, setCommissionSR38] = useState(0); + const [sr31Total, setSr31Total] = useState(0); + const [adjustment38, setAdjustment38] = useState(0); + const [cashingCommission, setCashingCommission] = useState(0); + const [totalInstantCashing, setTotalInstantCashing] = useState(0); + + const [amountDue, setAmountDue] = useState(0); + + const [totalNetSales, setTotalNetSales] = useState(0); + const [totalCashes, setTotalCashes] = useState(0); + const [totalCommission, setTotalCommission] = useState(0); + const [totalDue, setTotalDue] = useState(0); + + const handleWeeklySubmit = async () => { + const calculatedTotalNetSales = + parseFloat(netSales || 0) + parseFloat(totalSales || 0); + const calculatedTotalCashes = + parseFloat(cashes || 0) + parseFloat(totalInstantCashing || 0); + const calculatedTotalCommission = + parseFloat(commissionSR61 || 0) + + parseFloat(cashBonus || 0) + + parseFloat(claimBonus || 0) + + parseFloat(commissionSR38 || 0) + + parseFloat(cashingCommission || 0); + const calculatedTotalDue = parseFloat(netDue || 0); + + // Prepare data to submit + const WeeklyInvoice = { + store: storeId, + week_starting: weekStarting, + net_sales: parseFloat(netSales).toFixed(2), + commission_sr_61: parseFloat(commissionSR61).toFixed(2), + cashes: parseFloat(cashes).toFixed(2), + cash_bonus: parseFloat(cashBonus).toFixed(2), + claim_bonus: parseFloat(claimBonus).toFixed(2), + + adjustment61: parseFloat(adjustment61).toFixed(2), + + service_fee: parseFloat(serviceFee).toFixed(2), + bonding_fee: parseFloat(bondingFee).toFixed(2), + online_due: parseFloat(onlineDue).toFixed(2), + instant_due: parseFloat(instantDue).toFixed(2), + net_due: parseFloat(netDue).toFixed(2), + + total_sales: parseFloat(totalSales).toFixed(2), + total_return: parseFloat(totalReturn).toFixed(2), + commission_sr_38: parseFloat(commissionSR38).toFixed(2), + sr_31_total: parseFloat(sr31Total).toFixed(2), + cashing_commission: parseFloat(cashingCommission).toFixed(2), + total_instant_cashing: parseFloat(totalInstantCashing).toFixed(2), + amount_due: parseFloat(amountDue).toFixed(2), + + total_net_sales: calculatedTotalNetSales.toFixed(2), + total_cashes: calculatedTotalCashes.toFixed(2), + total_commission: calculatedTotalCommission.toFixed(2), + adjustment38: parseFloat(adjustment38).toFixed(2), + total_due: calculatedTotalDue.toFixed(2), + }; + + try { + if (editMode) { + // Update existing invoice + await Put("weeklyInvoiceSettlementData", editingInvoice.id, WeeklyInvoice); + toast.success("Invoice updated successfully!"); + } else { + // Create new invoice + await Post("weeklyInvoiceSettlementData", WeeklyInvoice); + toast.success("Invoice created successfully!"); + } + handleClose(); // Close modal after submission + fetchWeeklyInvoiceData(); // Refresh the data after submission + } catch (error) { + console.error("Error:", error); + toast.error("An error occurred while submitting the invoice."); + } + }; + + useEffect(() => { + const parsedNetSales = parseFloat(netSales) || 0; + const parsedCommissionSR61 = parseFloat(commissionSR61) || 0; + const parsedCashes = parseFloat(cashes) || 0; + const parsedCashBonus = parseFloat(cashBonus) || 0; + const parsedClaimBonus = parseFloat(claimBonus) || 0; + const parsedAdjustment = parseFloat(adjustment61) || 0; + const parsedServiceFee = parseFloat(serviceFee) || 0; + const parsedBondingFee = parseFloat(bondingFee) || 0; + const parsedInstantDue = parseFloat(instantDue) || 0; + + // SR 61 calculations + const calculatedCommissionSR61 = netSales / 20; + const calculatedCashBonus = cashes / 100; + + // First part of the calculation (before adjustments) + const firstPart = + parsedNetSales - + parsedCommissionSR61 - + parsedCashes - + parsedCashBonus - + parsedClaimBonus; + + // Second part of the calculation (adjustments, service fee, bonding fee) + const secondPart = parsedAdjustment + parsedServiceFee + parsedBondingFee; + // Final onlineDue calculation + const calculatedOnlineDue = firstPart + secondPart; + + const calculatedNetDue = calculatedOnlineDue + parsedInstantDue; + + if (!isNaN(calculatedOnlineDue)) { + // Ensure it's a number and round it to 2 decimal places + setOnlineDue(parseFloat(calculatedOnlineDue).toFixed(2)); + } else { + setOnlineDue("0.00"); // Fallback if calculation is invalid + } + + if (!isNaN(calculatedNetDue)) { + setNetDue(parseFloat(calculatedNetDue).toFixed(2)); // Store rounded value for display + } else { + setNetDue("0.00"); // Fallback if invalid + } + setCommissionSR61(calculatedCommissionSR61); + setCashBonus(calculatedCashBonus); + + // SR 38 calculations + const parsedTotalSales = parseFloat(totalSales) || 0; + const parsedTotalReturn = parseFloat(totalReturn) || 0; + const parsedSr31Total = parseFloat(sr31Total) || 0; + const parsedAdjustment38 = parseFloat(adjustment38) || 0; + + // SR 38 and Instant Cashing calculations + + // Commission SR 38 calculation (based on total sales and total returns) + const calculatedCommissionSR38 = + (parsedTotalSales - parsedTotalReturn) / 20; + + // Cashing commission calculation (based on sr31Total) + const calculatedCashingCommission = parsedSr31Total * 0.01; + + // Total instant cashing calculation (based on sr31Total and commissionSR38) + let calculatedTotalInstantCashing = 0; + if (parsedSr31Total > 0) { + calculatedTotalInstantCashing = + parsedSr31Total - calculatedCashingCommission; + } + + const amountDue = + parsedTotalSales - + parsedTotalReturn - + calculatedCommissionSR38 - + parsedSr31Total + + parsedAdjustment38; + + // Update the state for amount due + setAmountDue(amountDue.toFixed(2)); + // Update the state for SR 38 and cashing commissions + setCommissionSR38(calculatedCommissionSR38.toFixed(2)); // Round to 2 decimal places + setCashingCommission(calculatedCashingCommission.toFixed(2)); // Round to 2 decimal places + setTotalInstantCashing(calculatedTotalInstantCashing.toFixed(2)); // Round to 2 decimal places + + if (weekStarting) { + const startDate = new Date(weekStarting); + const endDate = new Date(startDate); + endDate.setDate(startDate.getDate() + 6); // Adds 7 days + setWeekEnding(endDate.toISOString().split("T")[0]); // Format to YYYY-MM-DD + } + }, [ + netSales, + cashes, + claimBonus, + adjustment61, + serviceFee, + bondingFee, + totalSales, + instantDue, + totalReturn, + sr31Total, + adjustment38, + weekStarting, + ]); + + const fetchGameData = async () => { + try { + const response = await Get("lotteryInventoryData"); + + // Filter to only include games with status "settled" + const settledGames = Array.isArray(response) + ? response.filter((game) => game.status === "settled") + : []; + + setGames(settledGames); + } catch (error) { + console.error("Error fetching game data:", error); + toast.error("Error fetching game data."); + } + }; + + const fetchWeeklyInvoiceData = async () => { + try { + const response = await Get("weeklyInvoiceSettlementData"); + if (response && Array.isArray(response)) { + setWeeklyInvoice(response); + } else { + toast.error("Failed to fetch settlement data."); + } + } catch (error) { + console.error("Error fetching data:", error); + toast.error("An error occurred while fetching data."); + } + }; + + const handleEdit = (invoice) => { + setEditingInvoice(invoice); // Set the invoice being edited + setEditMode(true); // Enable edit mode + // Optionally, you can set the state to the values of the invoice for the form + setWeekStarting(invoice.week_starting); + setNetSales(invoice.net_sales); + setCommissionSR61(invoice.commission_sr_61); + setCashes(invoice.cashes); + setCashBonus(invoice.cash_bonus); + setClaimBonus(invoice.claim_bonus); + setAdjustment61(invoice.adjustment61); + setServiceFee(invoice.service_fee); + setBondingFee(invoice.bonding_fee); + setOnlineDue(invoice.online_due); + setInstantDue(invoice.instant_due); + setNetDue(invoice.net_due); + setTotalSales(invoice.total_sales); + setTotalReturn(invoice.total_return); + setCommissionSR38(invoice.commission_sr_38); + setSr31Total(invoice.sr_31_total); + setAdjustment38(invoice.adjustment38); + setAmountDue(invoice.amount_due); + setTotalNetSales(invoice.total_net_sales); + setTotalCashes(invoice.total_cashes); + setTotalCommission(invoice.total_commission); + setTotalDue(invoice.total_due); + }; + + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + // Call the delete API with the invoice ID + await Delete("weeklyInvoiceSettlementData", id); + + // Remove the deleted invoice from the state + setWeeklyInvoice((prevInvoices) => + prevInvoices.filter((invoice) => invoice.id !== id) + ); + toast.success("Invoice deleted successfully"); + } catch (error) { + toast.error("Error deleting invoice"); + } + }; + useEffect(() => { + fetchGameData(); + fetchWeeklyInvoiceData(); + }, []); + + const handleAdd = async () => { + if (!gameNumber || !bookName) return; // Ensure both fields are filled + + try { + const response = await Post("updateGameAndInventory", { + game_no: gameNumber, + book_no: bookName, + }); + + if (response) { + setTotalSales(response.game_total_price); // Auto-populate totalSales + } + } catch (error) { + console.error("Error:", error); + } + }; + const [settledDate, setSettledDate] = useState(""); + const [selectedBook, setSelectedBook] = useState(""); + const [scanBook, setScanBook] = useState(""); + const [processingCount, setProcessingCount] = useState(0); + const [gameNumber, setGameNumber] = useState(""); + const [bookName, setBookName] = useState(""); + const [totalSalesSettlment, setTotalSalesSettlement] = useState(""); + const handleSubmit = async () => { + if (!settledDate || !bookName || !gameNumber || !totalSalesSettlment) { + toast.error("Please fill out all required fields before submitting."); + return; + } + + const payload = { + instant_settlement_date: settledDate, + book_no: bookName, + game_no: gameNumber, + total: totalSalesSettlment, + status: "settled", + }; + + try { + const response = await Post("updateGameAndInventory", payload); + console.log("Success:", response); + toast.success("Book settlement done!"); + + // Reset the form if needed + setSettledDate(""); + setBookName(""); + setGameNumber(""); + setTotalSalesSettlement(0); + } catch (error) { + console.error("Error:", error); + toast.error("Failed to settle book. Please try again."); + } + }; + + const columns = [ + { header: "Week End Data", field: "week_ending" }, + { header: "Net Sale", field: "total_net_sales" }, + { header: "Net Cashes", field: "total_cashes" }, + { header: "Total Commision", field: "total_commission" }, + { header: "Total Due", field: "total_due" }, + ]; + const columns2 = [ + { header: "Settlement Date", field: "instant_settlement_date" }, + { header: "Total Sales", field: "game_total_price" }, + ]; + + return ( + <> + +
    +
    +
    Weekly Invoice Settlement
    + +
    + +
    +
    +
    + {/* Settled Date */} + + setWeekStarting(e.target.value)} + className="input-field" + style={{ + width: "160px", + marginRight: "10px", + height: "44px", + }} + /> + + setWeekEnding(e.target.value)} + className="input-field" + style={{ + width: "160px", + marginRight: "10px", + height: "44px", + }} + /> +
    +
    +

    + SR-61 Online Settle Report +

    + +
    +
    + + setNetSales(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    + +
    + + setCommissionSR61(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    + +
    + + setCashes(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    +
    +
    + + setCashBonus(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    + + setClaimBonus(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    +
    + + +
    + setAdjustment61(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    +
    + + setServiceFee(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    + +
    + + setBondingFee(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    + +
    + + setOnlineDue(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    +
    +
    + + setInstantDue(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    + + setNetDue(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    +
    +
    +
    +

    + SR-38 Instant Settle Report +

    + +
    +
    + + setTotalSales(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    + +
    + + setTotalReturn(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    + +
    + + setCommissionSR38(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    + + +
    + setAdjustment38(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    +
    + + setSr31Total(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    + +
    + + setCashingCommission(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    + +
    + + setTotalInstantCashing(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    +
    +
    + + setAmountDue(e.target.value)} + className="input-field" + style={{ width: "100%", height: "44px" }} + /> +
    +
    +
    +
    + + +
    +
    + + {/* instant Settlement */} +
    +
    Instant Book Settlement
    + +
    + +
    + {/* First row */} +
    +
    + {/* Settled Date */} + + setSettledDate(e.target.value)} + /> + + {/* Sold Books & Returned Books */} + + + {/* Select Book Dropdown */} + +
    +
    + + {/* Second row */} +
    +
    + {/* Scan Book */} + + +
    +
    + + {/* Third row */} +
    +
    + {/* Select Manually */} + + setGameNumber(e.target.value)} + /> + + setBookName(e.target.value)} + /> + +
    +
    + + {/* Fourth row (Total Sales & Submit Button) */} +
    +
    + + setTotalSalesSettlement(e.target.value)} // Optional: Allow manual changes if needed + /> +
    + + {/* Submit Button */} + +
    +
    +
    + +
    + + ); +} + +export default WeeklyInvoiceSettlement; diff --git a/src/components/Pages/AppPAges/Lottery/WeeklyInvoiceTable.js b/src/components/Pages/AppPAges/Lottery/WeeklyInvoiceTable.js new file mode 100644 index 0000000..707a71e --- /dev/null +++ b/src/components/Pages/AppPAges/Lottery/WeeklyInvoiceTable.js @@ -0,0 +1,537 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState } from "react"; + +const WeeklyInvoiceTable = ({ + data, + columns, + showAction, + showFooter, + onEdit, + onDelete, + showExport, + showFilter, +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + const statusStyles = { + enable: { + backgroundColor: "#6CBE1C", // Green background for Enable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + disable: { + backgroundColor: "#F6F6F6", // Red background for Disable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + draft: { + backgroundColor: "#D1D1EF", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + unpaid: { + backgroundColor: "#EF3E49", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + paid: { + backgroundColor: "#5856AC", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + }; + + const downloadCSV = () => { + const headers = columns.map((col) => col.header).join(",") + "\n"; + const rows = data + .map((row) => + columns.map((col) => String(row[col.field] || "")).join(",") + ) + .join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const [showDropdown, setShowDropdown] = useState(false); + const handleFilterClick = () => { + setShowDropdown(!showDropdown); // Toggle the dropdown + }; + + const renderFilterDropdown = () => { + return ( +
    + + + + +
    + ); + }; + + const dropdownStyles = { + position: "absolute", + top: "100%", + left: "0", + backgroundColor: "white", + border: "1px solid #ddd", + padding: "10px", + boxShadow: "0px 4px 8px rgba(0,0,0,0.1)", + borderRadius: "4px", + zIndex: "1", + }; + + const calculateTotals = () => { + let totalNetSales = 0; + let totalCashes = 0; + let totalCommission = 0; + let totalDue = 0; + + sortedDisplayedData.forEach((item) => { + totalNetSales += parseFloat(item.total_net_sales || 0); + totalCashes += parseFloat(item.total_cashes || 0); + totalCommission += parseFloat(item.total_commission || 0); + totalDue += parseFloat(item.total_due || 0); + }); + + return { + totalNetSales, + totalCashes, + totalCommission, + totalDue, + }; + }; + + const totals = calculateTotals(); + return ( +
    +
    +
    +
    + setSearchTerm(e.target.value)} + placeholder="Search" + /> + + + + +
    + {showExport && ( // Conditionally render the button based on showExport prop + + )} + {showFilter && ( +
    + + {showDropdown && renderFilterDropdown()} +
    + )} +
    +
    +

    Show

    + +
    +
    + + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.length === 0 ? ( + + + + ) : ( + sortedDisplayedData.map((item) => ( + + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + )) + )} + + + + + + + + + + +
    + No + handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    + No data found +
    + {(currentPage - 1) * rowsPerPage + + sortedDisplayedData.indexOf(item) + + 1} + + {col.field === "status" ? ( +
    + {typeof item[col.field] === "string" && item[col.field] + ? item[col.field].charAt(0).toUpperCase() + + item[col.field].slice(1) + : "-"} +
    + ) : item[col.field] !== undefined && + item[col.field] !== null ? ( + typeof item[col.field] === "function" ? ( + item[col.field]() + ) : ( + item[col.field] + ) + ) : ( + "-" + )} +
    + + +
    {totals.totalNetSales.toFixed(2)}{totals.totalCashes.toFixed(2)}{totals.totalCommission.toFixed(2)}{totals.totalDue.toFixed(2)}
    + {showFooter && ( + + )} +
    + ); +}; + +export default WeeklyInvoiceTable; diff --git a/src/components/Pages/AppPAges/ManageSettings/CheckOutBackUp.js b/src/components/Pages/AppPAges/ManageSettings/CheckOutBackUp.js new file mode 100644 index 0000000..85b728f --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/CheckOutBackUp.js @@ -0,0 +1,406 @@ +import React, { useState } from "react"; +import { + CardElement, + useStripe, + useElements, + CardNumberElement, + CardExpiryElement, + CardCvcElement, +} from "@stripe/react-stripe-js"; +import CustomInput from "../../../custominput/CustomInput"; +import { Button } from "react-bootstrap"; +import tick from "../../../../assets/img/tick-subscription.png"; +import backToPlan from "../../../../assets/img/back-to-plan.png"; +import CustomSwitchSubscription from "./CustomSwitchSubscription"; +import {loadStripe} from '@stripe/stripe-js'; +const CheckoutForm = (props) => { + const stripe = useStripe(); + const elements = useElements(); + const [formData, setFormData] = useState({ + email: "", + phone: "", + nameOnCard: "", + autoDebit: false, + }); + + const [isLoading, setIsLoading] = useState(false); + const [subscriptionPlan, setSubscriptionPlan] = useState([]); + + const handleInputChange = (e) => { + const { name, value, type, checked } = e.target; + setFormData((prev) => ({ + ...prev, + [name]: type === "checkbox" ? checked : value, + })); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + const stripe = await loadStripe("pk_test_51Q3jDRC4aAVHkmzjl5CIJRu4U8foi32rigkEJ6gFhEzTDrZvfwpZEwrpYxuugyXRLzAia2ZKoMxu58H6hVDuuko900kINa7O8c"); + setIsLoading(true); + + + if (!stripe || !elements) { + alert("Stripe is not properly initialized."); + setIsLoading(false); + return; + } + + const cardElement = elements.getElement(CardElement); + + // Simulate backend call to create payment intent + try { + const { error, paymentIntent } = await stripe.confirmCardPayment( + "pi_3QNA9SSA4kXCqRVS0C7vQ00t", + { + payment_method: { + card: cardElement, + billing_details: { + name: formData.nameOnCard, + email: formData.email, + phone: formData.phone, + }, + }, + } + ); + + if (error) { + console.error("Payment failed:", error.message); + } else { + console.log("Payment succeeded:", paymentIntent); + alert("Payment Successful!"); + } + } catch (error) { + alert("Payment Failed:", error.message); + console.error("Error:", error); + } finally { + setIsLoading(false); + } + const result = stripe.redirectToCheckout({ + sessionId: 'pi_3QNA9SSA4kXCqRVS0C7vQ00t' + }) + if(result.error){ + alert(result.error) + } + + }; + + const liStyle = { + textAlign: "start", + marginLeft: "-30px", + width: "100%", + position: "relative", + lineHeight: '35px', + fontSize: "16px", + fontWeight: "500" + }; + const liImgStyle = { + height: "20px", + width: "20px", + position: "absolute", + right: "13%", + top: "5px", + }; + const [checkBoxActive, setCheckBoxActive] = useState(false); + return ( +
    +
    +
    + + +
    +
    + {props.handleClose() }}> + {" "} +

    + Select Plan +

    +
    + +

    + Subscribe to {props.modelData.title} +

    + {/*

    + US ${props.modelData.amount} + + Per + Month + +

    */} + + + + + + +
    +

    + US ${props.modelData.amount} +

    +
    + Per +
    + Month +
    +
    +
    +
    +
    + + + setCheckBoxActive(true)} + > +
    +
    + +
    +
    +
      + {props.modelData.inc_features !== undefined + ? props.modelData.inc_features.map((features) => { + return ( +
    • + {features} +
    • + ); + }) + : ""} +
    +
    +
    + +
    +
    +

    + Subtotal +

    +

    + ${props.modelData.amount} +

    +
    +
    +
    +
    +
    + + +
    + +
    + + +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    +
    + +
    + +
    +
    +

    + By clicking, you agree to our policies, which govern the use of + our platform and outline your rights and responsibilities. This + includes compliance with our terms of service, privacy practices, + and any other applicable guidelines to ensure a secure and fair + experience for all users. +

    +
    +
    +
    +
    + ); +}; + +export default CheckoutForm; \ No newline at end of file diff --git a/src/components/Pages/AppPAges/ManageSettings/CheckoutForm.js b/src/components/Pages/AppPAges/ManageSettings/CheckoutForm.js new file mode 100644 index 0000000..b858c8a --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/CheckoutForm.js @@ -0,0 +1,454 @@ +import React, { useEffect, useState } from "react"; +import Swal from "sweetalert2"; + +import { + CardNumberElement, + CardExpiryElement, + CardCvcElement, + useStripe, + useElements, +} from "@stripe/react-stripe-js"; +import { Button } from "react-bootstrap"; + +import tick from "../../../../assets/img/tick-subscription.png"; +import backToPlan from "../../../../assets/img/back-to-plan.png"; +import CustomSwitchSubscription from "./CustomSwitchSubscription"; +import loader from "../../../../assets/img/loader.gif"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +const CheckoutForm = (props) => { + const { Post } = useApi(); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [clientSecret, setClientSecret] = useState(null); // Store clientSecret + const stripe = useStripe(); + const elements = useElements(); + const [formData, setFormData] = useState({ + email: "", + phone: "", + nameOnCard: "", + autoDebit: false, + }); + const liStyle = { + textAlign: "start", + marginLeft: "-30px", + width: "100%", + position: "relative", + lineHeight: "35px", + fontSize: "16px", + fontWeight: "500", + }; + const liImgStyle = { + height: "20px", + width: "20px", + position: "absolute", + right: "13%", + top: "5px", + }; + const [checkBoxActive, setCheckBoxActive] = useState(false); + useEffect(() => { + // Fetch client secret on mount + }, [clientSecret]); + + const handleInputChange = (e) => { + const { name, value, type, checked } = e.target; + setFormData((prev) => ({ + ...prev, + [name]: type === "checkbox" ? checked : value, + })); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + setLoading(true); + setError(null); + try { + await Post("paymentIntent", { + subscription_id: props.modelData.id, + }).then(async (resp) => { + + if (resp.data.clientSecret) { + setClientSecret(resp.data.clientSecret); // Store the client secret + if (!stripe) { + setError( + "Stripe has not been initialized or client secret is missing." + ); + return; + } + + if (!elements) { + setError("Stripe elements are not initialized"); + return; + } + if (!resp.data.clientSecret) { + setError("Client secret is missing."); + return; + } + + // Get the individual card elements + const cardNumberElement = elements.getElement(CardNumberElement); + const cardExpiryElement = elements.getElement(CardExpiryElement); + const cardCvcElement = elements.getElement(CardCvcElement); + + if (!cardNumberElement || !cardExpiryElement || !cardCvcElement) { + setError("All card details must be filled out."); + setLoading(false); + return; + } + + const { error, paymentIntent } = await stripe.confirmCardPayment( + resp.data.clientSecret, + { + payment_method: { + card: cardNumberElement, + billing_details: { + name: formData.nameOnCard, + email: formData.email, + }, + }, + } + ); + + if (error) { + setError(error.message); + } else if (paymentIntent.status === "succeeded") { + await Post("purchaseSubscription", { + subscription_id: props.modelData.id, + no_of_months: 1, + }) + .then((resp) => { + Swal.fire({ + title: "Payment success", + text: `Payment received for ${props.modelData.title} plan.`, + icon: "success", + }); + setLoading(false); + props.handleClose(); + + }) + .catch((err) => { + Swal.fire({ + title: "Payment Failed", + text: `Payment Failed for ${props.modelData.title} plan.`, + icon: "error", + }); + }); + //Call Subscription Entry API Call here + } + + setLoading(false); + } else { + setError("Failed to get payment client secret."); + } + }); + } catch (err) { + setError("Error fetching client secret from backend."); + } + }; + + const customStyles = { + base: { + fontSize: "16px", + color: "#32325d", + "::placeholder": { + color: "#aab7c4", + }, + padding: "10px", + border: "1px solid #ccc", + borderRadius: "5px", + }, + invalid: { + color: "#fa755a", + iconColor: "#fa755a", + }, + }; + + return ( +
    handleSubmit(e)}> +
    + {/* Left Column: Subscription Details */} +
    +
    +
    + { + props.handleClose(); + }} + > + {" "} +

    + Select Plan +

    +
    + +

    + Subscribe to {props.modelData.title} +

    + {/*

    + US ${props.modelData.amount} + + Per + Month + +

    */} + + + + + + +
    +

    + US ${props.modelData.amount} +

    +
    + Per +
    + Month +
    +
    +
    +
    +
    + + + setCheckBoxActive(true)} + > +
    +
    + +
    +
    +
      + {props.modelData.inc_features_titles !== undefined + ? props.modelData.inc_features_titles.map((features) => { + return ( +
    • + {features} +
    • + ); + }) + : ""} +
    +
    +
    + +
    +
    +

    + Subtotal +

    +

    + ${props.modelData.amount} +

    +
    +
    +
    + + {/* Right Column: Payment Form */} +
    +
    + + +
    + +
    + + + +
    + + +
    + +
    +
    + + +
    + +
    + + +
    +
    + +
    + + + {error &&
    {error}
    } +
    +
    +

    + By clicking, you agree to our policies, which govern the use of + our platform and outline your rights and responsibilities. This + includes compliance with our terms of service, privacy practices, + and any other applicable guidelines to ensure a secure and fair + experience for all users. +

    +
    +
    +
    +
    +
    + ); +}; + +export default CheckoutForm; diff --git a/src/components/Pages/AppPAges/ManageSettings/CustomSwitch.js b/src/components/Pages/AppPAges/ManageSettings/CustomSwitch.js new file mode 100644 index 0000000..68716c2 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/CustomSwitch.js @@ -0,0 +1,64 @@ +import React from 'react'; + +const CustomSwitch = ({ setting, handleSwitchChange, isActive }) => { + return ( +
    + handleSwitchChange(setting.id)} // Handle change function + checked={isActive} // Add checked prop to control switch state + /> + + + +
    + ); +}; + +export default CustomSwitch; diff --git a/src/components/Pages/AppPAges/ManageSettings/CustomSwitchSubscription.js b/src/components/Pages/AppPAges/ManageSettings/CustomSwitchSubscription.js new file mode 100644 index 0000000..937ebd8 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/CustomSwitchSubscription.js @@ -0,0 +1,74 @@ +import React, { useState } from "react"; + +const CustomSwitchSubscription = ({ name, label, handleSwitchChange, isActive }) => { + const [internalState, setInternalState] = useState(isActive); + + const handleChange = () => { + const newState = !internalState; + setInternalState(newState); // Update internal state + handleSwitchChange(newState); // Notify parent component of the change + }; + + return ( +
    + + + +
    + ); +}; + +export default CustomSwitchSubscription; diff --git a/src/components/Pages/AppPAges/ManageSettings/DataTable.js b/src/components/Pages/AppPAges/ManageSettings/DataTable.js new file mode 100644 index 0000000..fc5169b --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/DataTable.js @@ -0,0 +1,229 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState } from "react"; +import "./Settings.css" +const DataTable = ({ + data, + columns, + showAction, + showFooter, + onEdit, + onDelete, +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const rowsPerPage = 5; + // Get total pages based on the total data length + const totalPages = Math.ceil(data.length / rowsPerPage); + // Get the data for the current page + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + // Sort the displayed data based on sortConfig + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + // Display data for the current page and sort it + const displayedData = getDisplayedData(); + const sortedDisplayedData = sortDisplayedData(displayedData); + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + return ( +
    + + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.map((item, index) => ( + + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + ))} + +
    + No + handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    {(currentPage - 1) * rowsPerPage + index + 1}{item[col.field] || "-"} + + +
    + {showFooter && ( + + )} +
    + ); +}; +export default DataTable; diff --git a/src/components/Pages/AppPAges/ManageSettings/DataTables.js b/src/components/Pages/AppPAges/ManageSettings/DataTables.js new file mode 100644 index 0000000..3bbe6db --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/DataTables.js @@ -0,0 +1,536 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState, useEffect } from "react"; +import "./Settings.css"; +import { + SearchIcon, + PrevIcon, + NextIcon, +} from "../../../../utils/api-manager/Forms/SvgIcons"; + +const PayrollTable = ({ + data, + columns, + showAction, + showFooter, + onEdit, + onDelete, + totals, +}) => { + const { + totalPaid, + totalReceivedCredit, + totalUnpaid, + totalOutstandingCredit, + totalDue, + totalCredit, + totalExpense, + totalPaidPurchase, + totalReceivedCreditPurchase, + totalUnpaidForPurchases, + totalOutstandingPurchase, + totalDueForPurchases, + totalPurchaseCredit, + totalPurchase, + } = totals; + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + const statusStyles = { + draft: { + backgroundColor: "#D1D1EF", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + unpaid: { + backgroundColor: "#EF3E49", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + paid: { + backgroundColor: "#5856AC", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + partially_paid: { + backgroundColor: "#FFB830", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + }; + const paymentMethodStyles = { + bank: { backgroundColor: "#57A09C" }, + "Business Cash": { backgroundColor: "#38400B" }, + "Credit Card": { backgroundColor: "#28a745" }, + cash: { backgroundColor: "#CAC59D" }, + cheque: { backgroundColor: "#38400B" }, + pay_later: { backgroundColor: "#E55477" }, + pay_now: { backgroundColor: "#A9B0F0" }, + credit_invoice: { backgroundColor: "#CFCC76" }, + }; + + const getPaymentMethodStyle = (method) => ({ + ...(paymentMethodStyles[method] || { backgroundColor: "#6c757d" }), + borderRadius: "30px", + padding: "5px 10px", + color: "#fff", + }); + + const downloadCSV = () => { + const headers = columns.map((col) => col.header).join(",") + "\n"; + const rows = data + .map((row) => + columns.map((col) => String(row[col.field] || "")).join(",") + ) + .join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + + return ( +
    +
    +
    +
    + setSearchTerm(e.target.value)} + placeholder="Search" + /> + +
    + + {/* */} +
    +
    +

    Show

    + +
    +
    + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.length === 0 ? ( + + + + ) : ( + sortedDisplayedData.map((item) => ( + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + )) + )} + +
    handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    + No data found +
    + {col.field === "pay_method" ? ( + + {item[col.field] + ? item[col.field] + .replace(/_/g, " ") // Replace underscores with spaces + .split(" ") // Split into words + .map( + (word) => + word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ) // Capitalize first letter, lowercase rest + .join(" ") // Join words back with spaces + : "-"} + + ) : col.field === "status" ? ( +
    + {item[col.field] + ? item[col.field] + .replace(/_/g, " ") // Replace underscores with spaces + .split(" ") // Split into words + .map( + (word) => + word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ) // Capitalize first letter, lowercase rest + .join(" ") // Join words back with spaces + : "-"} +
    + ) : Array.isArray(item[col.field]) ? ( + item[col.field].join(", ") + ) : ( + item[col.field] ?? "-" + )} +
    + + +
    + {showFooter && ( + <> + {data.some((item) => item.type === "expense") && ( +
    + {[ + { label: "Total Paid Amount", value: totalPaid }, + { label: "Total Received Credit", value: totalReceivedCredit }, + { label: "Total Unpaid", value: totalUnpaid }, + { + label: "Total Outstanding Credit", + value: totalOutstandingCredit, + }, + { label: "Total Due", value: totalDue }, + { label: "Total Credit", value: totalCredit }, + { label: "Total Expense Amount", value: totalExpense }, + ].map((total, index) => ( +
    + {total.label} + +          $ + {total.value.toFixed(2)} + +
    + ))} +
    + )} + + {data.some((item) => item.type === "purchase") && ( +
    + {[ + { label: "Total Paid Amount", value: totalPaidPurchase }, + { + label: "Total Received Credit", + value: totalReceivedCreditPurchase, + }, + { label: "Total Unpaid", value: totalUnpaidForPurchases }, + { + label: "Total Outstanding Credit", + value: totalOutstandingPurchase, + }, + { label: "Total Due", value: totalDueForPurchases }, + { label: "Total Credit", value: totalPurchaseCredit }, + { label: "Total Expense Amount", value: totalPurchase }, + ].map((total, index) => ( +
    + {total.label} + +          $ + {total.value.toFixed(2)} + +
    + ))} +
    + )} + + )} + + +
    + ); +}; + +export default PayrollTable; diff --git a/src/components/Pages/AppPAges/ManageSettings/ManageDepartments.js b/src/components/Pages/AppPAges/ManageSettings/ManageDepartments.js new file mode 100644 index 0000000..7dcc9c9 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ManageDepartments.js @@ -0,0 +1,207 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import "./Settings.css"; +import { toast, ToastContainer } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import Swal from "sweetalert2"; + +function ManageDepartments() { + const [departments, setDepartments] = useState([]); + const [newDepartment, setNewDepartment] = useState(""); + const [editDepartmentId, setEditDepartmentId] = useState(null); + const [editDepartmentTitle, setEditDepartmentTitle] = useState(""); + let { user } = useContext(AuthContext); + const storeId = user.store; + const { Get, Post, Put, Delete } = useApi(); + useEffect(() => { + const fetchDepartments = async () => { + try { + const response = await Get("vendorDepartmentServiceData"); + setDepartments(response); + } catch (error) { + console.error("Error fetching departments:", error); + toast.error("Error fetching departments."); + } + }; + fetchDepartments(); + }, []); + const handleSaveDepartment = async () => { + const departmentData = { + store: storeId, + type: "department", + title: newDepartment || editDepartmentTitle, + }; + try { + if (editDepartmentId) { + // Editing existing department + await Put( + "vendorDepartmentServiceData", + editDepartmentId, + departmentData + ); + setDepartments((prevDepartments) => + prevDepartments.map((dept) => + dept.id === editDepartmentId + ? { ...dept, title: departmentData.title } + : dept + ) + ); + resetInputFields(); + toast.success("Department updated successfully!"); + } else { + // Adding a new department + const response = await Post( + "vendorDepartmentServiceData", + departmentData + ); + if (response.status === 201) { + // Check the status code here + setDepartments((prevDepartments) => [ + ...prevDepartments, + response.data, + ]); + toast.success("Department added successfully!"); + } else { + toast.error("Something went wrong!"); + } + setNewDepartment(""); + } + } catch (error) { + console.error("Error adding or editing department:", error); + toast.error("Department Type Is Required"); + } + }; + const resetInputFields = () => { + setEditDepartmentId(null); + setEditDepartmentTitle(""); + setNewDepartment(""); + }; + const handleDeleteDepartment = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("vendorDepartmentServiceData", id); + setDepartments(departments.filter((dept) => dept.id !== id)); + resetInputFields(); + toast.success("Department deleted successfully!"); + } catch (error) { + console.error( + "Error deleting department:", + error.response ? error.response.data : error.message + ); + toast.error("Error deleting department."); + } + }; + const filteredDepartments = departments.filter( + (dept) => dept.type === "department" + ); + return ( +
    + +

    Manage Departments

    +
    +
    +
    + { + if (editDepartmentId) { + setEditDepartmentTitle(e.target.value); + } else { + setNewDepartment(e.target.value); + } + }} + required + /> + +
    +
    +
    +
    +
    + {filteredDepartments.length === 0 ? ( +

    No Data Found

    + ) : ( + filteredDepartments.map((dept) => ( +
    + {editDepartmentId === dept.id ? ( + setEditDepartmentTitle(e.target.value)} + /> + ) : ( + + )} + { + if (editDepartmentId === dept.id) { + resetInputFields(); + } else { + setEditDepartmentId(dept.id); + setEditDepartmentTitle(dept.title); + setNewDepartment(""); + } + }} + > + + + handleDeleteDepartment(dept.id)} + > + + +
    + )) + )} +
    +
    + +
    + ); +} +export default ManageDepartments; diff --git a/src/components/Pages/AppPAges/ManageSettings/ManageExpenseType.js b/src/components/Pages/AppPAges/ManageSettings/ManageExpenseType.js new file mode 100644 index 0000000..10155fb --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ManageExpenseType.js @@ -0,0 +1,192 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import ReusableModal from "./ReusableModal"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import "./Settings.css"; +import SettingTable from "./SettingTable"; +import Swal from "sweetalert2"; +import { toast, ToastContainer } from "react-toastify"; + + + +function ManageExpenseType() { + let { user } = useContext(AuthContext); + const storeId = user.store; + const [showModal, setShowModal] = useState(false); + const [isEditMode, setIsEditMode] = useState(false); + const [selectedExpenseType, setSelectedExpenseType] = useState(null); + const [expenseType, setExpenseType] = useState(""); + const [expenseTypes, setExpenseTypes] = useState([]); + const { Get, Post, Put, Delete } = useApi(); + useEffect(() => { + const fetchExpenseTypes = async () => { + try { + const response = await Get("vendorDepartmentServiceData"); + setExpenseTypes(response); + } catch (error) { + console.error("Error fetching expense types:", error); + } + }; + fetchExpenseTypes(); + }, []); + const handleShow = () => { + setShowModal(true); + setIsEditMode(false); + setSelectedExpenseType(null); + setExpenseType(""); + }; + const handleEdit = (expenseType) => { + setShowModal(true); + setIsEditMode(true); + setSelectedExpenseType(expenseType); + setExpenseType(expenseType.title); + }; + const handleClose = () => { + setShowModal(false); + setIsEditMode(false); + setSelectedExpenseType(null); + setExpenseType(""); + }; + const handleSave = async () => { + if (expenseType) { + try { + if (isEditMode && selectedExpenseType) { + // Update existing expense type + const response = await Put( + "vendorDepartmentServiceData", + selectedExpenseType.id, + { title: expenseType, store: storeId, type: "expense type" } // Send the data with store and type + ); + if (response.status === 200) { + setExpenseTypes( + expenseTypes.map((et) => + et.id === selectedExpenseType.id + ? { ...et, title: expenseType } + : et + ) + ); + toast.success("Expense type updated successfully!"); + } else { + console.error("Error updating expense type:", response.data); + toast.error("Error updating expense type: " + response.data); + } + } else { + // Add new expense type + const response = await Post("vendorDepartmentServiceData", { + store: storeId, + type: "expense type", + title: expenseType, + }); + if (response.status === 201) { + setExpenseTypes([...expenseTypes, response.data]); + toast.success("Expense type added successfully!"); + } else { + console.error("Error saving expense type:", response.data); + toast.error("Error saving expense type: " + response.data); + } + } + handleClose(); + } catch (error) { + toast.error( + isEditMode ? "Error updating expense type: " (error.response ? error.response.data : error.message) : + "Error saving expense type: " + (error.response ? error.response.data : error.message) + ); + } + } else { + toast.warn("Expense type is required"); + } + }; + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("vendorDepartmentServiceData", id); + setExpenseTypes(expenseTypes.filter((et) => et.id !== id)); + toast.success("Expense type deleted successfully!"); + } catch (error) { + toast.error("Error deleting expense type: " + (error.response ? error.response.data : error.message)); + } + }; + const data = expenseTypes.filter((et) => et.type === "expense type"); + const columns = [{ header: "Department / Expense Type", field: "title" }]; + return ( + <> +
    +
    +
    Manage Expense Type
    +
    + +
    +
    + + +
    { + e.preventDefault(); + handleSave(); + }} + > +
    + setExpenseType(e.target.value)} + style={{ width: "483px", marginRight: "10px" }} + + /> + +
    +
    +
    + +
    + + ); +} +export default ManageExpenseType; diff --git a/src/components/Pages/AppPAges/ManageSettings/ManageSettings copy.js b/src/components/Pages/AppPAges/ManageSettings/ManageSettings copy.js new file mode 100644 index 0000000..61ca5c2 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ManageSettings copy.js @@ -0,0 +1,753 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useEffect, useState, useContext } from "react"; +import SettingsData from "../../../Schema/SettingsData.json"; +import DataTable from "./DataTable"; +import "./Settings.css"; +import ReusableModal from "./ReusableModal"; +import { toast, ToastContainer } from "react-toastify"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import CustomSwitch from "./CustomSwitch"; +const ManageSettings = () => { + let { user } = useContext(AuthContext); + const storeId = user.store; + const [showModal, setShowModal] = useState(false); + const [formType, setFormType] = useState(""); + const [addPlusVendor, setAddPlusVendor] = useState(""); + const [addMinusVendor, setAddMinusVendor] = useState(""); + const [addNeutralVendor, setAddNeutralVendor] = useState(""); + const [dueDaysList, setDueDaysList] = useState([]); // State for due days + const [editingDueDayId, setEditingDueDayId] = useState(null); // ID of the editing due day + const [dueDays, setDueDays] = useState(""); + const [bankName, setBankName] = useState(""); + const [bankBranch, setBankBranch] = useState(""); + const [accountNumber, setAccountNumber] = useState(""); + const [isDropdownVisible, setIsDropdownVisible] = useState(true); + const [numberOfRegisters, setNumberOfRegisters] = useState(0); + const [numberOfLotteryRegisters, setNumberOfLotteryRegisters] = useState(0); + const [loading, setLoading] = useState(true); + const [selectedRegister, setSelectedRegister] = useState(true); + const [selectedLotteryRegister, setSelectedLotteryRegister] = useState(""); + const [settingId, setSettingId] = useState(null); + const [salesTax, setSalesTax] = useState(0); + const [banks, setBanks] = useState([]); + + + const [plusVendors, setPlusVendors] = useState([ + "Plus Vendor 1", + "Plus Vendor 1", + "Plus Vendor 1", + ]); + const [minusVendors, setMinusVendors] = useState(["Minus Vendor 1"]); + const [neutralVendors, setNeutralVendors] = useState(["Neutral Vendor 1"]); + const { Get, Post, Put, Delete, Patch } = useApi(); + const [checkedStates, setCheckedStates] = useState({ + 1: false, + 2: false, + 3: false, + 4: false, + 5: false, + 6: false, + 7: false, + 8: false, + 9: false, + 10: false, + 11: false, + 12: false, + 13: true, // Always active + 14: true, // Always active + }); + const handleGetMethod = async () => { + setLoading(true); + try { + const response = await Get("settingData"); + if (response && response.length > 0) { + const { no_of_register, no_of_register_lottery, id, sales_tax_percentage } = response[0]; + setNumberOfRegisters(no_of_register); + setNumberOfLotteryRegisters(no_of_register_lottery); + setSettingId(id); // Setting the settingId from the response + setSalesTax(sales_tax_percentage); // Initial sales tax value + setSelectedRegister(no_of_register); + setSelectedLotteryRegister(no_of_register_lottery); + } + } catch (error) { + console.error("Error fetching setting data:", error); + toast.error("Failed to load settings. Please try again."); + } finally { + setLoading(false); + } + }; + + + + const handlePatchSalesTax = async (newSalesTaxValue) => { + if (newSalesTaxValue !== undefined && newSalesTaxValue !== null) { + try { + const payload = { + store: storeId, + sales_tax_percentage: newSalesTaxValue, + }; + + // Send the PATCH request to update the sales tax percentage + const response = await Patch(`settingData`,settingId, payload); // Ensure the correct endpoint format + if (response) { + toast.success("Sales tax updated successfully!"); + } + } catch (error) { + console.error("Error updating sales tax:", error.response || error.message); + toast.error("Failed to update sales tax. Please try again."); + } + } else { + } + }; + + + const handlePatchMethod = async (value) => { + if (!settingId) { + toast.error("Setting ID is missing."); + return; + } + + try { + const payload = { + store: storeId, + no_of_register: value, + }; + const response = await Patch(`settingData`, settingId, payload); + if (response) { + toast.success("Register updated successfully!"); + } + } catch (error) { + console.error("Error updating setting data:", error.response || error.message); + toast.error("Failed to update register. Please try again."); + } + }; + + const handleToggleLotterySetting = async (value) => { + if (!settingId) { + toast.error("Setting ID is missing."); + return; + } + try { + const payload = { + store: storeId, + no_of_register_lottery: value, // This field can be customized based on your API requirements + }; + const response = await Patch(`settingData`, settingId, payload); + if (response) { + toast.success("Lottery setting updated successfully!"); + } + } catch (error) { + console.error("Error updating lottery setting data:", error.response || error.message); + toast.error("Failed to update lottery setting. Please try again."); + } + }; + + + useEffect(() => { + handleGetMethod(); + }, []); + + + const handleIncrementSalesTax = (event) => { + const newSalesTaxValue = parseFloat(event.target.value); + setSalesTax(newSalesTaxValue); // Update the state with the new sales tax value + handlePatchSalesTax(newSalesTaxValue); // Post the updated value immediately + }; + + + const handleRegisterChange = (event) => { + const valueToBeSelectedRegister = event.target.value; + setSelectedRegister(valueToBeSelectedRegister); + handlePatchMethod(valueToBeSelectedRegister); + }; + + const handleLotteryRegisterChange = (event) => { + const valueToBeSelectedLotteryRegister = event.target.value; + setSelectedLotteryRegister(valueToBeSelectedLotteryRegister); + handleToggleLotterySetting(valueToBeSelectedLotteryRegister); + }; + + const handleShow = (type) => { + setFormType(type); + setShowModal(true); + }; + useEffect(() => { + const fetchBanks = async () => { + try { + const response = await Get("bank"); + setBanks(response); // Assuming response.data is an array of banks + } catch (error) { + console.error("Error fetching bank data", error); + } + }; + const fetchDueDays = async () => { + try { + const response = await Get("dueDaysData"); + setDueDaysList(response); + } catch (error) { + console.error("Error fetching due days", error); + } + }; + + handlePatchSalesTax() + fetchBanks(); + fetchDueDays(); + }, []); + const handleClose = () => { + setShowModal(false); + setBankName(""); + setBankBranch(""); + setAccountNumber(""); + setDueDays(""); + setEditingDueDayId(null); // Reset branch on close + }; + + + const staticRegisters = [ + { value: 1, label: "1" }, + { value: 2, label: "2" }, + { value: 3, label: "3" }, + { value: 4, label: "4" }, + { value: 5, label: "5" }, + ]; + + const renderOptions = (selectedValue, numberOfRegisters) => ( + <> + {/* */} + {/* {selectedValue && ( + + )} */} + {staticRegisters.map((register) => ( + + ))} + + ); + + const handleSaveBank = async () => { + if (bankName && bankBranch && accountNumber && storeId) { + try { + const newBank = { + name: bankName, + branch: bankBranch, + account_no: accountNumber, + store: storeId, + }; + // Make the API call to add the bank + const response = await Post("bank", newBank); + setBanks((prevBanks) => [...prevBanks, response.data]); + toast.success("Bank added successfully!"); + handleClose(); // Close the form/modal + } catch (error) { + console.error("Error adding bank", error); + toast.error("Error adding bank. Please try again."); + } + } else { + toast.warn("Please fill in all required fields."); + } + }; + const handleDeleteBank = async (bankId) => { + try { + await Delete("bank", bankId); + setBanks((prevBanks) => prevBanks.filter((bank) => bank.id !== bankId)); + toast.success("Bank deleted successfully!"); + } catch (error) { + console.error("Error deleting bank:", error); + toast.error("Error deleting bank. Please try again."); + } + }; + const handleSaveDueDays = async () => { + if (dueDays) { + const newDueDay = { days: dueDays, store: storeId }; + try { + if (editingDueDayId) { + // Update existing due day + await Put("dueDaysData", editingDueDayId, newDueDay); + setDueDaysList((prevList) => + prevList.map((day) => + day.id === editingDueDayId + ? { ...day, days: dueDays, store: storeId } + : day + ) + ); + toast.success("Due day updated successfully!"); + } else { + const response = await Post("dueDaysData", newDueDay); + + // Ensure the response is correctly handled + if (response && response.data) { + const createdDueDay = response.data; // Get the actual response data + setDueDaysList((prevList) => [...prevList, createdDueDay]); + toast.success("Due day added successfully!"); + } else { + toast.error("Failed to retrieve the created due day data."); + } + } + handleClose(); + } catch (error) { + console.error("Error adding or updating due day:", error); + toast.error("Error saving due day. Please try again."); + } + } else { + toast.warn("Due days value is required."); + } + }; + + const handleEditDueDay = (day) => { + setDueDays(day.days); + setEditingDueDayId(day.id); + handleShow("dueDays"); + }; + const handleDeleteDueDay = async (dayId) => { + try { + await Delete("dueDaysData", dayId); + setDueDaysList((prevList) => prevList.filter((day) => day.id !== dayId)); + toast.success("Due day deleted successfully!"); + } catch (error) { + console.error("Error deleting due day", error); + toast.error("Error deleting due day. Please try again."); + } + }; + + const handleSavePlusVendor = () => { + if (addPlusVendor) { + setPlusVendors([...plusVendors, addPlusVendor]); + handleClose(); + } + }; + const handleSaveMinusVendor = () => { + if (addMinusVendor) { + setMinusVendors([...minusVendors, addMinusVendor]); + handleClose(); + } + }; + const handleSaveNeutralVendor = () => { + if (addNeutralVendor) { + setNeutralVendors([...neutralVendors, addNeutralVendor]); + handleClose(); + } + }; + + const handleSwitchChange = async (id) => { + // Always keep IDs 13 and 14 active + if (id === 13 || id === 14) { + setCheckedStates((prevState) => ({ + ...prevState, + [id]: true, + })); + return; + } + + // Toggle state for other IDs + const newState = !checkedStates[id]; + setCheckedStates((prevState) => ({ + ...prevState, + [id]: newState, + })); + }; + + + + + const combinedVendors = [ + ...plusVendors.map((vendor) => ({ name: vendor, type: "Plus" })), + ...minusVendors.map((vendor) => ({ name: vendor, type: "Minus" })), + ...neutralVendors.map((vendor) => ({ name: vendor, type: "Neutral" })), + ]; + const columns = [{ header: "Store Vendor Name", field: "name" }]; + return ( + <> +
    + +

    Manage Settings

    +
    + {SettingsData.map((setting) => ( +
    +
    +
    +

    {setting.question}

    + + +
    +
    +
    + ))} + +
    +
    + {isDropdownVisible && ( + + )} +
    +
    + {isDropdownVisible && ( + + )} +
    +
    +
    + +
    +
    + handleIncrementSalesTax(e.target.value)} // Handle change + placeholder="Enter percentage" + className="form-control" + /> +
    +
    + + +
    + + +
    +
    +
    +
    +
    Manage Bank
    + +
    +
    +
    + {banks.map((bank, index) => ( +
    +
    +
    +
    Bank Name
    +
    {bank.name}
    +
    +
    +
    Bank Short Name
    +
    {bank.branch}
    +
    + handleDeleteBank(bank.id)} + className="del-icon" + width="20" + height="21" + viewBox="0 0 20 21" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + + +
    + + + + +
    + ))} +
    + +
    +
    + setBankName(e.target.value)} + className="input-field" + placeholder="Bank Name" + style={{ width: "483px", marginRight: "10px" }} + /> + setBankBranch(e.target.value)} + className="input-field" + placeholder="Bank Short Name" + style={{ width: "483px", marginRight: "10px" }} + /> +
    +
    + setAccountNumber(e.target.value)} + className="input-field" + placeholder="Account Number" + style={{ width: "483px", marginRight: "10px" }} + /> +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    Due Days
    + +
    +
    + {dueDaysList.map((day, index) => ( +
    +
    +
    +
    Due Days
    +
    +
    + handleEditDueDay(day)} + > + + + handleDeleteDueDay(day.id)} + > + + +
    +
    +
    + +
    + +
    + ))} +
    + +
    +
    + setDueDays(e.target.value)} + className="input-field" + placeholder="Due Days" + style={{ width: "483px", marginRight: "10px" }} + /> + +
    +
    +
    +
    + {/*
    +
    +
    Other Vendors
    +
    +
    + + + +
    +
    +
    + +
    +
    + setAddPlusVendor(e.target.value)} + className="input-field" + placeholder="Add Plus Vendor" + style={{ width: "483px", marginRight: "10px" }} + /> + +
    +
    +
    + +
    +
    + setAddMinusVendor(e.target.value)} + className="input-field" + placeholder="Add Minus Vendor" + style={{ width: "483px", marginRight: "10px" }} + /> + +
    +
    +
    + {} + {} +
    */} + + ); +}; +export default ManageSettings; diff --git a/src/components/Pages/AppPAges/ManageSettings/ManageSettings.js b/src/components/Pages/AppPAges/ManageSettings/ManageSettings.js new file mode 100644 index 0000000..5f344b8 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ManageSettings.js @@ -0,0 +1,694 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useEffect, useState, useContext } from "react"; +import SettingsData from "../../../Schema/SettingsData.json"; +import DataTable from "./DataTable"; +import "./Settings.css"; +import Swal from "sweetalert2"; +import ReusableModal from "./ReusableModal"; +import { toast, ToastContainer } from "react-toastify"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import CustomSwitch from "./CustomSwitch"; +const ManageSettings = () => { + let { user } = useContext(AuthContext); + const storeId = user.store; + const [showModal, setShowModal] = useState(false); + const [formType, setFormType] = useState(""); + const [addPlusVendor, setAddPlusVendor] = useState(""); + const [addMinusVendor, setAddMinusVendor] = useState(""); + const [addNeutralVendor, setAddNeutralVendor] = useState(""); + const [dueDaysList, setDueDaysList] = useState([]); // State for due days + const [editingDueDayId, setEditingDueDayId] = useState(null); // ID of the editing due day + const [dueDays, setDueDays] = useState(""); + const [bankName, setBankName] = useState(""); + const [bankBranch, setBankBranch] = useState(""); + const [accountNumber, setAccountNumber] = useState(""); + const [isDropdownVisible, setIsDropdownVisible] = useState(true); + const [numberOfRegisters, setNumberOfRegisters] = useState(0); + const [numberOfLotteryRegisters, setNumberOfLotteryRegisters] = useState(0); + const [loading, setLoading] = useState(true); + const [selectedRegister, setSelectedRegister] = useState(true); + const [selectedLotteryRegister, setSelectedLotteryRegister] = useState(""); + const [settingId, setSettingId] = useState(null); + const [salesTax, setSalesTax] = useState(0); + const [banks, setBanks] = useState([]); + + const [plusVendors, setPlusVendors] = useState([ + "Plus Vendor 1", + "Plus Vendor 1", + "Plus Vendor 1", + ]); + const [minusVendors, setMinusVendors] = useState(["Minus Vendor 1"]); + const [neutralVendors, setNeutralVendors] = useState(["Neutral Vendor 1"]); + const { Get, Post, Put, Delete, Patch } = useApi(); + const [checkedStates, setCheckedStates] = useState({ + 1: false, + 2: false, + 3: false, + 4: false, + 5: false, + 6: false, + 7: false, + 8: false, + 9: false, + 10: false, + 11: false, + 12: false, + 13: true, // Always active + 14: true, // Always active + }); + const handleGetMethod = async () => { + setLoading(true); + try { + const response = await Get("settingData"); + if (response && response.length > 0) { + const { + no_of_register, + no_of_register_lottery, + id, + sales_tax_percentage, + } = response[0]; + setNumberOfRegisters(no_of_register); + setNumberOfLotteryRegisters(no_of_register_lottery); + setSettingId(id); // Setting the settingId from the response + setSalesTax(sales_tax_percentage); // Initial sales tax value + setSelectedRegister(no_of_register); + setSelectedLotteryRegister(no_of_register_lottery); + } + } catch (error) { + console.error("Error fetching setting data:", error); + toast.error("Failed to load settings. Please try again."); + } finally { + setLoading(false); + } + }; + + const handlePatchSalesTax = async (newSalesTaxValue) => { + if (newSalesTaxValue !== undefined && newSalesTaxValue !== null) { + try { + const payload = { + store: storeId, // Ensure correct store ID is used + sales_tax_percentage: newSalesTaxValue, // Send updated sales tax + }; + + const response = await Patch(`settingData`, settingId, payload); // Update setting data + if (response) { + toast.success("Sales tax updated successfully!"); + } + } catch (error) { + console.error("Error updating sales tax:", error); + toast.error("Failed to update sales tax. Please try again."); + } + } + }; + + const handlePatchMethod = async (value) => { + if (!settingId) { + toast.error("Setting ID is missing."); + return; + } + + try { + const payload = { + store: storeId, + no_of_register: value, + }; + const response = await Patch(`settingData`, settingId, payload); + if (response) { + toast.success("Register updated successfully!"); + } + } catch (error) { + console.error( + "Error updating setting data:", + error.response || error.message + ); + toast.error("Failed to update register. Please try again."); + } + }; + + const handleToggleLotterySetting = async (value) => { + if (!settingId) { + toast.error("Setting ID is missing."); + return; + } + try { + const payload = { + store: storeId, + no_of_register_lottery: value, // This field can be customized based on your API requirements + }; + const response = await Patch(`settingData`, settingId, payload); + if (response) { + toast.success("Lottery setting updated successfully!"); + } + } catch (error) { + console.error( + "Error updating lottery setting data:", + error.response || error.message + ); + toast.error("Failed to update lottery setting. Please try again."); + } + }; + + useEffect(() => { + handleGetMethod(); + }, []); + + const handleIncrementSalesTax = async (event) => { + const newSalesTaxValue = parseFloat(event.target.value); + + if (!isNaN(newSalesTaxValue)) { + setSalesTax(newSalesTaxValue); // Update local state + + // Call the API to update the sales tax on the backend + try { + await handlePatchSalesTax(newSalesTaxValue); // Ensure this function is defined correctly + } catch (error) { + toast.error("Failed to update sales tax"); + } + } else { + setSalesTax(""); // Optionally, handle invalid value input + toast.error("Invalid sales tax value."); + } + }; + + const handleRegisterChange = (event) => { + const valueToBeSelectedRegister = event.target.value; + setSelectedRegister(valueToBeSelectedRegister); + handlePatchMethod(valueToBeSelectedRegister); + }; + + const handleLotteryRegisterChange = (event) => { + const valueToBeSelectedLotteryRegister = event.target.value; + setSelectedLotteryRegister(valueToBeSelectedLotteryRegister); + handleToggleLotterySetting(valueToBeSelectedLotteryRegister); + }; + + const handleShow = (type) => { + setFormType(type); + setShowModal(true); + }; + useEffect(() => { + const fetchBanks = async () => { + try { + const response = await Get("bank"); + setBanks(response); // Assuming response.data is an array of banks + } catch (error) { + console.error("Error fetching bank data", error); + } + }; + const fetchDueDays = async () => { + try { + const response = await Get("dueDaysData"); + setDueDaysList(response); + } catch (error) { + console.error("Error fetching due days", error); + } + }; + + handlePatchSalesTax(); + fetchBanks(); + fetchDueDays(); + }, []); + const handleClose = () => { + setShowModal(false); + setBankName(""); + setBankBranch(""); + setAccountNumber(""); + setDueDays(""); + setEditingDueDayId(null); // Reset branch on close + }; + + const staticRegisters = [ + { value: 1, label: "1" }, + { value: 2, label: "2" }, + { value: 3, label: "3" }, + { value: 4, label: "4" }, + { value: 5, label: "5" }, + ]; + + const renderOptions = (selectedValue, numberOfRegisters) => ( + <> + {/* */} + {/* {selectedValue && ( + + )} */} + {staticRegisters.map((register) => ( + + ))} + + ); + + const handleSaveBank = async () => { + if (bankName && bankBranch && accountNumber && storeId) { + try { + const newBank = { + name: bankName, + branch: bankBranch, + account_no: accountNumber, + store: storeId, + }; + // Make the API call to add the bank + const response = await Post("bank", newBank); + setBanks((prevBanks) => [...prevBanks, response.data]); + toast.success("Bank added successfully!"); + handleClose(); // Close the form/modal + } catch (error) { + console.error("Error adding bank", error); + toast.error("Error adding bank. Please try again."); + } + } else { + toast.warn("Please fill in all required fields."); + } + }; + const handleDeleteBank = async (bankId) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + + try { + await Delete("bank", bankId); + setBanks((prevBanks) => prevBanks.filter((bank) => bank.id !== bankId)); + toast.success("Bank deleted successfully!"); + } catch (error) { + console.error("Error deleting bank:", error); + toast.error("Error deleting bank. Please try again."); + } + }; + const handleSaveDueDays = async () => { + if (dueDays) { + const newDueDay = { days: dueDays, store: storeId }; + try { + if (editingDueDayId) { + // Update existing due day + await Put("dueDaysData", editingDueDayId, newDueDay); + setDueDaysList((prevList) => + prevList.map((day) => + day.id === editingDueDayId + ? { ...day, days: dueDays, store: storeId } + : day + ) + ); + toast.success("Due day updated successfully!"); + } else { + const response = await Post("dueDaysData", newDueDay); + + // Ensure the response is correctly handled + if (response && response.data) { + const createdDueDay = response.data; // Get the actual response data + setDueDaysList((prevList) => [...prevList, createdDueDay]); + toast.success("Due day added successfully!"); + } else { + toast.error("Failed to retrieve the created due day data."); + } + } + handleClose(); + } catch (error) { + console.error("Error adding or updating due day:", error); + toast.error("Error saving due day. Please try again."); + } + } else { + toast.warn("Due days value is required."); + } + }; + + const handleEditDueDay = (day) => { + setDueDays(day.days); + setEditingDueDayId(day.id); + handleShow("dueDays"); + }; + const handleDeleteDueDay = async (dayId) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("dueDaysData", dayId); + setDueDaysList((prevList) => prevList.filter((day) => day.id !== dayId)); + toast.success("Due day deleted successfully!"); + } catch (error) { + console.error("Error deleting due day", error); + toast.error("Error deleting due day. Please try again."); + } + }; + + const handleSavePlusVendor = () => { + if (addPlusVendor) { + setPlusVendors([...plusVendors, addPlusVendor]); + handleClose(); + } + }; + const handleSaveMinusVendor = () => { + if (addMinusVendor) { + setMinusVendors([...minusVendors, addMinusVendor]); + handleClose(); + } + }; + const handleSaveNeutralVendor = () => { + if (addNeutralVendor) { + setNeutralVendors([...neutralVendors, addNeutralVendor]); + handleClose(); + } + }; + + const handleSwitchChange = async (id) => { + // Always keep IDs 13 and 14 active + if (id === 13 || id === 14) { + setCheckedStates((prevState) => ({ + ...prevState, + [id]: true, + })); + return; + } + + // Toggle state for other IDs + const newState = !checkedStates[id]; + setCheckedStates((prevState) => ({ + ...prevState, + [id]: newState, + })); + }; + + const combinedVendors = [ + ...plusVendors.map((vendor) => ({ name: vendor, type: "Plus" })), + ...minusVendors.map((vendor) => ({ name: vendor, type: "Minus" })), + ...neutralVendors.map((vendor) => ({ name: vendor, type: "Neutral" })), + ]; + const columns = [{ header: "Store Vendor Name", field: "name" }]; + return ( + <> +
    + +

    Manage Settings

    +
    + {SettingsData.map((setting) => ( +
    +
    +
    +

    {setting.question}

    + + +
    +
    +
    + ))} + +
    +
    + {isDropdownVisible && ( + + )} +
    +
    + {isDropdownVisible && ( + + )} +
    +
    +
    + +
    +
    + setSalesTax(e.target.value)} // Allow editing the value while typing + placeholder="Enter percentage" + className="form-control" + /> +
    +
    +
    +
    +
    +
    +
    +
    Manage Bank
    + +
    +
    +
    + {banks.map((bank, index) => ( +
    +
    +
    +
    Bank Name
    +
    {bank.name}
    +
    +
    +
    Bank Short Name
    +
    {bank.branch}
    +
    + handleDeleteBank(bank.id)} + className="del-icon" + width="20" + height="21" + viewBox="0 0 20 21" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + + +
    + {/* + + + */} +
    + ))} +
    + +
    +
    + setBankName(e.target.value)} + className="input-field" + placeholder="Bank Name" + style={{ width: "483px", marginRight: "10px" }} + /> + setBankBranch(e.target.value)} + className="input-field" + placeholder="Bank Short Name" + style={{ width: "483px", marginRight: "10px" }} + /> +
    +
    + setAccountNumber(e.target.value)} + className="input-field" + placeholder="Account Number" + style={{ width: "483px", marginRight: "10px" }} + /> +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    Due Days
    + +
    +
    + {dueDaysList.map((day, index) => ( +
    +
    +
    +
    Due Days
    +
    +
    + handleEditDueDay(day)} + > + + + handleDeleteDueDay(day.id)} + > + + +
    +
    +
    + +
    + {/* */} +
    + ))} +
    + +
    +
    + setDueDays(e.target.value)} + className="input-field" + placeholder="Due Days" + style={{ width: "483px", marginRight: "10px" }} + /> + +
    +
    +
    +
    + + ); +}; +export default ManageSettings; diff --git a/src/components/Pages/AppPAges/ManageSettings/ManageUserTable.js b/src/components/Pages/AppPAges/ManageSettings/ManageUserTable.js new file mode 100644 index 0000000..43027b0 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ManageUserTable.js @@ -0,0 +1,473 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState } from "react"; + +const ManageUserTable = ({ + data, + columns, + showAction, + showFooter, + onEdit, + onDelete, + showExport, + showFilter, +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + + const statusStyles = { + enable: { + backgroundColor: "#6CBE1C", // Green background for Enable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + disable: { + backgroundColor: "#6c757d", // Red background for Disable + color: "#000", + borderRadius: "30px", + padding: "5px 10px", + }, + + }; + + const downloadCSV = () => { + const headers = columns.map((col) => col.header).join(",") + "\n"; + const rows = data + .map((row) => + columns.map((col) => String(row[col.field] || "")).join(",") + ) + .join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const [showDropdown, setShowDropdown] = useState(false); + const handleFilterClick = () => { + setShowDropdown(!showDropdown); // Toggle the dropdown + }; + + const renderFilterDropdown = () => { + return ( +
    + + + + + +
    + ); + }; + + const dropdownStyles = { + position: "absolute", + top: "100%", + left: "0", + backgroundColor: "white", + border: "1px solid #ddd", + padding: "10px", + boxShadow: "0px 4px 8px rgba(0,0,0,0.1)", + borderRadius: "4px", + zIndex: "1", + }; + // Calculate the total net sales from the data +// const totalNetSales = data.reduce((acc, item) => { +// const amount = Number(item.total_net_sales) || 0; // Make sure to handle non-numeric values +// return acc + amount; +// }, 0).toFixed(2); // + return ( +
    +
    +
    +
    + setSearchTerm(e.target.value)} + placeholder="Search" + /> + + + + +
    + {showExport && ( // Conditionally render the button based on showExport prop + + )} + {showFilter && ( +
    + + {showDropdown && renderFilterDropdown()} +
    + )} +
    +
    +

    Show

    + +
    +
    + + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.length === 0 ? ( + + + + ) : ( + sortedDisplayedData.map((item) => ( + + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + )) + )} + + +
    + No + handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    + No data found +
    + {(currentPage - 1) * rowsPerPage + sortedDisplayedData.indexOf(item) + 1} + + + {col.field === "is_active" ? ( +
    + {item.is_active === false ? "Disable" : "Enable"} +
    + ) : col.field === "joining_date" ? ( + // Format the 'joining_date' in 'mm-dd-yyyy' format + new Date(item.joining_date).toLocaleDateString("en-US") + ) : item[col.field] !== undefined && item[col.field] !== null ? ( + typeof item[col.field] === "function" ? item[col.field]() : item[col.field] + ) : ( + "-" + )} +
    + + +
    + {showFooter && ( + + )} +
    + ); +}; + +export default ManageUserTable; diff --git a/src/components/Pages/AppPAges/ManageSettings/ManageUsers.js b/src/components/Pages/AppPAges/ManageSettings/ManageUsers.js new file mode 100644 index 0000000..e187558 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ManageUsers.js @@ -0,0 +1,691 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import ReusableModal from "./ReusableModal"; +import config from "../../../../config/Global.json"; +import "./Settings.css"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import { toast, ToastContainer } from "react-toastify"; +import CustomSwitch from "./CustomSwitch"; +import ManageUserTable from "./ManageUserTable"; +import Swal from "sweetalert2"; + + +function ManageUsers() { + const { user } = useContext(AuthContext); + const storeId = user.store; + const [activeModal, setActiveModal] = useState(false); + const [activeStoreModal, setActiveStoreModal] = useState(false); + const [assignOwnerModal, setAssignOwnerModal] = useState(false); + const [users, setUsers] = useState([]); + const [roles, setRoles] = useState([]); + const [fullName, setFullName] = useState(""); + const [email, setEmail] = useState(""); + const [phoneNumber, setPhoneNumber] = useState(""); + const [role, setRole] = useState(""); + const [status, setStatus] = useState(false); + const [currentUserId, setCurrentUserId] = useState(null); + const [ownerEmail, setOwnerEmail] = useState(""); // State for owner's email + const { Get, Post, Patch, Delete } = useApi(); + + + + const [loading, setLoading] = useState(false); + const [pincodeErrorMsg, setPincodeErrorMsg] = useState(""); + const [pincodeErrorFlag, setPincodeErrorFlag] = useState(false); + const [formData, setFormData] = useState({ + email: "", + store_name: "", + address_line1: "", + pincode: "", + city: "", + state: "", + country: "", + }); + + + useEffect(() => { + fetchUsersAndRoles(); + }, []); + + + const fetchUsersAndRoles = async () => { + try { + const [usersResponse, rolesResponse] = await Promise.all([ + Get("user"), + Get("msRole"), + ]); + + if (usersResponse.error) throw new Error(usersResponse.error); + if (rolesResponse.error) throw new Error(rolesResponse.error); + + setUsers( + Array.isArray(usersResponse.results) ? usersResponse.results : [] + ); + const roles = Array.isArray(rolesResponse.results) + ? rolesResponse.results + : []; + setRoles(roles.map((role) => ({ id: role.id, name: role.role_name }))); + } catch (error) { + console.error("Error fetching data:", error); + toast.error("Error fetching users or roles."); + } + }; + + + const handleShowUserModal = (user = null) => { + if (user) { + // If user is provided, it means we are editing + setCurrentUserId(user.id); + setFullName(user.first_name); + setEmail(user.email); + setPhoneNumber(user.contact_no); + setRole(user.ms_role); + setStatus(user.is_active); + } else { + // Reset fields for adding a new user + setCurrentUserId(null); + setFullName(""); + setEmail(""); + setPhoneNumber(""); + setRole(""); + setStatus(false); + } + setActiveModal(true); + }; + + const handleCloseUserModal = () => setActiveModal(false); + + const handleCloseAssignOwnerModal = () => { + setAssignOwnerModal(false); // Close the modal + setOwnerEmail(""); // Clear the owner's email state + }; + const handleCloseStoreModal = () => setActiveStoreModal(false); + + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + + try { + await Delete("user", id); + setUsers((prev) => prev.filter((user) => user.id !== id)); // Remove the user from the list + toast.success("User deleted successfully!"); + } catch (error) { + console.error("Error deleting user:", error); + + // Check if the error response contains the specific message + if (error.response && error.response.data && error.response.data.detail === "Store owners cannot be deleted.") { + toast.error("Store owners cannot be deleted."); + } else { + toast.error("Error deleting user!"); + } + } + }; + const handleSaveUser = async () => { + const emailRegex = /^[\w.-]+@[a-zA-Z\d.-]+\.[a-zA-Z]{2,}$/; // Email regex without # + const phoneRegex = /^[0-9]{10}$/; // US phone number regex for exactly 11 digits (starts with '1' for the country code) + + // Validate email + if (!emailRegex.test(email)) { + toast.error("Please enter a valid email address (no '#' allowed)."); + return; + } + + // Validate phone number + if (!phoneRegex.test(phoneNumber)) { + toast.error("Please enter a valid US phone number (11 digits, starts with '1')."); + return; + } + + // Derive role name from roles array + const roleName = roles.find((r) => String(r.id) === String(role))?.name || ""; + + const payload = { + first_name: fullName, + email: email, + contact_no: phoneNumber, + ms_role: role, // Role ID + store: storeId, + is_active: status, + groups: [], + ms_role_name: roleName, // Derived role name + }; + + try { + if (currentUserId) { + // Update user + await Patch("user", currentUserId, payload); + + // Update local state + setUsers((prevUsers) => + prevUsers.map((user) => + user.id === currentUserId ? { ...user, ...payload } : user + ) + ); + + toast.success("User updated successfully!"); + } else { + // Add new user + await Post("user", payload); + + // Fetch updated users + const updatedUsers = await Get("user"); + setUsers(updatedUsers.results); + + toast.success("User added successfully!"); + } + + handleCloseUserModal(); + } catch (error) { + console.error("Error saving user:", error); + + // Check for specific error responses + if (error.response && error.response.data) { + if (error.response.data.ms_role === "You cannot change the role of a store owner.") { + toast.error("Store owner roles cannot be changed."); + } else if (error.response.data.is_active === "Store owners cannot be deactivated.") { + toast.error("Store owners cannot be deactivated."); + } else { + toast.error("Error saving user!"); + } + } else { + toast.error("Error saving user!"); + } + } + }; + + + const handleAssignOwnerSubmit = async (e) => { + e.preventDefault(); + + try { + const response = await Post("assignAsOwner", { email: ownerEmail }); + + // If successful, show success message + toast.success("User assigned as owner successfully!"); + setOwnerEmail(""); // Clear input + fetchUsersAndRoles(); // Refresh the users and roles + handleCloseAssignOwnerModal(); // Close the modal + + } catch (error) { + console.error("Error assigning owner:", error); + + // Check if the error contains a specific message + if (error.response && error.response.data && error.response.data.error === "User with this email does not exist.") { + toast.error("The email you provided does not exist."); + } else { + toast.error("Error assigning owner!"); + } + } + }; + + + const handleSwitchChange = (id) => { + setStatus((prevStatus) => !prevStatus); + }; + + // store api calling + const fetchLocationDetails = async (pincode) => { + const apiUrl = `${config.api.host}${config.api.getPincodeData}`; + try { + const response = await Post(apiUrl, { pincode }); + const { city, state, country } = response.data; + + setFormData((prevData) => ({ + ...prevData, + city: city || "", + state: state || "", + country: country || "", + })); + + setPincodeErrorMsg(""); // Clear error message + setPincodeErrorFlag(false); + } catch (error) { + setPincodeErrorMsg("Failed to fetch location details."); + setPincodeErrorFlag(true); + } + }; + + // Handle pincode change + const handlePincodeChange = (e) => { + const { value } = e.target; + + // Allow only numeric input + const numericValue = value.replace(/[^0-9]/g, ''); + + setFormData((prevData) => ({ + ...prevData, + pincode: numericValue, + ...(numericValue.trim() === "" && { city: "", state: "", country: "" }), + })); + + // Trigger fetching location details if the length is valid + if (numericValue.length === 5 || numericValue.length === 6) { + fetchLocationDetails(numericValue); + } +}; + // Handle pincode blur + const handlePincodeBlur = () => { + const { pincode } = formData; + if (pincode.length === 5 || pincode.length === 6) { + fetchLocationDetails(pincode); + setPincodeErrorMsg(""); + setPincodeErrorFlag(false); + } else { + setPincodeErrorMsg("Pincode must be 5 or 6 digits."); + setPincodeErrorFlag(true); + } + }; + + // Validate form fields + const validateForm = () => { + const { email, store_name, address_line1, pincode, city, state, country } = formData; + if (!email || !store_name || !address_line1 || !pincode || !city || !state || !country) { + alert("All fields are required!"); + return false; + } + if (!/^\d{5,6}$/.test(pincode)) { + alert("Pincode must be 5 or 6 digits."); + return false; + } + return true; + }; + + // Save store data // + + const handleSaveStore = async () => { + if (!validateForm()) return; + + setLoading(true); + try { + const response = await Post('additionalStore', formData); + toast.success("Store added successfully!"); + + setFormData({ + email: "", + store_name: "", + address_line1: "", + pincode: "", + city: "", + state: "", + country: "", + }); + + setActiveStoreModal(false); + } catch (error) { + console.error("Error adding store:", error); + toast.error("Failed to add store. Please try again."); + } finally { + setLoading(false); + } + }; + + + const handleShowStoreModal = async (store = null) => { + // Reset the form data first + const initialFormData = { + email: "", + store_name: "", + address_line1: "", + pincode: "", + city: "", + state: "", + country: "", + }; + + if (store) { + // Populate form data if store is provided + setFormData({ + email: "", + store_name: "", + address_line1: "", + pincode: "", + city: "", + state: "", + country: "", + }); + } else { + // Fetch user data and set email if adding a new store + try { + const response = await Get("user"); + const currentUser = response.results[0]; + // Update email in form data + initialFormData.email = currentUser?.email || ""; + } catch (error) { + console.error("Error fetching user data:", error); + } + + setFormData(initialFormData); + } + + setActiveStoreModal(true); + }; + + + + const columns = [ + { header: "Name", field: "first_name" }, + { header: "Email Address", field: "email" }, + { header: "Phone Number", field: "contact_no" }, + { header: "Role", field: "ms_role_name" }, + { header: "Join Date", field: "joining_date" }, + { header: "Status", field: "is_active" }, + ]; + + return ( + <> + +
    +
    +
    Manage Users
    +
    + + + +
    +
    + handleShowUserModal(handleEdit)} // Open modal for editing user + onDelete={handleDelete} + /> +
    + + {activeModal && ( + +
    +
    +
    + setFullName(e.target.value)} + style={{ width: "483px", marginRight: "10px" }} + /> + setEmail(e.target.value)} + style={{ width: "483px", marginRight: "10px" }} + /> +
    +
    + { + + const input = e.target.value.replace(/[^0-9]/g, ''); + if (input.length <= 10) { + setPhoneNumber(input); + } + }} + maxLength={10} + style={{ width: "483px", marginRight: "10px" }} + /> + +
    +
    + + setStatus(!status)} // Toggle status + disabled={status === false} // Disable switch if status is false + /> +
    +
    + +
    +
    +
    +
    + )} + + + {/* / store modal/ */} + + {activeStoreModal && ( + +
    +
    + {/* Wrapper for Flexbox */} +
    + {/* Left Side */} +
    +
    + + setFormData((prevData) => ({ + ...prevData, + store_name: e.target.value, + })) + } + style={{ width: "100%" }} + /> +
    +
    + + setFormData((prevData) => ({ + ...prevData, + address_line1: e.target.value, + })) + } + style={{ width: "100%" }} + /> +
    +
    + +
    +
    + + {/* Right Side */} +
    +
    + +
    + {pincodeErrorFlag && ( + {pincodeErrorMsg} + )} +
    + +
    +
    + +
    +
    +
    + + {/* Submit Button */} +
    + +
    +
    +
    +
    + )} + + + {assignOwnerModal && ( + +
    +
    + setOwnerEmail(e.target.value)} + style={{ width: "483px", marginRight: "20px" }} + required + /> +
    + +
    +
    + + +
    + +
    + )} + + ); +} + +export default ManageUsers; diff --git a/src/components/Pages/AppPAges/ManageSettings/ManageVendor.js b/src/components/Pages/AppPAges/ManageSettings/ManageVendor.js new file mode 100644 index 0000000..75416ea --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ManageVendor.js @@ -0,0 +1,348 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import ReusableModal from "./ReusableModal"; +import "./Settings.css"; + +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import { toast , ToastContainer} from "react-toastify"; +import SettingTable from "./SettingTable"; +import Swal from "sweetalert2"; + +function ManageVendor() { + const { user } = useContext(AuthContext); + const storeId = user.store; + const [showModal, setShowModal] = useState(false); + const [vendorName, setVendorName] = useState(""); + const [vendorType, setVendorType] = useState(""); + const [vendorDepartments, setVendorDepartments] = useState([]); + const [openingBalance, setOpeningBalance] = useState(""); + const [vendors, setVendors] = useState([]); + const [serviceData, setServiceData] = useState([]); + const [editVendorId, setEditVendorId] = useState(null); + + + const { Get, Post, Put, Delete , Patch } = useApi(); + + useEffect(() => { + const fetchData = async () => { + try { + const [vendorsResponse, serviceResponse] = await Promise.all([ + Get("vendorDepartmentData"), + Get("vendorDepartmentServiceData"), + ]); + setVendors(vendorsResponse); + setServiceData(serviceResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + fetchData(); + }, []); + + const handleShow = () => setShowModal(true); + const handleClose = () => { + setShowModal(false); + setVendorName(""); + setVendorType(""); + setVendorDepartments([]); + setOpeningBalance(""); + setEditVendorId(null); + }; + + const handleEdit = (vendor) => { + setVendorName(vendor.name); + setVendorType(vendor.type); + setVendorDepartments(vendor.vendor_department_service || []); + setOpeningBalance(vendor.opening_balance); + setEditVendorId(vendor.id); + setShowModal(true); + }; + + const handleSave = async () => { + try { + // Fetch the current list of vendors + const existingVendors = await Get("vendorDepartmentData"); + + // Check if a vendor with the same name already exists + const isDuplicate = existingVendors.some( + (vendor) => vendor.name.toLowerCase() === vendorName.toLowerCase() && vendor.id !== editVendorId + ); + + if (isDuplicate) { + toast.error("Vendor with the same name already exists!"); + return; // Exit the function early + } + + const payload = { + name: vendorName, + type: vendorType, + opening_balance: openingBalance, + vendor_department_service: vendorDepartments, + store: storeId, + is_deleted: false, + }; + + if (editVendorId) { + const updatedVendor = await Put("vendorDepartmentData", editVendorId, payload); + // Assuming `updatedVendor` contains the updated vendor data + setVendors((prev) => prev.map((vendor) => (vendor.id === editVendorId ? updatedVendor.data : vendor))); + toast.success("Vendor updated successfully!"); + } else { + // Add new vendor + const response = await Post("vendorDepartmentData", payload); + // Update the vendor list locally + setVendors((prev) => [...prev, response.data]); + toast.success("Vendor added successfully!"); + } + + handleClose(); + } catch (error) { + console.error("Error saving vendor:", error); + toast.error("Error saving vendor!"); + } + }; + + const filteredVendors = vendors.filter(vendor => !vendor.is_deleted); + + // const handleDelete = async (id) => { + // const result = await Swal.fire({ + // title: "Are you sure?", + // text: "You won't be able to revert this!", + // icon: "warning", + // showCancelButton: true, + // confirmButtonColor: "#d33", + // cancelButtonColor: "#3085d6", + // confirmButtonText: "Yes, delete it!", + // }); + + // // Check if the user clicked the confirm button + // if (!result.isConfirmed) return; // Exit if the user cancels + // try { + // await Delete("vendorDepartmentData", id); + // setVendors((prev) => prev.filter((vendor) => vendor.id !== id)); + // toast.success("Vendor deleted successfully!"); + // } catch (error) { + // console.error("Error deleting vendor:", error); + // toast.error("Error deleting vendor!"); + // } + // }; + + +// is deleted is true with condition (backend side false )// + const handleDelete = async (id) => { + console.log("Vendor ID to delete:", id); + + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) { + return; + } + + try { + const payload = { is_deleted: true }; + const response = await Patch("vendorDepartmentData", id, payload); + console.log(payload) + setVendors((prev) => prev.filter((vendor) => vendor.id !== id)); + toast.success("Vendor deleted successfully!") + } catch (error) { + console.error("Error deleting vendor:", error); + toast.error("Error deleting vendor!"); + } + }; + + + + const handleDepartmentChange = (event) => { + const value = event.target.value; + if (value && !vendorDepartments.includes(value)) { + setVendorDepartments((prev) => [...prev, value]); + } + }; + + const handleChipRemove = (id) => { + setVendorDepartments((prev) => prev.filter((deptId) => deptId !== id)); + }; + + const departmentOptions = serviceData + .filter((service) => service.type === "department") + .map((service) => ({ id: service.id, title: service.title })); + + const expenseTypeOptions = serviceData + .filter((service) => service.type === "expense type") + .map((service) => ({ id: service.id, title: service.title })); + + return ( + <> +
    + + + +
    +
    Manage Vendor
    +
    + +
    +
    + + +
    { + e.preventDefault(); + handleSave(); + }} + > +
    + setVendorName(e.target.value)} + style={{ width: "400px", marginRight: "10px", height: "44px" }} + /> + +
    + {(vendorType === "purchase" || vendorType === "expense") && ( +
    +
    + {vendorDepartments.map((deptId) => { + const department = + vendorType === "purchase" + ? departmentOptions.find((d) => d.id === deptId) + : expenseTypeOptions.find((d) => d.id === deptId); + return ( +
    + {department?.title} + handleChipRemove(deptId)} + > + × + +
    + ); + })} +
    + + + {vendorType === "purchase" && ( + setOpeningBalance(e.target.value)} + style={{ + width: "400px", + marginRight: "10px", + height: "44px", + }} + /> + )} +
    + )} +
    + +
    +
    +
    +
    + + ); +} + +export default ManageVendor; diff --git a/src/components/Pages/AppPAges/ManageSettings/OtherIncomeType.js b/src/components/Pages/AppPAges/ManageSettings/OtherIncomeType.js new file mode 100644 index 0000000..d05a892 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/OtherIncomeType.js @@ -0,0 +1,212 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect,useContext } from "react"; +import ReusableModal from "./ReusableModal"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import { toast, ToastContainer } from "react-toastify"; +import Swal from "sweetalert2"; +import "./Settings.css"; + + +function OtherIncomeType() { + let { user } = useContext(AuthContext); + const storeId = user.store; + const [showModal, setShowModal] = useState(false); + const [name, setName] = useState(""); + const [incomes, setIncomes] = useState([]); + const [editIncome, setEditIncome] = useState(null); + const { Get, Post, Put, Delete } = useApi(); + useEffect(() => { + // Fetch existing income types from the API + const fetchIncomes = async () => { + try { + const response = await Get("otherIncomeData"); + setIncomes(response); + } catch (error) { + console.error("Error fetching income types:", error); + toast.error("Failed to fetch income types."); + } + }; + fetchIncomes(); + }, []); + const handleShow = (income = null) => { + if (income) { + setEditIncome(income); + setName(income.title); // Set name to the income title for editing + } else { + setEditIncome(null); + setName(""); // Reset name when adding a new income type + } + setShowModal(true); + }; + const handleClose = () => { + setShowModal(false); + setName(""); // Reset name when closing + setEditIncome(null); // Reset editIncome when closing + }; + const handleSave = async () => { + if (name) { + try { + if (editIncome) { + // Update existing income type + const response = await Put("otherIncomeData", editIncome.id, { + title: name,store: storeId, + }); + const updatedIncome = response.data; + setIncomes((prevIncomes) => + prevIncomes.map((income) => + income.id === updatedIncome.id ? updatedIncome : income + ) + ); + toast.success("Income type updated successfully."); + } else { + // Add new income type + const response = await Post("otherIncomeData", { + title: name,store: storeId, + }); + const newIncome = response.data; + setIncomes([...incomes, newIncome]); + toast.success("Income type added successfully."); + } + handleClose(); // Close the modal after saving + } catch (error) { + console.error("Error saving income type:", error); + toast.error("Failed to save income type."); + } + } else { + toast.warn("Income type name cannot be empty."); + } + }; + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + try { + await Delete("otherIncomeData", id); + setIncomes((prevIncomes) => + prevIncomes.filter((income) => income.id !== id) + ); + toast.success("Income type deleted successfully."); + } catch (error) { + console.error( + "Error deleting income:", + error.response ? error.response.data : error.message + ); + toast.error("Failed to delete income type."); + } + }; + return ( + <> +
    +
    +
    Other Income Type
    +
    + +
    +
    +
    + {incomes.length === 0 ? ( +

    + No data found +

    + ) : ( + incomes.map((income) => ( +
    + + handleShow(income)} + width="16" + height="16" + viewBox="0 0 16 16" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + + + handleDelete(income.id)} // Show modal for editing + width="16" + height="16" + viewBox="0 0 16 16" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + + +
    + )) + )} +
    +
    + +
    +
    + setName(e.target.value)} + style={{ width: "483px", marginRight: "10px" }} + /> + +
    +
    +
    + + + ); +} +export default OtherIncomeType; diff --git a/src/components/Pages/AppPAges/ManageSettings/ReusableModal.js b/src/components/Pages/AppPAges/ManageSettings/ReusableModal.js new file mode 100644 index 0000000..dc5c60a --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ReusableModal.js @@ -0,0 +1,113 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useEffect } from "react"; + +const ReusableModal = ({ + show, + handleClose, + title, + children, + width = "1080px", + height = "auto", +}) => { + // Function to handle clicks outside of the modal to close it + const handleOutsideClick = (e) => { + // Close the modal if the click is on the overlay (background) and not on the modal content + if (e.target.classList.contains("modal-overlay")) { + handleClose(); + } + }; + + // Add event listener on mount and remove on unmount + useEffect(() => { + if (show) { + // Attach the event listener when modal is shown + document.addEventListener("click", handleOutsideClick); + } else { + // Remove the event listener when modal is hidden + document.removeEventListener("click", handleOutsideClick); + } + + // Clean up event listener when component is unmounted or modal is hidden + return () => { + document.removeEventListener("click", handleOutsideClick); + }; + }, [show]); + + const modalOverlayStyle = { + display: show ? "flex" : "none", // Modal visibility based on 'show' prop + position: "fixed", + top: 0, + left: 0, + right: 0, + bottom: 0, + backgroundColor: "rgba(0, 0, 0, 0.5)", // semi-transparent background + alignItems: "center", + justifyContent: "center", + zIndex: 1000, // to ensure it appears above other content + }; + + const modalContentStyle = { + borderRadius: "15px", + overflow: "hidden", + width: width, // use the width prop + height: height, // use the height prop + maxWidth: "100%", // prevent exceeding the viewport + maxHeight: "80%", // maximum height to avoid overflow + overflowY: "auto", // allow vertical scrolling if content exceeds max height + }; + + const headerStyle = { + backgroundColor: "#F0F0F0", + borderTopLeftRadius: "15px", + borderTopRightRadius: "15px", + height: "55px", + display: "flex", + justifyContent: "space-between", + alignItems: "center", + }; + + const titleStyle = { + fontFamily: "'Manrope', sans-serif", + fontWeight: "600", // semibold + fontSize: "20px", + color: "#002300", + margin: 0, // remove default margin + }; + + return ( +
    +
    +
    +
    + {title} +
    + + + +
    +
    {children}
    +
    +
    + ); +}; + +export default ReusableModal; diff --git a/src/components/Pages/AppPAges/ManageSettings/ReusableModal2.js b/src/components/Pages/AppPAges/ManageSettings/ReusableModal2.js new file mode 100644 index 0000000..ff827c4 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/ReusableModal2.js @@ -0,0 +1,74 @@ +import React from "react"; + +const ReusableModal2 = ({ show, handleClose, title,title2 ,children, width = "512px", height = "auto" }) => { + const modalOverlayStyle = { + display: show ? "flex" : "none", + position: "fixed", + top: 0, + left: 0, + right: 0, + bottom: 0, + backgroundColor: "rgba(0, 0, 0, 0.5)", // semi-transparent background + alignItems: "center", + justifyContent: "center", + zIndex: 1000, // to ensure it appears above other content + }; + + const modalContentStyle = { + borderRadius: "15px", + overflow: "hidden", + width: width, // use the width prop + height: height, // use the height prop + maxWidth: "100%", // prevent exceeding the viewport + maxHeight: "80%", // maximum height to avoid overflow + overflowY: "auto", // allow vertical scrolling if content exceeds max height + }; + + const headerStyle = { + backgroundColor: "#F0F0F0", + borderTopLeftRadius: "15px", + borderTopRightRadius: "15px", + // padding: "15px", + height:"55px", + display: "flex", + justifyContent: "space-between", + alignItems: "center", + }; + + return ( +
    +
    +
    +
    +
    {title}
    +
    {title2}
    +
    + + + +
    +
    {children}
    +
    + +
    + ); +}; + +export default ReusableModal2; diff --git a/src/components/Pages/AppPAges/ManageSettings/SettingTable.js b/src/components/Pages/AppPAges/ManageSettings/SettingTable.js new file mode 100644 index 0000000..8cab041 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/SettingTable.js @@ -0,0 +1,490 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState } from "react"; + +const SettingTable = ({ + data = [], + columns, + showAction, + showFooter, + onEdit, + onDelete, + showExport, + showFilter, +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + + const statusStyles = { + enable: { + backgroundColor: "#6CBE1C", // Green background for Enable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + disable: { + backgroundColor: "#F6F6F6", // Red background for Disable + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + draft: { + backgroundColor: "#D1D1EF", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + unpaid: { + backgroundColor: "#EF3E49", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + paid: { + backgroundColor: "#5856AC", + color: "#fff", + borderRadius: "30px", + padding: "5px 10px", + }, + }; + + const downloadCSV = () => { + const headers = columns.map((col) => col.header).join(",") + "\n"; + const rows = data + .map((row) => + columns.map((col) => String(row[col.field] || "")).join(",") + ) + .join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const [showDropdown, setShowDropdown] = useState(false); + const handleFilterClick = () => { + setShowDropdown(!showDropdown); // Toggle the dropdown + }; + + const renderFilterDropdown = () => { + return ( +
    + + + + + +
    + ); + }; + + const dropdownStyles = { + position: "absolute", + top: "100%", + left: "0", + backgroundColor: "white", + border: "1px solid #ddd", + padding: "10px", + boxShadow: "0px 4px 8px rgba(0,0,0,0.1)", + borderRadius: "4px", + zIndex: "1", + }; + // Calculate the total net sales from the data +// const totalNetSales = data.reduce((acc, item) => { +// const amount = Number(item.total_net_sales) || 0; // Make sure to handle non-numeric values +// return acc + amount; +// }, 0).toFixed(2); // + return ( +
    +
    +
    +
    + setSearchTerm(e.target.value)} + placeholder="Search" + /> + + + + +
    + {showExport && ( // Conditionally render the button based on showExport prop + + )} + {showFilter && ( +
    + + {showDropdown && renderFilterDropdown()} +
    + )} +
    +
    +

    Show

    + +
    +
    + + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.length === 0 ? ( + + + + ) : ( + sortedDisplayedData.map((item) => ( + + + {columns.map((col, colIndex) => ( + +))} + {showAction && ( + + )} + + )) + )} + + +
    + No + handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    + No data found +
    + {(currentPage - 1) * rowsPerPage + sortedDisplayedData.indexOf(item) + 1} + + {col.field === "status" ? ( +
    + {typeof item[col.field] === "string" && item[col.field] + ? item[col.field].charAt(0).toUpperCase() + item[col.field].slice(1) + : "-"} +
    + ) : item[col.field] !== undefined && item[col.field] !== null ? ( + // New logic to handle array values + Array.isArray(item[col.field]) + ? item[col.field].join(", ") + : (typeof item[col.field] === "function" + ? item[col.field]() + : item[col.field]) + ) : ( + "-" + )} +
    + + +
    + {showFooter && ( + + )} +
    + ); +}; + +export default SettingTable; diff --git a/src/components/Pages/AppPAges/ManageSettings/Settings.css b/src/components/Pages/AppPAges/ManageSettings/Settings.css new file mode 100644 index 0000000..d0d40dc --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/Settings.css @@ -0,0 +1,614 @@ +/*================================================Setting page===================================================================================*/ +.setting-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + border-radius: 10px; + padding: 20px; + margin: 20px auto; + background-color: #ffffff; + width: 1600px; + max-width: 100%; +} +.setting-title { + margin-bottom: 20px; + font-weight: bold; + font-size: 22px; + color: #002300; + align-self: flex-start; +} +.row.setting-manage { + width: 1600px; + max-width: 100%; +} +.card { + margin-bottom: 20px; + max-width: 100%; +} +.card-body { + display: flex; + justify-content: space-between; + align-items: center; + width: 760px; + max-width: 100%; + max-height: 100%; + height: 56px; +} +.question-text { + margin-top: 15px; + font-size: 16px; + color: #002300; + align-items: center; + +} +.form-check { + margin: 0; +} +.card { + width: 100%; + border-radius: 10px; + border: 1px solid #e0e0e0; + background-color: #ffffff; +} +.form-check-input { + cursor: pointer; +} +/*===========================================================================Bank container=================================================================*/ +.bank-container { + padding: 20px; /* Adjust as needed */ + margin: 30px auto; + background-color: #ffffff; + border-radius: 10px; + width: 1600px; + max-width: 100%; +} +.header-row { + display: flex; + justify-content: space-between; + width: 1540px; + max-width: 100%; +} +.setting-title { + font-size: 24px; /* Adjust font size as needed */ + margin: 0; /* Remove default margin */ +} +.bank-add-button { + padding: 8px 16px; + background-color: #4545db; /* Bootstrap primary color */ + color: white; + border: none; + border-radius: 40px; + cursor: pointer; + width: 155px; + height: 42px; + font-size: 18px; +} +.second-container { + display: flex; + justify-content: flex-start; + flex-wrap: wrap; +} +.bank-cards { + display: flex; + flex-wrap: wrap; /* Allow wrapping */ +} +.bank-card { + width: 426px; + height: 206px; + background-color: #ffffff; + border: 1px solid rgba(0, 35, 0, 0.1); + border-radius: 10px; + display: flex; + flex-direction: column; /* Stack content vertically */ + padding: 16px; + margin: 10px 0; /* Vertical margin only */ + padding: 16px; + position: relative; + margin-right: 10px; + margin-left: 10px; +} +.bank-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + position: relative; +} +.bank-details { + display: flex; + flex-direction: column; +} +.bank-name-group { + margin-bottom: 16px; /* Space between the groups of names */ +} +.bank-name { + font-weight: bold; + font-size: 18px; + color: #002300; + margin-bottom: 2px; +} +.bank-short-name { + font-size: 16px; + color: #002300; + margin: 0; +} +.del-icon { + color: #002300; + position: absolute; + top: 16px; + right: 16px; + cursor: pointer; +} +.card-button { + text-align: left; + border: 1px solid #4545db; + border-radius: 40px; + margin-top: 10px; + background-color: #ffffff; + height: 42px; + padding-left: 25px; + font-size: 18px; + color: #4545db; +} +.card-button.default { + width: 212px; +} +.card-button.atm { + width: 252px; +} +.card-button.ltry { + width: 277px; +} +.card-button.credit { + width: 313px; +} +/*======================================================Due Days css Start==========================================================================*/ +.due-days { + padding: 20px; /* Adjust as needed */ + margin: 20px auto; + background-color: #ffffff; + border-radius: 10px; + width: 1600px; + max-width: 100%; +} +.due-card { + position: relative; + width: 360px; /* Fixed width for each card */ + height: 185px; /* Fixed height for each card */ + background-color: #ffffff; + border: 1px solid rgba(0, 35, 0, 0.1); + border-radius: 10px; + display: flex; + flex-direction: column; /* Column layout inside the card */ + padding: 16px; + margin: 10px; /* Margin for spacing */ +} +.due-details { + display: flex; + flex-direction: column; +} +.due-icon { + display: flex; + align-items: center; + gap: 15px; + position: absolute; + top: 16px; + right: 16px; + cursor: pointer; +} +.input-day { + width: 260px; + height: 44px; + background-color: #f6f6f6; + border: 1px solid rgba(0, 35, 0, 0.1); + border-radius: 4px; +} +.card-button.day { + margin-top: 20px; + width: 191px; +} +.btn-position { + display: flex; + justify-content: flex-end; +} +.vendor-add { + flex-direction: column; + margin-bottom: 10px; /* Space between rows */ +} +.vendor-add-button { + padding: 8px 26px; + background-color: #4545db; /* Bootstrap primary color */ + color: white; + border: none; + border-radius: 40px; + cursor: pointer; + height: 42px; + font-size: 18px; + margin-left: 10px; + margin-bottom: 10px; /* Space between buttons */ +} +/* Remove the margin from the last button */ +.vendor-add-button:last-child { + margin-bottom: 0; /* No margin for the last button */ +} +/* Mobile responsiveness */ +@media (max-width: 600px) { + .vendor-add-button { + width: 100%; /* Full width buttons */ + margin-bottom: 10px; /* Maintain spacing for mobile */ + } +} +/* styles.css */ +.rounded-table { + border-radius: 20px; + overflow: hidden; + border: 1px solid #ccc; +} +.table-head { + background-color: #f4f4f4; +} +.table-head th { + padding: 10px; + font-size: 18px; + font-weight: 600; +} +.table-body td { + font-size: 16px; +} +/*===============================================================Store Css Start===============================================================*/ +.store-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; /* Align items to the start (left) */ + border-radius: 10px; + padding: 30px; + margin: 20px auto; + background-color: #ffffff; + width: 1600px; + max-width: 100%; +} +.setting-title { + margin-bottom: 10px; /* Space between title and inputs */ + font-size: 24px; /* Adjust as needed */ +} +.input-container { + width: 100%; /* Ensure it takes the full width */ +} +.input-row { + display: flex; /* Use flexbox to align input fields */ + gap: 10px; /* Space between input fields */ +} +.input-field { + padding: 10px; + width: 600px; + height: 40px; + background-color: #f6f6f6; + border: 1px solid #f6f6f6; + border-radius: 5px; +} +.card-container { + display: flex; + justify-content: center; + gap: 30px; +} +.plan-title { + align-items: center; /* This centers the items vertically */ + gap: 10px; + width: 308px; + height: 46px; + font-size: 20px; + justify-content: center; /* Center items horizontally */ +} +.current-plan { + font-weight: 600; + font-size: 20px; + margin-left: 5px; + text-align: center; + color: #000; + width: 132px; + background-color: #ececfb; + justify-content: center; + align-items: center; +} +.card-store { + width: 377px; /* Set card width */ + height: 400px; /* Set card height */ + border: 1px solid rgba(69, 69, 219, 0.3); + box-shadow: 12px 4px 4px rgba(0, 0, 0, 0.18); + border-radius: 20px; + position: relative; +} +.card-store.basic { + background-color: #f4f6ff; +} +.card-store.premium { + background-color: #ececfb; +} +.card-store.enterprise { + background-color: #f4f6ff; +} +.card-store-title { + width: 313px; + font-size: 32px; + margin-top: 20px; + margin-left: 20px; + font-weight: 600px; +} +.card-store-description { + width: 325px; + font-size: 20px; + margin-left: 20px; +} +.card-store-sub-amount { + display: flex; + align-items: center; + width: 313px; + font-size: 88px; + margin-left: 20px; + font-weight: 600px; +} +.dollar-sign { + font-size: 40px; + margin-right: 8px; +} +.card-store-button { + display: flex; + justify-content: center; + align-items: center; + margin: auto; /* Center horizontally */ + border: 1px solid #4545db; + border-radius: 40px; + margin-top: 10px; + background-color: #ffffff; + height: 52px; + width: 300px; /* Adjust width */ + padding: 0 25px; + font-size: 18px; + color: #4545db; + cursor: pointer; +} +.card-store-button.premium { + background-color: #4545db; + color: #ffffff; +} +.sub-icon { + position: absolute; + top: 16px; + right: 16px; +} +/*-----------------------------------------------------upcoming invoice-------------------------------------*/ +.saved-card { + width: 260px; + height: 165px; + background-color: #f0f0f0; + border: 1px solid rgba(0, 35, 0, 0.1); + border-radius: 10px; + display: flex; + flex-direction: column; + padding: 10px; + position: relative; + margin: 0 10px; +} +.card-head { + display: flex; + justify-content: space-between; /* Align label and bank name */ + align-items: center; /* Center vertically */ + margin-bottom: 10px; /* Space below header */ +} +.credit-card-label { + font-size: 16px; + margin: 0; +} +.bank-name-card { + font-size: 16px; + text-align: right; /* Align bank name to the right */ + margin: 0; /* Remove default margin */ +} +.card-number { + text-align: center; + font-size: 20px; /* Adjust size as needed */ + margin-top: 20px; + font-weight: 500; +} +.card-bottom { + display: flex; + justify-content: space-between; /* Space between card holder and validity */ + margin-top: auto; /* Push footer to the bottom */ +} +.card-holder { + font-size: 16px; + text-align: left; + margin: 0; /* Remove default margin */ +} +.valid-through { + font-size: 12px; + text-align: right; + margin: 0; +} +.dept-button { + padding: 6px 8px; + background-color: #4545db; /* Bootstrap primary color */ + color: white; + border: none; + border-radius: 40px; + cursor: pointer; + width: 109px; + height: 42px; + font-size: 18px; +} +.dept-cards-row { + margin-top: 30px; + display: flex; + flex-wrap: wrap; /* Allow wrapping to the next row */ + gap: 10px; /* Space between cards */ /* space above cards */ +} +.dept-card { + width: 474px; /* fixed width */ + height: 70px; /* fixed height */ + padding: 10px; + border: 1px solid #f6f6f6; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: space-between; +} +.dept-info { + width: 386px; + height: 50px; + padding: 10px; + background-color: #f6f6f6; + border: 1px solid rgba(0, 35, 0, 0.1); + border-radius: 4px; +} +.create-department-section { + width: 100%; +} +.dept-icon { + cursor: pointer; +} +/* ===========================================================Expense Screen CSS Start =============================================================*/ +input[type="date"]::-webkit-calendar-picker-indicator { + color: rgba(0, 0, 0, 0); + opacity: 1; + display: block; + background: url('data:image/svg+xml;utf8,') + no-repeat; + width: 20px; + height: 20px; + border-width: thin; +} +input[type="date"] { + cursor: default; +} +/*==================================================================vendor multiselect==========================================================*/ +.chips-container { + display: flex; + flex-wrap: wrap; + margin-bottom: 5px; /* Space between chips and dropdown */ + max-width: 483px; /* Match the dropdown width */ +} + +.chip { + background-color: #e0e0e0; + border-radius: 16px; + padding: 5px 10px; + margin-right: 5px; + margin-bottom: 5px; + display: flex; + align-items: center; +} + +.chip-close { + margin-left: 5px; + cursor: pointer; +} +/* Custom styles for the select element and option hover */ + + +.data-table-container { + overflow-x: auto; + max-width: 100%; + width: 100%; +} +.data-table { + width: 100%; + border: 1px solid #F4F4F4; + border-collapse: collapse; + border-radius: 20px 20px 0 0; + overflow: hidden; +} +.table-header th, .table-body td { + border: 1px solid #F4F4F4; + padding: 12px; + text-align: left; + padding-left: 20px; +} +.table-header th { + background-color: #f2f2f2; + color: #002300; + cursor: pointer; /* Added cursor for sortable columns */ +} +.table-body td { + padding-left: 20px; + color: #002300; +} +.table-body tr:last-child td { + border-bottom: 1px solid #F4F4F4; +} +.table-body { + border-bottom: 1px solid #F4F4F4; +} +.no-column { + width: 100px; +} +.action-column { + color: #002300; + width: auto; + text-align: right; +} +.action-button { + background: none; + border: none; + cursor: pointer; + padding: 0; + margin: 0 5px; +} +.action-button svg { + width: 16px; + height: 16px; + fill: #002300; + transition: fill 0.3s; +} +.action-button:hover svg { + fill: #005600; +} +.pagination { + display: flex; + justify-content: end; + padding: 10px 0; +} +.pagination .page-item { + margin: 0 5px; +} +.pagination .page-link { + padding: 10px; + border: 1px solid #F4F4F4; + border-radius: 50%; + color: #002300; + text-decoration: none; + display: flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + transition: background-color 0.3s, color 0.3s; +} +.pagination .page-link:hover { + background-color: #f2f2f2; +} +.pagination .page-item.active .page-link { + background-color: #FFFFFF; + color: #002300; + border-color:#fbfbfbfb; + border: 1px solid #d3d3d3fb; +} +.pagination .page-item.disabled .page-link { + opacity: 0.5; + pointer-events: none; +} +.pagination .prev-next { + height: 36px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + border: 1px solid #F4F4F4; + color: #002300; + cursor: pointer; + transition: background-color 0.3s, color 0.3s; +} +.pagination .prev-next:hover { + background-color: #f2f2f2; +} + diff --git a/src/components/Pages/AppPAges/ManageSettings/StoreInformation.js b/src/components/Pages/AppPAges/ManageSettings/StoreInformation.js new file mode 100644 index 0000000..205be7e --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/StoreInformation.js @@ -0,0 +1,459 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect } from "react"; +import DataTable from "./DataTable"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; + +import CheckoutForm from "./CheckoutForm"; + +import { Elements } from "@stripe/react-stripe-js"; +import { loadStripe } from "@stripe/stripe-js"; +import SubscriptionPopup from "./SubscriptionPopup"; + + + +const stripePromise = loadStripe( + "pk_test_51Q3jDRC4aAVHkmzjl5CIJRu4U8foi32rigkEJ6gFhEzTDrZvfwpZEwrpYxuugyXRLzAia2ZKoMxu58H6hVDuuko900kINa7O8c" +); + +// import AuthContext from "../../../../utils/secure-route/AuthContext"; +function StoreInformation() { + const [showModal, setShowModal] = useState(false); + const [plans, setPlans] = useState([]); + + const [currentPlan, setCurrentPlan] = useState(null); + const [subscriptions, setSubscriptions] = useState([]); + const [user, setUser] = useState(null); + const [subscriptionEntryData, setSubscriptionEntryData] = useState([]); + // const { user } = useContext(AuthContext); + + const { Get, getAPI } = useApi(); + + + + useEffect(() => { + const fetchUserData = async () => { + try { + await Get("user").then((response) => { + if (response && response.results && response.results.length > 0) { + // If there are multiple users, you might need to handle that appropriately + setUser(response.results[0]); // Adjust index as necessary + } + }); + await Get('subscriptionEntryData').then((resp) => { setSubscriptionEntryData(resp) }); + } catch (err) { + console.error(err); + } + }; + + getSubscriptionData(); + fetchUserData(); + }, [showModal]); + + + useEffect(() => { + fetchPlans(); + }, []); + + + const fetchPlans = async () => { + try { + const response = await Get('subscriptionsData'); + console.log(response) + setPlans(response); + } catch (error) { + console.error('Error fetching subscription data:', error); + } + }; + + + const [modelData, setModelData] = useState({}); + + + + + const handleShow = async (planid) => { + let api = `${getAPI("subscriptionsData")}${planid}`; + console.log(`API URL: ${api}`); + await Get(api) + .then((resp) => { + // console.log(resp); + setModelData(resp); + }) + .catch((err) => { + console.error("API request failed:", err); + }); + setShowModal(true); + }; + + + + + + const handleEdit = (expenseType) => { + setShowModal(true); + }; + const handleClose = () => { + + setShowModal(false); + }; + const getButtonStyle = (plan) => { + return currentPlan === plan + ? { backgroundColor: "#FFFFFF", color: "#4545DB" } + : { backgroundColor: "#FFFFFF", color: "#4545DB" }; + }; + + const columns = [ + { header: "Date", field: "date" }, + { header: "Description", field: "description" }, + { header: "Amount", field: "amount" }, + ]; + const invoices = [ + { header: "Purchase Date", field: "start_date" }, + { header: "Title", field: "title" }, + { header: "Months", field: "no_of_months" }, + { header: "Amount Paid", field: "total_price" }, + ]; + + const handlePlanChange = (planTitle) => { + setCurrentPlan(planTitle); + }; + const [activePlan, setActivePlan] = useState(); + + const getSubscriptionData = async () => { + await Get("getSubscriptionsByStore") + .then((resp) => { + + setActivePlan(resp + .filter(item => item.is_active) + + .map(item => item.title)); + + setSubscriptions(resp); + }) + .catch((err) => { + alert(err); + }); + }; + return ( + <> +
    + + + + + + + +

    Store Information

    +
    + +
    + + +
    +
    +
    +
    + {/* monthly and yearly button */} +
    + {/*
    + + + + + +
    */} +
    + + + {/* plan */} + + +
    + {subscriptions.map((plan, index) => ( +
    handlePlanChange(plan.title)} + > +
    +

    {plan.title}

    +

    + $ + {parseFloat(plan.amount).toFixed(2)} +

    +
    +
    +

    Features

    +
    + {plan.inc_features_titles.map((features, index) => ( +
    +
    ✓
    + {features} +
    + ))} +
    +
    + {!(plan.default && !plan.is_active) && ( // Button condition +
    + +
    + )} +
    + ))} +
    + + + +

    + You have essential access to your ledger for basic transaction tracking and management. +
    + Upgrade to unlock advanced tools, deeper insights, and enhanced features for better financial control. +

    + +
    + + {/*

    {plan.details}

    +

    + $ + {plan.amount} +

    + {plan.is_active === false ? ( + + ) : + + + */} + {/* ( + + ) + } +
    + )) + : ""} +
    + + */} + {/*
    +
    +
    Saved Cards
    + +
    +
    +
    +

    Credit Card

    +

    BOB Bank

    +
    +
    +

    1234 5678 1234 5678

    +
    +
    +

    Olga R. Holland

    +

    VALID THRU 04/25

    +
    +
    +
    */} + {/*
    */} + {/*

    Upcoming Invoice

    */} + {/*
    + + + + + + + + + + + + + + + + + + + + + + + + +
    NoDateDescriptionAmount
    12024-09-26Sample description text here.$100.00
    22024-09-25Another description text here.$150.00
    +
    */} + {/* */} + {/*
    */} +
    +

    Invoices

    + +
    + + ); +} +export default StoreInformation; diff --git a/src/components/Pages/AppPAges/ManageSettings/SubscriptionPopup.js b/src/components/Pages/AppPAges/ManageSettings/SubscriptionPopup.js new file mode 100644 index 0000000..bd96d55 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/SubscriptionPopup.js @@ -0,0 +1,80 @@ +import { Padding } from "@mui/icons-material"; +import React from "react"; +import { loadStripe } from '@stripe/stripe-js'; +import { Elements } from '@stripe/react-stripe-js'; +const stripePromise = loadStripe('pk_test_51Q3jDRC4aAVHkmzjl5CIJRu4U8foi32rigkEJ6gFhEzTDrZvfwpZEwrpYxuugyXRLzAia2ZKoMxu58H6hVDuuko900kINa7O8c'); + +const SubscriptionPopup = ({ + show, + handleClose, + title, + children, + width = "1080px", + height = "auto", +}) => { + const modalOverlayStyle = { + display: show ? "flex" : "none", + position: "fixed", + top: 0, + left: 0, + right: 0, + bottom: 0, + backgroundColor: "rgba(0, 0, 0, 0.5)", // semi-transparent background + alignItems: "center", + justifyContent: "center", + zIndex: 1000, // to ensure it appears above other content + }; + + const modalContentStyle = { + + + borderRadius: "8px", + width: "400px", + maxWidth: "90%", + borderRadius: "7px", + overflow: "hidden", + width: width, // use the width prop + height: height, // use the height prop + maxWidth: "100%", // prevent exceeding the viewport + maxHeight: "80%", // maximum height to avoid overflow + overflowY: "auto", // allow vertical scrolling if content exceeds max height + }; + + + return ( +
    +
    +
    + + + + + + + {children} + +
    +
    +
    + ); +}; + +export default SubscriptionPopup; diff --git a/src/components/Pages/AppPAges/ManageSettings/_CheckoutForm.js b/src/components/Pages/AppPAges/ManageSettings/_CheckoutForm.js new file mode 100644 index 0000000..eddc4b1 --- /dev/null +++ b/src/components/Pages/AppPAges/ManageSettings/_CheckoutForm.js @@ -0,0 +1,59 @@ +// PaymentForm.js +import React, { useState } from 'react'; +import { loadStripe } from '@stripe/stripe-js'; +import { Elements, CardElement, useStripe, useElements } from '@stripe/react-stripe-js'; + +const stripePromise = loadStripe('pk_live_51Q3jDRC4aAVHkmzj2nsum1UuvwLzAiA8hPmTrbSzvyZgJXod9JLULmJLYc0BOwHnXHljg0d30l1hFRazGhzEZEdP00JzrtPcIf'); + +const PaymentForm = () => { + const [isProcessing, setIsProcessing] = useState(false); + const [errorMessage, setErrorMessage] = useState(''); + const stripe = useStripe(); + const elements = useElements(); + + const handleSubmit = async (event) => { + event.preventDefault(); + setIsProcessing(true); + + // Call your backend to create a payment intent and retrieve the client secret + const response = await fetch('http://localhost:8000/api/v1/create-payment-intent/', { + method: 'POST', + }); + const { clientSecret } = await response.json(); + + const cardElement = elements.getElement(CardElement); + const paymentResult = await stripe.confirmCardPayment(clientSecret, { + payment_method: { + card: cardElement, + }, + }); + + if (paymentResult.error) { + setErrorMessage(paymentResult.error.message); + } else { + if (paymentResult.paymentIntent.status === 'succeeded') { + alert('Payment successful!'); + } + } + + setIsProcessing(false); + }; + + return ( +
    + + + {errorMessage &&
    {errorMessage}
    } + + ); +}; + +const StripePayment = () => { + return ( + + + + ); +}; + +export default StripePayment; \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Payments/Payment.js b/src/components/Pages/AppPAges/Payments/Payment.js new file mode 100644 index 0000000..b66c216 --- /dev/null +++ b/src/components/Pages/AppPAges/Payments/Payment.js @@ -0,0 +1,16 @@ +import React from 'react'; + +export default function Payment() { + const centerStyle = { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + height: '100vh', // Full viewport height + }; + + return ( +
    +

    Payments Page

    +
    + ); +} diff --git a/src/components/Pages/AppPAges/Payroll/Payroll.js b/src/components/Pages/AppPAges/Payroll/Payroll.js new file mode 100644 index 0000000..f02130d --- /dev/null +++ b/src/components/Pages/AppPAges/Payroll/Payroll.js @@ -0,0 +1,680 @@ +/* eslint-disable no-dupe-keys */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import DataTable from "../Payroll/PayrollTable"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import { toast, ToastContainer } from "react-toastify"; +import PayrollTableWithButton from "./PayrollTableWithButton"; +import Swal from "sweetalert2"; + +export default function Payroll() { + const { user } = useContext(AuthContext); + const storeId = user.store; + const [showModal, setShowModal] = useState(false); + const [modalType, setModalType] = useState('new'); + const [payrollData, setPayrollData] = useState([]); + const [salaryHistory, setSalaryHistory] = useState([]); + const [selectedPayroll, setSelectedPayroll] = useState(null); + const [bankdata, setBank] = useState([]); + + const [editingPayrollId, setEditingPayrollId] = useState(null); + const initialFormData = { + type: "payroll", + full_name: "", + contact_no: "", + email: "", + date: new Date().toISOString().split("T")[0], + status: "unpaid", + pay_method_status: "", + pay_method: "", + pay_salary: "", + bank: '', + salary: null, + deductions: null, + net_salary: null, + note: "", + bank: "", + bank_name: "" + + }; + const initialPaymentData = { + store: storeId, + payment_method: "cash", + salary_amount: "", + payment_date: new Date().toISOString().split("T")[0], + bank: "", + bank_name: "", + salary_unit: "bi weekly", + total_hour: "", + start_date: new Date().toISOString().split("T")[0], + end_date: new Date().toISOString().split("T")[0], + note: "" + }; + const [formData, setFormData] = useState(initialFormData); + const [paymentData, setPaymentData] = useState(initialPaymentData); + const { Get, Post, Delete, Patch } = useApi(); + + + // Map bank_id to bank_name for display purposes + + + + useEffect(() => { + fetchSalaryHistory(); + fetchBankData(); + }, []); + + useEffect(() => { + fetchPayrollData(); + }, []); + + const fetchPayrollData = async () => { + try { + const response = await Get('payrollEmployeeData'); + setPayrollData(response); + } catch (error) { + console.error('Error fetching payroll data:', error); + toast.error('Failed to fetch payroll data.'); + } + }; + + + + const fetchSalaryHistory = async () => { + try { + const dataresponse = await Get('payrollSalaryData'); + setSalaryHistory(dataresponse); + } catch (error) { + console.error('Error fetching salary history data:', error); + toast.error('Failed to fetch salary history data.'); + } + }; + + const fetchBankData = async () => { + try { + const bankdata = await Get('bank'); + setBank(bankdata); + } catch (error) { + console.error('Error fetching bank data:', error); + toast.error('Failed to fetch bank data.'); + } + }; + + const closeModal = () => { + setShowModal(false); + setModalType('new'); + setFormData(initialFormData); + setPaymentData(initialPaymentData); + setEditingPayrollId(null); + setSelectedPayroll(null); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + + // Restrict non-numeric input for contact_no + if (name === "contact_no") { + const numericValue = value.replace(/[^0-9]/g, ""); // Allow only digits + setFormData((prevData) => ({ ...prevData, [name]: numericValue })); + } else { + setFormData((prevData) => ({ ...prevData, [name]: value })); + } + }; + + const handlePaymentChange = (e) => { + const { name, value } = e.target; + + if (name === "salary_amount") { + // Regular expression to allow up to 10 digits, with a decimal point and up to 2 decimal places + const regex = /^\d{0,10}(\.\d{0,2})?$/; + + // Test if the value matches the regex pattern + if (regex.test(value)) { + setPaymentData((prevData) => ({ ...prevData, [name]: value })); + } + } else { + setPaymentData((prevData) => ({ ...prevData, [name]: value })); + } + }; + + + const handleEdit = async (id, type) => { + if (type === 'payroll') { + const payroll = payrollData.find(p => p.id === id); + if (payroll) { + setFormData({ + ...initialFormData, + ...payroll + }); + setEditingPayrollId(id); + setModalType('edit'); + setShowModal(true); + } + } else if (type === 'salaryHistory') { + try { + const salaryHistoryResponse = await Get("payrollSalaryData"); + const salary = salaryHistoryResponse.find((s) => s.id === id); + if (salary) { + setPaymentData({ + store: storeId, + salary_amount: salary.total_amount, + payroll_employee: salary.payroll_employee, + payment_date: salary.payroll_date, + salary_unit: salary.salary_unit, + start_date: salary.start_date, + end_date: salary.end_date, + bank: salary.bank || '', + note: salary.note || '', + cheque_no: salary.cheque_no || '', + payment_method: salary.payment_method, + total_hour: salary.total_hour || '' + }); + setEditingPayrollId(id); + setModalType('payment'); + setShowModal(true); + } + } catch (error) { + console.error("Error fetching salary history:", error); + toast.error("Error fetching salary history: " + error.message); + } + } + }; + const togglePaymentModal = (payroll) => { + + setSelectedPayroll(payroll); + setModalType('payment'); + setPaymentData(initialPaymentData); + setShowModal(true); + }; + const handleSubmit = async (e) => { + e.preventDefault(); + + // Validation checks + if (!formData.full_name) { + toast.error("Employee name is required."); + return; + } + + const contactRegex = /^[0-9]{10}$/; // Only exactly 10 digits + if (formData.contact_no && !contactRegex.test(formData.contact_no)) { + toast.error('Invalid contact number format: must be exactly 10 digits and contain no letters'); + return; + } + + const emailRegex = /^[\w.-]+@[a-zA-Z\d.-]+\.[a-zA-Z]{2,}$/; // Basic email format validation + if (formData.email && !emailRegex.test(formData.email)) { + toast.error('Invalid email format'); + return; + } + + const updatedFormData = { ...formData, store: storeId }; + + try { + let response; + + // If there's an editing payroll ID, we want to PATCH the payroll employee data + if (editingPayrollId) { + response = await Patch("payrollEmployeeData", editingPayrollId, updatedFormData); + + if (response.status === 200) { + setPayrollData(prevData => + prevData.map(payroll => + payroll.id === editingPayrollId ? { ...payroll, ...updatedFormData } : payroll + ) + ); + toast.success("Payroll updated successfully!"); + } + } else { + // If there's no editingPayrollId, it's a new payroll record + response = await Post("payrollEmployeeData", updatedFormData); + + if (response.status === 201) { + setPayrollData(prevData => [...prevData, response.data]); + toast.success("Payroll added successfully!"); + } else if (response.data) { + // Extract specific error messages and display them + const errorMessages = Object.entries(response.data) + .map(([field, messages]) => `${messages.join(", ")}`) + .join("\n"); + toast.error(errorMessages || "An unknown error occurred."); + } else { + toast.error("Please Validate Fields"); + } + } + + closeModal(); // Close the modal after submitting the form +} catch (error) { + console.error("Error submitting form", error); + if (error.response?.data) { + // Handle API response errors + const errorMessages = Object.entries(error.response.data) + .map(([field, messages]) => `${field}: ${messages.join(", ")}`) + .join("\n"); + toast.error(errorMessages || "An unknown error occurred."); + } else { + // Handle generic errors + toast.error("Error submitting form: " + error.message); + } +} + } + + + + + + + const handlePaymentSubmit = async (e) => { + e.preventDefault(); + + if (!paymentData.salary_amount) { + toast.error("Payment amount is required."); + return; + } + + if (paymentData.payment_method === "cheque" && !paymentData.bank) { + toast.error("Please select a bank when paying by cheque."); + return; + } + + // Find the bank name based on the selected bank ID + const selectedBank = bankdata.find((b) => b.id === paymentData.bank); + const bankName = selectedBank ? selectedBank.name : null; + + try { + // Create the payload for both new and edit operations + const payload = { + store: storeId, + payroll_employee: selectedPayroll?.id, + payroll_date: paymentData.payment_date, + salary_unit: paymentData.salary_unit, + start_date: paymentData.start_date, + end_date: paymentData.end_date, + salary_amount: paymentData.salary_amount, + total_hour: paymentData.total_hour || 0, + total_amount: paymentData.salary_amount, + pay_method: paymentData.payment_method, + bank: paymentData.payment_method === "cheque" ? paymentData.bank : "", + bank_name: bankName, // Include bank_name in the payload + cheque_no: + paymentData.payment_method === "cheque" + ? paymentData.cheque_no || "" + : editingPayrollId + ? paymentData.cheque_no // Preserve existing cheque_no if editing + : null, + note: paymentData.note, + }; + + // For editing existing salary data + if (editingPayrollId) { + const updatedResponse = await Patch("payrollSalaryData", editingPayrollId, payload); + setSalaryHistory((prevHistory) => + prevHistory.map((salary) => + salary.id === editingPayrollId ? { ...salary, ...updatedResponse.data } : salary + ) + ); + toast.success("Payment updated successfully!"); + } else { + // For creating new salary data + await Post("payrollSalaryData", payload); + const data = await Get("payrollSalaryData"); + setSalaryHistory(data); + toast.success("Payment processed successfully!"); + } + + closeModal(); + } catch (error) { + console.error("Error processing payment:", error); + toast.error("Error processing payment: " + (error.response?.data || error.message)); + } + }; + + + const handleDelete = async (id, type) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + + try { + if (type === "payroll") { + // Delete payroll record + await Delete(`payrollEmployeeData`, id); + // Update payroll data in the frontend + setPayrollData((prevPayrollData) => prevPayrollData.filter((p) => p.id !== id)); + + // Fetch updated salary history data from the backend + const updatedSalaryHistory = await Get("payrollSalaryData"); + setSalaryHistory(updatedSalaryHistory); + + toast.success("Payroll record deleted successfully!"); + } else if (type === "salaryHistory") { + // Delete salary history record + await Delete(`payrollSalaryData`, id); + // Update salary history data in the frontend + setSalaryHistory((prevSalaryHistory) => + prevSalaryHistory.filter((s) => s.id !== id) + ); + + toast.success("Salary history record deleted successfully!"); + } + } catch (error) { + console.error("Error deleting record:", error); + toast.error("Error deleting record: " + (error.response?.data || error.message)); + } +}; + + + return ( +
    +
    +
    +
    +

    Manage Payroll

    + +
    + handleEdit(id, 'payroll')} + onDelete={(id) => handleDelete(id, 'payroll')} + togglePaymentModal={togglePaymentModal} + /> +
    + { } + {showModal && ( +
    +
    e.stopPropagation()} + style={{ width: modalType === 'payment' ? '800px' : '700px' }} + > +
    +

    + {modalType === 'new' && "Add Employee"} + {modalType === 'edit' && "Edit Employee"} + {modalType === 'payment' && `Process Payment for ${selectedPayroll?.full_name || ''}`} +

    + +
    + { } + {(modalType === 'new' || modalType === 'edit') && ( +
    +
    +
    + + +
    +
    + + + + +
    +
    + + +
    +
    +
    + + +
    +
    + )} + { } + {modalType === 'payment' && ( +
    +
    +
    + +
    +
    + $ +
    + { + // Prevent negative and positive signs + if (e.key === "-" || e.key === "+") { + e.preventDefault(); + } + }} + required + onInput={(e) => { + let value = e.target.value; + + // Remove all characters except numbers and the decimal point + value = value.replace(/[^0-9.]/g, ''); + + // Ensure only one decimal point + if (value.indexOf('.') !== -1) { + const parts = value.split('.'); + value = parts[0] + '.' + parts[1].substring(0, 2); // Keep only two digits after the decimal + } + + // Update the value on the input element + e.target.value = value; + + // Call the onChange handler to update the state + handlePaymentChange(e); + }} + /> +
    +
    + + +
    + + +
    +
    + + +
    +
    + + +
    + {/* */} +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + + .replace(/[^0-9]/g, '') // Remove non-numeric characters + .slice(0, 3); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + required + /> +
    +
    + + +
    + {paymentData.payment_method === "cheque" && ( +
    + + + + +
    + )} +
    + + +
    +
    +
    + + +
    +
    + )} +
    +
    + )} + { } +
    +
    +

    Salary History

    +
    + + handleEdit(id, 'salaryHistory')} + onDelete={(id) => handleDelete(id, 'salaryHistory')} + + togglePaymentModal={togglePaymentModal} + /> +
    +
    +
    + ); +} \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Payroll/PayrollTable.js b/src/components/Pages/AppPAges/Payroll/PayrollTable.js new file mode 100644 index 0000000..1b92226 --- /dev/null +++ b/src/components/Pages/AppPAges/Payroll/PayrollTable.js @@ -0,0 +1,257 @@ +import React, { useState } from "react"; +import "../ManageSettings/Settings.css"; // Custom styles for the table + +const DataTable = ({ + data, + columns, + showAction = true, + onEdit, + onDelete, + showFooter = true, + togglePaymentModal +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + // Sorting logic + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + // Get the displayed data for the current page + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + // Sorting the data based on the selected column + const sortData = (dataToSort) => { + if (sortConfig.key) { + return [...dataToSort].sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return dataToSort; + }; + + const displayedData = getDisplayedData(); + const sortedData = sortData(displayedData); + + // Pagination + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + return ( +
    + + + + {columns.map((col, index) => ( + + ))} + {showAction && } + + + + {sortedData.length === 0 ? ( + + + + ) : ( + sortedData.map((item, index) => ( + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + )) + )} + +
    handleSort(col.field)} + style={{ cursor: "pointer" }} + > + {col.header} + {sortConfig.key === col.field && ( + sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ) + )} + Actions
    + No data found +
    + {col.field === "status" ? ( +
    {item[col.field]}
    + ) : col.field === "pay_salary" ? ( + + ) : ( + item[col.field] + )} +
    + + +
    + + {showFooter && ( + + )} +
    + ); +}; + +export default DataTable; diff --git a/src/components/Pages/AppPAges/Payroll/PayrollTableWithButton.js b/src/components/Pages/AppPAges/Payroll/PayrollTableWithButton.js new file mode 100644 index 0000000..a50b701 --- /dev/null +++ b/src/components/Pages/AppPAges/Payroll/PayrollTableWithButton.js @@ -0,0 +1,456 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState } from "react"; + +const PayrollTableWithButton = ({ + data, + columns, + showAction, + showFooter, + onEdit, + onDelete, + showExport, + showFilter, + togglePaymentModal +}) => { + const [currentPage, setCurrentPage] = useState(1); + const [sortConfig, setSortConfig] = useState({ + key: null, + direction: "ascending", + }); + const [searchTerm, setSearchTerm] = useState(""); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const totalPages = Math.ceil(data.length / rowsPerPage); + + const getDisplayedData = () => { + const startIndex = (currentPage - 1) * rowsPerPage; + const endIndex = startIndex + rowsPerPage; + return data.slice(startIndex, endIndex); + }; + + const filterData = (dataToFilter) => { + if (!searchTerm) return dataToFilter; + return dataToFilter.filter((item) => + Object.values(item).some((value) => + String(value).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }; + + const sortDisplayedData = (dataToSort) => { + let sortableItems = [...dataToSort]; + if (sortConfig.key) { + sortableItems.sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === "ascending" ? 1 : -1; + } + return 0; + }); + } + return sortableItems; + }; + + const displayedData = getDisplayedData(); + const filteredData = filterData(displayedData); + const sortedDisplayedData = sortDisplayedData(filteredData); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrev = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleSort = (key) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + const renderPagination = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + pages.push( +
  • + { + e.preventDefault(); + setCurrentPage(i); + }} + > + {i} + +
  • + ); + } + return pages; + }; + + + + const downloadCSV = () => { + const headers = columns.map((col) => col.header).join(",") + "\n"; + const rows = data + .map((row) => + columns.map((col) => String(row[col.field] || "")).join(",") + ) + .join("\n"); + + const csvContent = headers + rows; + const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", "data.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const [showDropdown, setShowDropdown] = useState(false); + const handleFilterClick = () => { + setShowDropdown(!showDropdown); // Toggle the dropdown + }; + + const renderFilterDropdown = () => { + return ( +
    + + + + + +
    + ); + }; + + const dropdownStyles = { + position: "absolute", + top: "100%", + left: "0", + backgroundColor: "white", + border: "1px solid #ddd", + padding: "10px", + boxShadow: "0px 4px 8px rgba(0,0,0,0.1)", + borderRadius: "4px", + zIndex: "1", + }; + // Calculate the total net sales from the data +// const totalNetSales = data.reduce((acc, item) => { +// const amount = Number(item.total_net_sales) || 0; // Make sure to handle non-numeric values +// return acc + amount; +// }, 0).toFixed(2); // + return ( +
    +
    +
    +
    + setSearchTerm(e.target.value)} + placeholder="Search" + /> + + + + +
    + {showExport && ( // Conditionally render the button based on showExport prop + + )} + {showFilter && ( +
    + + {showDropdown && renderFilterDropdown()} +
    + )} +
    +
    +

    Show

    + +
    +
    + + + + + {columns.map((col, index) => ( + + ))} + {showAction && ( + + )} + + + + {sortedDisplayedData.length === 0 ? ( + + + + ) : ( + sortedDisplayedData.map((item) => ( + + + {columns.map((col, colIndex) => ( + + ))} + {showAction && ( + + )} + + + )) + )} + + +
    + No + handleSort(col.field)}> + {col.header} + {sortConfig.key === col.field && + (sortConfig.direction === "ascending" ? ( + + + + ) : ( + + + + ))} + + Action +
    + No data found +
    + {(currentPage - 1) * rowsPerPage + sortedDisplayedData.indexOf(item) + 1} + + {col.field === "status" ? ( +
    {item[col.field]}
    + ) : col.field === "pay_salary" ? ( + + ) : ( + item[col.field] + )} +
    + + +
    + {showFooter && ( + + )} +
    + ); +}; + +export default PayrollTableWithButton; diff --git a/src/components/Pages/AppPAges/Purchase/purchase.js b/src/components/Pages/AppPAges/Purchase/purchase.js new file mode 100644 index 0000000..4bf18ca --- /dev/null +++ b/src/components/Pages/AppPAges/Purchase/purchase.js @@ -0,0 +1,1178 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import DataTable from "../ManageSettings/DataTables"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import { toast, ToastContainer } from "react-toastify"; +import AddDepartmentModal from "../ReusableForm/AddDepartmentModal"; +import AddVendorModal from "../ReusableForm/AddVendorModal"; +import Swal from "sweetalert2"; + +export default function Purchase() { + const { user } = useContext(AuthContext); + const storeId = user.store; + + const [showPaymentOptions, setShowPaymentOptions] = useState(false); + const [showAdditionalFields, setShowAdditionalFields] = useState(false); + const [showCheckFields, setShowCheckFields] = useState(false); + const [showBankFields, setShowBankFields] = useState(false); + const [showModalDepartment, setShowModalDepartment] = useState(false); + const [showModalVendor, setShowModalVendor] = useState(false); + const [showModal, setShowModal] = useState(false); + const [vendors, setVendors] = useState([]); + const [serviceData, setServiceData] = useState([]); + const [dueDays, setDueDays] = useState([]); + const [bank, setBank] = useState([]); + const today = new Date().toISOString().split("T")[0]; + + const [invoicesPurchase, setInvoicesPurchase] = useState([]); + const [totalPaidPurchase, setTotalPaidPurchase] = useState(0.0); + const [totalReceivedCreditPurchase, setTotalReceivedCreditPurchase] = useState(0.0); + const [totalUnpaidForPurchases, setTotalUnpaidForPurchases] = useState(0.0); + const [totalOutstandingPurchase, setTotalOutstandingPurchase] = useState(0.0); + const [totalDueForPurchases, setTotalDueForPurchases] = useState(0.0); + const [totalPurchaseCredit, setTotalPurchaseCredit] = useState(0.0); + const [totalPurchase, setTotalPurchase] = useState(0.0); + + const [invoices, setInvoices] = useState([]); + const [editingInvoiceId, setEditingInvoiceId] = useState(null); + const { Get, Post, Delete, Patch } = useApi(); + const [reloadTotal, setReloadTotal] = useState(false); + const [filteredDepartments, setFilteredDepartments] = useState([]); + + // Handle checkbox change + + const [formData, setFormData] = useState({ + type: "purchase", + store: storeId, + invoice_no: "", + date: today, + status: "", + pay_method_status: "", + pay_method: "", + amount: "", + pay_amount: null, + discount: null, + remaining_amount: "", + after_discount: null, + prepaid_tax: false, + prepaid_tax_percentage: "", + vendor_department: "", + vendor_department_name: "", + cheque_no: "", + note: "", + due_date: null, + bank: "", + }); + const [reloadData, setReloadData] = useState(false); + + function calculateDaysDifference(startDate, endDate) { + const start = new Date(startDate); + const end = new Date(endDate); + const timeDiff = end - start; // Difference in milliseconds + const daysDiff = Math.floor(timeDiff / (1000 * 3600 * 24)); // Convert to days + return daysDiff; + } + useEffect(() => { + if (formData.date && formData.due_date) { + // Calculate the number of days between date and due_date + const startDate = new Date(formData.date); + const dueDate = new Date(formData.due_date); + + const timeDiff = dueDate - startDate; // Difference in milliseconds + const daysDiff = Math.floor(timeDiff / (1000 * 3600 * 24)); // Convert to days + + // Update the formData with the calculated days + setFormData((prevData) => ({ + ...prevData, + days: daysDiff, // Set the 'days' field to the calculated number of days + })); + } + }, [formData.date, formData.due_date]); + + const getInvoiceData = async () => { + try { + const response = await Get("invoiceData"); + const activeInvoices = response.filter((invoice) => !invoice.is_deleted); + setInvoices(activeInvoices) + } catch (error) { + console.error("Error fetching departments:", error); + } + }; + useEffect(() => { + getInvoiceData(); + }, [reloadData]); + const handleCheckboxChange = (e) => { + const { checked } = e.target; // Get whether the checkbox is checked or not + setFormData((prevData) => ({ + ...prevData, + prepaid_tax: checked, // Update the prepaid_tax field + })); + }; + + const handleNewDepartment = (newDepartment) => { + // Add the new department to the departmentData array dynamically + setServiceData((prevData) => [ + ...prevData, + { + id: newDepartment.id, // Assuming the response contains the `id` + title: newDepartment.title, + type: "department", + }, + ]); + + // Reset the formData (dropdown) so the modal can open again + setFormData((prevData) => ({ + ...prevData, + department: "", // Reset the value to allow re-opening the modal next time + })); + + // Ensure the modal stays open for further addition if desired + setShowModalDepartment(true); // Keep modal open + }; + // const handleInvoiceNumberChange = (e) => { + // const value = e.target.value; + // setFormData((prevData) => ({ ...prevData, invoice_no: value })); + // }; + const fetchData = async () => { + try { + const [vendorsResponse, serviceResponse, dueDaysResponse, bankResponse] = + await Promise.all([ + Get("vendorDepartmentData"), + Get("vendorDepartmentServiceData"), + Get("dueDaysData"), + Get("bank"), + ]); + setVendors(vendorsResponse); + setServiceData(serviceResponse); + setDueDays(dueDaysResponse); + setBank(bankResponse); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + + useEffect(() => { + fetchData(); + }, []); + + const getPurchaseCalculation = async () => { + Get("purchaseCalculation") + .then((response) => { + setInvoicesPurchase(response); + setTotalPaidPurchase(response.total_paid); + setTotalReceivedCreditPurchase(response.total_received_credit); + setTotalUnpaidForPurchases(response.total_unpaid); + setTotalOutstandingPurchase(response.total_outstanding_credit); + setTotalDueForPurchases(response.total_due); + setTotalPurchaseCredit(response.total_credit); + setTotalPurchase(response.total_purchase || 0); // Default to 0 if not in response + // setTotalPurchase(response.total_purchase); + }) + .catch((error) => { + console.error("Error fetching invoices:", error); + }); + }; + useEffect(() => { + getPurchaseCalculation(); + }, [reloadTotal]); + const handlePaymentMethodChange = (e) => { + const value = e.target.value; + setFormData((prevData) => ({ + ...prevData, + pay_method_status: value, + pay_method: + value === "pay_later" + ? "pay_later" + : value === "credit_invoice" + ? "credit_invoice" + : "", + status: value === "pay_now" ? "paid" : "unpaid", + })); + setShowPaymentOptions(value === "pay_now"); + setShowAdditionalFields( + value === "credit_invoice" || value === "pay_later" + ); + setShowCheckFields(false); + setShowBankFields(false); + }; + + const handleSpecificPaymentMethodChange = (e) => { + const value = e.target.value; + setShowCheckFields(value === "cheque"); + setShowBankFields(value === "bank"); + + setFormData((prevData) => ({ + ...prevData, + pay_method: value, + })); + }; + + const toggleModal = () => { + setShowModal(!showModal); + if (showModal) { + setFormData({ + type: "purchase", + invoice_no: "", + date: today, + status: "", + pay_method_status: "", + pay_method: "", + amount: "", + pay_amount: null, + discount: null, + remaining_amount: "", + after_discount: null, + prepaid_tax: false, + vendor_department: "", + vendor_department_name: "", + cheque_no: "", + note: "", + due_date: "", + bank: "", + }); + setEditingInvoiceId(null); + } + }; + + const handleShow = () => setShowModalDepartment(true); + const handleCloseModal = () => { + setShowModalDepartment(false); + }; + const handleShowVendor = () => setShowModalVendor(true); + const handleCloseVendor = () => { + setShowModalVendor(false); + }; + const handleVendorAdded = (newVendor) => { + setVendors((prevVendors) => [...prevVendors, newVendor]); + setFormData({ ...formData, vendor_department: newVendor.id }); + }; + const handleChange = (e) => { + const { name, value, type, checked } = e.target; + + const updatedData = { + ...formData, + [name]: type === "checkbox" ? checked : value, + }; + + if (value === "add-department") { + setShowModalDepartment(true); + return; + } + + if (name === "vendor_department") { + // Find the selected vendor + const selectedVendor = vendors.find((vendor) => vendor.id === value); + + // Update vendor name + updatedData.vendor_department_name = selectedVendor?.name || ""; + + // Filter departments based on the selected vendor + const vendorDepartments = serviceData.filter( + (service) => + selectedVendor?.vendor_department_service_title?.includes(service.title) && + service.type === "department" // Assuming 'department' is the type you're interested in + ); + + // Update the filtered departments + setFilteredDepartments(vendorDepartments); + + // Automatically select the first department (optional) + if (vendorDepartments.length > 0) { + updatedData.vendor_department_service_titles = vendorDepartments[0].title; + } else { + updatedData.vendor_department_service_titles = ""; // No departments found + } + } + + if (name === "vendor_department_service_titles") { + // Enforce single department selection + updatedData.vendor_department_service_titles = value; + } + + // Handle 'days' field to calculate due date + if (name === "days") { + const selectedDueDays = parseInt(value, 10); + if (!isNaN(selectedDueDays)) { + const today = new Date(); + const dueDate = new Date(today); + dueDate.setDate(dueDate.getDate() + selectedDueDays); + updatedData.due_date = dueDate.toISOString().split("T")[0]; // Format as YYYY-MM-DD + } + } + + setFormData(updatedData); // Update form data state + }; + + + const handleEdit = (invoice) => { + // Check if the invoice status is "partially_paid" + if (invoice.status === "partially_paid") { + toast.error("Cannot edit partially paid invoice."); + return; // Prevent the modal from opening if the invoice is partially paid + } + + // Proceed with the rest of the code if the invoice is not "partially_paid" + const updatedFormData = { + ...invoice, + vendor_department_name: + vendors.find((vendor) => vendor.id === invoice.vendor_department)?.name || "", + vendor_department_service_titles: + invoice.vendor_department_service_titles || [], + due_date: invoice.due_date || "", + amount: invoice.amount || "", + }; + + setFormData(updatedFormData); + setEditingInvoiceId(invoice.id); + setShowModal(true); + }; + + // const handleDelete = async (id) => { + // const result = await Swal.fire({ + // title: "Are you sure?", + // text: "You won't be able to revert this!", + // icon: "warning", + // showCancelButton: true, + // confirmButtonColor: "#d33", + // cancelButtonColor: "#3085d6", + // confirmButtonText: "Yes, delete it!", + // }); + + // // Check if the user clicked the confirm button + // if (!result.isConfirmed) return; // Exit if the user cancels + // try { + // await Post(`deleteInvoice`, { invoice_id: id }); + + // toast.success("Invoice deleted successfully!"); + // await getPurchaseCalculation(); + // setInvoices((prevInvoices) => + // prevInvoices.filter((invoice) => invoice.id !== id) + // ); + // } catch (error) { + // console.error("Error deleting invoice:", error); + // toast.error( + // "Error deleting invoice: " + + // (error.response ? error.response.data : error.message) + // ); + // } + // }; + + + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + if (!result.isConfirmed) return; + try { + const payload = { + invoice_id: id, + is_deleted: true, + } + await Post(`deleteInvoice`, payload); + toast.success("Invoice deleted successfully!"); + setInvoices((prevInvoices) => prevInvoices.filter((invoice) => invoice.id !== id)) + await getPurchaseCalculation(); + setInvoices((prevInvoices) => + prevInvoices.filter((invoice) => invoice.id !== id) + ); + } catch (error) { + console.error("Error deleting invoice:", error); + toast.error( + "Error deleting invoice: " + + (error.response ? error.response.data : error.message) + ); + } + }; + + + + + const handleSubmit = async (e) => { + e.preventDefault(); + if (!editingInvoiceId) { + const isDuplicateInvoiceNo = invoices.some( + (invoice) => invoice.invoice_no === formData.invoice_no + ); + if (isDuplicateInvoiceNo) { + toast.error("Invoice number must be unique."); + return; + } + } + + // Validate required fields + if (!formData.vendor_department) { + toast.error("Please Select a Vendor."); + return; + } + if (!formData.invoice_no) { + toast.error("Invoice number is required."); + return; + } + if (!formData.vendor_department_service_titles) { + toast.error("Please select a department"); + return; + } + if (formData.pay_method_status === "pay_later") { + if (!formData.pay_method) { + toast.error("Please select a payment method."); + return; + } + + if (!formData.due_date) { + toast.error("Please select a Due Date"); + return; + } + if (!formData.amount) { + toast.error("Please fill in the Amount"); + return; + } + } + + if (formData.pay_method_status === "pay_now") { + if (!formData.pay_method) { + toast.error("Please select a payment method."); + return; + } + + if (formData.pay_method === "cash") { + if (!formData.amount) { + toast.error("Please fill in the Amount"); + return; + } + } + + + if (formData.pay_method_status === "pay_now") { + if (!formData.pay_method) { + toast.error("Please select a payment method."); + return; + } + + if (formData.pay_method === "bank") { + if (!formData.bank) { + toast.error("Please select a Bank."); + return; + } + if (!formData.amount) { + toast.error("Please fill in the Amount"); + return; + } + } + } + + formData.due_date = null; + + if (formData.pay_method_status === "pay_now") { + if (!formData.pay_method) { + toast.error("Please select a payment method."); + return; + } + + if (formData.pay_method === "cheque") { + if (!formData.bank) { + toast.error("Please select a Bank."); + return; + } + + if (!formData.cheque_no) { + toast.error("Please fill in the Cheque No"); + return; + } + if (!formData.amount) { + toast.error("Please fill in the Amount"); + return; + } + } + } + } + + + const updatedFormData = { + ...formData, + amount: formData.amount, + pay_amount: formData.pay_amount || formData.amount, // Ensure pay_amount is set for both 'edit' and 'create' + }; + + // Special handling for 'pay_now' + if (formData.pay_method_status === "pay_now") { + updatedFormData.status = "paid"; // Explicitly set to "paid" for "pay_now" + // updatedFormData.remaining_amount = 0; // Set remaining amount to 0 when fully paid + updatedFormData.due_date = null; // No due date for "pay_now" + } + + try { + let response; + if (editingInvoiceId) { + // Editing an existing invoice + const originalInvoice = invoices.find((invoice) => invoice.id === editingInvoiceId); + if (!originalInvoice) { + console.error("Invoice not found for editingInvoiceId:", editingInvoiceId); + return; + } + + // Determine the new status based on payment method and remaining amount + const newRemainingAmount = Math.max(0, originalInvoice.amount - (formData.pay_amount || 0)); + let newStatus = originalInvoice.status; // Start with the original status + + if (formData.pay_method_status === "pay_now") { + newStatus = "paid"; // Always "paid" if paid now + } else if (formData.pay_method_status === "pay_later") { + newStatus = "unpaid"; // Ensure unpaid if paying later + } else if (newRemainingAmount < originalInvoice.amount) { + newStatus = "partially_paid"; // Adjust if partially paid + } + + + + // Ensure pay_amount is included when editing + updatedFormData.pay_amount = formData.pay_amount !== undefined + ? formData.pay_amount + : formData.remaining_amount; // Use remaining_amount if pay_amount is undefined + + // Update status for pay_now + if (formData.pay_method_status === "pay_now") { + updatedFormData.status = "paid"; // Ensure "paid" status for "pay_now" + } + if (formData.pay_method_status === "pay_later") { + updatedFormData.status = "unpaid"; // Ensure "paid" status for "pay_now" + } + const updatedInvoice = { + ...updatedFormData, + invoice_id: editingInvoiceId, + // amount: formData.pay_amount, // Update remaining amount after payment + status: newStatus, // Update the invoice status based on remaining amount + }; + + + // Call PUT request to update the invoice + response = await Post("editInvoice", updatedInvoice); + + if (response.status === 200) { + setInvoices((prevInvoices) => + prevInvoices.map((invoice) => + invoice.id === editingInvoiceId ? { ...invoice, ...updatedInvoice } : invoice + ) + ); + toast.success("Invoice updated successfully!"); + setReloadData(!reloadData); + setReloadTotal(!reloadTotal); + toggleModal(); // Close the modal after saving + + + } + } else { + // Creating a new invoice + const duplicateInvoice = invoices.some( + (invoice) => invoice.invoice_no === formData.invoice_no + ); + if (duplicateInvoice) { + toast.error("Invoice number must be unique."); + return; + } + + // Post the data for a new invoice + Post("createInvoiceAndPrepaidTax", formData) + .then((response) => { + toast.success("Invoice submitted successfully!"); + setReloadData(!reloadData); + setReloadTotal(!reloadTotal); + toggleModal(); + }) + }; + + // Close the modal after submitting + } catch (error) { + console.error("Error submitting invoice:", error); + toast.error( + "Error submitting invoice: " + + (error.response ? error.response.data : error.message) + ); + } + }; + + const purchaseInvoice = invoices.filter( + (invoice) => invoice.type === "purchase" && !invoice.is_deleted + ); + + const columns = [ + { header: "Date", field: "date" }, + { header: "Invoice Number", field: "invoice_no" }, + { header: "Vendor Name", field: "vendor_department_name" }, + { header: "Departments", field: "vendor_department_service_titles" }, + { header: "Note", field: "note" }, + { header: "Due Date", field: "due_date" }, + { header: "Amount", field: "amount" }, + { header: "Remaining Amount", field: "remaining_amount" }, + { header: "Payment Method", field: "pay_method" }, + { header: "Status", field: "status" }, + ]; + + return ( +
    +
    +
    +
    +

    Purchase

    + +
    + + {/* Table Start */} +
    + +
    + + {showModal && ( +
    +
    e.stopPropagation()} + style={{ + width: "700px", + backgroundColor: "white", + margin: "100px auto", + padding: "20px", + borderRadius: "8px", + position: "relative", + boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", + }} + > +
    +
    + {editingInvoiceId ? "Edit Purchase" : "Add New Purchase"} +
    + + + + +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    +

    Payment Method :

    + + + +
    + {showPaymentOptions && ( +
    + + + +
    + )} + {showAdditionalFields && ( +
    + + +
    + )} + {showCheckFields && ( +
    +
    + +
    +
    + +
    +
    + +
    +
    + )} + {showBankFields && ( +
    +
    + +
    +
    + +
    +
    + )} +
    + +
    + {formData.prepaid_tax && ( // Only show the prepaid tax input if prepaid_tax is true +
    +
    +
    + + USD + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
    +
    + )} +
    +
    +
    + + + USD + +
    + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + /> +
    +
    +
    +
    +
    + + +
    +
    +
    + )} +
    +
    + + + +
    + ); +} diff --git a/src/components/Pages/AppPAges/ReportUi/Report.js b/src/components/Pages/AppPAges/ReportUi/Report.js new file mode 100644 index 0000000..42449ad --- /dev/null +++ b/src/components/Pages/AppPAges/ReportUi/Report.js @@ -0,0 +1,669 @@ +import React, { useEffect, useState } from "react"; + +const containerStyle = { + // display: "grid", + // gridTemplateColumns: "repeat(3, 1fr)", + // gap: "20px", + paddingTop: "20px", + paddingBottom: "20px", +}; + +const sectionStyle = { + // display: "flex", + // flexDirection: "column", + // // border: "1px solid red", + borderRadius: "10px", + backgroundColor: "#f9f9f9", + padding: "20px", + boxShadow: "0 0 10px 1px rgba(0, 0, 0, 0.3)", +}; + +const tableStyle = { + width: "100%", + borderCollapse: "collapse", + marginTop: "10px", +}; + +const thStyle = { + backgroundColor: "#f1f1f1", + fontWeight: "700", + border: "1px solid #ddd", + padding: "8px", + + textAlign: "center", +}; + +const thStyleRight = { + fontWeight: "700", + backgroundColor: "#f1f1f1", + border: "1px solid #ddd", + padding: "8px", + textAlign: "right", +}; +const thStyleLeft = { + backgroundColor: "#f1f1f1", + fontWeight: "bold", + border: "1px solid #ddd", + padding: "8px", + textAlign: "left", +}; + +const tdStyle = { + border: "1px solid #ddd", + padding: "8px", + textAlign: "center", +}; + +const tdStyleRight = { + border: "1px solid #ddd", + padding: "8px", + textAlign: "right", + width: "50%", +}; +const tdStyleRight25 = { + border: "1px solid #ddd", + padding: "8px", + textAlign: "right", + width: "25%", +}; + +const tdStyleLeft25 = { + border: "1px solid #ddd", + padding: "8px", + textAlign: "left", + width: "25%", +}; + +const tdStyleLeft = { + border: "1px solid #ddd", + padding: "8px", + textAlign: "left", + width: "50%", +}; + +const tdStyle25 = { + border: "1px solid #ddd", + padding: "8px", + textAlign: "center", + width: "25%", +}; + +const titleStyle = { + justifyContent: "center", + textAlign: "center", + alignItems: "center", + fontSize: "20px", + color: "#2084e9", +}; + +const totalStyle = { + backgroundColor: "#d6ebff", + fontWeight: "bold", + border: "1px solid #ccc", + padding: "8px", + width: "33.33%", + textAlign: "center", +}; + +const Report = () => { + const [printData, setPrintData] = useState(); + useEffect(() => { + setPrintData(JSON.parse(localStorage.getItem("printDailyReport"))); + }, []); + + const [print, setPrint] = useState(false); + const proceedPrint = () => { + setPrint(true); + setTimeout(() => window.print(), 500); + }; + return printData !== undefined ? ( +
    +
    +
    +
    + {printData.store_name} +
    + +
    + Shift: {printData.shift} +
    + +
    + Report Date: {printData.date} +
    +
    +
    + {!print ? ( + + ) : ( + "" + )} +
    + {/* DAILY REGISTER CASH OUT */} +
    +
    +

    💵 DAILY REGISTER CASH OUT

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameAmount
    Business On report$ {printData.business_on_report}
    Tax On Report$ {printData.tax_on_report}
    Taxable Sales$ {printData.taxable_sales}
    Non-Taxable Sales$ {printData.non_taxable_sales}
    + + {/* Cash Purchase/Expense Section */} +
    +

    💸 Cash Purchase/Expense

    + + + + + + + + + + {printData.cash_purchase_expense !== undefined + ? printData.cash_purchase_expense.map((item, index) => { + return ( + + + + + + ); + }) + : ""} + +
    No.VendorAmount
    {index + 1}{item.vendor}{item.amount}
    + +
    + +

    🧾 Others

    + + + + + + + + + + {printData.others.map !== undefined + ? printData.others.map((item, index) => { + return ( + + + + + + ); + }) + : ""} + +
    No.NameAmount
    {index + 1}{item.name}{item.amount}
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameAmount
    Total Payout$ {printData.total_payout}
    Total Other$ {printData.total_other}
    Refund$ {printData.refund}
    Check$ {printData.cheque}
    Credit Card$ {printData.credit_card}
    Customer Credits$ {printData.customer_credits}
    Customer Debits$ {printData.customer_debits}
    Register Cash To Account For + $ {printData.register_cash_to_account_for} +
    Actual Register Cash + $ {printData.actual_register_cash} +
    Business Over/Short + $ {printData.business_over_short} +
    +
    +
    + {/* DAILY LOTTERY REPORT */} +
    +
    +

    🎰 DAILY LOTTERY REPORT

    +
    + {/* First Table - 70% */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Today Invoice + + Yesterday Invoice +
    Online Net Sale + $ {printData.online_net_sale_today} + + $ {printData.online_net_sale_yesterday} + Online Net Sale
    Online Cashing + $ {printData.online_cashing_today} + + $ {printData.online_cashing_yesterday} + Online Cashing
    Instant Cashing + $ {printData.instant_cashing_today} + + $ {printData.instant_cashing_yesterday} + Instant Cashing
    Instant Sale + $ {printData.instant_sale_today} +
    + + {/* Second Table - 30% */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Debit/Credit Card + $ {printData.debit_credit_card} +
    Credits Sale$ {printData.credit_sales}
    Debits Sale$ {printData.debit_sales}
    Instant Balance$ {printData.instant_balance}
    Online Balance$ {printData.online_balance}
    Total Balance$ {printData.total_balance}
    Register Cash$ {printData.register_cash}
    Over/Short + $ {printData.lottery_over_short} +
    +
    + + {/* Footer rows */} + + + + + + + + + + + + + +
    + Total Lottery Sales ($ {printData.total_lottery_sales}) + $ {printData.total_lottery_sales1}$ {printData.total_lottery_sales2}
    + Total Lottery Cashing ($ {printData.total_lottery_cashing}) + + $ {printData.total_lottery_cashing1} + + $ {printData.total_lottery_cashing2} +
    +
    +

    📗 ACTIVATED BOOKS

    + + + + + + + + + + + {printData.activated_books !== undefined + ? printData.activated_books.map((book, index) => ( + + + + + + + )) + : ""} + +
    Game NumberBook NumberCountValue
    {book.game_no}{book.book_no}{book.count}{book.value}
    + +
    +

    📕 RETURNED BOOKS

    + + + + + + + + + + {printData.returned_books !== undefined + ? printData.returned_books.map((book, index) => ( + + + + + + + )) + : ""} + +
    Game NumberTicket NumberValue
    {book.game_no}{book.ticket_number}{book.value}
    +
    +
    +
    + {/* GAS DAILY REPORT */} +
    +

    ⛽ GAS DAILY REPORT

    + + + + + + + + + + + {printData.gas_type_gallon_price_revenue !== undefined + ? printData.gas_type_gallon_price_revenue.map( + (gas, index) => ( + + + + + + + ) + ) + : ""} + + + + + + + + + + + + + + + + + + + +
    Gas TypeGallonPriceRevenue
    {gas.gas_type}{gas.gallon}$ {gas.price}$ {gas.revenue}
    + Total + {printData.total_gallon}-$ {printData.total_revenue}
    + Cash + $ {printData.cash}
    + DCR payments + $ {printData.dcr_payments}
    + Credit Card + $ {printData.credit_cards}
    +
    +
    +
    + + {/* LOTTERY TICKETS */} +
    +

    🎟 LOTTERY TICKETS

    + + + + + + + + + + + + + + + + {printData.lottery_tickets !== undefined + ? printData.lottery_tickets.map((ticket, index) => ( + + + + + + + + + + + + )) + : ""} + + + + + + + +
    Ticket No.ValueGame NameGame NumberBook NumberYesterday Ticket NoToday Ticket NoQuantity SoldToday Sold
    {ticket.today_ticket_no}{ticket.value}{ticket.game_name}{ticket.game_no}{ticket.book_no}{ticket.last_ticket_no}{ticket.today_ticket_no}{ticket.quantity_sold}{ticket.today_sold}
    + Grand Total + + {printData.grand_total_of_quantity_sold} + + {printData.grand_total_of_today_sold} +
    +
    +
    + ) : ( + "" + ); +}; + +export default Report; diff --git a/src/components/Pages/AppPAges/Reports/BusinessReport.js b/src/components/Pages/AppPAges/Reports/BusinessReport.js new file mode 100644 index 0000000..613ba97 --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/BusinessReport.js @@ -0,0 +1,2824 @@ +/* eslint-disable no-useless-computed-key */ +/* eslint-disable no-useless-rename */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import React, { useState, useEffect, useContext } from "react"; +import { useNavigate } from "react-router-dom"; +import "./Report.css"; +import { Email, LottoIcon } from "../../../../utils/api-manager/Forms/SvgIcons"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import PrintReport from "../Reports/PrintReport"; +import ReusableModal2 from "../ManageSettings/ReusableModal2"; +import { toast, ToastContainer } from "react-toastify"; +import LotteryReportTable from "../Lottery/LotteryReportTable"; +import { + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Button, +} from "@mui/material"; +import InvoiceForm from "../Dashboard/Invoice/InvoiceForm"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; + +function BusinessReport() { + const { Post, Patch, Get } = useApi(); + const navigate = useNavigate(); + const today = new Date().toISOString().split("T")[0]; + + const [shifts, setShifts] = useState([]); + const [selectedShift, setSelectedShift] = useState(""); + const [shiftDetails, setShiftDetails] = useState({}); + const [showModal, setShowModal] = useState(false); + const [selectedDate, setSelectedDate] = useState(today); + + const [invoices, setInvoices] = useState([]); + const [filteredInvoices, setFilteredInvoices] = useState([]); + const [selectedInvoice, setSelectedInvoice] = useState(""); + const [invoiceFields, setInvoiceFields] = useState([]); + const [showEmailModal, setShowEmailModal] = useState(false); + const [payrollData, setPayrollData] = useState([]); + const [selectedPayroll, setSelectedPayroll] = useState(null); + const [printReport, SetprintReport] = useState(); + const [shift_Id, setShift_Id] = useState(); + const [scanNumber, setScanNumber] = useState(""); + const [reloadOnScan, setReloadOnScan] = useState(false); + const { user } = useContext(AuthContext); + const [open, setOpen] = useState(false); + const handleAddInvoiceClick = () => { + setOpen(true); + }; + + const handleClose = () => { + setOpen(false); // Close the dialog + }; + + // const handleInvoiceChange = (e) => { + // const value = e.target.value; + // setSelectedInvoice(value); + // if (value === "addInvoice") { + // handleAddInvoiceClick(); + // } + // }; + + const handlePayrollSelect = async (e) => { + const payrollId = e.target.value; + + if (payrollId === "") return; // Do nothing if no selection is made + + const selectedPayrollData = payrollData.find( + (payroll) => payroll.id === payrollId + ); + + setSelectedPayroll(selectedPayrollData); + }; + useEffect(() => { + + + + console.log(shift_Id, "///////////////"); + const fetchPayrollData = async () => { + try { + const response = await Get("payrollSalaryData"); + if (response && Array.isArray(response)) { + setPayrollData(response); + setSelectedPayroll(null) + } + + } catch (error) { + console.error("Error fetching payroll data:", error); + } + }; + + fetchPayrollData(); + }, []); + + function getTicketWithGameAndBook(input) { + // Convert the input to a string + let str = input.toString().slice(0, 14); + // Extract parts of the string + let start = str.slice(0, 3); // First 3 digits + let middle = str.slice(4, -4); // Middle part (excluding first 3 and last 3 digits) + let end = str.slice(-4).slice(0, 3); // Last 3 digits + // Combine with "-" separators + let obj = { + gameNo: start, + bookNo: middle, + ticketNo: end, + }; + return obj; + } + // Update the payroll amount change handler to call API directly + const handlePayrollAmountChange = async (e, payroll) => { + const newAmount = e.target.value; + const payload = { + business_report_id: shiftDetails.business_report?.id, + type: "other", + title_id: payroll.payroll_employee_name, + amount: parseFloat(newAmount), + object_id: payroll.id, + }; + + await Post("purchaseExpenseAndOtherBusinessData", payload) + .then((resp) => { + refetchShiftData(); + setSelectedPayroll(null); // or set it to an appropriate default value + }) + .catch((error) => { + console.error("Error updating payroll amount:", error); + }); + }; + + const handleEmailButtonClick = () => { + setShowEmailModal(true); + }; + + const handleSendEmail = async (e) => { + e.preventDefault(); + try { + const payload = { + shift_id: shiftDetails.shift?.id, + }; + + const response = await Post("emailDailyReport", payload); + + if (response.status === 200) { + // Success handling + alert("Report sent successfully"); + setShowEmailModal(false); + } else { + // Error handling + alert("Failed to send report"); + } + } catch (error) { + console.error("Error sending email report:", error); + alert("An error occurred while sending the report"); + } + }; + + const getTodayDate = () => { + const today = new Date(); + return today.toISOString().split("T")[0]; + }; + + // Fetch invoices effect + useEffect(() => { + const fetchInvoiceData = async () => { + try { + const response = await Get("invoiceData"); + + if (response && Array.isArray(response)) { + // Store all invoices + setInvoices(response); + + // Filter invoices for today + const todayDate = getTodayDate(); + const todayInvoices = response.filter((invoice) => { + const invoiceDate = new Date(invoice.created_at) + .toISOString() + .split("T")[0]; + return invoiceDate === todayDate; + }); + + setFilteredInvoices(todayInvoices); + } + } catch (error) { + console.error("Error fetching invoice data:", error); + } + }; + + fetchInvoiceData(); + }, []); + + + const handleInvoiceSelect = (e) => { + const invoiceId = e.target.value; + + if (invoiceId === "addInvoice") { + handleAddInvoiceClick(); + return; + } + + // Check if the invoice is already in the purchase expenses of the current shift + const isInvoiceAlreadyAdded = shiftDetails.purchase_expenses?.some( + expense => expense.object_id === invoiceId && expense.type === 'purchase_expense' + ); + + if (isInvoiceAlreadyAdded) { + toast.error("This invoice has already been added to the shift report"); + return; + } + + // Use optional chaining and nullish coalescing for safer access + const selectedInvoiceData = filteredInvoices.find(inv => inv.id === invoiceId); + + if (!selectedInvoiceData) { + toast.error("Invalid invoice selected"); + return; + } + + if (invoiceFields.some(field => field.invoiceId === invoiceId)) { + toast.error("This invoice has already been selected"); + return; + } + + setSelectedInvoice(invoiceId); + setInvoiceFields(prev => [ + ...prev, + { + id: Date.now(), + invoiceId, + invoiceNumber: selectedInvoiceData?.invoice_number ?? "", + vendorDepartment: selectedInvoiceData?.vendor_department_name ?? "", + amount: selectedInvoiceData?.total_amount ?? "", + originalAmount: selectedInvoiceData?.amount ?? "", + } + ]); + + // Reset the select to default + e.target.value = ""; + }; + + + const handleInvoiceFieldChange = async (id, fieldName, value) => { + const updatedFields = invoiceFields.map((field) => + field.id === id ? { ...field, [fieldName]: value } : field + ); + setInvoiceFields(updatedFields); + + // Retrieve the invoiceId from updatedFields + const invoiceId = updatedFields.find((field) => field.id === id)?.invoiceId; + const invoice = filteredInvoices.find((invoice) => invoice.id === invoiceId); + + console.log(invoice?.invoice_no); + + if (invoice) { + if (fieldName === "amount") { + try { + // Validate the amount is a valid number + const parsedAmount = parseFloat(value); + if (isNaN(parsedAmount)) { + toast.error('Invalid amount entered'); + return; + } + + const payload = { + business_report_id: shiftDetails.business_report?.id, + type: "purchase_expense", + title_id: updatedFields.find((f) => f.id === id).vendorDepartment, + amount: parsedAmount, + invoice_no: invoice.invoice_no, + object_id: invoiceId, + }; + + const response = await Post("purchaseExpenseAndOtherBusinessData", payload); + + if (response.status === 200) { + toast.success('Invoice Amount Updated'); + refetchShiftData(); + } + } catch (error) { + console.error("Error updating invoice amount:", error); + toast.error(`Update failed: ${error.message || 'Unknown error'}`); + // Revert to original amount instead of clearing fields + const revertedFields = invoiceFields.map((f) => + f.id === id ? { ...f, amount: f.originalAmount } : f + ); + setInvoiceFields(revertedFields); + } + } + } + }; + const removeInvoiceField = (id) => { + setInvoiceFields(invoiceFields.filter((field) => field.id !== id)); + }; + + const calculateTotalInvoiceAmount = () => { + return invoiceFields.reduce((total, field) => { + const amount = parseFloat(field.amount) || 0; + return total + amount; + }, 0); + }; + + const handleRegisterField = async (registerNo, field, value) => { + const payload = { + business_report: shiftDetails.business_report?.id, + register_no: registerNo, + [field]: value, + }; + + await Post("updateRegisterAndBusinessReport", payload) + .then((response) => { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + register_net_sales: prevDetails.register_net_sales.map((register) => { + if (register.register_no === registerNo) { + return { + ...register, + [field]: value, + }; + } + return register; + }), + })); + refetchShiftData(); + }) + .catch((error) => { + console.error( + `Error updating ${field} for register ${registerNo}:`, + error + ); + }); + }; + + const handleGlobalField = async (field, value) => { + const businessReportId = shiftDetails.business_report?.id; + + // Check if the business report ID exists, if not log an error and exit the function + if (!businessReportId) { + console.error("Business report ID is missing."); + return; + } + + const payload = { + business_report: businessReportId, + [field]: value, + }; + + const response = await Post("updateRegisterAndBusinessReport", payload) + .then((response) => { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + business_report: { + ...prevDetails.business_report, + [field]: value, + }, + })); + refetchShiftData(); + }) + .catch((error) => { + console.error("Error Updating Field", error); + }); + }; + + // Combined handler that routes to the appropriate function + const handleFieldChange = ( + registerNo, + field, + value, + isRegisterField = true + ) => { + if (isRegisterField) { + handleRegisterField(registerNo, field, value); + } else { + handleGlobalField(field, value); + } + }; + const handleLotteryRegisterField = async (registerNo, field, value) => { + const payload = { + lottery_report: shiftDetails.lottery_report?.id, + register_no: registerNo, + [field]: value, + }; + + await Post("updateLotteryReport", payload) + .then((response) => { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + lottery_register_reports: prevDetails.lottery_register_reports.map( + (register) => { + if (register.register_no === registerNo) { + return { + ...register, + [field]: value, + }; + } + return register; + } + ), + })); + refetchShiftData(); + }) + .catch((error) => { + console.error( + `Error updating ${field} for register ${registerNo}:`, + error + ); + }); + }; + + const handleLotteryGlobalField = async (field, value) => { + const payload = { + lottery_report: shiftDetails.lottery_report?.id, + [field]: value, + }; + + const response = await Post("updateLotteryReport", payload) + .then((response) => { + // Update local state for the global field + setShiftDetails((prevDetails) => ({ + ...prevDetails, + lottery_report: { + ...prevDetails.lottery_report, + [field]: value, + }, + })); + refetchShiftData(); + }) + .catch((error) => { + console.error(`Error updating ${field}:`, error); + }); + }; + + const handleLotteryFieldChange = ( + registerNo, + field, + value, + isRegisterField = true + ) => { + if (isRegisterField) { + handleLotteryRegisterField(registerNo, field, value); + } else { + handleLotteryGlobalField(field, value); + } + }; + + useEffect(() => { + const fetchShifts = async () => { + try { + const response = await Post("getShiftDataWithRole", { + date: selectedDate, + }); + + // Check if the response indicates no shifts found + if (response?.message === "No shifts found for the provided date") { + // Clear existing shifts + setShifts([]); + setShiftDetails({}); + setSelectedShift(""); + + // Show toast notification + toast.info("You have no shifts on this date", { + position: "top-right", + autoClose: 3000, + }); + + return; // Exit the function early + } + + const shiftData = Array.isArray(response?.data?.shift_data) + ? response.data.shift_data + : []; + + const sortedShifts = shiftData.sort((a, b) => { + const timeA = a.shift.start_time + ? new Date(a.shift.start_time).getTime() + : 0; + const timeB = b.shift.start_time + ? new Date(b.shift.start_time).getTime() + : 0; + return timeA - timeB; + }); + + setShifts(sortedShifts); + + if (sortedShifts.length > 0) { + const userShift = sortedShifts.find( + (shift) => shift.shift.user === user.user_id + ); + + const selectedShift = + userShift || sortedShifts[sortedShifts.length - 1]; + + setSelectedShift(selectedShift.shift.title); + setShiftDetails(selectedShift); + setShift_Id(selectedShift.shift.id); + printDailyReport(selectedShift.shift.id); + } + } catch (error) { + console.error("Error fetching shift data:", error); + + // Optional: Show a toast for general error + toast.error("Error fetching shift data", { + position: "top-right", + autoClose: 3000, + }); + } + }; + + fetchShifts(); + }, [selectedDate, user.user_id]); + + const handleShiftChange = (e) => { + const selectedTitle = e.target.value; + setSelectedShift(selectedTitle); + + const selectedShiftDetails = shifts.find( + (shift) => shift.shift.title === selectedTitle + ); + + if (selectedShiftDetails) { + setShiftDetails(selectedShiftDetails); + + // Log specific details to verify + } else { + console.warn("No shift details found for selected title"); + setShiftDetails({}); // Ensure you reset to an empty object if no match + } + }; + + const handleDateChange = (e) => { + setSelectedDate(e.target.value); + }; + + const handleModalShift = () => setShowModal(true); + const handleCloseModal = () => setShowModal(false); + + const handleShiftEnd = async () => { + try { + const shiftId = shifts.find( + (shift) => shift.shift.title === selectedShift + )?.shift.id; + if (shiftId) { + const response = await Patch(`shiftData`, shiftId, { + is_active: false, + }); + if (response.status === 200) { + navigate("/reportDateSelection"); + } + } + } catch (error) { + console.error("Error ending shift:", error); + } finally { + setShowModal(false); + } + }; + const refetchShiftData = async () => { + try { + const response = await Post("getShiftDataWithRole", { + date: selectedDate, + }); + + const shiftData = Array.isArray(response?.data?.shift_data) + ? response.data.shift_data + : []; + + const sortedShifts = shiftData.sort((a, b) => { + const timeA = new Date(a.shift.start_time).getTime(); + const timeB = new Date(b.shift.start_time).getTime(); + return timeA - timeB; + }); + + // Update shifts state + setShifts(sortedShifts); + + // Find the currently selected shift in the new shift data + const currentlySelectedShiftDetails = sortedShifts.find( + (shift) => shift.shift.title === selectedShift + ); + + if (currentlySelectedShiftDetails) { + // If the currently selected shift exists in the new data, keep it + setShiftDetails(currentlySelectedShiftDetails); + setShift_Id(currentlySelectedShiftDetails.shift.id); + printDailyReport(currentlySelectedShiftDetails.shift.id); + } else if (sortedShifts.length > 0) { + // Fallback to last shift or user shift if current shift not found + const userShift = sortedShifts.find( + (shift) => shift.shift.user === user.user_id + ); + const fallbackShift = + userShift || sortedShifts[sortedShifts.length - 1]; + + setSelectedShift(fallbackShift.shift.title); + setShiftDetails(fallbackShift); + setShift_Id(fallbackShift.shift.id); + printDailyReport(fallbackShift.shift.id); + } + + // Reset invoice-related states + const todayInvoices = invoices.filter((invoice) => { + const invoiceDate = new Date(invoice.created_at) + .toISOString() + .split("T")[0]; + return invoiceDate === selectedDate; + }); + setFilteredInvoices(todayInvoices); + setInvoiceFields([]); // Clear invoice fields + setSelectedInvoice(""); + } catch (error) { + console.error("Error fetching updated shift data:", error); + } + }; + + const printDailyReport = async (shiftId) => { + let siftid = shiftId || shift_Id; + await Post(`printDailyReport`, { shift_id: siftid }).then((response) => { + SetprintReport(response.data); + const data = response.data; + localStorage.setItem("printDailyReport", JSON.stringify(data)); + }); + }; + const { + business_report = {}, + lottery_report = {}, + gas_report = {}, + register_net_sales = [], + } = shiftDetails; + + // Extracted values with defaults + const { + total_net_sales: totalNetSales = "N/A", + total_net_taxes: totalNetTaxes = "N/A", + gross_sales: grossSales = "N/A", + refund = "N/A", + cheque = "N/A", + total_register_cash: totalRegisterCash = "N/A", + cash_to_account: cashToAccount = "N/A", + over_short: overShort = "N/A", + credit_card: credit_card = "N/A", + meal_tax = "N/A", + } = business_report; + + /*==================================================================== Lottery===============================================================================================*/ + const [gameNo, setGameNo] = useState(""); + const [bookNo, setBookNo] = useState(""); + + const handleGameNoChange = (e) => { + const value = e.target.value; + + // Check if the value contains only numbers and has a maximum of 20 digits + if (/^\d{0,20}$/.test(value)) { + setGameNo(value); + } else { + // Optional: You can show an error message or alert the user + console.log("Only 20 numeric characters are allowed."); + } + }; + const handleBookNoChange = (e) => { + const value = e.target.value; + + // Check if the value contains only numbers and has a maximum of 20 digits + if (/^\d{0,20}$/.test(value)) { + setBookNo(value); + } else { + // Optional: You can show an error message or alert the user + console.log("Only 20 numeric characters are allowed."); + } + }; + const [gameReturnNo, setGameReturnNo] = useState(""); + const [bookReturnNo, setBookReturnNo] = useState(""); + const [ticketNo, setTicketNo] = useState(""); + const handleGameReturnNoChange = (e) => { + const value = e.target.value; + + // Check if the value contains only numbers and has a maximum of 20 digits + if (/^\d{0,20}$/.test(value)) { + setGameReturnNo(value); + } else { + // Optional: You can show an error message or alert the user + console.log("Only 20 numeric characters are allowed."); + } + }; + const handleBookNoReturnChange = (e) => { + const value = e.target.value; + + // Check if the value contains only numbers and has a maximum of 20 digits + if (/^\d{0,20}$/.test(value)) { + setBookReturnNo(value); + } else { + // Optional: You can show an error message or alert the user + console.log("Only 20 numeric characters are allowed."); + } + }; + const handleTicketNoChange = (e) => { + const value = e.target.value; + + // Check if the value contains only numbers and has a maximum of 20 digits + if (/^\d{0,20}$/.test(value)) { + setTicketNo(value); + } else { + // Optional: You can show an error message or alert the user + console.log("Only 20 numeric characters are allowed."); + } + }; + const [reloadLottoTable, setReloadLottoTable] = useState(false); + + const handleActivate = async () => { + const payload = { + game_no: gameNo, + book_no: bookNo, + active_date: today, + status: "activated", + activated_book_shift: shift_Id, + }; + + + try { + // Await the response from the API + const response = await Post("updateGameAndInventory", payload); + + // Check if the response contains the necessary data for success + if (response && response.data && response.data.lotteryInventory) { + toast.success("Game activated successfully!"); + setGameNo(""); // Reset the game number + setBookNo(""); // Reset the book number + setScanNumber(""); // Reset the scan number + setReloadLottoTable(prevState => !prevState); // Toggle the lotto table reload state + } else { + console.log("Activation failed with response:", response); // Log failure response + toast.error("Failed to activate the game."); + } + } catch (error) { + console.error("API call error:", error); // Log any caught errors + toast.error("No Lottery Inventory found."); + setScanNumber(""); // Reset the scan number + setReloadLottoTable(prevState => !prevState); // Toggle the lotto table reload state + } + }; + + + const handleDeleteInvoice = async (invoiceId) => { + try { + // Find the specific invoice/expense to delete from the current shift's purchase expenses + const invoiceToDelete = shiftDetails.purchase_expenses.find( + (expense) => expense.id === invoiceId + ); + + if (!invoiceToDelete) { + toast.error("Invoice not found"); + return; + } + + const payload = { + business_report_id: shiftDetails.business_report?.id, + object_id: invoiceToDelete.object_id, + delete: "true", + }; + + await Post("purchaseExpenseAndOtherBusinessData", payload) + .then((response) => { + toast.success("Invoice deleted successfully!"); + + // Update purchase expenses by filtering out the deleted entry + const updatedPurchaseExpenses = shiftDetails.purchase_expenses.filter( + (expense) => expense.id !== invoiceId + ); + + // Update the shift details state + setShiftDetails((prevDetails) => ({ + ...prevDetails, + purchase_expenses: updatedPurchaseExpenses, + business_report: { + ...prevDetails.business_report, + total_purchase_expense: ( + parseFloat(prevDetails.business_report.total_purchase_expense) - + parseFloat(invoiceToDelete.amount) + ).toFixed(2), + }, + })); + }) + .catch((errpr) => { + toast.error("Failed to delete invoice"); + }); + } catch (error) { + console.error("Error deleting invoice:", error); + toast.error("An error occurred while deleting the invoice"); + } + }; + + const handleDeletePayrollEntry = async (payrollId) => { + try { + // Create the payload for the API request + const payload = { + business_report_id: shiftDetails.business_report?.id, + object_id: payrollId.object_id, + delete: "true", + }; + + // Make the API POST request to delete the payroll entry + const response = await Post( + "purchaseExpenseAndOtherBusinessData", + payload + ); + + // Ensure the response is valid and successful (status 200) + if (response && response.status === 200) { + toast.success("Payroll entry deleted successfully!"); + + // Update payrollData state by filtering out the deleted payroll entry + setPayrollData((prevPayrollData) => + prevPayrollData.filter((entry) => entry.id !== payrollId) + ); + + // Refetch shift data to ensure everything is in sync + refetchShiftData(); + } else { + toast.error("Failed to delete payroll entry"); + } + } catch (error) { + console.error("Error deleting payroll entry:", error); + toast.error("An error occurred while deleting the payroll entry"); + } + }; + + const handleReturn = async () => { + const today = new Date().toISOString().split("T")[0]; + + try { + const payload = { + returned_book_shift: shift_Id, + game_no: gameReturnNo, + book_no: bookReturnNo, + total_no_of_ticket_return: ticketNo, + return_date: today, + status: "returned", + }; + + // Log the payload to confirm it's correct before sending it + console.log("Payload being sent:", payload); + + // Use only await, no need for .then() + const response = await Post("updateGameAndInventory", payload); + + // Log the response to see if it's returning anything unexpected + console.log("Response:", response); + + // Check if response and data exist + if (response && response.data) { + // Check if 'lotteryInventory' exists in response.data + const returnedInventory = response.data.lotteryInventory; + + if (returnedInventory) { + // Log the returned inventory to debug its structure + console.log("Returned inventory:", returnedInventory); + + // Check if 'returned_book_shift' is properly set + if (returnedInventory.returned_book_shift) { + toast.success("Book returned successfully!"); + // Reset fields after successful return + setGameReturnNo(""); + setBookReturnNo(""); + setTicketNo(""); + setScanNumber(""); + setReloadLottoTable(!reloadLottoTable); + } else { + // 'returned_book_shift' was not returned properly in the response + console.error("Returned book shift was not updated properly on the backend."); + toast.error("Returned book shift not updated properly."); + } + } else { + // 'lotteryInventory' is missing from the response data + console.error("Lottery inventory is missing from the response."); + toast.error("Failed to return book. Lottery inventory missing."); + } + } else { + // 'data' or the entire response is missing + console.error("Response or data is missing."); + toast.error("Failed to return book. Response missing or incorrect."); + } + + } catch (error) { + // Log any error that occurs during the request + console.error("Error occurred while returning the book:", error); + toast.error("There was an error returning the book."); + } + }; + + + + const [activeTab, setActiveTab] = useState("activated"); // Ensure it starts on "activated" + const [activatedBooks, setActivatedBooks] = useState([]); + const [returnedBooks, setReturnedBooks] = useState([]); + + // Define columns for each table + const activatedColumns = [ + { header: "Game Number", field: "game_no" }, + { header: "Book Number", field: "book_no" }, + { header: "Status", field: "status" }, + ]; + + const returnedColumns = [ + { header: "Game Number", field: "game_no" }, + { header: "Book Number", field: "book_no" }, + { header: "Ticket Number", field: "total_no_of_ticket_return" }, + { header: "Status", field: "status" }, + ]; + + const [lastTicketNo, setLastTicketNo] = useState(0); + // Fetch data from API + useEffect(() => { + const fetchData = async (shift_id) => { + try { + const response = await Get("lotteryInventoryData"); + + // Filter data based on status + const activated = response.filter((item) => item.status === "activated"); + const returned = response.filter((item) => item.status === "returned"); + const scanned = response.filter((item) => item.status === "activated"); + + + // Update state + setActivatedBooks(activated); + setReturnedBooks(returned); + setScannedTickets(scanned); + printDailyReport(shift_id); + console.log(shift_id) + } catch (error) { + console.error("Error fetching lottery inventory data:", error); + } + }; + + // Always fetch data when component mounts + fetchData(shift_Id); + }, [reloadOnScan, reloadLottoTable]); + + const handleTabClick = (tab) => { + setReloadLottoTable(!reloadLottoTable); + if (tab !== activeTab) { + setActiveTab(tab); + } + }; + const [scannedTickets, setScannedTickets] = useState([]); + const [gameTicketScanNo, setGameTicketScanNo] = useState(""); + const [bookTicketScanNo, setBookTicketScanNo] = useState(""); + const [ticketScanNo, setTicketScanNo] = useState(); + const handleGameTicketScanChange = (e) => { + const value = e.target.value; + + // Check if the value contains only numbers and has a maximum of 20 digits + if (/^\d{0,20}$/.test(value)) { + setGameTicketScanNo(value); + } else { + // Optional: You can show an error message or alert the user + console.log("Only 20 numeric characters are allowed."); + } + }; + const handleBookTicketScanChange = (e) => { + const value = e.target.value; + + // Check if the value contains only numbers and has exactly 20 digits + if (/^\d{0,20}$/.test(value)) { + setBookTicketScanNo(value); + } else { + // Optional: You can show an error message or alert the user + console.log("Only 20 numeric characters are allowed."); + } + }; + const handleTicketScanChange = (e) => { + const value = e.target.value; + + // Check if the value contains only numbers and has exactly 20 digits + if (/^\d{0,20}$/.test(value)) { + setTicketScanNo(value); + } else { + // Optional: You can show an error message or alert the user + console.log("Only 20 numeric characters are allowed."); + } + }; + + const handleLotteryTicketScan = async () => { + try { + const payload = { + activated_book_shift:shift_Id, + game_no: gameTicketScanNo, + book_no: bookTicketScanNo, + today_ticket_no: ticketScanNo, + }; + + // Ensure Patch receives the endpoint as a proper string + const response = await Post("updateGameAndInventory", payload).then( + (response) => { + toast.success("Ticket scanned successfully!"); + + // Append new ticket data to scannedTickets + + // Clear the input fields + setGameTicketScanNo(""); + setBookTicketScanNo(""); + setTicketScanNo(""); + setScanNumber(""); + setTicketNo(""); + setTicketScanNo(""); + setReloadLottoTable(!reloadLottoTable); + setReloadOnScan(!reloadOnScan); + } + ); + } catch (error) { + setReloadLottoTable(!reloadLottoTable); + console.error("Failed to scan ticket:", error); + toast.error("There was an error scanning the ticket."); + } + }; + /*===================================ticket scan=========================================*/ + + const handleScanNumberChange = (e) => { + let newScanNumber = e.target.value; + + // Check if the input contains only numeric characters and is up to 50 digits long + if (/^\d{0,50}$/.test(newScanNumber)) { + setScanNumber(newScanNumber); + + if (newScanNumber.length >= 14) { + const _gameNo = getTicketWithGameAndBook(newScanNumber).gameNo; + const _bookNo = getTicketWithGameAndBook(newScanNumber).bookNo; + const _ticketNo = getTicketWithGameAndBook(newScanNumber).ticketNo; + let todayTicketNo = getTodayTicketNo(scannedTickets, _gameNo); + console.log(todayTicketNo) + + setLastTicketNo(todayTicketNo); + + if (newScanNumber.length === 15) { + setReloadOnScan(!reloadOnScan); + } + + // Set state with extracted values + setGameNo(_gameNo); + setBookNo(_bookNo); + setTicketNo(_ticketNo); + setTicketScanNo(_ticketNo); + setGameReturnNo(_gameNo); + setBookReturnNo(_bookNo); + setGameTicketScanNo(_gameNo); + setBookTicketScanNo(_bookNo); + } + } else { + // Optional: Log an error or give feedback if the input is invalid + console.log("Only numeric characters up to 50 digits are allowed."); + } + }; + + + const ScanedTicketColumns = [ + { header: "Game Price", field: "game_price" }, + { header: "Game Name", field: "game_name" }, + { header: "Game Number", field: "game_no" }, + { header: "Book Number", field: "book_no" }, + { header: "Activated on", field: "active_date" }, + { header: "Last Ticket No", field: "last_ticket_no" }, + { header: "Today Ticket No", field: "today_ticket_no" }, + + { header: "Quantity Sold", field: "quantity_sold" }, + { header: "Total", field: "total" }, + ]; + + const getTodayTicketNo = (dataArray, gameNumber) => { + const game = dataArray.find((item) => item.game_no === gameNumber); + return game ? game.today_ticket_no : null; // Returns null if game not found + }; + const renderRegisterInputs = (registers, fieldName, labelPrefix) => { + // Add more robust logging and error handling + if (!registers || !Array.isArray(registers) || registers.length === 0) { + console.warn(`No valid registers found for ${fieldName}`); + return null; + } + + return registers + .sort((a, b) => a.register_no - b.register_no) + .map((register, index) => { + // More robust value extraction with additional fallbacks + const registerValue = + register[fieldName] !== undefined && register[fieldName] !== null + ? register[fieldName].toString() + : ""; + + return ( +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + onChange={(e) => { + // Update local state immediately + const updatedRegisters = [...registers]; + const registerIndex = updatedRegisters.findIndex( + (r) => r.register_no === register.register_no + ); + if (registerIndex !== -1) { + updatedRegisters[registerIndex] = { + ...updatedRegisters[registerIndex], + [fieldName]: e.target.value, + }; + + // You might want to update the parent component's state here + // For example, if you have a function to update shiftDetails + setShiftDetails((prevDetails) => ({ + ...prevDetails, + register_net_sales: updatedRegisters, + })); + } + }} + onBlur={(e) => { + const finalValue = e.target.value; + handleFieldChange(register.register_no, fieldName, finalValue); + }} + /> +
    + ); + }); + }; + const renderLotteryRegisterInputs = (registers, fieldName, labelPrefix) => { + if (!registers || registers.length === 0) { + console.warn(`No lottery registers found for ${fieldName}`); + return null; + } + + return registers + .sort((a, b) => a.register_no - b.register_no) + .map((register, index) => { + // Use controlled input approach + return ( +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + value={register[fieldName] || ""} // Use value instead of defaultValue + onChange={(e) => { + // Create a copy of the registers and update the specific register + const updatedRegisters = registers.map((reg) => + reg.register_no === register.register_no + ? { ...reg, [fieldName]: e.target.value } + : reg + ); + + // Update the shiftDetails state to reflect the changes + setShiftDetails((prevDetails) => ({ + ...prevDetails, + lottery_register_reports: updatedRegisters, + })); + }} + onBlur={(e) => + handleLotteryFieldChange( + register.register_no, + fieldName, + e.target.value, + true + ) + } + /> +
    + ); + }); + }; + + // Safely check if `purchase_expenses` exists before rendering the table rows + const filteredExpenses = Array.isArray(shiftDetails.purchase_expenses) + ? shiftDetails.purchase_expenses.filter((entry) => entry.type === "other") + : []; + const availableInvoices = filteredInvoices.filter(invoice => + !shiftDetails.purchase_expenses?.some( + expense => expense.object_id === invoice.id && expense.type === 'purchase_expense' + ) && + !invoiceFields.some(field => field.invoiceId === invoice.id) + );const availablePayrollEntries = payrollData.filter(payroll => + !shiftDetails.purchase_expenses?.some( + expense => expense.object_id === payroll.id && expense.type === 'other' + ) + ); + + return ( +
    +
    +
    +
    + +
    + +
    +
    + + + + + + +
    { + e.preventDefault(); + handleShiftEnd(); + }} + > +
    + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    + +
    +
    +

    Business Report

    +
    +
    +

    Purchase/Expense

    +
    +
    +
    + +
    +
    + {register_net_sales && register_net_sales.length > 0 ? ( + renderRegisterInputs( + register_net_sales, + "net_sales", + "Net Sales Register" + ) + ) : ( +
    No register data available
    + )} + + {register_net_sales.length > 0 ? ( + <> + {renderRegisterInputs( + register_net_sales, + "net_taxes", + "Net Taxes" + )} + + ) : ( +
    No register data available
    + )} + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + readOnly + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + /> +
    + +
    +
    +
    + +
    + + { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + business_report: { + ...prevDetails.business_report, + ["meal_tax"]: e.target.value, + }, + })); + }} + onBlur={ + (e) => handleGlobalField("meal_tax", e.target.value) // Directly call handleGlobalField + } + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + /> +
    + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + /> +
    + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + onChange={(e) => { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + business_report: { + ...prevDetails.business_report, + ["refund"]: e.target.value, + }, + })); + }} + onBlur={(e) => handleGlobalField("refund", e.target.value)} + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + onChange={(e) => { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + business_report: { + ...prevDetails.business_report, + ["cheque"]: e.target.value, + }, + })); + }} + onBlur={(e) => handleGlobalField("cheque", e.target.value)} + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .slice(0, 12); + }} + onChange={(e) => { + + + + setShiftDetails((prevDetails) => ({ + ...prevDetails, + business_report: { + ...prevDetails.business_report, + ['credit_card']: e.target.value, + }, + })); + }} + onBlur={(e) => + handleGlobalField("credit_card", e.target.value) + } + /> +
    + {register_net_sales.length > 0 ? ( + <> + {renderRegisterInputs( + register_net_sales, + "register_amount", + "Register Cash" + )} + + ) : ( +
    No register data available
    + )} + + + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + /> +
    +
    + + { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + business_report: { + ...prevDetails.business_report, + ["cash_to_account"]: e.target.value, + }, + })); + }} + onBlur={(e) => + handleGlobalField("cash_to_account", e.target.value) + } + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + readOnly + /> +
    +
    + + handleGlobalField("over_short", e.target.value)} + readOnly + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + /> +
    + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + onChange={(e) => { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + business_report: { + ...prevDetails.business_report, + ["credit_card"]: e.target.value, + }, + })); + }} + onBlur={(e) => handleGlobalField("credit_card", e.target.value)} + /> +
    +
    + +
    +
    +
    +
    + + + + + + + + +
    + + + + + {invoiceFields.map((field) => ( +
    +
    + + +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + onChange={(e) => { + // Create a temporary local update + const updatedFields = invoiceFields.map( + (invoiceField) => + invoiceField.id === field.id + ? { ...invoiceField, amount: e.target.value } + : invoiceField + ); + setInvoiceFields(updatedFields); + }} + onBlur={(e) => + handleInvoiceFieldChange( + field.id, + "amount", + e.target.value + ) + } + placeholder="Enter amount" + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + /> +
    + +
    + ))} + + {/* Total Invoice Amount */} + {invoiceFields.length > 0 && ( +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + /> +
    + )} + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + {/* Check if shiftDetails and shiftDetails.purchase_expenses are defined and ensure it's an array */} + {shiftDetails && + Array.isArray(shiftDetails.purchase_expenses) && + shiftDetails.purchase_expenses.length === 0 ? ( + + + + ) : // Check if shiftDetails.purchase_expenses is an array before filtering + shiftDetails && + Array.isArray(shiftDetails.purchase_expenses) && + shiftDetails.purchase_expenses.length > 0 ? ( + shiftDetails.purchase_expenses.filter( + (entry) => entry.type === "purchase_expense" + ).length === 0 ? ( + + + + ) : ( + shiftDetails.purchase_expenses + .filter((entry) => entry.type === "purchase_expense") + .map((expense) => ( + + + + + + + )) + ) + ) : ( + + + + )} + +
    + Vendor Name + + Invoice No + + Amount + + Action +
    + No data available +
    + No data available for purchase expenses +
    + + {expense.title_id || "N/A"} + + + + {expense.invoice_no ? expense.invoice_no : "N/A"} + + + + ${parseFloat(expense.amount).toFixed(2)} + + +
    + +
      +
    • + +
    • +
    +
    +
    + No data available for purchase expenses +
    + +
    + + +
    + {selectedPayroll && ( +
    +
    + + +
    +
    + + handlePayrollAmountChange(e, selectedPayroll)} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + placeholder="Enter amount" + /> +
    +
    + + +
    +
    + )} + + + + + + + + + + + + + {/* Check if filteredExpenses is empty */} + {filteredExpenses.length === 0 ? ( + + + + ) : ( + filteredExpenses.map((payrollEntry) => ( + + + + + + + )) + )} + +
    + Employee Name + + Description + + Amount + + Action +
    + No data available +
    + + {payrollEntry.title_id || "N/A"} + + + Salary + + + ${parseFloat(payrollEntry.amount).toFixed(2)} + + +
    + +
      +
    • + +
    • +
    +
    +
    +
    +
    +
    +

    Daily Lottery Report

    +
    +
    +
    +

    Today Invoice

    +
    +
    +

    Yesterday Invoice

    +
    +
    +

    Today Cash

    +
    +
    +
    +
    + {/* Today Invoice Section */} + {shiftDetails.lottery_register_reports?.length > 0 ? ( + <> + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "net_sales_sr50", + "Online Net Sales" + )} + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "online_cashing_sr50", + "Online Cashing" + )} + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "instant_cashing_sr34", + "Instant Cashing" + )} + + ) : ( +
    + No lottery register data available +
    + )} + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + onChange={(e) => + handleLotteryFieldChange( + null, + "total_net_sales_sr50", + e.target.value, + false + ) + } + readOnly + /> +
    + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.total_online_cashing_sr50 || ""} + onChange={(e) => + handleLotteryFieldChange( + null, + "total_online_cashing_sr50", + e.target.value, + false + ) + } + readOnly + /> +
    + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.total_instant_cashing_today || ""} + onChange={(e) => + handleLotteryFieldChange( + null, + "total_instant_cashing_today", + e.target.value, + false + ) + } + readOnly + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.instant_sale_sr34 || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "instant_sale_sr34", + e.target.value, + false + ) + } + /> +
    +
    + +
    + {/* Yesterday Invoice Section */} + {shiftDetails.lottery_register_reports?.length > 0 ? ( + <> + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "net_sales_sr51", + "Online Net Sales" + )} + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "online_cashing_sr51", + "Online Cashing" + )} + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "instant_cashing_sr35", + "Instant Cashing " + )} + + ) : ( +
    + No lottery register data available +
    + )} + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.total_net_sales_sr51 || ""} + onChange={(e) => + handleLotteryFieldChange( + null, + "total_net_sales_sr51", + e.target.value, + false + ) + } + readOnly + /> +
    + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.total_online_cashing_sr51 || ""} + onChange={(e) => + handleLotteryFieldChange( + null, + "total_online_cashing_sr51", + e.target.value, + false + ) + } + readOnly + /> +
    + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.total_instant_cashing_yesterday || ""} + onChange={(e) => + handleLotteryFieldChange( + null, + "total_instant_cashing_yesterday", + e.target.value, + false + ) + } + readOnly + /> +
    +
    + +
    + {" "} + {/* Today Cash Section */} +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.total_online_balance || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "total_online_balance", + e.target.value, + false + ) + } + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.credit_sales || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "credit_sales", + e.target.value, + false + ) + } // onBlur to update value + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.debit_sales || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "debit_sales", + e.target.value, + false + ) + } // onBlur to update value + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.register_cash || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "register_cash", + e.target.value, + false + ) + } // onBlur to update value + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.over_short || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "over_short", + e.target.value, + false + ) + } // onBlur to update value + /> +
    +
    +
    + + +
    +

    Lottery Activated Books

    +
    +
    +
    +

    Scan Code and Activate

    +
    +
    +

    Activate Manually

    +
    +
    +

    Return Book

    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    handleTabClick("activated")} + > +

    + Activated Books +

    +
    +
    handleTabClick("returned")} + > +

    + Returned Books +

    +
    +
    + +
    + +
    + +
    +

    Lottery Ticket Scan

    +
    +
    +
    +

    Scan Code Here

    +
    +
    +

    Add Ticket Manually

    +
    +
    + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +

    + Count : ({lastTicketNo}) Last Ticket Scanned : +

    +
    +
    +
    +
    +
    handleTabClick("activated")} + > +

    + Scanned Tickes +

    +
    +
    +
    + + +
    + setShowEmailModal(false)} + title="Email Daily Report" + > +
    + {/* Updated message */} +
    +

    The generated report will be sent to you and the store owner.

    +
    + +
    + + +
    +
    +
    +
    + ); +} + +export default BusinessReport; diff --git a/src/components/Pages/AppPAges/Reports/CashDrop.js b/src/components/Pages/AppPAges/Reports/CashDrop.js new file mode 100644 index 0000000..4facf9c --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/CashDrop.js @@ -0,0 +1,348 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import SettingTable from "../ManageSettings/SettingTable"; +import Swal from "sweetalert2"; + +function CashDrop() { + const [selectedShift, setSelectedShift] = useState("1st Shift"); + const [cashDrop, setCashdrop] = useState(""); // Initialize as an empty string + const [shift, setShift] = useState(null); // Correctly initialize shift as null + const [cashDropHistory, setCashDropHistory] = useState([]); // Store previous cash drops + const [editing, setEditing] = useState(false); // To track if we're editing + const [editData, setEditData] = useState(null); // Data for the entry being edited + const [newAmount, setNewAmount] = useState(""); // The new amount during editing + + const { Get, Post, Delete, Patch } = useApi(); + const { user } = useContext(AuthContext); + + const today = new Date().toISOString().split("T")[0]; + + const handleShiftChange = (event) => { + setSelectedShift(event.target.value); + }; + + // Get shift data and cash drop history + const handleGet = async () => { + try { + // Fetch both shift data and cash drop history concurrently using Promise.all + const [shiftResponse, cashDropResponse] = await Promise.all([ + Get("isShiftActive"), + Get("cashDropData"), + ]); + + if (shiftResponse && shiftResponse.shift_id) { + setShift(shiftResponse.shift_id); // Set shift data + } else { + console.error("Shift data not found."); + } + + if (cashDropResponse && Array.isArray(cashDropResponse)) { + setCashDropHistory(cashDropResponse); // Set cash drop history + } else { + console.error("Cash drop history not found or not an array."); + } + } catch (error) { + console.error("Error fetching shift data or cash drop history:", error); + } + }; + + // Handle submit new cash drop + const handleSubmit = async () => { + if (!cashDrop || cashDrop.trim() === "") { + alert("Please enter a valid cash drop amount."); + return; + } + + if (!shift) { + alert("Shift data is not available. Please try again later."); + return; + } + + try { + const response = await Post("cashDropData", { + shift: shift, // Send the shift data + amount: cashDrop, // Send the amount from the state + store: user.store, // Add the user store info + }); + + if (response && response.data) { + setCashDropHistory(prevHistory => [ + ...prevHistory, + response.data + ]); + setCashdrop(""); // Clear the input field after submission + } else { + console.error("Unexpected response format:", response); + } + } catch (error) { + console.error("Error submitting cash drop data:", error); + } + }; + + const handleDelete = async (id) => { + const result = await Swal.fire({ + title: "Are you sure?", + text: "You won't be able to revert this!", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#3085d6", + confirmButtonText: "Yes, delete it!", + }); + + // Check if the user clicked the confirm button + if (!result.isConfirmed) return; // Exit if the user cancels + { + try { + const response = await Delete(`cashDropData`, id); + if (response && response.data) { + setCashDropHistory(prevHistory => + prevHistory.filter(item => item.id !== id) + ); + } + } catch (error) { + console.error("Error deleting cash drop:", error); + } + } + }; + + const handleEdit = (data) => { + setEditing(true); + setEditData(data); // Store the original data to update + setNewAmount(data.amount); // Set the current amount to the input field + }; + + const handleUpdate = async () => { + if (!newAmount || newAmount.trim() === "") { + alert("Please enter a valid amount."); + return; + } + + try { + const response = await Patch(`cashDropData`, editData.id, { + amount: newAmount, + shift: shift, + store: user.store, + }); + + if (response && response.data) { + setCashDropHistory(prevHistory => + prevHistory.map(item => + item.id === editData.id ? { ...item, amount: newAmount } : item + ) + ); + setEditing(false); + setEditData(null); + setNewAmount(""); // Clear input after update + } + } catch (error) { + console.error("Error updating cash drop:", error); + } + }; + + // Only call handleGet once after component mounts + useEffect(() => { + handleGet(); // Get shift data and cash drop history when the component mounts + }, []); // Empty dependency array ensures this runs only on mount + + return ( +
    +
    + {/*
    +
    + +
    + +
    */} +
    + +
    +
    +
    + + setCashdrop(e.target.value)} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + style={{ + padding: "8px", + border: "1px solid #ccc", + borderRadius: "4px", + width: "100%", + fontSize: "16px", + }} + /> +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + {/* Edit Modal */} + {editing && ( +
    +
    + setEditing(false)} + style={{ + position: "absolute", + top: "10px", + right: "10px", + fontSize: "24px", + cursor: "pointer", + }} + > + × + +

    Edit Cash Drop

    +
    + + setNewAmount(e.target.value)} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); // Limit input length (10 digits + 1 decimal + 2 decimal places) + }} + + style={{ + padding: "8px", + border: "1px solid #ccc", + borderRadius: "4px", + width: "100%", + fontSize: "16px", + }} + /> +
    +
    + + +
    +
    +
    + )} +
    + ); +} + +export default CashDrop; diff --git a/src/components/Pages/AppPAges/Reports/ConfirmationModal.css b/src/components/Pages/AppPAges/Reports/ConfirmationModal.css new file mode 100644 index 0000000..1207ed1 --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/ConfirmationModal.css @@ -0,0 +1,65 @@ +/* Modal Overlay */ +.modal-overlays { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + } + + /* Modal Content */ + .modal-contents { + background-color: #fff; + border-radius: 8px; + padding: 20px; + max-width: 400px; + width: 100%; + text-align: center; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + } + + /* Modal Heading */ + .modal-headings { + margin: 0; + margin-bottom: 10px; + font-size: 18px; + font-weight: bold; + } + + /* Modal Text */ + .modal-texts { + margin-bottom: 20px; + font-size: 16px; + } + + /* Button Container */ + .modal-button-containers { + display: flex; + justify-content: center; + } + + /* Buttons */ + .modal-buttons { + padding: 10px 20px; + font-size: 14px; + border: none; + border-radius: 4px; + cursor: pointer; + margin: 0 5px; + } + + .confirm-buttons { + background-color: #4caf50; + color: #fff; + } + + .cancel-buttons { + background-color: #f44336; + color: #fff; + } + \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Reports/ConfirmationModal.js b/src/components/Pages/AppPAges/Reports/ConfirmationModal.js new file mode 100644 index 0000000..89eb473 --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/ConfirmationModal.js @@ -0,0 +1,40 @@ +import React from 'react'; +import { Dialog, DialogActions, DialogContent, DialogTitle, Button } from '@mui/material'; + +const ConfirmationModal = ({ open, onConfirm, onCancel, title, description }) => { + return ( + + {title} + + {description} + + + + + + + ); +}; + +export default ConfirmationModal; diff --git a/src/components/Pages/AppPAges/Reports/GasReport.js b/src/components/Pages/AppPAges/Reports/GasReport.js new file mode 100644 index 0000000..f19542d --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/GasReport.js @@ -0,0 +1,867 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect, useContext } from "react"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; + +function GasReport() { + const { Post, Get, Delete } = useApi(); + const today = new Date().toISOString().split("T")[0]; + const [gasCompanies, setGasCompanies] = useState([]); + const [isEditing, setIsEditing] = useState(false); + const { user } = useContext(AuthContext); + + + + const [newHouseCharge, setNewHouseCharge] = useState({ + company_id: '', + company_title: '', + amount: '', + entry_no: null, + id: null // Add this to track the specific entry being edited + + }); + const handleAddHouseCharge = async () => { + // Validate inputs + if (!newHouseCharge.company_id || !newHouseCharge.amount) { + return; + } + + try { + // Prepare payload + const payload = { + gas_report: fullShiftData.gasReportData.id, + entry_no: isEditing ? newHouseCharge.entry_no : fullShiftData.houseCharges.length + 1, + company_title: gasCompanies.find( + company => company.id === newHouseCharge.company_id + )?.name || '', + amount: parseFloat(newHouseCharge.amount), + house_charge_id: isEditing ? newHouseCharge.id : undefined // Add this for editing specific entry + }; + + // Send API request to add or update house charge + const response = await Post("updateGasReport", payload); + + if (response.error) { + console.error('Error adding/updating house charge:', response.error); + return; + } + + // Refetch shift data to update house charges + await refetchShiftData(); + + // Reset new house charge inputs + setNewHouseCharge({ + company_id: '', + company_title: '', + amount: '', + entry_no: null, + id: null + }); + setIsEditing(false); + } catch (error) { + console.error('Network error adding/updating house charge:', error); + } + }; + const handleEditHouseCharge = (charge) => { + // Find the corresponding company ID + const companyId = gasCompanies.find( + company => company.name === charge.company_title + )?.id || ''; + + // Set the charge for editing + setNewHouseCharge({ + company_id: companyId, + company_title: charge.company_title, + amount: charge.amount.toString(), + entry_no: charge.entry_no, + id: charge.id + }); + setIsEditing(true); + }; + + const handleHouseChargeBlur = async () => { + // Only proceed if both company and amount are selected/entered + if (newHouseCharge.company_id && newHouseCharge.amount) { + await handleAddHouseCharge(); + } + }; + + const handleHouseChargeCompanyChange = (e) => { + setNewHouseCharge(prev => ({ + ...prev, + company_id: e.target.value + })); + }; + + const handleHouseChargeAmountChange = (e) => { + setNewHouseCharge(prev => ({ + ...prev, + amount: e.target.value + })); + }; + + const handleCancelEdit = () => { + setNewHouseCharge({ + company_id: '', + company_title: '', + amount: '', + entry_no: null, + id: null + }); + setIsEditing(false); + }; + + const [fullShiftData, setFullShiftData] = useState({ + shifts: [], + selectedShift: '', + selectedDate: today, + shiftDetails: {}, + gasTypes: [], + gasReportData: {}, + gasTypeReports: {}, + businessReport: {}, + lotteryReport: {}, + registerNetSales: [], + purchaseExpenses: [], + lotteryRegisterReports: [], + houseCharges: [] + }); + useEffect(() => { + const fetchGasCompanies = async () => { + try { + // Add a new API endpoint method in your useApi hook + const companiesResponse = await Get("gasCompanyData"); + + if (Array.isArray(companiesResponse)) { + setGasCompanies(companiesResponse); + } else { + console.error('Invalid response format for gas companies'); + } + } catch (error) { + console.error('Error fetching gas companies:', error); + } + }; + + fetchGasCompanies(); + }, []); + + const handleDeleteHouseCharge = async (charge) => { + try { + + const response = await Delete("houseChargeData", charge.id); + + if (response.error) { + console.error('Error deleting house charge:', response.error); + return; + } + await refetchShiftData(); + if (newHouseCharge.id === charge.id) { + setNewHouseCharge({ + company_id: '', + company_title: '', + amount: '', + entry_no: null, + id: null + }); + setIsEditing(false); + } + } catch (error) { + console.error('Network error deleting house charge:', error); + } + }; + + // Fetch initial data and update full state + useEffect(() => { + const fetchInitialData = async () => { + try { + const [gasTypesResponse, shiftsResponse] = await Promise.all([ + Get("gasTypeData"), + Post("getShiftDataWithRole", { date: fullShiftData.selectedDate }) + ]); + + // Filter active gas types + const activeGasTypes = gasTypesResponse.filter(gasType => gasType.is_enable); + + const shiftData = Array.isArray(shiftsResponse?.data?.shift_data) + ? shiftsResponse.data.shift_data + : []; + + const sortedShifts = shiftData.sort((a, b) => { + const timeA = new Date(a.shift.start_time).getTime(); + const timeB = new Date(b.shift.start_time).getTime(); + return timeA - timeB; + }); + + let selectedShift; + if (sortedShifts.length === 0) { + // No shifts available + selectedShift = null; + } else { + // First, try to find a shift assigned to the current user + const userShift = sortedShifts.find((shift) => shift.shift.user === user.user_id); + + if (userShift) { + // If a shift is assigned to the current user, select that shift + selectedShift = userShift; + } else { + // If no shift is assigned to the current user, select the last (most recent) shift + selectedShift = sortedShifts[sortedShifts.length - 1]; + } + } + + const gasTypeReportsMap = {}; + selectedShift?.gas_type_reports?.forEach(report => { + gasTypeReportsMap[report.gas_type] = report; + }); + + setFullShiftData(prevState => ({ + ...prevState, + shifts: sortedShifts, + selectedShift: selectedShift?.shift?.title || '', + shiftDetails: selectedShift || {}, + gasTypes: activeGasTypes, + gasReportData: selectedShift?.gas_report || {}, + gasTypeReports: gasTypeReportsMap, + businessReport: selectedShift?.business_report || {}, + lotteryReport: selectedShift?.lottery_report || {}, + registerNetSales: selectedShift?.register_net_sales || [], + purchaseExpenses: selectedShift?.purchase_expenses || [], + lotteryRegisterReports: selectedShift?.lottery_register_reports || [], + houseCharges: selectedShift?.house_charges || [] + })); + } catch (error) { + console.error('Error fetching initial data:', error); + } + }; + + fetchInitialData(); + }, [fullShiftData.selectedDate]); + const handleShiftChange = (e) => { + const selectedTitle = e.target.value; + const selectedShiftDetails = fullShiftData.shifts.find(shift => shift.shift.title === selectedTitle); + + if (selectedShiftDetails) { + const gasTypeReportsMap = {}; + selectedShiftDetails.gas_type_reports?.forEach(report => { + gasTypeReportsMap[report.gas_type] = report; + }); + + setFullShiftData(prevState => ({ + ...prevState, + selectedShift: selectedTitle, + shiftDetails: selectedShiftDetails || {}, + gasReportData: selectedShiftDetails?.gas_report || {}, + gasTypeReports: gasTypeReportsMap, + businessReport: selectedShiftDetails?.business_report || {}, + lotteryReport: selectedShiftDetails?.lottery_report || {}, + registerNetSales: selectedShiftDetails?.register_net_sales || [], + purchaseExpenses: selectedShiftDetails?.purchase_expenses || [], + lotteryRegisterReports: selectedShiftDetails?.lottery_register_reports || [], + houseCharges: selectedShiftDetails?.house_charges || [] + })); + } + }; + const handleDateChange = (e) => { + const newDate = e.target.value; + setFullShiftData(prevState => ({ + ...prevState, + selectedDate: newDate + })); + }; + + const handleSpecialFieldChange = (field, value) => { + setFullShiftData(prevState => ({ + ...prevState, + gasReportData: { + ...prevState.gasReportData, + [field]: value // Directly update the special field in `gasReportData` + } + })); + }; + + const handleGasTypeFieldChange = (gasTypeTitle, field, value) => { + setFullShiftData(prevState => ({ + ...prevState, + gasTypeReports: { + ...prevState.gasTypeReports, + [gasTypeTitle]: { + ...prevState.gasTypeReports[gasTypeTitle], + [field]: value // Update specific field inside a specific gas type's report + } + } + })); + }; + + + + const handleGasReportBlur = async (field) => { + // Check for gas report ID + if (!fullShiftData.gasReportData.id) { + console.error('No gas report ID available'); + // Optional: Show a user-friendly error message + // toast.error('Unable to update: No gas report found'); + return; + } + + try { + // Create a more comprehensive payload + const payload = { + gas_report: fullShiftData.gasReportData.id, + shift_id: fullShiftData.shiftDetails.shift.id, // Include shift ID + date: fullShiftData.selectedDate, + [field]: fullShiftData.gasReportData[field] + }; + + // Add more logging for debugging + + const response = await Post("updateGasReport", payload); + + if (response.error) { + // Handle potential error in response + console.error(`Error updating gas report ${field}:`, response.error); + // Optional: Show user-friendly error + // toast.error('Failed to update gas report'); + return; + } + + + // Refetch shift data to ensure UI is in sync with backend + await refetchShiftData(); + } catch (error) { + console.error(`Network Error updating gas report ${field}:`, error); + // Optional: Show user-friendly network error + // toast.error('Network error: Unable to update gas report'); + } + }; + + const parseToFloat = (value) => { + const parsedValue = parseFloat(value); + return isNaN(parsedValue) ? 0 : parsedValue; + }; + + const handleBlur = async (gasType) => { + const data = fullShiftData.gasTypeReports[gasType]; + + const gallonsVolume = data.gallons_volume ? parseToFloat(data.gallons_volume) : 0; + const revenueTotal = data.revenue_total ? parseToFloat(data.revenue_total) : 0; + const tankReading = data.tank_reading ? parseToFloat(data.tank_reading) : 0; + const price = data.price ? parseToFloat(data.price) : 0; + + try { + const response = await Post("updateGasReport", { + gas_report: fullShiftData.gasReportData.id, + gas_type: gasType, + gallons_volume: gallonsVolume, + revenue_total: revenueTotal, + tank_reading: tankReading, + price: price, + }); + + + // Refetch shift data after updating gas report + refetchShiftData(); + } catch (error) { + console.error('Error updating gas report:', error); + } + }; + + const refetchShiftData = async () => { + try { + const shiftsResponse = await Post("getShiftDataWithRole", { date: fullShiftData.selectedDate }); + const shiftData = Array.isArray(shiftsResponse?.data?.shift_data) ? shiftsResponse.data.shift_data : []; + const sortedShifts = shiftData.sort((a, b) => new Date(a.shift.start_time) - new Date(b.shift.start_time)); + + // Find the currently selected shift in the new data + const currentlySelectedShiftDetails = sortedShifts.find( + shift => shift.shift.title === fullShiftData.selectedShift + ); + + const gasTypeReportsMap = {}; + currentlySelectedShiftDetails?.gas_type_reports?.forEach(report => { + gasTypeReportsMap[report.gas_type] = report; + }); + + setFullShiftData(prevState => ({ + ...prevState, + shifts: sortedShifts, + selectedShift: currentlySelectedShiftDetails?.shift?.title || prevState.selectedShift, + shiftDetails: currentlySelectedShiftDetails || prevState.shiftDetails, + gasReportData: currentlySelectedShiftDetails?.gas_report || prevState.gasReportData, + gasTypeReports: gasTypeReportsMap, + businessReport: currentlySelectedShiftDetails?.business_report || prevState.businessReport, + lotteryReport: currentlySelectedShiftDetails?.lottery_report || prevState.lotteryReport, + registerNetSales: currentlySelectedShiftDetails?.register_net_sales || prevState.registerNetSales, + purchaseExpenses: currentlySelectedShiftDetails?.purchase_expenses || prevState.purchaseExpenses, + lotteryRegisterReports: currentlySelectedShiftDetails?.lottery_register_reports || prevState.lotteryRegisterReports, + houseCharges: currentlySelectedShiftDetails?.house_charges || prevState.houseCharges + })); + } catch (error) { + console.error('Error refetching shift data:', error); + } + }; + const totalGallons = Object.values(fullShiftData.gasTypeReports).reduce((sum, report) => + sum + parseToFloat(report.gallons_volume), 0); + + const totalRevenue = Object.values(fullShiftData.gasTypeReports).reduce((sum, report) => + sum + parseToFloat(report.revenue_total), 0); + + const totalHouseCharges = fullShiftData.houseCharges.reduce((sum, charge) => + sum + parseToFloat(charge.amount), 0); + + + const grandTotal = parseFloat(fullShiftData.gasReportData.grand_total || 0); + + return ( +
    +
    +
    +
    + +
    + +
    +
    + + {/* Gas Type Fields */} +
    +
    +

    Gas Type

    +
    +
    +

    Gallons/Volume

    +
    +
    +

    Revenue/Total

    +
    +
    +

    Price

    +
    +
    +

    Tank Readings (in Liters)

    +
    +
    + {fullShiftData.gasTypes.length > 0 ? ( + fullShiftData.gasTypes.map((gasType) => { + const typeReport = fullShiftData.gasTypeReports[gasType.gas_type_title] || {}; + return ( +
    +
    +
    +

    {gasType.gas_type_title}

    +
    +
    +
    +
    + handleGasTypeFieldChange(gasType.gas_type_title, 'gallons_volume', e.target.value)} // Use gas type handler + onBlur={() => handleBlur(gasType.gas_type_title)} + /> +
    +
    +
    +
    + handleGasTypeFieldChange(gasType.gas_type_title, 'revenue_total', e.target.value)} // Use gas type handler + onBlur={() => handleBlur(gasType.gas_type_title)} + /> +
    +
    +
    +
    +

    {typeReport.price || gasType.cost_per_gallon}

    +
    +
    +
    +
    + handleGasTypeFieldChange(gasType.gas_type_title, 'tank_reading', e.target.value)} // Use gas type handler + onBlur={() => handleBlur(gasType.gas_type_title)} + /> +
    +
    +
    + ); + }) + ) : ( +

    No gas types found.

    + )} + + + {/* Business Report Totals */} +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + handleSpecialFieldChange('cash', e.target.value)} + onBlur={() => handleGasReportBlur('cash')} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + /> +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + handleSpecialFieldChange('dcr_payments', e.target.value)} + onBlur={() => handleGasReportBlur('dcr_payments')} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + /> +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + handleSpecialFieldChange('credit_cards', e.target.value)} + onBlur={() => handleGasReportBlur('credit_cards')} + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + /> +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +

    House Charges

    +
    +
    +
    +
    +
    + +
    +
    + + + +
    +
    + + {isEditing && ( +
    + +
    + )} + +
    +
    +
    + + sum + parseFloat(charge.amount || 0), 0) + .toFixed(2)} + readOnly + onInput={(e) => { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + /> +
    +
    +
    +
    {/* Added padding around the table */} + + + + + + + + + + + {fullShiftData.houseCharges.length === 0 ? ( + + + + ) : ( + fullShiftData.houseCharges.map((charge) => ( + + + + + + )) + )} + +
    + Company Title + + Amount + + Action +
    + No data available +
    + + {charge.company_title} + + + + ${parseFloat(charge.amount).toFixed(2)} + + +
    + +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    + +
    +
    +
    + + +
    + ); +} + +export default GasReport; diff --git a/src/components/Pages/AppPAges/Reports/IconsSvg.js b/src/components/Pages/AppPAges/Reports/IconsSvg.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Pages/AppPAges/Reports/LotteryHistoryModal.css b/src/components/Pages/AppPAges/Reports/LotteryHistoryModal.css new file mode 100644 index 0000000..71babb3 --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/LotteryHistoryModal.css @@ -0,0 +1,83 @@ +.modal { + position: fixed; /* Fix modal in viewport */ + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(0, 0, 0, 0.5); /* Optional background overlay */ +} + +.modal-data { + position: relative; + background-color: white; + border-radius: 8px; + padding: 20px; + width: 80%; + max-height: 90%; + overflow-y: auto; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); +} + +.modal-header { + text-align: center; /* Center title */ + margin-bottom: 20px; /* Space below title */ +} + +.close-button { + background-color: #4545db; + color: white; + border: none; + padding: 10px 45px; + border-radius: 5px; + cursor: pointer; + position: absolute; + top: 24px; + right: 20px; +} + + + +.reports-table-title { + font-size: 22px; + color: #002300; +} + +.lotterys-title-header { + background-color: #f4f4f4; + height: 55px; + border-radius: 25px 25px 0 0; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 20px; +} + +.lotterys-report-title { + font-size: 18px; + font-weight: 700; + margin: 0; +} + +.lotterys-report { + margin-top: 0px; + border: 1px solid #f6f6f6; +} + +.data-reports { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + border-radius: 5px; + background-color: #f9f9f9; + margin-top: 10px; + border: 1px solid #e6e6e6; +} + +.report-table-title { + font-size: 22px; + color: #002300; +} diff --git a/src/components/Pages/AppPAges/Reports/LotteryHistoryModal.js b/src/components/Pages/AppPAges/Reports/LotteryHistoryModal.js new file mode 100644 index 0000000..8cfa764 --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/LotteryHistoryModal.js @@ -0,0 +1,553 @@ +import React, { useState, useEffect } from "react"; +import "./LotteryHistoryModal.css"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import loader from '../../../../assets/img/loader.gif'; + +const LotteryHistoryModal = ({ open, onClose, data }) => { + const today = new Date().toISOString().split("T")[0]; + const [shiftDetails, setShiftDetails] = useState({}); + const [shifts, setShifts] = useState([]); + const [selectedShift, setSelectedShift] = useState(""); + const [selectedDate, setSelectedDate] = useState(today); + const { Get, Post } = useApi(); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + if (open) { + refetchShiftData(); + } + }, [open]); + + const handleFieldChange = ( + registerNo, + field, + value, + isRegisterField = true + ) => { + if (isRegisterField) { + handleLotteryRegisterField(registerNo, field, value); + } else { + // handleGlobalField(field, value); + } + }; + + const handleLotteryRegisterField = async (registerNo, field, value) => { + const payload = { + lottery_report: shiftDetails.lottery_report?.id, + register_no: registerNo, + [field]: value, + }; + + setLoading(true); + setError(null); // Clear previous errors + await Post("updateLotteryReport", payload) + .then((response) => { + setShiftDetails((prevDetails) => ({ + ...prevDetails, + lottery_register_reports: prevDetails.lottery_register_reports.map( + (register) => { + if (register.register_no === registerNo) { + return { ...register, [field]: value }; + } + return register; + } + ), + })); + refetchShiftData(); + }) + .catch((error) => { + console.error( + `Error updating ${field} for register ${registerNo}:`, + error + ); + setError(`Error updating ${field}: ${error.message}`); + }) + .finally(() => setLoading(false)); + }; + + const refetchShiftData = async () => { + setLoading(true); // Indicate loading state + setError(null); // Reset any previous errors + + try { + // Step 1: Fetch the shift ID dynamically using GET method + const shiftIdResponse = await Get("getShiftForHistoricalReport"); // Change Post to Get + const shiftId = shiftIdResponse?.shift_id; + + if (!shiftId) { + console.error( + "Shift ID is missing from getShiftForHistoricalReport response." + ); + setError("Failed to retrieve shift ID."); + setLoading(false); // Reset loading state + return; + } + + console.log("Fetched Shift ID:", shiftId); + + // Step 2: Fetch historical report data using the shift ID + const response = await Post("getHistoricalReport", { shift_id: shiftId }); + console.log("Historical Report Response:", response); + + // Step 3: Check if shift_data exists and is an array + const shiftData = Array.isArray(response?.data?.shift_data) + ? response.data.shift_data + : []; + console.log("Raw Shift Data:", shiftData); + setShifts(shiftData); // Update state with raw shift data + + // Step 4: Select the latest shift if available + if (shiftData.length > 0) { + const latestShift = shiftData[shiftData.length - 1]; // Assuming the last one is the latest + setSelectedShift(latestShift.shift.title); // Ensure 'title' exists in your data structure + setShiftDetails(latestShift); + } + } catch (error) { + console.error("Error in refetchShiftData:", error); + setError(`Error fetching shift data: ${error.message}`); // Update state with error message + } finally { + setLoading(false); // Reset loading state + } + }; + + const renderLotteryRegisterInputs = (registers, fieldName, labelPrefix) => { + return <> + + { + registers + .sort((a, b) => a.register_no - b.register_no) + .map((register, index) => ( +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + onBlur={(e) => + handleFieldChange( + register.register_no, + fieldName, + e.target.value, + true + ) + } + /> +
    + )) + } +
    + + }; + + + + const handleLotteryGlobalField = async (field, value) => { + const payload = { + lottery_report: shiftDetails.lottery_report?.id, + [field]: value, + }; + + const response = await Post("updateLotteryReport", payload) + .then((response) => { + // Update local state for the global field + setShiftDetails((prevDetails) => ({ + ...prevDetails, + lottery_report: { + ...prevDetails.lottery_report, + [field]: value, + }, + })); + refetchShiftData(); + }) + .catch((error) => { + console.error(`Error updating ${field}:`, error); + }); + }; + + const handleLotteryFieldChange = ( + registerNo, + field, + value, + isRegisterField = true + ) => { + if (isRegisterField) { + handleLotteryRegisterField(registerNo, field, value); + } else { + handleLotteryGlobalField(field, value); + } + }; + + const { lottery_report = {} } = shiftDetails; + + if (!open) return null; + return ( +
    +
    +
    +

    Daily Lottery Report

    + + {/* */} +
    +
    +
    +
    + Note: Before starting, make sure to add the number of registers in the manage settings if you have more than one. +
    + +
    + +
    +
    +
    +

    Last Invoice

    +
    +
    +

    Last Cash

    +
    +
    + +
    +
    + + {shiftDetails.lottery_register_reports?.length > 0 ? ( + <> + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "net_sales_sr50", + "Online Net Sales" + )} + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "online_cashing_sr50", + "Online Cashing" + )} + {renderLotteryRegisterInputs( + shiftDetails.lottery_register_reports, + "instant_cashing_sr34", + "Instant Cashing" + )} + + ) : ( +
    + Loading Registers. +
    + )} + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={shiftDetails.lottery_report?.total_net_sales_sr50 || ""} + readOnly + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.total_online_cashing_sr50 || ""} + onChange={(e) => + handleLotteryFieldChange( + null, + "total_online_cashing_sr50", + e.target.value, + false + ) + } + readOnly + /> +
    + +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.total_instant_cashing_today || ""} + onChange={(e) => + handleLotteryFieldChange( + null, + "total_instant_cashing_today", + e.target.value, + false + ) + } + readOnly + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.instant_sale_sr34 || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "instant_sale_sr34", + e.target.value, + false + ) + } + /> +
    +
    + + + +
    + {" "} + {/* Today Cash Section */} +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.total_online_balance || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "total_online_balance", + e.target.value, + false + ) + } + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.credit_sales || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "credit_sales", + e.target.value, + false + ) + } // onBlur to update value + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.debit_sales || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "debit_sales", + e.target.value, + false + ) + } // onBlur to update value + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + defaultValue={lottery_report?.register_cash || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "register_cash", + e.target.value, + false + ) + } // onBlur to update value + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.over_short || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "over_short", + e.target.value, + false + ) + } // onBlur to update value + /> +
    +
    + + { + // Allow only numbers and a decimal point with two digits after it + e.target.value = e.target.value + .replace(/[^0-9.]/g, '') // Remove non-numeric characters except the decimal point + .replace(/^(\d*\.?\d{0,2}).*/g, '$1') // Allow only two decimal places + .slice(0, 12); + }} + value={lottery_report?.total_balance || ""} + onBlur={(e) => + handleLotteryFieldChange( + null, + "total_balance", + e.target.value, + false + ) + } // onBlur to update value + + /> + {error &&

    {error}

    } + +
    + +
    +
    +
    +
    + ); +}; + +export default LotteryHistoryModal; diff --git a/src/components/Pages/AppPAges/Reports/LottoVending.js b/src/components/Pages/AppPAges/Reports/LottoVending.js new file mode 100644 index 0000000..0364462 --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/LottoVending.js @@ -0,0 +1,141 @@ +import React from 'react' +import './Report.css' + +function LottoVending() { + return ( + <> +
    + +
    +

    Lottery Activated Books

    +
    +
    +
    +

    Scan Code and Activate

    +
    +
    +

    Activate Manually

    +
    +
    +

    Return Book

    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + ) +} + +export default LottoVending \ No newline at end of file diff --git a/src/components/Pages/AppPAges/Reports/PrintReport.css b/src/components/Pages/AppPAges/Reports/PrintReport.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Pages/AppPAges/Reports/PrintReport.js b/src/components/Pages/AppPAges/Reports/PrintReport.js new file mode 100644 index 0000000..a432012 --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/PrintReport.js @@ -0,0 +1,157 @@ +import React from "react"; +import { ReportIcon } from "../../../../utils/api-manager/Forms/SvgIcons"; + +const PrintReport = ({ reportData, selectedShift, today }) => { + const printReport = () => { + window.open('/report-preview', '_blank', 'noopener,noreferrer'); +// const printWindow = window.open("", "_blank"); +// printWindow.document.write(` +// +// +// +// +// +// Report Page +// +// +// +//
    +//
    Humbingo Store
    +//

    Shift: 1

    +//

    Report Date: 25/11/2024

    +//
    + +//
    +// +//
    +//

    💵 DAILY REGISTER CASH OUT

    +// +// +// +// +// +// +// +// +// +// +// +// +// +//
    NameAmount
    Business on report$0.00
    Tax on Report$0.00
    Taxable Sales$0.00
    Non-Taxable Sales$0.00
    +//
    + +// +//
    +//

    🎰 DAILY LOTTERY REPORT

    +// +// +// +// +// +// +// +// +// +// +// +// +// +//
    Today InvoiceYesterday InvoiceDebit/Credit Card
    Online Net Sale: $0.00$0.00Debit/Credit Card: $0.00
    Online Cashing: $0.00$0.00Credits Sale: $0.00
    Instant Cashing: $0.00$0.00Debits Sale: $0.00
    +//
    + +// +//
    +//

    ⛽ GAS DAILY REPORT

    +// +// +// +// +// +// +// +// +// +// +// +// +// +// +//
    GasGallonPriceRevenue
    Premium0$0.00$0.00
    Regular0$0.00$0.00
    Diesel0$0.00$0.00
    +//
    +//
    +// +// + +// `); +// printWindow.document.close(); + }; + + return ( + + ); +}; + +export default PrintReport; diff --git a/src/components/Pages/AppPAges/Reports/Report.css b/src/components/Pages/AppPAges/Reports/Report.css new file mode 100644 index 0000000..93af803 --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/Report.css @@ -0,0 +1,308 @@ +.report-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + border-radius: 10px; + padding: 20px; + margin: 30px auto; + background-color: #ffffff; + width: 1600px; +} +.tab-view { + align-self: flex-start; +} +.nav-tabs { + margin-bottom: 20px; +} +.nav-item { + margin-right: 10px; +} +.nav-link { + padding: 10px 15px; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; + text-decoration: none; + color: #002300; + font-size: 22px; +} +.nav-link.active { + color: #002300; + font-weight: 600; /* Change to semibold */ + font-size: 22px; + border-bottom: 3px solid #4545db; /* Add border at the bottom */ +} +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + background-color: #f8f9fa; + border-color: #ddd; +} +.tab-content { + margin-left: 10px; +} +/* .business-report-title { + cursor: pointer; + transition: color 0.3s ease; +} */ + +.active-tab { + font-weight: bold; + color: black; /* or any primary color you like */ +} + +.disabled-tab { + color: gray; + cursor: default; +} + + + +/*===================================================================Business Report============================================================*/ +.business-header { + background-color: #ffffff; + border-radius: 10px; + width: 1540px; + +} +.business-title { + display: flex; + font-weight: bold; + font-size: 22px; + color: #002300; + align-self: flex-start; +} +.btn-position { + display: flex; + justify-content: flex-end; +} +.business-button { + padding: 8px 26px; + background-color: #f4f4f4; /* Bootstrap primary color */ + color: #002300; + border: none; + border-radius: 40px; + cursor: pointer; + height: 44px; + font-size: 18px; + margin-left: 10px; +} +.business-button.del { + color: #f4f4f4; + background-color: #b71d35; +} +.dropdown { + position: relative; +} +.dropdown-toggle.shift { + align-items: center; + width: 142px; + height: 44px; + border-radius: 6px; + background-color: #f4f4f4; + +} +.dropdown-menu.shift { + align-items: center; + padding: 10px; + justify-content: center; + position: absolute; + border-radius: 10px; + border: 1px solid #f4f4f4; + margin-top: 5px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.dropdown-item.shift { + padding: 5px; + font-size: 15.84; + font-weight: 500; +} +.shift-text { + font-size: 15.84px; + font-weight: 500; +} +.business-title-header { + background-color: #f4f4f4; + height: 55px; + border-radius: 25px 35px 0px 0px; +} +.business-report-title { + font-size: 18px; + font-weight: 700; + align-items: center; + margin-top: 10px; + margin-left: 10px; +} +.business-report { + margin-top: 0px; + border: 1px solid #f6f6f6; +} +.data-report { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + border-radius: 5px; +} +.label { + font-size: 18px; + color: #002300; +} +.input { + background-color: #F6F6F6; + padding: 5px; + border: 1px solid rgba(0, 35, 0, 0.1); + border-radius: 4px; + margin-left: 0px; + width: 157px; + outline-style: none; +} +.input-readonly { + background-color: #F4F4F470; + padding: 5px; + border: none; + border-radius: 4px; + margin-left: 0px; + width: 157px; + outline-style: none; +} +.data-select { + padding: 5px; + width: 289px; + height: 40px; + border: none; + border-radius: 4px; + background-color: #f6f6f6; + outline-style: none; +} +.notes-area { + width: 437px; + height: 228px; +} +.report-table-title { + font-size: 22px; + color: #002300; +} +.input-lottery-container { + position: relative; + width: 100%; /* Adjust as needed */ +} +.input-lottery { + width: 282px; + background-color: #f6f6f6; + padding: 10px 30px 10px 40px; + border: 1px solid #f6f6f6; + border-radius: 5px; +} +.icon-btn-report { + margin-right: 8px; +} +.svg-icon { + position: absolute; + left: 10px; + top: 50%; + transform: translateY(-50%); + pointer-events: none; +} +.input-game.field { + width: 270px; + padding: 10px 10px 10px 10px; + background-color: #f6f6f6; + border: 1px solid #f6f6f6; + border-radius: 5px; +} +.btn-activate { + border: none; + border-radius: 40px; + width: 120px; + height: 44px; + color: #ffffff; + margin-right: 70px; + background-color: #6cbe1c; +} +.activate-book, +.return-book { + display: flex; + justify-content: center; +} +.book-table { + border: 1px solid black; +} +.input-game::placeholder { + color: #002300; + opacity: 1; /* You can adjust the opacity */ +} +.btn-scanning { + border: none; + border-radius: 40px; + width: 182px; + height: 44px; + color: #ffffff; + margin-right: 10px; + background-color: #4545db; +} +.count-ticket { + align-items: center; + margin-top: 100px; + font-size: 18px; + color: #002300; + font-weight: 600; +} +.house-charge-container { + width: 755px; + height: 315px; + margin: 0 auto; + display: flex; + justify-content: center; /* Center content horizontally */ + position: relative; /* Set positioning context for absolute positioning */ +} +.house-charge-title { + position: absolute; /* Position it relative to the container */ + top: 0; /* Align to the top */ + left: 0; /* Align to the left */ + font-size: 22px; /* Set font size */ + font-weight: 600; /* Semi-bold */ + margin: 0; /* Remove default margin */ +} +.house-charge-header { + background-color: #f4f4f4; + height: 55px; + width: 100%; /* Make it full width of the container */ + border-top-left-radius: 30px; /* Adjust to match your requirement */ + border-top-right-radius: 30px; /* Adjust to match your requirement */ + position: absolute; /* Position it at the top */ + top: 50px; /* Adjust to position it below the title */ + left: 0; /* Align to the left */ +} +/*=====================================================================Cash Drop===================================================================*/ +.cash-drop-container { + border-radius: 30px; + padding: 20px; + width: 891px; +} +.cash-drop { + background-color: #f4f4f4; + height: 55px; + width: 891px; +} + + + + + + +.loader { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 1000; /* Make sure it's above other content */ +} + +.loader img { + width: 50px; /* Adjust size as needed */ + height: 50px; +} +.no-underline { + text-decoration: none !important; +} diff --git a/src/components/Pages/AppPAges/Reports/ReportDateSelection.js b/src/components/Pages/AppPAges/Reports/ReportDateSelection.js new file mode 100644 index 0000000..9f0797b --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/ReportDateSelection.js @@ -0,0 +1,285 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useRef, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import useApi from '../../../../utils/api-manager/Helper/useApi'; +import loaderGif from '../../../../assets/img/loader.gif'; +import { toast } from 'react-toastify'; +import LotteryHistoryModal from './LotteryHistoryModal'; +import ConfirmationModal from './ConfirmationModal'; + + +export default function ReportDateSelection() { + const [selectedDate, setSelectedDate] = useState(); // Today's date in YYYY-MM-DD format + const [selectedTime, setSelectedTime] = useState(new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })); // Current time + const [showModal, setShowModal] = useState(false); + const [shift, setShift] = useState(''); // Will set to the most recent shift + const [errorMessage, setErrorMessage] = useState(''); + const [loading, setLoading] = useState(true); + const navigate = useNavigate(); + + const [buttonDisabled, setButtonDisabled] = useState(false); + const [historyReport, setHistoryReport] = useState(false); + const { Post, Get } = useApi(); + const dateInputRef = useRef(null); + const [activeShift, setActiveShift] = useState(false); + + const [open, setOpen] = useState(false); + const [data, setData] = useState({}); + const [reportHistory, setReportHistory] = useState(false); // Track report_history status + + const [confirmDialogOpen, setConfirmDialogOpen] = useState(false); + + + useEffect(() => { + checkActiveShift(); + + if (dateInputRef.current) { + dateInputRef.current.focus() + } + }, [navigate]); + + + const checkActiveShift = async () => { + try { + const response = await Get('isShiftActive'); + if (response.message === "You already have an active shift") { + setActiveShift(response.data); + setShift(response.new_shift_title); + navigate('/reports'); + } else { + setActiveShift(response.data); + setShift(response.new_shift_title); + setLoading(false); + } + + + const historyReport = response.history_report; + if (historyReport === "true") { + setButtonDisabled(true); + } else { + setButtonDisabled(false); // Enable button if no history report exists + } + + } catch (error) { + console.error('Error checking active shift:', error); + setLoading(false); + } + }; + + + useEffect(() => { + const intervalId = setInterval(() => { + setSelectedTime(new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })); + }, 1000); + + return () => clearInterval(intervalId); + }, []); + + const handleDateChange = (event) => { + const date = event.target.value; + setSelectedDate(date); + setShowModal(true); + setErrorMessage(''); + }; + + const handleShiftChange = (event) => { + const selectedShift = event.target.value; + setShift(selectedShift); + // Set current date and time when a shift is selected + setSelectedDate(new Date().toISOString().split('T')[0]); // Today's date + setShowModal(true); // Show modal + }; + + const handleCloseModal = () => { + setShowModal(false); + setErrorMessage(''); + }; + + const handleSubmit = async () => { + try { + const response = await Post('createShiftBusinessReportAndRegisters'); + if (response.status === 200) { + toast.success('Shift report created successfully!'); + } else { + setErrorMessage('Failed to create shift report. Please try again.'); + } + } catch (error) { + console.error('Error creating shift report:', error); + setErrorMessage('Error occurred while creating the report. Please try again.'); + } + }; + + const handleConfirm = async () => { + if (!activeShift) { + await handleSubmit(); + } + navigate('/reports'); + }; + + if (loading) { + return ( +
    + Loading... +
    + ); + } + + /// lottery report // + + const createHistoricalReport = async () => { + try { + const response = await Post('createHistoricalReport'); + setData(response); + setOpen(true); + resetData(); + setButtonDisabled(true); + setReportHistory(true); + + toast.success('Historical report created successfully!'); + } catch (error) { + console.error('Error calling API:', error); + toast.error('Error occurred while creating the report. Please try again.'); + } + }; + + const handleButtonClick = () => { + if (reportHistory) { + toast.error('A shift for history lottery report already exists'); + } else { + createHistoricalReport(); + } + }; + + const handleCloseModals = () => { + setConfirmDialogOpen(true); + }; + + const handleConfirmClose = async () => { + setConfirmDialogOpen(false); + setOpen(false); + resetData(); + + }; + + const handleCancelClose = () => { + setConfirmDialogOpen(false); + }; + + const resetData = () => { + setData({}); + }; + + return ( +
    +
    + + {!(buttonDisabled || historyReport === "true") && ( + + )} + + + + + +
    +
    +
    + + +
    + +
    +
    + + setSelectedTime(e.target.value)} + style={{ width: 'auto', flex: '1' }} + /> +
    + +
    + + +
    +
    + + {showModal &&
    } +
    +
    +
    +
    +
    Confirm Shift
    +
    +
    + {errorMessage &&
    {errorMessage}
    } + Do you want to start{' '} + +  {shift}  + +   on {selectedDate ? new Date(selectedDate).toLocaleDateString() : ''} at {selectedTime}? +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + ); +} diff --git a/src/components/Pages/AppPAges/Reports/Reports.js b/src/components/Pages/AppPAges/Reports/Reports.js new file mode 100644 index 0000000..202a24f --- /dev/null +++ b/src/components/Pages/AppPAges/Reports/Reports.js @@ -0,0 +1,80 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useState, useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import "./Report.css"; +import BusinessReport from "./BusinessReport"; +import GasReport from "./GasReport"; +import CashDrop from "./CashDrop"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; + +export default function Reports() { + const [activeTab, setActiveTab] = useState('business report'); + const [isShiftActiveData, setIsShiftActiveData] = useState(null); // New state to hold the API response + const { Get } = useApi(); + const navigate = useNavigate(); // Initialize useNavigate + + useEffect(() => { + fetchIsActive(); + }, []); + + const tabs = [ + { name: 'Business Report', content: }, + { name: 'Gas Report', content: }, + { name: 'Cash Drop', content: }, + // { name: 'Lotto Vending', content: }, + ]; + + const handleTabClick = (tab) => { + if (!tab.disabled) { + setActiveTab(tab.name.toLowerCase()); + } + }; + + const fetchIsActive = async () => { + try { + const response = await Get('isShiftActive'); + if (response.status === 200) { + if (response.data.message === "You already have an active shift" && response.data.shift === "1_shift") { + // Navigate to report date selection if shift is active + navigate('/reportDateSelection'); + } + setIsShiftActiveData(response.data); // Store the response data in state + } + } catch (error) { + console.error("Error fetching shift status:", error); + // Optionally handle errors (e.g., show a notification) + } + }; + + return ( +
    + +
    + +
    + {tabs.map((tab) => + activeTab === tab.name.toLowerCase() && !tab.disabled ? ( +
    + {tab.content} +
    + ) : null + )} +
    +
    +
    + ); +} diff --git a/src/components/Pages/AppPAges/Reports/VendorReport.js b/src/components/Pages/AppPAges/Reports/VendorReport.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Pages/AppPAges/ReusableForm/AddDepartmentModal.js b/src/components/Pages/AppPAges/ReusableForm/AddDepartmentModal.js new file mode 100644 index 0000000..1767fe9 --- /dev/null +++ b/src/components/Pages/AppPAges/ReusableForm/AddDepartmentModal.js @@ -0,0 +1,75 @@ +import React, { useState, useContext } from "react"; +import ReusableModal from "../ManageSettings/ReusableModal"; // Adjust path as needed +import { toast } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; + +const AddDepartmentModal = ({ show, handleClose, onDepartmentAdded }) => { + const [departmentName, setDepartmentName] = useState(""); + const { user } = useContext(AuthContext); + const storeId = user.store; + const { Post } = useApi(); + + const handleSave = async (e) => { + e.preventDefault(); + if (!departmentName) { + toast.warn("Department name is required"); + return; + } + + try { + const response = await Post("vendorDepartmentServiceData", { + store: storeId, + type: "department", + title: departmentName, + }); + if (response.status === 201) { + toast.success("Department added successfully!"); + const newDepartment = response.data; // Assuming the API returns the newly created department + onDepartmentAdded(newDepartment); // Update the parent component state + setDepartmentName(""); // Reset the input field + handleClose(); // Close the modal + } + } catch (error) { + console.error("Error saving department:", error); + toast.error("Error saving department!"); + } + }; + + return ( + +
    +
    + setDepartmentName(e.target.value)} + style={{ width: "483px", marginRight: "10px" }} + required + /> + +
    +
    +
    + ); +}; + +export default AddDepartmentModal; diff --git a/src/components/Pages/AppPAges/ReusableForm/AddExpenseDataModal.js b/src/components/Pages/AppPAges/ReusableForm/AddExpenseDataModal.js new file mode 100644 index 0000000..50d7533 --- /dev/null +++ b/src/components/Pages/AppPAges/ReusableForm/AddExpenseDataModal.js @@ -0,0 +1,505 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import React, { useState, useContext, useEffect } from "react"; +import { toast } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; +import AddVendorModal from "./AddVendorModal"; + +const AddExpenseDataModal = ({ show, handleClose , onInvoiceCreated}) => { + const { user } = useContext(AuthContext); + const storeId = user.store; + const { Post, Get } = useApi(); + const today = new Date().toISOString().split("T")[0]; + + const [showPaymentOptions, setShowPaymentOptions] = useState(false); + const [showCheckFields, setShowCheckFields] = useState(false); + const [showBankFields, setShowBankFields] = useState(false); + const [vendors, setVendors] = useState([]); + const [serviceData, setServiceData] = useState([]); + const [dueDays, setDueDays] = useState([]); + const [bank, setBank] = useState([]); + + const initialFormState = { + type: "expense", + invoice_no: "", + date: today, + status: "unpaid", + pay_method_status: "", + pay_method: "cash", + amount: "", + pay_amount: null, + discount: null, + remaining_amount: null, + after_discount: null, + prepaid_tax: false, + vendor_department: "", + vendor_department_name: "", + cheque_no: "", + note: "", + due_date: "", + bank: "", + expense_type: "" + }; + + const [formData, setFormData] = useState(initialFormState); + const [showModalVendor, setShowModalVendor] = useState(false); + + const fetchData = async () => { + try { + const [vendorsResponse, serviceResponse, dueDaysResponse, bankResponse] = await Promise.all([ + Get("vendorDepartmentData"), + Get("vendorDepartmentServiceData"), + Get("dueDaysData"), + Get("bank"), + ]); + setVendors(vendorsResponse); + setServiceData(serviceResponse); + setDueDays(dueDaysResponse); + setBank(bankResponse); + } catch (error) { + console.error("Error fetching data:", error); + toast.error("Error fetching data!"); + } + }; + + useEffect(() => { + fetchData(); + }, []); + + const handlePaymentMethodChange = (e) => { + const value = e.target.value; + setFormData(prevData => ({ ...prevData, pay_method_status: value })); + setShowPaymentOptions(value === "pay_now"); + setShowCheckFields(false); + setShowBankFields(false); + }; + + const handleSpecificPaymentMethodChange = (e) => { + const value = e.target.value; + setShowCheckFields(value === "check"); + setShowBankFields(value === "bankCard"); + }; + const handleVendorAdded = (newVendor) => { + setVendors((prevVendors) => [...prevVendors, newVendor]); // Add new vendor to the list + setFormData({ ...formData, vendor_department: newVendor.id }); // Set the newly added vendor as the selected one + }; + const handleShowVendor = () => setShowModalVendor(true); + const handleCloseVendor = () => { + setShowModalVendor(false); + }; + const handleChange = (e) => { + const { name, value, type, checked } = e.target; + const updatedValue = type === "checkbox" ? checked : value; + + setFormData(prevData => ({ + ...prevData, + [name]: updatedValue, + ...(name === "vendor_department" && { + vendor_department_name: vendors.find(v => v.id === value)?.name || "" + }) + })); + + if (name === "due_date" && value) { + const selectedDays = parseInt(value, 10); + if (!isNaN(selectedDays)) { + const dueDate = new Date(); + dueDate.setDate(dueDate.getDate() + selectedDays); + setFormData(prevData => ({ + ...prevData, + due_date: dueDate.toISOString().split("T")[0] + })); + } + } + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + + const payload = { + ...formData, + store: storeId + }; + + try { + const response = await Post("invoiceData", payload); + if (response.status === 201) { + toast.success("Invoice submitted successfully!"); + + // Create new invoice object with all necessary data + const newInvoice = { + vendorName: formData.vendor_department_name, + amount: formData.amount, + id: response.data.id, + date: formData.date, + status: formData.status, + invoiceNumber: formData.invoice_no, + timestamp: new Date().getTime() // Add timestamp for unique identification + }; + + // Pass the new invoice data back to parent component + onInvoiceCreated(newInvoice); + + // Reset form to initial state + setFormData(initialFormState); + setShowPaymentOptions(false); + setShowCheckFields(false); + setShowBankFields(false); + + handleClose(); + } + } catch (error) { + console.error("Error submitting invoice:", error); + toast.error("Error submitting invoice: " + (error.response?.data || error.message)); + } + }; + return show && ( +
    +
    e.stopPropagation()} style={{ width: "700px" }}> +
    +
    Add Expense
    + +
    + +
    +
    + {/* Date Input */} +
    + +
    + + {/* Vendor and Invoice Number */} +
    +
    + +
    +
    + +
    +
    + + {/* Expense Type */} +
    +
    + +
    +
    + + {/* Payment Method Radio Buttons */} +
    +

    Payment Method :

    + + + +
    + + {/* Payment Options */} + {showPaymentOptions && ( +
    + + + +
    + )} + + {/* Due Date and Notes */} + {(formData.pay_method_status === "pay_later" || formData.pay_method_status === "credit_invoice") && ( +
    + + +
    + )} + + {/* Check Fields */} + {showCheckFields && ( +
    +
    + +
    +
    + +
    +
    + +
    +
    + )} + + {/* Bank Fields */} + {showBankFields && ( +
    +
    + +
    +
    + +
    +
    + )} + + {/* Prepaid Tax Checkbox */} +
    + +
    + + {/* Amount Input */} +
    +
    +
    + USD +
    + +
    +
    + + {/* Submit Button */} +
    + +
    +
    +
    +
    + + +
    + ); +}; + +export default AddExpenseDataModal; \ No newline at end of file diff --git a/src/components/Pages/AppPAges/ReusableForm/AddExpenseModal.js b/src/components/Pages/AppPAges/ReusableForm/AddExpenseModal.js new file mode 100644 index 0000000..1fe4b84 --- /dev/null +++ b/src/components/Pages/AppPAges/ReusableForm/AddExpenseModal.js @@ -0,0 +1,75 @@ +import React, { useState, useContext } from "react"; +import ReusableModal from "../ManageSettings/ReusableModal"; // Adjust path as needed +import { toast } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; + +const AddExpenseTypeModal = ({ show, handleClose, onExpenseTypeAdded }) => { + const [expenseType, setExpenseType] = useState(""); + const { user } = useContext(AuthContext); + const storeId = user.store; + const { Post } = useApi(); + + const handleSave = async (e) => { + e.preventDefault(); + if (!expenseType) { + toast.warn("Expense type is required"); + return; + } + + try { + const response = await Post("vendorDepartmentServiceData", { + store: storeId, + type: "expense type", + title: expenseType, + }); + if (response.status === 201) { + toast.success("Expense type added successfully!"); + const newExpenseType = response.data; // Assuming the response returns the new expense type data + onExpenseTypeAdded(newExpenseType); // Update the parent component state + setExpenseType(""); // Reset the input field + handleClose(); // Close the modal + } + } catch (error) { + console.error("Error saving expense type:", error); + toast.error("Error saving expense type!"); + } + }; + + return ( + +
    +
    + setExpenseType(e.target.value)} + style={{ width: "483px", marginRight: "10px" }} + required + /> + +
    +
    +
    + ); +}; + +export default AddExpenseTypeModal; diff --git a/src/components/Pages/AppPAges/ReusableForm/AddVendorModal.js b/src/components/Pages/AppPAges/ReusableForm/AddVendorModal.js new file mode 100644 index 0000000..47aa999 --- /dev/null +++ b/src/components/Pages/AppPAges/ReusableForm/AddVendorModal.js @@ -0,0 +1,191 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +// AddVendorModal.js +import React, { useState ,useContext} from "react"; +import ReusableModal from "../ManageSettings/ReusableModal"; +import { toast } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; + +const AddVendorModal = ({ show, handleClose, reloadData }) => { + const [vendorName, setVendorName] = useState(""); + const [vendorType, setVendorType] = useState(""); + const [vendorDepartments, setVendorDepartments] = useState([]); + const [openingBalance, setOpeningBalance] = useState(""); + const [vendors, setVendors] = useState([]); + const { user } = useContext(AuthContext); + const storeId = user.store; + const { Post, Get } = useApi(); + const [serviceData, setServiceData] = useState([]); + + // Fetch department and expense type options (you can modify this logic as needed) + const fetchServices = async () => { + try { + const serviceResponse = await Get("vendorDepartmentServiceData"); + setServiceData(serviceResponse); + } catch (error) { + console.error("Error fetching services:", error); + toast.error("Error fetching services!"); + } + }; + + // Fetch options on component mount + React.useEffect(() => { + fetchServices(); + }, []); + + const handleDepartmentChange = (event) => { + const value = event.target.value; + if (value && !vendorDepartments.includes(value)) { + setVendorDepartments((prev) => [...prev, value]); + } + }; + + const handleChipRemove = (id) => { + setVendorDepartments((prev) => prev.filter((deptId) => deptId !== id)); + }; + + const handleSave = async (e) => { + e.preventDefault(); + const payload = { + name: vendorName, + type: vendorType, + opening_balance: openingBalance, + vendor_department_service: vendorDepartments, + store: storeId, + }; + + try { + const response = await Post("vendorDepartmentData", payload); + setVendors((prev) => [...prev, response.data]); + toast.success("Vendor added successfully!"); + // reloadData(); + handleClose(); + + window.location.reload(); + } catch (error) { + console.error("Error saving vendor:", error); + toast.error("Error saving vendor!"); + } + }; + + const departmentOptions = serviceData + .filter((service) => service.type === "department") + .map((service) => ({ id: service.id, title: service.title })); + + const expenseTypeOptions = serviceData + .filter((service) => service.type === "expense type") + .map((service) => ({ id: service.id, title: service.title })); + + return ( + +
    +
    + setVendorName(e.target.value)} + style={{ width: "400px", marginRight: "10px", height: "44px" }} + + /> + +
    + {(vendorType === "purchase" || vendorType === "expense") && ( +
    +
    + {vendorDepartments.map((deptId) => { + const department = + vendorType === "purchase" + ? departmentOptions.find((d) => d.id === deptId) + : expenseTypeOptions.find((d) => d.id === deptId); + return ( +
    + {department?.title} + handleChipRemove(deptId)} + > + × + +
    + ); + })} +
    + + {vendorType === "purchase" && ( + setOpeningBalance(e.target.value)} + style={{ width: "400px", marginRight: "10px", height: "44px" }} + /> + )} +
    + )} +
    + +
    +
    +
    + ); +}; + +export default AddVendorModal; diff --git a/src/components/Pages/AppPAges/ReusableForm/ManageGameModal.js b/src/components/Pages/AppPAges/ReusableForm/ManageGameModal.js new file mode 100644 index 0000000..a1cf128 --- /dev/null +++ b/src/components/Pages/AppPAges/ReusableForm/ManageGameModal.js @@ -0,0 +1,164 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-unused-expressions */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useEffect, useState, useContext } from "react"; +import ReusableModal from "../ManageSettings/ReusableModal"; // Adjust the path as needed +import { toast } from "react-toastify"; +import useApi from "../../../../utils/api-manager/Helper/useApi"; +import AuthContext from "../../../../utils/secure-route/AuthContext"; + +function ManageGameModal({ show, handleClose, gameNo, makeBlank,fetchGameData }) { + const [gameName, setGameName] = useState(""); + const [gameNumber, setGameNumber] = useState(gameNo); + const [totalTickets, setTotalTickets] = useState(""); + const [gamePrice, setGamePrice] = useState(""); + const { user } = useContext(AuthContext); + const [bookNumber, setBookNumber] = useState(""); + const [games, setGames] = useState([]); + const storeId = user.store; + const { Post } = useApi(); + + const makeCurrentBlank = () => { + setGameName(""); + setGameNumber(null); + setTotalTickets(""); + setGamePrice(""); + setBookNumber(""); + }; + // Handle form submission for adding a new game + const handleSubmit = async (e) => { + e.preventDefault(); // Prevent the default form submission behavior + const today = new Date().toISOString().split("T")[0]; + const gameData = { + game_name: gameName, + game_no: gameNo || gameNumber, + total_no_of_tickets: totalTickets, + value: gamePrice, + store: storeId, + receive_date: today, + }; + + await Post("lotteryGameData", gameData) + .then(async (response) => { + + const newGame = { + inventory_date: today, + lottery_game: response.data.id, + book_no: bookNumber, + game_name: gameName, + store: storeId, + scan_no: "Manual Entry", + }; + await Post("lotteryInventoryData", newGame) + .then((resp) => { + toast.success("Game added successfully"); + makeBlank(); + }) + .catch((err) => { + makeBlank(); + console.error(err); + toast.error("Unable to add game."); + }); + + setGames((prevGames) => [...prevGames, response.data]); + handleClose(); + setGameNumber(""); + fetchGameData(); + }) + .catch((error) => { + handleClose(); + console.error("Error adding game:", error); + toast.error("Error adding game."); + }) + .finally(() => { + makeBlank(); + makeCurrentBlank(); + }); + }; + return ( + +
    +
    +
    + setGameName(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + required + /> + setGameNumber(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + required + /> +
    +
    + setTotalTickets(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + required + /> + setGamePrice(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + required + /> +
    +
    + setBookNumber(e.target.value)} + style={{ width: "270px", marginRight: "10px" }} + required + /> +
    +
    + +
    +
    +
    +
    + ); +} + +export default ManageGameModal; diff --git a/src/components/Schema/SettingsData.json b/src/components/Schema/SettingsData.json new file mode 100644 index 0000000..3f42ba1 --- /dev/null +++ b/src/components/Schema/SettingsData.json @@ -0,0 +1,10 @@ +[ + { + "id": 13, + "question": "Do you have multiple business registers?" + }, + { + "id": 14, + "question": "Do you have multiple Lottery registers?" + } + ] diff --git a/src/components/ValidationHelper/ValidationHelper.js b/src/components/ValidationHelper/ValidationHelper.js new file mode 100644 index 0000000..850d070 --- /dev/null +++ b/src/components/ValidationHelper/ValidationHelper.js @@ -0,0 +1,20 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { getDynamicHelperText } from '../ValidationHelper/getDynamicHelperText'; // Adjust the path accordingly + +const ValidationHelper = ({ placeholder, error, custom=false, msg="" }) => { + const helperText = (custom)?error ? msg : '':error ? getDynamicHelperText(placeholder) : '' + + return ( +
    + {helperText && {helperText}} +
    + ); +}; + +ValidationHelper.propTypes = { + placeholder: PropTypes.string.isRequired, + error: PropTypes.bool.isRequired, +}; + +export default ValidationHelper; diff --git a/src/components/ValidationHelper/getDynamicHelperText.js b/src/components/ValidationHelper/getDynamicHelperText.js new file mode 100644 index 0000000..b3693eb --- /dev/null +++ b/src/components/ValidationHelper/getDynamicHelperText.js @@ -0,0 +1,4 @@ +export const getDynamicHelperText = (placeholder) => { + if (!placeholder) return 'This field is required'; + return `${placeholder} is required`; +}; diff --git a/src/components/common/ConfirmPassword.js b/src/components/common/ConfirmPassword.js new file mode 100644 index 0000000..34cbc59 --- /dev/null +++ b/src/components/common/ConfirmPassword.js @@ -0,0 +1,15 @@ +import React from "react"; +import FormLayout from "./FormLayout"; +import logo from "../../assets/img/EZHISAB.png"; +import topimage from "../../assets/img/Group 228723.png" +import backgroundImage from "../../assets/img/Frame 812.png"; +import CreateNewPassword from "./WithUi/CreateNewPassword"; +function ConfirmPassword() { + return ( + + + + ) +} + +export default ConfirmPassword \ No newline at end of file diff --git a/src/components/common/ForgotPassword.js b/src/components/common/ForgotPassword.js new file mode 100644 index 0000000..9419590 --- /dev/null +++ b/src/components/common/ForgotPassword.js @@ -0,0 +1,14 @@ +import React from "react"; +import FormLayout from "./FormLayout"; +import Forgotpassword from "./WithUi/Forgotpassword"; +import logo from "../../assets/img/EZHISAB.png"; +import backgroundImage from "../../assets/img/Frame 812.png"; +import topimage from "../../assets/img/Group 228723.png" +function ForgotPassword() { + return ( + + + + ); +} +export default ForgotPassword; diff --git a/src/components/common/FormLayout.js b/src/components/common/FormLayout.js new file mode 100644 index 0000000..918ba1a --- /dev/null +++ b/src/components/common/FormLayout.js @@ -0,0 +1,139 @@ +import React from "react"; +import PropTypes from "prop-types"; +import backgroundimg from "../../assets/img/BackgroundBody.png"; +import { Link } from "react-router-dom"; +import "./Formlayout.css"; +const FormLayout = ({ logoSrc, backgroundImageSrc, children, TopImage }) => { + return ( +
    +
    + {/* Left side: Form */} +
    +
    + + Logo + + +
    +
    + {children} {/* Render the form or other content here */} +
    +
    + {/* Right side: Background image */} +
    + Background + Background +
    +
    +
    + ); +}; +FormLayout.propTypes = { + logoSrc: PropTypes.string.isRequired, + backgroundImageSrc: PropTypes.string.isRequired, + children: PropTypes.node.isRequired, + TopImage: PropTypes.string.isRequired, +}; +export default FormLayout; diff --git a/src/components/common/Formlayout.css b/src/components/common/Formlayout.css new file mode 100644 index 0000000..7811858 --- /dev/null +++ b/src/components/common/Formlayout.css @@ -0,0 +1,20 @@ +.custom-background { + width: 827px; + height: 860px; + top: 135px; + left: 833px; + gap: 0px; + border-radius: 0px 30px 30px 0px; + opacity: 1; /* Set opacity to 1 to make it visible */ + position: absolute; + z-index: 1; /* Ensure it's on top of other content */ +} + +/* Hide the background on smaller screens */ +@media (max-width: 768px) { + .custom-background { + display: none; + } + + +} diff --git a/src/components/common/Header.js b/src/components/common/Header.js new file mode 100644 index 0000000..0762401 --- /dev/null +++ b/src/components/common/Header.js @@ -0,0 +1,664 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { useState, useContext, useEffect, useRef } from "react"; +import { useNavigate } from "react-router-dom"; +import "../../assets/css/App.css"; +import paisavalaLogo from '../../assets/Image/paisavala.png'; + +import logo from "../../assets/img/EZHISAB.png"; +import AuthContext from "../../utils/secure-route/AuthContext"; +import { useLocation, Link } from "react-router-dom"; +import useApi from "../../utils/api-manager/Helper/useApi"; +import shopeKeeper from "../../assets/img/shopkeeper.png"; + +const Header = () => { + const { logOutUser } = useContext(AuthContext); + const [avatarDropdownOpen, setAvatarDropdownOpen] = useState(false); + const [settingsDropdownOpen, setSettingsDropdownOpen] = useState(false); + const [generalDropdownOpen, setGeneralDropdownOpen] = useState(false); + const [expenseDropdownOpen, setExpenseDropdownOpen] = useState(false); + const [lotteryDropdownOpen, setLotteryDropdownOpen] = useState(false); + const [gasDropdownOpen, setGasDropdownOpen] = useState(false); + const [isDropdownVisible, setDropdownVisible] = useState(false); + const [stores, setStores] = useState([]); + const [loading, setLoading] = useState(false); + const [remainingDays, setRemainingDays] = useState(0); + const navigate = useNavigate(); + const [userRole, setUserRole] = useState(null); + const location = useLocation(); + const avatarRef = useRef(null); + const notificationRef = useRef(null); + const generalRef = useRef(null); + const expenseRef = useRef(null); + const settingsRef = useRef(null); + const lotteryRef = useRef(null); + const gasRef = useRef(null); + const [selectedNav, setSelectedNav] = useState("/"); + const { Get, getAPI, Post } = useApi(); + + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); + const toggleMobileMenu = () => { + setIsMobileMenuOpen(!isMobileMenuOpen); + }; + useEffect(() => { + setSelectedNav(location.pathname); + const handlecheckUser = async () => { + try { + const checkuser = await Get(`checkUserType`); + setUserRole(checkuser.role_name); + } catch (error) { + console.error(error); + } + }; + + handlecheckUser(); + }, [location.pathname]); + const handleLogout = () => { + logOutUser(); + }; + + const handleStoreManageClick = async () => { + setDropdownVisible(!isDropdownVisible); + + if (!isDropdownVisible) { + setLoading(true); + try { + const response = await Get("getAllStoresOfUser"); + const { first_store, sub_stores } = response; + const allStores = [first_store, ...(sub_stores || [])]; + setStores(allStores); + } catch (error) { + console.error("Error fetching stores:", error); + } finally { + setLoading(false); + } + } + }; + + const handleStoreClick = async (storeId) => { + + try { + const response = await Post("selectStore", { store_id: storeId }); + navigate("/"); + setDropdownVisible(false); + setAvatarDropdownOpen(false); + } catch (error) { + console.error("Error selecting store:", error); + } finally { + } + }; + + // useEffect(() => { + // fetchTrialInfo(); + // }, []); + + // const fetchTrialInfo = async () => { + // try { + // const response = await Get('remainingTime'); + // const { remaining_days } = response; + // setRemainingDays(remaining_days); + // } catch (error) { + // console.error('Error fetching trial information:', error); + // } finally { + // setLoading(false); + // } + // }; + + + // const getColorClass = () => { + // if (remainingDays > 20) { + // return "bg-success"; // Green background for more than 20 days + // } else if (remainingDays > 10) { + // return "bg-warning"; // Yellow background for more than 10 days + // } else { + // return "bg-danger"; // Red background for 10 days or less + // } + // }; + + const dropdownRefs = [ + avatarRef, + notificationRef, + generalRef, + expenseRef, + settingsRef, + lotteryRef, + gasRef, + ]; + const handleClickOutside = (event) => { + const isClickInsideDropdown = dropdownRefs.some(ref => ref.current && ref.current.contains(event.target)); + + if (!isClickInsideDropdown) { + closeDropdowns(); + } + }; + const closeDropdowns = () => { + setAvatarDropdownOpen(false); + setSettingsDropdownOpen(false); + setGeneralDropdownOpen(false); + setExpenseDropdownOpen(false); + setLotteryDropdownOpen(false); + setGasDropdownOpen(false); + setDropdownVisible(false); + }; + + useEffect(() => { + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + return ( +
    +
    + Logo +
    + +
    +
    + User Avatar { + closeDropdowns(); + setAvatarDropdownOpen(!avatarDropdownOpen); + }} + /> + + {/* Settings Icon Button */} + + + {avatarDropdownOpen && ( + + )} +
    +
    + + +
    + ); +}; +export default Header; diff --git a/src/components/common/Login.js b/src/components/common/Login.js new file mode 100644 index 0000000..c43534e --- /dev/null +++ b/src/components/common/Login.js @@ -0,0 +1,14 @@ +import React from "react"; +import FormLayout from "./FormLayout"; +import logo from "../../assets/img/EZHISAB.png"; +import topimage from "../../assets/img/Group 228723.png" +import backgroundImage from "../../assets/img/Frame 812.png"; +import LoginPage from "./WithUi/LoginPage"; +function Login() { + return ( + + + + ); +} +export default Login; diff --git a/src/components/common/SignUp.js b/src/components/common/SignUp.js new file mode 100644 index 0000000..298ee4d --- /dev/null +++ b/src/components/common/SignUp.js @@ -0,0 +1,15 @@ +import React from "react"; +import FormLayout from "./FormLayout"; +import logo from "../../assets/img/EZHISAB.png"; +import backgroundImage from "../../assets/img/Frame 812.png"; +import topimage from "../../assets/img/Group 228723.png" +import AccountCreate from "./WithUi/AccountCreate"; + +function SignUp() { + return ( + + + + ); +} +export default SignUp; diff --git a/src/components/common/SuccessMsgPage.js b/src/components/common/SuccessMsgPage.js new file mode 100644 index 0000000..ce1c6ce --- /dev/null +++ b/src/components/common/SuccessMsgPage.js @@ -0,0 +1,16 @@ +import React from "react"; +import FormLayout from "./FormLayout"; +import logo from "../../assets/img/EZHISAB.png"; +import backgroundImage from "../../assets/img/Frame 812.png"; +import topimage from "../../assets/img/Group 228723.png" +import SuccessMsg from "./WithUi/SuccessMsg"; + + +function SuccessMsgPage() { + return ( + + + + ); +} +export default SuccessMsgPage; diff --git a/src/components/common/UserAdd.js b/src/components/common/UserAdd.js new file mode 100644 index 0000000..0394a8f --- /dev/null +++ b/src/components/common/UserAdd.js @@ -0,0 +1,155 @@ +import React, { useState } from "react"; +import "react-phone-input-2/lib/style.css"; // Import the library's CSS +import PhoneInput from "react-phone-input-2"; // Import the PhoneInput component +import { TextField, Button, Typography, Paper, Container } from "@mui/material"; +import logo from "../../assets/img/logo.png"; +import axios from "axios"; +import config from "../../config/Global.json"; +import { toast } from "react-toastify"; +const UserAdd = () => { + const [formData, setFormData] = useState({ + username: "", + first_name: "", + last_name: "", + email: "", + contact_no:"", + password: "", + }); + const [errors, setErrors] = useState({}); + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + }; + const handlePhoneChange = (phone) => { + setFormData((prevData) => ({ + ...prevData, + phonenumber: phone, + })); + }; + const handleSubmit = async (e) => { + e.preventDefault(); + const apiUrl = `${config.api.host}${config.api.createUser}`; + try { + const response = await axios.post(apiUrl, formData); + toast.success("User created successfully"); + console.log("User created successfully", response.data); + setFormData({ + username: "", + first_name: "", + last_name: "", + email: "", + password: "", + contact_no: "" // Reset phonenumber field + }); + // Handle success, e.g., redirect or show a success message + } catch (error) { + toast.error("Error creating user"); + console.error("Error creating user", error); + // Handle error, e.g., show an error message + } + }; + return ( +
    + + + {/* Logo */} + Logo + + Create an account + + + + + + + {/* */} + + + + +
    + ); +}; +export default UserAdd; diff --git a/src/components/common/WebCamBarcodeScanner.js b/src/components/common/WebCamBarcodeScanner.js new file mode 100644 index 0000000..61c7df0 --- /dev/null +++ b/src/components/common/WebCamBarcodeScanner.js @@ -0,0 +1,22 @@ +import React from "react"; +import BarcodeScannerComponent from "react-qr-barcode-scanner"; + +function WebCamBarcodeScanner() { + const [data, setData] = React.useState("Not Found"); + + return ( + <> + { + if (result) setData(result.text); + else setData("Not Found"); + }} + /> +

    {data}

    + + ); +} + +export default WebCamBarcodeScanner; \ No newline at end of file diff --git a/src/components/common/WithUi/AccountCreate.css b/src/components/common/WithUi/AccountCreate.css new file mode 100644 index 0000000..625553e --- /dev/null +++ b/src/components/common/WithUi/AccountCreate.css @@ -0,0 +1,21 @@ +.stepper-container { + display: flex; + justify-content: center; /* Center items horizontally */ + align-items: center; /* Center items vertically */ + margin-top: 20px; + width: 100%; /* Ensure the container takes full width to allow centering */ +} +.step-line { + height: 5px; /* Set height of the line */ + background-color: #e0e0e0; /* Default color */ + border-radius: 4px; /* Rounded corners */ + width: 100px; /* Fixed width of the step line */ + transition: background-color 0.3s, width 0.3s; /* Smooth transitions for color and width changes */ +} +.step-line.active { + background-color: #4545db; /* Color when active */ + width: 100px; /* Ensure width remains consistent */ +} +.step-line:not(:last-child) { + margin-right: 10px; /* Space between step lines */ +} diff --git a/src/components/common/WithUi/AccountCreate.js b/src/components/common/WithUi/AccountCreate.js new file mode 100644 index 0000000..562acf8 --- /dev/null +++ b/src/components/common/WithUi/AccountCreate.js @@ -0,0 +1,579 @@ +/* eslint-disable no-useless-escape */ +/* eslint-disable no-unused-vars */ + + +import React, { useState } from "react"; +import "react-phone-input-2/lib/style.css"; +import axios from "axios"; +import config from "../../../config/Global.json"; +import { toast , ToastContainer } from "react-toastify"; +import { useNavigate } from "react-router-dom"; +import "./AccountCreate.css"; // Import the CSS file +import CustomInput from "../../custominput/CustomInput"; +import CustomPhoneInput from "../../customphoninput/CustomPhoneInput"; +function AccountCreate() { + const [formData, setFormData] = useState({ + first_name: "", + last_name: "", + email: "", + contact_no: "", + password: "", + confirmPassword: "", + store_name: "", + address_line1: "", + pincode: "", + city: "", + state: "", + country: "", + }); + const [showExist, setShowExist] = useState(false); + const [customErr, setCustomErr] = useState(false); + const [customErrMsg, setCustomErrMsg] = useState(""); + const [currentStep, setCurrentStep] = useState(1); + const [errors, setErrors] = useState({}); + const [passWordError, setPassWordError] = useState(""); + const [passError, setPassError] = useState(false); + const [passErrMsg, setPassErrMsg] = useState(""); + const [confpassError, setConfpassError] = useState(false); + const [confpassErrorMsg, setConfpassErrorMsg] = useState(""); + const [emailError, setEmailError] = useState(""); + const [phoneError, setPhoneError] = useState(false); + const [phoneErrorMsg, setPhoneErrorMsg] = useState(""); + const [pincodeErrorFlag, setPincodeErrorFlag] = useState(false); + const [pincodeErrorMsg, setPincodeErrorMsg] = useState(""); + const [firsterror, setFirsterror] = useState(false); + const [firsterrormsg, setFirsterrormsg] = useState(""); + const [lasterror, setLasterror] = useState(false); + const [lasterrormsg, setLasterrormsg] = useState(""); + const [contactNoError, setContactNoError] = useState(false); + const [contactNoErrorMsg, setcontactNoErrorMsg] = useState(""); + const navigate = useNavigate(); + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + }; + const handlePhoneChange = (phone) => { + setFormData((prevData) => ({ + ...prevData, + contact_no: phone, + })); + }; + const validateTextInput = (value) => { + const textRegex = /^[A-Za-z,.\-_]{0,255}$/; + return textRegex.test(value); + }; + const fetchLocationDetails = async (pincode) => { + const apiUrl = `${config.api.host}${config.api.getPincodeData}`; + try { + const response = await axios.post(apiUrl, { pincode }); + const { city, state, country } = response.data; + setFormData((prevData) => ({ + ...prevData, + city: city || "", + state: state || "", + country: country || "", + })); + // Reset the error if fetch is successful + setPincodeErrorMsg(""); // Clear any previous error message + setPincodeErrorFlag(false); // Set error flag to false + } catch (error) { + setPincodeErrorMsg("Failed to fetch location details"); + setPincodeErrorFlag(true); // Set error flag to true + } + }; + const handlePincodeChange = (e) => { + const { value } = e.target; + + // Allow only numeric input + const numericValue = value.replace(/[^0-9]/g, ''); + + setFormData((prevData) => ({ + ...prevData, + pincode: numericValue, + ...(numericValue.trim() === "" && { city: "", state: "", country: "" }), + })); + + // Trigger fetching location details if the length is valid + if (numericValue.length === 5 || numericValue.length === 6) { + fetchLocationDetails(numericValue); + } +}; + const handlePincodeBlur = () => { + const { pincode } = formData; + if (pincode.length === 5) { + fetchLocationDetails(pincode); + setPincodeErrorMsg(""); // Clear any previous error message + setPincodeErrorFlag(false); // Set error flag to false + } else { + setPincodeErrorMsg("Pincode must be 5 digits"); + setPincodeErrorFlag(true); // Set error flag to true + } + }; + + const [formErrors, setFormErrors] = useState(false); + const validatePasswords = () => { + return !formErrors;; + }; + const handleBlur = (e) => { + const { name, value } = e.target; + if (name === "confirmPassword") { + const { password, confirmPassword } = formData; + + if (password !== confirmPassword) { + setErrors((prevErrors) => ({ ...prevErrors, confirmPassword: true })); + setConfpassError(true); + setConfpassErrorMsg("Password does not match."); + setFormErrors(true); + } else { + setFormErrors(false); + setErrors((prevErrors) => ({ ...prevErrors, confirmPassword: false })); + setConfpassError(false); + setConfpassErrorMsg(""); + } + } else if (name === "password") { + const passwordRegex = + /^(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*(),.?":{}|<>_\-])[A-Za-z\d!@#$%^&*(),.?":{}|<>_\-]{8,}$/; + if (!passwordRegex.test(value)) { + setErrors((prevErrors) => ({ ...prevErrors, password: true })); + setPassError(true); + setPassErrMsg( + "Password must be at least 8 characters, with one uppercase letter, one digit, and one special character." + ); + setFormErrors(true); + } else { + setFormErrors(false); + setPassError(false); + setPassErrMsg(""); + setErrors((prevErrors) => ({ ...prevErrors, password: false })); + } + } else if (name === "first_name") { + if (!validateTextInput(value)) { + setFirsterror(true); + setFirsterrormsg("Special characters and numbers are not allowed!"); + setErrors((prevErrors) => ({ + ...prevErrors, + first_name: true, // Update errors state with specific message + })); + setFormErrors(true); + } else { + setFormErrors(false); + setFirsterror(false); + setFirsterrormsg(""); + setLasterror(false); + setLasterrormsg(""); + setErrors((prevErrors) => ({ + ...prevErrors, + first_name: false, + })); + } + } else if (name === "last_name") { + if (!validateTextInput(value)) { + setFormErrors(true); + setLasterror(true); + setLasterrormsg("Special characters and numbers are not allowed!"); + setErrors((prevErrors) => ({ + ...prevErrors, + last_name: true, // Update errors state with specific message + })); + } else { + setLasterror(false); + setLasterrormsg(""); + setErrors((prevErrors) => ({ + ...prevErrors, + last_name: false, + })); + setFormErrors(false); + } + } + }; + const validatePhoneNo = (value) => { + let errorMessage = ""; + + if (!value) { + errorMessage = "Phone number is required."; + } else if (!/^\+1\d{10}$/.test(value)) { + errorMessage = "Please enter a valid phone number (e.g., +1234567890)."; + } + + setErrors({ + ...errors, + contact_no: errorMessage, + }); + + setContactNoError(!!errorMessage); + setcontactNoErrorMsg(errorMessage); + }; + const checkUserExist = async (email) => { + const emailRegex = /^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}$/; + let err = false; + if (!emailRegex.test(email)) { + setErrors((prevErrors) => ({ ...prevErrors, email: true })); + setCustomErr(true); + setCustomErrMsg("Please enter a valid email"); + err = true; + } else { + setErrors((prevErrors) => ({ ...prevErrors, email: false })); + setCustomErr(false); + setCustomErrMsg(""); + err = false; + } + if (!err) { + await axios + .post(`${config.api.host}${config.api.userExist}`, { + email: email, + }) + .then((response) => { + setShowExist(response.data.exists); + if (response.data.exists) { + setErrors((prevErrors) => ({ ...prevErrors, email: true })); + setCustomErr(true); + setCustomErrMsg("This user account already exists."); + } else { + setErrors((prevErrors) => ({ ...prevErrors, email: "" })); + setCustomErrMsg("This user account already exists."); + } + }); + } + }; + const handleSubmit = async (e) => { + e.preventDefault(); + if (currentStep === 2) { + if (!validatePasswords()) { + return; + } + const apiUrl = `${config.api.host}${config.api.signUpUser}`; + try { + const response = await axios.post(apiUrl, formData); + toast.success("User Created successfully!"); + setFormData({ + first_name: "", + last_name: "", + email: "", + contact_no: "", + password: "", + confirmPassword: "", + store_name: "", + address_line1: "", + pincode: "", + city: "", + state: "", + country: "", + }); + setCurrentStep(1); + navigate("/login"); + + } catch (error) { + // Check for duplicate contact number error + if (error.response && error.response.data.error) { + const errorMessage = error.response.data.error; + + if (errorMessage.includes('A user with this contact number already exists')) { + toast.error("This mobile number is already registered. Please try with a different one."); + } else if (errorMessage.includes('duplicate key value violates unique constraint')) { + // Check for duplicate email (username) + toast.error("This email is already registered. Please try with a different one."); + } else { + toast.error("Error creating user"); + } + } else { + toast.error("Error creating user"); + } + } + } else { + if (validatePasswords()) { + setCurrentStep(currentStep + 1); + } + } + }; + + + const goBack = () => { + if (currentStep > 1) { + setCurrentStep(currentStep - 1); + } + }; + const renderStep1 = () => ( + <> +

    + Create an Account +

    +

    + Start managing your finances effortlessly. Sign up to access your + personal ledger and gain control of your transactions with ease! +

    +
    + +
    +
    + +
    +
    + validatePhoneNo(formData.contact_no)} + error={Boolean(errors.contact_no)} // Check if there's an error + helpertext={errors.contact_no} // Pass error message to helpertext + custom={contactNoError} // Optionally pass additional custom error logic + msg={contactNoErrorMsg} // Custom error message (if any) + /> +
    +
    + checkUserExist(e.target.value)} + custom={customErr} + msg={customErrMsg} + required + error={Boolean(errors.email)} + helpertext={errors.email || emailError} + /> +
    +
    + +
    +
    + handleBlur(e)} + required + error={Boolean(errors.confirmPassword)} + helpertext={errors.confirmPassword || ""} + custom={confpassError} + msg={confpassErrorMsg} + /> +
    + + ); + const renderStep2 = () => ( + <> +
    + +

    + Enter the Details +

    +
    +

    + Get started with your personal ledger. Fill in your information to track + transactions and manage your finances seamlessly! +

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + + ); + return ( + +
    + + + +
    +
    + {currentStep === 1 ? renderStep1() : renderStep2()} +
    + +
    +
    +
    +
    +
    +
    +
    +
    + ); +} +export default AccountCreate; diff --git a/src/components/common/WithUi/CreateNewPassword.js b/src/components/common/WithUi/CreateNewPassword.js new file mode 100644 index 0000000..f964fde --- /dev/null +++ b/src/components/common/WithUi/CreateNewPassword.js @@ -0,0 +1,146 @@ +import React, { useState, useEffect } from "react"; +import { toast } from "react-toastify"; +import axios from "axios"; +import { useNavigate, useParams } from "react-router-dom"; +import config from "../../../config/Global.json"; +import CustomInput from "../../custominput/CustomInput"; + +const base64Decode = (encodedStr) => { + try { + if (encodedStr) { + return atob(encodedStr.replace(/_/g, "/").replace(/-/g, "+")); + } + } catch (e) { + console.error("Error decoding Base64 string", e); + return ""; + } +}; + +const CreateNewPassword = () => { + const { temp_token } = useParams(); + const [newPassword, setNewPassword] = useState(""); + const [confirmPassword, setConfirmPassword] = useState(""); + const [errors, setErrors] = useState({}); + const [firstName, setFirstName] = useState(""); + const [token, setToken] = useState(""); + const navigate = useNavigate(); + + useEffect(() => { + const parts = temp_token.split("."); + setToken(parts[0]); + setFirstName(base64Decode(parts[1])); + setErrors({}); + }, [temp_token]); + + const checkValidPassword = (password) => { + const passwordRegex = /^(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/; + if (!passwordRegex.test(password)) { + return { + password: + "Password must be at least 8 characters long, and include at least one digit, one uppercase letter, and one special character.", + }; + } + return {}; + }; + + const handleBlur = (field) => { + let validationErrors = {}; + if (field === "newPassword") { + validationErrors = checkValidPassword(newPassword); + } + if (field === "confirmPassword" && newPassword !== confirmPassword) { + validationErrors.confirmPassword = "Passwords do not match."; + } + setErrors((prev) => ({ ...prev, ...validationErrors })); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + const apiBaseUrl = config.api.host; + const confirmPasswordEndpoint = config.api.confirmPassword; + + if (Object.keys(errors).length > 0 || newPassword !== confirmPassword) { + return; + } + + try { + const url = `${apiBaseUrl}${confirmPasswordEndpoint}${token}/`; + await axios.post(url, { new_password: newPassword }); + toast.success("Password has been reset successfully"); + navigate("/success-msg"); + } catch (error) { + toast.error("Failed to reset password"); + } + }; + + return ( +
    +
    +

    + Create New Password +

    +

    + Hi {firstName ? firstName : ""}, secure your ledger by setting a new password and regain full access to your financial data. +

    +
    +
    + setNewPassword(e.target.value)} + onBlur={() => handleBlur("newPassword")} + /> + {errors.password &&
    {errors.password}
    } +
    +
    + setConfirmPassword(e.target.value)} + onBlur={() => handleBlur("confirmPassword")} + /> + {errors.confirmPassword &&
    {errors.confirmPassword}
    } +
    + +
    +
    +
    + ); +}; + +export default CreateNewPassword; diff --git a/src/components/common/WithUi/Forgotpassword.js b/src/components/common/WithUi/Forgotpassword.js new file mode 100644 index 0000000..fd5f237 --- /dev/null +++ b/src/components/common/WithUi/Forgotpassword.js @@ -0,0 +1,220 @@ +/* eslint-disable no-useless-escape */ +import React, { useState, useEffect } from "react"; +import { toast } from "react-toastify"; +import axios from "axios"; +import config from "../../../config/Global.json"; +import CustomInput from "../../custominput/CustomInput"; +import { useNavigate } from "react-router-dom"; + +const Forgotpassword = () => { + const [email, setEmail] = useState(""); + const [showSuccessMessage, setShowSuccessMessage] = useState(false); + const [showInitialMessage, setShowInitialMessage] = useState(true); + const [timer, setTimer] = useState(30); + const [customErr, setCustomErr] = useState(false); + const [customErrMsg, setCustomErrMsg] = useState(""); + const [errors, setErrors] = useState({}); + const [emailError, setEmailError] = useState(""); + const [isButtonDisabled, setIsButtonDisabled] = useState(false); + const [isUserExist, setIsUserExist] = useState(false); // State for user existence + const [showTimer, setShowTimer] = useState(false); // State for timer visibility + const apiBaseUrl = config.api.host; + const passwordResetEndpoint = config.api.passwordReset; + const navigate = useNavigate(); + + const handleEmailChange = (e) => { + const value = e.target.value; + setEmail(value); + setCustomErrMsg(""); // Clear message when the email changes + setIsUserExist(false); // Reset user existence state on email change + }; + + const checkUserExist = async (email) => { + const emailRegex = /^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}$/; + let err = false; + if (!emailRegex.test(email)) { + setErrors((prevErrors) => ({ ...prevErrors, email: true })); + setCustomErr(true); + setCustomErrMsg("Please enter a valid email."); + setEmailError("Please enter a valid email."); + err = true; + } else { + setErrors((prevErrors) => ({ ...prevErrors, email: false })); + setCustomErr(false); + setCustomErrMsg(""); + setEmailError(""); + } + + if (!err) { + try { + const response = await axios.post( + `${config.api.host}${config.api.userExist}`, + { email } + ); + if (response.data.exists) { + setErrors((prevErrors) => ({ ...prevErrors, email: false })); + setCustomErr(false); + setCustomErrMsg(""); // No message for existing user + setEmailError(""); + setIsUserExist(true); // User exists + } else { + // User does not exist + setErrors((prevErrors) => ({ ...prevErrors, email: true })); + setCustomErr(true); + setCustomErrMsg("This user account does not exist."); // Show message if user does not exist + setEmailError("This user account does not exist."); + setIsUserExist(false); // User does not exist + } + } catch (error) { + setEmailError("Error checking user existence."); + toast.error("Error checking user existence."); + } + } + }; + + const handleSubmit = async (event) => { + event.preventDefault(); + if (isUserExist && !errors.email && !customErr) { // Check if user exists before submitting + try { + setIsButtonDisabled(true); + await axios.post(`${apiBaseUrl}${passwordResetEndpoint}`, { email }); + toast.success("Password reset request sent successfully."); + setShowSuccessMessage(true); + setShowInitialMessage(false); + setEmail(""); + setTimer(30); // Reset timer to 30 seconds + setShowTimer(true); // Show the timer after a successful request + } catch (error) { + const errorMessage = error.response?.data?.detail || ""; + setCustomErr(true); + setCustomErrMsg(errorMessage); + setEmailError(errorMessage); + setIsButtonDisabled(false); + } + } + }; + + useEffect(() => { + let interval; + if (showTimer && timer > 0) { + interval = setInterval(() => { + setTimer((prev) => prev - 1); + }, 1000); + } else if (timer === 0) { + setIsButtonDisabled(false); + setShowTimer(false); // Hide the timer after it reaches 0 + } + return () => clearInterval(interval); + }, [timer, showTimer]); + + return ( +
    +
    +
    + navigate("/login")} + style={{ + marginTop: "10px", + marginRight: "10px", + fontSize: "25px", + cursor: "pointer", + }} + > +

    + Forgot Password +

    +
    + {showInitialMessage && ( +

    + No worries! Reset your password to regain access to your ledger and + keep your finances on track. +

    + )} + {showSuccessMessage && ( +

    + Please check your inbox (and SPAM folder) for the password reset + link. +

    + )} +
    +
    + checkUserExist(e.target.value)} + custom={customErr} + msg={customErrMsg} // Display the error message here + error={!!emailError} + helpertext={emailError} + style={{ width: "100%" }} + /> +
    + +
    + {showTimer && timer > 0 && ( // Only show timer when showTimer is true + + Wait for {timer} seconds to request a new one. + + )} +
    +
    +
    +
    + ); +}; + +export default Forgotpassword; diff --git a/src/components/common/WithUi/LoginPage.js b/src/components/common/WithUi/LoginPage.js new file mode 100644 index 0000000..96710a6 --- /dev/null +++ b/src/components/common/WithUi/LoginPage.js @@ -0,0 +1,161 @@ +/* eslint-disable no-useless-escape */ +/* eslint-disable no-unused-vars */ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useContext, useEffect, useState } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import AuthContext from "../../../utils/secure-route/AuthContext"; +import CustomInput from "../../custominput/CustomInput"; + +const LoginPage = () => { + const { loginUser } = useContext(AuthContext); + const { authToken } = useContext(AuthContext); + const navigate = useNavigate(); + + const checkLoggedIn = () => { + if (authToken) { + navigate("/"); + } + }; + + useEffect(() => { + checkLoggedIn(); + }, [authToken]); + + const [errors, setErrors] = useState({}); + const [customErr, setCustomErr] = useState(false); + const [customErrMsg, setCustomErrMsg] = useState(""); + const [usernameError, setUsernameError] = useState(""); + const [passwordError, setPasswordError] = useState(""); + + const checkValidUsername = (username) => { + const emailRegex = /^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}$/; + if (!emailRegex.test(username)) { + setErrors((prevErrors) => ({ ...prevErrors, username: true })); + setCustomErr(true); + setCustomErrMsg("Please Enter a Valid Email as Username!"); + } else { + setErrors((prevErrors) => ({ ...prevErrors, username: "" })); + setCustomErrMsg(""); + } + }; + + const [passError, setPassError] = useState(false); + const [passErrMsg, setPassErrMsg] = useState(""); + + const checkValidPassword = (password) => { + const passwordRegex = /^(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*(),.?":{}|<>_\-])[A-Za-z\d!@#$%^&*(),.?":{}|<>_\-]{8,}$/;; + if (!passwordRegex.test(password)) { + setErrors((prevErrors) => ({ ...prevErrors, password: true })); + setPassError(true); + setPassErrMsg( + "Password must be at least 8 characters, with one uppercase letter, one digit, and one special character." + ); + } else { + setErrors((prevErrors) => ({ ...prevErrors, password: "" })); + setPassErrMsg(""); + } + }; + + return ( +
    +
    +

    + Welcome Back +

    +

    + Ready to manage your ledger? Sign in to track your transactions and stay on top of your financials! +

    +
    +
    + { + checkValidUsername(e.target.value); + }} + custom={customErr} + msg={customErrMsg} + required + error={Boolean(errors.username)} + helpertext={errors.username || usernameError} + /> +
    +
    + { + checkValidPassword(e.target.value); + }} + custom={passError} + msg={passErrMsg} + error={Boolean(errors.password)} + helpertext={errors.password || passwordError} + /> +
    +
    +
    + + +
    +
    + + Forgot Password? + +
    +
    + +
    +
    +
    + New to Ezhisab? + + Create an Account + +
    +
    +
    +
    + ); +}; + +export default LoginPage; diff --git a/src/components/common/WithUi/SuccessMsg.js b/src/components/common/WithUi/SuccessMsg.js new file mode 100644 index 0000000..ec1cc98 --- /dev/null +++ b/src/components/common/WithUi/SuccessMsg.js @@ -0,0 +1,54 @@ +/* eslint-disable jsx-a11y/alt-text */ +import React from "react"; +import { useNavigate } from "react-router-dom"; +import success from "../../../assets/img/Success.png"; +function SuccessMsg() { + const navigate = useNavigate(); + const handleSubmit = () => { + navigate("/login"); + }; + return ( +
    +
    +

    + Your Password Is Successfully Changed + +

    +
    + +
    +
    + ); +} +export default SuccessMsg; diff --git a/src/components/common/header.css b/src/components/common/header.css new file mode 100644 index 0000000..f14e3d9 --- /dev/null +++ b/src/components/common/header.css @@ -0,0 +1,150 @@ +/* Comprehensive Responsive Navbar Styles */ + +/* Base Styles */ +.header-container { + background-color: #ffffff; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.navbar { + padding: 10px 15px; +} + +/* Dropdown Styles */ +.nav-menu-drop { + background-color: #ffffff; + border: 1px solid #e0e0e0; + border-radius: 4px; + box-shadow: 0 2px 5px rgba(0,0,0,0.1); + position: absolute; + min-width: 200px; + z-index: 1000; +} + +.nav-menu-drop-item { + color: #333; + padding: 10px 15px; + display: block; + transition: background-color 0.2s ease; +} + +.nav-menu-drop-item:hover { + background-color: #f5f5f5; +} + +/* Responsive Breakpoints */ +/* Extra Small Devices (Smartphones, <576px) */ +@media (max-width: 575.98px) { + .navbar-collapse { + background-color: #ffffff; + position: fixed; + top: 60px; /* Adjust based on header height */ + left: 0; + right: 0; + bottom: 0; + z-index: 1050; + padding: 15px; + overflow-y: auto; + } + + .navbar-nav { + flex-direction: column; + } + + .nav-menu-drop { + position: static; + border: none; + box-shadow: none; + } +} + +/* Small Devices (Landscape Phones, 576px and up) */ +@media (min-width: 576px) and (max-width: 767.98px) { + .navbar-collapse { + background-color: #ffffff; + max-height: calc(100vh - 60px); + overflow-y: auto; + } +} + +/* Medium Devices (Tablets, 768px and up) */ +@media (min-width: 768px) and (max-width: 991.98px) { + .navbar-collapse { + background-color: #ffffff; + max-height: calc(100vh - 80px); /* Adjust for tablet heights */ + overflow-y: auto; + } + + .nav-menu-drop { + position: static; + border: none; /* Removes border */ + box-shadow: none; /* Removes box-shadow */ + min-width: 250px; /* Ensures a minimum width for the dropdown */ + } +} + +/* Large Devices (Desktops, 992px and up) */ +@media (min-width: 992px) and (max-width: 1366px) { + .navbar-collapse { + background-color: #ffffff; /* Ensures the white background */ + max-height: calc(100vh - 80px); /* Adjusted for larger screen heights */ + overflow-y: auto; + } + + /* Dropdown menu behavior for large screen */ + .nav-menu-drop { + position: static; /* Keeps it static as in mobile */ + border: none; /* Removes border */ + box-shadow: none; /* Removes box-shadow */ + } +} + +/* Very Large Devices (Desktops >1366px) */ +@media (min-width: 1366px) { + .nav-menu-drop { + display: none; + } + + .nav-item:hover .nav-menu-drop { + display: block; + } +} + +/* Navbar Toggler Styles */ +.navbar-toggler { + background-color: transparent; + border: 1px solid rgba(0,0,0,0.1); + border-radius: 4px; +} + +.navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.8)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} + +/* Avatar and Trial Styles */ +.d-flex { + align-items: center; + gap: 10px; +} + +.trail { + display: flex; + align-items: center; + justify-content: center; + padding: 5px 10px; + border-radius: 4px; + font-size: 0.9rem; +} + +/* Accessibility Improvements */ +@media (max-width: 991.98px) { + .nav-link, + .nav-menu-drop-item { + background-color: #ffffff; + + min-height: 44px; + display: flex; + align-items: center; + padding: 10px 15px; + } +} diff --git a/src/components/custominput/CustomInput.css b/src/components/custominput/CustomInput.css new file mode 100644 index 0000000..59b8196 --- /dev/null +++ b/src/components/custominput/CustomInput.css @@ -0,0 +1,34 @@ +/* CustomInput.css */ +.custom-input { + width: 459px; + height: 60px; + padding: 28px 26px; + border-radius: 10px; + color: #002300; + border: 1px solid rgba(69, 69, 219, 0.3); + opacity: 1; /* Make sure inputs are visible */ + box-shadow: none; /* Remove any box-shadow if applied */ + font-size: 18px; /* Optional: Set font size for the input text */ + } + + .custom-input::placeholder { + + font-size: 18px; + font-weight: 400; + line-height: 18px; + text-align: left; + color: #002300; /* Placeholder text color */ + } + + /* Focus styles */ + .custom-input:focus { + outline: none; /* Remove default focus outline */ + border: 1px solid #4545DB4D; /* Keep border style consistent */ + box-shadow: none; /* Remove any focus box-shadow */ + } + .helper-text { + color: red; + font-size: 0.875rem; + margin-top: 0.25rem; + } + \ No newline at end of file diff --git a/src/components/custominput/CustomInput.js b/src/components/custominput/CustomInput.js new file mode 100644 index 0000000..4f2ba77 --- /dev/null +++ b/src/components/custominput/CustomInput.js @@ -0,0 +1,20 @@ +import React from "react"; +import "./CustomInput.css"; +import ValidationHelper from '../ValidationHelper/ValidationHelper'; + +const CustomInput = ({ type = 'text', placeholder = '', className = '', error = false, custom=false, msg="", ...props }) => { + return ( + <> + + + + ); +}; + +export default CustomInput; diff --git a/src/components/custommultiselect/CustomMultiSelect.js b/src/components/custommultiselect/CustomMultiSelect.js new file mode 100644 index 0000000..588b2c3 --- /dev/null +++ b/src/components/custommultiselect/CustomMultiSelect.js @@ -0,0 +1,51 @@ +import React from 'react'; +import { Multiselect } from 'multiselect-react-dropdown'; + +const MultiSelectComponent = ({ options, selectedValues, onSelect, onRemove, placeholder }) => { + return ( + + ); +}; + +export default MultiSelectComponent; diff --git a/src/components/customphoninput/CustomPhoneInput.css b/src/components/customphoninput/CustomPhoneInput.css new file mode 100644 index 0000000..57e7e1e --- /dev/null +++ b/src/components/customphoninput/CustomPhoneInput.css @@ -0,0 +1,69 @@ +.phone-input-container { + display: flex; + flex-direction: column; + width: 459px; /* Adjust container width if needed */ + margin: auto; +} + +.phone-input { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + width: 100%; +} + +.phone-input-inner { + position: relative; + width: 100%; +} + +.custom-input { + width: 100%; + height: 60px; + padding: 28px 26px; + border-radius: 10px; + border: 1px solid #4545db4d; /* Your border color */ + opacity: 1; /* Ensure inputs are visible */ + box-shadow: none; /* Remove any box-shadow if applied */ + font-size: 16px; /* Optional: Set font size for the input text */ + padding-right: 40px; /* Added padding to the right to leave space for the icon */ +} + +.custom-input:focus { + outline: none; + border: 1px solid #4545db4d; +} + +.input-error { + border: 1px solid red; /* Highlight the input border in red */ +} + +.error-message { + color: red; /* Red color for error text */ + margin-top: 4px; + font-size: 12px; +} + +/* Custom styling for the SVG down arrow */ +.down-arrow { + position: absolute; + right: 10px; /* Position the icon on the right side */ + top: 50%; + transform: translateY(-50%); /* Vertically center the arrow */ + cursor: pointer; +} + +.custom-input::placeholder { + font-family: "Manrope", sans-serif; + font-size: 18px; + font-weight: 400; + line-height: 18px; + text-align: left; + color: rgba(0, 0, 0, 0.5); +} + +.custom-country-select { + border: 1px solid #4545db4d; + border-radius: 10px 10px 0 0; +} diff --git a/src/components/customphoninput/CustomPhoneInput.js b/src/components/customphoninput/CustomPhoneInput.js new file mode 100644 index 0000000..18927a7 --- /dev/null +++ b/src/components/customphoninput/CustomPhoneInput.js @@ -0,0 +1,55 @@ +import React, { useState, useEffect } from "react"; +import "./CustomPhoneInput.css"; // Import your custom styles + +const CustomPhoneInput = ({ value, onChange, onBlur, error, errorMessage }) => { + const [phoneNumber, setPhoneNumber] = useState(value || "+1"); + + // Initialize to "+1" if not already set + useEffect(() => { + if (!phoneNumber || phoneNumber === "+") { + setPhoneNumber("+1"); + } + }, [phoneNumber]); + + // Handle changes in the phone number + const handleInputChange = (e) => { + const inputValue = e.target.value; + + // Sanitize the input: Allow only "+1" as a prefix and digits after it + if (inputValue.startsWith("+1")) { + const sanitizedValue = "+1" + inputValue.slice(2).replace(/\D/g, ""); // Remove non-digit characters after "+1" + setPhoneNumber(sanitizedValue); + onChange(sanitizedValue); // Notify parent of the change + } else if (inputValue === "") { + setPhoneNumber("+1"); + onChange("+1"); // Reset to "+1" if empty + } else { + setPhoneNumber("+1"); + onChange("+1"); // Ensure it always starts with "+1" + } + }; + + + return ( +
    +
    + {/* Static +1 prefix inside the input field */} + + +
    + {error &&

    {errorMessage}

    } +
    + ); +}; + +export default CustomPhoneInput; diff --git a/src/config/ComponentRegister.js b/src/config/ComponentRegister.js new file mode 100644 index 0000000..0a44535 --- /dev/null +++ b/src/config/ComponentRegister.js @@ -0,0 +1,279 @@ +/* eslint-disable no-unused-vars */ +import ConfirmPassword from "../components/common/ConfirmPassword"; +import ForgotPassword from "../components/common/ForgotPassword"; +import SignUp from "../components/common/SignUp"; +import SuccessMsgPage from "../components/common/SuccessMsgPage"; +import Expense from "../components/Pages/AppPAges/Expense/expense"; +import Login from "../components/common/Login"; +import Purchase from "../components/Pages/AppPAges/Purchase/purchase"; +import GeneralLedgerATM from "../components/Pages/AppPAges/GeneralLedger/GeneralLedgerATM"; +import GeneralLedgerBank from "../components/Pages/AppPAges/GeneralLedger/GeneralLedgerBank"; +import GeneralLedgerOwnerDistribution from "../components/Pages/AppPAges/GeneralLedger/GeneralLedgerOwnerDistribution"; +import GeneralLedgerOtherIncome from "../components/Pages/AppPAges/GeneralLedger/GeneralLedgerOtherIncome"; +import GeneralLedgerSalesTax from "../components/Pages/AppPAges/GeneralLedger/GeneralLedgerSalesTax"; +import GeneralLedgerBankLedger from "../components/Pages/AppPAges/GeneralLedger/GeneralLedgerBankLedger"; +import ManageSettings from "../components/Pages/AppPAges/ManageSettings/ManageSettings"; +import StoreInformation from "../components/Pages/AppPAges/ManageSettings/StoreInformation"; +import ManageUsers from "../components/Pages/AppPAges/ManageSettings/ManageUsers"; +import ManageDepartments from "../components/Pages/AppPAges/ManageSettings/ManageDepartments"; +import ManageVendor from "../components/Pages/AppPAges/ManageSettings/ManageVendor"; +import ManageExpenseType from "../components/Pages/AppPAges/ManageSettings/ManageExpenseType"; +import OtherIncomeType from "../components/Pages/AppPAges/ManageSettings/OtherIncomeType"; +import PayInvoice from "../components/Pages/AppPAges/Dashboard/Invoice/PayInvoice"; +import BankDeposit from "../components/Pages/AppPAges/Dashboard/Invoice/BankDeposit"; +import AtmDeposit from "../components/Pages/AppPAges/Dashboard/Invoice/AtmDeposit"; +import Accounting from "../components/Pages/AppPAges/Account/Accounting"; +import Payment from "../components/Pages/AppPAges/Payments/Payment"; +import Reports from "../components/Pages/AppPAges/Reports/Reports"; + +import AddInvoice from "../components/Pages/AppPAges/Dashboard/Invoice/AddInvoice"; +import ReportDateSelection from "../components/Pages/AppPAges/Reports/ReportDateSelection"; +import AuditTrail from "../components/Pages/AppPAges/Auditrail/AuditTrail"; +import LotteryInventory from "../components/Pages/AppPAges/Lottery/LotteryInventory"; +import WeeklyInvoiceSettlement from "../components/Pages/AppPAges/Lottery/WeeklyInvoiceSettlement"; +import BookMovement from "../components/Pages/AppPAges/Lottery/BookMovement"; +import VendingBookMovement from "../components/Pages/AppPAges/Lottery/VendingBookMovement"; +import LotteryBookOnHold from "../components/Pages/AppPAges/Lottery/LotteryBookOnHold"; +import ManageGames from "../components/Pages/AppPAges/Lottery/ManageGames"; +import WebCamBarcodeScanner from "../components/common/WebCamBarcodeScanner"; +import GasInvoice from "../components/Pages/AppPAges/Gas/GasInvoice"; +import HouseCharges from "../components/Pages/AppPAges/Gas/HouseCharges"; +import GasTaxSettings from "../components/Pages/AppPAges/Gas/GasTaxSettings"; +import GasSettings from "../components/Pages/AppPAges/Gas/GasSettings"; +import Payroll from "../components/Pages/AppPAges/Payroll/Payroll"; +import GeneralLedgerCashLedger from "../components/Pages/AppPAges/GeneralLedger/GeneralLedgerCashLedger"; +import Dashboard from '../components/Pages/AppPAges/Dashboard/Dashboard' +import MainDashboard from "../components/Pages/AppPAges/Dashboard/MainDashboard"; +import Report from "../components/Pages/AppPAges/ReportUi/Report"; + +const routes = [ + { + path: "/", + component: AddInvoice, + auth: true, + }, + + { + path: "/owner-dashboard", + component: MainDashboard, + auth: true, + }, + { + path: "/payInvoice", + component: PayInvoice, + auth: true, + }, + + { + path: "/bankDeposit", + component: BankDeposit, + auth: true, + }, + { + path: "/atmDeposit", + component: AtmDeposit, + auth: true, + }, + { + path: "/login", + component: Login, + auth: false, + }, + { + path: "/create-user", + component: SignUp, + auth: false, + }, + { + path: "/forgot-password", + component: ForgotPassword, + auth: false, + }, + { + path: "/auth/pass-reset/:temp_token", + component: ConfirmPassword, + auth: false, + }, + { + path: "/success-msg", + component: SuccessMsgPage, + auth: false, + }, + { + path: "/expense", + component: Expense, + auth: true, + }, + { + path: "/purchase", + component: Purchase, + auth: true, + }, + { + path: "/ATM", + component: GeneralLedgerATM, + auth: true, + }, + { + path: "/Bank", + component: GeneralLedgerBank, + auth: true, + }, + { + path: "/store-information", + component: StoreInformation, + auth: true, + }, + { + path: "/manage-users", + component: ManageUsers, + auth: true, + }, + { + path: "/manage-settings", + component: ManageSettings, + auth: true, + }, + { + path: "/manage-vendor", + component: ManageVendor, + auth: true, + }, + { + path: "/manage-departments", + component: ManageDepartments, + auth: true, + }, + { + path: "/accounting", + component: Accounting, + auth: true, + }, { + path: "/reportDateSelection", + component: ReportDateSelection, + auth: true, + }, + { + path: "/reports", + component: Reports, + auth: true, + }, + + { + path: "/payroll", + component: Payroll, + auth: true, + }, + + { + path: "/auditrail", + component: AuditTrail, + auth: true, + }, + { + path: "/payments", + component: Payment, + auth: true, + }, + { + path: "/OwnerDist", + component: GeneralLedgerOwnerDistribution, + auth: true, + }, + { + path: "/OtherIncome", + component: GeneralLedgerOtherIncome, + auth: true, + }, + { + path: "/SalesTax", + component: GeneralLedgerSalesTax, + auth: true, + }, + { + path: "/bankLedger", + component: GeneralLedgerBankLedger, + auth: true, + }, + { + path:"/cashLedger", + component:GeneralLedgerCashLedger, + auth:true, + }, + { + path: "/manage-expense-type", + component: ManageExpenseType, + auth: true, + }, + { + path: "/other-income-type", + component: OtherIncomeType, + auth: true, + }, + { + path: "/lottery-inventory", + component:LotteryInventory, + auth: true, + }, + { + path: "/lottery-inventory", + component:LotteryInventory, + auth: true, + }, + { + path: "/weekly-invoice-settlement", + component:WeeklyInvoiceSettlement, + auth: true, + }, + { + path: "/book-movement", + component:BookMovement, + auth: true, + }, + { + path: "/vending-book-movement", + component:VendingBookMovement, + auth: true, + }, + { + path: "/lottery-book-on-hold", + component:LotteryBookOnHold, + auth: true, + }, + { + path: "/manage-games", + component:ManageGames, + auth: true, + }, + { + path: "/gas-invoice", + component:GasInvoice, + auth: true, + }, + { + path: "/house-charges", + component:HouseCharges, + auth: true, + }, + { + path: "/gas-tax-settings", + component:GasTaxSettings, + auth: true, + }, + { + path: "/gas-settings", + component:GasSettings, + auth: true, + }, + { + path: "/barcode", + component:WebCamBarcodeScanner, + auth: true, + }, + { + path: "/report-preview", + component:Report, + auth: false, + }, +]; +export const getRoutes = () => routes; diff --git a/src/config/Global.json b/src/config/Global.json new file mode 100644 index 0000000..0e0cf19 --- /dev/null +++ b/src/config/Global.json @@ -0,0 +1,108 @@ +{ + "api": { + "host": "https://ezhisab-api.humbingo.in", + "token": "/auth/token/", + "refreshToken": "/auth/token/refresh/", + "user": "/api/v1/user/", + "kyc": "/api/v1/kyc/", + "role": "/api/v1/role/", + "msRole":"/api/v1/msRole/", + "permission": "/api/v1/permission/", + "checkUserType": "/api/v1/checkUserType", + "company": "/api/v1/company", + "test": "/api/v1/test/", + "department": "/api/v1/department/", + "createUser": "/api/v1/createUser/", + "signUpUser": "/api/v1/signUpUser/", + "getPincodeData": "/api/v1/getPincodeData/", + "passwordReset": "/api/v1/passwordReset/", + "confirmPassword": "/auth/pass-reset/", + "userExist": "/api/v1/userExist/", + "store": "/api/v1/store/", + "pincode": "/api/v1/pincode/", + "invoice": "/api/v1/invoice/", + "invoiceData":"/api/v1/invoiceData/", + "vendorCustomer": "/api/v1/vendorCustomer/", + "lottoBooklet": "/api/v1/lottoBooklet/", + "transaction": "/api/v1/transaction/", + "transactionType": "/api/v1/transactionType/", + "payMethod": "/api/v1/payMethod/", + "ticket": "/api/v1/ticket/", + "subscriptionType": "/api/v1/subscriptionType/", + "subscription": "/api/v1/subscription/", + "shift": "/api/v1/shift/", + "vendorDepartmentServiceData": "/api/v1/vendorDepartmentServiceData/", + "vendorDepartmentData": "/api/v1/vendorDepartmentData/", + "payrollEmployeeData": "/api/v1/payrollEmployeeData/", + "bank": "/api/v1/bankData/", + "dueDaysData":"/api/v1/dueDaysData/", + "transactionData":"/api/v1/transactionData/", + "otherIncomeData":"/api/v1/otherIncomeData/", + "businessReportData":"/api/v1/businessReportData/", + "registerNetSalesTaxesData":"/api/v1/registerNetSalesTaxesData/", + "purchaseExpenseAndOtherData":"/api/v1/purchaseExpenseAndOtherData/", + "salesTaxData":"/api/v1/salesTaxData/", + "prepaidTaxData":"/api/v1/prepaidTaxData/", + "shiftData":"/api/v1/shiftData/", + "settingData":"/api/v1/settingData/", + "createShiftBusinessReportAndRegisters":"/api/v1/createShiftBusinessReportAndRegisters/", + "isShiftActive":"/api/v1/isShiftActive/", + "updateRegisterAndBusinessReport":"/api/v1/updateRegisterAndBusinessReport/", + "auditLog":"/api/v1/auditLog/", + "assignAsOwner":"/api/v1/assignAsStoreOwner/", + "lotteryGameData":"/api/v1/lotteryGameData/", + "lotteryInventoryData":"/api/v1/lotteryInventoryData/", + "weeklyInvoiceSettlementData":"/api/v1/weeklyInvoiceSettlementData/", + "getBookMovement":"/api/v1/getBookMovement/", + "updateGameAndInventory":"/api/v1/updateGameAndInventory/", + "gasTypeData":"/api/v1/gasTypeData/", + "gasCompanyData":"/api/v1/gasCompanyData/", + "gasCommissionData":"/api/v1/gasCommissionData/", + "gasTaxData":"/api/v1/gasTaxData/", + "gasInvoiceData":"/api/v1/gasInvoiceData/", + "gasFreightData":"/api/v1/gasFreightData/", + "gasTaxChargeData":"/api/v1/gasTaxChargeData/", + "houseChargeData":"/api/v1/houseChargeData/", + "getValuesForInvoice":"/api/v1/getValuesForInvoice/", + "getShiftDataByDate":"/api/v1/getShiftDataByDate/", + "getShiftDataWithRole":"/api/v1/getShiftDataWithRole/", + "payrollSalaryData":"/api/v1/payrollSalaryData/", + "cashDropData":"/api/v1/cashDropData/", + "gasTypeReportData":"/api/v1/gasTypeReportData/", + "updateGasReport":"/api/v1/updateGasReport/", + "updateLotteryReport":"/api/v1/updateLotteryReport/", + "purchaseExpenseAndOtherBusinessData":"/api/v1/purchaseExpenseAndOtherBusinessData/", + "printDailyReport":"/api/v1/printDailyReport/", + "emailDailyReport":"/api/v1/emailDailyReport/", + "checkForGames":"/api/v1/checkForGames/", + "salesTax":"/api/v1/salesTax/", + "bankLedger":"/api/v1/bankLedger/", + "cashLedger":"/api/v1/cashLedger/", + "subscriptionsData":"/api/v1/subscriptionsData/", + "subscriptionEntryData":"/api/v1/subscriptionEntryData/", + "getSubscriptionsByStore":"/api/v1/getSubscriptionDataByStore/", + "paymentIntent":"/api/v1/paymentIntent/", + "purchaseSubscription":"/api/v1/purchaseSubscription/", + "dashboardChart": "/api/v1/dashboardChart/", + "dashboardCashBalance":"/api/v1/dashboardCashBalance/", + "gasReportData":"/api/v1/gasReportData/", + "bankCashAdjustmentData":"/api/v1/bankCashAdjustmentData/", + "getMyGames":"/api/v1/getMyGames/", + "dashboardExpense":"/api/v1/dashboardExpense/", + "getAllStoresOfUser":"/api/v1/getAllStoresOfUser/", + "getHistoricalReport":"/api/v1/getHistoricalReport/", + "selectStore":"/api/v1/selectStore/", + "additionalStore":"/api/v1/additionalStore/", + "remainingTime":"/api/v1/remainingTime/", + "createHistoricalReport":"/api/v1/createHistoricalReport/", + "getShiftForHistoricalReport":"/api/v1/getShiftForHistoricalReport/", + "createInvoiceAndPrepaidTax":"/api/v1/createInvoiceAndPrepaidTax/", + "deleteInvoice":"/api/v1/deleteInvoice/", + "editInvoice":"/api/v1/editInvoice/", + "expenseCalculation":"/api/v1/expenseCalculation/", + "purchaseCalculation":"/api/v1/purchaseCalculation/" + }, + "version": "1.0", + "debug": true, + "appName": "Ezhisab" +} diff --git a/src/config/header.json b/src/config/header.json new file mode 100644 index 0000000..7200c3b --- /dev/null +++ b/src/config/header.json @@ -0,0 +1,145 @@ +{ + "roleBased": false, + "menu": { + "common": [ + { + "title": "Home", + "url": "/", + "icon": "fa-house" + }, + { + "title": "Admin", + "url": "#", + "icon": "fa-gear", + "child": [ + { + "title": "User", + "url": "/user", + "icon": "fa-user" + }, + { + "title": "Kyc", + "url": "/kyc", + "icon": "fa-plus" + }, + { + "title": "Create New Invoice", + "url": "/create-new-invoice", + "icon": "fa-plus" + }, + { + "title": "Expense", + "url": "/expense", + "icon": "fa-plus" + }, + { + "title": "Payment", + "url": "/alogs", + "icon": "fa-file" + }, + { + "title": "Reports", + "url": "/alogs", + "icon": "fa-file" + }, + { + "title": "Accounting", + "url": "/alogs", + "icon": "fa-file" + }, + { + "title": "General ledger", + "url": "/alogs", + "icon": "fa-file" + }, + { + "title": "Lottery AManagement", + "url": "/alogs", + "icon": "fa-file" + }, + { + "title": "Role", + "url": "/aroles", + "icon": "fa-secure" + } + + ] + } + ], + "superuser": [ + { + "title": "Dashboard", + "url": "/admin/dashboard", + "icon": "fa-tachometer-alt", + "child": [ + { + "title": "Database", + "url": "/admin/database", + "icon": "fa-database" + } + ] + }, + { + "title": "User Management", + "url": "/admin/users", + "icon": "fa-user", + "child": [ + { + "title": "Database", + "url": "/admin/database", + "icon": "fa-database", + "child": [ + { + "title": "Nested Database", + "url": "/admin/database/nested", + "icon": "fa-database" + } + ] + } + ] + } + ], + "company user": [ + { + "title": "Reports", + "url": "/api-manager-starter/", + "icon": "fa-chart-line" + }, + { + "title": "Settings", + "url": "/backoffice/settings", + "icon": "fa-cogs" + } + ] + }, + "topBar": { + "icon": "fa-gear", + "notification": { + "active": false, + "icon": "fa-bell" + }, + "search": { + "active": false, + "icon": "fa-search", + "iconStyle": "", + "style": { + "height": "45px", + "border": "2px solid white", + "width": "300px", + "borderRadius": "10px" + } + }, + "menu": [ + { + "title": "Change Password", + "url": "/ausers", + "icon": "fa-lock" + }, + { + "title": "Signout", + "url": "logout", + "icon": "fa-power-off" + } + ] + } +} \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..6338704 --- /dev/null +++ b/src/index.js @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + +); + diff --git a/src/utils/api-manager/.gitignore b/src/utils/api-manager/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/src/utils/api-manager/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/src/utils/api-manager/APIManager copy.js b/src/utils/api-manager/APIManager copy.js new file mode 100644 index 0000000..3b0bc9f --- /dev/null +++ b/src/utils/api-manager/APIManager copy.js @@ -0,0 +1,432 @@ +import React, { useEffect, useState, useContext } from "react"; +import { useNavigate } from "react-router-dom"; +import { toast } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; +import Swal from "sweetalert2"; +import useAPIManager from "./Helper/useAPIManager"; +import AuthContext from "../../utils/secure-route/AuthContext"; +import MoreVertIcon from "@mui/icons-material/MoreVert"; +import Pagination from "./Common/Pagination"; +import loader from "./Assets/img/loader.gif"; +import global from "../../config/Global.json"; +import { colorInvoiceData } from '../../components/Pages/AppPAges/Dashboard/Invoice/invoicedatacolor'; + +function APIManager(props) { + let { authToken } = useContext(AuthContext); + const dataSchema = props.data; + const globalConfig = global; + const token = authToken; + const { Get, Delete, Patch, getAPI, getHost } = useAPIManager( + globalConfig, + token + ); + const dataApi = getAPI(props.data.api); + const [apiData, setApiData] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const [orderBy, setOrderBy] = useState(""); // Column to sort + const [order, setOrder] = useState("asc"); + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(50); + const [sortedColumn, setSortedColumn] = useState(null); + const [filteredData, setFilteredData] = useState([]); + const [anchorEl, setAnchorEl] = useState(null); // Single anchor element for dropdown + const [selectedRowIndex, setSelectedRowIndex] = useState(null); // Index of the selected row + const [mounted, setMounted] = useState(false); + const [nextPage, setNextPage] = useState(null); + const [previousPage, setPreviousPage] = useState(null); + const [totalCount, setTotalCount] = useState(0); + const [currentPage, setCurrentPage] = useState(1); + const [loading, setLoading] = useState(true); + const [activeFilter, setActiveFilter] = useState('all'); + const [filterCounts, setFilterCounts] = useState({}); + + let navigate = useNavigate(); + + const getFilterQuery = (filter) => { + return filter !== 'all' ? `?status=${filter}` : ''; + }; + + const getData = async () => { + await makeApiRequest(dataApi); + await fetchFilterCounts(); + }; + + const fetchFilterCounts = async () => { + try { + const counts = {}; + for (const filter of dataSchema.filterBtns) { + const result = await Get(`${dataApi}${getFilterQuery(filter.key)}`); + counts[filter.key] = result.count; + } + setFilterCounts(counts); + } catch (err) { + toast.error("Error fetching filter counts"); + } + }; + + const handleEdit = (data) => { + // Implement your edit functionality here + console.log("Edit:", data); + handleMenuClose(); + }; + + const handleDelete = async (data) => { + handleMenuClose(); + const result = await Swal.fire({ + title: "Data will be removed permanently! Are you sure?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Yes, delete it!", + }); + + if (result.isConfirmed) { + try { + await Delete(dataApi, data["id"]); + toast.success("Record deleted successfully!"); + getData(); + } catch (err) { + getData(); + toast.error(err.message || "Error"); + } + } + }; + + const makeApiRequest = async (api) => { + try { + const result = await Get(`${api}${getFilterQuery(activeFilter)}`); + setNextPage(result.next); + setPreviousPage(result.previous); + setTotalCount(result.count); + setApiData(result.results); + setFilteredData(result.results); + } catch (err) { + if (err.code === "ERR_BAD_REQUEST") { + toast.error("Unauthorized access to page. Contact admin for access."); + navigate("/"); + } else { + toast.error(err.message); + } + } finally { + setLoading(false); + } + }; + + const pageChangeRequest = (url) => { + if (getPageUrl(url) != null) { + makeApiRequest(getHost() + getPageUrl(url)); + } + }; + + async function softDelete(data) { + try { + await Patch(dataApi, data["id"], { is_deleted: true }); + toast.success("Record updated successfully!"); + getData(); + } catch (err) { + getData(); + toast.error(err.message || "Error"); + } + } + + async function restore(data) { + try { + await Patch(dataApi, data["id"], { is_deleted: false }); + toast.success("Record updated successfully!"); + getData(); + } catch (err) { + getData(); + toast.error(err.message || "Error"); + } + } + + async function forceDelete(data) { + handleMenuClose(); + const result = await Swal.fire({ + title: "Data will be removed permanently! Are you sure?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Yes, delete it!", + }); + + if (result.isConfirmed) { + try { + await Delete(dataApi, data["id"]); + toast.success("Record deleted successfully!"); + getData(); + } catch (err) { + getData(); + toast.error(err.message || "Error"); + } + } + } + + function getPageUrl(url) { + try { + const urlObject = new URL(url); + return urlObject.pathname + urlObject.search; + } catch { + return null; + } + } + + useEffect(() => { + setMounted(true); + return () => { + setMounted(false); + }; + }, []); + + useEffect(() => { + if (mounted) { + getData(); + } + }, [mounted, activeFilter]); + + const handleSearchInputChange = (event) => { + const query = event.target.value; + setSearchQuery(query); + makeApiRequest(`${dataApi}?search=${query}`); + }; + + const handleSort = (columnKey) => { + const isAsc = orderBy === columnKey && order === "asc"; + setOrderBy(columnKey); + setOrder(isAsc ? "desc" : "asc"); + setSortedColumn(columnKey); + }; + + const handleFilterChange = (filterValue) => { + setActiveFilter(filterValue); + }; + + const getValueFromUrl = (url, parameterName) => { + try { + const regex = new RegExp(`${parameterName}=([^&]+)`); + const match = url.match(regex); + return match ? match[1] : null; + } catch { + return null; + } + }; + + const sortedData = stableSort(filteredData, getComparator(order, orderBy)); + const visibleRows = sortedData.slice( + page * rowsPerPage, + page * rowsPerPage + rowsPerPage + ); + + function stableSort(array, comparator) { + const stabilizedThis = array.map((el, index) => [el, index]); + stabilizedThis.sort((a, b) => { + const order = comparator(a[0], b[0]); + if (order !== 0) return order; + return a[1] - b[1]; + }); + return stabilizedThis.map((el) => el[0]); + } + + function getComparator(order, orderBy) { + return order === "desc" + ? (a, b) => descendingComparator(a, b, orderBy) + : (a, b) => -descendingComparator(a, b, orderBy); + } + + function descendingComparator(a, b, orderBy) { + if (b[orderBy] < a[orderBy]) { + return -1; + } + if (b[orderBy] > a[orderBy]) { + return 1; + } + return 0; + } + + const handleMenuClick = (event, index) => { + setAnchorEl(event.currentTarget); + setSelectedRowIndex(index); + }; + + const handleMenuClose = () => { + setAnchorEl(null); + setSelectedRowIndex(null); + }; + + return ( + <> + {loading ? ( +
    + Loading +
    + ) : ( +
    +
    +
    +
    +
    + + + + + +
    +
    + {dataSchema.filterBtns.map((filter, index) => ( + + ))} +
    +
    +
    +
    +
    + + + + {dataSchema.showField.map((th, index) => { + const isSorted = orderBy === th.key; + const isAsc = orderBy === th.key && order === "asc"; + const isLast = index === dataSchema.showField.length - 1; + return ( + + ); + })} + {props.editRequired && } + + + + + {visibleRows.map((data, rowIndex) => { + const coloredData = colorInvoiceData(data, dataSchema); + return ( + + {dataSchema.showField.map((field, i) => { + const cellData = coloredData[field.key]; + + return ( + + + ); + })} + + {props.editRequired && ( + + )} + + ); + })} + + +
    handleSort(th.key)} + style={{ cursor: "pointer" }} + className={isLast ? "last-header" : "header-cell"} + > + {th.label} {isSorted && (isAsc ? "â–²" : "â–¼")} + Actions
    + {cellData?.color !== 'inherit' || cellData?.backgroundColor !== 'transparent' ? ( +
    + {cellData?.value || ''} +
    + ) : ( + cellData?.value || '' + )} +
    +
    + +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    + +
    +
    + )} + + ); +} + +export default APIManager; diff --git a/src/utils/api-manager/APIManager.js b/src/utils/api-manager/APIManager.js new file mode 100644 index 0000000..abbbb32 --- /dev/null +++ b/src/utils/api-manager/APIManager.js @@ -0,0 +1,611 @@ +import React, { useEffect, useState, useContext } from "react"; +import { useNavigate } from "react-router-dom"; +import { toast } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; +import Swal from "sweetalert2"; +import useAPIManager from "./Helper/useAPIManager"; +import AuthContext from "../../utils/secure-route/AuthContext"; +import MoreVertIcon from "@mui/icons-material/MoreVert"; +import Pagination from "./Common/Pagination"; +import loader from "./Assets/img/loader.gif"; +import global from "../../config/Global.json"; +import { colorInvoiceData } from "../../components/Pages/AppPAges/Dashboard/Invoice/invoicedatacolor"; +function APIManager(props) { + let { authToken } = useContext(AuthContext); + const dataSchema = props.data; + const globalConfig = global; + const token = authToken; + const { Get, Delete, Patch, getAPI, getHost } = useAPIManager( + globalConfig, + token + ); + const dataApi = getAPI(props.data.api); + const [apiData, setApiData] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const [orderBy, setOrderBy] = useState(""); // Column to sort + const [order, setOrder] = useState("asc"); + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(50); + const [sortedColumn, setSortedColumn] = useState(null); + const [filteredData, setFilteredData] = useState([]); + const [anchorEl, setAnchorEl] = useState(null); // Single anchor element for dropdown + const [selectedRowIndex, setSelectedRowIndex] = useState(null); // Index of the selected row + const [mounted, setMounted] = useState(false); + const [nextPage, setNextPage] = useState(null); + const [previousPage, setPreviousPage] = useState(null); + const [totalCount, setTotalCount] = useState(0); + const [currentPage, setCurrentPage] = useState(1); + const [loading, setLoading] = useState(true); + const [activeFilter, setActiveFilter] = useState("all"); + const [filterCounts, setFilterCounts] = useState({}); + let navigate = useNavigate(); + const [isOpen, setIsOpen] = useState(false); + const toggleDropdown = () => { + setIsOpen((prev) => !prev); + }; + const getFilterQuery = (filter) => { + return filter !== "all" ? `?status=${filter}` : ""; + }; + const getData = async () => { + await makeApiRequest(dataApi); + await fetchFilterCounts(); + }; + const fetchFilterCounts = async () => { + try { + const counts = {}; + for (const filter of dataSchema.filterBtns) { + const result = await Get(`${dataApi}${getFilterQuery(filter.key)}`); + counts[filter.key] = result.count; + } + setFilterCounts(counts); + } catch (err) { + toast.error("Error fetching filter counts"); + } + }; + const handleEdit = (data) => { + // Implement your edit functionality here + console.log("Edit:", data); + handleMenuClose(); + }; + const handleDelete = async (data) => { + handleMenuClose(); + const result = await Swal.fire({ + title: "Data will be removed permanently! Are you sure?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Yes, delete it!", + }); + if (result.isConfirmed) { + try { + await Delete(dataApi, data["id"]); + toast.success("Record deleted successfully!"); + getData(); + } catch (err) { + getData(); + toast.error(err.message || "Error"); + } + } + }; + const makeApiRequest = async (api) => { + try { + const result = await Get(`${api}${getFilterQuery(activeFilter)}`); + setNextPage(result.next); + setPreviousPage(result.previous); + setTotalCount(result.count); + setApiData(result.results); + setFilteredData(result.results); + } catch (err) { + if (err.code === "ERR_BAD_REQUEST") { + toast.error("Unauthorized access to page. Contact admin for access."); + navigate("/"); + } else { + toast.error(err.message); + } + } finally { + setLoading(false); + } + }; + const pageChangeRequest = (url) => { + if (getPageUrl(url) != null) { + makeApiRequest(getHost() + getPageUrl(url)); + } + }; + async function softDelete(data) { + try { + await Patch(dataApi, data["id"], { is_deleted: true }); + toast.success("Record updated successfully!"); + getData(); + } catch (err) { + getData(); + toast.error(err.message || "Error"); + } + } + async function restore(data) { + try { + await Patch(dataApi, data["id"], { is_deleted: false }); + toast.success("Record updated successfully!"); + getData(); + } catch (err) { + getData(); + toast.error(err.message || "Error"); + } + } + async function forceDelete(data) { + handleMenuClose(); + const result = await Swal.fire({ + title: "Data will be removed permanently! Are you sure?", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + confirmButtonText: "Yes, delete it!", + }); + if (result.isConfirmed) { + try { + await Delete(dataApi, data["id"]); + toast.success("Record deleted successfully!"); + getData(); + } catch (err) { + getData(); + toast.error(err.message || "Error"); + } + } + } + function getPageUrl(url) { + try { + const urlObject = new URL(url); + return urlObject.pathname + urlObject.search; + } catch { + return null; + } + } + useEffect(() => { + setMounted(true); + return () => { + setMounted(false); + }; + }, []); + useEffect(() => { + if (mounted) { + getData(); + } + }, [mounted, activeFilter]); + const handleSearchInputChange = (event) => { + const query = event.target.value; + setSearchQuery(query); + makeApiRequest(`${dataApi}?search=${query}`); + }; + const handleSort = (columnKey) => { + const isAsc = orderBy === columnKey && order === "asc"; + setOrderBy(columnKey); + setOrder(isAsc ? "desc" : "asc"); + setSortedColumn(columnKey); + }; + const handleFilterChange = (filterValue) => { + setActiveFilter(filterValue); + }; + const getValueFromUrl = (url, parameterName) => { + try { + const regex = new RegExp(`${parameterName}=([^&]+)`); + const match = url.match(regex); + return match ? match[1] : null; + } catch { + return null; + } + }; + const sortedData = stableSort(filteredData, getComparator(order, orderBy)); + const visibleRows = sortedData.slice( + page * rowsPerPage, + page * rowsPerPage + rowsPerPage + ); + function stableSort(array, comparator) { + const stabilizedThis = array.map((el, index) => [el, index]); + stabilizedThis.sort((a, b) => { + const order = comparator(a[0], b[0]); + if (order !== 0) return order; + return a[1] - b[1]; + }); + return stabilizedThis.map((el) => el[0]); + } + function getComparator(order, orderBy) { + return order === "desc" + ? (a, b) => descendingComparator(a, b, orderBy) + : (a, b) => -descendingComparator(a, b, orderBy); + } + function descendingComparator(a, b, orderBy) { + if (b[orderBy] < a[orderBy]) { + return -1; + } + if (b[orderBy] > a[orderBy]) { + return 1; + } + return 0; + } + const handleMenuClick = (event, index) => { + setAnchorEl(event.currentTarget); + setSelectedRowIndex(index); + }; + const handleMenuClose = () => { + setAnchorEl(null); + setSelectedRowIndex(null); + }; + return ( + <> + {loading ? ( +
    + Loading +
    + ) : ( +
    +
    +
    +
    +
    + + + + + +
    +
    + {dataSchema.filterBtns.map((filter, index) => ( + + ))} +
    +
    +
    +
    +
    +
    + + + + + + +
    Filter
    +
    + {isOpen && ( +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    Apply Filters
    +
    + )} +
    +
    +
    +
    + + + + {dataSchema.showField.map((th, index) => { + const isSorted = orderBy === th.key; + const isAsc = orderBy === th.key && order === "asc"; + const isLast = index === dataSchema.showField.length - 1; + return ( + + ); + })} + {props.editRequired && ( + + )} + + + + {visibleRows.map((data, rowIndex) => { + const coloredData = colorInvoiceData(data, dataSchema); + return ( + + {dataSchema.showField.map((field, i) => { + const cellData = coloredData[field.key]; + + return ( + + ); + })} + + {props.editRequired && ( + + )} + + ); + })} + +
    handleSort(th.key)} + style={{ cursor: "pointer" }} + className={isLast ? "last-header" : "header-cell"} + > + {th.label} {isSorted && (isAsc ? "â–²" : "â–¼")} + Actions
    + {cellData?.color !== "inherit" || + cellData?.backgroundColor !== "transparent" ? ( +
    + {cellData?.value || ""} +
    + ) : ( + cellData?.value || "" + )} +
    +
    + +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    + +
    +
    + )} + + ); +} +export default APIManager; diff --git a/src/utils/api-manager/Assets/img/loader.gif b/src/utils/api-manager/Assets/img/loader.gif new file mode 100644 index 0000000..aaac076 Binary files /dev/null and b/src/utils/api-manager/Assets/img/loader.gif differ diff --git a/src/utils/api-manager/Common/Pagination.js b/src/utils/api-manager/Common/Pagination.js new file mode 100644 index 0000000..d130e56 --- /dev/null +++ b/src/utils/api-manager/Common/Pagination.js @@ -0,0 +1,71 @@ +import React from "react"; + +function Pagination({ + nextPage, + previousPage, + makeApiRequest, + totalCount, + rowsPerPage, + currentPage, + setCurrentPage, + dataApi, +}) { + const totalPages = Math.ceil(totalCount / rowsPerPage); + + const generatePageNumbers = () => { + const pages = []; + const maxPages = totalPages < 3 ? totalPages : 3; // Ensure at least 3 pages if available + const currentPageIndex = currentPage; + + let startPage = Math.max(1, currentPageIndex - 1); + let endPage = Math.min(totalPages, startPage + maxPages - 1); + + if (endPage - startPage < maxPages - 1) { + startPage = Math.max(1, endPage - maxPages + 1); + } + + for (let i = startPage; i <= endPage; i++) { + pages.push(i); + } + + return pages; + }; + + const handlePageClick = (page) => { + setCurrentPage(page); + const apiPage = nextPage + ? `${nextPage.split("page=")[0]}page=${page}` + : `${dataApi}?page=${page}`; + makeApiRequest(apiPage); + }; + + return ( + + ); +} + +export default Pagination; diff --git a/src/utils/api-manager/Fields/HCheckbox.js b/src/utils/api-manager/Fields/HCheckbox.js new file mode 100644 index 0000000..d972117 --- /dev/null +++ b/src/utils/api-manager/Fields/HCheckbox.js @@ -0,0 +1,29 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const HCheckbox = (props) => { + return ( +
    + + +
    + ); +}; + +HCheckbox.propTypes = { + checked: PropTypes.bool.isRequired, + onChange: PropTypes.func.isRequired, + label: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, +}; + +export default HCheckbox; diff --git a/src/utils/api-manager/Fields/HGetField.js b/src/utils/api-manager/Fields/HGetField.js new file mode 100644 index 0000000..b7253a8 --- /dev/null +++ b/src/utils/api-manager/Fields/HGetField.js @@ -0,0 +1,365 @@ +import React, { useEffect, useState, useContext } from "react"; +import { FormHelperText } from "@mui/material"; +import { firstUpperCase, formatDate, validateField } from "../Helper/helper.js"; +import HTextField from "./HTextField.js"; +import HSelect from "./HSelect.js"; +import HCheckbox from "./HCheckbox.js"; +import AuthContext from "../../secure-route/AuthContext.js"; +import useApi from "../Helper/useApi.js"; +import HParentChildAutocomplete from "./HSelect/HParentChildAutocomplete.js"; +import HRadiobutton from "./HRadiobutton.js"; + +const HGetField = (props) => { + let { user } = useContext(AuthContext); + + const { getAPI } = useApi(); + + + const required = props.field.required; + const label = firstUpperCase(props.field.label); + let fieldLabel = required ? ( + + * {label} + + ) : ( + label + ); + + const type = props.field.type; + const prefixOptions = props.field.prefixOptions || []; // Default to an empty array + const varient = props.field.varient; + const placeholder = props.field.placeholder; + const defaultObj = props.field.defaultObj; + const dafaultValue = props.field.defaultValue + + ? props.field.defaultValue + : props.defaultValue; + const name = props.field.name; + + let optionKey = ""; + let searchApi = ""; + let searchOptionHook = ""; + + if (props.field.search) { + searchApi = props.field.search.api ? props.field.search.api : ""; + searchApi = searchApi.length > 0 ? getAPI(searchApi) : ""; + searchOptionHook = props.field.search.label ? props.field.search.label : ""; + optionKey = props.field.search.key ? props.field.search.key : "id"; + } + const [value, setValue] = useState(dafaultValue); + const [isChecked, setIsChecked] = useState(dafaultValue); + const [storageData, setStorageData] = useState([]); + + const [error, setError] = useState( + props.field.error ? props.field.error : "" + ); + const [blurred, setBlurred] = useState(false); + const [selectedPrefix, setSelectedPrefix] = useState(prefixOptions.length > 0 ? dafaultValue || prefixOptions[0].value : ""); // Safe initialization + + const handlePrefixChange = (e) => { + const newPrefix = e.target.value; + setSelectedPrefix(newPrefix); + setValue(""); // Clear the input when prefix changes + }; + + + useEffect(() => { + const storedData = localStorage.getItem("dynamicField"); + if (storedData) { + setStorageData(JSON.parse(storedData)); + } + }, []); + + const updateKey = (name, newKey, newLabel) => { + const newData = [...storageData]; + + const dataIndex = newData.findIndex((item) => item.name === name); + + if (dataIndex !== -1) { + newData[dataIndex].key = newKey; + newData[dataIndex].label = newLabel; + } else { + newData.push({ name, key: newKey, label: newLabel }); + } + + setStorageData(newData); + localStorage.setItem("dynamicField", JSON.stringify(newData)); + }; + let handleOnChange = (e) => { + setValue(e.target.value); + if (blurred) { + setError(validateField(e.target.value, type, label)); + } + }; + const handleChange = () => { + const newChecked = !isChecked; + setIsChecked(newChecked); + if (blurred) { + setError(validateField(newChecked, type, label)); + } + }; + + const handleRadioChange = (e) => { + setValue(e.target.value); + if (blurred) { + setError(validateField(e.target.value, type, label)); + } + }; + const handleaAutocompleteChange = (newValue, inputName) => { + try { + props.returnValue(newValue); + } catch (err) { } + setValue(newValue); + if (blurred) { + setError(validateField(newValue.target.value, type, label)); + } + }; + const handleBlur = (e) => { + setBlurred(true); + setError(validateField(value, type, label)); + setError( + validateField(type === "checkbox" ? isChecked : value, type, label) + ); + }; + + const handleFocus = () => { + setBlurred(false); + }; + + const renderError = () => { + const isValidationRequired = required || false; + if (isValidationRequired && error && blurred) { + return {error}; + } + return null; + }; + + + + switch (type) { + case "parent-child": + return + + case "select": + return ( + <> + { }} + variant={varient} + label={fieldLabel} + onBlur={handleBlur} + onFocus={handleFocus} + /> + {renderError()} + + ); + case "simple-select": + return ( + <> + + {renderError()} + + ); + case "radio": + return ( +
    + + {renderError()} +
    + ); + case "advance-select": + return ( +
    + + {renderError()} +
    + ); + + case "multi-select": + return ( +
    + + {renderError()} +
    + ); + case "checkbox": + return ( +
    + + {renderError()} +
    + ); + case "datetime-local": + return ( +
    + + {renderError()} +
    + ); + + case "prefix-input": + return ( +
    + {prefixOptions.length > 0 && ( +
    + + {/* Custom SVG Icon */} + + + +
    + )} + +
    + ); + + + + + case "auto": + let key = label.toLowerCase(); + let userId = user[key]; + return ( + + + + + ); + default: + return ( +
    + + {renderError()} +
    + ); + } +}; + +export default HGetField; diff --git a/src/utils/api-manager/Fields/HRadiobutton.js b/src/utils/api-manager/Fields/HRadiobutton.js new file mode 100644 index 0000000..68a7d08 --- /dev/null +++ b/src/utils/api-manager/Fields/HRadiobutton.js @@ -0,0 +1,41 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const HRadiobutton = ({ options, selectedValue, onChange, name , label}) => { + return ( +
    +

    {label}:

    + {options.map((option) => ( +
    + + +
    + ))} +
    + ); +}; + +HRadiobutton.propTypes = { + label: PropTypes.string.isRequired, + options: PropTypes.arrayOf( + PropTypes.shape({ + value: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + }) + ).isRequired, + selectedValue: PropTypes.string, + onChange: PropTypes.func.isRequired, + name: PropTypes.string.isRequired, +}; + +export default HRadiobutton; diff --git a/src/utils/api-manager/Fields/HSelect.js b/src/utils/api-manager/Fields/HSelect.js new file mode 100644 index 0000000..dcf8664 --- /dev/null +++ b/src/utils/api-manager/Fields/HSelect.js @@ -0,0 +1,87 @@ +import React, { useContext } from 'react'; +import HDynamicAutocomplete from './HSelect/HDynamicAutocomplete'; +import HMultiSelectAutocomplete from './HSelect/HMultiSelect'; +import AuthContext from '../../secure-route/AuthContext'; +import global from '../../../config/Global.json'; + +const HSelect = (props) => { + let { authToken } = useContext(AuthContext); + const globalConfig = global; + const token = authToken; + + switch (props.type) { + case "simple-select": + return ( + + ); + case "advance-select": + return ( + + ); + case "multi-select": + return ( + + ); + default: + return ( + {}} + label={props.label} + onBlur={props.onBlur} + onFocus={props.onFocus} + placeholder={props.placeholder} + + /> + ); + } +}; + +export default HSelect; diff --git a/src/utils/api-manager/Fields/HSelect/HAutocomplete.js b/src/utils/api-manager/Fields/HSelect/HAutocomplete.js new file mode 100644 index 0000000..b03951f --- /dev/null +++ b/src/utils/api-manager/Fields/HSelect/HAutocomplete.js @@ -0,0 +1,88 @@ +import React, { useState, useEffect} from 'react'; +import PropTypes from 'prop-types'; + +import Autocomplete from "@mui/material/Autocomplete"; +import CircularProgress from '@mui/material/CircularProgress'; +import useApi from '../../Helper/useApi'; + +const HAutocomplete = (props) => { +let { apiUrl, displayKey, valueKey, onValueChange, inputName, variant , label, sameAsSeen} = props; + const [options, setOptions] = useState([]); + const [loading, setLoading] = useState(false); + const [inputValue, setInputValue] = useState(''); + const [selectedOption, setSelectedOption] = useState(null); + + const {Get, getAPI} = useApi(); + + apiUrl = (props.parentChild)? getAPI(apiUrl) :apiUrl; + + useEffect( async () => { + setLoading(true); + await Get(apiUrl) + .then(response => { + setOptions(response.data); + }) + .catch(error => { + console.error('Error fetching data:', error); + }) + .finally(() => { + setLoading(false); + }); + }, [apiUrl]); + + const handleInputChange = (event, newValue) => { + setInputValue(newValue); + }; + + const handleOptionSelect = (event, newValue) => { + + setSelectedOption(newValue); + setInputValue(newValue ? newValue[displayKey] : ''); + onValueChange(newValue, inputName); // Pass the name attribute value along with the value + }; + + return ( + <> + option ? option[displayKey] : ''} + renderInput={(params) => ( + + {loading ? : null} + {params.InputProps.endAdornment} + + ), + }} + /> + + )} + + /> + + {(sameAsSeen)?:""} + + + ); +}; + +HAutocomplete.propTypes = { + apiUrl: PropTypes.string.isRequired, + displayKey: PropTypes.string.isRequired, + valueKey: PropTypes.string.isRequired, + onValueChange: PropTypes.func.isRequired, + inputName: PropTypes.string.isRequired, +}; + +export default HAutocomplete; diff --git a/src/utils/api-manager/Fields/HSelect/HDynamicAutocomplete.js b/src/utils/api-manager/Fields/HSelect/HDynamicAutocomplete.js new file mode 100644 index 0000000..202d286 --- /dev/null +++ b/src/utils/api-manager/Fields/HSelect/HDynamicAutocomplete.js @@ -0,0 +1,77 @@ +import React, { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import useApi from '../../Helper/useApi'; + +const HDynamicSelect = (props) => { + const { + apiUrl, + displayKey, + valueKey, + onValueChange, + inputName, + label, + sameAsSeen, + defaultObj, + placeholder // Added placeholder prop + } = props; + + const [options, setOptions] = useState([]); + const [selectedOption, setSelectedOption] = useState(defaultObj); + const { Get } = useApi(); + + useEffect(() => { + console.log(placeholder); + getSearchData(apiUrl); + }, [apiUrl]); + + const getSearchData = async (api) => { + try { + const response = await Get(api); + setOptions(Array.isArray(response.results) ? response.results : []); + } catch (error) { + console.error('Error fetching data:', error); + setOptions([]); // Reset options on error + } + }; + + const handleOptionSelect = (event) => { + const selectedValue = event.target.value; + const option = options.find(option => option[valueKey] === selectedValue); + setSelectedOption(option); + onValueChange(option, inputName); + }; + + return ( +
    + + + + {sameAsSeen && ( + + )} +
    + ); +}; + +HDynamicSelect.propTypes = { + apiUrl: PropTypes.string.isRequired, + displayKey: PropTypes.string.isRequired, + valueKey: PropTypes.string.isRequired, + onValueChange: PropTypes.func.isRequired, + inputName: PropTypes.string.isRequired, + placeholder: PropTypes.string, // Added placeholder prop type +}; + +export default HDynamicSelect; diff --git a/src/utils/api-manager/Fields/HSelect/HMultiSelect.js b/src/utils/api-manager/Fields/HSelect/HMultiSelect.js new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/api-manager/Fields/HSelect/HParentChildAutocomplete.js b/src/utils/api-manager/Fields/HSelect/HParentChildAutocomplete.js new file mode 100644 index 0000000..194197f --- /dev/null +++ b/src/utils/api-manager/Fields/HSelect/HParentChildAutocomplete.js @@ -0,0 +1,126 @@ +import React, { useState, useContext } from 'react'; +import HDynamicAutocomplete from './HDynamicAutocomplete'; +import HAutocomplete from './HAutocomplete'; +import AuthContext from '../../../secure-route/AuthContext'; +import global from '../../../../config/Global.json' +import useAPIManager from '../../Helper/useAPIManager'; +const HParentChildAutocomplete = (props) => { + // [ + // { + // "apiUrl": 'https://api.udaymotors.in/api/v1/user/', + // "displayKey": 'phone_no', + // "valueKey": 'id', + // "name": "user", + // "label":"User" + // }, + // { + // "apiUrl": 'https://api.udaymotors.in/api/v1/getInvestmentsByUserId/', + // "displayKey": 'investment_id', + // "valueKey": 'id', + // "name": "investment", + // "parent": "user", + // "parent_value_key": "id", + // "label":"Investments" + // }, + // { + // "apiUrl": 'https://api.udaymotors.in/api/v1/transaction/', + // "displayKey": 'description', + // "name": "transaction", + // "valueKey": 'id', + // "parent": "investment", + // "parent_value_key": "user_id", + // "label":"Transactions" + // }, + // ] + let { authToken, user } = useContext(AuthContext); + const globalConfig = global; + const token = authToken; + const { Get, Post, getAPI } = useAPIManager(globalConfig, token); + + const [selectedValues, setSelectedValues] = useState([]); + const [currentFieldIndex, setCurrentFieldIndex] = useState(0); + const [fields, setFields] = useState(props.fields); + + const handleValueChange = (value, name) => { + const updatedValues = [...selectedValues]; + const existingIndex = updatedValues.findIndex(item => item.name === name); + if (existingIndex !== -1) { + updatedValues[existingIndex] = { value, name }; + } else { + updatedValues.push({ value, name }); + } + + setSelectedValues(updatedValues); + + // Update the API URL of the next field + const nextFieldIndex = currentFieldIndex + 1; + if (nextFieldIndex < fields.length) { + const nextField = fields[nextFieldIndex]; + const parentValue = updatedValues.find(item => item.name === nextField.parent)?.value[nextField.parent_value_key]; + if (parentValue) { + const updatedFields = [...fields]; + + let newUrl = getAPI(nextField.apiUrl); + updatedFields[nextFieldIndex] = { + ...nextField, + apiUrl: `${newUrl}${parentValue}/` + }; + setFields(updatedFields); + } + } + setCurrentFieldIndex(nextFieldIndex); + }; + + const handleParentValueChange = (parentName, parentValue) => { + // Find the index of the parent field + const parentFieldIndex = fields.findIndex(field => field.name === parentName); + + // Reset the selected values and fields configurations for the subsequent fields + setSelectedValues(selectedValues.slice(0, parentFieldIndex + 1)); + setFields(fields.slice(0, parentFieldIndex + 1)); + setCurrentFieldIndex(parentFieldIndex); + }; + + return ( + fields.slice(0, currentFieldIndex + 1).map((field, index) => ( + <> +
    + { + (field.advance) ? + + + : + } + +
    + + + + )) + ); +} + +export default HParentChildAutocomplete; diff --git a/src/utils/api-manager/Fields/HTextField.js b/src/utils/api-manager/Fields/HTextField.js new file mode 100644 index 0000000..3112104 --- /dev/null +++ b/src/utils/api-manager/Fields/HTextField.js @@ -0,0 +1,87 @@ +import React, { useRef, useState } from 'react'; + +const HTextField = (props) => { + const dateInputRef = useRef(null); + const [displayValue, setDisplayValue] = useState(props.value || ''); + + const handleIconClick = () => { + if (props.type === "date" && dateInputRef.current) { + dateInputRef.current.showPicker(); + } + }; + + const handleChange = (event) => { + const { value } = event.target; + setDisplayValue(value); + if (props.onChange) { + props.onChange(event); // Call parent's onChange if provided + } + }; + + return ( +
    + + {props.type === "date" ? ( + <> + + + + + + {!displayValue && ( + + {props.placeholder} {/* Show placeholder only if no date is selected */} + + )} + {displayValue && ( + + {new Date(displayValue).toLocaleDateString()} {/* Format the date as needed */} + + )} + + ) : ( +
    + +
    + )} +
    + ); +}; + +export default HTextField; diff --git a/src/utils/api-manager/Forms/Form copy.js b/src/utils/api-manager/Forms/Form copy.js new file mode 100644 index 0000000..9ed89a8 --- /dev/null +++ b/src/utils/api-manager/Forms/Form copy.js @@ -0,0 +1,526 @@ +import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { toast } from "react-toastify"; +import useApi from "../Helper/useApi"; +import HGetField from "../Fields/HGetField"; +import { validateField } from "../Helper/helper"; +import { FilterIcon, CalendarFromIcon, CalendarToIcon } from './SvgIcons'; + + +const Form = (props) => { + const [invoices, setInvoices] = useState([ + { id: 1, vendor_customer_name: "Vendor A", payment_method: "Credit Card", invoice_no: "INV001", date: "2024-01-01", status: "Paid", amount: 150.00 }, + { id: 2, vendor_customer_name: "Vendor B", payment_method: "Bank Transfer", invoice_no: "INV002", date: "2024-02-15", status: "Pending", amount: 200.00 }, + { id: 3, vendor_customer_name: "Vendor C", payment_method: "Cash", invoice_no: "INV003", date: "2024-03-10", status: "Overdue", amount: 300.00 }, + { id: 4, vendor_customer_name: "Customer D", payment_method: "Check", invoice_no: "INV004", date: "2024-04-20", status: "Paid", amount: 250.00 }, + { id: 5, vendor_customer_name: "Vendor E", payment_method: "PayPal", invoice_no: "INV005", date: "2024-05-30", status: "Pending", amount: 100.00 }, + ]); + + const [currentPage, setCurrentPage] = useState(1); + const invoicesPerPage = 3; + const [selectedStatus, setSelectedStatus] = useState("All Invoice"); + const [searchQuery, setSearchQuery] = useState(""); + const [isOpen, setIsOpen] = useState(false); + + const toggleDropdown = () => { + setIsOpen((prev) => !prev); + }; + + const totalPages = Math.ceil(invoices.length / invoicesPerPage); + + const handleDelete = (id) => { + const updatedInvoices = invoices.filter(invoice => invoice.id !== id); + setInvoices(updatedInvoices); + toast.success("Invoice deleted successfully!"); + }; + + const handlePageChange = (page) => { + setCurrentPage(page); + }; + + const filteredInvoices = invoices.filter(invoice => { + const matchesStatus = selectedStatus === "All Invoice" || invoice.status === selectedStatus.replace(/_/g, ' '); + const matchesSearch = invoice.invoice_no.toLowerCase().includes(searchQuery.toLowerCase()); + return matchesStatus && matchesSearch; + }); + + const currentInvoices = filteredInvoices.slice((currentPage - 1) * invoicesPerPage, currentPage * invoicesPerPage); + + const { inputFields, data, submitBtnTitle, closeHandler, handleChange } = props; + const fieldDefault = data || {}; + const [multiSelect, setMultiSelect] = useState([]); + const [selectedPage, setSelectedPage] = useState('Add Bill/Invoice'); + const { Patch, Post, Get } = useApi(); + const [formAction, setFormAction] = useState(null); + const navigate = useNavigate(); + + async function handleSubmit(e) { + e.preventDefault(); + if (formAction !== 'save') return; + + let isFormValid = true; + const newExternalErrors = {}; + + inputFields.forEach((field) => { + const fieldName = field.name; + const element = e.target.elements[fieldName]; + + if (element) { + let value = element.value; + if (field.type === "multi-select") { + setMultiSelect((prevData) => [...prevData, fieldName]); + } + + if (field.required) { + const validationError = validateField(value, field.type, field.label); + if (validationError) { + newExternalErrors[fieldName] = validationError; + toast.error(validationError); + isFormValid = false; + } + } + } else { + console.warn(`Element for field ${fieldName} not found`); + } + }); + + if (!isFormValid) { + return; + } + + const formData = new FormData(e.target); + let formPayload = Object.fromEntries(formData.entries()); + + multiSelect.forEach((f) => { + if (formPayload[f]) { + formPayload[f] = JSON.parse(formPayload[f]); + } + }); + + try { + if (fieldDefault["id"]) { + await Patch(props.api, fieldDefault["id"], formPayload); + toast.success("Record updated successfully!"); + } else { + await Post(props.api, formPayload); + toast.success("Record created successfully!"); + } + closeHandler(); + props.refreshData(); + } catch (err) { + toast.error(err.response?.data?.error || "Something went wrong"); + } + } + + const handleCancel = () => { + if (closeHandler) { + closeHandler(); + } + }; + + const handleNavigation = (path, pageName) => { + setSelectedPage(pageName); + navigate(path); + }; + + const handleButtonClick = (action) => { + setFormAction(action); + if (action === 'save') { + document.querySelector('form').requestSubmit(); + } else if (action === 'cancel') { + handleCancel(); + } + }; + + const rows = inputFields.reduce((acc, field) => { + const row = field.row || 1; + if (!acc[row]) acc[row] = []; + acc[row].push(field); + return acc; + }, {}); + + const createFormRows = () => { + return Object.keys(rows).map((rowKey) => { + const rowFields = rows[rowKey]; + return ( +
    + {rowFields.map((field, index) => { + const fieldName = field.name; + const colClass = field.column || 'col-12'; + return ( +
    + +
    + ); + })} +
    + ); + }); + }; + + const handleSearchChange = (e) => { + setSearchQuery(e.target.value); + }; + + const statusStyles = { + All_Invoice: { color: '#4545DB' }, + Paid: { color: 'green' }, + Pending: { color: 'orange' }, + Overdue: { color: 'red' }, + }; + + const paymentMethodStyles = { + "Credit Card": { color: 'blue' }, + "Bank Transfer": { color: 'green' }, + "Cash": { color: 'brown' }, + "Check": { color: 'purple' }, + "PayPal": { color: 'orange' }, + }; + + const handleFilter = (status) => { + setSelectedStatus(status); + setCurrentPage(1); + }; + + return ( +
    +
    +
    +
    + +
    + + +
    +
    + {createFormRows()} +
    +
    + +
    +
    +
    +
    +
    + + + + + + + +
    + +
    +
    +
    + {["All_Invoice", "Paid", "Draft"].map((status, index) => { + const count = + status === "All_Invoice" + ? filteredInvoices.length + : filteredInvoices.filter((invoice) => invoice.status === status).length; + + const isSelected = selectedStatus === status; + + return ( +
    +
    + + + {count} + +
    +
    + ); + })} +
    +
    + +
    +
    +
    + + +
    Filter
    +
    + {isOpen && ( +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    + )} +
    +
    +
    +
    + + + + + + + + + + + + + + + + {currentInvoices.map((invoice, index) => ( + + + + + + + + + + + ))} + +
    DateInvoice NoVendor/Customer NamePayment MethodAmountStatusAction
    {invoice.date}{invoice.invoice_no}{invoice.vendor_customer_name} +
    + {invoice.payment_method} +
    +
    ${invoice.amount} +
    + {invoice.status} +
    +
    +
    + +
      +
    • + +
    • +
    • + +
    • +
    +
    + +
    + + +
    +
    +
    +
    + ); +}; + +export default Form; diff --git a/src/utils/api-manager/Forms/Form.js b/src/utils/api-manager/Forms/Form.js new file mode 100644 index 0000000..a7a54c0 --- /dev/null +++ b/src/utils/api-manager/Forms/Form.js @@ -0,0 +1,525 @@ +import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { toast } from "react-toastify"; +import useApi from "../Helper/useApi"; +import HGetField from "../Fields/HGetField"; +import { validateField } from "../Helper/helper"; +import { FilterIcon, CalendarFromIcon, CalendarToIcon } from './SvgIcons'; + + +const Form = (props) => { + const [invoices, setInvoices] = useState([ + { id: 1, vendor_customer_name: "Vendor A", payment_method: "Credit Card", invoice_no: "INV001", date: "2024-01-01", status: "Paid", amount: 150.00 }, + { id: 2, vendor_customer_name: "Vendor B", payment_method: "Bank Transfer", invoice_no: "INV002", date: "2024-02-15", status: "Pending", amount: 200.00 }, + { id: 3, vendor_customer_name: "Vendor C", payment_method: "Cash", invoice_no: "INV003", date: "2024-03-10", status: "Overdue", amount: 300.00 }, + { id: 4, vendor_customer_name: "Customer D", payment_method: "Check", invoice_no: "INV004", date: "2024-04-20", status: "Paid", amount: 250.00 }, + { id: 5, vendor_customer_name: "Vendor E", payment_method: "PayPal", invoice_no: "INV005", date: "2024-05-30", status: "Pending", amount: 100.00 }, + ]); + + const [currentPage, setCurrentPage] = useState(1); + const invoicesPerPage = 3; + const [selectedStatus, setSelectedStatus] = useState("All Invoice"); + const [searchQuery, setSearchQuery] = useState(""); + const [isOpen, setIsOpen] = useState(false); + + const toggleDropdown = () => { + setIsOpen((prev) => !prev); + }; + + const totalPages = Math.ceil(invoices.length / invoicesPerPage); + + const handleDelete = (id) => { + const updatedInvoices = invoices.filter(invoice => invoice.id !== id); + setInvoices(updatedInvoices); + toast.success("Invoice deleted successfully!"); + }; + + const handlePageChange = (page) => { + setCurrentPage(page); + }; + + const filteredInvoices = invoices.filter(invoice => { + const matchesStatus = selectedStatus === "All Invoice" || invoice.status === selectedStatus.replace(/_/g, ' '); + const matchesSearch = invoice.invoice_no.toLowerCase().includes(searchQuery.toLowerCase()); + return matchesStatus && matchesSearch; + }); + + const currentInvoices = filteredInvoices.slice((currentPage - 1) * invoicesPerPage, currentPage * invoicesPerPage); + + const { inputFields, data, submitBtnTitle, closeHandler, handleChange } = props; + const fieldDefault = data || {}; + const [multiSelect, setMultiSelect] = useState([]); + const [selectedPage, setSelectedPage] = useState('Add Bill/Invoice'); + const { Patch, Post, Get } = useApi(); + const [formAction, setFormAction] = useState(null); + const navigate = useNavigate(); + + async function handleSubmit(e) { + e.preventDefault(); + if (formAction !== 'save') return; + + let isFormValid = true; + const newExternalErrors = {}; + + inputFields.forEach((field) => { + const fieldName = field.name; + const element = e.target.elements[fieldName]; + + if (element) { + let value = element.value; + if (field.type === "multi-select") { + setMultiSelect((prevData) => [...prevData, fieldName]); + } + + if (field.required) { + const validationError = validateField(value, field.type, field.label); + if (validationError) { + newExternalErrors[fieldName] = validationError; + toast.error(validationError); + isFormValid = false; + } + } + } else { + console.warn(`Element for field ${fieldName} not found`); + } + }); + + if (!isFormValid) { + return; + } + + const formData = new FormData(e.target); + let formPayload = Object.fromEntries(formData.entries()); + + multiSelect.forEach((f) => { + if (formPayload[f]) { + formPayload[f] = JSON.parse(formPayload[f]); + } + }); + + try { + if (fieldDefault["id"]) { + await Patch(props.api, fieldDefault["id"], formPayload); + toast.success("Record updated successfully!"); + } else { + await Post(props.api, formPayload); + toast.success("Record created successfully!"); + } + closeHandler(); + props.refreshData(); + } catch (err) { + toast.error(err.response?.data?.error || "Something went wrong"); + } + } + + const handleCancel = () => { + if (closeHandler) { + closeHandler(); + } + }; + + const handleNavigation = (path, pageName) => { + setSelectedPage(pageName); + navigate(path); + }; + + const handleButtonClick = (action) => { + setFormAction(action); + if (action === 'save') { + document.querySelector('form').requestSubmit(); + } else if (action === 'cancel') { + handleCancel(); + } + }; + + const rows = inputFields.reduce((acc, field) => { + const row = field.row || 1; + if (!acc[row]) acc[row] = []; + acc[row].push(field); + return acc; + }, {}); + + const createFormRows = () => { + return Object.keys(rows).map((rowKey) => { + const rowFields = rows[rowKey]; + return ( +
    + {rowFields.map((field, index) => { + const fieldName = field.name; + const colClass = field.column || 'col-12'; + return ( +
    + +
    + ); + })} +
    + ); + }); + }; + + const handleSearchChange = (e) => { + setSearchQuery(e.target.value); + }; + + const statusStyles = { + All_Invoice: { color: '#4545DB' }, + Paid: { color: 'green' }, + Pending: { color: 'orange' }, + Overdue: { color: 'red' }, + }; + + const paymentMethodStyles = { + "Credit Card": { color: 'blue' }, + "Bank Transfer": { color: 'green' }, + "Cash": { color: 'brown' }, + "Check": { color: 'purple' }, + "PayPal": { color: 'orange' }, + }; + + const handleFilter = (status) => { + setSelectedStatus(status); + setCurrentPage(1); + }; + + return ( +
    +
    +
    +
    + +
    + + +
    +
    + {createFormRows()} +
    +
    +
    +
    +
    +
    +
    + + + + + + + +
    + +
    +
    +
    + {["All_Invoice", "Paid", "Draft"].map((status, index) => { + const count = + status === "All_Invoice" + ? filteredInvoices.length + : filteredInvoices.filter((invoice) => invoice.status === status).length; + + const isSelected = selectedStatus === status; + + return ( +
    +
    + + + {count} + +
    +
    + ); + })} +
    +
    + +
    +
    +
    + + +
    Filter
    +
    + {isOpen && ( +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    + )} +
    +
    +
    +
    + + + + + + + + + + + + + + + + {currentInvoices.map((invoice, index) => ( + + + + + + + + + + + ))} + +
    DateInvoice NoVendor/Customer NamePayment MethodAmountStatusAction
    {invoice.date}{invoice.invoice_no}{invoice.vendor_customer_name} +
    + {invoice.payment_method} +
    +
    ${invoice.amount} +
    + {invoice.status} +
    +
    +
    + +
      +
    • + +
    • +
    • + +
    • +
    +
    + +
    + + +
    +
    +
    +
    + ); +}; + +export default Form; diff --git a/src/utils/api-manager/Forms/FormWithDrawer.js b/src/utils/api-manager/Forms/FormWithDrawer.js new file mode 100644 index 0000000..6a73f2d --- /dev/null +++ b/src/utils/api-manager/Forms/FormWithDrawer.js @@ -0,0 +1,76 @@ +import React from "react"; +import { Button } from "@mui/material"; +import Drawer from "@mui/material/Drawer"; +import Form from "./Form"; + +const FormWithDrawer = (props) => { + const [state, setState] = React.useState({ + top: false, + left: false, + bottom: false, + right: false, + }); + const toggleDrawer = (anchor, open) => (event) => { + if ( + event.type === "keydown" && + (event.key === "Tab" || event.key === "Shift") + ) { + return; + } + setState({ ...state, [anchor]: open }); + }; + + const anchor = props.anchor ? props.anchor : "right"; + const actionBtnName = props.actionBtnName; + const data = props.data; + const buttonVarient = props.buttonVarient ? props.buttonVarient : "contained"; + const updateFormTitle = props.updateFormTitle ? props.updateFormTitle : ""; + const createFormTitle = props.createFormTitle ? props.createFormTitle : ""; + const submitBtnTitle = props.submitBtnTitle ? props.submitBtnTitle : "Submit"; + const handleCloseDrawer = () => { + setState({ ...state, [anchor]: false }); + }; + + return ( + + + + +
    +
    +

    {createFormTitle}

    +

    {updateFormTitle}

    +
    +
    +
    props.refreshData()} + submitBtnTitle={submitBtnTitle} + inputFields={props.inputFields} + api={props.api} + data={data} + /> +
    +
    +
    +
    +
    + ); +}; + +export default FormWithDrawer; diff --git a/src/utils/api-manager/Forms/FormWithModal.js b/src/utils/api-manager/Forms/FormWithModal.js new file mode 100644 index 0000000..edcc023 --- /dev/null +++ b/src/utils/api-manager/Forms/FormWithModal.js @@ -0,0 +1,65 @@ +import React from 'react'; +import { Button } from '@mui/material'; +import Form from './Form'; + +const FormWithModal = (props) => { + const [show, setShow] = React.useState(false); + + const handleShow = () => setShow(true); + const handleClose = () => setShow(false); + + const actionBtnName = props.actionBtnName; + const data = props.data; + const buttonVarient = props.buttonVarient ? props.buttonVarient : 'contained'; + const updateFormTitle = props.updateFormTitle ? props.updateFormTitle : ''; + const createFormTitle = props.createFormTitle ? props.createFormTitle : ''; + const submitBtnTitle = props.submitBtnTitle ? props.submitBtnTitle : 'Submit'; + + return ( + + + + {/* Modal */} +
    +
    +
    +
    +
    {createFormTitle || updateFormTitle}
    + +
    +
    + +
    + {/*
    + + +
    */} +
    +
    +
    + + {/* Modal backdrop */} + {show &&
    } +
    + ); +}; + +export default FormWithModal; diff --git a/src/utils/api-manager/Forms/SvgIcons.js b/src/utils/api-manager/Forms/SvgIcons.js new file mode 100644 index 0000000..b889fe8 --- /dev/null +++ b/src/utils/api-manager/Forms/SvgIcons.js @@ -0,0 +1,400 @@ +import React from 'react'; + +export const FilterIcon = () => ( + + + + + + +); + +export const CalendarFromIcon = () => ( + + + + +); + +export const CalendarToIcon = () => ( + + + + +); + +export const DropdownArrowIcon = () => ( + + + + + +); + + +export const Email = () => ( + + + + +) +export const DeleteBlack = () => ( + + + + + + + +); + + +export const Delete = () => ( + + + + + + + +) + +export const LottoIcon = () => ( + + + + + + + + +) + +export const DropdownIcon = () => ( + + + + +); + +export const ReportIcon = () => ( + + + + + + + +); + +export const SearchIcon = () =>( + + + + +) + +export const PrevIcon = () =>( + + + +) + + +export const NextIcon = () => ( + + + + + +) + + +export const Clock = () => ( + + + + + + +) + + + +export const FilterButton = () => ( + + + + + + + + +) \ No newline at end of file diff --git a/src/utils/api-manager/Helper/helper.js b/src/utils/api-manager/Helper/helper.js new file mode 100644 index 0000000..2efdb03 --- /dev/null +++ b/src/utils/api-manager/Helper/helper.js @@ -0,0 +1,102 @@ +export function camelCase(str) { + // Using replace method with regEx + return str.replace(/(?:^\w|[A-Z]|\b\w)/g, function (word, index) { + return index === 0 ? word.toLowerCase() : word.toUpperCase(); + }).replace(/\s+/g, ''); +} +export function firstUpperCase(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} +export const validateEmail = (email) => { + const emailRegex = /^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}$/; + return emailRegex.test(email); +}; +export const validatePassword = (password) => { + return password.length >= 8; +}; + + +export const validateField = (value, type, label) => { + let errorMessage = ""; + if (label) { + switch (type) { + case "text": + if (!value) { + errorMessage = ` ${label} is required`; + } + break; + case "parent-child": + if (!value) { + errorMessage = ` ${label} is required`; + } + break; + case "select": + if (!value) { + errorMessage = ` ${label} Please Select Value`; + } + break; + case "simple-select": + if (!value) { + errorMessage = ` ${label} Please Select`; + } + break; + case "advance-select": + if (!value) { + errorMessage = ` ${label} Please Select`; + } + break; + case "datetime-local": + if (!value) { + errorMessage = `${label} Please Select `; + } + break; + case "checkbox": + if (!value) { + errorMessage = `${label} Must be Checked`; + } + break; + case "email": + if (!value || !validateEmail(value)) { + errorMessage = `${label} must be a valid email address`; + } + break; + case "password": + if (!value || !validatePassword(value)) { + errorMessage = `${label} must be at least 8 characters long`; + } + break; + case "phone": + if (!value || value.length !== 10) { + errorMessage = `${label} must be exactly 10 characters`; + } + break; + + case "multi-select": + if (Array.isArray(value)) { + value.forEach(val => { + if (typeof val === 'string') { + } + }); + } else if (typeof value === 'string') { + value.trim(); + } + break; + default: + if (!value || !value.trim()) { + errorMessage = `${label} Is Required`; + } + } + } + return errorMessage; +}; + + +export const formatDate = (inputDate) => { + const date = new Date(inputDate); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + const hours = String(date.getHours()).padStart(2, "0"); + const minutes = String(date.getMinutes()).padStart(2, "0"); + return `${year}-${month}-${day}T${hours}:${minutes}`; +} \ No newline at end of file diff --git a/src/utils/api-manager/Helper/useAPIManager.js b/src/utils/api-manager/Helper/useAPIManager.js new file mode 100644 index 0000000..3d9ffd5 --- /dev/null +++ b/src/utils/api-manager/Helper/useAPIManager.js @@ -0,0 +1,77 @@ +import axios from "axios"; + +const useAPIManager = (globalConfig, _token) => { + const authToken = _token; + const global = globalConfig; + + let token = authToken.access; + let authorization = _token + ? { + headers: { + Authorization: `Bearer ${token}`, + }, + } + : {}; + + const getAPI = (API_NAME) => global.api.host + global.api[API_NAME]; + + const getHost = () => global.api.host; + + const Post = async (api, payload) => { + let _api = getAPI(api).includes("undefined") ? api : getAPI(api); + try { + const response = await axios.post(_api, payload, authorization); + return response; + } catch (err) { + throw err; + } + }; + + const Put = async (api, id, payload) => { + let _api = getAPI(api).includes("undefined") ? api : getAPI(api); + try { + const response = await axios.put(`${_api}${id}/`, payload, authorization); + return response; + } catch (err) { + throw err; + } + }; + + const Patch = async (api, id, payload) => { + let _api = getAPI(api).includes("undefined") ? api : getAPI(api); + try { + const response = await axios.patch( + `${_api}${id}/`, + payload, + authorization + ); + return response; + } catch (err) { + throw err; + } + }; + + const Get = async (api) => { + let _api = getAPI(api).includes("undefined") ? api : getAPI(api); + try { + const response = await axios.get(_api, authorization); + return response.data; + } catch (err) { + throw err; + } + }; + + const Delete = async (api, id) => { + let _api = getAPI(api).includes("undefined") ? api : getAPI(api); + try { + const response = await axios.delete(`${_api}${id}/`, authorization); + return response; + } catch (err) { + throw err; + } + }; + + return { Post, Put, Patch, Get, Delete, getAPI, getHost }; +}; + +export default useAPIManager; diff --git a/src/utils/api-manager/Helper/useApi.js b/src/utils/api-manager/Helper/useApi.js new file mode 100644 index 0000000..5946d97 --- /dev/null +++ b/src/utils/api-manager/Helper/useApi.js @@ -0,0 +1,89 @@ +// useApi.js +import { useContext } from 'react'; +import axios from 'axios'; +import AuthContext from '../../secure-route/AuthContext'; +import global from '../../../config/Global.json'; + + +const useApi = () => { + const getAPI = (API_NAME) => global.api.host + global.api[API_NAME]; + + const getHost = () => global.api.host; + + const { authToken } = useContext(AuthContext); + let token = authToken.access; + + const Post = async (api, payload) => { + let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); + try { + const response = await axios.post(_api, payload, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return response; + } catch (err) { + throw err; + } + }; + + const Put = async (api, id, payload) => { + let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); + try { + const response = await axios.put(`${_api}${id}/`, payload, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return response; + } catch (err) { + throw err; + } + }; + + const Patch = async (api, id, payload) => { + let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); + try { + const response = await axios.patch(`${_api}${id}/`, payload, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return response; + } catch (err) { + throw err; + } + }; + + const Get = async (api) => { + let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); + try { + const response = await axios.get(_api, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return response.data; + } catch (err) { + throw err; + } + }; + + const Delete = async (api, id) => { + let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); + try { + const response = await axios.delete(`${_api}${id}/`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return response; + } catch (err) { + throw err; + } + }; + + return { Post, Put, Patch, Get, Delete, getAPI, getHost }; +}; + +export default useApi; diff --git a/src/utils/secure-route/AuthCheck.js b/src/utils/secure-route/AuthCheck.js new file mode 100644 index 0000000..4fbc0d4 --- /dev/null +++ b/src/utils/secure-route/AuthCheck.js @@ -0,0 +1,21 @@ +import { useContext } from "react"; +import React from "react"; +import AuthContext from "./AuthContext"; +import Login from "../../components/common/Login"; +import Header from "../../components/common/Header"; +export const Auth = (props) => { + let { user } = useContext(AuthContext); + return props.check ? ( + user.user_id ? ( + <> +
    + {props.component} + + ) : ( + + ) + ) : ( + props.component + ); +}; +export default Auth; diff --git a/src/utils/secure-route/AuthContext.js b/src/utils/secure-route/AuthContext.js new file mode 100644 index 0000000..8152666 --- /dev/null +++ b/src/utils/secure-route/AuthContext.js @@ -0,0 +1,160 @@ +import { createContext, useEffect, useState } from "react"; +import axios from "axios"; +import { toast, ToastContainer } from "react-toastify"; // Import ToastContainer +import { jwtDecode } from "jwt-decode"; // Ensure jwt-decode is imported correctly +import global from "../../config/Global.json"; +import { useNavigate } from 'react-router-dom'; +import "react-toastify/dist/ReactToastify.css"; // Don't forget to import the Toastify styles + +const AuthContext = createContext(); + +export default AuthContext; + +export const AuthProvider = ({ children }) => { + let getAPI = (API_NAME) => { + return global.api.host + global.api[API_NAME]; + } + + const [authToken, setAuthToken] = useState(() => + localStorage.getItem("authToken") ? JSON.parse(localStorage.getItem("authToken")) : null + ); + + const [user, setUser] = useState(() => + localStorage.getItem("authToken") ? jwtDecode(localStorage.getItem("authToken")) : {} + ); + + const [loading, setLoading] = useState(true); + const navigate = useNavigate(); // Use useNavigate inside the component + + const loginUser = (e) => { + e.preventDefault(); + + axios.post(getAPI("token"), { + username: e.target.username.value, + password: e.target.password.value, + }) + .then((response) => { + if (global.checkSuperUser !== undefined && global.checkSuperUser === true) { + checkSuperUser(response.data.access); + } + console.log(response.data) + + setAuthToken(response.data); + setUser(jwtDecode(response.data.access)); + localStorage.setItem("authToken", JSON.stringify(response.data)); + + // Show success toast + toast.success("Login successful! Welcome back!"); + }) + .catch((error) => { + if (error.response && error.response.data.detail) { + if (error.response.data.detail === "No active account found with the given credentials") { + toast.error("Username or password incorrect. Please try again."); + } else { + toast.error("An error occurred. Please try again."); + } + } else { + toast.error("An error occurred. Please try again."); + } + console.error(error); + }); + }; + + const checkSuperUser = async (token) => { + try { + const response = await axios.get(getAPI("isSuperUser"), { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + if (response.data.is_superuser) { + toast.success("Welcome, Admin"); + } else { + logOutUser("User is not super user"); + } + } catch (error) { + toast.error("Error checking user permissions"); + console.error(error); + } + }; + + const logOutUser = (message) => { + setAuthToken(null); + setUser({}); + localStorage.removeItem("authToken"); + + if (message) { + toast.error(message); + } + + // Clear routes and navigate to login + navigate("/login", { replace: true }); // `replace: true` replaces the current entry in the history stack + }; + + useEffect(() => { + const checkSuperUserRefresh = async (token) => { + try { + const response = await axios.get(getAPI("isSuperUser"), { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + if (!response.data.is_superuser) { + logOutUser("User is not super user"); + } + } catch (error) { + toast.error("Error checking user permissions"); + console.error(error); + } + }; + + const refreshToken = () => { + if (authToken?.refresh) { + axios + .post(getAPI("refreshToken"), { refresh: `${authToken.refresh}` }) + .then((response) => { + if (global.checkSuperUser !== undefined && global.checkSuperUser === true) { + checkSuperUserRefresh(response.data.access); + } + + setAuthToken(response.data); + setUser(jwtDecode(response.data.access)); + localStorage.setItem("authToken", JSON.stringify(response.data)); + }) + .catch(logOutUser); // Log out if there's an error + } else { + logOutUser(); + } + + if (loading) { + setLoading(false); + } + }; + + if (loading) { + refreshToken(); + } + + const fourMinutes = 1000 * 60 * 4; + const interval = setInterval(() => { + if (authToken) { + refreshToken(); + } + }, fourMinutes); + return () => clearInterval(interval); + }, [authToken, loading]); + + const contextData = { + user, + loginUser, + logOutUser, + authToken, + }; + + return ( + + {loading ? null : children} + {/* Add ToastContainer to render toasts */} + + ); +}; diff --git a/src/utils/secure-route/routeManager/RouteManager.js b/src/utils/secure-route/routeManager/RouteManager.js new file mode 100644 index 0000000..f61eba1 --- /dev/null +++ b/src/utils/secure-route/routeManager/RouteManager.js @@ -0,0 +1,21 @@ +import React from "react"; +import { Route, Routes } from "react-router-dom"; +import { getRoutes } from "../../../config/ComponentRegister"; +import Auth from "../AuthCheck"; +const RouteManager = () => { + return ( + + {getRoutes().map(({ path, component, auth }, index) => { + const Component = component; + return ( + } />} + /> + ); + })} + + ); +}; +export default RouteManager;