diff --git a/.gitignore b/.gitignore index caf28bbe..c04668d7 100644 --- a/.gitignore +++ b/.gitignore @@ -168,7 +168,7 @@ pip-log.txt ## Custom ############# -log* +*.log .checkstyle .idea *.iml @@ -180,4 +180,7 @@ outg *.iml out/ scores_1p -scores_2p \ No newline at end of file +scores_2p + +# backend +backend/node_modules \ No newline at end of file diff --git a/Lib/json-simple-1.1.1.jar b/Lib/json-simple-1.1.1.jar new file mode 100644 index 00000000..66347a6c Binary files /dev/null and b/Lib/json-simple-1.1.1.jar differ diff --git a/Lib/junit-platform-console-standalone-1.8.2.jar b/Lib/junit-platform-console-standalone-1.8.2.jar new file mode 100644 index 00000000..d6dc60c5 Binary files /dev/null and b/Lib/junit-platform-console-standalone-1.8.2.jar differ diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 00000000..871befba --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,19 @@ +# Node.js 이미지를 기반으로 합니다. +FROM node:18 + +# 앱 디렉토리 생성 +USER root +WORKDIR /app + +# 앱 의존성 설치 +COPY package*.json ./ + +RUN npm install + +# 앱 소스 추가 +COPY . . +RUN ls -al + +RUN npm run build +EXPOSE 3200 +CMD [ "npm", "start" ] \ No newline at end of file diff --git a/backend/nodemon.json b/backend/nodemon.json new file mode 100644 index 00000000..8cc0f643 --- /dev/null +++ b/backend/nodemon.json @@ -0,0 +1,6 @@ +{ + "watch": ["src", ".env"], + "ext": "js,ts,json", + "ignore": ["src/logs/*", "src/**/*.{spec,test}.ts"], + "exec": "ts-node -r tsconfig-paths/register --transpile-only src/index.ts" +} diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 00000000..6e1c7091 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,7083 @@ +{ + "name": "typestack-docker-template", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "typestack-docker-template", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/shelljs": "^0.8.11", + "app-module-path": "2.2.0", + "aws-sdk": "2.1115.0", + "body-parser": "^1.20.0", + "class-transformer": "^0.5.1", + "crypto": "1.0.1", + "ejs": "^3.1.9", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.0", + "morgan": "1.10.0", + "multer": "^1.4.5-lts.1", + "mysql2": "2.3.3", + "nodemon": "^2.0.22", + "reflect-metadata": "0.1.13", + "routing-controllers": "^0.10.2", + "shelljs": "^0.8.5", + "source-map-support": "0.5.19", + "sqlite3": "^5.1.6", + "typedi": "0.8.0", + "typeorm": "0.2.45", + "typeorm-typedi-extensions": "0.2.3" + }, + "devDependencies": { + "@types/express": "4.17.7", + "@types/express-serve-static-core": "^4.17.11", + "@types/jsonwebtoken": "^9.0.1", + "@types/morgan": "1.9.2", + "@types/multer": "1.4.7", + "@types/node": "12.20.0", + "@types/socket.io": "1.4.42", + "@typescript-eslint/eslint-plugin": "^5.56.0", + "@typescript-eslint/parser": "^5.56.0", + "class-validator": "^0.14.0", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "eslint": "^8.36.0", + "eslint-config-prettier": "^8.5.0", + "eslint-config-standard-with-typescript": "^34.0.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.6.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-promise": "^6.1.1", + "prettier": "^2.8.1", + "ts-node": "^10.9.1", + "typescript": "^5.0.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "optional": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "optional": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "optional": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "optional": true, + "dependencies": { + "@babel/types": "^7.21.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "optional": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "optional": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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==", + "optional": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "optional": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "optional": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "optional": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "optional": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "optional": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "optional": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "optional": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "optional": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "optional": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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==", + "optional": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "optional": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "optional": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/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==", + "optional": true + }, + "node_modules/@babel/highlight/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==", + "optional": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/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==", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "optional": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "optional": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", + "optional": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@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-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==", + "optional": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", + "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "optional": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "optional": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "optional": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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==", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "optional": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "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==", + "dev": true, + "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.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", + "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.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/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.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==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "optional": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "optional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "optional": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@koa/router": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.0.tgz", + "integrity": "sha512-cnnxeKHXlt7XARJptflGURdJaO+ITpNkOHmQu7NHmCoRinPbyvFzce/EG/E8Zy81yQ1W9MoSdtklc3nyaDReUw==", + "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", + "optional": true, + "dependencies": { + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.2.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@koa/router/node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "optional": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, + "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==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz", + "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.11.tgz", + "integrity": "sha512-LdKPVG7AgbeOnqhdPvq1U/lHUm/pAxMMmYp53WKnV5YeMVizhVx7ntZhdDKlD28BFEGoCLV2AK/pwNtC+KduUg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "node_modules/@types/morgan": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.2.tgz", + "integrity": "sha512-edtGMEdit146JwwIeyQeHHg9yID4WSolQPxpEorHmN3KuytuCHyn2ELNr5Uxy8SerniFbbkmgKMrGM933am5BQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "12.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.0.tgz", + "integrity": "sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/shelljs": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.11.tgz", + "integrity": "sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw==", + "dependencies": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "node_modules/@types/socket.io": { + "version": "1.4.42", + "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-1.4.42.tgz", + "integrity": "sha512-2SnWce3DiBVkswhJgpo4FSoMTAAHksxYOFXaBZe4icrrrvpXee8yUPOZT77xzWvLZw63QpREUHHWzM4lQpHjtA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/validator": { + "version": "13.7.14", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.14.tgz", + "integrity": "sha512-J6OAed6rhN6zyqL9Of6ZMamhlsOEU/poBVvbHr/dKOYKTeuYYMlDkMv+b6UUV0o2i0tw73cgyv/97WTWaUl0/g==" + }, + "node_modules/@types/zen-observable": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", + "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", + "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/type-utils": "5.56.0", + "@typescript-eslint/utils": "5.56.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "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/parser": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", + "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.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.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", + "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.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.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", + "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/utils": "5.56.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.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", + "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "dev": true, + "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.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", + "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.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.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", + "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.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/visitor-keys": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", + "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.56.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/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "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==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "optional": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==" + }, + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==" + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/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" + } + ] + }, + "node_modules/are-we-there-yet/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "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==" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "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.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1115.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1115.0.tgz", + "integrity": "sha512-WuMPBkE2b0hGRcF4oYw9zhjG0PC20lFKHT5FS8PXgZgu4GK8adQ8oIK0wBYPjq3F6b+VNdhDWSy3R7a6K+ENOQ==", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "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==" + }, + "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" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.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==" + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "optional": true, + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "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==" + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "optional": true, + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001470", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", + "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "optional": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/class-validator": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", + "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", + "dependencies": { + "@types/validator": "^13.7.10", + "libphonenumber-js": "^1.10.14", + "validator": "^13.7.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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/cli-highlight/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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "optional": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "optional": true, + "dependencies": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "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==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/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" + } + ] + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "optional": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "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==" + }, + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "optional": true, + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", + "optional": true + }, + "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==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "optional": true + }, + "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==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.340", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", + "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==", + "optional": true + }, + "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==" + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/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==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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==" + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "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.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "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", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "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.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "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-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", + "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-config-standard-with-typescript": { + "version": "34.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-34.0.1.tgz", + "integrity": "sha512-J7WvZeLtd0Vr9F+v4dZbqJCLD16cbIy4U+alJMq4MiXdpipdBM3U5NkXaGUjePc4sb1ZE01U9g6VuTBpHHz1fg==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^5.43.0", + "eslint-config-standard": "17.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.43.0", + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0", + "typescript": "*" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "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==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", + "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", + "dev": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.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-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "optional": true, + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express-session/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express-session/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true + }, + "node_modules/express-session/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" + } + ], + "optional": true + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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==", + "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==" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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/express/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" + } + ] + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "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==", + "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==", + "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==" + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fix-esm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fix-esm/-/fix-esm-1.0.1.tgz", + "integrity": "sha512-EZtb7wPXZS54GaGxaWxMlhd1DUDCnAg5srlYdu/1ZVeW+7wwR3Tp59nu52dXByFs3MBRq+SByx1wDOJpRvLEXw==", + "optional": true, + "dependencies": { + "@babel/core": "^7.14.6", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": 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==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "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==", + "optional": true, + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "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==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "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==", + "optional": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "devOptional": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "optional": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "optional": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true + }, + "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==", + "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-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "devOptional": true, + "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==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "optional": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "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==" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "optional": true + }, + "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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "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==", + "dev": true, + "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==", + "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==", + "dev": true, + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "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==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "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==", + "optional": true, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "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==", + "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==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, + "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==", + "dev": true, + "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-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "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==", + "dev": true, + "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.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "devOptional": true + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "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==", + "optional": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "optional": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "optional": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "optional": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.1.tgz", + "integrity": "sha512-USJFyZgi2l0wDgqkfD27gL4YGno7TfUkcmOe6UOLFOVuN+J7FwnNu4Dydl4CUQzraM1lBAiGed0M9OVJoT0Kqw==", + "optional": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-bodyparser": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.0.tgz", + "integrity": "sha512-AXPY7wwKZUmbgb8VkTEUFoRNOlx6aWRJwEnQD+zfNf33/7KSAkN4Oo9BqlIk80D+5TvuqlhpQT5dPVcyxl5Zsw==", + "optional": true, + "dependencies": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "optional": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "optional": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "optional": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "optional": true, + "engines": { + "node": ">= 0.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==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.10.24", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.24.tgz", + "integrity": "sha512-3Dk8f5AmrcWqg+oHhmm9hwSTqpWHBdSqsHmjCJGroULFubi0+x7JEIGmRZCuL3TI8Tx39xaKqfnhsDQ4ALa/Nw==" + }, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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==", + "dev": true + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "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.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "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==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/mysql2": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", + "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "dependencies": { + "denque": "^2.0.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.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==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/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==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/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" + } + ], + "optional": true + }, + "node_modules/node-gyp/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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "optional": true + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nodemon/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "optional": true + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "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.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "optional": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.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==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "optional": true, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "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==", + "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/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/routing-controllers": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/routing-controllers/-/routing-controllers-0.10.2.tgz", + "integrity": "sha512-o1c1V7xu1dJou6GnbJoh9g4xdfV+LwKYkskPQFwYTlz0U6gJEHMGXbHXLNf1FaenEL+uSpFCxXkN3xXGuNAhGg==", + "dependencies": { + "cookie": "^0.5.0", + "glob": "^8.1.0", + "reflect-metadata": "^0.1.13", + "template-url": "^1.0.0" + }, + "optionalDependencies": { + "@koa/multer": "^3.0.2", + "@koa/router": "^12.0.0", + "body-parser": "^1.20.2", + "express": "^4.18.2", + "express-session": "^1.17.3", + "koa": "^2.14.1", + "koa-bodyparser": "^4.3.0", + "multer": "^1.4.5-lts.1" + }, + "peerDependencies": { + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0" + } + }, + "node_modules/routing-controllers/node_modules/@koa/multer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@koa/multer/-/multer-3.0.2.tgz", + "integrity": "sha512-Q6WfPpE06mJWyZD1fzxM6zWywaoo+zocAn2YA9QYz4RsecoASr1h/kSzG0c5seDpFVKCMZM9raEfuM7XfqbRLw==", + "optional": true, + "dependencies": { + "fix-esm": "1.0.1" + }, + "engines": { + "node": ">= 8" + }, + "peerDependencies": { + "multer": "*" + } + }, + "node_modules/routing-controllers/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==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/routing-controllers/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/routing-controllers/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.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==" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "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==", + "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==", + "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==" + }, + "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==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "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==", + "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-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "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==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "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==" + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "optional": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sqlite3": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", + "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", + "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/template-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/template-url/-/template-url-1.0.0.tgz", + "integrity": "sha512-QUjZNE7yTdIzB91sITTSYcSX5GRF5FulKvIYCqV5350NfSNfiuuCYQIJZ5PIN7k/uJ+kpurEEv9hFqRRc+JilA==" + }, + "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==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "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==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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==", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "optional": true, + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "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==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typedi": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/typedi/-/typedi-0.8.0.tgz", + "integrity": "sha512-/c7Bxnm6eh5kXx2I+mTuO+2OvoWni5+rXA3PhXwVWCtJRYmz3hMok5s1AKLzoDvNAZqj/Q/acGstN0ri5aQoOA==" + }, + "node_modules/typeorm": { + "version": "0.2.45", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.45.tgz", + "integrity": "sha512-c0rCO8VMJ3ER7JQ73xfk0zDnVv0WDjpsP6Q1m6CVKul7DB9iVdWLRjPzc8v2eaeBuomsbZ2+gTaYr8k1gm3bYA==", + "dependencies": { + "@sqltools/formatter": "^1.2.2", + "app-root-path": "^3.0.0", + "buffer": "^6.0.3", + "chalk": "^4.1.0", + "cli-highlight": "^2.1.11", + "debug": "^4.3.1", + "dotenv": "^8.2.0", + "glob": "^7.1.6", + "js-yaml": "^4.0.0", + "mkdirp": "^1.0.4", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.1.0", + "uuid": "^8.3.2", + "xml2js": "^0.4.23", + "yargs": "^17.0.1", + "zen-observable-ts": "^1.0.0" + }, + "bin": { + "typeorm": "cli.js" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@sap/hana-client": "^2.11.14", + "better-sqlite3": "^7.1.2", + "hdb-pool": "^0.1.6", + "ioredis": "^4.28.3", + "mongodb": "^3.6.0", + "mssql": "^6.3.1", + "mysql2": "^2.2.5", + "oracledb": "^5.1.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.2", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm-typedi-extensions": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/typeorm-typedi-extensions/-/typeorm-typedi-extensions-0.2.3.tgz", + "integrity": "sha512-T9i1NvRZNjPn9Jb8oT772ihfn6PwdqDVpzPCtKSqjkZGOgXrCkdyD3dDrzfMaoWJ1afU58bVx2CMb95FzT42Ow==", + "peerDependencies": { + "typedi": ">=0.7.2", + "typeorm": ">=0.2.0" + } + }, + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/typeorm/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" + } + ] + }, + "node_modules/typeorm/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typeorm/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/typeorm/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/typeorm/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/typeorm/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "optional": true, + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "optional": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "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==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "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==" + }, + "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==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "devOptional": true, + "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==", + "dev": true, + "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-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.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==", + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ylru": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", + "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "node_modules/zen-observable-ts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz", + "integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==", + "dependencies": { + "@types/zen-observable": "0.8.3", + "zen-observable": "0.8.15" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 00000000..edd32ec8 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,63 @@ +{ + "name": "typestack-docker-template", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "cross-env NODE_ENV=development nodemon", + "build": "tsc", + "start": "cross-env NODE_ENV=production node dist/index.js", + "format": "prettier --check --ignore-path .gitignore .", + "format:fix": "prettier --write --ignore-path .gitignore ." + }, + "author": "", + "license": "ISC", + "dependencies": { + "@types/shelljs": "^0.8.11", + "app-module-path": "2.2.0", + "aws-sdk": "2.1115.0", + "body-parser": "^1.20.0", + "class-transformer": "^0.5.1", + "crypto": "1.0.1", + "ejs": "^3.1.9", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.0", + "morgan": "1.10.0", + "multer": "^1.4.5-lts.1", + "mysql2": "2.3.3", + "nodemon": "^2.0.22", + "reflect-metadata": "0.1.13", + "routing-controllers": "^0.10.2", + "shelljs": "^0.8.5", + "source-map-support": "0.5.19", + "sqlite3": "^5.1.6", + "typedi": "0.8.0", + "typeorm": "0.2.45", + "typeorm-typedi-extensions": "0.2.3" + }, + "devDependencies": { + "@types/express": "4.17.7", + "@types/express-serve-static-core": "^4.17.11", + "@types/jsonwebtoken": "^9.0.1", + "@types/morgan": "1.9.2", + "@types/multer": "1.4.7", + "@types/node": "12.20.0", + "@types/socket.io": "1.4.42", + "@typescript-eslint/eslint-plugin": "^5.56.0", + "@typescript-eslint/parser": "^5.56.0", + "class-validator": "^0.14.0", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "eslint": "^8.36.0", + "eslint-config-prettier": "^8.5.0", + "eslint-config-standard-with-typescript": "^34.0.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.6.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-promise": "^6.1.1", + "prettier": "^2.8.1", + "ts-node": "^10.9.1", + "typescript": "^5.0.2" + } +} diff --git a/backend/src/api/auth/auth.controller.ts b/backend/src/api/auth/auth.controller.ts new file mode 100644 index 00000000..c48e2429 --- /dev/null +++ b/backend/src/api/auth/auth.controller.ts @@ -0,0 +1,27 @@ +import { Authorized, Body, Get, JsonController, Post } from 'routing-controllers'; +import { AuthService } from './auth.service'; +import { LoginDTO } from './dto/login.dto'; +import { SingupDTO } from './dto/sign-up.dto'; + +@JsonController('/auth') +export class AuthController { + constructor(private readonly authService: AuthService) {} + + @Post('/login') + public async login(@Body() body: LoginDTO) { + return await this.authService.login(body); + } + + @Post('/signup') + public async signup(@Body() body: SingupDTO) { + await this.authService.signup(body); + + return { message: 'success' }; + } + + @Get('/test') + @Authorized() + public test() { + return 'good'; + } +} diff --git a/backend/src/api/auth/auth.repository.ts b/backend/src/api/auth/auth.repository.ts new file mode 100644 index 00000000..5845b3cc --- /dev/null +++ b/backend/src/api/auth/auth.repository.ts @@ -0,0 +1,5 @@ +import { EntityRepository, Repository } from 'typeorm'; +import { User } from './entity/user.entity'; + +@EntityRepository(User) +export class AuthRepository extends Repository {} diff --git a/backend/src/api/auth/auth.service.ts b/backend/src/api/auth/auth.service.ts new file mode 100644 index 00000000..88af4e48 --- /dev/null +++ b/backend/src/api/auth/auth.service.ts @@ -0,0 +1,40 @@ +import { BaseException } from 'exceptions/base.exception'; +import { Service } from 'typedi'; +import { InjectRepository } from 'typeorm-typedi-extensions'; +import { AuthRepository } from './auth.repository'; +import { LoginDTO } from './dto/login.dto'; +import { SingupDTO } from './dto/sign-up.dto'; +import { sign } from 'jsonwebtoken'; + +@Service() +export class AuthService { + constructor( + @InjectRepository() + private readonly authRepo: AuthRepository, + ) {} + + public async login(loginDTO: LoginDTO) { + try { + const userInfo = await this.authRepo.findOne(loginDTO); + const token = sign( + { + id: userInfo.id, + username: userInfo.username, + }, + 'tmp', + { expiresIn: '10s', issuer: 'sraccoon' }, + ); + return { token: token }; + } catch (e) { + throw new BaseException(400, '토큰 발급 중 알 수 없는 에러 발생', e); + } + } + + public async signup(signupDTO: SingupDTO) { + try { + await this.authRepo.save(signupDTO); + } catch (e) { + throw new BaseException(400, e.message, e); + } + } +} diff --git a/backend/src/api/auth/dto/login.dto.ts b/backend/src/api/auth/dto/login.dto.ts new file mode 100644 index 00000000..3d5e181e --- /dev/null +++ b/backend/src/api/auth/dto/login.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from 'class-validator'; + +export class LoginDTO { + @IsNotEmpty() + public username: string; + + @IsNotEmpty() + public password: string; +} diff --git a/backend/src/api/auth/dto/sign-up.dto.ts b/backend/src/api/auth/dto/sign-up.dto.ts new file mode 100644 index 00000000..8378844d --- /dev/null +++ b/backend/src/api/auth/dto/sign-up.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from 'class-validator'; + +export class SingupDTO { + @IsNotEmpty() + public username: string; + + @IsNotEmpty() + public password: string; +} diff --git a/backend/src/api/auth/entity/user.entity.ts b/backend/src/api/auth/entity/user.entity.ts new file mode 100644 index 00000000..f22b37bc --- /dev/null +++ b/backend/src/api/auth/entity/user.entity.ts @@ -0,0 +1,26 @@ +/* eslint-disable indent */ +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('user') +export class User { + @PrimaryGeneratedColumn({ type: 'int', name: 'id' }) + id: number; + + @Column('int', { name: 'username', unique: true }) + username: string; + + @Column('varchar', { name: 'password' }) + password: string; + + @Column('datetime', { + name: 'created_at', + default: () => 'CURRENT_TIMESTAMP', + }) + createdAt: Date; + + @Column('datetime', { + name: 'updated_at', + default: () => 'CURRENT_TIMESTAMP', + }) + updatedAt: Date; +} diff --git a/backend/src/api/rank/dto/create.dto.ts b/backend/src/api/rank/dto/create.dto.ts new file mode 100644 index 00000000..020e3ad3 --- /dev/null +++ b/backend/src/api/rank/dto/create.dto.ts @@ -0,0 +1,6 @@ +import { IsNotEmpty } from 'class-validator'; + +export class CreateDTO { + @IsNotEmpty() + public name: string; +} diff --git a/backend/src/api/rank/entity/rank.entity.ts b/backend/src/api/rank/entity/rank.entity.ts new file mode 100644 index 00000000..f7c760b9 --- /dev/null +++ b/backend/src/api/rank/entity/rank.entity.ts @@ -0,0 +1,23 @@ +/* eslint-disable indent */ +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('crud') +export class Crud { + @PrimaryGeneratedColumn({ type: 'int', name: 'id' }) + id: number; + + @Column('varchar', { name: 'password' }) + name: string; + + @Column('datetime', { + name: 'created_at', + default: () => 'CURRENT_TIMESTAMP', + }) + createdAt: Date; + + @Column('datetime', { + name: 'updated_at', + default: () => 'CURRENT_TIMESTAMP', + }) + updatedAt: Date; +} diff --git a/backend/src/api/rank/rank.controller.ts b/backend/src/api/rank/rank.controller.ts new file mode 100644 index 00000000..4dcb7263 --- /dev/null +++ b/backend/src/api/rank/rank.controller.ts @@ -0,0 +1,28 @@ +import { Body, Delete, Get, JsonController, Param, Post } from 'routing-controllers'; +import { CrudService } from './rank.service'; +import { CreateDTO } from './dto/create.dto'; + +@JsonController('/crud') +export class CrudController { + constructor(private readonly crudService: CrudService) {} + + @Get() + public async get() { + return this.crudService.getAll(); + } + + @Get('/:id') + public async getOne(@Param('id') id: number) { + return this.crudService.getById(id); + } + + @Post() + public async create(@Body() body: CreateDTO) { + return this.crudService.create(body); + } + + @Delete('/:id') + public async deleteOne(@Param('id') id: number) { + return this.crudService.deleteById(id); + } +} diff --git a/backend/src/api/rank/rank.repository.ts b/backend/src/api/rank/rank.repository.ts new file mode 100644 index 00000000..5c425cc2 --- /dev/null +++ b/backend/src/api/rank/rank.repository.ts @@ -0,0 +1,5 @@ +import { Crud } from './entity/rank.entity'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(Crud) +export class CrudRepository extends Repository {} diff --git a/backend/src/api/rank/rank.service.ts b/backend/src/api/rank/rank.service.ts new file mode 100644 index 00000000..a3e7996d --- /dev/null +++ b/backend/src/api/rank/rank.service.ts @@ -0,0 +1,45 @@ +import { BaseException } from 'exceptions/base.exception'; +import { Service } from 'typedi'; +import { InjectRepository } from 'typeorm-typedi-extensions'; +import { CrudRepository } from './rank.repository'; +import { CreateDTO } from './dto/create.dto'; + +@Service() +export class CrudService { + constructor( + @InjectRepository() + private readonly crudRepo: CrudRepository, + ) {} + + public async getAll() { + try { + return await this.crudRepo.find(); + } catch (e) { + throw new BaseException(400, 'get list error', e); + } + } + + public async getById(id: number) { + try { + return await this.crudRepo.findOne(id); + } catch (e) { + throw new BaseException(400, 'get by id error', e); + } + } + + public async deleteById(id: number) { + try { + return await this.crudRepo.delete(id); + } catch (e) { + throw new BaseException(400, 'delete error', e); + } + } + + public async create(createDTO: CreateDTO) { + try { + await this.crudRepo.save(createDTO); + } catch (e) { + throw new BaseException(400, 'create error', e); + } + } +} diff --git a/backend/src/api/test.controller.ts b/backend/src/api/test.controller.ts new file mode 100644 index 00000000..39c14fa1 --- /dev/null +++ b/backend/src/api/test.controller.ts @@ -0,0 +1,15 @@ +import { Authorized, Get, JsonController } from 'routing-controllers'; + +@JsonController('/test') +export class TestController { + @Get() + public test() { + return 'http test'; + } + + @Authorized() + @Get('/auth') + public authTest() { + return 'auth good'; + } +} diff --git a/backend/src/app.ts b/backend/src/app.ts new file mode 100644 index 00000000..c24faf1c --- /dev/null +++ b/backend/src/app.ts @@ -0,0 +1,64 @@ +import express, { Application } from 'express'; +import morgan from 'morgan'; +import { Server } from 'http'; +import { useContainer, useExpressServer } from 'routing-controllers'; +import Container from 'typedi'; +import { join } from 'path'; +import { createConnection, useContainer as useDBContainer } from 'typeorm'; +import bodyParser from 'body-parser'; +import { GlobalErrorHandler } from 'middleware/global-error.handler'; +import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions'; +import { AuthorizationHandler } from 'middleware/authorization.handler'; +import { IS_DEV } from 'config'; +import cors from 'cors'; + +export class App { + public app: Application; + public server: Server; + public port: number; + + constructor(port: number) { + this.app = express(); + this.port = port; + this.setMiddleWare(); + } + + public async initServer() { + await new Promise((resolve) => { + this.createDatabaseConnection().then(() => { + useContainer(Container); + + useExpressServer(this.app, { + controllers: [join(__dirname + `/api/**/*.controller.${IS_DEV ? 'ts' : 'js'}`)], + middlewares: [GlobalErrorHandler], + authorizationChecker: AuthorizationHandler, + defaultErrorHandler: false, + }); + + this.server = this.app.listen(this.port, () => { + console.log('Service Start'); + resolve(true); + }); + }); + }); + } + + private setMiddleWare() { + this.app.use(morgan('dev')); + this.app.use(bodyParser.json()); + this.app.use(bodyParser.urlencoded({ extended: true })); + this.app.use(cors()); + } + + private async createDatabaseConnection() { + const connectionOpts: SqliteConnectionOptions = { + type: 'sqlite', + database: 'test.db', + entities: [join(__dirname + `/api/**/*.entity.${IS_DEV ? 'ts' : 'js'}`)], + synchronize: true, + }; + + useDBContainer(Container); + await createConnection(connectionOpts); + } +} diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts new file mode 100644 index 00000000..75681bed --- /dev/null +++ b/backend/src/config/index.ts @@ -0,0 +1,5 @@ +import { config } from 'dotenv'; +config({ path: `.env.${process.env.NODE_ENV || 'development'}.local` }); + +export const { NODE_ENV } = process.env; +export const IS_DEV = process.env.NODE_ENV === 'development'; diff --git a/backend/src/exceptions/base.exception.ts b/backend/src/exceptions/base.exception.ts new file mode 100644 index 00000000..e3772146 --- /dev/null +++ b/backend/src/exceptions/base.exception.ts @@ -0,0 +1,11 @@ +export class BaseException extends Error { + public status: number; + + constructor(status = 500, message = 'Unknown Error', error: Error) { + super(message); + this.status = status; + this.message = message; + + console.log(error); + } +} diff --git a/backend/src/functions/async-fs.function.ts b/backend/src/functions/async-fs.function.ts new file mode 100644 index 00000000..4137a032 --- /dev/null +++ b/backend/src/functions/async-fs.function.ts @@ -0,0 +1,13 @@ +import { readFile } from 'fs'; + +export const readFileAsync = async (path: string): Promise => { + return new Promise((res, rej) => { + readFile(path, (err, data) => { + if (err) { + rej(err); + } + + res(data); + }); + }); +}; diff --git a/backend/src/functions/async-shell.function.ts b/backend/src/functions/async-shell.function.ts new file mode 100644 index 00000000..da8edd04 --- /dev/null +++ b/backend/src/functions/async-shell.function.ts @@ -0,0 +1,21 @@ +import { exec, ExecOptions } from 'shelljs'; + +export interface IExecFunctionOptions extends ExecOptions { + silent?: boolean; + async?: false; +} + +export function execAsync(command: string, options: IExecFunctionOptions = {}): Promise { + return new Promise((resolve, reject) => { + exec(command, { ...options, async: false }, (code: number, stdout: string, stderr: string) => { + if (code !== 0) { + const e: Error = new Error(); + e.message = stderr; + e.name = String(code); + reject(e); + } else { + resolve(stdout); + } + }); + }); +} diff --git a/backend/src/functions/date.function.ts b/backend/src/functions/date.function.ts new file mode 100644 index 00000000..b895c7a8 --- /dev/null +++ b/backend/src/functions/date.function.ts @@ -0,0 +1,16 @@ +export const getToday = () => { + const date = new Date(); + const year = date.getFullYear(); + const month = ('0' + (1 + date.getMonth())).slice(-2); + const day = ('0' + date.getDate()).slice(-2); + + return year + month + day; +}; + +export const getYYYYMMDD = (date: Date) => { + const year = date.getFullYear(); + const month = ('0' + (1 + date.getMonth())).slice(-2); + const day = ('0' + date.getDate()).slice(-2); + + return year + month + day; +}; diff --git a/backend/src/functions/s3.function.ts b/backend/src/functions/s3.function.ts new file mode 100644 index 00000000..e9132f40 --- /dev/null +++ b/backend/src/functions/s3.function.ts @@ -0,0 +1,13 @@ +import { S3 } from 'aws-sdk'; + +const s3 = new S3(); + +export const upload = async (bucket: string, taskName: string, body: Buffer) => { + return await s3 + .upload({ + Bucket: bucket, + Key: taskName, + Body: body, + }) + .promise(); +}; diff --git a/backend/src/index.ts b/backend/src/index.ts new file mode 100644 index 00000000..911947f0 --- /dev/null +++ b/backend/src/index.ts @@ -0,0 +1,11 @@ +import appModulePath from 'app-module-path'; +import 'reflect-metadata'; + +appModulePath.addPath(__dirname); + +import { App } from './app'; + +(async () => { + const app = new App(3200); + await app.initServer(); +})(); diff --git a/backend/src/libs/multer.manager.ts b/backend/src/libs/multer.manager.ts new file mode 100644 index 00000000..1905fe41 --- /dev/null +++ b/backend/src/libs/multer.manager.ts @@ -0,0 +1,14 @@ +import { getToday } from 'functions/date.function'; +import multer from 'multer'; + +export const MulterManager = multer({ + dest: 'uploads', + storage: multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, 'uploads/'); + }, + filename: function (req, file, cb) { + cb(null, getToday() + '_' + file.originalname); + }, + }), +}); diff --git a/backend/src/middleware/authorization.handler.ts b/backend/src/middleware/authorization.handler.ts new file mode 100644 index 00000000..40e0ec8b --- /dev/null +++ b/backend/src/middleware/authorization.handler.ts @@ -0,0 +1,15 @@ +import { BaseException } from 'exceptions/base.exception'; +import { verify } from 'jsonwebtoken'; +import { Action } from 'routing-controllers'; + +export const AuthorizationHandler = async (action: Action) => { + try { + const token = action.request.headers['authorization']; + + verify(token, 'tmp'); + + return true; + } catch (e) { + throw new BaseException(400, 'Bad Token', e); + } +}; diff --git a/backend/src/middleware/global-error.handler.ts b/backend/src/middleware/global-error.handler.ts new file mode 100644 index 00000000..28f31afb --- /dev/null +++ b/backend/src/middleware/global-error.handler.ts @@ -0,0 +1,15 @@ +import { Request, Response } from 'express'; +import { Middleware, ExpressErrorMiddlewareInterface } from 'routing-controllers'; + +@Middleware({ type: 'after' }) +export class GlobalErrorHandler implements ExpressErrorMiddlewareInterface { + error(error: any, request: Request, response: Response) { + console.log(request.headers); + if (error.message.includes('Invalid body')) { + response.statusCode = 400; + response.json({ message: error.message, detail: error.errors.join('\n') }); + } else { + response.json({ status: error.status, message: error.message }); + } + } +} diff --git a/backend/test.db b/backend/test.db new file mode 100644 index 00000000..6461270c Binary files /dev/null and b/backend/test.db differ diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 00000000..7b2934e4 --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "outDir": "dist", + "module": "commonjs", + "target": "es2017", + "sourceMap": true, + "allowJs": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "noImplicitAny": false, + "noImplicitThis": false, + "noFallthroughCasesInSwitch": true, + "strictNullChecks": false, + "noUnusedLocals": true, + "removeComments": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "listFiles": false, + "baseUrl": "src", + "esModuleInterop": true, + "noStrictGenericChecks": false, + "paths": { + "src/*": ["src/*"] + } + } +} diff --git a/backend/users_database.sql b/backend/users_database.sql new file mode 100644 index 00000000..e144090c --- /dev/null +++ b/backend/users_database.sql @@ -0,0 +1,56 @@ +drop table if exists users; + +create table users( + id varchar(10), + name varchar(5), + score int, + primary key (id) +); + +create or replace function highscore() +returns trigger +language plpgsql +as $$ +begin + if( select 1 + from users + where id = new.id and score >= new.score) then + return null; + end if; + + delete from users + where id = new.id and score < new.score; + + return new; +end; +$$; + +create trigger update_highscore before insert on users +for each row +execute function highscore(); + +insert into users values ('2312','DFA',90); +insert into users values ('36805','UTG',800); +insert into users values ('1234','CUE',100); +insert into users values ('75443','QTK',500); +insert into users values ('583','QYB',-70); +insert into users values ('1049','DHJ',30); +insert into users values ('1680','OPE',9000); +insert into users values ('75443','QTK',200); +insert into users values ('703','TNE',330); +insert into users values ('3780','QTB',330); +insert into users values ('146','KYR',150); +insert into users values ('2312','DFA',1000); + +select * +from users; + +with ranked_users as ( + select id, name, score, rank() over (order by score desc) as ranking + from users +) +select id, name, score, ranking +from ranked_users +where ranking <= 5 +order by score desc; + diff --git a/backend/yarn.lock b/backend/yarn.lock new file mode 100644 index 00000000..924fcb75 --- /dev/null +++ b/backend/yarn.lock @@ -0,0 +1,4235 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.14.6": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz" + integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.3" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.3" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.3" + "@babel/types" "^7.21.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.21.3": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz" + integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== + dependencies: + "@babel/types" "^7.21.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.20.7", "@babel/parser@^7.21.3": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz" + integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== + +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-commonjs@^7.14.5": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== + dependencies: + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz" + integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.3" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.3" + "@babel/types" "^7.21.3" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz" + integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.4.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz" + integrity sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw== + +"@eslint/eslintrc@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz" + integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.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" + +"@eslint/js@8.36.0": + version "8.36.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz" + integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@koa/multer@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@koa/multer/-/multer-3.0.2.tgz" + integrity sha512-Q6WfPpE06mJWyZD1fzxM6zWywaoo+zocAn2YA9QYz4RsecoASr1h/kSzG0c5seDpFVKCMZM9raEfuM7XfqbRLw== + dependencies: + fix-esm "1.0.1" + +"@koa/router@^12.0.0": + version "12.0.0" + resolved "https://registry.npmjs.org/@koa/router/-/router-12.0.0.tgz" + integrity sha512-cnnxeKHXlt7XARJptflGURdJaO+ITpNkOHmQu7NHmCoRinPbyvFzce/EG/E8Zy81yQ1W9MoSdtklc3nyaDReUw== + dependencies: + http-errors "^2.0.0" + koa-compose "^4.1.0" + methods "^1.1.2" + path-to-regexp "^6.2.1" + +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.10" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz" + integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@sqltools/formatter@^1.2.2": + version "1.2.5" + resolved "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz" + integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.11": + version "4.17.11" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.11.tgz" + integrity sha512-LdKPVG7AgbeOnqhdPvq1U/lHUm/pAxMMmYp53WKnV5YeMVizhVx7ntZhdDKlD28BFEGoCLV2AK/pwNtC+KduUg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@4.17.7": + version "4.17.7" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz" + integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@*": + version "8.1.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/jsonwebtoken@^9.0.1": + version "9.0.1" + resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz" + integrity sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw== + dependencies: + "@types/node" "*" + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/minimatch@^5.1.2": + version "5.1.2" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/morgan@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.2.tgz" + integrity sha512-edtGMEdit146JwwIeyQeHHg9yID4WSolQPxpEorHmN3KuytuCHyn2ELNr5Uxy8SerniFbbkmgKMrGM933am5BQ== + dependencies: + "@types/node" "*" + +"@types/multer@1.4.7": + version "1.4.7" + resolved "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz" + integrity sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA== + dependencies: + "@types/express" "*" + +"@types/node@*", "@types/node@12.20.0": + version "12.20.0" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.0.tgz" + integrity sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/serve-static@*": + version "1.15.1" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/shelljs@^0.8.11": + version "0.8.11" + resolved "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.11.tgz" + integrity sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw== + dependencies: + "@types/glob" "*" + "@types/node" "*" + +"@types/socket.io@1.4.42": + version "1.4.42" + resolved "https://registry.npmjs.org/@types/socket.io/-/socket.io-1.4.42.tgz" + integrity sha512-2SnWce3DiBVkswhJgpo4FSoMTAAHksxYOFXaBZe4icrrrvpXee8yUPOZT77xzWvLZw63QpREUHHWzM4lQpHjtA== + dependencies: + "@types/node" "*" + +"@types/validator@^13.7.10": + version "13.7.14" + resolved "https://registry.npmjs.org/@types/validator/-/validator-13.7.14.tgz" + integrity sha512-J6OAed6rhN6zyqL9Of6ZMamhlsOEU/poBVvbHr/dKOYKTeuYYMlDkMv+b6UUV0o2i0tw73cgyv/97WTWaUl0/g== + +"@types/zen-observable@0.8.3": + version "0.8.3" + resolved "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz" + integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + +"@typescript-eslint/eslint-plugin@^5.43.0", "@typescript-eslint/eslint-plugin@^5.56.0": + version "5.56.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz" + integrity sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.56.0" + "@typescript-eslint/type-utils" "5.56.0" + "@typescript-eslint/utils" "5.56.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.43.0", "@typescript-eslint/parser@^5.56.0": + version "5.56.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz" + integrity sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg== + dependencies: + "@typescript-eslint/scope-manager" "5.56.0" + "@typescript-eslint/types" "5.56.0" + "@typescript-eslint/typescript-estree" "5.56.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.56.0": + version "5.56.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz" + integrity sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw== + dependencies: + "@typescript-eslint/types" "5.56.0" + "@typescript-eslint/visitor-keys" "5.56.0" + +"@typescript-eslint/type-utils@5.56.0": + version "5.56.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz" + integrity sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A== + dependencies: + "@typescript-eslint/typescript-estree" "5.56.0" + "@typescript-eslint/utils" "5.56.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.56.0": + version "5.56.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz" + integrity sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w== + +"@typescript-eslint/typescript-estree@5.56.0": + version "5.56.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz" + integrity sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg== + dependencies: + "@typescript-eslint/types" "5.56.0" + "@typescript-eslint/visitor-keys" "5.56.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.56.0": + version "5.56.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz" + integrity sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.56.0" + "@typescript-eslint/types" "5.56.0" + "@typescript-eslint/typescript-estree" "5.56.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.56.0": + version "5.56.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz" + integrity sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q== + dependencies: + "@typescript-eslint/types" "5.56.0" + eslint-visitor-keys "^3.3.0" + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@^1.3.5, accepts@~1.3.8: + 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== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +agent-base@^6.0.2, agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + dependencies: + debug "^4.1.0" + depd "^2.0.0" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + 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== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-module-path@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz" + integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== + +app-root-path@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz" + integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== + +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz" + integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sdk@2.1115.0: + version "2.1115.0" + resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1115.0.tgz" + integrity sha512-WuMPBkE2b0hGRcF4oYw9zhjG0PC20lFKHT5FS8PXgZgu4GK8adQ8oIK0wBYPjq3F6b+VNdhDWSy3R7a6K+ENOQ== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.16.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + uuid "3.3.2" + xml2js "0.4.19" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@^1.20.0, body-parser@^1.20.2: + version "1.20.2" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + 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" + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + 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.1" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.3, "browserslist@>= 4.21.0": + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtins@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +busboy@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001449: + version "1.0.30001470" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz" + integrity sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +class-transformer@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz" + integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== + +class-validator@^0.14.0: + version "0.14.0" + resolved "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz" + integrity sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A== + dependencies: + "@types/validator" "^13.7.10" + libphonenumber-js "^1.10.14" + validator "^13.7.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co-body@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz" + integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-support@^1.1.2, color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@~0.5.2, content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.4, content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.7.0: + 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== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@^0.5.0, cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cookies@~0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz" + integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + +copy-to@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz" + integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz" + integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz" + integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== + +deep-is@^0.1.3: + 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== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +denque@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + +depd@^2.0.0, depd@~2.0.0, depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@^1.0.4, destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.9: + version "3.1.9" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.284: + version "1.4.340" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz" + integrity sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@^1.0.2, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.0, encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.10.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-config-standard-with-typescript@^34.0.1: + version "34.0.1" + resolved "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-34.0.1.tgz" + integrity sha512-J7WvZeLtd0Vr9F+v4dZbqJCLD16cbIy4U+alJMq4MiXdpipdBM3U5NkXaGUjePc4sb1ZE01U9g6VuTBpHHz1fg== + dependencies: + "@typescript-eslint/parser" "^5.43.0" + eslint-config-standard "17.0.0" + +eslint-config-standard@17.0.0: + version "17.0.0" + resolved "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz" + integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg== + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.7.4" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz" + integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-n@^15.0.0, eslint-plugin-n@^15.6.1: + version "15.6.1" + resolved "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz" + integrity sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA== + dependencies: + builtins "^5.0.1" + eslint-plugin-es "^4.1.0" + eslint-utils "^3.0.0" + ignore "^5.1.1" + is-core-module "^2.11.0" + minimatch "^3.1.2" + resolve "^1.22.1" + semver "^7.3.8" + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-promise@^6.0.0, eslint-plugin-promise@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + 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== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.0.1, eslint@^8.36.0, eslint@>=4.19.1, eslint@>=5, eslint@>=7.0.0, eslint@>=7.28.0: + version "8.36.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz" + integrity sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.1" + "@eslint/js" "8.36.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + 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.1.1" + eslint-visitor-keys "^3.3.0" + espree "^9.5.0" + 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" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + 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.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.0: + version "9.5.0" + resolved "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz" + integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +events@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/events/-/events-1.1.1.tgz" + integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== + +express-session@^1.17.3: + version "1.17.3" + resolved "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz" + integrity sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw== + dependencies: + cookie "0.4.2" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.1" + uid-safe "~2.1.5" + +express@^4.18.2: + version "4.18.2" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.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" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + 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" + +fast-json-stable-stringify@^2.0.0: + 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== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.1: + 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== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + 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" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +fix-esm@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/fix-esm/-/fix-esm-1.0.1.tgz" + integrity sha512-EZtb7wPXZS54GaGxaWxMlhd1DUDCnAg5srlYdu/1ZVeW+7wwR3Tp59nu52dXByFs3MBRq+SByx1wDOJpRvLEXw== + dependencies: + "@babel/core" "^7.14.6" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.14.5" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@~0.5.2, fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +generate-function@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz" + integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== + dependencies: + is-property "^1.0.2" + +gensync@^1.0.0-beta.2: + 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== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + 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" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.6: + 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== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +http-assert@^1.3.0: + version "1.5.0" + resolved "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz" + integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== + dependencies: + deep-equal "~1.0.1" + http-errors "~1.8.0" + +http-cache-semantics@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-errors@^1.6.3: + version "1.8.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-errors@^2.0.0, http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.8.0: + version "1.8.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + 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== + dependencies: + agent-base "6" + debug "4" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4, ieee754@1.1.13: + version "1.1.13" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.1.1, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflation@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz" + integrity sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + 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== + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + 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== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + 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== + +is-property@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jmespath@0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz" + integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== + +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.0.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-schema-traverse@^0.4.1: + 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== + +json-stable-stringify-without-jsonify@^1.0.1: + 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== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonwebtoken@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz" + integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== + dependencies: + jws "^3.2.2" + lodash "^4.17.21" + ms "^2.1.1" + semver "^7.3.8" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" + +koa-bodyparser@^4.3.0: + version "4.4.0" + resolved "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.0.tgz" + integrity sha512-AXPY7wwKZUmbgb8VkTEUFoRNOlx6aWRJwEnQD+zfNf33/7KSAkN4Oo9BqlIk80D+5TvuqlhpQT5dPVcyxl5Zsw== + dependencies: + co-body "^6.0.0" + copy-to "^2.0.1" + +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + +koa-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz" + integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== + dependencies: + co "^4.6.0" + koa-compose "^4.1.0" + +koa@^2.14.1: + version "2.14.1" + resolved "https://registry.npmjs.org/koa/-/koa-2.14.1.tgz" + integrity sha512-USJFyZgi2l0wDgqkfD27gL4YGno7TfUkcmOe6UOLFOVuN+J7FwnNu4Dydl4CUQzraM1lBAiGed0M9OVJoT0Kqw== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.8.0" + debug "^4.3.2" + delegates "^1.0.0" + depd "^2.0.0" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^2.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +libphonenumber-js@^1.10.14: + version "1.10.24" + resolved "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.24.tgz" + integrity sha512-3Dk8f5AmrcWqg+oHhmm9hwSTqpWHBdSqsHmjCJGroULFubi0+x7JEIGmRZCuL3TI8Tx39xaKqfnhsDQ4ALa/Nw== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +make-dir@^3.1.0: + 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== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@^1.1.2, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.18, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.2.5" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz" + integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +morgan@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +ms@^2.0.0, ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multer@*, multer@^1.4.5-lts.1: + version "1.4.5-lts.1" + resolved "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz" + integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== + dependencies: + append-field "^1.0.0" + busboy "^1.0.0" + concat-stream "^1.5.2" + mkdirp "^0.5.4" + object-assign "^4.1.1" + type-is "^1.6.4" + xtend "^4.0.0" + +mysql2@^2.2.5, mysql2@2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz" + integrity sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA== + dependencies: + denque "^2.0.1" + generate-function "^2.3.1" + iconv-lite "^0.6.3" + long "^4.0.0" + lru-cache "^6.0.0" + named-placeholders "^1.1.2" + seq-queue "^0.0.5" + sqlstring "^2.3.2" + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +named-placeholders@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz" + integrity sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w== + dependencies: + lru-cache "^7.14.1" + +natural-compare-lite@^1.4.0: + 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== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@^0.6.2, negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + +node-gyp@8.x: + version "8.4.1" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +nodemon@^2.0.22: + version "2.0.22" + resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz" + integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^5.7.1" + simple-update-notifier "^1.0.7" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +on-finished@^2.3.0, on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + 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== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +only@~0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/only/-/only-0.0.2.tgz" + integrity sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ== + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + 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.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + 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== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +parent-module@^1.0.0: + 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== + dependencies: + callsites "^3.0.0" + +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@^1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.8.1, prettier@>=2.0.0: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +process-nextick-args@~2.0.0: + 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== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +proxy-addr@~2.0.7: + 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== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +qs@^6.5.2, qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" + integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@^2.3.3, raw-body@2.5.2: + 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== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.2.2: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + 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" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +reflect-metadata@^0.1.13, reflect-metadata@0.1.13: + version "0.1.13" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + 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== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.6, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +routing-controllers@^0.10.2: + version "0.10.2" + resolved "https://registry.npmjs.org/routing-controllers/-/routing-controllers-0.10.2.tgz" + integrity sha512-o1c1V7xu1dJou6GnbJoh9g4xdfV+LwKYkskPQFwYTlz0U6gJEHMGXbHXLNf1FaenEL+uSpFCxXkN3xXGuNAhGg== + dependencies: + cookie "^0.5.0" + glob "^8.1.0" + reflect-metadata "^0.1.13" + template-url "^1.0.0" + optionalDependencies: + "@koa/multer" "^3.0.2" + "@koa/router" "^12.0.0" + body-parser "^1.20.2" + express "^4.18.2" + express-session "^1.17.3" + koa "^2.14.1" + koa-bodyparser "^4.3.0" + multer "^1.4.5-lts.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0, sax@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" + integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== + +semver@^5.7.1: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.0.0, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + 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" + +seq-queue@^0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz" + integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-update-notifier@^1.0.7: + version "1.1.0" + resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +source-map-support@0.5.19: + version "0.5.19" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sqlite3@^5.0.2, sqlite3@^5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz" + integrity sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + node-addon-api "^4.2.0" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + +sqlstring@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz" + integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +statuses@^1.5.0, "statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string_decoder@^1.1.1: + 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== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + 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== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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== + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.1.13" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^4.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +template-url@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/template-url/-/template-url-1.0.0.tgz" + integrity sha512-QUjZNE7yTdIzB91sITTSYcSX5GRF5FulKvIYCqV5350NfSNfiuuCYQIJZ5PIN7k/uJ+kpurEEv9hFqRRc+JilA== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + 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== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +to-fast-properties@^2.0.0: + 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== + +to-regex-range@^5.0.1: + 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== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + 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== + +type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typedi@>=0.7.2, typedi@0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/typedi/-/typedi-0.8.0.tgz" + integrity sha512-/c7Bxnm6eh5kXx2I+mTuO+2OvoWni5+rXA3PhXwVWCtJRYmz3hMok5s1AKLzoDvNAZqj/Q/acGstN0ri5aQoOA== + +typeorm-typedi-extensions@0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/typeorm-typedi-extensions/-/typeorm-typedi-extensions-0.2.3.tgz" + integrity sha512-T9i1NvRZNjPn9Jb8oT772ihfn6PwdqDVpzPCtKSqjkZGOgXrCkdyD3dDrzfMaoWJ1afU58bVx2CMb95FzT42Ow== + +typeorm@>=0.2.0, typeorm@0.2.45: + version "0.2.45" + resolved "https://registry.npmjs.org/typeorm/-/typeorm-0.2.45.tgz" + integrity sha512-c0rCO8VMJ3ER7JQ73xfk0zDnVv0WDjpsP6Q1m6CVKul7DB9iVdWLRjPzc8v2eaeBuomsbZ2+gTaYr8k1gm3bYA== + dependencies: + "@sqltools/formatter" "^1.2.2" + app-root-path "^3.0.0" + buffer "^6.0.3" + chalk "^4.1.0" + cli-highlight "^2.1.11" + debug "^4.3.1" + dotenv "^8.2.0" + glob "^7.1.6" + js-yaml "^4.0.0" + mkdirp "^1.0.4" + reflect-metadata "^0.1.13" + sha.js "^2.4.11" + tslib "^2.1.0" + uuid "^8.3.2" + xml2js "^0.4.23" + yargs "^17.0.1" + zen-observable-ts "^1.0.0" + +typescript@*, typescript@^5.0.2, typescript@>=2.7, "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": + version "5.0.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz" + integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw== + +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@0.10.3: + version "0.10.3" + resolved "https://registry.npmjs.org/url/-/url-0.10.3.tgz" + integrity sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +validator@^13.7.0: + version "13.9.0" + resolved "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz" + integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== + +vary@^1, vary@^1.1.2, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + 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" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2, wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xml2js@0.4.19: + version "0.4.19" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz" + integrity sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^16.0.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + 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" + +yargs@^17.0.1: + version "17.7.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +ylru@^1.2.0: + version "1.3.2" + resolved "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz" + integrity sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zen-observable-ts@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz" + integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== + dependencies: + "@types/zen-observable" "0.8.3" + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== diff --git a/res/DataBase b/res/DataBase new file mode 100644 index 00000000..30c6beee --- /dev/null +++ b/res/DataBase @@ -0,0 +1 @@ +{"AAA":{"Money":6,"StoreItem":{"MoveSpeed":false,"ShotSpeed":false,"BonusLife":false},"Setting":{"Volume":0.0,"IsMute":false,"KeySetting_1p":[37,39,38,40,10],"KeySetting_2p":[65,68,87,83,32]},"Achievement":{"LUCKY_GUY":false,"GAME_ACE":false,"SOUL_MATES":false,"BUDDY_FXXKER":false,"PAT_AND_MAT":false,"ADVENTURE_START":true,"DEADLY_ACCURACY":false,"AVIOPHOBIA":false,"SHARP_SHOOTER":true,"UNLUCKY_GUY":false}},"BAA":{"Money":0,"StoreItem":{"MoveSpeed":false,"ShotSpeed":false,"BonusLife":false},"Setting":{"Volume":0,"IsMute":false,"KeySetting_1p":[0,1,2,3,4],"KeySetting_2p":[8,9,10,11,12]},"Achievement":{"LUCKY_GUY":false,"GAME_ACE":false,"SOUL_MATES":false,"BUDDY_FXXKER":false,"PAT_AND_MAT":false,"ADVENTURE_START":false,"DEADLY_ACCURACY":false,"AVIOPHOBIA":false,"SHARP_SHOOTER":false,"UNLUCKY_GUY":false}},"Scores":{"Scores_1p":[{"name":"AAA","value":660},{"name":"AAA","value":660},{"name":"AAA","value":180},{"name":"AAA","value":120},{"name":"AAA","value":100},{"name":"ZAA","value":0},{"name":"YAA","value":0},{"name":"YAA","value":0},{"name":"YAA","value":0},{"name":"AAA","value":0}],"Scores_2p":[{"name":"AAA","value":120},{"name":"AAA","value":120},{"name":"AAA","value":60}]},"YAA":{"Money":0,"StoreItem":{"MoveSpeed":false,"ShotSpeed":false,"BonusLife":false},"Setting":{"Volume":0,"IsMute":false,"KeySetting_1p":[0,1,2,3,4],"KeySetting_2p":[8,9,10,11,12]},"Achievement":{"LUCKY_GUY":false,"GAME_ACE":false,"SOUL_MATES":false,"BUDDY_FXXKER":false,"PAT_AND_MAT":false,"ADVENTURE_START":true,"DEADLY_ACCURACY":false,"AVIOPHOBIA":false,"SHARP_SHOOTER":false,"UNLUCKY_GUY":false}},"ZAA":{"Money":0,"StoreItem":{"MoveSpeed":false,"ShotSpeed":false,"BonusLife":false},"Setting":{"Volume":0,"IsMute":false,"KeySetting_1p":[0,1,2,3,4],"KeySetting_2p":[8,9,10,11,12]},"Achievement":{"LUCKY_GUY":false,"GAME_ACE":false,"SOUL_MATES":false,"BUDDY_FXXKER":false,"PAT_AND_MAT":false,"ADVENTURE_START":true,"DEADLY_ACCURACY":false,"AVIOPHOBIA":false,"SHARP_SHOOTER":false,"UNLUCKY_GUY":false}}} \ No newline at end of file diff --git a/res/font.ttf b/res/Font/font.ttf similarity index 100% rename from res/font.ttf rename to res/Font/font.ttf diff --git a/res/Img/Cirno.png b/res/Img/Cirno.png new file mode 100644 index 00000000..1309e1d1 Binary files /dev/null and b/res/Img/Cirno.png differ diff --git a/res/Img/Flan's Shadow.png b/res/Img/Flan's Shadow.png new file mode 100644 index 00000000..356f0b82 Binary files /dev/null and b/res/Img/Flan's Shadow.png differ diff --git a/res/Img/Flan_Fuck.png b/res/Img/Flan_Fuck.png new file mode 100644 index 00000000..09b1b96a Binary files /dev/null and b/res/Img/Flan_Fuck.png differ diff --git a/res/Img/Flandre.png b/res/Img/Flandre.png new file mode 100644 index 00000000..03247bea Binary files /dev/null and b/res/Img/Flandre.png differ diff --git a/res/Img/HardModeScreen.png b/res/Img/HardModeScreen.png new file mode 100644 index 00000000..e9bd1ebc Binary files /dev/null and b/res/Img/HardModeScreen.png differ diff --git a/res/Img/MagazineDisplay.png b/res/Img/MagazineDisplay.png new file mode 100644 index 00000000..a29bea0a Binary files /dev/null and b/res/Img/MagazineDisplay.png differ diff --git a/res/Img/Magic.png b/res/Img/Magic.png new file mode 100644 index 00000000..da0bd0f4 Binary files /dev/null and b/res/Img/Magic.png differ diff --git a/res/Img/Magic2.png b/res/Img/Magic2.png new file mode 100644 index 00000000..018a05a7 Binary files /dev/null and b/res/Img/Magic2.png differ diff --git a/res/Img/Marisa.png b/res/Img/Marisa.png new file mode 100644 index 00000000..516a363d Binary files /dev/null and b/res/Img/Marisa.png differ diff --git a/res/Img/PlayScreen.png b/res/Img/PlayScreen.png new file mode 100644 index 00000000..b81dcf8e Binary files /dev/null and b/res/Img/PlayScreen.png differ diff --git a/res/Img/Reimu&marisa.png b/res/Img/Reimu&marisa.png new file mode 100644 index 00000000..33b18e95 Binary files /dev/null and b/res/Img/Reimu&marisa.png differ diff --git a/res/Img/Reimu.png b/res/Img/Reimu.png new file mode 100644 index 00000000..4682c41a Binary files /dev/null and b/res/Img/Reimu.png differ diff --git a/res/Img/Reload.gif b/res/Img/Reload.gif new file mode 100644 index 00000000..6d42f6f8 Binary files /dev/null and b/res/Img/Reload.gif differ diff --git a/res/Img/Sakuya.png b/res/Img/Sakuya.png new file mode 100644 index 00000000..fd4b4e61 Binary files /dev/null and b/res/Img/Sakuya.png differ diff --git a/res/Img/VioletCloud.png b/res/Img/VioletCloud.png new file mode 100644 index 00000000..b43914e8 Binary files /dev/null and b/res/Img/VioletCloud.png differ diff --git a/res/Resource b/res/Resource new file mode 100644 index 00000000..97687fe5 --- /dev/null +++ b/res/Resource @@ -0,0 +1,66 @@ +{ + "Entity":{ + "ShipType1":{ + "Idle":"Reimu.png", + "Destroyed" : "Marisa.png" + }, + "ShipType2":{ + "Idle":"Marisa.png", + "Destroyed" : "Reimu.png" + }, + "EnemyType1":{ + "Idle":"Cirno.png", + "Destroyed" : "Cirno.png" + }, + "EnemyType2":{ + "Idle":"Flandre.png", + "Destroyed" : "Flan_Fuck.png" + }, + "Bullet": "Magic.png", + "Item" : "Magic2.png" + }, + "StoreItem":{ + "BonusLife" : "Flan's Shadow.png", + "MoveSpeed" : "Sakuya.png", + "ShotSpeed" : "Sakuya.png" + }, + "GuideImplements":{ + "PlayScreen" : "PlayScreen.png", + "HardMode" : "HardModeScreen.png", + "RemaningMagazine" : "MagazineDisplay.png" + }, + + "BGM" : { + "MenuPage" : "B_Main_a.wav", + "AchievePage" :"B_Achieve.wav", + "SelectPage" :"B_Main_c.wav", + "HighScorePage":"B_HighScore.wav", + "GameOver":"B_gameover.wav", + "Level1" : "B_Level1.wav", + "Level2" : "B_Level2.wav", + "Level3" : "B_Level3.wav" + }, + "SFX" : { + "LevelStart":"S_LevelStart_b.wav", + "LevelStart2":"S_LevelStart_a.wav", + "Auxiliary" : "S_Item_SubShip.wav", + "SpeedUp":"S_Item_SpeedUp.wav", + "Ghost":"S_Item_Invicible.wav", + "BombAquip" : "S_Item_Bomb_Equipped.wav", + "PlayerShoot1" : "S_Ally_Shoot_a.wav", + "PlayerShoot2" : "S_Ally_Shoot_b.wav", + "PlayerShoot3" : "S_Ally_Shoot_c.wav", + "PlayerShoot4" : "S_Ally_Shoot_d.wav", + "EnemyShoot" : "S_Enemy_Shoot.wav", + "Destroyed" : "S_Enemy_Destroy_a.wav", + "PlayerDestroyed":"S_Ally_Destroy_a.wav", + "PlayerDestroyed2":"S_Ally_Destroy_b.wav", + "GetItem":"S_Item_Get.wav", + "Bomb" : "S_Item_Bomb.wav", + "ItemCreate" : "S_Item_Create.wav", + "GameOver" : "S_gameover.wav", + "LevelClear" : "S_LevelClear.wav", + "MenuSelect" : "S_MenuClick.wav" + }, + "Font": "font.ttf" +} \ No newline at end of file diff --git a/res/bulletGraphics b/res/bulletGraphics deleted file mode 100644 index 87aebcea..00000000 --- a/res/bulletGraphics +++ /dev/null @@ -1,7 +0,0 @@ -100001111110000 -111111000111111 -001001111100100 -011101000101110 -011101111101110 -011001111101100 -001101111100110 \ No newline at end of file diff --git a/res/enemyshipGraphics b/res/enemyshipGraphics deleted file mode 100644 index af26fef1..00000000 --- a/res/enemyshipGraphics +++ /dev/null @@ -1,6 +0,0 @@ -001110010111100101111010011011101110110011111010111110101110110001101110011110100111100100111001 -001110000111101001111111011011011110110011111010111110101110110001101101011111110111101000111000 -000000000000111000011000101111100110110100111101001111000011110101101101101111100001100000001110 -000000000111100000011101101111100110110000111100001111000011110001101100101111100001110101111000 -000000000000000000011010001111010110100011111100111111000110100000111101000110100000000000000000 -000000000000000000011001001110100110110111111010111110100110110100111010000110010000000000000000 \ No newline at end of file diff --git a/res/graphics b/res/graphics deleted file mode 100644 index 0bc1f7ba..00000000 --- a/res/graphics +++ /dev/null @@ -1,20 +0,0 @@ -00001111000111110001111100011111000111110111111111111111011111110001111100011111000111110001111100001111 -00001111000111110001111100011111000111110111111111111111011111110001111100011111000111110001111100001111 -00000100000000010001001100000011000001111011001100001111001011110000001100101111010010010000010000000011 -100001111110000 -000011111100001 -001110010111100101111010011011101110110011111010111110101110110001101110011110100111100100111001 -001110000111101001111111011011011110110011111010111110101110110001101101011111110111101000111000 -000000000000111000011000101111100110110100111101001111000011110101101101101111100001100000001110 -000000000111100000011101101111100110110000111100001111000011110001101100101111100001110101111000 -000000000000000000011010001111010110100011111100111111000110100000111101000110100000000000000000 -000000000000000000011001001110100110110111111010111110100110110100111010000110010000000000000000 -0000100000110000111100110111011111011111001110100111111011111101110100111110001111100110111001111000011000000100 -0001000100100101000100010100100000101000100000000010001010000010010100010001010010010001000 -111101111 -0111000111110001111100011111011111011111000111000 -000000000000000000000000000011000001110011111000111110000001110000001100000000000000000000000000 -010000100110011111000110 -1000101010001000101010001 -00110110110001100011 -00110000111100000011 \ No newline at end of file diff --git a/res/menu.wav b/res/menu.wav deleted file mode 100644 index 9b539ab6..00000000 Binary files a/res/menu.wav and /dev/null differ diff --git a/res/scores b/res/scores deleted file mode 100644 index a4cc05c7..00000000 --- a/res/scores +++ /dev/null @@ -1,8 +0,0 @@ -ROB -6500 -PAT -6000 -KOF -5500 -BYR -5000 \ No newline at end of file diff --git a/res/scores_1p b/res/scores_1p deleted file mode 100644 index e69de29b..00000000 diff --git a/res/scores_2p b/res/scores_2p deleted file mode 100644 index e69de29b..00000000 diff --git a/res/settings b/res/settings deleted file mode 100644 index 26d5db86..00000000 --- a/res/settings +++ /dev/null @@ -1,36 +0,0 @@ -Volume -80 -BGM -1 -A -0x41 -D -0x44 -W -0x57 -1 -0x31 -2 -0x32 -4 -0x34 -3 -0x33 -BACK QUOTE -0xC0 -LEFT -0x25 -RIGHT -0x27 -UP -0x26 -7 -0x37 -8 -0x38 -0 -0x30 -9 -0x39 -ENTER -0x0A \ No newline at end of file diff --git a/res/shipGraphics b/res/shipGraphics deleted file mode 100644 index cdced3df..00000000 --- a/res/shipGraphics +++ /dev/null @@ -1,7 +0,0 @@ -00001111000111110001111100011111000111110111111111111111011111110001111100011111000111110001111100001111 -11000000111000001111000011111111111111001111111011111111111111101111110011111111111100001110000011000000 -00000011011111110111111100001111001111110111111111111111011111110011111100001111011111110111111100000011 -00000011000001110000111100011111001111110111111111111111011111110011111100011111000011110000011100000011 -00000011001111110011111100011111001111110111111111111111011111110011111100011111001111110011111100000011 -00001000000010000001100000011000001110001111111111111111111111110011100000011000000110000000100000001000 -11111100011111100000001100000011000000110001111100111111000111110000001100000011000000110111111011111100 \ No newline at end of file diff --git a/res/specialenemyGraphics b/res/specialenemyGraphics deleted file mode 100644 index da6df34e..00000000 --- a/res/specialenemyGraphics +++ /dev/null @@ -1,8 +0,0 @@ -0000100000110000111100110111011111011111001110100111111011111101110100111110001111100110111001111000011000000100 -0001000001110000111000111111011111011111001111100111111011111101111100111110001111100111111001110000111000001000 -1111111001110000111000011100011111011111111111111111111111111111111111111111101111100011100001110000111001111111 -0000011000011000011000011111011111011111001111100111111111111111111100111110001111100011111000110000001100000011 -0000011000011100011110011111011111111111111111111111111111111111111111111111101111110011111000111100001110000011 -1100000111000011110001111100111111011111111111111111111111111111111111111111111111101111100111100011100001100000 -1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -0001000001110000111000111110011111011111111111111111111111111111111111111111101111100111110001110000111000001000 \ No newline at end of file diff --git a/src/EnginePrime/Component.java b/src/EnginePrime/Component.java new file mode 100644 index 00000000..2ead9c7f --- /dev/null +++ b/src/EnginePrime/Component.java @@ -0,0 +1,44 @@ +package EnginePrime; + +import java.util.HashMap; +import java.util.Map; +import java.util.ArrayList; +import java.util.function.Consumer; + +public abstract class Component { + int LifeStep = -1; + int RenderPrior = 1; + // 수신 이벤트 등록 + public Map> CustomEvent = new HashMap<>(); + public ArrayList MessagePool = new ArrayList<>(); + public Entity Obj = null; + + public void ProcMessage() { + if (LifeStep < 2) { + return; + } + for (Message m : MessagePool) { + Consumer f = CustomEvent.get(m.obj.get("Func")); + if (f != null) { + f.accept(m); + } + } + MessagePool.clear(); + } + + public void SetRenderPrior(int p) { + RenderPrior = p; + } + + public void Awake() { + }; + + public void Start() { + }; + + public void Update() { + }; + + public void Render() { + }; +} diff --git a/src/EnginePrime/Core.java b/src/EnginePrime/Core.java new file mode 100644 index 00000000..f6699a2d --- /dev/null +++ b/src/EnginePrime/Core.java @@ -0,0 +1,33 @@ +package EnginePrime; + +public final class Core { + public static void main(final String[] args) { + EventSystem em = EventSystem.getInstance(); + GameManager gm = GameManager.getInstance(); + gm.frame = new Frame(); + InputManager im = InputManager.getInstance(); + gm.frame.addKeyListener(im); + gm.Initialize(); + while (gm.running) { + gm.InstanceChanged = false; + em.ProcMessage(); + gm.PreUpdate(); + em.ProcMessage(); + EventSystem.getInstance().Update(); + em.ProcMessage(); + gm.LateUpdate(); + em.ProcMessage(); + gm.PreRender(); + em.ProcMessage(); + em.RenderEntity(); + em.ProcMessage(); + gm.LateRender(); + em.ProcMessage(); + gm.frame.Render(); + } + System.exit(0); + } + + private Core() { + } +} diff --git a/src/EnginePrime/EngineTimer.java b/src/EnginePrime/EngineTimer.java new file mode 100644 index 00000000..0ed9ea7c --- /dev/null +++ b/src/EnginePrime/EngineTimer.java @@ -0,0 +1,80 @@ +package EnginePrime; + +public class EngineTimer implements GManager { + long previousTime; + long currentTime; + double elapsedSeconds; + double maxfps; + + public void PreRender() { + }; + + public void LateRender() { + }; + + private EngineTimer() { + maxfps = 0; + }; + + public static EngineTimer instance = null; + + public void Exit() { + }; + + public static void ExecuteTimer(Runnable code, double time) { + new Thread(new Runnable() { + public void run() { + long prev = System.nanoTime(); + double elapsed = 0; + while (elapsed < time) { + long cur = System.nanoTime() - prev; + elapsed = cur / 1_000_000_000.0; + } + code.run(); + } + }).start(); + } + + public void Initialize() { + Reset(); + }; + + public void PreUpdate() { + currentTime = System.nanoTime(); + long elapsedTime = currentTime - previousTime; + elapsedSeconds = (double) elapsedTime / 1_000_000_000.0; + previousTime = currentTime; + double t = (maxfps - elapsedSeconds) * 1000; + if (t > 0) { + try { + Thread.sleep((long) t); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + + public void LateUpdate() { + }; + + public static EngineTimer getInstance() { + if (instance == null) { + instance = new EngineTimer(); + } + return instance; + } + + public void Reset() { + previousTime = System.nanoTime(); + currentTime = previousTime; + elapsedSeconds = 0; + } + + public void SetMaxFps(int f) { + maxfps = 1 / (double) f; + } + + public double GetElapsedSeconds() { + return elapsedSeconds; + } +} \ No newline at end of file diff --git a/src/EnginePrime/Entity.java b/src/EnginePrime/Entity.java new file mode 100644 index 00000000..b7f818ba --- /dev/null +++ b/src/EnginePrime/Entity.java @@ -0,0 +1,57 @@ +package EnginePrime; + +import java.util.HashMap; +import java.util.Map; + +public class Entity { + public boolean isAlve = true; + public String name; + public String tag; + public Map ComponentPool = new HashMap<>(); + + public T AddComponent(Class type, int lifestep) { + try { + T c = type.getDeclaredConstructor().newInstance(); + c.Obj = this; + ComponentPool.put(c.getClass().getName(), c); + if (lifestep > 0) { + c.Awake(); + c.LifeStep = 1; + } + if (lifestep > 1) { + c.Start(); + c.LifeStep = 2; + } + return c; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public T AddComponent(Class type) { + try { + T c = type.getDeclaredConstructor().newInstance(); + c.Obj = this; + c.LifeStep = 0; + ComponentPool.put(c.getClass().getName(), c); + return c; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public T GetComponent(Class type) { + Component c = ComponentPool.get(type.getName()); + return type.cast(c); + } + + public T RemoveComponent(Class type) { + T c = GetComponent(type); + c.Obj = null; + c.LifeStep = -1; + ComponentPool.remove(type.getName()); + return c; + } +} diff --git a/src/EnginePrime/EventSystem.java b/src/EnginePrime/EventSystem.java new file mode 100644 index 00000000..e2c0ff0d --- /dev/null +++ b/src/EnginePrime/EventSystem.java @@ -0,0 +1,135 @@ +package EnginePrime; + +import java.util.HashMap; +import java.util.Map; +import java.util.ArrayList; +import java.util.UUID; + +public class EventSystem { + private static EventSystem instance = null; + private static Map EntityPool = new HashMap<>(); + private static ArrayList MessagePool = new ArrayList<>(); + + private EventSystem() { + }; + + public static EventSystem getInstance() { + if (instance == null) { + instance = new EventSystem(); + } + return instance; + } + + public static void SendMessage(Message m) { + MessagePool.add(m); + } + + public static Entity Initiate(String name) { + Entity e = new Entity(); + e.name = name; + MessagePool.add(new Message(e, Message.MessageType.ADD)); + return e; + } + + public static ArrayList FindTagEntities(String tag) { + ArrayList entities = new ArrayList<>(); + for (Entity entity : EntityPool.values()) { + if (entity.tag == tag && entity.isAlve) { + entities.add(entity); + } + } + return entities; + } + + public static Entity Initiate() { + Entity e = new Entity(); + e.name = UUID.randomUUID().toString(); + MessagePool.add(new Message(e, Message.MessageType.ADD)); + return e; + } + + public static void DestroyAll() { + for (Entity entity : EntityPool.values()) { + entity.isAlve = false; + Destroy(entity); + } + } + + public static Entity Destroy(Entity e) { + e.isAlve = false; + MessagePool.add(new Message(e, Message.MessageType.Remove)); + return e; + } + + public static Entity FindEntity(String name) { + Entity e = EntityPool.get(name); + if (e != null && e.isAlve) { + return EntityPool.get(name); + } + return null; + } + + public static void ProcMessage() { + for (Message m : MessagePool) { + if (m.message == Message.MessageType.ADD) { + EntityPool.put(m.e.name, m.e); + } + if (m.message == Message.MessageType.Remove) { + EntityPool.remove(m.e.name); + } + if (m.message == Message.MessageType.Custom) { + Entity e = (Entity) m.obj.get("Entity"); + for (Component c : e.ComponentPool.values()) { + c.MessagePool.add(m); + c.ProcMessage(); + } + } + } + MessagePool.clear(); + } + + public static void Update() { + for (Entity entity : EntityPool.values()) { + if (!entity.isAlve) { + continue; + } + for (Component c : entity.ComponentPool.values()) { + switch (c.LifeStep) { + case 0: + c.Awake(); + c.LifeStep += 1; + break; + case 1: + c.Start(); + c.LifeStep += 1; + break; + case 2: + c.ProcMessage(); + c.LifeStep += 1; + break; + case 3: + c.ProcMessage(); + c.Update(); + break; + default: + break; + } + } + } + } + + public static void RenderEntity() { + for (int i = 0; i < 3; i++) { + for (Entity entity : EntityPool.values()) { + if (!entity.isAlve) { + continue; + } + for (Component c : entity.ComponentPool.values()) { + if (c.LifeStep == 3 && c.RenderPrior == i) { + c.Render(); + } + } + } + } + } +} diff --git a/src/EnginePrime/FileManager.java b/src/EnginePrime/FileManager.java new file mode 100644 index 00000000..e4ed5c30 --- /dev/null +++ b/src/EnginePrime/FileManager.java @@ -0,0 +1,63 @@ +package EnginePrime; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.charset.Charset; +import java.awt.image.BufferedImage; +import javax.imageio.ImageIO; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +public class FileManager { + public static BufferedImage GetImage(String name) { + try { + File inputFile = new File("res" + File.separator + name); // 읽을 PNG 파일 경로 + return ImageIO.read(inputFile); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static void SaveString(String name, String s, boolean overwrite) { + String path = "res" + File.separator + name; + try (FileWriter fileWriter = new FileWriter(path, Charset.forName("UTF-8"), !overwrite)) { + fileWriter.write(s); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static JSONObject LoadJsonObject(String name) { + String jsonString = LoadString(name); + JSONObject jobj = new JSONObject(); + if (!jsonString.isEmpty()) { + JSONParser parser = new JSONParser(); + try { + jobj = (JSONObject) parser.parse(jsonString); + } catch (ParseException e) { + e.printStackTrace(); + } + } + return jobj; + } + + public static String LoadString(String name) { + String path = "res" + File.separator + name; + StringBuilder output = new StringBuilder(); + try (BufferedReader bufferedReader = new BufferedReader(new FileReader(path, Charset.forName("UTF-8")))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + output.append(line); // StringBuilder에 누적 + } + return output.toString(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; // 읽은 문자열을 반환 + } +} diff --git a/src/EnginePrime/Frame.java b/src/EnginePrime/Frame.java new file mode 100644 index 00000000..fdb33ff4 --- /dev/null +++ b/src/EnginePrime/Frame.java @@ -0,0 +1,22 @@ +package EnginePrime; + +import javax.swing.JFrame; + +public class Frame extends JFrame { + public Frame() { + setResizable(false); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setUndecorated(true); + setVisible(true); + } + + public void SetSize(final int width, final int height) { + super.setSize(width, height); + setLocationRelativeTo(null); + RenderManager.getInstance().Resize(width, height); + } + + public void Render() { + RenderManager.getInstance().Render(this); + } +} diff --git a/src/EnginePrime/GManager.java b/src/EnginePrime/GManager.java new file mode 100644 index 00000000..7165fd0d --- /dev/null +++ b/src/EnginePrime/GManager.java @@ -0,0 +1,15 @@ +package EnginePrime; + +public interface GManager { + public void Initialize(); + + public void PreUpdate(); + + public void LateUpdate(); + + public void PreRender(); + + public void LateRender(); + + public void Exit(); +} \ No newline at end of file diff --git a/src/EnginePrime/GameManager.java b/src/EnginePrime/GameManager.java new file mode 100644 index 00000000..ee91e85b --- /dev/null +++ b/src/EnginePrime/GameManager.java @@ -0,0 +1,100 @@ +package EnginePrime; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import org.json.simple.JSONObject; +import GamePrime.Entry; + +public final class GameManager implements GManager { + public static Frame frame = null; + public static boolean running = true; + public final static EngineTimer Et = EngineTimer.getInstance(); + public final static RenderManager Rm = RenderManager.getInstance(); + public final static InputManager Im = InputManager.getInstance(); + public final static SoundManager Sm = SoundManager.getInstance(); + public static GameManager instance = null; + public static GManager CustomInstance = null; + public static boolean InstanceChanged = false; + public final static Map GlobalData = new HashMap<>(); + public final static ArrayList ExitCode = new ArrayList<>(); + + private GameManager() { + }; + + public void Exit() { + }; + + public static GameManager getInstance() { + if (instance == null) { + instance = new GameManager(); + CustomInstance = new Entry(); + } + return instance; + } + + public void Initialize() { + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + for (Runnable code : ExitCode) { + code.run(); + } + })); + Et.Initialize(); + Rm.Initialize(); + Im.Initialize(); + Sm.Initialize(); + GlobalData.put("LocalData", new JSONObject()); + SetInstance(new Entry()); + } + + public void SetInstance(GManager inst) { + if (CustomInstance != null) { + CustomInstance.Exit(); + } + CustomInstance = inst; + if (CustomInstance != null) { + InstanceChanged = true; + CustomInstance.Initialize(); + } + } + + public void PreUpdate() { + Et.PreUpdate(); + Rm.PreUpdate(); + Im.PreUpdate(); + Sm.PreUpdate(); + if (CustomInstance != null && !InstanceChanged) { + CustomInstance.PreUpdate(); + } + } + + public void LateUpdate() { + Et.LateUpdate(); + Rm.LateUpdate(); + Im.LateUpdate(); + Sm.LateUpdate(); + if (CustomInstance != null && !InstanceChanged) { + CustomInstance.LateUpdate(); + } + } + + public void PreRender() { + Et.PreRender(); + Rm.PreRender(); + Im.PreRender(); + Sm.PreRender(); + if (CustomInstance != null && !InstanceChanged) { + CustomInstance.PreRender(); + } + } + + public void LateRender() { + Et.LateRender(); + Rm.LateRender(); + Im.LateRender(); + Sm.LateRender(); + if (CustomInstance != null && !InstanceChanged) { + CustomInstance.LateRender(); + } + } +} diff --git a/src/EnginePrime/InputManager.java b/src/EnginePrime/InputManager.java new file mode 100644 index 00000000..6b07715b --- /dev/null +++ b/src/EnginePrime/InputManager.java @@ -0,0 +1,110 @@ +package EnginePrime; + +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.Arrays; + +public final class InputManager implements GManager, KeyListener { + private static InputManager instance; + + public void PreRender() { + }; + + public void LateRender() { + }; + + public static InputManager getInstance() { + if (instance == null) + instance = new InputManager(); + return instance; + } + + private InputManager() { + } + + private static final int NUM_KEYS = 256; + /** Array with the keys marked as pressed or not. */ + private static KeyState[] state; + private static KeyState[] newstate; + + public void Exit() { + }; + + public int GetAnyKeyDown() { + for (int i = 0; i < NUM_KEYS; i++) { + if (state[i] == KeyState.Down) { + return i; + } + } + return -1; + } + + public void Initialize() { + state = new KeyState[NUM_KEYS]; + newstate = new KeyState[NUM_KEYS]; + Arrays.fill(state, KeyState.Released); + Arrays.fill(newstate, KeyState.Released); + }; + + public void PreUpdate() { + UpdateKeyState(); + }; + + public void LateUpdate() { + }; + + private void UpdateKeyState() { + for (int i = 0; i < NUM_KEYS; i++) { + if (newstate[i] == KeyState.Released) { + if (state[i] == KeyState.Up) { + state[i] = KeyState.Released; + } else if (state[i] == KeyState.Down) { + state[i] = KeyState.Pressed; + } + } else { + if (newstate[i] == KeyState.Up && state[i] != KeyState.Up && state[i] != KeyState.Released) { + state[i] = KeyState.Up; + } else if (newstate[i] == KeyState.Down) { + if (state[i] == KeyState.Released) { + state[i] = KeyState.Down; + } else if (state[i] == KeyState.Down) { + state[i] = KeyState.Pressed; + } + } + } + } + Arrays.fill(newstate, KeyState.Released); + } + + public boolean isKeyDown(final int keyCode) { + return state[keyCode] == KeyState.Down; + } + + public boolean isKeyUp(int keyCode) { + return state[keyCode] == KeyState.Up; + } + + public boolean isKeyPressed(int keyCode) { + return state[keyCode] == KeyState.Pressed; + } + + public boolean isKeyReleased(int keyCode) { + return state[keyCode] == KeyState.Released; + } + + @Override + public void keyPressed(final KeyEvent key) { + if (key.getKeyCode() >= 0 && key.getKeyCode() < NUM_KEYS) + newstate[key.getKeyCode()] = KeyState.Down; + } + + @Override + public void keyReleased(final KeyEvent key) { + if (key.getKeyCode() >= 0 && key.getKeyCode() < NUM_KEYS) + newstate[key.getKeyCode()] = KeyState.Up; + } + + @Override + public void keyTyped(final KeyEvent key) { + } +} \ No newline at end of file diff --git a/src/EnginePrime/KeyState.java b/src/EnginePrime/KeyState.java new file mode 100644 index 00000000..7fcbb311 --- /dev/null +++ b/src/EnginePrime/KeyState.java @@ -0,0 +1,5 @@ +package EnginePrime; + +public enum KeyState { + Released, Down, Pressed, Up, +} \ No newline at end of file diff --git a/src/EnginePrime/Message.java b/src/EnginePrime/Message.java new file mode 100644 index 00000000..7b011146 --- /dev/null +++ b/src/EnginePrime/Message.java @@ -0,0 +1,25 @@ +package EnginePrime; + +import org.json.simple.JSONObject; + +public class Message { + public enum MessageType { + ADD, Remove, Custom, // "Entity" , "Func" 지정. + } + + public Entity e; + public MessageType message; + public JSONObject obj; + + public Message(Entity e, MessageType m) { + this.e = e; + this.message = m; + obj = null; + } + + public Message(Entity e, MessageType m, JSONObject obj) { + this.e = e; + this.message = m; + this.obj = obj; + } +} diff --git a/src/EnginePrime/RenderManager.java b/src/EnginePrime/RenderManager.java new file mode 100644 index 00000000..5cc982bf --- /dev/null +++ b/src/EnginePrime/RenderManager.java @@ -0,0 +1,104 @@ +package EnginePrime; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.FontMetrics; + +public final class RenderManager implements GManager { + public void PreRender() { + }; + + public void LateRender() { + }; + + static boolean FrontBuffer; + static BufferedImage backBuffer[]; + static Graphics graphics[]; + private static RenderManager instance = null; + public static Map fontList = new HashMap<>(); + + private RenderManager() { + }; + + public static RenderManager getInstance() { + if (instance == null) { + instance = new RenderManager(); + } + return instance; + } + + public void Initialize() { + }; + + public void PreUpdate() { + }; + + public void LateUpdate() { + }; + + public static Font LoadFont(String path) { + try { + FileInputStream inputStream = new FileInputStream("res" + File.separator + path); + Font font = Font.createFont(Font.TRUETYPE_FONT, inputStream); + return font; + } catch (IOException | FontFormatException e) { + e.printStackTrace(); + } + return null; + } + + public static FontMetrics SetFont(String name) { + Font font = fontList.get(name); + Graphics g = GetCurrentGraphic(); + g.setFont(font); + return g.getFontMetrics(font); + } + + public static Font CreateFont(Font font, String name, float size) { + Font newfont = font.deriveFont(size); + fontList.put(name, newfont); + return newfont; + } + + public static void Fill() { + Fill(Color.BLACK); + } + + public static BufferedImage GetCurrentBuffer() { + return backBuffer[((FrontBuffer) ? 1 : 0)]; + }; + + public static Graphics GetCurrentGraphic() { + return graphics[((FrontBuffer) ? 1 : 0)]; + }; + + public void Exit() { + }; + + public void Render(Frame f) { + f.getGraphics().drawImage(GetCurrentBuffer(), 0, 0, f); + FrontBuffer = !FrontBuffer; + RenderManager.Fill(); + } + + public static void Fill(Color col) { + BufferedImage buffer = GetCurrentBuffer(); + Graphics graphic = buffer.getGraphics(); + graphic.setColor(col); + graphic.fillRect(0, 0, buffer.getWidth(), buffer.getHeight()); + } + + public void Resize(final int width, final int height) { + backBuffer = new BufferedImage[] { new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB), + new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) }; + graphics = new Graphics[] { backBuffer[0].getGraphics(), backBuffer[1].getGraphics() }; + } +} \ No newline at end of file diff --git a/src/EnginePrime/SoundManager.java b/src/EnginePrime/SoundManager.java new file mode 100644 index 00000000..a153b560 --- /dev/null +++ b/src/EnginePrime/SoundManager.java @@ -0,0 +1,240 @@ +package EnginePrime; + +import java.io.File; +import java.util.HashMap; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.FloatControl; +import javax.sound.sampled.FloatControl.Type; +import java.util.UUID; + +public class SoundManager implements GManager { + + + private static HashMap clips = new HashMap<>(); + + public void PreRender() { + }; + + public void LateRender() { + }; + + private static boolean IsMute = false; + + public class PlayProp { + /* + * 단순히 재생만 하고자 할 경우 ClipName은 NULL로 지정. + */ + public String FilePath = null; + public String Clipname = null; + public long MicroSecPos = 0; + public int count = 0; + public float fadeIn = 0; + + public PlayProp(String file, String name) { + FilePath = file; + Clipname = name; + Clip clip = clips.get(Clipname); + if (clip != null) { + MicroSecPos = clip.getMicrosecondPosition(); + } + }; + } + + private static float master = 0; + public static final float minimum = -80; + public static final float maximum = 6; + private static SoundManager instance; + + + public Clip GetClip(String clipname){ + Clip clip = clips.get(clipname); + return clip; + } + + + private SoundManager() { + }; + + public void Initialize() { + // 메모리 누수 방지 + GameManager gm = GameManager.getInstance(); + gm.ExitCode.add(new Runnable() { + @Override + public void run() { + for (Clip clip : clips.values()) { + clip.close(); + } + } + }); + }; + + public void PreUpdate() { + }; + + public void LateUpdate() { + }; + + public void Exit() { + }; + + public static boolean IsMute() { + return IsMute; + } + + public static float GetVolumePercent() { + return (master - minimum) / (maximum - minimum) * 100; + } + + private static void SetVolume(Clip clip, float value) { + FloatControl floatControl = (FloatControl) clip.getControl(Type.MASTER_GAIN); + if (IsMute) { + floatControl.setValue(minimum); + } else { + floatControl.setValue(value); + } + } + + public static void SetMute(boolean b) { + IsMute = b; + for (Clip clip : clips.values()) { + SetVolume(clip, 0); + } + } + + public static SoundManager getInstance() { + if (instance == null) + instance = new SoundManager(); + return instance; + } + + public static void playSound(PlayProp prop) { + try { + Clip clip = clips.get(prop.Clipname); + if (clip == null) { + clip = NewClip(prop); + AudioInputStream audioIn = AudioSystem + .getAudioInputStream(new File("res" + File.separator + prop.FilePath)); + clip.open(audioIn); + } + SetVolume(clip, master); + clip.setMicrosecondPosition(prop.MicroSecPos); + clip.loop(prop.count); + fadeIn(prop.Clipname, prop.fadeIn); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static Clip NewClip(PlayProp prop) { + Clip clip; + try { + clip = AudioSystem.getClip(); + String clipname = prop.Clipname == null ? UUID.randomUUID().toString() : prop.Clipname; + clip.addLineListener(event -> { + if (event.getType() == LineEvent.Type.STOP) { + if (clip.getMicrosecondPosition() == clip.getMicrosecondLength()) { + clips.remove(clipname); + CloseClip(clip); + } + } + }); + clips.put(clipname, clip); + return clip; + } catch (LineUnavailableException e) { + e.printStackTrace(); + } + return null; + } + + public static void PauseClip(String clipName) { + Clip clip = clips.get(clipName); + if (clip == null) { + return; + } + clip.stop(); + } + + public static void StopAll() { + for (String key : clips.keySet()) { + Clip clip = clips.get(key); + CloseClip(clip); + } + clips.clear(); + } + + static void CloseClip(Clip clip) { + new Thread(new Runnable() { + public void run() { + clip.close(); + } + }).start(); + } + + public static void StopClip(String clipName) { + Clip clip = clips.get(clipName); + if (clip == null) { + return; + } + clips.remove(clipName); + CloseClip(clip); + } + + public static void StopClip(String clipName, float fout) { + fadeOut(clipName, fout); + } + + private static void fadeIn(String name, float t) { + if (t > 0) { + Clip clip = clips.get(name); + new Thread(new Runnable() { + public void run() { + SetVolume(clip, minimum); + double elapsed = 0; + while (elapsed < t) { + elapsed += GameManager.getInstance().Et.GetElapsedSeconds(); + elapsed = elapsed > t ? t : elapsed; + SetVolume(clip, (float) (minimum + master * elapsed / t)); + } + } + }).start(); + } + } + + private static void fadeOut(String name, float t) { + Clip clip = clips.get(name); + if (clip == null) { + return; + } + clips.remove(name); + new Thread(new Runnable() { + public void run() { + double elapsed = 0; + while (elapsed < t) { + elapsed += GameManager.getInstance().Et.GetElapsedSeconds(); + elapsed = elapsed > t ? t : elapsed; + SetVolume(clip, (float) (master + (minimum - master) * elapsed / t)); + } + CloseClip(clip); + } + }).start(); + } + + public static float GetMasterVolume() { + return master; + } + + public static void setMasterVolume(float volume) { + master = volume; + if (master > maximum) + master = maximum; + else if (master < minimum) + master = minimum; + for (Clip clip : clips.values()) { + SetVolume(clip, master); + } + } +} \ No newline at end of file diff --git a/src/GamePrime/Define/AchievDefine.java b/src/GamePrime/Define/AchievDefine.java new file mode 100644 index 00000000..e2d259d8 --- /dev/null +++ b/src/GamePrime/Define/AchievDefine.java @@ -0,0 +1,6 @@ +package GamePrime.Define; + +public class AchievDefine { + public static String[] Achieve = { "ADVENTURE_START", "SHARP_SHOOTER", "DEADLY_ACCURACY", "LUCKY_GUY", + "UNLUCKY_GUY", "GAME_ACE", "SOUL_MATES", "AVIOPHOBIA", "BUDDY_FXXKER", "PAT_AND_MAT" }; +} diff --git a/src/GamePrime/Define/ItemDefine.java b/src/GamePrime/Define/ItemDefine.java new file mode 100644 index 00000000..4672895b --- /dev/null +++ b/src/GamePrime/Define/ItemDefine.java @@ -0,0 +1,17 @@ +package GamePrime.Define; + +public class ItemDefine { + public static class IntPair { + public String name; + public int value; + + public IntPair(String name, int value) { + this.name = name; + this.value = value; + } + } + + public static IntPair[] StoreItem = { new IntPair("BonusLife", 15), new IntPair("MoveSpeed", 10), + new IntPair("ShotSpeed", 20) }; + public static String[] ActiveItem = { "Ghost", "Auxiliary", "Bomb", "SpeedUp" }; +} \ No newline at end of file diff --git a/src/GamePrime/Define/KeyDefine.java b/src/GamePrime/Define/KeyDefine.java new file mode 100644 index 00000000..19c9d691 --- /dev/null +++ b/src/GamePrime/Define/KeyDefine.java @@ -0,0 +1,5 @@ +package GamePrime.Define; + +public class KeyDefine { + public static String[] KeyFunc = { "LEFT", "RIGHT", "ATTACK", "RELOAD", "ITEM" }; +} diff --git a/src/GamePrime/Define/ShipDefine.java b/src/GamePrime/Define/ShipDefine.java new file mode 100644 index 00000000..4b45ab2b --- /dev/null +++ b/src/GamePrime/Define/ShipDefine.java @@ -0,0 +1,5 @@ +package GamePrime.Define; + +public class ShipDefine { + public final static String[] Ship = { "Ship1", "Ship2" }; +} diff --git a/src/GamePrime/ETC/Image.java b/src/GamePrime/ETC/Image.java new file mode 100644 index 00000000..b5b8b13c --- /dev/null +++ b/src/GamePrime/ETC/Image.java @@ -0,0 +1,51 @@ +package GamePrime.ETC; + +import java.awt.image.BufferedImage; +import EnginePrime.GameManager; +import java.awt.Graphics2D; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Graphics; + +public class Image { + BufferedImage img; + GameManager gm = GameManager.getInstance(); + + public Image(BufferedImage img) { + this.img = img; + } + + public float GetWidthFixHeight(float height) { + return height * img.getWidth() / (float) img.getHeight(); + } + + public float GetHeightFixWidth(float width) { + return width * img.getHeight() / (float) img.getWidth(); + } + + public void RenderFixedWH(int x, int y, int w, int h) { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + Graphics2D graphics2D = (Graphics2D) grpahics; + graphics2D.drawImage(img, x, y, w, h, null); + } + + public void RenderFixedHeight(int x, int y, int height) { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + Graphics2D graphics2D = (Graphics2D) grpahics; + int width = Math.round(GetWidthFixHeight(height)); + graphics2D.drawImage(img, x - width / 2, y - height / 2, width, height, null); + // graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, + // 1.0f)); + // graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, + // 0.2f)); + } + + public void RenderFixedHeight(int x, int y, int height, float alpha) { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + Graphics2D graphics2D = (Graphics2D) grpahics; + int width = Math.round(GetWidthFixHeight(height)); + graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); + graphics2D.drawImage(img, x - width / 2, y - height / 2, width, height, null); + graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f)); + } +} diff --git a/src/GamePrime/ETC/Score.java b/src/GamePrime/ETC/Score.java new file mode 100644 index 00000000..90f73dd4 --- /dev/null +++ b/src/GamePrime/ETC/Score.java @@ -0,0 +1,29 @@ +package GamePrime.ETC; + +import org.json.simple.JSONObject; + +public class Score implements Comparable { + public String name; + public int value; + + public Score(String name, int value) { + this.name = name; + this.value = value; + } + + @Override + public int compareTo(Score other) { + return this.value - other.value; + } + + public static Score toScore(JSONObject obj) { + return new Score((String) obj.get("name"), ((Number) obj.get("value")).intValue()); + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put("name", this.name); + json.put("value", this.value); + return json; + } +} diff --git a/src/GamePrime/Entry.java b/src/GamePrime/Entry.java new file mode 100644 index 00000000..929e4d10 --- /dev/null +++ b/src/GamePrime/Entry.java @@ -0,0 +1,40 @@ +package GamePrime; + +import java.io.File; +import org.json.simple.JSONObject; +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import GamePrime.Page.LoginPage; +import java.awt.Font; + +public class Entry implements GManager { + GameManager gm = GameManager.getInstance(); + + public void Initialize() { + gm.frame.SetSize(800, 1000); + gm.Et.SetMaxFps(60); + JSONObject res = FileManager.LoadJsonObject("Resource"); + gm.GlobalData.put("Resource", res); + Font font = gm.Rm.LoadFont("Font" + File.separator + res.get("Font")); + gm.Rm.CreateFont(font, "Small", 12.0f); + gm.Rm.CreateFont(font, "Regular", 14.0f); + gm.Rm.CreateFont(font, "Big", 24.0f); + GameManager.getInstance().SetInstance(new LoginPage()); + } + + public void PreUpdate() { + }; + + public void LateUpdate() { + }; + + public void PreRender() { + }; + + public void LateRender() { + }; + + public void Exit() { + }; +} diff --git a/src/GamePrime/Page/AchievementPage.java b/src/GamePrime/Page/AchievementPage.java new file mode 100644 index 00000000..6ff67e8a --- /dev/null +++ b/src/GamePrime/Page/AchievementPage.java @@ -0,0 +1,133 @@ +package GamePrime.Page; + +import java.awt.event.KeyEvent; +import org.json.simple.JSONObject; +import java.io.File; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.FontMetrics; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import GamePrime.Define.AchievDefine; + +public class AchievementPage implements GManager { + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + JSONObject PlayData; + JSONObject Achievement; + SoundManager.PlayProp menuSoundProp; + + public void PreRender() { + }; + + public void LateRender() { + }; + + public void Initialize() { + JSONObject BGM = (JSONObject) res.get("BGM"); + JSONObject SFX = (JSONObject) res.get("SFX"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + SoundManager.PlayProp BgmProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("AchievePage"), "BGM"); + BgmProp.count = -1; + gm.Sm.StopClip("BGM", 1); + gm.Sm.playSound(BgmProp); + Achievement = (JSONObject) gm.GlobalData.get("LocalData").get("Achievement"); + PlayData = (JSONObject) gm.GlobalData.get("LocalData").get("PlayData"); + }; + + public void PreUpdate() { + }; + + public void LateUpdate() { + Draw(); + if ((gm.Im.isKeyDown(KeyEvent.VK_ESCAPE) || gm.Im.isKeyDown(KeyEvent.VK_SPACE))) { + gm.Sm.playSound(menuSoundProp); + gm.SetInstance(new MenuPage()); + } + }; + + public void Exit() { + }; + + private void Draw() { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + grpahics.setColor(Color.GREEN); + int x = 20; // Fixed X-coordinate for achievement titles. + int y = 50; // Fixed Y-coordinate for the initial position. + for (String name : AchievDefine.Achieve) { + grpahics.setColor(Color.YELLOW); + grpahics.drawString(name, x, y); + if ((boolean) Achievement.get(name)) { + grpahics.setColor(Color.GREEN); + } else { + grpahics.setColor(Color.RED); + } + // Calculate the position to display achievementStatus (completed or incomplete) + // on the right of achievementTitle. + int titleWidth = fontmatrix.stringWidth(name); + int statusX = x + titleWidth + 10; // You can adjust the spacing as needed. + // Display whether the achievement is completed or not. + String achievementStatus = (boolean) Achievement.get(name) ? "Completed" : "Incomplete"; + grpahics.drawString(achievementStatus, statusX, y); + // You can add more information about the achievement if needed. + // For example, you can display the progress or description. + // Increase the Y-coordinate for the next achievement entry. + y += fontmatrix.getHeight() + 10; + } + } + + public static void checkAchievements() { + GameManager gm = GameManager.getInstance(); + JSONObject Achievement = (JSONObject) gm.GlobalData.get("LocalData").get("Achievement"); + JSONObject PlayData = (JSONObject) gm.GlobalData.get("LocalData").get("PlayData"); + int level = ((Number) PlayData.get("Level")).intValue(); + int life_1 = ((Number) PlayData.get("Life")).intValue(); + int life_2 = ((Number) PlayData.get("Life2")).intValue(); + int Score = ((Number) PlayData.get("Point")).intValue(); + int gamemode = ((Number) gm.GlobalData.get("LocalData").get("PlayMode")).intValue(); + int shot = ((Number) PlayData.get("ShotCount")).intValue() + ((Number) PlayData.get("ShotCount2")).intValue(); + int shipsDestroyed = ((Number) PlayData.get("KillCount")).intValue() + + ((Number) PlayData.get("KillCount2")).intValue(); + double accuracy = ((double) shipsDestroyed / (double) shot) * 100; + int LuckyScore = 770; // '7' means the lucky number + int UnluckyScore = 440; // '4' means the unlucky number + int AceScore = 1110; // '1' means the ace in one card + // if the player play with good accuracy + Achievement.put("ADVENTURE_START", true); + if (shot > 0 && accuracy >= 90.0 && level >= 3) { + Achievement.put("SHARP_SHOOTER", true); + } + // Check if the players recorded perfect accuracy, if the player want to clear + // level 1, he has to shot 20 times at least + if (shot >= 20 && accuracy == 100) { + Achievement.put("DEADLY_ACCURACY", true); + } + // Check if the player didn't hit enemy's ships in 1p mode + if (gamemode == 1 && shot > 0 && accuracy == 0) { + Achievement.put("AVIOPHOBIA", true); + } + // Check if two players didn't hit enemy's ships + if (gamemode == 2 && shot > 0 && accuracy == 0) { + Achievement.put("PAT_AND_MAT", true); + } + // Check if two players clear level or gameover with same lives + if (gamemode == 2 && life_1 == life_2) { + Achievement.put("SOUL_MATES", true); + } + // Check one player has max life but the partner doesn't have + if (gamemode == 2 && (life_1 - life_2 == 3 || life_2 - life_1 == 3)) { + Achievement.put("BUDDY_FXXKER", true); + } + if (Score == LuckyScore) { + Achievement.put("LUCKY_GUY", true); + } else if (Score == UnluckyScore) { + Achievement.put("UNLUCKY_GUY", true); + } else if (Score == AceScore) { + Achievement.put("GAME_ACE", true); + } + } +} diff --git a/src/GamePrime/Page/EndPage.java b/src/GamePrime/Page/EndPage.java new file mode 100644 index 00000000..47319a78 --- /dev/null +++ b/src/GamePrime/Page/EndPage.java @@ -0,0 +1,215 @@ +package GamePrime.Page; + +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.FileManager; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import EnginePrime.SoundManager; +import GamePrime.ETC.Score; +import GamePrime.Ship.EnemyController; +import java.awt.event.KeyEvent; +import java.io.File; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.FontMetrics; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +public class EndPage implements GManager { + int SelectIndex; + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + JSONObject PlayData; + SoundManager.PlayProp menuSoundProp; + + public void Initialize() { + SelectIndex = 0; + PlayData = (JSONObject) gm.GlobalData.get("LocalData").get("PlayData"); + JSONObject SFX = (JSONObject) res.get("SFX"); + JSONObject BGM = (JSONObject) res.get("BGM"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + if (!(boolean) PlayData.get("LevelClear")) { + SoundManager.PlayProp GameOverSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("GameOver"), "BGM"); + GameOverSoundProp.count = -1; + gm.Sm.StopClip("BGM", 1); + gm.Sm.playSound(GameOverSoundProp); + gm.Sm.playSound(gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("GameOver"), null)); + } else { + gm.Sm.playSound(gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("LevelClear"), null)); + } + }; + + public void PreUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_UP)) { + SelectIndex = SelectIndex == 1 ? 0 : 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + SelectIndex = SelectIndex == 0 ? 1 : 0; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + int level = ((Number) PlayData.get("Level")).intValue(); + if (level < EnemyController.MaxStageCount && SelectIndex == 0 && (boolean) PlayData.get("LevelClear")) { + PlayData.put("Level", level + 1); + gm.SetInstance(new GamePage()); + return; + } + SavePlayData(); + gm.SetInstance(new MenuPage()); + } + }; + + public static void SavePlayData() { + FileManager fm = new FileManager(); + JSONObject SaveData = fm.LoadJsonObject("DataBase"); + String name = (String) GameManager.getInstance().GlobalData.get("LocalData").get("Player"); + JSONObject Userdata = (JSONObject) SaveData.get(name); + if (Userdata == null) { + Userdata = new JSONObject(); + SaveData.put(name, Userdata); + } + JSONObject PlayData = (JSONObject) GameManager.getInstance().GlobalData.get("LocalData").get("PlayData"); + float point = ((Number) PlayData.get("Point")).floatValue(); + point = point / 100; + if (point > 0) { + int money = ((Number) Userdata.get("Money")).intValue() + (int) point; + GameManager.getInstance().GlobalData.get("LocalData").put("Money", money); + Userdata.put("Money", money); + } + Userdata.put("StoreItem", GameManager.getInstance().GlobalData.get("LocalData").get("StoreItem")); + AchievementPage.checkAchievements(); + Userdata.put("Achievement", + (JSONObject) GameManager.getInstance().GlobalData.get("LocalData").get("Achievement")); + fm.SaveString("DataBase", SaveData.toJSONString(), true); + if (((Number) GameManager.getInstance().GlobalData.get("LocalData").get("PlayMode")).intValue() == 1) { + SaveScore("Scores_2p"); + } else { + SaveScore("Scores_1p"); + } + } + + static void SaveScore(String scoreAttr) { + List scoreList = new ArrayList<>(); + FileManager fm = new FileManager(); + JSONObject database = fm.LoadJsonObject("DataBase"); + JSONObject Scoreobj = (JSONObject) database.get("Scores"); + JSONArray scores = (JSONArray) Scoreobj.get(scoreAttr); + for (int i = 0; i < scores.size(); i++) { + scoreList.add(Score.toScore((JSONObject) scores.get(i))); + } + JSONObject PlayData = (JSONObject) GameManager.getInstance().GlobalData.get("LocalData").get("PlayData"); + int point = ((Number) PlayData.get("Point")).intValue(); + scoreList.add(new Score((String) GameManager.getInstance().GlobalData.get("LocalData").get("Player"), point)); + Collections.sort(scoreList, Collections.reverseOrder()); + if (scoreList.size() > 10) { + scoreList.remove(scoreList.size() - 1); + } + scores = new JSONArray(); + Scoreobj.put(scoreAttr, scores); + for (Score s : scoreList) { + scores.add(s.toJSON()); + } + fm.SaveString("DataBase", database.toJSONString(), true); + }; + + public void LateUpdate() { + }; + + public void PreRender() { + }; + + public void drawCenteredRegularString(final String string, final int height) { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + grpahics.drawString(string, gm.frame.getWidth() / 2 - fontmatrix.stringWidth(string) / 2, height); + } + + public void drawCenteredBigString(final String string, final int height) { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + grpahics.setColor(Color.GREEN); + FontMetrics fontmatrix = gm.Rm.SetFont("Big"); + grpahics.drawString(string, gm.frame.getWidth() / 2 - fontmatrix.stringWidth(string) / 2, height); + } + + public void drawClear() { + String titleString; + int score = ((Number) PlayData.get("Point")).intValue(); + int shot = ((Number) PlayData.get("ShotCount")).intValue() + ((Number) PlayData.get("ShotCount2")).intValue(); + int shipsDestroyed = ((Number) PlayData.get("KillCount")).intValue() + + ((Number) PlayData.get("KillCount2")).intValue(); + double accuracy = ((double) shipsDestroyed / (double) shot) * 100; + if ((boolean) PlayData.get("LevelClear")) { + titleString = "LEVEL " + ((Number) PlayData.get("Level")).intValue() + " Clear"; + } else { + titleString = "Game Over.."; + } + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Big"); + grpahics.setColor(Color.GREEN); + drawCenteredBigString(titleString, gm.frame.getHeight() / 6 + fontmatrix.getHeight() * 2); + drawCenteredRegularString("Your score: " + score, gm.frame.getHeight() / 3 + fontmatrix.getHeight() * 1); + drawCenteredRegularString("Your total shots: " + shot, gm.frame.getHeight() / 3 + fontmatrix.getHeight() * 2); + drawCenteredRegularString("Your destruction: " + shipsDestroyed, + gm.frame.getHeight() / 3 + fontmatrix.getHeight() * 3); + drawCenteredRegularString("Your Accuracy " + (Math.round(accuracy * 10) / 10.0) + "%", + gm.frame.getHeight() / 3 + fontmatrix.getHeight() * 4); + String continueString = "Continue"; + String exitString = "Exit"; + if (SelectIndex == 0) { + grpahics.setColor(Color.GREEN); + } else { + grpahics.setColor(Color.WHITE); + } + int level = ((Number) PlayData.get("Level")).intValue(); + if (level < 3 && (boolean) PlayData.get("LevelClear")) { + drawCenteredRegularString(continueString, gm.frame.getHeight() / 4 * 3); + } + if (SelectIndex == 1 || !(boolean) PlayData.get("LevelClear") || level == EnemyController.MaxStageCount) { + grpahics.setColor(Color.GREEN); + } else { + grpahics.setColor(Color.WHITE); + } + drawCenteredRegularString(exitString, gm.frame.getHeight() / 4 * 3 + fontmatrix.getHeight() * 2); + } + + public void Exit() { + }; + + public void drawHorizontalLine(final int positionY, Color color) { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + grpahics.setColor(color); + grpahics.drawLine(0, positionY, gm.frame.getWidth(), positionY); + grpahics.drawLine(0, positionY + 1, gm.frame.getWidth(), positionY + 1); + } + + void drawLives(int life) { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + grpahics.setColor(Color.WHITE); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + grpahics.drawString(Integer.toString(life), 20, 25); + } + + void DrawScore() { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + grpahics.setColor(Color.WHITE); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + String scoreString = String.format("%04d", ((Number) PlayData.get("Point")).intValue()); + grpahics.drawString(scoreString, gm.frame.getWidth() - 60, 25); + } + + public void LateRender() { + DrawScore(); + drawLives(((Number) PlayData.get("Life")).intValue()); + int PlayMode = ((Number) gm.GlobalData.get("LocalData").get("PlayMode")).intValue(); + if (PlayMode == 1) { + drawLives(((Number) PlayData.get("Life")).intValue()); + } + drawHorizontalLine(40 - 1, Color.GREEN); + drawClear(); + }; +} diff --git a/src/GamePrime/Page/GamePage.java b/src/GamePrime/Page/GamePage.java new file mode 100644 index 00000000..5dac6529 --- /dev/null +++ b/src/GamePrime/Page/GamePage.java @@ -0,0 +1,375 @@ +package GamePrime.Page; + +import EnginePrime.Entity; +import EnginePrime.EventSystem; +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import GamePrime.Define.ItemDefine; +import GamePrime.Define.KeyDefine; +import GamePrime.ETC.Image; +import GamePrime.Ship.Bomb; +import GamePrime.Ship.Bullet; +import GamePrime.Ship.EnemyController; +import GamePrime.Ship.Item; +import GamePrime.Ship.Player; +import GamePrime.UI.PrepareUI; +import java.util.HashMap; +import java.util.Map; +import java.awt.event.KeyEvent; +import java.io.File; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.FontMetrics; +import org.json.simple.JSONObject; +import org.json.simple.JSONArray; + +public class GamePage implements GManager { + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + public JSONObject PlayData; + public int PlayMode; + public boolean HardMode; + public Map ImgRes = new HashMap<>(); + EnemyController enemycontrol; + public Player player1; + Player player2; + + public void Initialize() { + gm.Sm.StopAll(); + PlayMode = ((Number) gm.GlobalData.get("LocalData").get("PlayMode")).intValue(); + HardMode = (boolean) gm.GlobalData.get("LocalData").get("HardMode"); + PlayData = (JSONObject) gm.GlobalData.get("LocalData").get("PlayData"); + FileManager fm = new FileManager(); + JSONObject Entity = (JSONObject) res.get("Entity"); + JSONObject ShipType1 = (JSONObject) Entity.get("ShipType1"); + JSONObject ShipType2 = (JSONObject) Entity.get("ShipType2"); + JSONObject EnemyType1 = (JSONObject) Entity.get("EnemyType1"); + JSONObject EnemyType2 = (JSONObject) Entity.get("EnemyType2"); + ImgRes.put("Bullet", new Image(fm.GetImage("Img" + File.separator + Entity.get("Bullet")))); + ImgRes.put("Item", new Image(fm.GetImage("Img" + File.separator + Entity.get("Item")))); + ImgRes.put("ShipType1.Idle", new Image(fm.GetImage("Img" + File.separator + ShipType1.get("Idle")))); + ImgRes.put("ShipType1.Destroyed", new Image(fm.GetImage("Img" + File.separator + ShipType1.get("Destroyed")))); + ImgRes.put("ShipType2.Idle", new Image(fm.GetImage("Img" + File.separator + ShipType2.get("Idle")))); + ImgRes.put("ShipType2.Destroyed", new Image(fm.GetImage("Img" + File.separator + ShipType2.get("Destroyed")))); + ImgRes.put("EnemyType1.Idle", new Image(fm.GetImage("Img" + File.separator + EnemyType1.get("Idle")))); + ImgRes.put("EnemyType1.Destroyed", + new Image(fm.GetImage("Img" + File.separator + EnemyType1.get("Destroyed")))); + ImgRes.put("EnemyType2.Idle", new Image(fm.GetImage("Img" + File.separator + EnemyType2.get("Idle")))); + ImgRes.put("EnemyType2.Destroyed", + new Image(fm.GetImage("Img" + File.separator + EnemyType2.get("Destroyed")))); + PlayData.put("ScreenIndex", -1); + PlayData.put("LevelClear", false); + PlaySetting(); + EntityInitialize(); + }; + + public void PlaySetting() { + if (((Number) PlayData.get("Level")).intValue() == 1) { + PlayData.put("Life", 3); + PlayData.put("Life2", 3); + PlayData.put("Level", 1); + PlayData.put("ImgHeight", 70); + PlayData.put("Point", 0); + PlayData.put("MoveSpeed", 200); + PlayData.put("ShotDelay", 1.5f); + PlayData.put("ShotSpeed", 400.0f); + PlayData.put("ShotCount", 0); + PlayData.put("ShotCount2", 0); + PlayData.put("KillCount", 0); + PlayData.put("KillCount2", 0); + JSONObject ItemData = (JSONObject) gm.GlobalData.get("LocalData").get("StoreItem"); + if (ItemData != null) { + if ((boolean) ItemData.get("BonusLife")) { + ItemData.put("BonusLife", false); + PlayData.put("Life", ((Number) PlayData.get("Life")).intValue() + 1); + PlayData.put("Life2", ((Number) PlayData.get("Life2")).intValue() + 1); + } + if ((boolean) ItemData.get("MoveSpeed")) { + ItemData.put("MoveSpeed", false); + PlayData.put("MoveSpeed", ((Number) PlayData.get("MoveSpeed")).intValue() + 200); + } + if ((boolean) ItemData.get("ShotSpeed")) { + ItemData.put("ShotSpeed", false); + PlayData.put("ShotDelay", ((Number) PlayData.get("ShotDelay")).floatValue() - 0.5f); + PlayData.put("ShotSpeed", ((Number) PlayData.get("ShotSpeed")).floatValue() + 200.f); + } + } + } + if (HardMode) { + PlayData.put("Magazine1", 5); + PlayData.put("Bullet1", 10); + PlayData.put("Magazine2", 5); + PlayData.put("Bullet2", 10); + } + JSONArray Item = new JSONArray(); + PlayData.put("ActiveItem", Item); + Item = new JSONArray(); + PlayData.put("ActiveItem2", Item); + } + + private void EntityInitialize() { + EventSystem.DestroyAll(); + Entity player1Entity = EventSystem.Initiate("Player1"); + player1 = player1Entity.AddComponent(Player.class); + if (PlayMode == 1) { + Entity player2Entity = EventSystem.Initiate("Player2"); + player2 = player2Entity.AddComponent(Player.class); + } + Entity control = EventSystem.Initiate("EnemyController"); + enemycontrol = control.AddComponent(EnemyController.class); + } + + private void ProcCollision() { + for (Entity ItemEntity : EventSystem.FindTagEntities("Item")) { + Item item = ItemEntity.GetComponent(Item.class); + if (item.pos.getY() > gm.frame.getHeight()) { + EventSystem.Destroy(item.Obj); + } + player1.CheckCollsion(item); + if (PlayMode == 1) { + player2.CheckCollsion(item); + } + } + for (Entity bulletEntity : EventSystem.FindTagEntities("PBullet")) { + Bullet bullet = bulletEntity.GetComponent(Bullet.class); + if (bullet == null) { + bullet = bulletEntity.GetComponent(Bomb.class); + } + if (bullet.pos.getY() > gm.frame.getHeight() || bullet.pos.getY() < 0) { + EventSystem.Destroy(bullet.Obj); + } + enemycontrol.CheckCollsion(bullet); + } + for (Entity bulletEntity : EventSystem.FindTagEntities("EBullet")) { + Bullet bullet = bulletEntity.GetComponent(Bullet.class); + if (bullet.pos.getY() > gm.frame.getHeight() || bullet.pos.getY() < 0) { + EventSystem.Destroy(bullet.Obj); + } + player1.CheckCollsion(bullet); + if (PlayMode == 1) { + player2.CheckCollsion(bullet); + } + } + } + + public void PreUpdate() { + if (((Number) PlayData.get("ScreenIndex")).intValue() == 3) { + EventSystem.DestroyAll(); + gm.SetInstance(new EndPage()); + } else if (((Number) PlayData.get("ScreenIndex")).intValue() != -1) { + if (((Number) PlayData.get("ScreenIndex")).intValue() == 0) { + ProcCollision(); + } + if (gm.Im.isKeyDown(KeyEvent.VK_CONTROL)) { + if (((Number) PlayData.get("ScreenIndex")).intValue() == 1) { + PlayData.put("ScreenIndex", 0); + } else { + PlayData.put("ScreenIndex", 1); + } + } else if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + if (((Number) PlayData.get("ScreenIndex")).intValue() == 2) { + PlayData.put("ScreenIndex", 0); + } else { + PlayData.put("ScreenIndex", 2); + } + } else if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + if (((Number) PlayData.get("ScreenIndex")).intValue() == 2) { + EventSystem.DestroyAll(); + EndPage.SavePlayData(); + gm.SetInstance(new MenuPage()); + } + } + } + } + + public void LateUpdate() { + int life = ((Number) PlayData.get("Life")).intValue(); + int life2 = ((Number) PlayData.get("Life2")).intValue(); + if (PlayMode == 1) { + if (life == 0 && life2 == 0) { + PlayData.put("ScreenIndex", 3); + } + } else { + if (life == 0) { + PlayData.put("ScreenIndex", 3); + } + } + }; + + private void drawHorizontalLine(int y) { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + graphics.drawLine(0, y, gm.frame.getWidth(), y); + graphics.drawLine(0, y + 1, gm.frame.getWidth(), y + 1); + } + + private void DrawMenual() { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + int rectWidth = gm.frame.getWidth(); + int rectHeight = gm.frame.getHeight() / 6; + graphics.setColor(Color.BLACK); + graphics.fillRect(0, gm.frame.getHeight() / 2 - gm.frame.getHeight() / 12 - 90, rectWidth, rectHeight + 180); + graphics.setColor(Color.CYAN); + drawManualMenu(); + drawHorizontalLine(gm.frame.getHeight() / 2 - gm.frame.getHeight() / 12 - 90); + drawHorizontalLine(gm.frame.getHeight() / 2 - gm.frame.getHeight() / 12 - 50); + drawHorizontalLine(gm.frame.getHeight() / 2 + gm.frame.getHeight() / 12 + 90); + } + + private void drawManualMenu() { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + JSONArray key1 = (JSONArray) gm.GlobalData.get("Setting").get("KeySetting_1p"); + JSONArray key2 = (JSONArray) gm.GlobalData.get("Setting").get("KeySetting_2p"); + graphics.drawString("Play manual", gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Play manual") / 2, + gm.frame.getHeight() / 2 - 105); + graphics.drawString("Player1", gm.frame.getWidth() / 2 - 140, gm.frame.getHeight() / 2 - 60); + graphics.drawString("Player2", gm.frame.getWidth() / 2 + 65, gm.frame.getHeight() / 2 - 60); + graphics.setColor(Color.WHITE); + int y = gm.frame.getHeight() / 2 - 30; + int x1 = gm.frame.getWidth() / 2 - 150; // player1_manual + int x2 = gm.frame.getWidth() / 2 - 50; // player1_setting + int x3 = gm.frame.getWidth() / 2 + 50; // player2 + int x4 = gm.frame.getWidth() / 2 + 150; // player2_setting + for (int i = 0; i < KeyDefine.KeyFunc.length; i++) { + graphics.drawString(KeyDefine.KeyFunc[i], x1 - fontmatrix.stringWidth(KeyDefine.KeyFunc[i]) / 2, + y + 20 * i); + String key = KeyEvent.getKeyText(((Number) key1.get(i)).intValue()); + graphics.drawString(key, x2 - fontmatrix.stringWidth(key) / 2, y + 20 * i); + graphics.drawString(KeyDefine.KeyFunc[i], x3 - fontmatrix.stringWidth(KeyDefine.KeyFunc[i]) / 2, + y + 20 * i); + key = KeyEvent.getKeyText(((Number) key2.get(i)).intValue()); + graphics.drawString(key, x4 - fontmatrix.stringWidth(key) / 2, y + 20 * i); + } + } + + private void Draw() { + if (((Number) PlayData.get("ScreenIndex")).intValue() == -1) { + Entity cooldown = EventSystem.FindEntity("CountDown"); + if (cooldown == null) { + Entity countdown = EventSystem.Initiate("CountDown"); + countdown.AddComponent(PrepareUI.class); + } + } else if (((Number) PlayData.get("ScreenIndex")).intValue() == 1) { + DrawMenual(); + } else if (((Number) PlayData.get("ScreenIndex")).intValue() == 2) { + drawPause(); + } + } + + public void PreRender() { + }; + + public void LateRender() { + Draw(); + drawScore(); + drawItems(); + drawAmmo(); + drawLives(); + drawHorizontalLine(40 - 1, Color.GREEN); + drawHorizontalLine(gm.frame.getHeight() - 1, Color.GREEN); // separation line for bottom hud + }; + + void drawAmmo() { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + graphics.setColor(Color.WHITE); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + if (HardMode) { + int bullet = ((Number) PlayData.get("Bullet1")).intValue(); + int magazine = ((Number) PlayData.get("Magazine1")).intValue(); + graphics.drawString("Ammo : ", 200, 0); + graphics.drawString(bullet + "/" + magazine, 300, fontmatrix.getHeight()); + if (PlayMode == 1) { + bullet = ((Number) PlayData.get("Bullet2")).intValue(); + magazine = ((Number) PlayData.get("Magazine2")).intValue(); + graphics.drawString("Ammo : ", + gm.frame.getWidth() / 4 - fontmatrix.stringWidth(bullet + "/" + magazine + "Ammo : "), 0); + graphics.drawString(bullet + "/" + magazine, gm.frame.getWidth() / 4, fontmatrix.getHeight()); + } + } + } + + void drawItems() { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + graphics.setColor(Color.WHITE); + JSONArray item = (JSONArray) PlayData.get("ActiveItem"); + graphics.drawString(Integer.toString(item.size()), 205, gm.frame.getHeight() + 25); + for (int i = 0; i < item.size(); i++) { + int index = ((Number) item.get(i)).intValue(); + if (ItemDefine.ActiveItem[index] == "Ghost") { + graphics.setColor(Color.CYAN); + } else if (ItemDefine.ActiveItem[index] == "Auxiliary") { + graphics.setColor(Color.green); + } else if (ItemDefine.ActiveItem[index] == "Bomb") { + graphics.setColor(Color.red); + } else if (ItemDefine.ActiveItem[index] == "SpeedUp") { + graphics.setColor(Color.YELLOW); + } + graphics.drawRect(100 + 35 * i, gm.frame.getHeight() - 10, 5, 5); + } + item = (JSONArray) PlayData.get("ActiveItem2"); + graphics.drawString(Integer.toString(item.size()), 205, gm.frame.getHeight() + 25); + for (int i = 0; i < item.size(); i++) { + int index = ((Number) item.get(i)).intValue(); + if (ItemDefine.ActiveItem[index] == "Ghost") { + graphics.setColor(Color.CYAN); + } else if (ItemDefine.ActiveItem[index] == "Auxiliary") { + graphics.setColor(Color.green); + } else if (ItemDefine.ActiveItem[index] == "Bomb") { + graphics.setColor(Color.red); + } else if (ItemDefine.ActiveItem[index] == "SpeedUp") { + graphics.setColor(Color.YELLOW); + } + graphics.drawRect(gm.frame.getWidth() / 2 + 100 + 35 * i, gm.frame.getHeight() - 10, 5, 5); + } + } + + void drawPause() { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + int rectWidth = gm.frame.getWidth(); + int rectHeight = gm.frame.getHeight() / 6; + String informationString = "Press Esc resume or space quit"; + graphics.setColor(Color.BLACK); + graphics.fillRect(0, gm.frame.getHeight() / 2 - gm.frame.getHeight() / 12 - 40, rectWidth, rectHeight + 40); + graphics.setColor(Color.YELLOW); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + graphics.drawString("Pause", gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Pause") / 2, + gm.frame.getHeight() / 2 - 80); + graphics.drawString("Quit", gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Quit") / 2, + gm.frame.getHeight() / 2 - 10); + graphics.setColor(Color.GRAY); + graphics.drawString(informationString, gm.frame.getWidth() / 2 - fontmatrix.stringWidth(informationString) / 2, + gm.frame.getHeight() / 2 + fontmatrix.getHeight() / 10 + 20); + drawHorizontalLine(gm.frame.getHeight() / 2 - gm.frame.getHeight() / 12 - 40); + drawHorizontalLine(gm.frame.getHeight() / 2 - gm.frame.getHeight() / 12); + drawHorizontalLine(gm.frame.getHeight() / 2 + gm.frame.getHeight() / 12); + } + + public void drawHorizontalLine(final int positionY, Color color) { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + graphics.setColor(color); + graphics.drawLine(0, positionY, gm.frame.getWidth(), positionY); + graphics.drawLine(0, positionY + 1, gm.frame.getWidth(), positionY + 1); + } + + void drawLives() { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + graphics.setColor(Color.WHITE); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + graphics.drawString(Integer.toString(((Number) PlayData.get("Life")).intValue()), 20, 25); + if (PlayMode == 1) { + graphics.drawString(Integer.toString(((Number) PlayData.get("Life2")).intValue()), 50, 25); + } + } + + public void Exit() { + }; + + void drawScore() { + Graphics graphics = gm.Rm.GetCurrentGraphic(); + graphics.setColor(Color.WHITE); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + String scoreString = String.format("%04d", ((Number) PlayData.get("Point")).intValue()); + graphics.drawString(scoreString, gm.frame.getWidth() - 60, 25); + } +} diff --git a/src/GamePrime/Page/HelpPage.java b/src/GamePrime/Page/HelpPage.java new file mode 100644 index 00000000..0c6927a3 --- /dev/null +++ b/src/GamePrime/Page/HelpPage.java @@ -0,0 +1,255 @@ +package GamePrime.Page; + +import java.awt.event.KeyEvent; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.image.BufferedImage; +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import GamePrime.Define.KeyDefine; + +public class HelpPage implements GManager { + SoundManager.PlayProp menuSoundProp; + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + Graphics graphic = gm.Rm.GetCurrentGraphic(); + FontMetrics matrix = gm.Rm.SetFont("Regular"); + private int itemCode; + private boolean itemSelected; + private Map img = new HashMap<>(); + String imgString[] = { "PlayScreen", "HardMode", "RemaningMagazine" }; + + public void LateRender() { + }; + + public void Initialize() { + itemCode = 0; + itemSelected = false; + JSONObject GuideImplements = (JSONObject) res.get("GuideImplements"); + JSONObject Entity = (JSONObject) res.get("Entity"); + FileManager fm = new FileManager(); + img.put("PlayScreen", fm.GetImage("Img" + File.separator + GuideImplements.get("PlayScreen"))); + img.put("HardMode", fm.GetImage("Img" + File.separator + GuideImplements.get("HardMode"))); + img.put("RemaningMagazine", fm.GetImage("Img" + File.separator + GuideImplements.get("RemaningMagazine"))); + img.put("Item", fm.GetImage("Img" + File.separator + Entity.get("Item"))); + JSONObject BGM = (JSONObject) res.get("BGM"); + JSONObject SFX = (JSONObject) res.get("SFX"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + SoundManager.PlayProp BgmProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("AchievePage"), "BGM"); + BgmProp.count = -1; + gm.Sm.StopClip("BGM", 1); + gm.Sm.playSound(BgmProp); + }; + + public void PreUpdate() { + if (itemSelected) { + switch (itemCode) { + case 0: + drawGameGuide(); + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + itemSelected = false; + gm.Sm.playSound(menuSoundProp); + } + break; + case 1: + drawHowToPlay(); + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + itemSelected = false; + gm.Sm.playSound(menuSoundProp); + } + break; + case 2: + drawItem(); + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + itemSelected = false; + gm.Sm.playSound(menuSoundProp); + } + break; + case 3: + drawHardMode(); + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + itemSelected = false; + gm.Sm.playSound(menuSoundProp); + } + break; + default: + break; + } + } else { + if (gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + itemCode = itemCode == 3 ? 0 : itemCode + 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_UP)) { + itemCode = itemCode == 0 ? 3 : itemCode - 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + itemSelected = true; + gm.Sm.playSound(menuSoundProp); + } + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + gm.Sm.playSound(menuSoundProp); + gm.SetInstance(new MenuPage()); + } + } + }; + + public void LateUpdate() { + }; + + public void PreRender() { + Draw(); + } + + public void Exit() { + }; + + private void Draw() { + drawHelp(); + } + + public final void drawHelp() { + String helpString = "Help"; + String instructionsString1 = "Move with UP, DOWN / Select with SPACE"; + String instructionsString2 = "Press ESC to return"; + Graphics graphic = gm.Rm.GetCurrentGraphic(); + FontMetrics matrix = gm.Rm.SetFont("Big"); + graphic.setColor(Color.GREEN); + graphic.drawString(helpString, gm.frame.getWidth() / 2 - matrix.stringWidth(helpString) / 2, + gm.frame.getHeight() / 8); + matrix = gm.Rm.SetFont("Regular"); + graphic.setColor(Color.GRAY); + graphic.drawString(instructionsString1, gm.frame.getWidth() / 2 - matrix.stringWidth(instructionsString1) / 2, + gm.frame.getHeight() / 5 - matrix.getHeight() / 2); + graphic.drawString(instructionsString2, gm.frame.getWidth() / 2 - matrix.stringWidth(instructionsString2) / 2, + gm.frame.getHeight() / 5 + matrix.getHeight() / 2); + String[] guideList = { "Space Invaders", "How to play", "Item", "Mode" }; + for (int i = 0; i < 4; i++) { + if (itemCode == i) { + graphic.setColor(Color.GREEN); + if (itemSelected) { + graphic.drawString("*", gm.frame.getWidth() / 5 - matrix.stringWidth(guideList[i]) / 2 - 16, + gm.frame.getHeight() / 4 + matrix.getHeight() * 2 * (i + 1)); + } + } else { + graphic.setColor(Color.WHITE); + } + graphic.drawString(guideList[i], gm.frame.getWidth() / 5 - matrix.stringWidth(guideList[i]) / 2, + gm.frame.getHeight() / 4 + matrix.getHeight() * 2 * (i + 1)); + } + graphic.setColor(Color.GREEN); + graphic.drawLine(gm.frame.getWidth() / 5 * 2 - 60, gm.frame.getHeight() / 4, gm.frame.getWidth() / 5 * 2 - 60, + gm.frame.getHeight() / 10 * 9); + graphic.drawLine(gm.frame.getWidth() / 5 * 2 - 59, gm.frame.getHeight() / 4, gm.frame.getWidth() / 5 * 2 - 59, + gm.frame.getHeight() / 10 * 9); + } + + public final void drawGameGuide() { + Graphics graphic = gm.Rm.GetCurrentGraphic(); + BufferedImage curimg = img.get(imgString[0]); + final String[] story = { "Space Invaders is a vertical scroll shooting game.", + "Currently, terrifying enemies from another demention", + "have invaded space. Defeat them and make a name for yourself." }; + graphic.drawImage(curimg, gm.frame.getWidth() / 2 - 80, gm.frame.getHeight() / 2 - 200, + curimg.getWidth() / 2 + 80, curimg.getHeight() / 2 + 80, null); + FontMetrics matrix = gm.Rm.SetFont("Small"); + graphic.setColor(Color.WHITE); + for (int i = 0; i < story.length; i++) { + graphic.drawString(story[i], gm.frame.getWidth() / 2 - 125, gm.frame.getHeight() / 2 + 200 + 30 * (i + 1)); + } + } + + public final void drawHowToPlay() { + Graphics graphic = gm.Rm.GetCurrentGraphic(); + final String[] manualInfo = { "The above manual shows how to control your character.", + "You can view the manual again by pressing Ctrl in the game.", + "You can also change key setting on the 'setting' menu." }; + final String reloadInfo = "Reload can use in the hard mode only!"; + Graphics graphics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + JSONArray key1 = (JSONArray) gm.GlobalData.get("Setting").get("KeySetting_1p"); + JSONArray key2 = (JSONArray) gm.GlobalData.get("Setting").get("KeySetting_2p"); + graphics.drawString("Play manual", gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Play manual") / 2 + 130, + gm.frame.getHeight() / 2 - 105); + graphics.drawString("Player1", gm.frame.getWidth() / 2 - 30, gm.frame.getHeight() / 2 - 60); + graphics.drawString("Player2", gm.frame.getWidth() / 2 + 185, gm.frame.getHeight() / 2 - 60); + graphics.setColor(Color.WHITE); + int y = gm.frame.getHeight() / 2 - 30; + int x1 = gm.frame.getWidth() / 2 - 30; // player1_manual + int x2 = gm.frame.getWidth() / 2 + 70; // player1_setting + int x3 = gm.frame.getWidth() / 2 + 170; // player2 + int x4 = gm.frame.getWidth() / 2 + 270; // player2_setting + for (int i = 0; i < KeyDefine.KeyFunc.length; i++) { + graphics.drawString(KeyDefine.KeyFunc[i], x1 - fontmatrix.stringWidth(KeyDefine.KeyFunc[i]) / 2, + y + 20 * i); + String key = KeyEvent.getKeyText(((Number) key1.get(i)).intValue()); + graphics.drawString(key, x2 - fontmatrix.stringWidth(key) / 2, y + 20 * i); + graphics.drawString(KeyDefine.KeyFunc[i], x3 - fontmatrix.stringWidth(KeyDefine.KeyFunc[i]) / 2, + y + 20 * i); + key = KeyEvent.getKeyText(((Number) key2.get(i)).intValue()); + graphics.drawString(key, x4 - fontmatrix.stringWidth(key) / 2, y + 20 * i); + } + FontMetrics matrix = gm.Rm.SetFont("Small"); + graphic.setColor(Color.GRAY); + graphic.drawString(reloadInfo, gm.frame.getWidth() / 2 - 35, gm.frame.getHeight() / 2 + 100); + graphic.setColor(Color.WHITE); + for (int i = 0; i < manualInfo.length; i++) { + graphic.drawString(manualInfo[i], gm.frame.getWidth() / 2 - 125, + gm.frame.getHeight() / 2 + 200 + 30 * (i + 1)); + } + } + + public final void drawItem() { + Graphics graphic = gm.Rm.GetCurrentGraphic(); + BufferedImage itemBox = img.get("Item"); + final String[] itemBoxInfo = { "When killing a enemy, item box is dropped ", + "with a certain probability. if you obtain a item box,", "you can use one of four items randomly." }; + final String[] itemInfo = { "Ghost: you become a ghost and dodge enemies' attacks.", + "Auxiliary: you can shot auxiliary bullets.", "Bomb: your next shot becomes ranged attack.", + "Speed Up: your speed increases." }; + graphic.drawImage(itemBox, gm.frame.getWidth() / 2 - 120, gm.frame.getHeight() / 2 - 170, + itemBox.getWidth() / 32, itemBox.getHeight() / 32, null); + graphic.setColor(Color.CYAN); // Ghost + graphic.drawRect(gm.frame.getWidth() / 2 - 110, gm.frame.getHeight() - 500, 5, 5); + graphic.setColor(Color.green); // Auxiliary + graphic.drawRect(gm.frame.getWidth() / 2 - 110, gm.frame.getHeight() - 450, 5, 5); + graphic.setColor(Color.red); // Bomb + graphic.drawRect(gm.frame.getWidth() / 2 - 110, gm.frame.getHeight() - 400, 5, 5); + graphic.setColor(Color.YELLOW); // SpeedUp + graphic.drawRect(gm.frame.getWidth() / 2 - 110, gm.frame.getHeight() - 350, 5, 5); + FontMetrics matrix = gm.Rm.SetFont("Small"); + graphic.setColor(Color.WHITE); + for (int i = 0; i < itemBoxInfo.length; i++) { + graphic.drawString(itemBoxInfo[i], gm.frame.getWidth() / 2 - 80, gm.frame.getHeight() - 680 + 30 * (i + 1)); + } + for (int i = 0; i < itemInfo.length; i++) { + graphic.drawString(itemInfo[i], gm.frame.getWidth() / 2 - 80, gm.frame.getHeight() - 490 + 50 * i); + } + } + + public final void drawHardMode() { + Graphics graphic = gm.Rm.GetCurrentGraphic(); + BufferedImage hardModeImg = img.get(imgString[1]); + BufferedImage megazineImg = img.get(imgString[2]); + final String[] hardModeInfo = { "In the hard mode, reloding system exists.", "So you must shot carefully.", + "If you don't have any magazines,", "you can't clear current stage." }; + graphic.drawImage(hardModeImg, gm.frame.getWidth() / 2 - 80, gm.frame.getHeight() / 2 - 200, + hardModeImg.getWidth() / 2, hardModeImg.getHeight() / 2, null); + graphic.drawImage(megazineImg, gm.frame.getWidth() / 2 - 90, gm.frame.getHeight() / 2 - 100, + megazineImg.getWidth() + 50, megazineImg.getHeight() + 50, null); + FontMetrics matrix = gm.Rm.SetFont("Small"); + graphic.setColor(Color.WHITE); + for (int i = 0; i < hardModeInfo.length; i++) { + graphic.drawString(hardModeInfo[i], gm.frame.getWidth() / 2 - 105, gm.frame.getHeight() / 2 + 40 * (i + 1)); + } + } +} diff --git a/src/GamePrime/Page/HightScorePage.java b/src/GamePrime/Page/HightScorePage.java new file mode 100644 index 00000000..1919d060 --- /dev/null +++ b/src/GamePrime/Page/HightScorePage.java @@ -0,0 +1,101 @@ +package GamePrime.Page; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import GamePrime.ETC.Score; +import java.awt.Graphics; +import java.awt.event.KeyEvent; +import java.awt.Color; +import java.awt.FontMetrics; + +public class HightScorePage implements GManager { + public static final int MaxNum = 10; + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + List scoreList[] = new List[] { new ArrayList<>(), new ArrayList<>() }; + private SoundManager.PlayProp menuSoundProp; + + public void Initialize() { + JSONObject BGM = (JSONObject) res.get("BGM"); + JSONObject SFX = (JSONObject) res.get("SFX"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + SoundManager.PlayProp BgmProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("HighScorePage"), "BGM"); + BgmProp.count = -1; + gm.Sm.StopClip("BGM", 1); + gm.Sm.playSound(BgmProp); + FileManager fm = new FileManager(); + JSONObject database = fm.LoadJsonObject("DataBase"); + JSONArray scores1 = (JSONArray) ((JSONObject) database.get("Scores")).get("Scores_1p"); + JSONArray scores2 = (JSONArray) ((JSONObject) database.get("Scores")).get("Scores_2p"); + for (int i = 0; i < scores1.size(); i++) { + scoreList[0].add(Score.toScore((JSONObject) scores1.get(i))); + } + Collections.sort(scoreList[0], Collections.reverseOrder()); + for (int i = 0; i < scores2.size(); i++) { + scoreList[1].add(Score.toScore((JSONObject) scores2.get(i))); + } + Collections.sort(scoreList[1], Collections.reverseOrder()); + }; + + public void Exit() { + gm.Sm.StopClip("BGM"); + }; + + public void PreUpdate() { + Draw(); + }; + + public void PreRender() { + }; + + public void LateRender() { + }; + + public void LateUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + gm.Sm.playSound(menuSoundProp); + gm.SetInstance(new MenuPage()); + } + }; + + private void Draw() { + String highScoreString = "High Scores"; + String instructionsString = "Press Space to return"; + String gameMode_1 = "1P_Mode"; + String gameMode_2 = "2P_Mode"; + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Big"); + grpahics.setColor(Color.GREEN); + grpahics.drawString(highScoreString, gm.frame.getWidth() / 2 - fontmatrix.stringWidth(highScoreString) / 2, + gm.frame.getHeight() / 8); + fontmatrix = gm.Rm.SetFont("Regular"); + grpahics.setColor(Color.GRAY); + grpahics.drawString(instructionsString, + gm.frame.getWidth() / 2 - fontmatrix.stringWidth(instructionsString) / 2, gm.frame.getHeight() / 5); + grpahics.drawString(gameMode_1, gm.frame.getWidth() * 3 / 13 - fontmatrix.stringWidth(gameMode_1) / 2, + gm.frame.getHeight() * 4 / 15); + grpahics.drawString(gameMode_2, gm.frame.getWidth() * 10 / 13 - fontmatrix.stringWidth(gameMode_2) / 2, + gm.frame.getHeight() * 4 / 15); + grpahics.setColor(Color.WHITE); + String scoreString = ""; + for (int i = 0; i < scoreList.length; i++) { + for (int j = 0; j < scoreList[i].size(); j++) { + Score score = scoreList[i].get(j); + scoreString = String.format("%s %04d", score.name, score.value); + grpahics.drawString(scoreString, + gm.frame.getWidth() * (3 + i * 7) / 13 - fontmatrix.stringWidth(scoreString) / 2, + gm.frame.getHeight() / 4 + fontmatrix.getHeight() * (j + 1) * 2); + } + } + } +} diff --git a/src/GamePrime/Page/LoginPage.java b/src/GamePrime/Page/LoginPage.java new file mode 100644 index 00000000..4cec87b0 --- /dev/null +++ b/src/GamePrime/Page/LoginPage.java @@ -0,0 +1,145 @@ +package GamePrime.Page; + +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import GamePrime.Define.AchievDefine; +import GamePrime.Define.ItemDefine; +import GamePrime.Define.KeyDefine; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.event.KeyEvent; +import java.io.File; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import java.awt.FontMetrics; + +public class LoginPage implements GManager { + public void PreRender() { + }; + + public void LateRender() { + }; + + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + private char[] name; + private int index; + private final int FIRST_CHAR = 65; + private final int LAST_CHAR = 90; + private SoundManager.PlayProp menuSoundProp; + + public void Initialize() { + name = "AAA".toCharArray(); + index = 0; + JSONObject SFX = (JSONObject) res.get("SFX"); + String menu = (String) SFX.get("MenuSelect"); + menuSoundProp = gm.Sm.new PlayProp("Sound" + File.separator + "SFX" + File.separator + menu, null); + } + + public void PreUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_RIGHT)) { + index = (index == 2 ? 0 : index + 1); + gm.Sm.playSound(menuSoundProp); + } + if (gm.Im.isKeyDown(KeyEvent.VK_LEFT)) { + index = (index == 0 ? 2 : index - 1); + gm.Sm.playSound(menuSoundProp); + } + if (gm.Im.isKeyDown(KeyEvent.VK_UP)) { + name[index] = (char) (name[index] == LAST_CHAR ? FIRST_CHAR : name[index] + 1); + gm.Sm.playSound(menuSoundProp); + } + if (gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + name[index] = (char) (name[index] == FIRST_CHAR ? LAST_CHAR : name[index] - 1); + gm.Sm.playSound(menuSoundProp); + } + Draw(); + } + + public void LateUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + gm.GlobalData.get("LocalData").put("Player", new String(name)); + LoadSetting(); + gm.SetInstance(new MenuPage()); + } + } + + private JSONObject GenUserData() { + JSONObject data = new JSONObject(); + JSONObject Setting = new JSONObject(); + Setting.put("Volume", 0); + Setting.put("IsMute", false); + JSONArray KeySetting_1p = new JSONArray(); + JSONArray KeySetting_2p = new JSONArray(); + for (int i = 0; i < KeyDefine.KeyFunc.length; i++) { + KeySetting_1p.add(i); + KeySetting_2p.add(i + 8); + } + Setting.put("KeySetting_1p", KeySetting_1p); + Setting.put("KeySetting_2p", KeySetting_2p); + JSONObject item = new JSONObject(); + for (ItemDefine.IntPair pair : ItemDefine.StoreItem) { + item.put(pair.name, false); + } + data.put("Setting", Setting); + data.put("StoreItem", item); + data.put("Money", 0); + JSONObject achieve = new JSONObject(); + for (String name : AchievDefine.Achieve) { + achieve.put(name, false); + } + data.put("Achievement", achieve); + return data; + } + + private void LoadSetting() { + FileManager fm = new FileManager(); + JSONObject database = fm.LoadJsonObject("DataBase"); + JSONObject scores = (JSONObject) database.get("Scores"); + if (scores == null) { + scores = new JSONObject(); + scores.put("Scores_1p", new JSONArray()); + scores.put("Scores_2p", new JSONArray()); + database.put("Scores", scores); + fm.SaveString("DataBase", database.toJSONString(), true); + } + JSONObject UserData = (JSONObject) database.get(new String(name)); + if (UserData == null) { + UserData = GenUserData(); + database.put(new String(name), UserData); + fm.SaveString("DataBase", database.toJSONString(), true); + } + gm.GlobalData.get("LocalData").put("Money", ((Number) UserData.get("Money")).intValue()); + gm.GlobalData.get("LocalData").put("StoreItem", UserData.get("StoreItem")); + gm.GlobalData.get("LocalData").put("Achievement", UserData.get("Achievement")); + gm.GlobalData.put("Setting", (JSONObject) UserData.get("Setting")); + } + + private void Draw() { + String s = "Username:"; + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + grpahics.setColor(Color.WHITE); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + grpahics.drawString(s, gm.frame.getWidth() / 2 - fontmatrix.stringWidth(s) / 2, + gm.frame.getHeight() / 4 + fontmatrix.getHeight() * 3); + // 3 letters name. + int positionX = gm.frame.getWidth() / 2 - (fontmatrix.getWidths()[name[0]] + fontmatrix.getWidths()[name[1]] + + fontmatrix.getWidths()[name[2]] + fontmatrix.getWidths()[' ']) / 2; + for (int i = 0; i < 3; i++) { + if (i == index) + grpahics.setColor(Color.GREEN); + else + grpahics.setColor(Color.WHITE); + positionX += fontmatrix.getWidths()[name[i]] / 2; + positionX = i == 0 ? positionX + : positionX + (fontmatrix.getWidths()[name[i - 1]] + fontmatrix.getWidths()[' ']) / 2; + grpahics.drawString(Character.toString(name[i]), positionX, + gm.frame.getHeight() / 4 + fontmatrix.getHeight() * 6); + } + } + + public void Exit() { + }; +} diff --git a/src/GamePrime/Page/MenuPage.java b/src/GamePrime/Page/MenuPage.java new file mode 100644 index 00000000..a5960a2b --- /dev/null +++ b/src/GamePrime/Page/MenuPage.java @@ -0,0 +1,155 @@ +package GamePrime.Page; + +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import java.awt.event.KeyEvent; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.FontMetrics; +import org.json.simple.JSONObject; + +public class MenuPage implements GManager { + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + private final int MaxPage = 6; + private final int MinPage = 0; + int PageIndex; + private SoundManager.PlayProp menuSoundProp; + private SoundManager.PlayProp MainBgmProp; + + public void Exit() { + }; + + public void Initialize() { + PageIndex = MinPage; + JSONObject BGM = (JSONObject) res.get("BGM"); + JSONObject SFX = (JSONObject) res.get("SFX"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + MainBgmProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("MenuPage"), "BGM"); + MainBgmProp.count = -1; + JSONObject setting = gm.GlobalData.get("Setting"); + float volume = ((Number) setting.get("Volume")).floatValue(); + boolean ismute = (boolean) setting.get("IsMute"); + gm.Sm.setMasterVolume((float) volume); + gm.Sm.SetMute(ismute); + gm.Sm.playSound(MainBgmProp); + }; + + public void PreUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + PageIndex++; + if (PageIndex > MaxPage) { + PageIndex = MinPage; + } + gm.Sm.playSound(menuSoundProp); + } + if (gm.Im.isKeyDown(KeyEvent.VK_UP)) { + PageIndex--; + if (PageIndex < MinPage) { + PageIndex = MaxPage; + } + gm.Sm.playSound(menuSoundProp); + } + Draw(); + }; + + public void LateUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + switch (PageIndex) { + case 0: + gm.SetInstance(new SelectPage()); + break; + case 1: + gm.SetInstance(new HightScorePage()); + break; + case 2: + gm.SetInstance(new StorePage()); + break; + case 3: + gm.SetInstance(new SettingPage()); + break; + case 4: + gm.SetInstance(new HelpPage()); + break; + case 5: + gm.SetInstance(new AchievementPage()); + break; + case 6: + gm.running = false; + break; + default: + break; + } + } + }; + + private void Draw() { + DrawTitleString(); + String playString = "Play"; + String highScoresString = "High scores"; + String shopString = "Shop"; + String settingString = "Setting"; + String helpString = "Help"; + String achievementString = "Achievements"; + String exitString = "exit"; + Graphics graphic = gm.Rm.GetCurrentGraphic(); + graphic.setColor(Color.WHITE); + FontMetrics matrix = gm.Rm.SetFont("Regular"); + List lambdaFunctions = new ArrayList<>(); + lambdaFunctions + .add(() -> graphic.drawString(playString, gm.frame.getWidth() / 2 - matrix.stringWidth(playString) / 2, + gm.frame.getHeight() * 2 / 3 - matrix.getHeight() * 6)); + lambdaFunctions.add(() -> graphic.drawString(highScoresString, + gm.frame.getWidth() / 2 - matrix.stringWidth(highScoresString) / 2, + gm.frame.getHeight() * 2 / 3 - matrix.getHeight() * 4)); + lambdaFunctions + .add(() -> graphic.drawString(shopString, gm.frame.getWidth() / 2 - matrix.stringWidth(shopString) / 2, + gm.frame.getHeight() * 2 / 3 - matrix.getHeight() * 2)); + lambdaFunctions.add( + () -> graphic.drawString(settingString, gm.frame.getWidth() / 2 - matrix.stringWidth(settingString) / 2, + gm.frame.getHeight() * 2 / 3 + matrix.getHeight() * 0)); + lambdaFunctions + .add(() -> graphic.drawString(helpString, gm.frame.getWidth() / 2 - matrix.stringWidth(helpString) / 2, + gm.frame.getHeight() * 2 / 3 + matrix.getHeight() * 2)); + lambdaFunctions.add(() -> graphic.drawString(achievementString, + gm.frame.getWidth() / 2 - matrix.stringWidth(achievementString) / 2, + gm.frame.getHeight() * 2 / 3 + matrix.getHeight() * 4)); + lambdaFunctions + .add(() -> graphic.drawString(exitString, gm.frame.getWidth() / 2 - matrix.stringWidth(exitString) / 2, + gm.frame.getHeight() * 2 / 3 + matrix.getHeight() * 6)); + for (int i = 0; i < lambdaFunctions.size(); i++) { + if (i == PageIndex) { + graphic.setColor(Color.WHITE); + } else { + graphic.setColor(Color.GREEN); + } + lambdaFunctions.get(i).run(); + } + } + + private void DrawTitleString() { + String titleString = "Invaders"; + String instructionsString = "select with w+s / arrows, confirm with space"; + Graphics graphic = gm.Rm.GetCurrentGraphic(); + graphic.setColor(Color.GREEN); + FontMetrics matrix = gm.Rm.SetFont("Big"); + graphic.drawString(titleString, gm.frame.getWidth() / 2 - matrix.stringWidth(titleString) / 2, + gm.frame.getHeight() / 3 - matrix.getHeight() * 2); + graphic.setColor(Color.GRAY); + matrix = gm.Rm.SetFont("Regular"); + graphic.drawString(instructionsString, gm.frame.getWidth() / 2 - matrix.stringWidth(instructionsString) / 2, + gm.frame.getHeight() / 2 - matrix.getHeight() * 7 / 2); + } + + public void PreRender() { + }; + + public void LateRender() { + }; +} diff --git a/src/GamePrime/Page/SelectPage.java b/src/GamePrime/Page/SelectPage.java new file mode 100644 index 00000000..b9b53fde --- /dev/null +++ b/src/GamePrime/Page/SelectPage.java @@ -0,0 +1,135 @@ +package GamePrime.Page; + +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.event.KeyEvent; +import java.io.File; +import org.json.simple.JSONObject; +import java.awt.FontMetrics; + +public class SelectPage implements GManager { + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + int PlayMode; + boolean HardMode; + private int SelectIndex; + SoundManager.PlayProp menuSoundProp; + + public void Initialize() { + JSONObject BGM = (JSONObject) res.get("BGM"); + JSONObject SFX = (JSONObject) res.get("SFX"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + SoundManager.PlayProp BgmProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("MenuPage"), "BGM"); + BgmProp.count = -1; + gm.Sm.StopClip("BGM", 1); + gm.Sm.playSound(BgmProp); + PlayMode = 0; + HardMode = false; + if (gm.GlobalData.get("LocalData").get("HardMode") != null) { + PlayMode = ((Number) gm.GlobalData.get("LocalData").get("PlayMode")).intValue(); + HardMode = (boolean) gm.GlobalData.get("LocalData").get("HardMode"); + } + SelectIndex = 0; + } + + public void Exit() { + }; + + public void PreRender() { + }; + + public void LateRender() { + }; + + public void PreUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_UP) || gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + SelectIndex = SelectIndex == 1 ? 0 : 1; + } + switch (SelectIndex) { + case 0: + if (gm.Im.isKeyDown(KeyEvent.VK_RIGHT) || gm.Im.isKeyDown(KeyEvent.VK_LEFT)) { + PlayMode = PlayMode == 1 ? 0 : 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + SelectIndex++; + gm.Sm.playSound(menuSoundProp); + } + break; + case 1: + if (gm.Im.isKeyDown(KeyEvent.VK_RIGHT) || gm.Im.isKeyDown(KeyEvent.VK_LEFT)) { + HardMode = !HardMode; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + gm.Sm.playSound(menuSoundProp); + gm.GlobalData.get("LocalData").put("PlayMode", PlayMode); + gm.GlobalData.get("LocalData").put("HardMode", HardMode); + gm.SetInstance(new SkinSelectPage()); + } + break; + default: + break; + } + }; + + public void LateUpdate() { + Draw(); + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + gm.SetInstance(new MenuPage()); + } + }; + + void Draw() { + String selectString = "Select Mode"; + String instructionsString = "select with a+d / arrows, confirm with space"; + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + grpahics.setColor(Color.GRAY); + grpahics.drawString(instructionsString, + gm.frame.getWidth() / 2 - fontmatrix.stringWidth(instructionsString) / 2, gm.frame.getHeight() / 5); + grpahics.setColor(Color.GREEN); + fontmatrix = gm.Rm.SetFont("Big"); + grpahics.drawString(selectString, gm.frame.getWidth() / 2 - fontmatrix.stringWidth(selectString) / 2, + gm.frame.getHeight() / 8); + if (SelectIndex == 0) + grpahics.setColor(Color.GREEN); + else + grpahics.setColor(Color.WHITE); + grpahics.drawString("Player", gm.frame.getWidth() / 5 - fontmatrix.stringWidth("Player") / 2, + gm.frame.getHeight() / 8 * 3); + if (SelectIndex == 1) + grpahics.setColor(Color.GREEN); + else + grpahics.setColor(Color.WHITE); + grpahics.drawString("Hard Mode", gm.frame.getWidth() / 5 - fontmatrix.stringWidth("Player") / 2, + gm.frame.getHeight() / 8 * 5); + if (PlayMode == 0) + grpahics.setColor(Color.GREEN); + else + grpahics.setColor(Color.WHITE); + grpahics.drawString("1P", gm.frame.getWidth() / 10 * 6 - fontmatrix.stringWidth("1P") / 2, + gm.frame.getHeight() / 8 * 3 + fontmatrix.getHeight() * 2); + if (PlayMode == 1) + grpahics.setColor(Color.GREEN); + else + grpahics.setColor(Color.WHITE); + grpahics.drawString("2P", gm.frame.getWidth() / 10 * 8 - fontmatrix.stringWidth("2P") / 2, + gm.frame.getHeight() / 8 * 3 + fontmatrix.getHeight() * 2); + grpahics.setColor(Color.WHITE); + grpahics.drawString("ON", gm.frame.getWidth() / 10 * 6 - fontmatrix.stringWidth("ON") / 2, + gm.frame.getHeight() / 8 * 5 + fontmatrix.getHeight() * 2); + grpahics.drawString("OFF", gm.frame.getWidth() / 10 * 8 - fontmatrix.stringWidth("OFF") / 2, + gm.frame.getHeight() / 8 * 5 + fontmatrix.getHeight() * 2); + grpahics.setColor(Color.GREEN); + if (HardMode) + grpahics.drawString("ON", gm.frame.getWidth() / 10 * 6 - fontmatrix.stringWidth("ON") / 2, + gm.frame.getHeight() / 8 * 5 + fontmatrix.getHeight() * 2); + else + grpahics.drawString("OFF", gm.frame.getWidth() / 10 * 8 - fontmatrix.stringWidth("OFF") / 2, + gm.frame.getHeight() / 8 * 5 + fontmatrix.getHeight() * 2); + } +} diff --git a/src/GamePrime/Page/SettingPage.java b/src/GamePrime/Page/SettingPage.java new file mode 100644 index 00000000..b350f888 --- /dev/null +++ b/src/GamePrime/Page/SettingPage.java @@ -0,0 +1,257 @@ +package GamePrime.Page; + +import java.awt.event.KeyEvent; +import java.io.File; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import GamePrime.Define.KeyDefine; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.FontMetrics; + +public class SettingPage implements GManager { + public void PreRender() { + }; + + public void LateRender() { + }; + + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + private SoundManager.PlayProp menuSoundProp; + private int itemCode; + private int keyNum; + private boolean Itemselected; + private boolean Keyselected; + JSONArray keySettings[]; + + public void Initialize() { + itemCode = 0; + keyNum = 0; + Itemselected = false; + Keyselected = false; + JSONObject data = gm.GlobalData.get("Setting"); + keySettings = new JSONArray[] { (JSONArray) data.get("KeySetting_1p"), (JSONArray) data.get("KeySetting_2p") }; + JSONObject SFX = (JSONObject) res.get("SFX"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + }; + + public void PreUpdate() { + if (Keyselected) { + int newkey = gm.Im.GetAnyKeyDown(); + if (newkey != -1) { + int oldkey = ((Number) keySettings[itemCode - 2].get(keyNum)).intValue(); + // 중복 된다면 바꿔준다. + for (int j = 0; j < 2; j++) { + for (int i = 0; i < KeyDefine.KeyFunc.length; i++) { + if (((Number) keySettings[j].get(i)).intValue() == newkey) { + keySettings[j].set(i, oldkey); + } + } + } + keySettings[itemCode - 2].set(keyNum, newkey); + Keyselected = false; + } + } else if (Itemselected) { + switch (itemCode) { + case 0: + if (gm.Im.isKeyPressed(KeyEvent.VK_LEFT)) { + float volume = gm.Sm.GetMasterVolume(); + volume = volume < SoundManager.minimum ? SoundManager.minimum + : volume - (SoundManager.maximum - SoundManager.minimum) + * (float) gm.Et.GetElapsedSeconds(); + gm.Sm.setMasterVolume(volume); + } + if (gm.Im.isKeyPressed(KeyEvent.VK_RIGHT)) { + float volume = gm.Sm.GetMasterVolume(); + volume = volume > SoundManager.maximum ? SoundManager.minimum + : volume + (SoundManager.maximum - SoundManager.minimum) + * (float) gm.Et.GetElapsedSeconds(); + gm.Sm.setMasterVolume(volume); + } + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + Itemselected = false; + gm.Sm.playSound(menuSoundProp); + } + break; + case 1: + if (gm.Im.isKeyDown(KeyEvent.VK_LEFT)) { + gm.Sm.SetMute(!gm.Sm.IsMute()); + } + if (gm.Im.isKeyDown(KeyEvent.VK_RIGHT)) { + gm.Sm.SetMute(!gm.Sm.IsMute()); + } + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + Itemselected = false; + gm.Sm.playSound(menuSoundProp); + } + break; + case 2: + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + Itemselected = false; + } + if (gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + keyNum = keyNum == keySettings[0].size() - 1 ? 0 : keyNum + 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_UP)) { + keyNum = keyNum == 0 ? keySettings[0].size() - 1 : keyNum - 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + Keyselected = true; + gm.Sm.playSound(menuSoundProp); + } + break; + case 3: + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + Itemselected = false; + } + if (gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + keyNum = keyNum == keySettings[0].size() - 1 ? 0 : keyNum + 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_UP)) { + keyNum = keyNum == 0 ? keySettings[0].size() - 1 : keyNum - 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + Keyselected = true; + gm.Sm.playSound(menuSoundProp); + } + break; + default: + break; + } + } else { + if (gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + itemCode = itemCode == 3 ? 0 : itemCode + 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_UP)) { + itemCode = itemCode == 0 ? 3 : itemCode - 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + Itemselected = true; + gm.Sm.playSound(menuSoundProp); + } + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE) && !Itemselected) { + gm.Sm.playSound(menuSoundProp); + SaveSetting(); + gm.SetInstance(new MenuPage()); + } + } + Draw(); + } + + public void LateUpdate() { + }; + + private void SaveSetting() { + JSONObject setting = gm.GlobalData.get("Setting"); + setting.put("Volume", gm.Sm.GetMasterVolume()); + setting.put("IsMute", gm.Sm.IsMute()); + FileManager fm = new FileManager(); + JSONObject SaveData = fm.LoadJsonObject("DataBase"); + String name = (String) gm.GlobalData.get("LocalData").get("Player"); + JSONObject Userdata = (JSONObject) SaveData.get(name); + if (Userdata == null) { + Userdata = new JSONObject(); + SaveData.put(name, Userdata); + } + Userdata.put("Setting", setting); + fm.SaveString("DataBase", SaveData.toJSONString(), true); + } + + private void Draw() { + drawSetting(); + drawSettingDetail(); + } + + public void Exit() { + }; + + private void drawSettingDetail() { + Graphics graphic = gm.Rm.GetCurrentGraphic(); + FontMetrics matrix = gm.Rm.SetFont("Regular"); + if (itemCode < 2) { + if (itemCode == 0 && Itemselected) + graphic.setColor(Color.GREEN); + else + graphic.setColor(Color.WHITE); + graphic.drawRect(gm.frame.getWidth() / 2, gm.frame.getHeight() / 4 + matrix.getHeight() / 8 * 12, + gm.frame.getWidth() / 4, matrix.getHeight()); + graphic.fillRect(gm.frame.getWidth() / 2, gm.frame.getHeight() / 4 + matrix.getHeight() / 8 * 12, + (int) (gm.frame.getWidth() / 4 * gm.Sm.GetVolumePercent() / 100), matrix.getHeight()); + graphic.drawString(Integer.toString((int) gm.Sm.GetVolumePercent()), + gm.frame.getWidth() / 4 * 3 + matrix.stringWidth("A") * 2, + gm.frame.getHeight() / 4 + matrix.getHeight() * 2); + if (itemCode == 1 && Itemselected) + graphic.setColor(Color.GREEN); + else + graphic.setColor(Color.WHITE); + if (gm.Sm.IsMute()) { + graphic.drawString("OFF", gm.frame.getWidth() / 10 * 7 - matrix.stringWidth("OFF") / 2, + gm.frame.getHeight() / 4 + matrix.getHeight() * 4); + } else { + graphic.drawString("ON", gm.frame.getWidth() / 10 * 7 - matrix.stringWidth("ON") / 2, + gm.frame.getHeight() / 4 + matrix.getHeight() * 4); + } + } + if (itemCode == 2 || itemCode == 3) { + for (int i = 0; i < KeyDefine.KeyFunc.length; i++) { + graphic.setColor(Color.WHITE); + if (!(Keyselected && keyNum == i)) { + graphic.drawString(KeyEvent.getKeyText(((Number) keySettings[itemCode - 2].get(i)).intValue()), + (int) (gm.frame.getWidth() * 8 / 10.0f) + - matrix.stringWidth(keySettings[itemCode - 2].get(i).toString()), + gm.frame.getHeight() / 4 + matrix.getHeight() * (2 * i + 1)); + } + if (keyNum == i && Itemselected) { + if (Itemselected) { + graphic.setColor(Color.GREEN); + } + } + graphic.drawString(KeyDefine.KeyFunc[i], + (int) (gm.frame.getWidth() * 6 / 10.0f) - matrix.stringWidth(KeyDefine.KeyFunc[i]), + gm.frame.getHeight() / 4 + matrix.getHeight() * (2 * i + 1)); + } + } + } + + public void drawSetting() { + String settingString = "Setting"; + String instructionsString1 = "Move with UP, DOWN / Select with SPACE"; + String instructionsString2 = "Press ESC to return"; + Graphics graphic = gm.Rm.GetCurrentGraphic(); + FontMetrics matrix = gm.Rm.SetFont("Big"); + graphic.setColor(Color.GREEN); + graphic.drawString(settingString, gm.frame.getWidth() / 2 - matrix.stringWidth(settingString) / 2, + gm.frame.getHeight() / 8); + matrix = gm.Rm.SetFont("Regular"); + graphic.setColor(Color.GRAY); + graphic.drawString(instructionsString1, gm.frame.getWidth() / 2 - matrix.stringWidth(instructionsString1) / 2, + gm.frame.getHeight() / 5 - matrix.getHeight() / 2); + graphic.drawString(instructionsString2, gm.frame.getWidth() / 2 - matrix.stringWidth(instructionsString2) / 2, + gm.frame.getHeight() / 5 + matrix.getHeight() / 2); + String[] string = { "Volume", "BGM", "1P Keys", "2P Keys" }; + for (int i = 0; i < 4; i++) { + if (itemCode == i) { + graphic.setColor(Color.GREEN); + if (Itemselected) { + graphic.drawString("*", gm.frame.getWidth() / 5 - matrix.stringWidth(string[i]) / 2 - 16, + gm.frame.getHeight() / 4 + matrix.getHeight() * 2 * (i + 1)); + } + } else { + graphic.setColor(Color.WHITE); + } + graphic.drawString(string[i], gm.frame.getWidth() / 5 - matrix.stringWidth(string[i]) / 2, + gm.frame.getHeight() / 4 + matrix.getHeight() * 2 * (i + 1)); + } + graphic.setColor(Color.GREEN); + graphic.drawLine(gm.frame.getWidth() / 5 * 2 - 1, gm.frame.getHeight() / 4, gm.frame.getWidth() / 5 * 2 - 1, + gm.frame.getHeight() / 10 * 9); + graphic.drawLine(gm.frame.getWidth() / 5 * 2, gm.frame.getHeight() / 4, gm.frame.getWidth() / 5 * 2, + gm.frame.getHeight() / 10 * 9); + } +} \ No newline at end of file diff --git a/src/GamePrime/Page/SkinSelectPage.java b/src/GamePrime/Page/SkinSelectPage.java new file mode 100644 index 00000000..7b05e8dd --- /dev/null +++ b/src/GamePrime/Page/SkinSelectPage.java @@ -0,0 +1,167 @@ +package GamePrime.Page; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import org.json.simple.JSONObject; +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import GamePrime.Define.ShipDefine; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.event.KeyEvent; + +public class SkinSelectPage implements GManager { + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + int SelectIndex1; + int SelectIndex2; + private Map img = new HashMap<>(); + SoundManager.PlayProp menuSoundProp; + String imgString[] = { "ShipType1", "ShipType2" }; + + public void Initialize() { + SelectIndex1 = 0; + SelectIndex2 = 0; + if (gm.GlobalData.get("LocalData").get("P1_Ship") != null) { + String prevShip1 = (String) gm.GlobalData.get("LocalData").get("P1_Ship"); + String prevShip2 = (String) gm.GlobalData.get("LocalData").get("P2_Ship"); + for (int i = 0; i < ShipDefine.Ship.length; i++) { + if (prevShip1 == ShipDefine.Ship[i]) { + SelectIndex1 = i; + } + if (prevShip2 == ShipDefine.Ship[i]) { + SelectIndex2 = i; + } + } + } + FileManager fm = new FileManager(); + img.put("Reimu&Marisa", fm.GetImage(File.separator + "Img" + File.separator + "Reimu&Marisa.png")); + JSONObject Entity = (JSONObject) res.get("Entity"); + JSONObject ShipType1 = (JSONObject) Entity.get("ShipType1"); + JSONObject ShipType2 = (JSONObject) Entity.get("ShipType2"); + img.put("ShipType1", fm.GetImage("Img" + File.separator + (String) ShipType1.get("Idle"))); + img.put("ShipType2", fm.GetImage("Img" + File.separator + (String) ShipType2.get("Idle"))); + JSONObject SFX = (JSONObject) res.get("SFX"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + }; + + public void PreUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_UP)) { + SelectIndex1 = SelectIndex1 == 0 ? ShipDefine.Ship.length - 1 : SelectIndex1 - 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_DOWN)) { + SelectIndex1 = SelectIndex1 == ShipDefine.Ship.length - 1 ? 0 : SelectIndex1 + 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_W)) { + SelectIndex2 = SelectIndex2 == 0 ? ShipDefine.Ship.length - 1 : SelectIndex2 - 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_S)) { + SelectIndex2 = SelectIndex2 == ShipDefine.Ship.length - 1 ? 0 : SelectIndex2 + 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + gm.Sm.playSound(menuSoundProp); + gm.GlobalData.get("LocalData").put("P1_Ship", ShipDefine.Ship[SelectIndex1]); + gm.GlobalData.get("LocalData").put("P2_Ship", ShipDefine.Ship[SelectIndex2]); + JSONObject PlayData = (JSONObject) gm.GlobalData.get("LocalData").get("PlayData"); + if (PlayData == null) { + PlayData = new JSONObject(); + gm.GlobalData.get("LocalData").put("PlayData", PlayData); + } + PlayData.put("Level", 1); + gm.SetInstance(new GamePage()); + } + }; + + public void Exit() { + }; + + public void PreRender() { + }; + + public void LateRender() { + }; + + public void LateUpdate() { + Draw(); + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + gm.SetInstance(new SelectPage()); + } + } + + void Draw() { + String SkinString = "Select Your Ship Design!"; + String skin1p = "1P"; + String skin2p = "2P"; + int height = 100; + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Big"); + BufferedImage bg = img.get("Reimu&Marisa"); + int bgwidth = bg.getWidth() * gm.frame.getHeight() / bg.getHeight(); + int bgheight = gm.frame.getHeight(); + Graphics2D graphics2D = (Graphics2D) grpahics; + graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f)); + graphics2D.drawImage(bg, gm.frame.getWidth() / 2 - bgwidth / 2, gm.frame.getHeight() / 2 - bgheight / 2, + bgwidth, bgheight, null); + graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f)); + int PlayMode = ((Number) gm.GlobalData.get("LocalData").get("PlayMode")).intValue(); + if (PlayMode == 1) { + grpahics.setColor(Color.white); + grpahics.drawLine(gm.frame.getWidth() / 2, gm.frame.getHeight() / 5, gm.frame.getWidth() / 2, + gm.frame.getHeight() * 4 / 5); + grpahics.setColor(Color.WHITE); + grpahics.drawString(skin1p, gm.frame.getWidth() / 4 - fontmatrix.stringWidth(skin1p) / 2 - 1, + gm.frame.getHeight() / 5); + grpahics.drawString(skin2p, 3 * gm.frame.getWidth() / 4 - fontmatrix.stringWidth(skin1p) / 2 - 2, + gm.frame.getHeight() / 5); + for (int i = 0; i < imgString.length; i++) { + if (SelectIndex1 == i) { + grpahics.setColor(Color.GREEN); + } else { + grpahics.setColor(Color.WHITE); + } + BufferedImage curimg = img.get(imgString[i]); + int x = gm.frame.getWidth() / 4 - 13; + int y = gm.frame.getHeight() / 4 + height * i; + float width = curimg.getWidth() / (float) curimg.getHeight() * height; + grpahics.drawImage(curimg, Math.round(x - width / 2), y, Math.round(width), height, null); + grpahics.drawRect(x - height / 2, y, height, height); + if (SelectIndex2 == i) { + grpahics.setColor(Color.GREEN); + } else { + grpahics.setColor(Color.WHITE); + } + x = gm.frame.getWidth() * 3 / 4 - 13; + grpahics.drawImage(curimg, Math.round(x - width / 2), y, Math.round(width), height, null); + grpahics.drawRect(x - height / 2, y, height, height); + } + } else { + grpahics.setColor(Color.WHITE); + grpahics.drawString(skin1p, gm.frame.getWidth() / 2 - fontmatrix.stringWidth(skin1p) / 2 - 1, + gm.frame.getHeight() / 5); + for (int i = 0; i < imgString.length; i++) { + if (SelectIndex1 == i) { + grpahics.setColor(Color.GREEN); + } else { + grpahics.setColor(Color.WHITE); + } + BufferedImage curimg = img.get(imgString[i]); + int x = gm.frame.getWidth() / 2 - 13; + int y = gm.frame.getHeight() / 4 + height * i; + float width = curimg.getWidth() / (float) curimg.getHeight() * height; + grpahics.drawImage(curimg, Math.round(x - width / 2), y, Math.round(width), height, null); + grpahics.drawRect(x - height / 2, y, height, height); + } + } + grpahics.setColor(Color.GREEN); + grpahics.drawString(SkinString, gm.frame.getWidth() / 2 - fontmatrix.stringWidth(SkinString) / 2, + gm.frame.getHeight() / 8); + } +} diff --git a/src/GamePrime/Page/StorePage.java b/src/GamePrime/Page/StorePage.java new file mode 100644 index 00000000..b8a3849b --- /dev/null +++ b/src/GamePrime/Page/StorePage.java @@ -0,0 +1,135 @@ +package GamePrime.Page; + +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import GamePrime.Define.ItemDefine; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.FontMetrics; +import org.json.simple.JSONObject; + +public class StorePage implements GManager { + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + private Map img = new HashMap<>(); + String imgString[] = { "BonusLife", "MoveSpeed", "ShotSpeed" }; + int SelectIndex; + private SoundManager.PlayProp menuSoundProp; + + public void Initialize() { + SelectIndex = 0; + FileManager fm = new FileManager(); + JSONObject SFX = (JSONObject) res.get("SFX"); + menuSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("MenuSelect"), null); + JSONObject StoreItem = (JSONObject) res.get("StoreItem"); + img.put("BonusLife", fm.GetImage("Img" + File.separator + StoreItem.get("BonusLife"))); + img.put("MoveSpeed", fm.GetImage("Img" + File.separator + StoreItem.get("MoveSpeed"))); + img.put("ShotSpeed", fm.GetImage("Img" + File.separator + StoreItem.get("ShotSpeed"))); + }; + + public void PreUpdate() { + if (gm.Im.isKeyDown(KeyEvent.VK_LEFT)) { + SelectIndex = SelectIndex == 0 ? ItemDefine.StoreItem.length - 1 : SelectIndex - 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_RIGHT)) { + SelectIndex = SelectIndex == ItemDefine.StoreItem.length - 1 ? 0 : SelectIndex + 1; + } + if (gm.Im.isKeyDown(KeyEvent.VK_SPACE)) { + String name = ItemDefine.StoreItem[SelectIndex].name; + int price = ItemDefine.StoreItem[SelectIndex].value; + int money = ((Number) gm.GlobalData.get("LocalData").get("Money")).intValue(); + JSONObject item = (JSONObject) gm.GlobalData.get("LocalData").get("StoreItem"); + if (money >= price && !(boolean) item.get(name)) { + money = money - price; + ((JSONObject) (gm.GlobalData.get("LocalData").get("StoreItem"))).put(name, true); + gm.GlobalData.get("LocalData").put("Money", money); + item.put(name, true); + gm.Sm.playSound(menuSoundProp); + } + } + }; + + public void PreRender() { + }; + + public void LateRender() { + }; + + public void LateUpdate() { + Draw(); + if (gm.Im.isKeyDown(KeyEvent.VK_ESCAPE)) { + FileManager fm = new FileManager(); + JSONObject database = fm.LoadJsonObject("DataBase"); + JSONObject UserData = (JSONObject) database.get(gm.GlobalData.get("LocalData").get("Player")); + int money = ((Number) gm.GlobalData.get("LocalData").get("Money")).intValue(); + JSONObject item = (JSONObject) gm.GlobalData.get("LocalData").get("StoreItem"); + UserData.put("Money", money); + UserData.put("StoreItem", item); + fm.SaveString("DataBase", database.toJSONString(), true); + gm.SetInstance(new MenuPage()); + } + } + + private void Draw() { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + grpahics.setColor(Color.GREEN); + FontMetrics fontmatrix = gm.Rm.SetFont("Regular"); + int height = 100; + for (int i = 0; i < ItemDefine.StoreItem.length; i++) { + if (SelectIndex == i) { + grpahics.setColor(Color.GREEN); + } else { + grpahics.setColor(Color.LIGHT_GRAY); + } + BufferedImage curimg = img.get(imgString[i]); + float width = height * curimg.getWidth() / (float) curimg.getHeight(); + int x = Math.round(width + i * gm.frame.getWidth() / ItemDefine.StoreItem.length - width / 2); + grpahics.drawRect(x, gm.frame.getHeight() / 2, Math.round(width), height); + grpahics.drawImage(curimg, x, gm.frame.getHeight() / 2, Math.round(width), height, null); + String name = ItemDefine.StoreItem[i].name; + grpahics.setColor(Color.GRAY); + if ((boolean) ((JSONObject) (gm.GlobalData.get("LocalData").get("StoreItem"))).get(name)) { + grpahics.setColor(Color.GREEN); + } + grpahics.drawString(name, x - fontmatrix.stringWidth(name) / 2 + Math.round(width) / 2, + gm.frame.getHeight() / 2 + height + 20); + grpahics.setColor(Color.white); + String price = "Price: $" + ItemDefine.StoreItem[i].value; + grpahics.drawString(price, x - fontmatrix.stringWidth(price) / 2 + Math.round(width) / 2, + gm.frame.getHeight() / 2 + height + 40); + } + // The title/guide for the item shop: + grpahics.setColor(Color.GREEN); + grpahics.drawString("Item Shop", gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Item Shop") / 2, + gm.frame.getHeight() / 10); + grpahics.drawString("Buy Your Upgrades Here!", + gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Buy Your Upgrades Here!") / 2, + gm.frame.getHeight() / 6); + grpahics.drawString("Press Space to Buy", + gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Press Space to Buy") / 2, gm.frame.getHeight() / 4); + grpahics.drawString("*If Player has the item already, Can't buy.*", + gm.frame.getWidth() / 2 - fontmatrix.stringWidth("*If Player has the item already, Can't buy.*") / 2, + gm.frame.getHeight() / 5); + grpahics.setColor(Color.GRAY); + grpahics.drawString("Press Esc to Go to Menu", + gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Press Esc to Go to Menu") / 2, + gm.frame.getHeight() - fontmatrix.getHeight()); + JSONObject local = (JSONObject) gm.GlobalData.get("LocalData"); + int money = ((Number) local.get("Money")).intValue(); + grpahics.setColor(Color.white); + grpahics.drawString("Current credits : " + money, + gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Current credits : " + money) / 2, + gm.frame.getHeight() / 3); + } + + public void Exit() { + }; +} diff --git a/src/GamePrime/Ship/Bomb.java b/src/GamePrime/Ship/Bomb.java new file mode 100644 index 00000000..1b29226e --- /dev/null +++ b/src/GamePrime/Ship/Bomb.java @@ -0,0 +1,33 @@ +package GamePrime.Ship; + +import java.awt.geom.Point2D; +import org.json.simple.JSONObject; +import java.awt.geom.Point2D; +import EnginePrime.Entity; +import EnginePrime.EventSystem; +import EnginePrime.Message; +import EnginePrime.Message.MessageType; + +public class Bomb extends Bullet { + Point2D dirList[]; + + public void Awake() { + super.Awake(); + dirList = new Point2D[] { new Point2D.Double(-1, 1), new Point2D.Double(-1, -1), new Point2D.Double(1, -1), + new Point2D.Double(1, 1), new Point2D.Double(0, 1) }; + } + + public static void MakeBomb(Point2D pos, Point2D dir, float ShotSpeed, String tag, String madeby) { + Entity bullet = EventSystem.Initiate(); + bullet.tag = "PBullet"; + JSONObject Custommessage = new JSONObject(); + Custommessage.put("Func", "SetVector"); + Custommessage.put("dir", new Point2D.Float(0, -1.0f)); + Custommessage.put("pos", pos); + Custommessage.put("ShotSpeed", ShotSpeed); + Custommessage.put("Madeby", madeby); + Message m = new Message(bullet, MessageType.Custom, Custommessage); + Bomb b = bullet.AddComponent(Bomb.class); + b.SetVector(m); + } +} diff --git a/src/GamePrime/Ship/Bullet.java b/src/GamePrime/Ship/Bullet.java new file mode 100644 index 00000000..c762a659 --- /dev/null +++ b/src/GamePrime/Ship/Bullet.java @@ -0,0 +1,66 @@ +package GamePrime.Ship; + +import org.json.simple.JSONObject; +import java.awt.Graphics; +import EnginePrime.Component; +import EnginePrime.Entity; +import EnginePrime.EventSystem; +import EnginePrime.GameManager; +import EnginePrime.Message; +import EnginePrime.Message.MessageType; +import GamePrime.ETC.Image; +import GamePrime.Page.GamePage; +import java.awt.geom.Point2D; + +public class Bullet extends Component { + public Point2D pos; + Point2D dir; + GameManager gm = GameManager.getInstance(); + GamePage gp; + Image img; + float ShotSpeed; + String MadeBY; + public int size = 30; + + public void SetVector(Message m) { + dir = (Point2D) m.obj.get("dir"); + pos = (Point2D) m.obj.get("pos"); + ShotSpeed = ((Number) m.obj.get("ShotSpeed")).intValue(); + MadeBY = (String) m.obj.get("Madeby"); + } + + public void Awake() { + this.CustomEvent.put("SetVector", this::SetVector); + gp = (GamePage) gm.CustomInstance; + img = gp.ImgRes.get("Bullet"); + } + + public void Start() { + } + + public void Update() { + if (((Number) gp.PlayData.get("ScreenIndex")).intValue() != 0) { + return; + } + pos = new Point2D.Double(pos.getX() + dir.getX() * ShotSpeed * gm.Et.GetElapsedSeconds(), + pos.getY() + dir.getY() * ShotSpeed * gm.Et.GetElapsedSeconds()); + } + + public void Render() { + img.RenderFixedHeight((int) Math.round(pos.getX()), (int) Math.round(pos.getY()), size); + } + + public static void MakeBullet(Point2D pos, Point2D dir, float ShotSpeed, String tag, String madeby) { + Entity bullet = EventSystem.Initiate(); + bullet.tag = tag; + JSONObject Custommessage = new JSONObject(); + Custommessage.put("Func", "SetVector"); + Custommessage.put("dir", dir); + Custommessage.put("pos", pos); + Custommessage.put("ShotSpeed", ShotSpeed); + Custommessage.put("Madeby", madeby); + Message m = new Message(bullet, MessageType.Custom, Custommessage); + Bullet b = bullet.AddComponent(Bullet.class); + b.SetVector(m); + } +} diff --git a/src/GamePrime/Ship/Enemy.java b/src/GamePrime/Ship/Enemy.java new file mode 100644 index 00000000..1b9287b9 --- /dev/null +++ b/src/GamePrime/Ship/Enemy.java @@ -0,0 +1,124 @@ +package GamePrime.Ship; + +import java.awt.geom.Point2D; +import org.json.simple.JSONObject; +import EnginePrime.Component; +import EnginePrime.Entity; +import EnginePrime.EventSystem; +import EnginePrime.GameManager; +import EnginePrime.Message; +import EnginePrime.Message.MessageType; +import java.io.File; +import EnginePrime.SoundManager; +import GamePrime.ETC.Image; +import GamePrime.Page.GamePage; +import GamePrime.Ship.EnemyController.EnemyType; + +public class Enemy extends Component { + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + GamePage gp = (GamePage) gm.CustomInstance; + public float ShotSpeed; + int life; + int Point; + float Shotdelay; + float curdelay; + Point2D pos; + EnemyController.EnemyType type; + Image IdleImg; + Image DieImg; + int item = -1; + double elapsed; + SoundManager.PlayProp ShootSoundProp; + + public float ImgGetWidth() { + return IdleImg.GetWidthFixHeight(((Number) gp.PlayData.get("ImgHeight")).intValue()); + } + + public void SetVector(Message m) { + pos = (Point2D) m.obj.get("pos"); + } + + public void SetInfo(Message m) { + life = ((Number) m.obj.get("Life")).intValue(); + Point = ((Number) m.obj.get("Point")).intValue(); + ShotSpeed = ((Number) m.obj.get("ShotSpeed")).intValue(); + Shotdelay = ((Number) m.obj.get("ShotDelay")).floatValue(); + type = (EnemyType) m.obj.get("Type"); + IdleImg = gp.ImgRes.get(m.obj.get("IdleImg")); + DieImg = gp.ImgRes.get(m.obj.get("DieImg")); + item = ((Number) m.obj.get("Item")).intValue(); + } + + public void Awake() { + this.CustomEvent.put("SetVector", this::SetVector); + this.CustomEvent.put("SetInfo", this::SetInfo); + JSONObject SFX = (JSONObject) res.get("SFX"); + ShootSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("EnemyShoot"), null); + } + + public void Start() { + curdelay = 0; + Shotdelay = 0; + } + + public void Shoot() { + if (curdelay == 0) { + Entity bullet = EventSystem.Initiate(); + Bullet b = bullet.AddComponent(Bullet.class); + bullet.tag = "EBullet"; + JSONObject Custommessage = new JSONObject(); + Custommessage.put("Entity", bullet); + Custommessage.put("Func", "SetVector"); + Custommessage.put("dir", new Point2D.Float(0, 1.0f)); + Custommessage.put("pos", pos); + Custommessage.put("ShotSpeed", ShotSpeed); + Message m = new Message(this.Obj, MessageType.Custom, Custommessage); + b.SetVector(m); + curdelay = Shotdelay; + gm.Sm.playSound(ShootSoundProp); + } + } + + public void Attacked() { + life -= 1; + if (life == 0) { + new Thread(new Runnable() { + public void run() { + long prev = System.nanoTime(); + elapsed = 0; + while (elapsed < 2) { + long cur = System.nanoTime() - prev; + elapsed = cur / 1_000_000_000.0; + if (elapsed > 2) { + elapsed = 2; + } + } + } + }).start(); + } + } + + public void Update() { + curdelay -= gm.Et.GetElapsedSeconds(); + if (curdelay <= 0) { + curdelay = 0; + } + } + + public void Render() { + Image curimg = IdleImg; + if (life == 0) { + if (elapsed == 2) { + EventSystem.Destroy(Obj); + } + curimg = DieImg; + curimg.RenderFixedHeight((int) Math.round(pos.getX()), (int) Math.round(pos.getY()), + ((Number) gp.PlayData.get("ImgHeight")).intValue(), (float) (1 - elapsed / 3)); + } else { + curimg.RenderFixedHeight((int) Math.round(pos.getX()), (int) Math.round(pos.getY()), + ((Number) gp.PlayData.get("ImgHeight")).intValue()); + } + }; +} \ No newline at end of file diff --git a/src/GamePrime/Ship/EnemyController.java b/src/GamePrime/Ship/EnemyController.java new file mode 100644 index 00000000..b384c803 --- /dev/null +++ b/src/GamePrime/Ship/EnemyController.java @@ -0,0 +1,317 @@ +package GamePrime.Ship; + +import java.awt.geom.Point2D; +import org.json.simple.JSONObject; +import java.util.Iterator; +import java.util.ArrayList; +import EnginePrime.Component; +import EnginePrime.Entity; +import EnginePrime.EventSystem; +import EnginePrime.GameManager; +import EnginePrime.Message; +import EnginePrime.Message.MessageType; +import java.util.Random; +import java.io.File; +import EnginePrime.SoundManager; +import GamePrime.Define.ItemDefine; +import GamePrime.Page.GamePage; + +public class EnemyController extends Component { + public final static int MaxStageCount = 3; + final int MoveDownPixel = 100; + + public static enum EnemyType { + EnemyType1, EnemyType2, + } + + GamePage gp; + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + float dir; + ArrayList> EnemyPool = new ArrayList>(); + int col; + int row; + int enemynum; + float Shotdelay; + SoundManager.PlayProp DestroySoundProp; + SoundManager.PlayProp DestroySoundProp2; + SoundManager.PlayProp ItemSoundProp; + + public void Start() { + JSONObject BGM = (JSONObject) res.get("BGM"); + JSONObject SFX = (JSONObject) res.get("SFX"); + ItemSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("ItemCreate"), null); + DestroySoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("Destroyed"), null); + DestroySoundProp2 = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("Bomb"), null); + Shotdelay = 2; + enemynum = 0; + gp = (GamePage) gm.CustomInstance; + dir = 1; + col = 0; + row = 0; + int level = ((Number) gp.PlayData.get("Level")).intValue(); + SoundManager.PlayProp BgmProp; + switch (level) { + case 1: + Level1(3, 4); + BgmProp = gm.Sm.new PlayProp("Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("Level1"), + "BGM"); + BgmProp.count = -1; + gm.Sm.StopClip("BGM", 1); + gm.Sm.playSound(BgmProp); + break; + case 2: + Level2(1, 2); + BgmProp = gm.Sm.new PlayProp("Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("Level2"), + "BGM"); + BgmProp.count = -1; + gm.Sm.StopClip("BGM", 1); + gm.Sm.playSound(BgmProp); + break; + case 3: + Level2(4, 4); + BgmProp = gm.Sm.new PlayProp("Sound" + File.separator + "BGM" + File.separator + (String) BGM.get("Level3"), + "BGM"); + BgmProp.count = -1; + gm.Sm.StopClip("BGM", 1); + gm.Sm.playSound(BgmProp); + break; + default: + break; + } + }; + + public void Update() { + if (((Number) gp.PlayData.get("ScreenIndex")).intValue() != 0) { + return; + } + if (EnemyPool.size() == 0) { + gp.PlayData.put("ScreenIndex", 3); + gp.PlayData.put("LevelClear", true); + return; + } + if (Shotdelay == 0) { + Random random = new Random(); + for (int i = 0; i < random.nextInt(enemynum); i++) { + int randRow = random.nextInt(EnemyPool.size()); + int randCol = random.nextInt(EnemyPool.get(randRow).size()); + EnemyPool.get(randRow).get(randCol).Shoot(); + } + Shotdelay = random.nextInt(enemynum); + } + Shotdelay -= gm.Et.GetElapsedSeconds(); + if (Shotdelay <= 0) { + Shotdelay = 0; + } + Move(); + }; + + public void CheckCollsion(Bullet bullet) { + int height = ((Number) gp.PlayData.get("ImgHeight")).intValue(); + double bulletMinX = bullet.pos.getX() - bullet.size / 2; + double bulletMaxX = bullet.pos.getX() + bullet.size / 2; + double bulletMinY = bullet.pos.getY() - bullet.size / 2; + double bulletMaxY = bullet.pos.getY() + bullet.size / 2; + for (ArrayList eList : EnemyPool) { + if (!bullet.Obj.isAlve) { + return; + } + Iterator iterator = eList.iterator(); + while (iterator.hasNext()) { + Enemy e = iterator.next(); + double MinX = e.pos.getX() - e.IdleImg.GetWidthFixHeight(height) / 2; + double MaxX = e.pos.getX() + e.IdleImg.GetWidthFixHeight(height) / 2; + double MinY = e.pos.getY() - height / 2; + double MaxY = e.pos.getY() + height / 2; + if ((MaxX >= bulletMinX && MinX <= bulletMaxX) && (MaxY >= bulletMinY && MinY <= bulletMaxY)) { + Collsion(e, bullet); + if (e.life == 0) { + iterator.remove(); + } + break; + } + } + } + Iterator> iterator = EnemyPool.iterator(); + while (iterator.hasNext()) { + ArrayList array = iterator.next(); + if (array.size() == 0) { + iterator.remove(); + } + } + } + + private void Collsion(Enemy e, Bullet bullet) { + e.Attacked(); + if (e.life == 0) { + if (e.item != -1) { + Entity itemEntity = EventSystem.Initiate(); + Item item = itemEntity.AddComponent(Item.class); + itemEntity.tag = "Item"; + JSONObject Custommessage = new JSONObject(); + Custommessage.put("Func", "SetVector"); + Custommessage.put("pos", e.pos); + Custommessage.put("Item", e.item); + Message m = new Message(this.Obj, MessageType.Custom, Custommessage); + item.SetVector(m); + gm.Sm.playSound(ItemSoundProp); + } + enemynum -= 1; + if (bullet instanceof Bomb) { + gm.Sm.playSound(DestroySoundProp2); + } else { + gm.Sm.playSound(DestroySoundProp); + } + int point = ((Number) gp.PlayData.get("Point")).intValue() + e.Point; + gp.PlayData.put("Point", point); + if (bullet.MadeBY == "Player1") { + gp.PlayData.put("KillCount", ((Number) gp.PlayData.get("KillCount")).intValue() + 1); + } else { + gp.PlayData.put("KillCount2", ((Number) gp.PlayData.get("KillCount2")).intValue() + 1); + } + } + if (bullet instanceof Bomb) { + Bomb bomb = (Bomb) bullet; + for (Point2D p : bomb.dirList) { + Bullet.MakeBullet(bullet.pos, p, bullet.ShotSpeed, "PBullet", bullet.MadeBY); + } + } + EventSystem.Destroy(bullet.Obj); + } + + private Enemy CreateEnemy(EnemyType type) { + Enemy enemy = EventSystem.Initiate().AddComponent(Enemy.class, 2); + SetEnemyInfo(enemy, type); + return enemy; + }; + + public void SetEnemyInfo(Enemy e, EnemyType type) { + JSONObject Custommessage = new JSONObject(); + Custommessage.put("Entity", e.Obj); + Custommessage.put("Func", "SetInfo"); + if (type == EnemyType.EnemyType1) { + Custommessage.put("Life", 1); + Custommessage.put("Point", 10); + Custommessage.put("ShotSpeed", 300); + Custommessage.put("ShotDelay", 2.0f); + Custommessage.put("Life", 1); + Custommessage.put("Type", type); + Custommessage.put("IdleImg", "EnemyType1.Idle"); + Custommessage.put("DieImg", "EnemyType1.Destroyed"); + Custommessage.put("Item", new Random().nextInt(ItemDefine.ActiveItem.length + 1) - 1); + } else if (type == EnemyType.EnemyType2) { + Custommessage.put("Life", 3); + Custommessage.put("Point", 50); + Custommessage.put("ShotSpeed", 500); + Custommessage.put("ShotDelay", 1.0f); + Custommessage.put("Type", type); + Custommessage.put("IdleImg", "EnemyType2.Idle"); + Custommessage.put("DieImg", "EnemyType2.Destroyed"); + Custommessage.put("Item", new Random().nextInt(ItemDefine.ActiveItem.length + 1) - 1); + } + Message m = new Message(this.Obj, MessageType.Custom, Custommessage); + e.SetInfo(m); + } + + public void SetEnemyPos(Enemy e, Point2D pos) { + JSONObject Custommessage = new JSONObject(); + Custommessage.put("Entity", e.Obj); + Custommessage.put("Func", "SetVector"); + Custommessage.put("pos", new Point2D.Double(pos.getX(), pos.getY())); + Message m = new Message(this.Obj, MessageType.Custom, Custommessage); + e.SetVector(m); + } + + public void Level1(int x, int y) { + enemynum = x * y; + int posx = gm.frame.getWidth() * 4 / 10; + int posy = gm.frame.getHeight() / 10; + this.col = x; + this.row = y; + for (int i = 0; i < y; i++) { + ArrayList EnemyList = new ArrayList(); + EnemyPool.add(EnemyList); + for (int j = 0; j < x; j++) { + Enemy e = CreateEnemy(EnemyType.EnemyType1); + Point2D pos = new Point2D.Double(posx, posy); + SetEnemyPos(e, pos); + posx += e.ImgGetWidth(); + EnemyList.add(e); + } + posx = gm.frame.getWidth() * 4 / 10; + posy += ((Number) gp.PlayData.get("ImgHeight")).intValue(); + } + } + + public void Level2(int x, int y) { + enemynum = x * y; + int posx = gm.frame.getWidth() * 4 / 10; + int posy = gm.frame.getHeight() / 10; + this.col = x; + this.row = y; + for (int i = 0; i < y; i++) { + ArrayList EnemyList = new ArrayList(); + EnemyPool.add(EnemyList); + for (int j = 0; j < x; j++) { + EnemyType type = EnemyType.EnemyType1; + if (i % 2 == 1) { + type = EnemyType.EnemyType2; + } + Enemy e = CreateEnemy(type); + Point2D pos = new Point2D.Double(posx, posy); + SetEnemyPos(e, pos); + posx += e.ImgGetWidth(); + EnemyList.add(e); + } + posx = gm.frame.getWidth() * 4 / 10; + posy += ((Number) gp.PlayData.get("ImgHeight")).intValue(); + } + } + + void Move() { + if (enemynum == 0) { + return; + } + ArrayList EnemyList = EnemyPool.get(0); + Enemy first = EnemyList.get(0); + EnemyList = EnemyPool.get(EnemyPool.size() - 1); + Enemy lastY = EnemyList.get(EnemyList.size() - 1); + int maxSize = 0; + for (ArrayList eList : EnemyPool) { + int currentSize = eList.size(); + // 현재 리스트가 이전에 찾은 가장 큰 크기보다 큰 경우 + if (currentSize > maxSize) { + // 가장 큰 크기를 갱신하고 해당 리스트를 저장 + maxSize = currentSize; + EnemyList = eList; + } + } + Enemy lastX = EnemyList.get(EnemyList.size() - 1); + float w = (float) (lastX.pos.getX() - first.pos.getX() + lastX.ImgGetWidth()); + float h = (float) (lastY.pos.getY() - first.pos.getY() + ((Number) gp.PlayData.get("ImgHeight")).intValue()); + float x = (float) first.pos.getX() - first.ImgGetWidth() / 2; + float y = (float) first.pos.getY() - ((Number) gp.PlayData.get("ImgHeight")).intValue() / 2; + float moveX = (int) Math.round(50 * dir * gm.Et.GetElapsedSeconds()); + float moveY = 0; + if (x + moveX + w > gm.frame.getWidth()) { + dir = -1; + moveX = gm.frame.getWidth() - w - x; + moveY += MoveDownPixel; + } else if (x + moveX < 0) { + dir = 1; + moveX = -x; + moveY += MoveDownPixel; + } + if (y + h + moveY > gm.frame.getHeight() - ((Number) gp.PlayData.get("ImgHeight")).intValue() * 3) { + moveY = gm.frame.getHeight() - ((Number) gp.PlayData.get("ImgHeight")).intValue() * 3 - y - h; + } + for (ArrayList eList : EnemyPool) { + for (Enemy e : eList) { + SetEnemyPos(e, new Point2D.Double(e.pos.getX() + moveX, e.pos.getY() + moveY)); + } + } + } +} diff --git a/src/GamePrime/Ship/Item.java b/src/GamePrime/Ship/Item.java new file mode 100644 index 00000000..194486c2 --- /dev/null +++ b/src/GamePrime/Ship/Item.java @@ -0,0 +1,56 @@ +package GamePrime.Ship; + +import java.awt.event.KeyEvent; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import java.awt.Graphics; +import EnginePrime.Component; +import EnginePrime.GameManager; +import EnginePrime.Message; +import java.awt.image.BufferedImage; +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import EnginePrime.FileManager; +import EnginePrime.GManager; +import EnginePrime.GameManager; +import EnginePrime.SoundManager; +import GamePrime.Define.KeyDefine; +import GamePrime.ETC.Image; +import GamePrime.Page.GamePage; +import java.awt.geom.Point2D; + +public class Item extends Component { + public final int DropSpeed = 400; + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + GamePage gp; + public Point2D pos; + public int size = 30; + public int itemIndex; + + public void SetVector(Message m) { + pos = (Point2D) m.obj.get("pos"); + itemIndex = ((Number) m.obj.get("Item")).intValue(); + } + + public void Awake() { + this.CustomEvent.put("SetVector", this::SetVector); + gp = (GamePage) gm.CustomInstance; + } + + public void Start() { + } + + public void Update() { + if (((Number) gp.PlayData.get("ScreenIndex")).intValue() != 0) { + return; + } + pos = new Point2D.Double(pos.getX(), pos.getY() + DropSpeed * gm.Et.GetElapsedSeconds()); + } + + public void Render() { + Image img = gp.ImgRes.get("Item"); + img.RenderFixedHeight((int) Math.round(pos.getX()), (int) Math.round(pos.getY()), size); + } +} diff --git a/src/GamePrime/Ship/Player.java b/src/GamePrime/Ship/Player.java new file mode 100644 index 00000000..b8779625 --- /dev/null +++ b/src/GamePrime/Ship/Player.java @@ -0,0 +1,365 @@ +package GamePrime.Ship; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import java.awt.Graphics; +import EnginePrime.Component; +import EnginePrime.EngineTimer; +import EnginePrime.EventSystem; +import EnginePrime.GameManager; +import java.awt.geom.Point2D; +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import EnginePrime.SoundManager; +import GamePrime.Define.ItemDefine; +import GamePrime.Define.KeyDefine; +import GamePrime.Define.ShipDefine; +import GamePrime.ETC.Image; +import GamePrime.Page.GamePage; +import java.awt.Graphics2D; + +public class Player extends Component { + String State[] = { "Idle", "Die" }; + public float PosX; + public float PosY; + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + GamePage gp; + JSONObject PlayData; + private Map img = new HashMap<>(); + int StateIndex = 0; + private HashMap KeyFunc = new HashMap<>(); + float Shotdelay; + float Delay; + boolean ActiveItem[]; + SoundManager.PlayProp ShootSoundProp; + SoundManager.PlayProp ShootSoundProp2; + SoundManager.PlayProp ShootSoundProp3; + SoundManager.PlayProp ShootSoundProp4; + SoundManager.PlayProp DestroyedProp; + SoundManager.PlayProp DestroyedProp2; + SoundManager.PlayProp ItemGetProp; + SoundManager.PlayProp SubshipProp; + SoundManager.PlayProp SpeedUpProp; + SoundManager.PlayProp InvicibleProp; + SoundManager.PlayProp BombEquipProp; + + public void Awake() { + gp = (GamePage) gm.CustomInstance; + JSONObject SFX = (JSONObject) res.get("SFX"); + SubshipProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("Auxiliary"), null); + SpeedUpProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("SpeedUp"), null); + InvicibleProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("Ghost"), null); + BombEquipProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("BombAquip"), null); + ShootSoundProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("PlayerShoot1"), null); + ShootSoundProp2 = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("PlayerShoot2"), null); + ShootSoundProp3 = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("PlayerShoot3"), null); + ShootSoundProp4 = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("PlayerShoot4"), null); + DestroyedProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("PlayerDestroyed"), null); + DestroyedProp2 = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("PlayerDestroyed2"), null); + ItemGetProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("GetItem"), null); + String ship = null; + JSONObject data = gm.GlobalData.get("Setting"); + PlayData = (JSONObject) gm.GlobalData.get("LocalData").get("PlayData"); + if (this.Obj.name == "Player1") { + ship = (String) gm.GlobalData.get("LocalData").get("P1_Ship"); + JSONArray keySettings = (JSONArray) data.get("KeySetting_1p"); + for (int i = 0; i < KeyDefine.KeyFunc.length; i++) { + KeyFunc.put(KeyDefine.KeyFunc[i], ((Number) keySettings.get(i)).intValue()); + } + } else if (this.Obj.name == "Player2") { + ship = (String) gm.GlobalData.get("LocalData").get("P2_Ship"); + JSONArray keySettings = (JSONArray) data.get("KeySetting_2p"); + for (int i = 0; i < KeyDefine.KeyFunc.length; i++) { + KeyFunc.put(KeyDefine.KeyFunc[i], ((Number) keySettings.get(i)).intValue()); + } + } + if (ship == ShipDefine.Ship[0]) { + img.put(State[0], gp.ImgRes.get("ShipType1.Idle")); + img.put(State[1], gp.ImgRes.get("ShipType1.Destroyed")); + } else if (ship == ShipDefine.Ship[1]) { + img.put(State[0], gp.ImgRes.get("ShipType2.Idle")); + img.put(State[1], gp.ImgRes.get("ShipType2.Destroyed")); + } + } + + public void CheckCollsion(Item item) { + int height = ((Number) gp.PlayData.get("ImgHeight")).intValue(); + double itemMinX = item.pos.getX() - item.size / 2; + double itemMaxX = item.pos.getX() + item.size / 2; + double itemMinY = item.pos.getY() - item.size / 2; + double itemMaxY = item.pos.getY() + item.size / 2; + Image curimg = img.get(State[StateIndex]); + double PlayerMinX = PosX - curimg.GetWidthFixHeight(height) / 2; + double PlayerMaxX = PosX + curimg.GetWidthFixHeight(height) / 2; + double PlayerMinY = PosY - height / 2; + double PlayerMaxY = PosY + height / 2; + if ((PlayerMaxX >= itemMinX && PlayerMinX <= itemMaxX) && (PlayerMaxY >= itemMinY && PlayerMinY <= itemMaxY)) { + EventSystem.Destroy(item.Obj); + AquiredItem(item.itemIndex); + } + } + + void AquiredItem(int item) { + JSONArray itemList = (JSONArray) PlayData.get("ActiveItem"); + if (this.Obj.name == "Player2") { + itemList = (JSONArray) PlayData.get("ActiveItem2"); + } + if (itemList.size() < 3) { + itemList.add(item); + gm.Sm.playSound(ItemGetProp); + } + } + + public void CheckCollsion(Bullet bullet) { + if (ActiveItem[0]) { + return; + } + int height = ((Number) gp.PlayData.get("ImgHeight")).intValue(); + double bulletMinX = bullet.pos.getX() - bullet.size / 2; + double bulletMaxX = bullet.pos.getX() + bullet.size / 2; + double bulletMinY = bullet.pos.getY() - bullet.size / 2; + double bulletMaxY = bullet.pos.getY() + bullet.size / 2; + Image curimg = img.get(State[StateIndex]); + double PlayerMinX = PosX - curimg.GetWidthFixHeight(height) / 2; + double PlayerMaxX = PosX + curimg.GetWidthFixHeight(height) / 2; + double PlayerMinY = PosY - height / 2; + double PlayerMaxY = PosY + height / 2; + if ((PlayerMaxX >= bulletMinX && PlayerMinX <= bulletMaxX) + && (PlayerMaxY >= bulletMinY && PlayerMinY <= bulletMaxY)) { + EventSystem.Destroy(bullet.Obj); + Attacked(); + } + } + + public void Attacked() { + if (StateIndex == 0) { + StateIndex = 1; + int life; + if (Obj.name == "Player1") { + life = ((Number) PlayData.get("Life")).intValue() - 1; + PlayData.put("Life", life); + } else { + life = ((Number) PlayData.get("Life2")).intValue() - 1; + PlayData.put("Life2", life); + } + if (life == 0) { + gm.Sm.playSound(DestroyedProp2); + EventSystem.Destroy(this.Obj); + } else { + gm.Sm.playSound(DestroyedProp); + } + } + Delay = 2; + int point = ((Number) PlayData.get("Point")).intValue() - 30; + PlayData.put("Point", point); + } + + int GetMoveSpeed() { + int basicspeed = ((Number) PlayData.get("MoveSpeed")).intValue(); + if (ActiveItem[3]) { + basicspeed += 100; + } + return basicspeed; + } + + public void Start() { + Shotdelay = 0; + Delay = 0; + PosY = gm.frame.getHeight() - ((Number) gp.PlayData.get("ImgHeight")).intValue() * 2; + PosX = gm.frame.getWidth() / 2; + ActiveItem = new boolean[ItemDefine.ActiveItem.length]; + for (int i = 0; i < ItemDefine.ActiveItem.length; i++) { + ActiveItem[i] = false; + } + }; + + void activeItem(int index, double time) { + ActiveItem[index] = true; + EngineTimer.ExecuteTimer(new Runnable() { + public void run() { + ActiveItem[index] = false; + } + }, time); + } + + public void UseItem() { + JSONArray itemList = (JSONArray) PlayData.get("ActiveItem"); + if (Obj.name == "Player2") { + itemList = (JSONArray) PlayData.get("ActiveItem2"); + } + int size = itemList.size(); + if (size > 0) { + int item = ((Number) itemList.get(size - 1)).intValue(); + if (ActiveItem[item] == true) { + return; + } + itemList.remove(size - 1); + switch (ItemDefine.ActiveItem[item]) { + case "Ghost": + activeItem(0, 7); + gm.Sm.playSound(InvicibleProp); + break; + case "Auxiliary": + activeItem(1, 5); + gm.Sm.playSound(SubshipProp); + break; + case "Bomb": + ActiveItem[2] = true; + gm.Sm.playSound(BombEquipProp); + break; + case "SpeedUp": + activeItem(3, 7); + gm.Sm.playSound(SpeedUpProp); + break; + default: + break; + } + } + } + + public void Update() { + if ((StateIndex == 1) || ((Number) PlayData.get("ScreenIndex")).intValue() != 0) { + if (StateIndex == 1 && ((Number) PlayData.get("ScreenIndex")).intValue() == 0) { + Delay -= gm.Et.GetElapsedSeconds(); + if (Delay < 0) { + StateIndex = 0; + Delay = 0; + } + } + return; + } + if (gm.Im.isKeyPressed(KeyFunc.get("RIGHT"))) { + int movespeed = GetMoveSpeed(); + PosX += movespeed * gm.Et.GetElapsedSeconds(); + Image curimg = img.get(State[StateIndex]); + float max = PosX + curimg.GetHeightFixWidth(((Number) gp.PlayData.get("ImgHeight")).intValue() / 2); + if (max > gm.frame.getWidth()) { + PosX = gm.frame.getWidth() + - curimg.GetHeightFixWidth(((Number) gp.PlayData.get("ImgHeight")).intValue() / 2); + } + } + if (gm.Im.isKeyPressed(KeyFunc.get("LEFT"))) { + int movespeed = GetMoveSpeed(); + PosX -= movespeed * gm.Et.GetElapsedSeconds(); + Image curimg = img.get(State[StateIndex]); + float min = PosX - curimg.GetHeightFixWidth(((Number) gp.PlayData.get("ImgHeight")).intValue() / 2); + if (min < 0) { + PosX = curimg.GetHeightFixWidth(((Number) gp.PlayData.get("ImgHeight")).intValue() / 2); + } + } + if (gm.Im.isKeyDown(KeyFunc.get("ITEM"))) { + UseItem(); + } + if (gm.Im.isKeyPressed(KeyFunc.get("ATTACK"))) { + if (Shotdelay == 0) { + if (gp.HardMode && GetBullet() == 0) { + // 못쏴요 + } else { + MakeBullet(new Point2D.Float(PosX, PosY), new Point2D.Float(0, -1.0f), + (float) PlayData.get("ShotSpeed")); + if (this.Obj.name == "Player1") { + gm.Sm.playSound(ShootSoundProp); + } else { + gm.Sm.playSound(ShootSoundProp3); + } + if (ActiveItem[1]) { + MakeBullet(new Point2D.Float(PosX + 50, PosY), new Point2D.Float(0, -1.0f), + (float) PlayData.get("ShotSpeed")); + MakeBullet(new Point2D.Float(PosX - 50, PosY), new Point2D.Float(0, -1.0f), + (float) PlayData.get("ShotSpeed")); + if (this.Obj.name == "Player1") { + gm.Sm.playSound(ShootSoundProp2); + } else { + gm.Sm.playSound(ShootSoundProp4); + } + } + if (ActiveItem[2]) { + ActiveItem[2] = false; + } + if (gp.HardMode) { + SetBullet(GetBullet() - 1); + } + if (Obj.name == "Player1") { + PlayData.put("ShotCount", ((Number) gp.PlayData.get("ShotCount")).intValue() + 1); + } else { + PlayData.put("ShotCount", ((Number) gp.PlayData.get("ShotCount2")).intValue() + 1); + } + Shotdelay = ((Number) PlayData.get("ShotDelay")).floatValue(); + } + } + } + Shotdelay -= gm.Et.GetElapsedSeconds(); + if (Shotdelay <= 0) { + Shotdelay = 0; + } + if (gm.Im.isKeyPressed(KeyFunc.get("RELOAD"))) { + if (gp.HardMode) { + if (GetBullet() == 0 && GetMegazine() != 0) { + SetBullet(10); + SetMegazine(GetMegazine() - 1); + } + } + } + }; + + void SetMegazine(int m) { + if (Obj.name == "Player1") { + PlayData.put("Magazine1", m); + } else { + PlayData.put("Magazine2", m); + } + } + + int GetMegazine() { + if (Obj.name == "Player1") { + return ((Number) PlayData.get("Magazine1")).intValue(); + } else { + return ((Number) PlayData.get("Magazine2")).intValue(); + } + } + + void SetBullet(int m) { + if (Obj.name == "Player1") { + PlayData.put("Bullet1", m); + } else { + PlayData.put("Bullet2", m); + } + } + + int GetBullet() { + if (Obj.name == "Player1") { + return ((Number) PlayData.get("Bullet1")).intValue(); + } else { + return ((Number) PlayData.get("Bullet2")).intValue(); + } + } + + public void MakeBullet(Point2D pos, Point2D dir, float ShotSpeed) { + if (ActiveItem[2]) { + Bomb.MakeBomb(pos, dir, ShotSpeed, "PBullet", Obj.name); + } else { + Bullet.MakeBullet(pos, dir, ShotSpeed, "PBullet", Obj.name); + } + } + + public void Render() { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + Graphics2D graphics2D = (Graphics2D) grpahics; + Image curimg = img.get(State[StateIndex]); + curimg.RenderFixedHeight(Math.round(PosX), Math.round(PosY), + ((Number) gp.PlayData.get("ImgHeight")).intValue()); + }; +} diff --git a/src/GamePrime/UI/PrepareUI.java b/src/GamePrime/UI/PrepareUI.java new file mode 100644 index 00000000..bbccdb41 --- /dev/null +++ b/src/GamePrime/UI/PrepareUI.java @@ -0,0 +1,79 @@ +package GamePrime.UI; + +import org.json.simple.JSONObject; +import java.awt.Graphics; +import EnginePrime.Component; +import EnginePrime.EventSystem; +import EnginePrime.GameManager; +import java.io.File; +import EnginePrime.SoundManager; +import java.awt.Color; +import java.awt.FontMetrics; + +public class PrepareUI extends Component { + GameManager gm = GameManager.getInstance(); + JSONObject res = gm.GlobalData.get("Resource"); + double elapsedSeconds; + int Seconds; + JSONObject PlayData; + SoundManager.PlayProp levelProp; + SoundManager.PlayProp levelProp2; + + public void Start() { + JSONObject SFX = (JSONObject) res.get("SFX"); + levelProp = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("LevelStart"), null); + levelProp2 = gm.Sm.new PlayProp( + "Sound" + File.separator + "SFX" + File.separator + (String) SFX.get("LevelStart2"), null); + elapsedSeconds = 6; + Seconds = 4; + PlayData = (JSONObject) gm.GlobalData.get("LocalData").get("PlayData"); + SetRenderPrior(2); + } + + public void Update() { + elapsedSeconds -= gm.Et.GetElapsedSeconds(); + if ((int) elapsedSeconds != Seconds && (int) elapsedSeconds <= 4) { + if ((int) elapsedSeconds >= 1) { + gm.Sm.playSound(levelProp); + } else { + gm.Sm.playSound(levelProp2); + } + Seconds = (int) elapsedSeconds; + } + if (elapsedSeconds < 0) { + elapsedSeconds = 0; + PlayData.put("ScreenIndex", 0); + EventSystem.Destroy(this.Obj); + } + } + + public void Render() { + Graphics grpahics = gm.Rm.GetCurrentGraphic(); + FontMetrics fontmatrix = gm.Rm.SetFont("Big"); + int rectWidth = gm.frame.getWidth(); + int rectHeight = gm.frame.getHeight() / 6; + grpahics.setColor(Color.BLACK); + grpahics.fillRect(0, gm.frame.getHeight() / 2 - rectHeight / 2, rectWidth, rectHeight); + grpahics.setColor(Color.GREEN); + float y = gm.frame.getHeight() * (1 / 2.0f - 1 / 12.0f); + grpahics.drawLine(0, (int) y, gm.frame.getWidth(), (int) y); + grpahics.drawLine(0, (int) y + 1, gm.frame.getWidth(), (int) y + 1); + y = gm.frame.getHeight() * (1 / 2.0f + 1 / 12.0f); + grpahics.drawLine(0, (int) y, gm.frame.getWidth(), (int) y); + grpahics.drawLine(0, (int) y + 1, gm.frame.getWidth(), (int) y + 1); + int countdown = (int) elapsedSeconds; + if (elapsedSeconds >= 4) { + grpahics.drawString("Level " + PlayData.get("Level"), + gm.frame.getWidth() / 2 - fontmatrix.stringWidth("Level " + PlayData.get("Level")) / 2, + gm.frame.getHeight() / 2); + } else if (elapsedSeconds >= 1) { + grpahics.drawString(Integer.toString(countdown), + gm.frame.getWidth() / 2 - fontmatrix.stringWidth(Integer.toString(countdown)), + gm.frame.getHeight() / 2); + } else { + grpahics.drawString("GO!", gm.frame.getWidth() / 2 - fontmatrix.stringWidth("GO!") / 2, + gm.frame.getHeight() / 2); + } + } +} diff --git a/src/TestCode/SoundManagerTest.java b/src/TestCode/SoundManagerTest.java new file mode 100644 index 00000000..eaacf326 --- /dev/null +++ b/src/TestCode/SoundManagerTest.java @@ -0,0 +1,32 @@ +package TestCode; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import java.io.File; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import EnginePrime.SoundManager; + +public class SoundManagerTest { + + static SoundManager.PlayProp SoundProp; + static SoundManager sm = SoundManager.getInstance(); + @BeforeAll + static void setup() { + sm.Initialize(); + SoundProp = sm.new PlayProp( + "Sound" + File.separator + "BGM" + File.separator +"B_Level1.wav", "TEST"); + } + + @Test + void PlayClip() { + sm.playSound(SoundProp); + assertNotNull(sm.GetClip("TEST")); + } + + @Test + void StopClip() { + PlayClip(); + sm.StopClip("TEST"); + assertNull(sm.GetClip("TEST")); + } +} diff --git a/src/engine/AchievementManager.java b/src/engine/AchievementManager.java deleted file mode 100644 index d3911bf4..00000000 --- a/src/engine/AchievementManager.java +++ /dev/null @@ -1,150 +0,0 @@ -package engine; - -import java.util.EnumMap; -import java.util.Map; -import java.util.logging.Logger; - -public class AchievementManager { - - /** Singleton instance of the class. */ - private static AchievementManager instance; - private int LuckyScore = 770; // '7' means the lucky number - private int UnluckyScore = 440; // '4' means the unlucky number - private int AceScore = 1110; // '1' means the ace in one card - - private static final Logger LOGGER = Logger.getLogger(Core.class - .getSimpleName()); - - public enum Achievement { - ADVENTURE_START, - SHARP_SHOOTER, - DEADLY_ACCURACY, - LUCKY_GUY, - UNLUCKY_GUY, - GAME_ACE, - SOUL_MATES, - AVIOPHOBIA, - BUDDY_FXXKER, - PAT_AND_MAT - } - - // Map to store achievements and their completion status - static private Map achievements; - - private AchievementManager() { - achievements = new EnumMap<>(Achievement.class); - - for (Achievement achievement : Achievement.values()) { - achievements.put(achievement, false); - } - } - - public Map getAchievements() { - return achievements; - } - - /** - * @return Shared instance of AchievementManager. - */ - public static AchievementManager getInstance() { - if (instance == null) - instance = new AchievementManager(); - return instance; - } - - /** - * Mark an achievement as achieved. - * - * @param achievementName The name of the achievement to mark as achieved. - */ - public void markAchievementAsAchieved(Achievement achievementName) { - if (isAchievementAchieved(achievementName)) { - return; - } - - if (achievements.containsKey(achievementName)) { - achievements.put(achievementName, true); - } - - LOGGER.info(achievementName + " achievement achieved!"); - SoundManager.playSound("SFX/S_Achievement","S_achievement",false,false); - SoundManager.stopSound("S_achievement",2f); - } - - /** - * Check if an achievement has been achieved. - * - * @param achievementName The name of the achievement to check. - * @return true if the achievement is achieved, false otherwise. - */ - public static boolean isAchievementAchieved(Achievement achievementName) { - if (achievements.containsKey(achievementName)) { - return achievements.get(achievementName); - } - return false; - } - - /** - * Check if the requirments for achievements about accuracy and life - */ - public void checkAchievements(GameState gameState) { - int level = gameState.getLevel(); - int shot = gameState.getBulletsShot1() + gameState.getBulletsShot2(); - int life_1 = gameState.getLivesRemaining1p(); - int life_2 = gameState.getLivesRemaining2p(); - int gamemode = gameState.getMode(); - int shipsDestroyed = gameState.getShipsDestroyed() + gameState.getShipsDestroyed2(); - double accuracy = ((double) shipsDestroyed / (double) shot) * 100; - - // if the player play with good accuracy - if (shot > 0 && accuracy >= 90.0 && level >= 3) { - markAchievementAsAchieved(Achievement.SHARP_SHOOTER); - } - - // Check if the players recorded perfect accuracy, if the player want to clear - // level 1, he has to shot 20 times at least - if (shot >= 20 && accuracy == 100) { - markAchievementAsAchieved(Achievement.DEADLY_ACCURACY); - } - - // Check if the player didn't hit enemy's ships in 1p mode - if (gamemode == 1 && shot > 0 && accuracy == 0) { - markAchievementAsAchieved(Achievement.AVIOPHOBIA); - } - - // Check if two players didn't hit enemy's ships - if (gamemode == 2 && shot > 0 && accuracy == 0) { - markAchievementAsAchieved(Achievement.PAT_AND_MAT); - } - - // Check if two players clear level or gameover with same lives - if (gamemode == 2 && life_1 == life_2) { - markAchievementAsAchieved(Achievement.SOUL_MATES); - } - - // Check one player has max life but the partner doesn't have - if (gamemode == 2 && (life_1 - life_2 == 3 || life_2 - life_1 == 3)) { - markAchievementAsAchieved(Achievement.BUDDY_FXXKER); - } - - } - - /* - * Check if the score equals to the achievement - * - * @param score the score of the player - */ - public void checkScore(int score) { - if (score == LuckyScore) { - markAchievementAsAchieved(Achievement.LUCKY_GUY); - } - - else if (score == UnluckyScore) { - markAchievementAsAchieved(Achievement.UNLUCKY_GUY); - } - - else if (score == AceScore) { - markAchievementAsAchieved(Achievement.GAME_ACE); - } - } -} diff --git a/src/engine/Cooldown.java b/src/engine/Cooldown.java deleted file mode 100644 index 05cc14e7..00000000 --- a/src/engine/Cooldown.java +++ /dev/null @@ -1,74 +0,0 @@ -package engine; - -/** - * Imposes a cooldown period between two actions. - * - * @author Roberto Izquierdo Amo - * - */ -public class Cooldown { - - /** Cooldown duration. */ - private int milliseconds; - /** Maximum difference between durations. */ - private int variance; - /** Duration of this run, varies between runs if variance > 0. */ - private int duration; - /** Beginning time. */ - private long time; - - /** - * Constructor, established the time until the action can be performed - * again. - * - * @param milliseconds - * Time until cooldown period is finished. - */ - protected Cooldown(final int milliseconds) { - this.milliseconds = milliseconds; - this.variance = 0; - this.duration = milliseconds; - this.time = 0; - } - - /** - * Constructor, established the time until the action can be performed - * again, with a variation of +/- variance. - * - * @param milliseconds - * Time until cooldown period is finished. - * @param variance - * Variance in the cooldown period. - */ - protected Cooldown(final int milliseconds, final int variance) { - this.milliseconds = milliseconds; - this.variance = variance; - this.time = 0; - } - - /** - * Checks if the cooldown is finished. - * - * @return Cooldown state. - */ - public final boolean checkFinished() { - if ((this.time == 0) - || this.time + this.duration < System.currentTimeMillis()) - return true; - return false; - } - - /** - * Restarts the cooldown. - */ - public final void reset() { - this.time = System.currentTimeMillis(); - if (this.variance != 0) - this.duration = (this.milliseconds - this.variance) - + (int) (Math.random() - * (this.milliseconds + this.variance)); - } - public final void timedown(final double percent){ - this.variance=(int)(this.variance*(1-percent)); - } -} diff --git a/src/engine/Core.java b/src/engine/Core.java deleted file mode 100644 index 5cf96218..00000000 --- a/src/engine/Core.java +++ /dev/null @@ -1,446 +0,0 @@ -package engine; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.ConsoleHandler; -import java.util.logging.FileHandler; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.Logger; - -import engine.AchievementManager.Achievement; -import screen.*; - -/** - * Implements core game logic. - * - * @author Roberto Izquierdo Amo - * - */ -public final class Core { - - /** Width of current screen. */ - private static final int WIDTH = 448; - /** Height of current screen. */ - private static final int HEIGHT = 520; - /** Max fps of current screen. */ - private static final int FPS = 60; - - /** Max lives. */ - private static final int MAX_LIVES = 3; - /** Levels between extra life. */ - private static final int EXTRA_LIFE_FRECUENCY = 3; - /** Total number of levels. */ - private static final int NUM_LEVELS = 7; - - /** Difficulty settings for level 1. */ - private static final GameSettings SETTINGS_LEVEL_1 = - new GameSettings(5, 4, 60, 2000, 5.5); - /** Difficulty settings for level 2. */ - private static final GameSettings SETTINGS_LEVEL_2 = - new GameSettings(5, 5, 50, 2500, 5.5); - /** Difficulty settings for level 3. */ - private static final GameSettings SETTINGS_LEVEL_3 = - new GameSettings(6, 5, 40, 1500, 5.5); - /** Difficulty settings for level 4. */ - private static final GameSettings SETTINGS_LEVEL_4 = - new GameSettings(6, 6, 30, 1500, 5); - /** Difficulty settings for level 5. */ - private static final GameSettings SETTINGS_LEVEL_5 = - new GameSettings(7, 6, 20, 1000,5); - /** Difficulty settings for level 6. */ - private static final GameSettings SETTINGS_LEVEL_6 = - new GameSettings(7, 7, 10, 1000,4.8); - /** Difficulty settings for level 7. */ - private static final GameSettings SETTINGS_LEVEL_7 = - new GameSettings(8, 7, 2, 500,4.8); - private static int LEVEL; - - /** Frame to draw the screen on. */ - private static Frame frame; - /** Screen currently shown. */ - private static Screen currentScreen; - /** Difficulty settings list. */ - private static List gameSettings; - /** Application logger. */ - private static final Logger LOGGER = Logger.getLogger(Core.class - .getSimpleName()); - /** Logger handler for printing to disk. */ - private static Handler fileHandler; - /** Logger handler for printing to console. */ - private static ConsoleHandler consoleHandler; - - private static int[] keySetting = new int[16]; - /** { 1P.LEFT, 1P.RIGHT, 1P.ATTACK, 1P.BURST 1, 1P.BURST 2, 1P.RELOAD, 1P.BOOSTER, 1P.ITEM, - * 2P.LEFT, 2P.RIGHT, 2P.ATTACK, 2P.BURST 1, 2P.BURST 2, 2P.RELOAD, 2P.BOOSTER, 2P.ITEM} */ - private static String[] keySettingString = new String[16]; - /** Sound Volume */ - public static int soundVolume; - /** Check BGM is On/Off */ - public static boolean bgmOn; - public static List setting; - /** control bottom HUD height */ - public static int bottomHudHeight = 40; - /** - * Test implementation. - * - * @param args - * Program args, ignored. - */ - public static void main(final String[] args) { - try { - setting = Core.getFileManager().loadSettings(); - soundVolume = setting.get(0).getValue(); - if(setting.get(1).getValue()==1){ - bgmOn = true; - SoundManager.bgmSetting(true); - } - else{ - bgmOn = false; - SoundManager.bgmSetting(false); - } - for (int i =2; i < 18; i++) { - keySettingString[i-2] = setting.get(i).getName(); - keySetting[i-2] = setting.get(i).getValue(); - } - - } catch (NumberFormatException | IOException e) { - LOGGER.info("Couldn't load Settings!"); - } - try { - LOGGER.setUseParentHandlers(false); - - fileHandler = new FileHandler("log"); - fileHandler.setFormatter(new MinimalFormatter()); - consoleHandler = new ConsoleHandler(); - consoleHandler.setFormatter(new MinimalFormatter()); - - LOGGER.addHandler(fileHandler); - LOGGER.addHandler(consoleHandler); - LOGGER.setLevel(Level.ALL); - - } catch (Exception e) { - // TODO handle exception - e.printStackTrace(); - } - - frame = new Frame(WIDTH, HEIGHT, bottomHudHeight); - DrawManager.getInstance().setFrame(frame); - int width = frame.getWidth(); - int height = frame.getHeight(); - - gameSettings = new ArrayList(); - gameSettings.add(SETTINGS_LEVEL_1); - gameSettings.add(SETTINGS_LEVEL_2); - gameSettings.add(SETTINGS_LEVEL_3); - gameSettings.add(SETTINGS_LEVEL_4); - gameSettings.add(SETTINGS_LEVEL_5); - gameSettings.add(SETTINGS_LEVEL_6); - gameSettings.add(SETTINGS_LEVEL_7); - - AchievementManager.getInstance().markAchievementAsAchieved(Achievement.ADVENTURE_START); - - GameState gameState; - - int returnCode = 0; - do { - // TODO 1P mode와 2P mode 진입 구현 - // TODO gameState 생성자에 따라 1P와 2P mode 구분 - if(SelectScreen.gameMode == 1) gameState = new GameState(1, 0, MAX_LIVES, 0, 0); - else gameState = new GameState(1, 0, MAX_LIVES, MAX_LIVES, 0, 0, 0, 0); - - switch (returnCode) { - case 0: - currentScreen = new LoginScreen(width, height, FPS);LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " title screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing title screen."); - break; - case 1: - // Main menu. - SoundManager.resetBGM(); - SoundManager.stopSound("selection",2f); - SoundManager.playSound("BGM/B_Main_a", "menu", true, true, 2f); - currentScreen = new TitleScreen(width, height, FPS); - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " title screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing title screen."); - break; - case 7: - // Game & score. - do { - SoundManager.stopSound("selection",2f); - // One extra live every few levels. - int mode = gameState.getMode(); - boolean bonusLife = gameState.getLevel() % EXTRA_LIFE_FRECUENCY == 0; - - if (mode == 1) { - // 1P mode - bonusLife = bonusLife && gameState.getLivesRemaining1p() < MAX_LIVES; - } else { - // 2P mode (Give bonusLife if either player has less than max lives.) - bonusLife = bonusLife && - (gameState.getLivesRemaining1p() < MAX_LIVES - || gameState.getLivesRemaining2p() < MAX_LIVES); - } - - currentScreen = new GameScreen(gameState, - gameSettings.get(gameState.getLevel() - 1), - bonusLife, width, height, FPS); - - SoundManager.resetBGM(); - SoundManager.playBGM(gameState.getLevel()); - - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " title screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing Game screen."); - - if (returnCode == 1) break; - - if (mode == 1) { - gameState = ((GameScreen) currentScreen).getGameState1p(); - gameState = new GameState(gameState.getLevel() + 1, - gameState.getScore(), - gameState.getLivesRemaining1p(), - gameState.getBulletsShot1(), - gameState.getShipsDestroyed()); - } else { - gameState = ((GameScreen) currentScreen).getGameState2p(); - gameState = new GameState(gameState.getLevel() + 1, - gameState.getScore(), - gameState.getLivesRemaining1p(), - gameState.getLivesRemaining2p(), - gameState.getBulletsShot1(), - gameState.getBulletsShot2(), - gameState.getShipsDestroyed(), - gameState.getShipsDestroyed2()); - } - AchievementManager.getInstance().checkAchievements(gameState); - if (((gameState.getMode() == 1 && gameState.getLivesRemaining1p() > 0) - || (gameState.getMode() == 2 && gameState.getLivesRemaining1p() > 0 && gameState.getLivesRemaining2p() > 0)) - && gameState.getLevel() <= NUM_LEVELS) { - currentScreen = new ClearScreen(width, height, FPS, gameState); - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " clear screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing clear screen."); - if (returnCode == 1) break; - } - } while ((gameState.getMode() == 1 && gameState.getLivesRemaining1p() > 0) - || (gameState.getMode() == 2 && (gameState.getLivesRemaining1p() > 0 || gameState.getLivesRemaining2p() > 0)) - && gameState.getLevel() <= NUM_LEVELS); - - if (returnCode == 1) break; - - if (gameState.getMode() == 1) { - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " score screen at " + FPS + " fps, with a score of " - + gameState.getScore() + ", " - + gameState.getLivesRemaining1p() + " lives remaining for 1p, " - + gameState.getBulletsShot1() + " bullets shot and " - + gameState.getShipsDestroyed() + " ships destroyed."); - } else { - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " score screen at " + FPS + " fps, with a score of " - + gameState.getScore() + ", " - + gameState.getLivesRemaining1p() + " lives remaining for 1p, " - + gameState.getLivesRemaining2p() + " lives remaining for 2p, " - + gameState.getBulletsShot1() + " bullets shot by 1p and " - + gameState.getBulletsShot2() + " bullets shot by 2p and " - + gameState.getShipsDestroyed() + " ships destroyed."); - } - currentScreen = new ScoreScreen(width, height, FPS, gameState); - SoundManager.resetBGM(); - SoundManager.stopSound("ship_moving"); - SoundManager.playSound("BGM/B_Gameover", "B_gameover", true, true, 2f); - SoundManager.playSound("SFX/S_Gameover","S_gameover",false,false); - returnCode = frame.setScreen(currentScreen); - SoundManager.stopSound("B_gameover",2f); - LOGGER.info("Closing score screen."); - break; - case 3: - // High scores. - SoundManager.stopSound("menu",1f); - SoundManager.playSound("BGM/B_HighScore", "highscore", true, true); - currentScreen = new HighScoreScreen(width, height, FPS); - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " high score screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing high score screen."); - SoundManager.stopSound("highscore",2f); - break; - case 4: - // Shop - currentScreen = new ItemShopScreen(width,height, FPS); - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " item shop screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing item shop screen"); - break; - case 5: - // Setting. - currentScreen = new SettingScreen(width, height, FPS); - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " setting screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing setting screen."); - break; - case 6: - // Achievement. - SoundManager.stopSound("menu",1f); - SoundManager.playSound("BGM/B_Achieve", "achievement", true, true); - currentScreen = new AchievementScreen(width, height, FPS); - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " achievement screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing Achievement screen."); - SoundManager.stopSound("achievement",2f); - break; - case 2: - // Select Mode. - SoundManager.stopSound("menu",2f); - SoundManager.playSound("BGM/B_Main_c", "selection", true, true); - currentScreen = new SelectScreen(width, height, FPS); - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " select screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing select screen."); - break; - case 8: - // Select Skin. - currentScreen = new SkinSelectionScreen(width, height, FPS); - LOGGER.info("Starting " + WIDTH + "x" + HEIGHT - + " Skin Selection screen at " + FPS + " fps."); - returnCode = frame.setScreen(currentScreen); - LOGGER.info("Closing SkinSelection screen."); - break; - default: - break; - } - - } while (returnCode != 0); - try { - getFileManager().updateAccounts(); - }catch(Exception e){ - e.printStackTrace(); - } - fileHandler.flush(); - fileHandler.close(); - System.exit(0); - } - - /** - * Constructor, not called. - */ - private Core() { - - } - - /** - * Controls access to the logger. - * - * @return Application logger. - */ - public static Logger getLogger() { - return LOGGER; - } - - /** - * Controls access to the drawing manager. - * - * @return Application draw manager. - */ - public static DrawManager getDrawManager() { - return DrawManager.getInstance(); - } - - /** - * Controls access to the input manager. - * - * @return Application input manager. - */ - public static InputManager getInputManager() { - return InputManager.getInstance(); - } - - /** - * Controls access to the file manager. - * - * @return Application file manager. - */ - public static FileManager getFileManager() { - return FileManager.getInstance(); - } - - /** - * Controls creation of new cooldowns. - * - * @param milliseconds - * Duration of the cooldown. - * @return A new cooldown. - */ - public static Cooldown getCooldown(final int milliseconds) { - return new Cooldown(milliseconds); - } - - /** - * Controls creation of new cooldowns with variance. - * - * @param milliseconds - * Duration of the cooldown. - * @param variance - * Variation in the cooldown duration. - * @return A new cooldown with variance. - */ - public static Cooldown getVariableCooldown(final int milliseconds, - final int variance) { - return new Cooldown(milliseconds, variance); - } - /** - * Get Max Lives. - * - * @return MAX_LIVES. - */ - public static int getMaxLives() { - return MAX_LIVES; - } - /** - * Get Key Setting Code - */ - public static int getKeySettingCode(int num){ - if(num<0 || num>16) throw new NullPointerException("it exceeds array"); - return keySetting[num]; - } - /** - * Get Key Setting String - */ - public static String getKeySettingString(int num){ - if(num<0 || num>16) throw new NullPointerException("it exceeds array"); - return keySettingString[num]; - } - /** - * Get Key Setting Code Array - */ - public static int[] getKeySettingCodeArray(){return keySetting;} - /** - * Get Key Setting String Array - */ - public static String[] getKeySettingStringArray(){return keySettingString;} - /** - * Set Key Setting Code - */ - public static void setKeySettingCode(int num, int value){ - if(num<0 || num>16) throw new IndexOutOfBoundsException("it exceeds array"); - keySetting[num] = value; - } - /** - * Set Key Setting String - */ - public static void setKeySettingString(int num, String value){ - if(num<0 || num>16) throw new IndexOutOfBoundsException("it exceeds array"); - keySettingString[num] = value; - } -} \ No newline at end of file diff --git a/src/engine/DrawManager.java b/src/engine/DrawManager.java deleted file mode 100644 index c9c7ed3b..00000000 --- a/src/engine/DrawManager.java +++ /dev/null @@ -1,1615 +0,0 @@ -package engine; - -import java.awt.Color; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Random; -import java.util.logging.Logger; -import engine.AchievementManager.Achievement; - -import java.lang.Integer; - -import entity.*; -import screen.GameScreen; -import screen.Screen; -import screen.SelectScreen; -import screen.SettingScreen; - - -/** - * Manages screen drawing. - * - * @author Roberto Izquierdo Amo - * - */ -public final class DrawManager { - - /** Singleton instance of the class. */ - private static DrawManager instance; - /** Current frame. */ - private static Frame frame; - /** FileManager instance. */ - private static FileManager fileManager; - /** Application logger. */ - private static Logger logger; - /** Graphics context. */ - private static Graphics graphics; - /** Buffer Graphics. */ - private static Graphics backBufferGraphics; - /** Buffer image. */ - private static BufferedImage backBuffer; - /** Normal sized font. */ - private static Font fontRegular; - /** Normal sized font properties. */ - private static FontMetrics fontRegularMetrics; - /** Big sized font. */ - private static Font fontBig; - /** Big sized font properties. */ - private static FontMetrics fontBigMetrics; - - /** Sprite types mapped to their images. */ - private static Map spriteMap; - - /** Sprite types. */ - public static enum SpriteType { - /** Player1 ship. */ - Ship, - /** Player2 ship. */ - Ship2, - /** Destroyed player ship. */ - ShipDestroyed, - /** Player bullet. */ - Bullet, - /** Enemy bullet. */ - EnemyBullet, - /** Player bullet. */ - BiggerBullet, - /** Enemy bullet. */ - BiggerEnemyBullet, - /** First enemy ship - first form. */ - EnemyShipA1, - /** First enemy ship - second form. */ - EnemyShipA2, - /** Second enemy ship - first form. */ - EnemyShipB1, - /** Second enemy ship - second form. */ - EnemyShipB2, - /** Third enemy ship - first form. */ - EnemyShipC1, - /** Third enemy ship - second form. */ - EnemyShipC2, - /** Bonus ship. */ - EnemyShipSpecial, - /** Destroyed enemy ship. */ - Explosion, - Item, - - Life, - - AuxiliaryShips, - - BombShape, - - InvincibleShape, - - SpeedUpShape, - - AuxiliaryShape - - - }; - - /** - * Private constructor. - */ - private DrawManager() { - fileManager = Core.getFileManager(); - logger = Core.getLogger(); - logger.info("Started loading resources."); - - try { - spriteMap = new LinkedHashMap(); - - spriteMap.put(SpriteType.Ship, new boolean[13][8]); - spriteMap.put(SpriteType.Ship2, new boolean[13][8]); - spriteMap.put(SpriteType.ShipDestroyed, new boolean[13][8]); - spriteMap.put(SpriteType.Bullet, new boolean[3][5]); - spriteMap.put(SpriteType.EnemyBullet, new boolean[3][5]); - spriteMap.put(SpriteType.EnemyShipA1, new boolean[12][8]); - spriteMap.put(SpriteType.EnemyShipA2, new boolean[12][8]); - spriteMap.put(SpriteType.EnemyShipB1, new boolean[12][8]); - spriteMap.put(SpriteType.EnemyShipB2, new boolean[12][8]); - spriteMap.put(SpriteType.EnemyShipC1, new boolean[12][8]); - spriteMap.put(SpriteType.EnemyShipC2, new boolean[12][8]); - spriteMap.put(SpriteType.EnemyShipSpecial, new boolean[16][7]); - spriteMap.put(SpriteType.Explosion, new boolean[13][7]); - spriteMap.put(SpriteType.Item, new boolean[3][3]); - spriteMap.put(SpriteType.Life, new boolean[7][7]); - spriteMap.put(SpriteType.AuxiliaryShips, new boolean[12][8]); - spriteMap.put(SpriteType.BombShape, new boolean[4][6]); - spriteMap.put(SpriteType.InvincibleShape, new boolean[5][5]); - spriteMap.put(SpriteType.SpeedUpShape, new boolean[5][4]); - spriteMap.put(SpriteType.AuxiliaryShape, new boolean[5][4]); - - fileManager.loadSprite(spriteMap); - - fileManager.changeSprite(spriteMap,SpriteType.Bullet,0); - fileManager.changeSprite(spriteMap,SpriteType.Ship,0); - fileManager.changeSprite(spriteMap,SpriteType.Ship2,0); - logger.info("Finished loading the sprites."); - - // Font loading. - fontRegular = fileManager.loadFont(14f); - fontBig = fileManager.loadFont(24f); - logger.info("Finished loading the fonts."); - - } catch (IOException e) { - logger.warning("Loading failed."); - } catch (FontFormatException e) { - logger.warning("Font formatting failed."); - } - } - - /** - * Returns shared instance of DrawManager. - * - * @return Shared instance of DrawManager. - */ - protected static DrawManager getInstance() { - if (instance == null) - instance = new DrawManager(); - return instance; - } - - /** - * Sets the frame to draw the image on. - * - * @param currentFrame - * Frame to draw on. - */ - public void setFrame(final Frame currentFrame) { - frame = currentFrame; - } - - /** - * First part of the drawing process. Initialize buffers, draws the - * background and prepares the images. - * - * @param screen - * Screen to draw in. - */ - public void initDrawing(final Screen screen) { - backBuffer = new BufferedImage(screen.getWidth(), screen.getHeight() + frame.getBottomHudHeight(), - BufferedImage.TYPE_INT_RGB); - - graphics = frame.getGraphics(); - backBufferGraphics = backBuffer.getGraphics(); - - backBufferGraphics.setColor(Color.BLACK); - backBufferGraphics - .fillRect(0, 0, screen.getWidth(), screen.getHeight() + frame.getBottomHudHeight()); - - fontRegularMetrics = backBufferGraphics.getFontMetrics(fontRegular); - fontBigMetrics = backBufferGraphics.getFontMetrics(fontBig); - - // drawBorders(screen); - // drawGrid(screen); - } - - /** - * Draws the completed drawing on screen. - * - * @param screen - * Screen to draw on. - */ - public void completeDrawing(final Screen screen) { - graphics.drawImage(backBuffer, frame.getInsets().left, - frame.getInsets().top, frame); - } - - /** - * Draws an entity, using the appropriate image. - * - * @param entity - * Entity to be drawn. - * @param positionX - * Coordinates for the left side of the image. - * @param positionY - * Coordinates for the upper side of the image. - */ - public void drawEntity(final Entity entity, final int positionX, - final int positionY) { - boolean[][] image = spriteMap.get(entity.getSpriteType()); - - backBufferGraphics.setColor(entity.getColor()); - for (int i = 0; i < image.length; i++) - for (int j = 0; j < image[i].length; j++) - if (image[i][j]) - backBufferGraphics.drawRect(positionX + i * 2, positionY - + j * 2, 1, 1); - } - public void clearEntity(final Entity entity, final int positionX, final int positionY) { - boolean[][] image = spriteMap.get(entity.getSpriteType()); - - Color clearColor = Color.black; - - backBufferGraphics.setColor(clearColor); - for (int i = 0; i < image.length; i++) { - for (int j = 0; j < image[i].length; j++) { - if (image[i][j]) { - backBufferGraphics.fillRect(positionX + i * 2, positionY + j * 2, 1, 1); - } - } - } - } - - - /** - * For debugging purpouses, draws the canvas borders. - * - * @param screen - * Screen to draw in. - */ - @SuppressWarnings("unused") - private void drawBorders(final Screen screen) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawLine(0, 0, screen.getWidth() - 1, 0); - backBufferGraphics.drawLine(0, 0, 0, screen.getHeight() - 1); - backBufferGraphics.drawLine(screen.getWidth() - 1, 0, - screen.getWidth() - 1, screen.getHeight() - 1); - backBufferGraphics.drawLine(0, screen.getHeight() - 1, - screen.getWidth() - 1, screen.getHeight() - 1); - } - - /** - * For debugging purposes, draws a grid over the canvas. - * - * @param screen - * Screen to draw in. - */ - @SuppressWarnings("unused") - private void drawGrid(final Screen screen) { - backBufferGraphics.setColor(Color.DARK_GRAY); - for (int i = 0; i < screen.getHeight() - 1; i += 2) - backBufferGraphics.drawLine(0, i, screen.getWidth() - 1, i); - for (int j = 0; j < screen.getWidth() - 1; j += 2) - backBufferGraphics.drawLine(j, 0, j, screen.getHeight() - 1); - } - - /** - * Draws current score on screen. - * - * @param screen - * Screen to draw on. - * @param score - * Current score. - */ - public void drawScore(final Screen screen, final int score) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - String scoreString = String.format("%04d", score); - backBufferGraphics.drawString(scoreString, screen.getWidth() - 60, 25); - } - - /** - * Draws current score on screen. - * - * @param screen - * Screen to draw on. - * @param highScore - * Current score. - */ - public void drawHighScore(final Screen screen, final int highScore) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - String scoreString = String.format("%04d", highScore); - backBufferGraphics.drawString(scoreString, screen.getWidth() - 120, 25); - } - - /** - * Draws number of remaining lives from player1 on screen. - * - * @param screen - * Screen to draw on. - * @param lives - * Current player1's lives. - */ - public void drawLives(final Screen screen, final int lives) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString(Integer.toString(lives), 20, 25); - Ship dummyShip = new Ship(0, 0, Color.GREEN, SpriteType.Life, false); - for (int i = 0; i < lives; i++) - drawEntity(dummyShip, 40 + 30 * i, 13); - } - - - /** - * Draws number of remaining lives from player2 on screen. - * - * @param screen - * Screen to draw on. - * @param lives2 - * Current player2's lives. - */ - public void drawLives2(final Screen screen, final int lives2) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString(Integer.toString(lives2), 160, 25); - Ship dummyShip = new Ship(0, 0, Color.RED, SpriteType.Life, false); - for (int i = 0; i < lives2; i++) - drawEntity(dummyShip, 180 + 30 * i, 13); - } - - - - /** - * Draws number of items currently in inventory on screen. - * - * @param ItemQ - * ItemQueue - * @param inventory - * Number of items in inventory - * @param screen - * Screen to draw on. - */ - public void drawItems(final Screen screen, Item[] ItemQ, final int inventory) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - - backBufferGraphics.drawString(Integer.toString(inventory), 205, screen.getHeight() + 25); - - Ship bombItem = new Ship(0, 0, Color.red, SpriteType.BombShape, false); - Ship invincibleItem = new Ship(0, 0, Color.yellow, SpriteType.InvincibleShape, false); - Ship SpeedUpItem = new Ship(0, 0, Color.orange, SpriteType.SpeedUpShape, false); - Ship SubPlaneItem = new Ship(0, 0, Color.green, SpriteType.AuxiliaryShape, false); - - for (int i = 0; i < inventory; i++) { - if (ItemQ[i].getItemType() == Item.ItemType.BombItem) { - drawEntity(bombItem, 100 + 35 * i, screen.getHeight() + 15); - } - else if (ItemQ[i].getItemType() == Item.ItemType.InvincibleItem) { - drawEntity(invincibleItem, 100 + 35 * i, screen.getHeight() + 15); - } - else if (ItemQ[i].getItemType() == Item.ItemType.SpeedUpItem) { - drawEntity(SpeedUpItem, 100 + 35 * i, screen.getHeight() + 15); - } - else if (ItemQ[i].getItemType() == Item.ItemType.SubPlaneItem) { - drawEntity(SubPlaneItem, 100 + 35 * i, screen.getHeight() + 15); - } - } - } - - public void drawItems2(final Screen screen, Item[] ItemQ, final int inventory) { - - - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString(Integer.toString(inventory), 415, screen.getHeight() + 25); - - - Ship bombItem = new Ship(0, 0, Color.red, SpriteType.BombShape, false); - Ship invincibleItem = new Ship(0, 0, Color.yellow, SpriteType.InvincibleShape, false); - Ship SpeedUpItem = new Ship(0, 0, Color.orange, SpriteType.SpeedUpShape, false); - Ship SubPlaneItem = new Ship(0, 0, Color.green, SpriteType.AuxiliaryShape, false); - for (int i = 0; i < inventory; i++) { - if (ItemQ[i].getItemType() == Item.ItemType.BombItem) { - - drawEntity(bombItem, 310 + 35 * i, screen.getHeight() + 15); - } - else if (ItemQ[i].getItemType() == Item.ItemType.InvincibleItem) { - drawEntity(invincibleItem, 310 + 35 * i, screen.getHeight() + 15); - } - else if (ItemQ[i].getItemType() == Item.ItemType.SpeedUpItem) { - drawEntity(SpeedUpItem, 310 + 35 * i, screen.getHeight() + 15); - } - else if (ItemQ[i].getItemType() == Item.ItemType.SubPlaneItem) { - drawEntity(SubPlaneItem, 310 + 35 * i, screen.getHeight() + 15); - - } - } - } - - - /** - * Draws number of items currently in inventory on screen. - * - * @param magazine - * Number of remaining magazines - * @param bullet_count - * Number of bullets fired - * @param screen - * Screen to draw on. - */ - public void drawAmmo(final Screen screen, final int magazine, final int bullet_count) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString("BUL: " + Integer.toString(10-bullet_count) + "/" + Integer.toString(magazine), 10, screen.getHeight() + 25); - } - public void drawAmmo2(final Screen screen, final int magazine2, final int bullet_count2) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString("BUL: " + Integer.toString(10-bullet_count2) + "/" + Integer.toString(magazine2), 224, screen.getHeight() + 25); - } - - /** - * Draws a thick line from side to side of the screen. - * - * @param screen - * Screen to draw on. - * @param positionY - * Y coordinate of the line. - */ - public void drawHorizontalLine(final Screen screen, final int positionY, Color color) { - backBufferGraphics.setColor(color); - backBufferGraphics.drawLine(0, positionY, screen.getWidth(), positionY); - backBufferGraphics.drawLine(0, positionY + 1, screen.getWidth(), - positionY + 1); - } - - /** - * Draws game title.x - * - * @param screen - * Screen to draw on. - */ - public void drawTitle(final Screen screen) { - String titleString = "Invaders"; - String instructionsString = - "select with w+s / arrows, confirm with space"; - - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, instructionsString, - screen.getHeight() /2 - fontRegularMetrics.getHeight()*3/2-fontRegularMetrics.getHeight()*2); - - backBufferGraphics.setColor(Color.GREEN); - drawCenteredBigString(screen, titleString, screen.getHeight() / 3-fontRegularMetrics.getHeight()*2); - } - - /** - * Draws main menu. - * - * @param screen - * Screen to draw on. - * @param option - * Option selected. - */ - public void drawMenu(final Screen screen, final int option) { - String playString = "Play"; - String highScoresString = "High scores"; - String shopString = "Shop"; - String settingString = "Setting"; - String exitString = "exit"; - String achievementString = "Achievements"; - - if (option == 2) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, playString, - screen.getHeight() / 3 * 2 -fontRegularMetrics.getHeight()*3-fontRegularMetrics.getHeight()*2); - if (option == 3) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, highScoresString, screen.getHeight() - / 3 * 2 + fontRegularMetrics.getHeight()-fontRegularMetrics.getHeight()*2-fontRegularMetrics.getHeight()*2); - - if (option == 4) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, shopString, screen.getHeight() / 3 - * 2 + fontRegularMetrics.getHeight() * 3-fontRegularMetrics.getHeight()*2-fontRegularMetrics.getHeight()*2); - - if (option == 5) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, settingString, screen.getHeight() / 3 - * 2 + fontRegularMetrics.getHeight() * 3-fontRegularMetrics.getHeight()*2); - if (option == 6) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, achievementString, screen.getHeight() / 3 - * 2 + fontRegularMetrics.getHeight() * 5-fontRegularMetrics.getHeight()*2); - if (option == 0) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, exitString, screen.getHeight() / 3 - * 2 + fontRegularMetrics.getHeight() * 7-fontRegularMetrics.getHeight()*2); - } - - /** - * Draws game results for 1P mode. - * - * @param screen - * Screen to draw on. - * @param score - * Score obtained. - * @param livesRemaining1 - * 1p's lives remaining when finished. - * @param shipsDestroyed - * Total ships destroyed. - * @param accuracy - * Total accuracy. - * - * @param isNewRecord - * If the score is a new high score. - */ - public void drawResults(final Screen screen, final int score, - final int livesRemaining1, final int shipsDestroyed, - final float accuracy, final boolean isNewRecord) { - String scoreString = String.format("score %04d", score); - String acquiredCoins = "bonus-coins " + score/10; - String lives1RemainingString = "lives remaining " + livesRemaining1; - String shipsDestroyedString = "enemies destroyed " + shipsDestroyed; - String accuracyString = String - .format("accuracy %.2f%%", accuracy * 100); - - int height = isNewRecord ? 4 : 2; - - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, scoreString, screen.getHeight() - / height); - drawCenteredRegularString(screen, acquiredCoins, - screen.getHeight() / height + fontRegularMetrics.getHeight() - * 3); - drawCenteredRegularString(screen, lives1RemainingString, - screen.getHeight() / height + fontRegularMetrics.getHeight() - * 4); - drawCenteredRegularString(screen, shipsDestroyedString, - screen.getHeight() / height + fontRegularMetrics.getHeight() - * 5); - drawCenteredRegularString(screen, accuracyString, screen.getHeight() - / height + fontRegularMetrics.getHeight() * 6); - } - - /** - * Draws game results for 2P mode. - * - * @param screen - * Screen to draw on. - * @param score - * Score obtained. - * @param livesRemaining1 - * 1p's lives remaining when finished. - * @param livesRemaining2 - * 2p's lives remaining when finished. - * @param shipsDestroyed - * Total ships destroyed. - * @param accuracy - * 1p's accuracy. - * @param accuracy2 - * 2p's accuracy. - * @param isNewRecord - * If the score is a new high score. - */ - public void drawResults(final Screen screen, final int score, - final int livesRemaining1, final int livesRemaining2, final int shipsDestroyed, - final float accuracy, final float accuracy2, final boolean isNewRecord) { - String scoreString = String.format("score %04d", score); - String acquiredCoins = String.format("bonus-coins %04d", score%10); - String lives1RemainingString = "1p's lives remaining " + livesRemaining1; - String lives2RemainingString = "2p's lives remaining " + livesRemaining2; - String shipsDestroyedString = "enemies destroyed " + shipsDestroyed; - String accuracyString = String - .format("1p's accuracy %.2f%%", accuracy * 100); - String accuracyString2 = String - .format("2p's accuracy %.2f%%", accuracy2 * 100); - - int height = isNewRecord ? 4 : 3; - - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, scoreString, screen.getHeight() - / height); - drawCenteredRegularString(screen, acquiredCoins, screen.getHeight() - ); - drawCenteredRegularString(screen, lives1RemainingString, - screen.getHeight() / height + fontRegularMetrics.getHeight() - * 2); - drawCenteredRegularString(screen, lives2RemainingString, - screen.getHeight() / height + fontRegularMetrics.getHeight() - * 4); - drawCenteredRegularString(screen, shipsDestroyedString, - screen.getHeight() / height + fontRegularMetrics.getHeight() - * 6); - drawCenteredRegularString(screen, accuracyString, screen.getHeight() - / height + fontRegularMetrics.getHeight() * 8); - drawCenteredRegularString(screen, accuracyString2, screen.getHeight() - / height + fontRegularMetrics.getHeight() * 10); - } - - /** - * Draws interactive characters for name input. - * - * @param screen - * Screen to draw on. - * @param name - * Current name selected. - * @param nameCharSelected - * Current character selected for modification. - */ - public void drawNameInput(final Screen screen, final char[] name, - final int nameCharSelected) { - String newRecordString = "New Record!"; - String introduceNameString = "Introduce name:"; - - backBufferGraphics.setColor(Color.GREEN); - drawCenteredRegularString(screen, newRecordString, screen.getHeight() - * 11 / 60); - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, introduceNameString, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 12); - - // 3 letters name. - int positionX = screen.getWidth() - / 2 - - (fontRegularMetrics.getWidths()[name[0]] - + fontRegularMetrics.getWidths()[name[1]] - + fontRegularMetrics.getWidths()[name[2]] - + fontRegularMetrics.getWidths()[' ']) / 2; - - for (int i = 0; i < 3; i++) { - if (i == nameCharSelected) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - - positionX += fontRegularMetrics.getWidths()[name[i]] / 2; - positionX = i == 0 ? positionX - : positionX - + (fontRegularMetrics.getWidths()[name[i - 1]] - + fontRegularMetrics.getWidths()[' ']) / 2; - - backBufferGraphics.drawString(Character.toString(name[i]), - positionX, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() - * 14); - } - } - //Login Screen Name Input - public void drawUsernameInput(final Screen screen, final char[] name, - final int nameCharSelected) { - String introduceUsernameString = "Username:"; - - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, introduceUsernameString, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 3); - - // 3 letters name. - int positionX = screen.getWidth() - / 2 - - (fontRegularMetrics.getWidths()[name[0]] - + fontRegularMetrics.getWidths()[name[1]] - + fontRegularMetrics.getWidths()[name[2]] - + fontRegularMetrics.getWidths()[' ']) / 2; - - for (int i = 0; i < 3; i++) { - if (i == nameCharSelected) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - - positionX += fontRegularMetrics.getWidths()[name[i]] / 2; - positionX = i == 0 ? positionX - : positionX - + (fontRegularMetrics.getWidths()[name[i - 1]] - + fontRegularMetrics.getWidths()[' ']) / 2; - - backBufferGraphics.drawString(Character.toString(name[i]), - positionX, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() - * 6); - } - } - - // Item Shop's Item holder - public void drawItemShopMenu(final Screen screen,final int selectedItem) { - backBufferGraphics.setColor(Color.GREEN); - drawCenteredItemInfo(screen, "", screen.getHeight() / 8); - - String[] itemNames = {"Speed", "Additional Health", "Shooting Faster"}; - int[] itemPrices = {10, 15, 20}; - - int startX = screen.getWidth() / 10; // Starting X position for the first item - int itemWidth = 100; // Width of each item box - int spacing = 20; // Horizontal spacing - int itemX1 = startX; - int itemX2 = startX + itemWidth + spacing; - int itemX3 = startX + 2 * (itemWidth + spacing); - Ship SpeedUpItem = new Ship(0, 0, Color.orange, SpriteType.SpeedUpShape, false); - Ship BulletItem = new Ship(0, 0, Color.orange, SpriteType.Bullet, false); - - drawEntity(new Ship(0, 0, Color.RED, SpriteType.Life, false),itemX2+45, screen.getHeight() / 2-5); - drawEntity(SpeedUpItem, itemX1+45, screen.getHeight() / 2-5); - drawEntity(BulletItem, itemX3+48, screen.getHeight() / 2-5); - - // Draw the first item - - if (selectedItem == 70) { - backBufferGraphics.setColor(Color.GREEN); - } else { - backBufferGraphics.setColor(Color.LIGHT_GRAY); - } - backBufferGraphics.drawRect(itemX1, screen.getHeight() / 2 - 50, itemWidth, itemWidth); - - backBufferGraphics.setColor(Color.GRAY); - String itemName1 = itemNames[0]; - int itemNameX1 = itemX1 + (itemWidth - backBufferGraphics.getFontMetrics().stringWidth(itemName1)) / 2; - backBufferGraphics.drawString(itemName1, itemNameX1, screen.getHeight() / 2 + 70); - - backBufferGraphics.setColor(Color.GRAY); - String priceText1 = "Price: $" + itemPrices[0]; - int priceX1 = itemX1 + (itemWidth - backBufferGraphics.getFontMetrics().stringWidth(priceText1)) / 2; - backBufferGraphics.drawString(priceText1, priceX1, screen.getHeight() / 2 + 90); - - // Draw the second item - - if (selectedItem == 71) { - backBufferGraphics.setColor(Color.GREEN); - } else { - backBufferGraphics.setColor(Color.LIGHT_GRAY); - } - backBufferGraphics.drawRect(itemX2, screen.getHeight() / 2 - 50, itemWidth, itemWidth); - - backBufferGraphics.setColor(Color.GRAY); - String itemName2 = itemNames[1]; - int itemNameX2 = itemX2 + (itemWidth - backBufferGraphics.getFontMetrics().stringWidth(itemName2)) / 2; - backBufferGraphics.drawString(itemName2, itemNameX2, screen.getHeight() / 2 + 70); - - backBufferGraphics.setColor(Color.GRAY); - String priceText2 = "Price: $" + itemPrices[1]; - int priceX2 = itemX2 + (itemWidth - backBufferGraphics.getFontMetrics().stringWidth(priceText2)) / 2; - backBufferGraphics.drawString(priceText2, priceX2, screen.getHeight() / 2 + 90); - - // Draw the third item - - if (selectedItem == 72) { - backBufferGraphics.setColor(Color.GREEN); - } else { - backBufferGraphics.setColor(Color.LIGHT_GRAY); - } - backBufferGraphics.drawRect(itemX3, screen.getHeight() / 2 - 50, itemWidth, itemWidth); - - backBufferGraphics.setColor(Color.GRAY); - String itemName3 = itemNames[2]; - int itemNameX3 = itemX3 + (itemWidth - backBufferGraphics.getFontMetrics().stringWidth(itemName3)) / 2; - backBufferGraphics.drawString(itemName3, itemNameX3, screen.getHeight() / 2 + 70); - - backBufferGraphics.setColor(Color.GRAY); - String priceText3 = "Price: $" + itemPrices[2]; - int priceX3 = itemX3 + (itemWidth - backBufferGraphics.getFontMetrics().stringWidth(priceText3)) / 2; - backBufferGraphics.drawString(priceText3, priceX3, screen.getHeight() / 2 + 90); - - // The title/guide for the item shop: - backBufferGraphics.setColor(Color.GREEN); - drawCenteredBigString(screen, "Item Shop", screen.getHeight() / 10); - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, "Buy Your Upgrades Here!", screen.getHeight() / 6); - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, "Press Space to Buy", screen.getHeight() / 4); - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, "*If Player has the item already, Can't buy.*", screen.getHeight() / 5); - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, "Press Esc to Go to Menu", screen.getHeight() / 1); - backBufferGraphics.setColor(Color.GRAY); - - try{ - drawCenteredRegularString(screen, "Current credits : " + Core.getFileManager().getCurrentPlayer().getCurrency(), screen.getHeight() / 3); - }catch(IOException e){ - throw new RuntimeException(e); - } - } - - // Helper method to draw centered text - private void drawCenteredItemInfo(Screen screen, String text, int yPosition) { - int xPosition = (screen.getWidth() - backBufferGraphics.getFontMetrics().stringWidth(text)) / 2; - backBufferGraphics.drawString(text, xPosition, yPosition); - } - - /** - * Draws basic content of game over screen. - * - * @param screen - * Screen to draw on. - * @param acceptsInput - * If the screen accepts input. - * @param isNewRecord - * If the score is a new high score. - */ - public void drawGameOver(final Screen screen, final boolean acceptsInput, - final boolean isNewRecord) { - String gameOverString = "Game Over"; - String continueOrExitString = - "Press Space to play again, Escape to exit"; - - int height = isNewRecord ? 4 : 3; - - backBufferGraphics.setColor(Color.GREEN); - drawCenteredBigString(screen, gameOverString, screen.getHeight() - / height - fontBigMetrics.getHeight() * 2); - - if (acceptsInput) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, continueOrExitString, - screen.getHeight() / 2 + fontRegularMetrics.getHeight() * 10); - } - - /** - * Draws high score screen title and instructions. - * - * @param screen - * Screen to draw on. - */ - public void - drawSkinSelectionMenu(final Screen screen, final int skincode1p,final int skincode2p){ - String SkinString = "Select Your Ship Design!"; - String skin1p = "1P"; - String skin2p = "2P"; - Ship[] shipskin = new Ship[6]; - Ship[] shipskin2 = new Ship[6]; - - - if (SelectScreen.gameMode == 2) { - backBufferGraphics.setColor(Color.white); - backBufferGraphics.drawLine(screen.getWidth()/2, screen.getHeight()/5, screen.getWidth()/2, 450); - backBufferGraphics.setFont(fontBig); - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString(skin1p, screen.getWidth() / 4 - fontRegularMetrics.stringWidth(skin1p) / 2 - 1, 130); - backBufferGraphics.drawString(skin2p, 3 * screen.getWidth() / 4 - fontRegularMetrics.stringWidth(skin1p) / 2 - 2, 130); - try { - fileManager.changeSprite(spriteMap, SpriteType.Ship, 0); - } catch (IOException e) { - logger.warning("Loading failed."); - } - for (int i = 0; i < 6; i++) { - Ship dummyShip = new Ship(0, 0, Color.GREEN, SpriteType.Ship, false); - Ship dummyShip2 = new Ship(0, 0, Color.RED, SpriteType.Ship, true); - shipskin[i] = dummyShip; - shipskin2[i] = dummyShip2; - // 예: ships[i] = new Ship(i * 50, 100, Color.GREEN, SpriteType.Ship, spriteData, false); - drawEntity(shipskin[i], screen.getWidth() / 4 - 13, 172 + 50*i); - drawEntity(shipskin2[i], 3*screen.getWidth() / 4 - 13, 172 + 50*i); - if(i !=5) { - try { - fileManager.changeSprite(spriteMap, SpriteType.Ship, i+1); - } catch (IOException e) { - logger.warning("Loading failed."); - } - } - } - if (skincode1p == 0) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 165, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 165, 30, 30); - - } - if (skincode1p == 1) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 215, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 215, 30, 30); - } - if (skincode1p == 2) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 265, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 265, 30, 30); - } - if (skincode1p == 3) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 315, 30, 30); - - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 315, 30, 30); - } - if (skincode1p == 4) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 365, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 365, 30, 30); - } - if (skincode1p == 5) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 415, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 4 - 15, 415, 30, 30); - } - if (skincode2p == 0) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 165, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 165, 30, 30); - } - if (skincode2p == 1) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 215, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 215, 30, 30); - } - if (skincode2p == 2) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 265, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 265, 30, 30); - } - if (skincode2p == 3) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 315, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 315, 30, 30); - } - if (skincode2p == 4) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 365, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 365, 30, 30); - } - if (skincode2p == 5) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 415, 30, 30); - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(3 * screen.getWidth() / 4 - 15, 415, 30, 30); - } - try { - fileManager.changeSprite(spriteMap, SpriteType.Ship, skincode1p); - } catch (IOException e) { - logger.warning("Loading failed."); - } - try { - fileManager.changeSprite(spriteMap, SpriteType.Ship2, skincode2p); - } catch (IOException e) { - logger.warning("Loading failed."); - } - - } else { - try { - fileManager.changeSprite(spriteMap, SpriteType.Ship, 0); - } catch (IOException e) { - logger.warning("Loading failed."); - } - for (int i = 0; i < 6; i++) { - Ship dummyShip = new Ship(0, 0, Color.GREEN, SpriteType.Ship, false); - shipskin[i] = dummyShip; - // 예: ships[i] = new Ship(i * 50, 100, Color.GREEN, SpriteType.Ship, spriteData, false); - drawEntity(shipskin[i], screen.getWidth() / 2 - 13, 172 + 50*i); - if(i !=5) { - try { - fileManager.changeSprite(spriteMap, SpriteType.Ship, i+1); - } catch (IOException e) { - logger.warning("Loading failed."); - } - } - } - if (skincode1p == 0) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 165, 30, 30); - - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 165, 30, 30); - } - if (skincode1p == 1) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 215, 30, 30); - - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 215, 30, 30); - } - if (skincode1p == 2) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 265, 30, 30); - - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 265, 30, 30); - } - if (skincode1p == 3) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 315, 30, 30); - - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 315, 30, 30); - } - if (skincode1p == 4) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 365, 30, 30); - - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 365, 30, 30); - } - if (skincode1p == 5) { - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 415, 30, 30); - - } else { - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawRect(screen.getWidth() / 2 - 15, 415, 30, 30); - } - backBufferGraphics.setFont(fontBig); - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString(skin1p, screen.getWidth() / 2 - fontRegularMetrics.stringWidth(skin1p) / 2 - 1, 130); - try { - fileManager.changeSprite(spriteMap, SpriteType.Ship, skincode1p); - } catch (IOException e) { - logger.warning("Loading failed."); - } - } - backBufferGraphics.setColor(Color.GREEN); - drawCenteredBigString(screen, SkinString, screen.getHeight() / 8); - } - - - public void drawHighScoreMenu(final Screen screen) { - String highScoreString = "High Scores"; - String instructionsString = "Press Space to return"; - String gameMode_1 = "1P_Mode"; - String gameMode_2 = "2P_Mode"; - - backBufferGraphics.setColor(Color.GREEN); - drawCenteredBigString(screen, highScoreString, screen.getHeight() / 8); - - - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, instructionsString, - screen.getHeight() / 5); - - backBufferGraphics.setColor(Color.GRAY); - drawLeftsideRegularString(screen, gameMode_1, - screen.getHeight()*4 / 15); - - backBufferGraphics.setColor(Color.GRAY); - drawRightsideRegularString(screen, gameMode_2, - screen.getHeight()*4 / 15); - } - - /** - * Draws high scores from 1p mode. - * - * @param screen - * Screen to draw on. - * @param highScores - * List of high scores. - */ - public void drawHighScores_1p(final Screen screen, - final List highScores) { - backBufferGraphics.setColor(Color.WHITE); - int i = 0; - String scoreString = ""; - - for (Score score : highScores) { - scoreString = String.format("%s %04d", score.getName(), - score.getScore()); - drawLeftsideRegularString(screen, scoreString, screen.getHeight() - / 4 + fontRegularMetrics.getHeight() * (i + 1) * 2); - i++; - } - } - - /** - * Draws high scores from 2p mode. - * - * @param screen - * Screen to draw on. - * @param highScores - * List of high scores. - */ - public void drawHighScores_2p(final Screen screen, - final List highScores) { - backBufferGraphics.setColor(Color.WHITE); - int i = 0; - String scoreString = ""; - - for (Score score : highScores) { - scoreString = String.format("%s %04d", score.getName(), - score.getScore()); - drawRightsideRegularString(screen, scoreString, screen.getHeight() - / 4 + fontRegularMetrics.getHeight() * (i + 1) * 2); - i++; - } - } - - /** - * Draws a centered string on regular font. - * - * @param screen - * Screen to draw on. - * @param string - * String to draw. - * @param height - * Height of the drawing. - */ - public void drawCenteredRegularString(final Screen screen, - final String string, final int height) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.drawString(string, screen.getWidth() / 2 - - fontRegularMetrics.stringWidth(string) / 2, height); - } - /** - * Draws a left sided string on regular font. - * - * @param screen - * Screen to draw on. - * @param string - * String to draw. - * @param height - * Height of the drawing. - */ - public void drawLeftsideRegularString(final Screen screen, - final String string, final int height) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.drawString(string, screen.getWidth()*3 / 13 - - fontRegularMetrics.stringWidth(string) / 2, height); - } - /** - * Draws a right sided string on regular font. - * - * @param screen - * Screen to draw on. - * @param string - * String to draw. - * @param height - * Height of the drawing. - */ - public void drawRightsideRegularString(final Screen screen, - final String string, final int height) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.drawString(string, screen.getWidth()*10 / 13 - - fontRegularMetrics.stringWidth(string) / 2, height); - } - - /** - * Draws a centered string on big font. - * - * @param screen - * Screen to draw on. - * @param string - * String to draw. - * @param height - * Height of the drawing. - */ - public void drawCenteredBigString(final Screen screen, final String string, - final int height) { - backBufferGraphics.setFont(fontBig); - backBufferGraphics.drawString(string, screen.getWidth() / 2 - - fontBigMetrics.stringWidth(string) / 2, height); - } - - - /** - * Countdown to game start. - * - * @param screen - * Screen to draw on. - * @param level - * Game difficulty level. - * @param number - * Countdown number. - * @param bonusLife - * Checks if a bonus life is received. - */ - public void drawCountDown(final Screen screen, final int level, - final int number, final boolean bonusLife) { - int rectWidth = screen.getWidth(); - int rectHeight = screen.getHeight() / 6; - backBufferGraphics.setColor(Color.BLACK); - backBufferGraphics.fillRect(0, screen.getHeight() / 2 - rectHeight / 2, - rectWidth, rectHeight); - backBufferGraphics.setColor(Color.GREEN); - if (number >= 4) - if (!bonusLife) { - drawCenteredBigString(screen, "Level " + level, - screen.getHeight() / 2 - + fontBigMetrics.getHeight() / 3); - } else { - drawCenteredBigString(screen, "Level " + level - + " - Bonus life!", - screen.getHeight() / 2 - + fontBigMetrics.getHeight() / 3); - } - else if (number != 0) - drawCenteredBigString(screen, Integer.toString(number), - screen.getHeight() / 2 + fontBigMetrics.getHeight() / 3); - else - drawCenteredBigString(screen, "GO!", screen.getHeight() / 2 - + fontBigMetrics.getHeight() / 3); - } - - public void drawClear(final Screen screen, final int option, final int level) { - String titleString = "LEVEL " + level + " Clear"; - - backBufferGraphics.setColor(Color.GREEN); - drawCenteredBigString(screen, titleString, screen.getHeight() / 3 + fontRegularMetrics.getHeight() * 2); - - String continueString = "Continue"; - String exitString = "Exit"; - - if (option == 2) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, continueString, - screen.getHeight() / 4 * 3); - - if (option == 1) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, exitString, - screen.getHeight() / 4 * 3 + fontRegularMetrics.getHeight() * 2); - } - - public void drawWindow(final Screen screen, int x, int y, int w){ - int rectWidth = screen.getWidth(); - int rectHeight = screen.getHeight() / 6; - backBufferGraphics.setColor(Color.BLACK); - backBufferGraphics.fillRect(x, y, - rectWidth, rectHeight + w); - } - - public void drawPauseMenu(final Screen screen, final int option) { - String quit = "Quit"; - String resume = "Resume"; - - if (option == 1) - backBufferGraphics.setColor(Color.YELLOW); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, quit, screen.getHeight() / 2 - 10); - - if (option == 0) - backBufferGraphics.setColor(Color.YELLOW); - else - backBufferGraphics.setColor(Color.WHITE); - drawCenteredRegularString(screen, resume, screen.getHeight() / 2 + 20 ); - - //How to operate in the pause window - backBufferGraphics.setColor(Color.YELLOW); - drawCenteredRegularString(screen, "Change: Ctrl" + " / " + "Select: Spacebar", - screen.getHeight() / 2 - screen.getHeight() / 12 - 15); - } - public void drawManualMenu(final Screen screen) { - - String[] keyInfo = {"left", "right", "attack", "burst1", "burst2", "reload", "booster", "item"}; - String[] keyValue = Core.getKeySettingStringArray(); - - backBufferGraphics.setColor(Color.CYAN); - drawCenteredRegularString(screen, "Play manual", screen.getHeight() / 2 - 105); - backBufferGraphics.drawString("Player1", screen.getWidth() / 2 - 140, screen.getHeight() / 2 - 60); - backBufferGraphics.drawString("Player2", screen.getWidth() / 2 + 65, screen.getHeight() / 2 - 60); - - backBufferGraphics.setColor(Color.WHITE); - int y = screen.getHeight() / 2 - 30; - int x1 = screen.getWidth() / 2 - 150; //player1_manual - int x2 = screen.getWidth() / 2 - 50; //player1_setting - int x3 = screen.getWidth() / 2 + 50; //player2 - int x4 = screen.getWidth() / 2 + 150; //player2_setting - for(int i=0; i<8; i++){ - backBufferGraphics.drawString(keyInfo[i], x1-fontRegularMetrics.stringWidth(keyInfo[i])/2, y+20*i); - backBufferGraphics.drawString(keyValue[i], x2-fontRegularMetrics.stringWidth(keyValue[i])/2, y+20*i); - backBufferGraphics.drawString(keyInfo[i], x3-fontRegularMetrics.stringWidth(keyInfo[i])/2, y+20*i); - backBufferGraphics.drawString(keyValue[i+8], x4-fontRegularMetrics.stringWidth(keyValue[i+8])/2, y+20*i); - } - - - } - - public void drawOneFifthRegularString(final Screen screen, - final String string, final int height) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.drawString(string, screen.getWidth() / 5 - - fontRegularMetrics.stringWidth(string) / 2 , height); - } - - public void drawSevenTenthRegularString(final Screen screen, - final String string, final int height) { - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.drawString(string, screen.getWidth() / 10 * 7 - - fontRegularMetrics.stringWidth(string) / 2 , height); - } - - public void drawStar(final Screen screen, - final String string, final int height){ - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.drawString("*", screen.getWidth() / 5 - - fontRegularMetrics.stringWidth(string) / 2 -16, height); - - } - - public void drawSetting(final Screen screen, final int option, final boolean selected){ - String settingString = "Setting"; - String instructionsString1 = "Move with UP, DOWN / Select with SPACE"; - String instructionsString2 = "Press ESC to return"; - - String volumeString = "Volume"; - String bgmString = "BGM"; - String keysString1 = "1P Keys"; - String keysString2 = "2P Keys"; - - - backBufferGraphics.setColor(Color.GREEN); - drawCenteredBigString(screen, settingString, screen.getHeight() / 8); - - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, instructionsString1, - screen.getHeight() / 5 - fontRegularMetrics.getHeight() / 2); - drawCenteredRegularString(screen, instructionsString2, - screen.getHeight() / 5 + fontRegularMetrics.getHeight() / 2); - - - if (option == 0) { - backBufferGraphics.setColor(Color.GREEN); - if(selected) drawStar(screen, volumeString, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 2); - } - else - backBufferGraphics.setColor(Color.WHITE); - drawOneFifthRegularString(screen, volumeString, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 2); - - if (option == 1) { - backBufferGraphics.setColor(Color.GREEN); - if(selected) drawStar(screen, bgmString, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 4); - } - else - backBufferGraphics.setColor(Color.WHITE); - drawOneFifthRegularString(screen, bgmString, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 4); - - if (option == 2) { - backBufferGraphics.setColor(Color.GREEN); - if(selected) drawStar(screen, keysString1, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 6);; - } - else - backBufferGraphics.setColor(Color.WHITE); - drawOneFifthRegularString(screen, keysString1, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 6); - - if (option == 3) { - backBufferGraphics.setColor(Color.GREEN); - if(selected) drawStar(screen, keysString2, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 8);; - } - else - backBufferGraphics.setColor(Color.WHITE); - drawOneFifthRegularString(screen, keysString2, - screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 8); - - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawLine(screen.getWidth()/5*2 -1,screen.getHeight() / 4, - screen.getWidth()/5*2 -1,screen.getHeight() / 10 * 9); - backBufferGraphics.drawLine(screen.getWidth()/5*2,screen.getHeight() / 4, - screen.getWidth()/5*2,screen.getHeight() / 10 * 9); - - } - - - public void drawSettingDetail(final Screen screen, final int option, final boolean selected, - int volume, boolean bgmOn, int keyNum) { - String[] keyString = Core.getKeySettingStringArray(); - if(option == 0 || option == 1){ - if (option == 0 && selected) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - - backBufferGraphics.drawRect(screen.getWidth() / 2, screen.getHeight() / 4 + fontRegularMetrics.getHeight() / 8 * 12, - screen.getWidth() / 4, fontRegularMetrics.getHeight()); - backBufferGraphics.fillRect(screen.getWidth() / 2, screen.getHeight() / 4 + fontRegularMetrics.getHeight() / 8 * 12, - screen.getWidth() / 4 * volume / 100, fontRegularMetrics.getHeight()); - backBufferGraphics.drawString(Integer.toString(volume), screen.getWidth() / 4 * 3 - + fontRegularMetrics.stringWidth("A") * 2, screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 2); - - if (option == 1 && selected) - backBufferGraphics.setColor(Color.GREEN); - else - backBufferGraphics.setColor(Color.WHITE); - - if(bgmOn) drawSevenTenthRegularString(screen,"ON",screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 4); - else drawSevenTenthRegularString(screen,"OFF",screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 4); - } - - if (option == 2){ - drawKeyString(screen,"LEFT", "RIGHT", "ATTACK", "BURST 1", "BURST 2","RELOAD","BOOSTER","ITEM",6); - drawKeyString(screen,keyString[0],keyString[1],keyString[2],keyString[3],keyString[4],keyString[5],keyString[6],keyString[7], 8); - if(selected){ - drawGreenKeyString(screen, keyNum); - } - - } - - if (option == 3){ - drawKeyString(screen,"LEFT", "RIGHT", "ATTACK", "BURST 1", "BURST 2","RELOAD","BOOSTER","ITEM",6); - drawKeyString(screen,keyString[8],keyString[9],keyString[10],keyString[11],keyString[12],keyString[13],keyString[14],keyString[15], 8); - if(selected){ - drawGreenKeyString(screen, keyNum); - } - - } - - - - } - private void drawKeyString(Screen screen, String s1,String s2,String s3,String s4,String s5,String s6,String s7,String s8,int num){ - backBufferGraphics.setFont(fontRegular); - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString(s1, screen.getWidth() / 10 * num - - fontRegularMetrics.stringWidth(s1) / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight()); - backBufferGraphics.drawString(s2, screen.getWidth() / 10 * num - - fontRegularMetrics.stringWidth(s2) / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 3); - backBufferGraphics.drawString(s3, screen.getWidth() / 10 * num - - fontRegularMetrics.stringWidth(s3) / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 5); - backBufferGraphics.drawString(s4, screen.getWidth() / 10 * num - - fontRegularMetrics.stringWidth(s4) / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 7); - backBufferGraphics.drawString(s5, screen.getWidth() / 10 * num - - fontRegularMetrics.stringWidth(s5) / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 9); - backBufferGraphics.drawString(s6, screen.getWidth() / 10 * num - - fontRegularMetrics.stringWidth(s6) / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 11); - backBufferGraphics.drawString(s7, screen.getWidth() / 10 * num - - fontRegularMetrics.stringWidth(s7) / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 13); - backBufferGraphics.drawString(s8, screen.getWidth() / 10 * num - - fontRegularMetrics.stringWidth(s8) / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 15); - } - - private void drawGreenKeyString(Screen screen,int keyNum){ - backBufferGraphics.setFont(fontRegular); - if(keyNum == 0){ - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawString("LEFT", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("LEFT") / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight()); - } - if(keyNum == 1){ - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawString("RIGHT", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("RIGHT") / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 3); - } - if(keyNum == 2){ - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawString("ATTACK", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("ATTACK") / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 5); - } - if(keyNum == 3){ - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawString("BURST 1", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("BURST 1") / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 7); - } - if(keyNum == 4){ - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawString("BURST 2", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("BURST 2") / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 9); - } - if(keyNum == 5){ - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawString("RELOAD", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("RELOAD") / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 11); - } - if(keyNum == 6){ - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawString("BOOSTER", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("BOOSTER") / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 13); - }if(keyNum == 7){ - backBufferGraphics.setColor(Color.GREEN); - backBufferGraphics.drawString("ITEM", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("ITEM") / 2 , screen.getHeight() / 4 + fontRegularMetrics.getHeight() * 15); - } - } - - public void drawSelect2PModeAndSkillModeScreen(Screen screen, int gameMode, boolean skillModeOn, boolean nextItem){ - String selectString = "Select Mode"; - String instructionsString = - "select with a+d / arrows, confirm with space"; - - backBufferGraphics.setColor(Color.GRAY); - drawCenteredRegularString(screen, instructionsString, screen.getHeight() / 5); - backBufferGraphics.setColor(Color.GREEN); - drawCenteredBigString(screen, selectString, screen.getHeight() / 8); - backBufferGraphics.drawString("Player", screen.getWidth() / 5 - - fontRegularMetrics.stringWidth("Player") / 2 , screen.getHeight() / 8 * 3); - backBufferGraphics.drawString("Skill Mode", screen.getWidth() / 5 - - fontRegularMetrics.stringWidth("Player") / 2 , screen.getHeight() / 8 * 5); - - if(gameMode == 1) backBufferGraphics.setColor(Color.GREEN); - else backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString("1P", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("1P") / 2 , screen.getHeight() - / 8 * 3 + fontRegularMetrics.getHeight() * 2); - - if(gameMode == 2) backBufferGraphics.setColor(Color.GREEN); - else backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString("2P", screen.getWidth() / 10 * 8 - - fontRegularMetrics.stringWidth("2P") / 2 , screen.getHeight() - / 8 * 3 + fontRegularMetrics.getHeight() * 2); - - backBufferGraphics.setColor(Color.WHITE); - backBufferGraphics.drawString("ON", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("ON") / 2 , screen.getHeight() - / 8 * 5 + fontRegularMetrics.getHeight() * 2); - backBufferGraphics.drawString("OFF", screen.getWidth() / 10 * 8 - - fontRegularMetrics.stringWidth("OFF") / 2 , screen.getHeight() - / 8 * 5 + fontRegularMetrics.getHeight() * 2); - if(nextItem){ - backBufferGraphics.setColor(Color.GREEN); - if(skillModeOn) backBufferGraphics.drawString("ON", screen.getWidth() / 10 * 6 - - fontRegularMetrics.stringWidth("ON") / 2 , screen.getHeight() - / 8 * 5 + fontRegularMetrics.getHeight() * 2); - else backBufferGraphics.drawString("OFF", screen.getWidth() / 10 * 8 - - fontRegularMetrics.stringWidth("OFF") / 2 , screen.getHeight() - / 8 * 5 + fontRegularMetrics.getHeight() * 2); - } - } - - /** - * Draws achievement information on the screen based on the achievements map. - * - * @param screen Screen to draw on. - * @param achievements Map of achievements with their completion status. - */ - public void drawAchievements(final Screen screen, Map achievements) { - backBufferGraphics.setFont(fontRegular); - - int x = 20; // Fixed X-coordinate for achievement titles. - int y = 50; // Fixed Y-coordinate for the initial position. - - // Loop through the achievements map and display each achievement. - for (Map.Entry entry : achievements.entrySet()) { - String achievementTitle = entry.getKey().toString().replace('_', ' '); - boolean isCompleted = entry.getValue(); - - // Display the achievement title. - backBufferGraphics.setColor(Color.YELLOW); - backBufferGraphics.drawString(achievementTitle, x, y); - - // Check if the achievement is completed and adjust the color accordingly. - if (isCompleted) { - backBufferGraphics.setColor(Color.GREEN); - } else { - backBufferGraphics.setColor(Color.RED); - } - - // Calculate the position to display achievementStatus (completed or incomplete) on the right of achievementTitle. - int titleWidth = fontRegularMetrics.stringWidth(achievementTitle); - int statusX = x + titleWidth + 10; // You can adjust the spacing as needed. - - // Display whether the achievement is completed or not. - String achievementStatus = isCompleted ? "Completed" : "Incomplete"; - backBufferGraphics.drawString(achievementStatus, statusX, y); - - // You can add more information about the achievement if needed. - // For example, you can display the progress or description. - - // Increase the Y-coordinate for the next achievement entry. - y += 40; - } - } -} diff --git a/src/engine/FileManager.java b/src/engine/FileManager.java deleted file mode 100644 index 4551ff97..00000000 --- a/src/engine/FileManager.java +++ /dev/null @@ -1,869 +0,0 @@ -package engine; - -import java.awt.Font; -import java.awt.FontFormatException; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.net.URLDecoder; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Date; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.logging.Logger; - -import engine.DrawManager.SpriteType; - -/** - * Manages files used in the application. - * - * @author Roberto Izquierdo Amo - */ -public final class FileManager { - - /** - * Singleton instance of the class. - */ - private static FileManager instance; - /** - * Application logger. - */ - private static Logger logger; - /** - * Max number of high scores. - */ - private static final int MAX_SCORES = 7; - - /** - * private constructor. - */ - private FileManager() { - logger = Core.getLogger(); - } - - /** - * Returns shared instance of FileManager. - * - * @return Shared instance of FileManager. - */ - protected static FileManager getInstance() { - if (instance == null) - instance = new FileManager(); - return instance; - } - - /** - * Loads sprites from disk. - * - * @param spriteMap Mapping of sprite type and empty boolean matrix that will - * contain the image. - * @throws IOException In case of loading problems. - */ - public void loadSprite(Map spriteMap) - throws IOException { - InputStream inputStream = null; - - try { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("graphics"); - char c; - // Sprite loading. - for (Map.Entry sprite : spriteMap - .entrySet()) { - for (int i = 0; i < sprite.getValue().length; i++) - for (int j = 0; j < sprite.getValue()[i].length; j++) { - do - c = (char) inputStream.read(); - while (c != '0' && c != '1'); - - if (c == '1') - sprite.getValue()[i][j] = true; - else - sprite.getValue()[i][j] = false; - } - logger.fine("Sprite " + sprite.getKey() + " loaded."); - } - if (inputStream != null) - inputStream.close(); - } finally { - if (inputStream != null) - inputStream.close(); - } - } - - /** - * Change sprites from disk. - * - * @param spriteMap,spriteType,graphicsNum Changing boolean matrix that will - * change the image. - * graphicsNum is col_num(each graphics) - * @throws IOException In case of changing problems. - */ - public void changeSprite(Map spriteMap, SpriteType spriteType, int graphicsNum) - throws IOException { - InputStream inputStream = checkSpriteType(spriteType); - try { - char c; - for (Map.Entry sprite : spriteMap - .entrySet()) { - if (sprite.getKey() == spriteType) { - for (int k = -1; k < graphicsNum; k++) { - for (int i = 0; i < sprite.getValue().length; i++) - for (int j = 0; j < sprite.getValue()[i].length; j++) { - do - c = (char) inputStream.read(); - while (c != '0' && c != '1'); - - if (c == '1') - sprite.getValue()[i][j] = true; - else - sprite.getValue()[i][j] = false; - } - } - logger.fine("Sprite " + spriteType + " changed."); - break; - } - } - if (inputStream != null) - inputStream.close(); - } finally { - if (inputStream != null) - inputStream.close(); - } - } - - /** - * Check Sprite Type. - * - * @param spriteType Point size of the font. - * @return inputStream. - * @throws IOException In case of loading problems. - */ - public InputStream checkSpriteType(SpriteType spriteType) { - InputStream inputStream = null; - if (spriteType == SpriteType.Bullet) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("bulletGraphics"); - } else if (spriteType == SpriteType.Ship) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("shipGraphics"); - } else if (spriteType == SpriteType.Ship2) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("shipGraphics"); - } else if (spriteType == SpriteType.EnemyBullet) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("bulletGraphics"); - } else if (spriteType == SpriteType.EnemyShipA1) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("enemyshipGraphics"); - } else if (spriteType == SpriteType.EnemyShipA2) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("enemyshipGraphics"); - } else if (spriteType == SpriteType.EnemyShipB1) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("enemyshipGraphics"); - } else if (spriteType == SpriteType.EnemyShipB2) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("enemyshipGraphics"); - } else if (spriteType == SpriteType.EnemyShipC1) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("enemyshipGraphics"); - } else if (spriteType == SpriteType.EnemyShipC2) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("enemyshipGraphics"); - } else if (spriteType == SpriteType.EnemyShipSpecial) { - inputStream = DrawManager.class.getClassLoader() - .getResourceAsStream("specialenemyGraphics"); - } - return inputStream; - } - - - /** - * Loads a font of a given size. - * - * @param size Point size of the font. - * @return New font. - * @throws IOException In case of loading problems. - * @throws FontFormatException In case of incorrect font format. - */ - public Font loadFont(final float size) throws IOException, - FontFormatException { - InputStream inputStream = null; - Font font; - - try { - // Font loading. - inputStream = FileManager.class.getClassLoader() - .getResourceAsStream("font.ttf"); - font = Font.createFont(Font.TRUETYPE_FONT, inputStream).deriveFont( - size); - } finally { - if (inputStream != null) - inputStream.close(); - } - - return font; - } - - /** - * Returns the application default scores if there is no user high scores - * file. - * - * @return Default high scores. - * @throws IOException In case of loading problems. - */ - private List loadDefaultHighScores() throws IOException { - List highScores = new ArrayList(); - InputStream inputStream = null; - BufferedReader reader = null; - - try { - File scoresFile = new File("res" + File.separator + "scores"); - if (!scoresFile.exists()) - scoresFile.createNewFile(); - - inputStream = FileManager.class.getClassLoader() - .getResourceAsStream("scores"); - reader = new BufferedReader(new InputStreamReader(inputStream)); - - Score highScore = null; - String name = reader.readLine(); - String score = reader.readLine(); - - while ((name != null) && (score != null)) { - highScore = new Score(name, Integer.parseInt(score)); - highScores.add(highScore); - name = reader.readLine(); - score = reader.readLine(); - } - } finally { - if (inputStream != null) - inputStream.close(); - } - - return highScores; - } - - /** - * Loads high scores from file, and returns a sorted list of pairs score - - * value. - * - * @param gameMode The game mode. - * @return Sorted list of scores - players. - * @throws IOException In case of loading problems. - */ - public List loadHighScores(final int gameMode) throws IOException { - - List highScores = new ArrayList(); - InputStream inputStream = null; - BufferedReader bufferedReader = null; - - try { - String scoresPath = ""; - scoresPath += File.separator; - if (gameMode == 1) - scoresPath += "scores_1p"; - else - scoresPath += "scores_2p"; - - File scoresFile = new File("res" + File.separator + scoresPath); - if (!scoresFile.exists()) - scoresFile.createNewFile(); - - inputStream = new FileInputStream(scoresFile); - bufferedReader = new BufferedReader(new InputStreamReader( - inputStream, Charset.forName("UTF-8"))); - - logger.info("Loading user high scores " + "from 'scores_" + gameMode + "p'"); - - Score highScore = null; - String name = bufferedReader.readLine(); - String score = bufferedReader.readLine(); - - while ((name != null) && (score != null)) { - highScore = new Score(name, Integer.parseInt(score)); - highScores.add(highScore); - name = bufferedReader.readLine(); - score = bufferedReader.readLine(); - } - - } catch (FileNotFoundException e) { - // loads default if there's no user scores. - logger.info("Loading default high scores."); - highScores = loadDefaultHighScores(); - } finally { - if (bufferedReader != null) - bufferedReader.close(); - } - - Collections.sort(highScores); - return highScores; - } - - - /** - * Saves user high scores to disk. - * - * @param highScores High scores to save. - * @throws IOException In case of loading problems. - */ - public void saveHighScores(final List highScores, final int gameMode) - throws IOException { - OutputStream outputStream = null; - BufferedWriter bufferedWriter = null; - - try { - String scoresPath = ""; - if (gameMode == 1) - scoresPath += "scores_1p"; - else - scoresPath += "scores_2p"; - - File scoresFile = new File("res" + File.separator + scoresPath); - if (!scoresFile.exists()) - scoresFile.createNewFile(); - - outputStream = new FileOutputStream(scoresFile); - bufferedWriter = new BufferedWriter(new OutputStreamWriter( - outputStream, Charset.forName("UTF-8"))); - - logger.info("Saving user high scores."); - - // Saves 7 or less scores. - int savedCount = 0; - for (Score score : highScores) { - if (savedCount >= MAX_SCORES) - break; - bufferedWriter.write(score.getName()); - bufferedWriter.newLine(); - bufferedWriter.write(Integer.toString(score.getScore())); - bufferedWriter.newLine(); - savedCount++; - } - - } finally { - if (bufferedWriter != null) - bufferedWriter.close(); - } - } - - public List loadSettings() throws IOException { - - List settings = new ArrayList(); - InputStream inputStream = null; - BufferedReader bufferedReader = null; - - try { - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, "UTF-8"); - - String settingPath = new File(jarPath).getParent(); - settingPath += File.separator; - settingPath += "settings"; - - File scoresFile = new File(settingPath); - inputStream = new FileInputStream(scoresFile); - bufferedReader = new BufferedReader(new InputStreamReader( - inputStream, Charset.forName("UTF-8"))); - - logger.info("Loading settings."); - - Settings settings1 = null; - String name = bufferedReader.readLine(); - String value = bufferedReader.readLine(); - settings1 = new Settings(name, Integer.parseInt(value)); - settings.add(settings1); - - name = bufferedReader.readLine(); - value = bufferedReader.readLine(); - settings1 = new Settings(name, Integer.parseInt(value)); - settings.add(settings1); - - name = bufferedReader.readLine(); - value = bufferedReader.readLine(); - while ((name != null) && (value != null)) { - settings1 = new Settings(name, Integer.parseInt(value, 16)); - settings.add(settings1); - name = bufferedReader.readLine(); - value = bufferedReader.readLine(); - } - - } catch (FileNotFoundException e) { - // loads default if there's no settings. - logger.info("Loading default Settings."); - settings = loaddefaultSettings(); - } finally { - if (bufferedReader != null) - bufferedReader.close(); - } - return settings; - } - - public List loaddefaultSettings() throws IOException { - List Setting = new ArrayList(); - InputStream inputStream = null; - BufferedReader reader = null; - - try { - inputStream = FileManager.class.getClassLoader() - .getResourceAsStream("settings"); - reader = new BufferedReader(new InputStreamReader(inputStream)); - - Settings Setting1 = null; - String name = reader.readLine(); - String value = reader.readLine(); - Setting1 = new Settings(name, Integer.parseInt(value)); - Setting.add(Setting1); - - name = reader.readLine(); - value = reader.readLine(); - Setting1 = new Settings(name, Integer.parseInt(value)); - Setting.add(Setting1); - - name = reader.readLine(); - value = reader.readLine(); - while ((name != null) && (value != null)) { - Setting1 = new Settings(name, Integer.parseInt(value.substring(2), 16)); - Setting.add(Setting1); - name = reader.readLine(); - value = reader.readLine(); - } - - logger.info("Successfully load"); - } finally { - if (inputStream != null) - inputStream.close(); - } - - return Setting; - } - - - public static void saveSettings(final List setting) - throws IOException { - OutputStream outputStream = null; - BufferedWriter bufferedWriter = null; - - try { - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, "UTF-8"); - - String settingPath = new File(jarPath).getParent() + File.separator + "settings"; - File settingFlie = new File(settingPath); - - if (!settingFlie.exists()) - settingFlie.createNewFile(); - - outputStream = new FileOutputStream(settingFlie); - bufferedWriter = new BufferedWriter(new OutputStreamWriter( - outputStream, Charset.forName("UTF-8"))); - - logger.info("Saving user settings."); - bufferedWriter.write(setting.get(0).getName()); - bufferedWriter.newLine(); - bufferedWriter.write(Integer.toString(setting.get(0).getValue())); - bufferedWriter.newLine(); - bufferedWriter.write(setting.get(1).getName()); - bufferedWriter.newLine(); - bufferedWriter.write(Integer.toString(setting.get(1).getValue())); - bufferedWriter.newLine(); - // Saves settings. - for (int i = 2; i < 18; i++) { - bufferedWriter.write(setting.get(i).getName()); - bufferedWriter.newLine(); - bufferedWriter.write(Integer.toHexString(setting.get(i).getValue())); - bufferedWriter.newLine(); - } - - } finally { - if (bufferedWriter != null) - bufferedWriter.close(); - } - } - - //loads player object by its name as a character and writes the player data in the currentPlayer text file - public Player loadPlayer(char[] name) throws IOException { - - Player player = null; - - String jarPath = FileManager.class.getProtectionDomain().getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8); - - String playerPath = new File(jarPath).getParent() + File.separator + "accounts"; - String currentPlayerPath = new File(jarPath).getParent() + File.separator + "currentPlayer"; - - File playerFile = new File(playerPath); - File currentPlayerFile = new File(currentPlayerPath); - currentPlayerFile.createNewFile(); - - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(playerFile), Charset.forName("UTF-8"))); - BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(currentPlayerFile, false), Charset.forName("UTF-8")))) { - - String loadedName = bufferedReader.readLine(); - String currency = bufferedReader.readLine(); - String loginTime = bufferedReader.readLine(); - String itemList = bufferedReader.readLine(); - - while ((loadedName != null) && (currency != null) && (loginTime != null) && (itemList != null)) { - if (loadedName.equals(String.valueOf(name))) { - List items = convertStringToBooleanList(itemList); - player = new Player(loadedName, Integer.parseInt(currency), loginTime, items); - bufferedWriter.write(loadedName); - bufferedWriter.newLine(); - bufferedWriter.write(currency); - bufferedWriter.newLine(); - bufferedWriter.write(loginTime); - bufferedWriter.newLine(); - bufferedWriter.write(itemList); - bufferedWriter.newLine(); - - bufferedWriter.flush(); - break; - } else { - loadedName = bufferedReader.readLine(); - currency = bufferedReader.readLine(); - loginTime = bufferedReader.readLine(); - itemList = bufferedReader.readLine(); - } - } - - } catch (FileNotFoundException e) { - // create new player if player not found. - logger.info("Account list not found."); - } - - return player; - } - - //new player is being created and being saved in accounts.txt - public void saveNewPlayer(final char[] name) throws IOException { - // Get the path to the JAR file. - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8); - - // Construct the path to the player file. - Path playerPath = Paths.get(new File(jarPath).getParent(), "accounts"); - - // Create the player file if it doesn't exist. - File playerFile = playerPath.toFile(); - if (!playerFile.exists() && !playerFile.createNewFile()) { - logger.warning("Failed to create new player file at: " + playerPath); - return; - } - - // Write the new player data to the file. - try (BufferedWriter bufferedWriter = Files.newBufferedWriter(playerPath, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) { - logger.info("Creating new user with name: " + String.valueOf(name)); - bufferedWriter.write(String.valueOf(name)); - bufferedWriter.newLine(); - bufferedWriter.write("0"); - bufferedWriter.newLine(); - bufferedWriter.write(currentDate()); - bufferedWriter.newLine(); - bufferedWriter.write("false, false, false"); - bufferedWriter.newLine(); - bufferedWriter.flush(); - loadPlayer(name); //I know I can make a separate function to overwrite it but I have to set priorities on other things - } catch (IOException e) { - logger.warning("Failed to write new player data to file: " + e.getMessage()); - throw e; // Re-throw the exception after logging it. - } - } - - //Overwrites the content of currentPlayer.txt to accounts.txt. - public void updateAccounts() throws IOException { - - // Get the path to the JAR file - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8); - - // Construct the path to the player data file - Path playerPath = Paths.get(new File(jarPath).getParent(), "accounts"); - - // Check if the player data file exists - if (!Files.exists(playerPath)) { - logger.warning("Player file not found at: " + playerPath); - return; - } - - StringBuilder inputBuffer = new StringBuilder(); - try (BufferedReader bufferedReader = Files.newBufferedReader(playerPath, StandardCharsets.UTF_8)) { - String line; - while ((line = bufferedReader.readLine()) != null) { - inputBuffer.append(line).append('\n'); - } - } catch (IOException e) { - logger.warning("Failed to read player data from file: " + e.getMessage()); - throw e; - } - - Path currentPlayerPath = Paths.get(new File(jarPath).getParent(), "currentPlayer"); - - try (BufferedReader currentBufferedReader = Files.newBufferedReader(currentPlayerPath, StandardCharsets.UTF_8)) { - String loadedName = currentBufferedReader.readLine(); - String currency = currentBufferedReader.readLine(); - String loginTime = currentBufferedReader.readLine(); - String itemList = currentBufferedReader.readLine(); - - if (loadedName == null || currency == null || loginTime == null || itemList == null) { - logger.warning("Invalid data in current player file"); - return; - } - - Player player = loadPlayer(loadedName.toCharArray()); - List items = player.getItem(); - String inputStr = inputBuffer.toString().replace( - loadedName + "\n" + player.getCurrency() + "\n" + player.getLoginTime() + "\n" + items.get(0) + ", " + items.get(1) + ", " + items.get(2) + "\n", - loadedName + "\n" + currency + "\n" + loginTime + "\n" + itemList + "\n"); - - try (BufferedWriter bufferedWriter = Files.newBufferedWriter(playerPath, StandardCharsets.UTF_8)) { - bufferedWriter.write(inputStr); - logger.info("Successfully updated amount of player"); - } catch (IOException e) { - logger.warning("Failed to write updated player data to file: " + e.getMessage()); - throw e; - } - } catch (IOException e) { - logger.warning("Failed to read current player data from file: " + e.getMessage()); - throw e; - } - } - - //update function for easier manipulation of currency of current player - public void updateCurrencyOfCurrentPlayer(int difference) throws IOException { - - // Get the path to the JAR file - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8); - - // Construct the path to the player data file - Path playerPath = Paths.get(new File(jarPath).getParent(), "currentPlayer"); - - // Check if the player data file exists - if (!Files.exists(playerPath)) { - logger.warning("Player file not found at: " + playerPath); - return; - } - - int linesBelongingToAPlayer = 4; - List lines = Files.readAllLines(playerPath, StandardCharsets.UTF_8); - if (lines.size() < linesBelongingToAPlayer) { - logger.warning("Invalid data in current player file"); - return; - } - - String loadedName = lines.get(0); - int currentCurrency; - try { - currentCurrency = Integer.parseInt(lines.get(1)); - } catch (NumberFormatException e) { - logger.warning("Invalid currency value in current player file"); - return; - } - - int newBalance = currentCurrency + difference; - lines.set(1, String.valueOf(newBalance)); - - try { - Files.write(playerPath, lines, StandardCharsets.UTF_8); - logger.info("Successfully changed amount of player: " + loadedName + " to " + newBalance); - } catch (IOException e) { - logger.warning("Failed to write updated player data to file: " + e.getMessage()); - throw e; - } - } - - //get the current login time - public String currentDate() throws IOException { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - return dateFormat.format(new Date()); - } - - //logic for updating the login time of current player - public void updateLoginTimeOfCurrentPlayer() throws IOException { - // Get the path to the JAR file - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8); - - // Construct the path to the player data file - Path playerPath = Paths.get(new File(jarPath).getParent(), "currentPlayer"); - - // Check if the player data file exists - if (!Files.exists(playerPath)) { - logger.warning("Player file not found at: " + playerPath); - return; - } - - // Read the lines from the player data file - List lines = Files.readAllLines(playerPath, StandardCharsets.UTF_8); - - if (lines.size() < 3) { - logger.warning("Invalid data in current player file"); - return; - } - String loadedName = lines.get(0); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String newDateStr = dateFormat.format(new Date()); - Date currentDate = null; - Date newDate; - try { - newDate = dateFormat.parse(newDateStr); - currentDate = dateFormat.parse(lines.get(2)); - } catch (ParseException e) { - logger.warning("Invalid date value in current player file"); - return; - } - - // Calculate the time difference in milliseconds - long timeDifference = (newDate.getTime() - currentDate.getTime()); - - - // Check if the time difference is more than 24 hours (in milliseconds) - if (timeDifference > 24 * 60 * 60 * 1000) { - // Update the date only if the condition is met - lines.set(2, dateFormat.format(newDate)); - - try { - Files.write(playerPath, lines, StandardCharsets.UTF_8); - logger.info("Successfully updated player's date and login bonus: " + loadedName); - updateCurrencyOfCurrentPlayer(10); - } catch (IOException e) { - logger.warning("Failed to write updated player data to file: " + e.getMessage()); - throw e; - } - } else { - logger.info("Time difference is less than 24 hours, no update is made."); - } - } - - //converts a string of booleans in the form of "boolean, boolean..." to a list of booleans - public static List convertStringToBooleanList(String input) { - String[] splitStrings = input.split(","); - List booleanList = new ArrayList<>(); - - for (String s : splitStrings) { - booleanList.add(Boolean.parseBoolean(s.trim())); - } - - return booleanList; - } - - //retrieves the current player's data from the currentPlayer text file. - public Player getCurrentPlayer() throws IOException { - // Get the path to the JAR file - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8); - - // Construct the path to the player data file - Path playerPath = Paths.get(new File(jarPath).getParent(), "currentPlayer"); - - // Check if the player data file exists - if (!Files.exists(playerPath)) { - logger.warning("Player file not found at: " + playerPath); - throw new FileNotFoundException("Player file not found at: " + playerPath); - } - - // Read the lines from the player data file - List lines = Files.readAllLines(playerPath, StandardCharsets.UTF_8); - - // Check if the file contains valid data - if (lines.size() < 4) { - logger.warning("Invalid data in current player file"); - throw new IOException("Invalid data in current player file"); - } - - Player player; - try { - // Parse the player data from the file - player = new Player(lines.get(0), Integer.parseInt(lines.get(1)), lines.get(2), convertStringToBooleanList(lines.get(3))); - } catch (NumberFormatException e) { - logger.warning("Invalid value in current player file"); - throw new NumberFormatException("Invalid value in current player file"); - } - - return player; - } - public void updatePlayerItem(int itemNumber) throws IOException { - // Get the path to the JAR file - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8.toString()); - - // Construct the path to the player data file - Path playerPath = Paths.get(new File(jarPath).getParent(), "currentPlayer"); - - // Check if the player data file exists - if (!Files.exists(playerPath)) { - logger.warning("Player file not found at: " + playerPath); - throw new FileNotFoundException("Player file not found at: " + playerPath); - } - - // Read the lines from the player data file - List lines = Files.readAllLines(playerPath, StandardCharsets.UTF_8); - String itemsString = lines.get(3); - List items = convertStringToBooleanList(itemsString); - - if (!items.get(itemNumber)){ - items.set(itemNumber, true); - } - - StringBuilder itemResultBuilder = new StringBuilder(); - for (int i = 0; i < items.size(); i++) { - itemResultBuilder.append(items.get(i).toString()); - if (i < items.size() - 1) { // If it's not the last item, append ", " - itemResultBuilder.append(", "); - } - } - String itemResult = itemResultBuilder.toString(); - - lines.set(3, itemResult); - Files.write(playerPath, lines, StandardCharsets.UTF_8); - } - public void resetPlayerItem() throws IOException { - // Get the path to the JAR file - String jarPath = FileManager.class.getProtectionDomain() - .getCodeSource().getLocation().getPath(); - jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8.toString()); - - // Construct the path to the player data file - Path playerPath = Paths.get(new File(jarPath).getParent(), "currentPlayer"); - - // Check if the player data file exists - if (!Files.exists(playerPath)) { - logger.warning("Player file not found at: " + playerPath); - throw new FileNotFoundException("Player file not found at: " + playerPath); - } - - // Read the lines from the player data file - List lines = Files.readAllLines(playerPath, StandardCharsets.UTF_8); - - - lines.set(3, "false, false, false"); - Files.write(playerPath, lines, StandardCharsets.UTF_8); - } -} diff --git a/src/engine/Frame.java b/src/engine/Frame.java deleted file mode 100644 index cc9be782..00000000 --- a/src/engine/Frame.java +++ /dev/null @@ -1,93 +0,0 @@ -package engine; - -import java.awt.Insets; - -import javax.swing.JFrame; - -import screen.Screen; - -/** - * Implements a frame to show screens on. - * - * @author Roberto Izquierdo Amo - * - */ -@SuppressWarnings("serial") -public class Frame extends JFrame { - - /** Frame width. */ - private int width; - /** Frame height. */ - private int height; - /** Screen currently shown. */ - private Screen currentScreen; - /** bottom hud space not shown by getHeight to not break relative positioning **/ - private int bottomHudHeight; - - /** - * Initializes the new frame. - * - * @param width - * Frame width. - * @param height - * Frame height. - */ - public Frame(final int width, final int height, final int bottomHudHeight) { - setSize(width, height+bottomHudHeight); - setResizable(false); - setDefaultCloseOperation(EXIT_ON_CLOSE); - - setLocationRelativeTo(null); - setVisible(true); - - Insets insets = getInsets(); - this.width = width - insets.left - insets.right; - this.height = height + bottomHudHeight - insets.top + insets.bottom; - this.bottomHudHeight = bottomHudHeight; - setTitle("Invaders"); - - addKeyListener(Core.getInputManager()); - } - - /** - * Sets current screen. - * - * @param screen - * Screen to show. - * @return Return code of the finished screen. - */ - public final int setScreen(final Screen screen) { - currentScreen = screen; - currentScreen.initialize(); - return currentScreen.run(); - } - - /** - * Getter for frame width. - * - * @return Frame width. - */ - public final int getWidth() { - return this.width; - } - - /** - * Getter for frame height. - * - * @return Frame height. - */ - - public final int getHeight() { - return this.height - bottomHudHeight; - } - - /** - * Getter for bottom hud height. - * - * @return bottom hud height. - */ - - public final int getBottomHudHeight() { - return bottomHudHeight; - } -} diff --git a/src/engine/GameSettings.java b/src/engine/GameSettings.java deleted file mode 100644 index b333c547..00000000 --- a/src/engine/GameSettings.java +++ /dev/null @@ -1,70 +0,0 @@ -package engine; - -/** - * Implements an object that stores a single game's difficulty settings. - * - * @author Roberto Izquierdo Amo - * - */ -public class GameSettings { - - /** Width of the level's enemy formation. */ - private int formationWidth; - /** Height of the level's enemy formation. */ - private int formationHeight; - /** Speed of the enemies, function of the remaining number. */ - private int baseSpeed; - /** Frequency of enemy shootings, +/- 30%. */ - private int shootingFrecuency; - /** Speed of item dropping. */ - private double itemSpeed; - /** - * Constructor. - * - * @param formationWidth - * Width of the level's enemy formation. - * @param formationHeight - * Height of the level's enemy formation. - * @param baseSpeed - * Speed of the enemies. - * @param shootingFrecuency - * Frecuency of enemy shootings, +/- 30%. - */ - public GameSettings(final int formationWidth, final int formationHeight, - final int baseSpeed, final int shootingFrecuency, final double itemSpeed) { - this.formationWidth = formationWidth; - this.formationHeight = formationHeight; - this.baseSpeed = baseSpeed; - this.shootingFrecuency = shootingFrecuency; - this.itemSpeed = itemSpeed; - } - - /** - * @return the formationWidth - */ - public final int getFormationWidth() { - return formationWidth; - } - - /** - * @return the formationHeight - */ - public final int getFormationHeight() { - return formationHeight; - } - - /** - * @return the baseSpeed - */ - public final int getBaseSpeed() { - return baseSpeed; - } - - /** - * @return the shootingFrecuency - */ - public final int getShootingFrecuency() { - return shootingFrecuency; - } - -} diff --git a/src/engine/GameState.java b/src/engine/GameState.java deleted file mode 100644 index 7451fc5f..00000000 --- a/src/engine/GameState.java +++ /dev/null @@ -1,159 +0,0 @@ -package engine; - -/** - * Implements an object that stores the state of the game between levels. - * - * @author Roberto Izquierdo Amo - * - */ -public class GameState { - - /** Current game level. */ - private int level; - /** Current score. */ - private int score; - /** 1p's Lives currently remaining. */ - private int livesRemaining1; - /** 2p's Lives currently remaining. */ - private int livesRemaining2; - /** Bullets shot until now from player1. */ - private int bulletsShot1; - /** Bullets shot until now from player2. */ - private int bulletsShot2; - - /** Number of enemy ships destroyed */ - private int shipsDestroyed1; - private int shipsDestroyed2; - - /** Distinguish 1P and 2P mode. */ - private int gameMode = 0; - /** - * Constructor for 1p mode. - * - * @param level - * Current game level. - * @param score - * Current score. - * @param livesRemaining - * Lives currently remaining. - * @param bulletsShot - * Bullets shot until now. - * @param shipsDestroyed - * Ships destroyed until now. - */ - public GameState(final int level, final int score, - final int livesRemaining, final int bulletsShot, - final int shipsDestroyed) { - this.gameMode = 1; - this.level = level; - this.score = score; - this.livesRemaining1 = livesRemaining; - this.bulletsShot1 = bulletsShot; - this.shipsDestroyed1 = shipsDestroyed; - } - - /** - * Constructor for 2p mode. - * - * @param level - * Current game level. - * @param score - * Current score. - * @param livesRemaining1 - * player1's Lives currently remaining. - * @param livesRemaining2 - * player2's Lives currently remaining. - * @param bulletsShot1 - * Bullets shot until now from player1. - * @param bulletsShot2 - * Bullets shot until now from player2. - * @param shipsDestroyed - * Ships destroyed until now. - */ - public GameState(final int level, final int score, - final int livesRemaining1, final int livesRemaining2, final int bulletsShot1, final int bulletsShot2, - final int shipsDestroyed, final int shipsDestroyed2) { - this.gameMode = 2; - this.level = level; - this.score = score; - this.livesRemaining1 = livesRemaining1; - this.livesRemaining2 = livesRemaining2; - this.bulletsShot1 = bulletsShot1; - this.bulletsShot2 = bulletsShot2; - this.shipsDestroyed1 = shipsDestroyed; - this.shipsDestroyed2 = shipsDestroyed2; - } - - /** - * Getter for level. - * - * @return the level - */ - public final int getLevel() { - return level; - } - - /** - * @return the gameMode - */ - public final int getMode() { - return gameMode; - } - - /** - * @return the score - */ - public final int getScore() { - return score; - } - - /** - * Getter for remain lives from player1. - * - * @return the remain lives from player1 - */ - public final int getLivesRemaining1p() { - return livesRemaining1; - } - /** - * Getter for remain lives from player2. - * - * @return the remain lives from player2 - */ - public final int getLivesRemaining2p() { - return livesRemaining2; - } - - /** - * Getter for shot bullets from player1. - * - * @return the bulletsShot from player1 - */ - public final int getBulletsShot1() { - return bulletsShot1; - } - /** - * Getter for shot bullets from player2. - * - * @return the bulletsShot from player2 - */ - public final int getBulletsShot2() { - return bulletsShot2; - } - - /** - * @return the shipsDestroyed - */ - /** Returns the number of ships destroyed by 1p */ - public final int getShipsDestroyed() { - return shipsDestroyed1; - } - /** Returns the number of ships destroyed by 2p*/ - public final int getShipsDestroyed2() { - return shipsDestroyed2; - } - - public int livesRemaining1() { - return 0; - } -} diff --git a/src/engine/InputManager.java b/src/engine/InputManager.java deleted file mode 100644 index 97ee5fd3..00000000 --- a/src/engine/InputManager.java +++ /dev/null @@ -1,125 +0,0 @@ -package engine; - -import engine.Core; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -/** - * Manages keyboard input for the provided screen. - * - * @author Roberto Izquierdo Amo - * - */ -public final class InputManager implements KeyListener { - - /** Number of recognised keys. */ - private static final int NUM_KEYS = 256; - /** Array with the keys marked as pressed or not. */ - private static boolean[] keys; - /** Singleton instance of the class. */ - private static InputManager instance; - - private static int keyUp = 0; - - private static Integer keyCode; - private static String keyString; - private boolean checkKeyPressed=false; - private int[] keySetting = Core.getKeySettingCodeArray(); - - /** - * Private constructor. - */ - private InputManager() { - keys = new boolean[NUM_KEYS]; - } - - /** - * Returns shared instance of InputManager. - * - * @return Shared instance of InputManager. - */ - protected static InputManager getInstance() { - if (instance == null) - instance = new InputManager(); - return instance; - } - - /** - * Returns true if the provided key is currently pressed. - * - * @param keyCode - * Key number to check. - * @return Key state. - */ - public boolean isKeyDown(final int keyCode) { - return keys[keyCode]; - } - - /** - * Changes the state of the key to pressed. - * - * @param key - * Key pressed. - */ - @Override - public void keyPressed(final KeyEvent key) { - if (key.getKeyCode() >= 0 && key.getKeyCode() < NUM_KEYS) - keys[key.getKeyCode()] = true; - keyCode = key.getKeyCode(); - keyString = key.getKeyText(keyCode); - if(!(keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_SHIFT)) - checkKeyPressed = true; - } - public boolean isKeyUp(int keyCode) { - return !keys[keyCode]; - } - - - - public int countH_u=0; - public int countH_d=0; - public int one=0, two=0; - public int seven=0, eight=0; - public int speed = 0; - public int speed1=0, speed2=0; - public boolean magazine = false; - public boolean magazine2 = false; - /** - * Changes the state of the key to not pressed. - * - * @param key - * Key released. - */ - @Override - public void keyReleased(final KeyEvent key) { - if (key.getKeyCode() >= 0 && key.getKeyCode() < NUM_KEYS) - keys[key.getKeyCode()] = false; - checkKeyPressed = false; - int code = key.getKeyCode(); - if(code == keySetting[3]){countH_u++;one++;} - if(code == keySetting[4]){countH_d++;two++;} - if(code == keySetting[5]) magazine = true; - if(code == keySetting[6]) {speed++; speed1++;} - if(code == keySetting[11]) seven++; - if(code == keySetting[12]) eight++; - if(code == keySetting[13]) magazine2=true; - if(code == keySetting[14]) speed2++; - } - - - - /** - * Does nothing. - * - * @param key - * Key typed. - */ - @Override - public void keyTyped(final KeyEvent key) { - - } - - public Integer getKeyCode(){return keyCode;} - public String getKeyString(){return keyString;} - public boolean getcheck(){return checkKeyPressed;} -} \ No newline at end of file diff --git a/src/engine/MinimalFormatter.java b/src/engine/MinimalFormatter.java deleted file mode 100644 index a01fd5c7..00000000 --- a/src/engine/MinimalFormatter.java +++ /dev/null @@ -1,35 +0,0 @@ -package engine; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.logging.Formatter; -import java.util.logging.LogRecord; - -/** - * Implements a simple logging format. - * - * @author Roberto Izquierdo Amo - * - */ -public class MinimalFormatter extends Formatter { - - /** Format for the date. */ - private static final DateFormat FORMAT = new SimpleDateFormat("h:mm:ss"); - /** System line separator. */ - private static final String LINE_SEPARATOR = System - .getProperty("line.separator"); - - @Override - public final String format(final LogRecord logRecord) { - - StringBuilder output = new StringBuilder().append("[") - .append(logRecord.getLevel()).append('|') - .append(FORMAT.format(new Date(logRecord.getMillis()))) - .append("]: ").append(logRecord.getMessage()).append(' ') - .append(LINE_SEPARATOR); - - return output.toString(); - } - -} diff --git a/src/engine/Player.java b/src/engine/Player.java deleted file mode 100644 index 59d07826..00000000 --- a/src/engine/Player.java +++ /dev/null @@ -1,82 +0,0 @@ -package engine; - -import java.util.Date; - -import java.util.List; - -/** - * Implements a high currency record. - * - * @author Roberto Izquierdo Amo - * - */ -public class Player implements Comparable { - - /** Player's name. */ - private String name; - /** currency points. */ - private int currency; - private String loginTime; - /** item list */ - private List item; - - /** - * Constructor. - * - * @param name - * Player name, three letters. - * @param currency - * Player currency. - */ - public Player(final String name, final int currency, final String loginTime, final List item) { - this.name = name; - this.currency = currency; - this.loginTime = loginTime; - this.item = item; - } - - /** - * Getter for the player's name. - * - * @return Name of the player. - */ - public final String getName() { - return this.name; - } - - /** - * Getter for the player's currency. - * - * @return currency. - */ - public final int getCurrency() { - return this.currency; - } - - public final String getLoginTime() { - return this.loginTime; - } - - public final List getItem() { - return this.item; - } - - public void setName(String name) { - this.name = name; - } - - public void setCurrency(int currency) { - this.currency = currency; - } - - public void setLoginTime(String loginTime) {this.loginTime = loginTime;} - - public void setItem(List item) { - this.item = item; - } - - @Override - public int compareTo(Player o) { - return 0; - } -} diff --git a/src/engine/Replayability.java b/src/engine/Replayability.java deleted file mode 100644 index 0252ca08..00000000 --- a/src/engine/Replayability.java +++ /dev/null @@ -1,14 +0,0 @@ -package engine; - -public class Replayability { - - private static int replay; - - public Replayability(int replay){ - this.replay = replay; - } - - public int getReplay(){ - return replay; - } -} diff --git a/src/engine/Score.java b/src/engine/Score.java deleted file mode 100644 index 382f96d9..00000000 --- a/src/engine/Score.java +++ /dev/null @@ -1,65 +0,0 @@ -package engine; - -/** - * Implements a high score record. - * - * @author Roberto Izquierdo Amo - * - */ -public class Score implements Comparable { - - /** Player's name. */ - private String name; - /** Score points. */ - private int score; - - /** - * Constructor. - * - * @param name - * Player name, three letters. - * @param score - * Player score. - */ - public Score(final String name, final int score) { - this.name = name; - this.score = score; - } - - - - - /** - * Getter for the player's name. - * - * @return Name of the player. - */ - public final String getName() { - return this.name; - } - - /** - * Getter for the player's score. - * - * @return High score. - */ - public final int getScore() { - return this.score; - } - - /** - * Orders the scores descending by score. - * - * @param score - * Score to compare the current one with. - * @return Comparison between the two scores. Positive if the current one is - * smaller, positive if its bigger, zero if its the same. - */ - @Override - public final int compareTo(final Score score) { - int comparison = this.score < score.getScore() ? 1 : this.score > score - .getScore() ? -1 : 0; - return comparison; - } - -} diff --git a/src/engine/Settings.java b/src/engine/Settings.java deleted file mode 100644 index a2c7dc57..00000000 --- a/src/engine/Settings.java +++ /dev/null @@ -1,51 +0,0 @@ -package engine; - -/** - * Implements a high score record. - * - * @author Roberto Izquierdo Amo - * - */ -public class Settings{ - - /** Setting's name. */ - public String name; - /** Setting's value. */ - public int value; - - /** - * Constructor. - * - * @param name - * Player name, three letters. - * @param value - * Player score. - */ - public Settings(final String name, final int value) { - this.name = name; - this.value = value; - } - - - - - - /** - * Getter for the setting's name. - * - * @return Name of the player. - */ - public final String getName() { - return this.name; - } - - /** - * Getter for the setting's value. - * - * @return High score. - */ - public final int getValue() { - return this.value; - } - -} diff --git a/src/engine/SoundManager.java b/src/engine/SoundManager.java deleted file mode 100644 index 552d392f..00000000 --- a/src/engine/SoundManager.java +++ /dev/null @@ -1,242 +0,0 @@ -package engine; - -import java.io.File; -import java.io.IOException; -import java.util.*; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.Clip; -import javax.sound.sampled.LineEvent; -import javax.sound.sampled.FloatControl; -import javax.sound.sampled.FloatControl.Type; - -public class SoundManager { - private static HashMap clips = new HashMap<>(); - private static ArrayList bgms = new ArrayList<>(); - private static float masterVolume; - - static { - try { - masterVolume = Core.getFileManager().loadSettings().get(0).getValue(); - } catch (IOException e) { - Core.getLogger().warning("Couldn't load Settings!"); - } - } - - private static final float minimum = -80; - private static final float maximum = 6; - private static final float one = ((Math.abs(minimum)+Math.abs(maximum))/100); - private static float master = getValue(masterVolume); - - public static void playSound(String soundFilePathShort, String clipName, boolean isLoop, boolean isBgm) { - String soundFilePath = "res/sound/"+soundFilePathShort+".wav"; - Clip clip = clips.get(clipName); - if (clip != null && clip.isActive()) { - return; - } - new Thread(new Runnable() { - public void run() { - try { - File soundFile = new File(soundFilePath); - AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile); - Clip clip = AudioSystem.getClip(); - clip.open(audioIn); - FloatControl floatControl = (FloatControl)clip.getControl(Type.MASTER_GAIN); - floatControl.setValue(master); - clips.put(clipName, clip); - if(isBgm) { - bgms.add(clip); - } else { - clip.addLineListener(event -> { - if (event.getType() == LineEvent.Type.STOP) { - clip.close(); - } - }); - } - if (isLoop) { - clip.loop(-1); - } else { - clip.start(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); - } - - public static void playSound(String soundFilePathShort, String clipName, boolean isLoop, boolean isBgm, float fadeInSpeed) { - String soundFilePath = "res/sound/"+soundFilePathShort+".wav"; - Clip clip = clips.get(clipName); - if (clip != null && clip.isActive()) { - return; - } - new Thread(new Runnable() { - public void run() { - try { - File soundFile = new File(soundFilePath); - AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile); - Clip clip = AudioSystem.getClip(); - clip.open(audioIn); - FloatControl floatControl = (FloatControl) clip.getControl(Type.MASTER_GAIN); - floatControl.setValue(minimum); - clips.put(clipName, clip); - if(isBgm) { - bgms.add(clip); - } else { - clip.addLineListener(event -> { - if (event.getType() == LineEvent.Type.STOP) { - clip.close(); - } - }); - } - if (isLoop) { - clip.loop(-1); - } else { - clip.start(); - } - fadeIn(clip, fadeInSpeed); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); - } - - public static void stopSound(String clipName) { - Clip clip = clips.get(clipName); - if (clip != null && clip.isActive()) { - bgms.remove(clip); - clips.remove(clipName); - clip.close(); - } - } - - public static void stopSound(String clipName, float fadeoutSpeed) { - Clip clip = clips.get(clipName); - if (clip != null && clip.isActive()) { - new Thread(new Runnable() { - public void run() { - FloatControl floatControl = (FloatControl) clips.get(clipName).getControl(Type.MASTER_GAIN); - float volume = masterVolume; - float tmpOne = volume/100; - float minimumValue = getValue(0); - float value = getValue(volume); - while(floatControl.getValue()>minimumValue){ - if(value maximum) master = maximum; - else if(master < minimum) master = minimum; - for (Clip clip : clips.values()) { - if (clip != null && clip.isActive()) { - FloatControl floatControl = (FloatControl) clip.getControl(Type.MASTER_GAIN); - floatControl.setValue(master); - } - } - } - - public static void bgmSetting(boolean bgm){ - if(bgm){ - for(Clip clip : bgms){ - FloatControl floatControl = (FloatControl)clip.getControl(Type.MASTER_GAIN); - floatControl.setValue(getValue(masterVolume)); - } - } - else{ - for(Clip clip : bgms){ - FloatControl floatControl = (FloatControl)clip.getControl(Type.MASTER_GAIN); - floatControl.setValue(getValue(0)); - } - } - } - - private static float getVolume(float res) { - double temp = (res - minimum) / one; - return (float) Math.pow(10, temp / 50); - } - - private static float getValue(float volume){ - float res = (float)(minimum + one*(50*Math.log10(volume))); - if(resmaximum) return maximum; - else return res; - } - - public static boolean isPlaying(String clipName){ - Clip clip = clips.get(clipName); - if(clip!=null && clip.isActive()) return true; - else return false; - } - - public static void setVolume(String clipName, float percent){ - Clip clip = clips.get(clipName); - FloatControl floatcontrol = (FloatControl)clip.getControl(Type.MASTER_GAIN); - float volume = getVolume(floatcontrol.getValue()); - floatcontrol.setValue(getValue((percent/100)*volume)); - } - - public static void playBGM(int levelNum) { - String soundFilePathShort = "BGM/B_Level" + Integer.toString(levelNum); - String clipName = "level" + Integer.toString(levelNum); - playSound(soundFilePathShort, clipName, true, true); - } - - public static void stopBGM(int levelNum, float fadeOutSpeed) { - String clipName = "level" + Integer.toString(levelNum); - stopSound(clipName, fadeOutSpeed); - } - - public static void resetBGM(){ - for (int i = 0; i < 7; i++) { - String clipName = "level" + Integer.toString(i); - stopSound(clipName); - } - } -} \ No newline at end of file diff --git a/src/entity/Bullet.java b/src/entity/Bullet.java deleted file mode 100644 index ecdd11b9..00000000 --- a/src/entity/Bullet.java +++ /dev/null @@ -1,94 +0,0 @@ -package entity; - -import java.awt.Color; - -import engine.DrawManager.SpriteType; - -/** - * Implements a bullet that moves vertically up or down. - * - * @author Roberto Izquierdo Amo - * - */ -public class Bullet extends Entity { - - /** - * Speed of the bullet, positive or negative depending on direction - - * positive is down. - */ - private int speed; - - /** - * Entity that shot a bullet - * 0 for enemy, 1 for first-player, 2 for second-player - */ - private int shooter; - - /** - * Constructor, establishes the bullet's properties. - * - * @param positionX - * Initial position of the bullet in the X axis. - * @param positionY - * Initial position of the bullet in the Y axis. - * @param speed - * Speed of the bullet, positive or negative depending on - * direction - positive is down. - */ - public Bullet(final int positionX, final int positionY, final int speed, final int shooter) { - super(positionX, positionY, 3 * 2, 5 * 2, Color.WHITE); - - this.speed = speed; - this.shooter = shooter; - setSprite(); - } - - /** - * Sets correct sprite for the bullet, based on speed. - */ - public final void setSprite() { - if (speed < 0) - this.spriteType = SpriteType.Bullet; - else - this.spriteType = SpriteType.EnemyBullet; - } - /** - * Sets correct sprite for the Bigger bullet, based on speed. - */ - public final void setBiggerSprite() { - if (speed < 0) - this.spriteType = SpriteType.BiggerBullet; - else - this.spriteType = SpriteType.BiggerEnemyBullet; - } - - /** - * Updates the bullet's position. - */ - public final void update() { - this.positionY += this.speed; - } - - /** - * Setter of the speed of the bullet. - * - * @param speed - * New speed of the bullet. - */ - public final void setSpeed(final int speed) { - this.speed = speed; - } - - /** - * Getter for the speed of the bullet. - * - * @return Speed of the bullet. - */ - public final int getSpeed() { - return this.speed; - } - - public final int getShooter() { - return this.shooter; - } -} diff --git a/src/entity/BulletPool.java b/src/entity/BulletPool.java deleted file mode 100644 index 40539035..00000000 --- a/src/entity/BulletPool.java +++ /dev/null @@ -1,76 +0,0 @@ -package entity; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** - * Implements a pool of recyclable bullets. - * - * @author Roberto Izquierdo Amo - * - */ -public final class BulletPool { - - /** Set of already created bullets. */ - private static Map> pool = new HashMap>(); - - /** - * Constructor, not called. - */ - private BulletPool() { - - } - - /** - * Returns a bullet from the pool if one is available, a new one if there - * isn't. - * - * @param positionX - * Requested position of the bullet in the X axis. - * @param positionY - * Requested position of the bullet in the Y axis. - * @param speed - * Requested speed of the bullet, positive or negative depending - * on direction - positive is down. - * @param shooter - * Player who shot the bullet. - * 0 for enemy, 1 for first player, 2 for second player. - * @return Requested bullet. - */ - public static Bullet getBullet(final int positionX, - final int positionY, final int speed, final int shooter) { - Bullet bullet; - if (pool.containsKey(shooter) && !pool.get(shooter).isEmpty()) { - bullet = pool.get(shooter).iterator().next(); - pool.get(shooter).remove(bullet); - bullet.setPositionX(positionX - bullet.getWidth() / 2); - bullet.setPositionY(positionY); - bullet.setSpeed(speed); - bullet.setSprite(); - // Will add a function to select the Bigger version and the base version later. -// bullet.setBiggerSprite(); - } else { - bullet = new Bullet(positionX, positionY, speed, shooter); - bullet.setPositionX(positionX - bullet.getWidth() / 2); - } - return bullet; - } - - /** - * Adds one or more bullets to the list of available ones. - * - * @param bullets - * Bullets to recycle. - */ - public static void recycle(final Set bullets) { - for (Bullet bullet : bullets) { - int shooter = bullet.getShooter(); - if (!pool.containsKey(shooter)) { - pool.put(shooter, new HashSet()); - } - pool.get(shooter).add(bullet); - } - } -} diff --git a/src/entity/EnemyShip.java b/src/entity/EnemyShip.java deleted file mode 100644 index 5d36702e..00000000 --- a/src/entity/EnemyShip.java +++ /dev/null @@ -1,157 +0,0 @@ -package entity; - -import java.awt.Color; -import java.util.Random; -import java.util.Set; - -import engine.Cooldown; -import engine.Core; -import engine.DrawManager.SpriteType; -import engine.GameState; -import engine.SoundManager; - -/** - * Implements a enemy ship, to be destroyed by the player. - * - * @author Roberto Izquierdo Amo - * - */ -public class EnemyShip extends Entity { - - /** Point value of a bonus enemy. */ - private static final int BONUS_TYPE_POINTS = 100; - - public static final double ITEM_PROPORTION = 0.1; - public static final int RANDOM_BOUND = 10000; - - /** Cooldown between sprite changes. */ - protected Cooldown animationCooldown; - /** Checks if the ship has been hit by a bullet. */ - private boolean isDestroyed; - /** 난이도 조절에 사용할 현재 스테이트 */ - private GameState gameState; - /** Values of the ship, in points, when destroyed. */ - protected int pointValue; - - private boolean hasItem; - - private int itemRange; - - /** 적의 체력 */ - protected int HP; - - /** 총알 속도 */ - protected static final int BULLET_SPEED = 4; - - /** - * Constructor, establishes the ship's properties. - * - * @param positionX - * Initial position of the ship in the X axis. - * @param positionY - * Initial position of the ship in the Y axis. - * @param spriteType - * Sprite type, image corresponding to the ship. - */ - public EnemyShip(final int positionX, final int positionY, - final SpriteType spriteType, final GameState gameState) { - super(positionX, positionY, 12 * 2, 8 * 2, Color.WHITE); - this.gameState = gameState; - this.spriteType = spriteType; - this.animationCooldown = Core.getCooldown(500); - this.isDestroyed = false; - this.itemRange = new Random().nextInt(RANDOM_BOUND); - this.hasItem = itemGenerator(itemRange); - this.HP = this.gameState.getLevel(); - } - - /** - * Constructor, establishes the ship's properties for a special ship, with - * known starting properties. - */ - public EnemyShip() { - super(-32, 60, 16 * 2, 7 * 2, Color.RED); - - this.spriteType = SpriteType.EnemyShipSpecial; - this.isDestroyed = false; - this.pointValue = BONUS_TYPE_POINTS; - } - - /** - * Getter for the score bonus if this ship is destroyed. - * - * @return Value of the ship. - */ - public final int getPointValue() { - return this.pointValue; - } - - /** - * Moves the ship the specified distance. - * - * @param distanceX - * Distance to move in the X axis. - * @param distanceY - * Distance to move in the Y axis. - */ - public final void move(final int distanceX, final int distanceY) { - this.positionX += distanceX; - this.positionY += distanceY; - } - - /** - * Updates attributes, mainly used for animation purposes. - */ - public void update() { - return; - } - - public void shoot(final Set bullets,Cooldown shootingCooldown) { - bullets.add(BulletPool.getBullet(positionX - + width / 2, positionY, BULLET_SPEED, 0)); - shootingCooldown.timedown(0); - - } - - /** - * Destroys the ship, causing an explosion. - */ - public final void destroy() { - this.HP--; - if (this.HP <= 0) { - SoundManager.playSound("SFX/S_Enemy_Destroy_a", "Enemy_destroyed", false, false); - this.isDestroyed = true; - this.spriteType = SpriteType.Explosion; - } - } - - public final void destroyByBomb(){ - this.HP = 0; - this.isDestroyed = true; - this.spriteType = SpriteType.Explosion; - } - /** - * Checks if the ship has been destroyed. - * - * @return True if the ship has been destroyed. - */ - public final boolean isDestroyed() {return this.isDestroyed;} - public final int getpositionY() { return this.positionY; } - - - /** - * 랜덤으로 Item을 가진 EnemyShip 생성*/ - private boolean itemGenerator(int rand_int){ - if(rand_int < (int)(RANDOM_BOUND * ITEM_PROPORTION)) - return true; - else - return false; - } - - /** EnemyShip이 아이템을 지닌 객체인지 확인 */ - public final boolean hasItem(){ - return this.hasItem; - } - - public int getItemRange(){return this.itemRange;} -} \ No newline at end of file diff --git a/src/entity/EnemyShipA.java b/src/entity/EnemyShipA.java deleted file mode 100644 index ed87e210..00000000 --- a/src/entity/EnemyShipA.java +++ /dev/null @@ -1,40 +0,0 @@ -package entity; - -import engine.Cooldown; -import engine.DrawManager; -import engine.GameState; - -import java.util.Set; - -public class EnemyShipA extends EnemyShip { - /** HP의 배율 */ - private final double HPPOWER = .8; - /** 총알의 속도 배율 */ - private final double BULLETSPEEDPOWER = 0.5; - /** 슈팅 쿨다운 배율 */ - private final double BULLETCOOLDOWN = 0; - /** 제거시 올라가는 점수 */ - private final int POINT = 30; - public EnemyShipA(final int positionX, final int positionY, - final DrawManager.SpriteType spriteType, final GameState gameState) { - super(positionX, positionY, spriteType, gameState); - super.HP = (int)(super.HP * HPPOWER); - super.pointValue = POINT; - } - - public final void update() { - if (this.animationCooldown.checkFinished()) { - this.animationCooldown.reset(); - if (spriteType == DrawManager.SpriteType.EnemyShipA1) - spriteType = DrawManager.SpriteType.EnemyShipA2; - else - spriteType = DrawManager.SpriteType.EnemyShipA1; - } - } - public final void shoot(final Set bullets, Cooldown shootingCooldown) { - bullets.add(BulletPool.getBullet(positionX - + width / 2, positionY, (int)(super.BULLET_SPEED * BULLETSPEEDPOWER),0)); - shootingCooldown.timedown(BULLETCOOLDOWN); - } - -} diff --git a/src/entity/EnemyShipB.java b/src/entity/EnemyShipB.java deleted file mode 100644 index 4b1aed63..00000000 --- a/src/entity/EnemyShipB.java +++ /dev/null @@ -1,40 +0,0 @@ -package entity; - -import engine.Cooldown; -import engine.DrawManager; -import engine.GameState; - -import java.util.Set; - -public class EnemyShipB extends EnemyShip { - /** HP의 배율 */ - private final double HPPOWER = .4; - /** 총알의 속도 배율 */ - private final double BULLETSPEEDPOWER = 1; - /** 슈팅 쿨다운 배율 */ - private final double BULLETCOOLDOWN = 0.25; - /** 제거시 올라가는 점수 */ - private final int POINT = 10; - public EnemyShipB(final int positionX, final int positionY, - final DrawManager.SpriteType spriteType, final GameState gameState) { - super(positionX, positionY, spriteType, gameState); - super.HP = (int)(super.HP * HPPOWER); - super.pointValue = POINT; - } - - public final void update() { - if (this.animationCooldown.checkFinished()) { - this.animationCooldown.reset(); - if (spriteType == DrawManager.SpriteType.EnemyShipB1) - spriteType = DrawManager.SpriteType.EnemyShipB2; - else - spriteType = DrawManager.SpriteType.EnemyShipB1; - } - } - public final void shoot(final Set bullets, Cooldown shootingCooldown) { - bullets.add(BulletPool.getBullet(positionX - + width / 2, positionY, (int)(super.BULLET_SPEED * BULLETSPEEDPOWER),0)); - shootingCooldown.timedown(BULLETCOOLDOWN); - } - -} diff --git a/src/entity/EnemyShipC.java b/src/entity/EnemyShipC.java deleted file mode 100644 index 618a4a26..00000000 --- a/src/entity/EnemyShipC.java +++ /dev/null @@ -1,39 +0,0 @@ -package entity; - -import engine.Cooldown; -import engine.DrawManager; -import engine.GameState; - -import java.util.Set; - -public class EnemyShipC extends EnemyShip { - /** HP의 배율 */ - private final double HPPOWER = .1; - /** 총알의 속도 배율 */ - private final double BULLETSPEEDPOWER = 2; - /** 슈팅 쿨다운 배율 */ - private final double BULLETCOOLDOWN = 0.5; - /** 제거시 올라가는 점수 */ - private final int POINT = 20; - public EnemyShipC(final int positionX, final int positionY, - final DrawManager.SpriteType spriteType, final GameState gameState) { - super(positionX, positionY, spriteType, gameState); - super.HP = (int)(super.HP * HPPOWER); - super.pointValue = POINT; - } - - public final void update() { - if (this.animationCooldown.checkFinished()) { - this.animationCooldown.reset(); - if (spriteType == DrawManager.SpriteType.EnemyShipC1) - spriteType = DrawManager.SpriteType.EnemyShipC2; - else - spriteType = DrawManager.SpriteType.EnemyShipC1; - } - } - public final void shoot(final Set bullets, Cooldown shootingCooldown) { - bullets.add(BulletPool.getBullet(positionX - + width / 2, positionY, (int)(super.BULLET_SPEED * BULLETSPEEDPOWER),0)); - shootingCooldown.timedown(BULLETCOOLDOWN); - } -} diff --git a/src/entity/EnemyShipFormation.java b/src/entity/EnemyShipFormation.java deleted file mode 100644 index 86944923..00000000 --- a/src/entity/EnemyShipFormation.java +++ /dev/null @@ -1,630 +0,0 @@ -package entity; - -import java.util.*; -import java.util.logging.Logger; - -import engine.*; -import screen.Screen; -import engine.DrawManager.SpriteType; - -/** - * Groups enemy ships into a formation that moves together. - * - * @author Roberto Izquierdo Amo - * - */ -public class EnemyShipFormation implements Iterable { - - /** Initial position in the x-axis. */ - private static final int INIT_POS_X = 20; - /** Initial position in the y-axis. */ - private static final int INIT_POS_Y = 100; - /** Distance between ships. */ - private static final int SEPARATION_DISTANCE = 40; - /** Proportion of C-type ships. */ - private static final double PROPORTION_C = 0.2; - /** Proportion of B-type ships. */ - private static final double PROPORTION_B = 0.4; - /** Lateral speed of the formation. */ - private static final int X_SPEED = 8; - /** Downwards speed of the formation. */ - private static final int Y_SPEED = 4; - /** Proportion of differences between shooting times. */ - private static final double SHOOTING_VARIANCE = .2; - /** Margin on the sides of the screen. */ - private static final int SIDE_MARGIN = 20; - /** Margin on the bottom of the screen. */ - private static final int BOTTOM_MARGIN = 80; - /** Distance to go down each pass. */ - private static final int DESCENT_DISTANCE = 20; - /** Minimum speed allowed. */ - private static final int MINIMUM_SPEED = 10; - /** DrawManager instance. */ - private DrawManager drawManager; - /** Application logger. */ - private Logger logger; - /** Screen to draw ships on. */ - private Screen screen; - /** current gamestate*/ - private GameState gameState; - /** List of enemy ships forming the formation. */ - private List> enemyShips; - /** Minimum time between shots. */ - private Cooldown shootingCooldown; - /** Number of ships in the formation - horizontally. */ - private int nShipsWide; - /** Number of ships in the formation - vertically. */ - private int nShipsHigh; - /** Time between shots. */ - private int shootingInterval; - /** Variance in the time between shots. */ - private int shootingVariance; - /** Initial ship speed. */ - private int baseSpeed; - /** Speed of the ships. */ - private int movementSpeed; - /** Current direction the formation is moving on. */ - private Direction currentDirection; - /** Direction the formation was moving previously. */ - private Direction previousDirection; - /** Interval between movements, in frames. */ - private int movementInterval; - /** Total width of the formation. */ - private int width; - /** Total height of the formation. */ - private int height; - /** Position in the x-axis of the upper left corner of the formation. */ - private int positionX; - /** Position in the y-axis of the upper left corner of the formation. */ - private int positionY; - /** Width of one ship. */ - private int shipWidth; - /** Height of one ship. */ - private int shipHeight; - /** List of ships that are able to shoot. */ - private List shooters; - /** Number of not destroyed ships. */ - private int shipCount; - /** check where the last ship is. */ - private int flag = 1; - /** Speed of the bullets shot by the members. */ - private int bulletSpeed = 4; - /** need to make complex movements. */ - private boolean moreDiff = false; - /** speed of complex movements. */ - private int complexSpeed; - /** check the last stage. */ - private boolean lastStage = false; - /** setting the x position of the last stage ships. */ - private int setXpos; - /** track the y position of the last stage ships. */ - private int trackYpos; - /** check to print only one log: The last enemy ship moves faster. */ - private int checkFirst = 1; - - /** Directions the formation can move. */ - private enum Direction { - /** Movement to the right side of the screen. */ - RIGHT, - /** Movement to the left side of the screen. */ - LEFT, - /** Movement to the bottom of the screen. */ - DOWN - }; - - /** - * Constructor, sets the initial conditions. - * - * @param gameSettings - * Current game settings. - */ - public EnemyShipFormation(final GameSettings gameSettings, final GameState gameState) { - this.gameState = gameState; - this.drawManager = Core.getDrawManager(); - this.logger = Core.getLogger(); - this.enemyShips = new ArrayList>(); - this.currentDirection = Direction.RIGHT; - this.movementInterval = 0; - this.nShipsWide = gameSettings.getFormationWidth(); - this.nShipsHigh = gameSettings.getFormationHeight(); - this.shootingInterval = gameSettings.getShootingFrecuency(); - this.shootingVariance = (int) (gameSettings.getShootingFrecuency() - * SHOOTING_VARIANCE); - this.baseSpeed = gameSettings.getBaseSpeed(); - this.movementSpeed = this.baseSpeed; - this.positionX = INIT_POS_X; - this.positionY = INIT_POS_Y; - this.shooters = new ArrayList(); - this.setXpos = INIT_POS_X; - SpriteType spriteType; - - this.logger.info("Initializing " + nShipsWide + "x" + nShipsHigh - + " ship formation in (" + positionX + "," + positionY + ")"); - - // Each sub-list is a column on the formation. - for (int i = 0; i < this.nShipsWide; i++) - this.enemyShips.add(new ArrayList()); - - if (nShipsWide > 7) - lastStage = true; - - for (List column : this.enemyShips) { - int ship_index = 0; - for (int i = 0; i < this.nShipsHigh; i++) { - if (i / (float) this.nShipsHigh < PROPORTION_C) - spriteType = SpriteType.EnemyShipC1; - else if (i / (float) this.nShipsHigh < PROPORTION_B - + PROPORTION_C) - spriteType = SpriteType.EnemyShipB1; - else - spriteType = SpriteType.EnemyShipA1; - - EnemyShip enemyShip = null; - - // In the last stage, odd row ships initial position set differently. - if (lastStage) { - if (ship_index%2!=0) { - this.setXpos = 120; - } else { - this.setXpos = positionX; - } - } - - switch (spriteType) - { - case EnemyShipA1: - enemyShip = new EnemyShipA((SEPARATION_DISTANCE - * this.enemyShips.indexOf(column)) - + setXpos, (SEPARATION_DISTANCE * i) - + positionY, spriteType,gameState); - break; - case EnemyShipB1: - enemyShip = new EnemyShipB((SEPARATION_DISTANCE - * this.enemyShips.indexOf(column)) - + setXpos, (SEPARATION_DISTANCE * i) - + positionY, spriteType,gameState); - break; - case EnemyShipC1: - enemyShip = new EnemyShipC((SEPARATION_DISTANCE - * this.enemyShips.indexOf(column)) - + setXpos, (SEPARATION_DISTANCE * i) - + positionY, spriteType,gameState); - break; - default: - enemyShip = new EnemyShip((SEPARATION_DISTANCE - * this.enemyShips.indexOf(column)) - + setXpos, (SEPARATION_DISTANCE * i) - + positionY, spriteType,gameState); - } - column.add(enemyShip); - this.shipCount++; - ship_index++; - } - } - - this.shipWidth = this.enemyShips.get(0).get(0).getWidth(); - this.shipHeight = this.enemyShips.get(0).get(0).getHeight(); - - this.width = (this.nShipsWide - 1) * SEPARATION_DISTANCE - + this.shipWidth; - this.height = (this.nShipsHigh - 1) * SEPARATION_DISTANCE - + this.shipHeight; - - for (List column : this.enemyShips) - this.shooters.add(column.get(column.size() - 1)); - - if (nShipsHigh > 5) - moreDiff = true; - - if (moreDiff) - complexSpeed = 8; - else - complexSpeed = 0; - } - - /** - * Associates the formation to a given screen. - * - * @param newScreen - * Screen to attach. - */ - public final void attach(final Screen newScreen) { - screen = newScreen; - } - - /** - * Draws every individual component of the formation. - */ - public final void draw() { - for (List column : this.enemyShips) - for (EnemyShip enemyShip : column) - drawManager.drawEntity(enemyShip, enemyShip.getPositionX(), - enemyShip.getPositionY()); - } - - /** - * Updates the position of the ships. - */ - public final void update() { - if(this.shootingCooldown == null) { - this.shootingCooldown = Core.getVariableCooldown(shootingInterval, - shootingVariance); - this.shootingCooldown.reset(); - } - cleanUp(); - - int movementX = 0; - int movementY = 0; - double remainingProportion = (double) this.shipCount - / (this.nShipsHigh * this.nShipsWide); - this.movementSpeed = (int) (Math.pow(remainingProportion, 2) - * this.baseSpeed); - this.movementSpeed += MINIMUM_SPEED; - - /** If the number of remain enemyShip is one, it moves quickly in odd row. */ - if(shipCount == 1 && flag == 1){ - if(checkFirst==1){ - this.movementSpeed = 5; - this.logger.info("The last enemy ship moves faster"); - checkFirst++; - } - } - movementInterval++; - if (movementInterval >= this.movementSpeed) { - movementInterval = 0; - - // Consider irregular movements to prevent the formation from going out of the game screen. - if (moreDiff) - positionX += complexSpeed; - - boolean isAtBottom = positionY - + this.height > screen.getHeight() - BOTTOM_MARGIN; - boolean isAtRightSide = positionX - + this.width >= screen.getWidth() - SIDE_MARGIN; - boolean isAtLeftSide = positionX <= SIDE_MARGIN; - boolean isAtHorizontalAltitude = positionY % DESCENT_DISTANCE == 0; - - if (currentDirection == Direction.DOWN) { - if (isAtHorizontalAltitude) { - if (previousDirection == Direction.RIGHT) { - currentDirection = Direction.LEFT; - this.logger.info("Formation now moving left 1"); - } else { - currentDirection = Direction.RIGHT; - this.logger.info("Formation now moving right 2"); - } - } - } else if (currentDirection == Direction.LEFT) { - if (isAtLeftSide) { - if (!isAtBottom) { - previousDirection = currentDirection; - currentDirection = Direction.DOWN; - this.logger.info("Formation now moving down 3"); - trackYpos++; - } else { - currentDirection = Direction.RIGHT; - this.logger.info("Formation now moving right 4"); - } - /** if ship remains one switch flag. - * it works only on odd row - * */ - if (shipCount == 1) flag *= -1; - } - } else { - if (isAtRightSide) { - if (!isAtBottom) { - previousDirection = currentDirection; - currentDirection = Direction.DOWN; - this.logger.info("Formation now moving down 5"); - trackYpos++; - } else { - currentDirection = Direction.LEFT; - this.logger.info("Formation now moving left 6"); - } - /** if ship remains one switch flag. - * it works only on odd row - * */ - if(shipCount==1) flag*= -1; - } - } - - if (currentDirection == Direction.RIGHT) - movementX = X_SPEED; - else if (currentDirection == Direction.LEFT) - movementX = -X_SPEED; - else - movementY = Y_SPEED; - - positionX += movementX; - positionY += movementY; - - // Cleans explosions. - List destroyed; - for (List column : this.enemyShips) { - destroyed = new ArrayList(); - for (EnemyShip ship : column) { - if (ship != null && ship.isDestroyed()) { - destroyed.add(ship); - this.logger.info("Removed enemy " - + column.indexOf(ship) + " from column " - + this.enemyShips.indexOf(column)); - } - } - column.removeAll(destroyed); - } - - // From level 4, the ships moves more complicatedly. - if (moreDiff) { - for (List column : this.enemyShips) { - for (EnemyShip enemyShip : column) { - if ((int)((enemyShip.getpositionY()-100)/40)%2!=0) { - enemyShip.move(complexSpeed, 0); - } else - enemyShip.move(-complexSpeed, 0); - } - } - complexSpeed = -complexSpeed; - } - - // Change movementX value according to trackYpos variable only in last stage. - if (lastStage) { - if (trackYpos > 1) { - movementX = -movementX; - } - } - - for (List column : this.enemyShips) - for (EnemyShip enemyShip : column) { - // In the last stage, the enemy's ships started out in different positions, - // so their coordinates changed accordingly. - if (lastStage) { - if ((int)((enemyShip.getpositionY() - 100) / 40) % 2 != 0) { - enemyShip.move(-movementX, movementY); - } else { - enemyShip.move(movementX, movementY); - } - } else { - enemyShip.move(movementX, movementY); - } - enemyShip.update(); - } - } - } - - /** - * Cleans empty columns, adjusts the width and height of the formation. - */ - private void cleanUp() { - Set emptyColumns = new HashSet(); - int maxColumn = 0; - int minPositionY = Integer.MAX_VALUE; - for (List column : this.enemyShips) { - if (!column.isEmpty()) { - // Height of this column - int columnSize = column.get(column.size() - 1).positionY - - this.positionY + this.shipHeight; - maxColumn = Math.max(maxColumn, columnSize); - minPositionY = Math.min(minPositionY, column.get(0) - .getPositionY()); - } else { - // Empty column, we remove it. - emptyColumns.add(this.enemyShips.indexOf(column)); - } - } - for (int index : emptyColumns) { - this.enemyShips.remove(index); - logger.info("Removed column " + index); - } - - int leftMostPoint = 0; - int rightMostPoint = 0; - - for (List column : this.enemyShips) { - if (!column.isEmpty()) { - if (leftMostPoint == 0) - leftMostPoint = column.get(0).getPositionX(); - rightMostPoint = column.get(0).getPositionX(); - } - } - - this.width = rightMostPoint - leftMostPoint + this.shipWidth; - this.height = maxColumn; - - this.positionX = leftMostPoint; - this.positionY = minPositionY; - } - - /** - * Shoots a bullet downwards. - * - * @param bullets - * Bullets set to add the bullet being shot. - */ - public final void shoot(final Set bullets) { - // For now, only ships in the bottom row are able to shoot. - - if (this.shootingCooldown.checkFinished()) { - this.shootingCooldown.reset(); - /** if shipcount remains one, Bullet_speed is speed up. */ - if(shipCount == 1) { - if (flag == 1){ - bulletSpeed = 8; - } - else{ - bulletSpeed = 4; - } - } - ArrayList shot = new ArrayList<>();// 적이 한번만 발사 - for (int i=0;i column : this.enemyShips) - for (int i = 0; i < column.size(); i++) - if (column.get(i).equals(destroyedShip)) { - column.get(i).destroy(); - int row = this.enemyShips.indexOf(column); - this.logger.info("Destroyed ship in (" - + row + "," + i + ")"); - } - - if (this.shooters.contains(destroyedShip)) { - int destroyedShipIndex = this.shooters.indexOf(destroyedShip); - int destroyedShipColumnIndex = -1; - - for (List column : this.enemyShips) - if (column.contains(destroyedShip)) { - destroyedShipColumnIndex = this.enemyShips.indexOf(column); - break; - } - - EnemyShip nextShooter = getNextShooter(this.enemyShips - .get(destroyedShipColumnIndex)); - - if (nextShooter != null) - this.shooters.set(destroyedShipIndex, nextShooter); - else { - this.shooters.remove(destroyedShipIndex); - this.logger.info("Shooters list reduced to " - + this.shooters.size() + " members."); - if (this.shooters.isEmpty()) - SoundManager.playSound("SFX/S_LevelClear", "level_start_count", false, false); - } - } - if (destroyedShip.isDestroyed()) this.shipCount--; - } - - /** - * Destroys a ship by bomb. - * - * @param destroyedShip - * Ship to be destroyed first. - * - * @return destroyedByBombEnemyShips - * List of Enemy ships destroyed by bomb. - */ - public final List destroyByBomb(final EnemyShip destroyedShip) { - List destroyedByBombEnemyShips = new ArrayList<>(); - int howManyEnemyIsDead = 0; - - int[] dx = {0, 0, 1, 1, 1, -1, -1, -1}; - int[] dy = {-1, 1, -1, 0, 1, -1, 0, 1}; - - for (int i = 0; i < this.enemyShips.size(); i++){ - for (int j = 0; j < this.enemyShips.get(i).size(); j++) { - if (this.enemyShips.get(i).get(j) == destroyedShip) { - destroyedByBombEnemyShips.add(this.enemyShips.get(i).get(j)); - this.enemyShips.get(i).get(j).destroyByBomb(); - this.logger.info("Destroyed ship in (" - + i + "," + j + ")"); - howManyEnemyIsDead++; - - int xPos = destroyedShip.positionX; - int yPos = destroyedShip.positionY; - - for(int n = 0; n < 8; n++){ - int nx = i + dx[n]; int ny = j + dy[n]; - if(!(nx >= 0 && nx <= this.enemyShips.size() - 1 && ny >= 0 && ny <= this.enemyShips.get(nx).size() - 1)) continue; - EnemyShip enemyShip = this.enemyShips.get(nx).get(ny); - if(enemyShip.positionX - xPos > 40 || enemyShip.positionX - xPos < -40) continue; - if(enemyShip.positionY - yPos > 40 || enemyShip.positionY - yPos < -40) continue; - if(enemyShip.isDestroyed()) continue; - - destroyedByBombEnemyShips.add(enemyShip); - enemyShip.destroyByBomb(); - this.logger.info("Destroyed ship in (" - + nx + "," + ny + ")"); - howManyEnemyIsDead++; - } - } - } - } - for(EnemyShip enemyShip : destroyedByBombEnemyShips) - if (this.shooters.contains(enemyShip)) { - int destroyedShipIndex = this.shooters.indexOf(enemyShip); - int destroyedShipColumnIndex = -1; - - for (List column : this.enemyShips) - if (column.contains(enemyShip)) { - destroyedShipColumnIndex = this.enemyShips.indexOf(column); - break; - } - - EnemyShip nextShooter = getNextShooter(this.enemyShips - .get(destroyedShipColumnIndex)); - - if (nextShooter != null) - this.shooters.set(destroyedShipIndex, nextShooter); - else { - this.shooters.remove(destroyedShipIndex); - this.logger.info("Shooters list reduced to " - + this.shooters.size() + " members."); - if (this.shooters.isEmpty()) - SoundManager.playSound("SFX/S_LevelClear", "level_start_count", false, false); - } - } - - this.shipCount -= howManyEnemyIsDead; - return destroyedByBombEnemyShips; - - } - - /** - * Gets the ship on a given column that will be in charge of shooting. - * - * @param column - * Column to search. - * @return New shooter ship. - */ - public final EnemyShip getNextShooter(final List column) { - Iterator iterator = column.iterator(); - EnemyShip nextShooter = null; - while (iterator.hasNext()) { - EnemyShip checkShip = iterator.next(); - if (checkShip != null && !checkShip.isDestroyed()) - nextShooter = checkShip; - } - - return nextShooter; - } - - /** - * Returns an iterator over the ships in the formation. - * - * @return Iterator over the enemy ships. - */ - @Override - public final Iterator iterator() { - Set enemyShipsList = new HashSet(); - - for (List column : this.enemyShips) - for (EnemyShip enemyShip : column) - enemyShipsList.add(enemyShip); - - return enemyShipsList.iterator(); - } - - /** - * Checks if there are any ships remaining. - * - * @return True when all ships have been destroyed. - */ - public final boolean isEmpty() { - return this.shipCount <= 0; - } -} diff --git a/src/entity/Entity.java b/src/entity/Entity.java deleted file mode 100644 index ba21740d..00000000 --- a/src/entity/Entity.java +++ /dev/null @@ -1,144 +0,0 @@ -package entity; - -import java.awt.Color; - -import engine.DrawManager.SpriteType; - -/** - * Implements a generic game entity. - * - * @author Roberto Izquierdo Amo - * - */ -public class Entity { - - /** Position in the x-axis of the upper left corner of the entity. */ - protected int positionX; - /** Position in the y-axis of the upper left corner of the entity. */ - protected int positionY; - /** Width of the entity. */ - protected int width; - /** Height of the entity. */ - protected int height; - /** Original color of the entity. */ - private Color origin_color; - /** Color of the entity. */ - private Color color; - /** Sprite type assigned to the entity. */ - protected SpriteType spriteType; - - /** - * Constructor, establishes the entity's generic properties. - * - * @param positionX - * Initial position of the entity in the X axis. - * @param positionY - * Initial position of the entity in the Y axis. - * @param width - * Width of the entity. - * @param height - * Height of the entity. - * @param color - * Color of the entity. - */ - public Entity(final int positionX, final int positionY, final int width, - final int height, final Color color) { - this.positionX = positionX; - this.positionY = positionY; - this.width = width; - this.height = height; - this.origin_color = color; - this.color = color; - } - - /** - * Getter for the color of the entity. - * - * @return Color of the entity, used when drawing it. - */ - public final Color getColor() { - return color; - } - - /** - * Setter for the color of the entity. - * - * @param c - * New color of the entity. - */ - public final void setColor(Color c) {this.color = c;} - - /** - * Re-setter for the color of the entity. - - */ - public final void resetColor() {this.color = this.origin_color;} - - /** - * Getter for the X axis position of the entity. - * - * @return Position of the entity in the X axis. - */ - public final int getPositionX() { - return this.positionX; - } - - /** - * Getter for the Y axis position of the entity. - * - * @return Position of the entity in the Y axis. - */ - public final int getPositionY() { - return this.positionY; - } - - /** - * Setter for the X axis position of the entity. - * - * @param positionX - * New position of the entity in the X axis. - */ - public final void setPositionX(final int positionX) { - this.positionX = positionX; - } - - /** - * Setter for the Y axis position of the entity. - * - * @param positionY - * New position of the entity in the Y axis. - */ - public final void setPositionY(final int positionY) { - this.positionY = positionY; - } - - /** - * Getter for the sprite that the entity will be drawn as. - * - * @return Sprite corresponding to the entity. - */ - public final SpriteType getSpriteType() { - return this.spriteType; - } - - /** - * Getter for the width of the image associated to the entity. - * - * @return Width of the entity. - */ - public final int getWidth() { - return this.width; - } - - /** - * Getter for the height of the image associated to the entity. - * - * @return Height of the entity. - */ - public final int getHeight() { - return this.height; - } - public final void changeColor(Color color) { - this.color = color; - } -} diff --git a/src/entity/Item.java b/src/entity/Item.java deleted file mode 100644 index a3ee0200..00000000 --- a/src/entity/Item.java +++ /dev/null @@ -1,88 +0,0 @@ -package entity; - -import java.awt.Color; - -import engine.DrawManager.SpriteType; - -/** - * Implements an item that moves vertically only down. - */ -public class Item extends Entity { - - /** - * Speed of the item, only positive number - * positive is down. - */ - private double speed; - - - public static enum ItemType { - - SubPlaneItem, - - SpeedUpItem, - - InvincibleItem, - - BombItem - - }; - - private ItemType itemType; - - private boolean isGet; - - /** - * Constructor, establishes the item's properties. - * - * @param positionX - * Initial position of the item in the X axis. - * @param positionY - * Initial position of the item in the Y axis. - */ - public Item(final int positionX, final int positionY, int itemRange, double itemSpeed) { - super(positionX, positionY, 30, 30, Color.YELLOW); - this.speed = itemSpeed; - this.spriteType = SpriteType.Item; - setItemType(itemRange); - } - - /** - * Sets correct sprite for the item, based on speed. - */ - public final void setItemType(int itemRange) { - if(itemRange > EnemyShip.RANDOM_BOUND * EnemyShip.ITEM_PROPORTION * 0.75) - this.itemType = ItemType.SubPlaneItem; - else if(itemRange > EnemyShip.RANDOM_BOUND * EnemyShip.ITEM_PROPORTION * 0.5) - this.itemType = ItemType.SpeedUpItem; - else if(itemRange > EnemyShip.RANDOM_BOUND * EnemyShip.ITEM_PROPORTION * 0.25) - this.itemType = ItemType.InvincibleItem; - else - this.itemType = ItemType.BombItem; - } - - /** - * Updates the item's position. - */ - public final void update() { - this.positionY += this.speed; - } - - - /** - * Getter for the speed of the item. - * - * @return Speed of the item. - */ - public final double getSpeed() { - return this.speed; - } - - public final void setIsGet(){this.isGet = true;} - - public final boolean getIsGet(){return this.isGet;} - - public final ItemType getItemType(){return this.itemType;} - - -} diff --git a/src/entity/ItemPool.java b/src/entity/ItemPool.java deleted file mode 100644 index a7f60491..00000000 --- a/src/entity/ItemPool.java +++ /dev/null @@ -1,37 +0,0 @@ -package entity; - -import java.util.HashSet; -import java.util.Set; - - -public final class ItemPool { - - - private static Set pool = new HashSet(); - - - private ItemPool() { - - } - - - public static Item getItem(final int positionX, final int positionY, final int itemRange, final double itemSpeed) { - Item item; - if (!pool.isEmpty()) { - item = pool.iterator().next(); - pool.remove(item); - item.setPositionX(positionX - item.getWidth() / 2); - item.setPositionY(positionY); - } else { - item = new Item(positionX, positionY, itemRange, itemSpeed); - item.setPositionX(positionX - item.getWidth() / 2); - } - return item; - } - - - public static void recycle(final Set item) { - pool.addAll(item); - } -} - diff --git a/src/entity/ItemQueue.java b/src/entity/ItemQueue.java deleted file mode 100644 index 2fb4c3c8..00000000 --- a/src/entity/ItemQueue.java +++ /dev/null @@ -1,50 +0,0 @@ -package entity; - - -/** 현재 사용자가 보유한 아이템을 저장하는 Queue */ -public class ItemQueue { - - public final Item[] itemQue; - private final int CAPACITY = 3; - private int front; - private int rear; - private int size; - - public ItemQueue(){ - itemQue = new Item[CAPACITY]; - this.front = this.rear = size = 0; - } - - public void enque(Item item){ - if(size < CAPACITY){ - itemQue[rear++] = item; - size++; - } - } - - public Item deque(){ - Item x = itemQue[front]; - if(size == CAPACITY) { - Item temp = itemQue[CAPACITY-1]; - itemQue[CAPACITY-1] = null; - itemQue[CAPACITY-3] = itemQue[CAPACITY-2]; - itemQue[CAPACITY-2] = temp; - rear--; - size--; - } - else if(size > 0) { - for(int i = 0; i < this.size; i++){ - itemQue[i] = itemQue[i+1]; - } - rear--; - size--; - } - return x; - } - - public int getSize() { return this.size; } - - public Item[] getItemQue() { return this.itemQue; } - -} - diff --git a/src/entity/Ship.java b/src/entity/Ship.java deleted file mode 100644 index ef68229d..00000000 --- a/src/entity/Ship.java +++ /dev/null @@ -1,347 +0,0 @@ -package entity; - -import java.awt.Color; -import java.util.Set; -import java.util.*; - -import engine.Cooldown; -import engine.Core; -import engine.DrawManager; -import engine.DrawManager.SpriteType; - -/** - * Implements a ship, to be controlled by the player. - * - * @author Roberto Izquierdo Amo - */ -public class Ship extends Entity { - - /** - * Time between shots. - */ - private int shootingInterval = 750; - - /** - * Original speed of the bullets shot by the ship. - */ - private static final int ORIGINAL_BULLET_SPEED = -6; - /** - * Original movement of the ship for each unit of time. - */ - private int originalSpeed = 2; - - /** - * Life item purchase status - **/ - private boolean hasLifeIncreaseItem = false; - - private static final int ITEM_USE_INTERVAL = 750; - /** - * Speed of the bullets shot by the ship. - * private static final int BULLET_SPEED = -6; - * /** Movement of the ship for each unit of time. - * private static int SPEED = 2; - * /** Movement of the ship when ship get speed item for each unit of time. - **/ - private final int ITEM_SPEED_UP_VALUE = 4; - - /** - * Minimum time between shots. - */ - private Cooldown shootingCooldown; - - private Cooldown itemCooldown; - /** - * Time spent inactive between hits. - */ - private Cooldown destructionCooldown; - /** - * Speed of the bullet. - */ - private int BULLET_SPEED; - /** - * Speed of the ship. - */ - private int speed; - - public boolean Invincible; - - private ItemQueue itemQueue; - - private Cooldown skillCooldown; - private List auxiliaryShips = new ArrayList<>(); - private boolean existAuxiliaryShips = false; - private int FASTER_SHOOTING_INTERVAL = 300; - - private int impactInterval = 10000; - - private Cooldown speedupCooldown; - - private Cooldown invincibleCooldown; - - private Cooldown auxiliaryCooldown; - private boolean hasPurchasedSpeedItem = false; - - /** - * Constructor, establishes the ship's properties. - * - * @param positionX Initial position of the ship in the X axis. - * @param positionY Initial position of the ship in the Y axis. - * @param color Initial color of the ship. - * @param spriteType Initial spriteType of the ship. - */ - public Ship(final int positionX, final int positionY, final Color color, SpriteType spriteType, boolean isAuxiliaryShip) { - super(positionX, positionY, 13 * 2, 8 * 2, color); - - this.spriteType = spriteType; - this.shootingCooldown = Core.getCooldown(shootingInterval); - this.itemCooldown = Core.getCooldown(ITEM_USE_INTERVAL); - this.destructionCooldown = Core.getCooldown(1000); - this.skillCooldown = Core.getCooldown(1000); - - this.speedupCooldown = Core.getCooldown(impactInterval); - this.invincibleCooldown = Core.getCooldown(impactInterval); - this.auxiliaryCooldown = Core.getCooldown(impactInterval); - - this.speed = originalSpeed; - this.BULLET_SPEED = ORIGINAL_BULLET_SPEED; - this.itemQueue = new ItemQueue(); - this.Invincible = false; - - if (!isAuxiliaryShip) { - this.auxiliaryShips.add(new Ship(positionX - 25, positionY, this.getColor(), SpriteType.AuxiliaryShips, true)); - this.auxiliaryShips.add(new Ship(positionX + 25, positionY, this.getColor(), DrawManager.SpriteType.AuxiliaryShips, true)); - } - } - - /** - * Moves the ship speed uni ts right, or until the right screen border is - * reached. - */ - public final void moveRight() { - this.positionX += speed; - } - - /** - * Moves the ship speed units left, or until the left screen border is - * reached. - */ - public final void moveLeft() { - this.positionX -= speed; - } - - /** - * Shoots a bullet upwards. - * - * @param bullets List of bullets on screen, to add the new bullet. - * @return Checks if the bullet was shot correctly. - */ - public final boolean shoot(final Set bullets, final int shooter) { - if (this.shootingCooldown.checkFinished()) { - this.shootingCooldown.reset(); - bullets.add(BulletPool.getBullet(positionX + this.width / 2, - positionY, BULLET_SPEED, shooter)); - return true; - } - return false; - } - - public final boolean itemCoolTime() { - if (this.itemCooldown.checkFinished()) { - this.itemCooldown.reset(); - return true; - } - return false; - } - - /** - * Updates status of the ship. - */ - public final void update() { - this.skillCooldown.checkFinished(); - if (!this.destructionCooldown.checkFinished()) - this.spriteType = SpriteType.ShipDestroyed; - else - this.spriteType = SpriteType.Ship; - } - - /** - * Switches the ship to its destroyed state. - */ - public final void destroy() { - this.destructionCooldown.reset(); - } - - /** - * Checks if the ship is destroyed. - * - * @return True if the ship is currently destroyed. - */ - public final boolean isDestroyed() { - return !this.destructionCooldown.checkFinished(); - } - - public int getBULLET_SPEED() { - return BULLET_SPEED; - } - - /** - * Getter for the ship's speed. - * - * @return Speed of the ship. - */ - public final int getSpeed() { - return speed; - } - - /** - * Getter for the ship's speed. - * - * @return Speed of the ship. - */ - public final void setSpeed(int sp) { - this.speed = sp; - } - - /** - * Re-Setter for the ship's speed. - */ - public final void resetSpeed() { - this.speed = originalSpeed; - } - - /** - * Getter for the ship's shooting frequency speed. - * - * @return Ship's shooting frequency speed. - */ - public final Cooldown getShootingInterval() { - return this.shootingCooldown; - } - - /** - * Setter for the ship's shooting frequency speed. - * - * @return Speed of the ship's shooting frequency. - */ - public final void setShootingInterval(int cldwn) { - this.shootingCooldown = Core.getCooldown(cldwn); - } - - /** - * Re-Setter for the ship's shooting frequency speed. - */ - public final void resetShootingInterval() { - this.shootingCooldown = Core.getCooldown(shootingInterval); - } - - public final boolean getItemImpact() { - return (this.speed == this.originalSpeed + this.ITEM_SPEED_UP_VALUE || this.Invincible || this.existAuxiliaryShips); - } - - public final void itemImpactUpdate() { - if (this.speed == this.originalSpeed + this.ITEM_SPEED_UP_VALUE) { - if (this.speedupCooldown.checkFinished()) resetSpeed(); - } else if (this.Invincible) { - if (this.invincibleCooldown.checkFinished()) { - Color c = this.getColor(); - if (c == Color.BLUE) { - Invincible = false; - changeColor(Color.GREEN); - } else if (c == Color.magenta) { - Invincible = false; - changeColor(Color.RED); - } - } - } else if (this.existAuxiliaryShips) { - if (this.auxiliaryCooldown.checkFinished()) setExistAuxiliaryShips(false); - } - } - - /** - * Set item_speed for 10sec when ship get speed item - **/ - public void setItemSpeed() { - this.speedupCooldown.reset(); - this.speed = this.originalSpeed + this.ITEM_SPEED_UP_VALUE; - } - - /** - * Set item_speed when ship buy speed item in store - **/ - public void buyItemSpeed() { - this.hasPurchasedSpeedItem = true; - } - - - public final boolean isInvincible() { - return this.Invincible; - } - - public final void runInvincible() { - Color c = this.getColor(); - - if (c == Color.GREEN || c == Color.BLUE) { - this.invincibleCooldown.reset(); - this.Invincible = true; - this.changeColor(Color.BLUE); - } else if (c == Color.RED || c == Color.magenta) { - this.invincibleCooldown.reset(); - this.Invincible = true; - this.changeColor(Color.magenta); - } - } - - public final ItemQueue getItemQueue() { - return this.itemQueue; - } - - public List getAuxiliaryShips() { - return auxiliaryShips; - } - - public boolean isExistAuxiliaryShips() { - return existAuxiliaryShips; - } - - public void setAuxiliaryShipsMode() { - this.auxiliaryCooldown.reset(); - setExistAuxiliaryShips(true); - } - - public void setExistAuxiliaryShips(boolean existAuxiliaryShips) { - this.existAuxiliaryShips = existAuxiliaryShips; - } - - public void applyFasterShootingItem() { - this.shootingInterval = this.FASTER_SHOOTING_INTERVAL; - this.shootingCooldown = Core.getCooldown(this.shootingInterval); - - for (Ship auxiliaryShip : auxiliaryShips) { - auxiliaryShip.applyFasterShootingItem(); - } - - } - - public void applyLifeIncreaseItem(boolean isUsed) { - this.hasLifeIncreaseItem = isUsed; - } - - public boolean getHasLifeIncreaseItem() { - return this.hasLifeIncreaseItem; - } - - public void setOriginalSpeed(int originalSpeed) { - if(hasPurchasedSpeedItem){ - this.originalSpeed = originalSpeed; - this.speed = this.originalSpeed + 2; - }else { - this.originalSpeed = originalSpeed; - this.speed = this.originalSpeed; - } - } - - public int getOriginalSpeed() { - return originalSpeed; - } -} diff --git a/src/screen/AchievementScreen.java b/src/screen/AchievementScreen.java deleted file mode 100644 index e54d77f4..00000000 --- a/src/screen/AchievementScreen.java +++ /dev/null @@ -1,49 +0,0 @@ -package screen; - -import java.awt.event.KeyEvent; -import java.util.Map; - -import engine.AchievementManager; -import engine.AchievementManager.Achievement; -import engine.SoundManager; - -public class AchievementScreen extends Screen { - private Map achievements; - - /** - * Constructor, establishes the properties of the screen. - * - * @param width - * Screen width. - * @param height - * Screen height. - * @param fps - * Frames per second, frame rate at which the game is run. - */ - public AchievementScreen(final int width, final int height, final int fps) { - super(width, height, fps); - - this.returnCode = 1; - this.achievements = AchievementManager.getInstance().getAchievements(); - } - - public final int run() { - super.run(); - return this.returnCode; - } - - protected final void update() { - super.update(); - draw(); - if ((inputManager.isKeyDown(KeyEvent.VK_ESCAPE) || inputManager.isKeyDown(KeyEvent.VK_SPACE)) && this.inputDelay.checkFinished()){ - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - this.isRunning = false; - } - } - - private void draw() { - drawManager.initDrawing(this); - drawManager.drawAchievements(this, achievements); - drawManager.completeDrawing(this); - } -} diff --git a/src/screen/ClearScreen.java b/src/screen/ClearScreen.java deleted file mode 100644 index fa425e1b..00000000 --- a/src/screen/ClearScreen.java +++ /dev/null @@ -1,123 +0,0 @@ -package screen; - -import engine.Cooldown; -import engine.Core; -import engine.GameState; -import engine.Score; - -import java.awt.*; -import java.awt.event.KeyEvent; -import java.io.IOException; -import java.util.List; -import java.util.NoSuchElementException; - -public class ClearScreen extends Screen { - - /** Height of the interface separation line. */ - private static final int SEPARATION_LINE_HEIGHT = 40; - - private GameState gameState; - - /** Current game level. */ - private int level; - /** Current score. */ - private int score; - /** First Player's lives left. */ - private int lives; - /** Second Player's lives left. */ - private int lives2; - /** list of past high scores */ - private int highScore; - - /** - * Constructor, establishes the properties of the screen. - * - * @param width Screen width. - * @param height Screen height. - * @param fps Frames per second, frame rate at which the game is run. - */ - public ClearScreen(final int width, final int height, final int fps, - final GameState gameState) { - super(width, height, fps); - - this.gameState = gameState; - this.level = gameState.getLevel()-1; - this.score = gameState.getScore(); - this.lives = gameState.getLivesRemaining1p(); - if (gameState.getMode() == 2) - this.lives2 = gameState.getLivesRemaining2p(); - - try { - if (this.gameState.getMode() == 1) { - List highScores = Core.getFileManager().loadHighScores(1); - this.highScore = highScores.stream().mapToInt(Score::getScore).max().orElseThrow(NoSuchElementException::new); - } else { - List highScores = Core.getFileManager().loadHighScores(2); - this.highScore = highScores.stream().mapToInt(Score::getScore).max().orElseThrow(NoSuchElementException::new); - } - } catch (NumberFormatException | NoSuchElementException | IOException e) { - logger.warning("Couldn't load high score!"); - } - - this.returnCode = 2; - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected final void update() { - super.update(); - - draw(); - if (inputManager.isKeyDown(KeyEvent.VK_UP) - || inputManager.isKeyDown(KeyEvent.VK_W) - || inputManager.isKeyDown(KeyEvent.VK_DOWN) - || inputManager.isKeyDown(KeyEvent.VK_S)) { - nextMenuItem(); - try { - Thread.sleep(500); - } catch (InterruptedException e) { } - } - if (inputManager.isKeyDown(KeyEvent.VK_SPACE)) - this.isRunning = false; - } - - /** - * Shifts the focus to the next menu item. - */ - private void nextMenuItem() { - if (this.returnCode == 1) - this.returnCode = 2; - else if (this.returnCode == 2) - this.returnCode = 1; - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - - drawManager.drawScore(this, this.score); - drawManager.drawLives(this, this.lives); - if (this.gameState.getMode() == 2) drawManager.drawLives2(this, this.lives2); - drawManager.drawHighScore(this, this.highScore); - drawManager.drawHorizontalLine(this, SEPARATION_LINE_HEIGHT - 1, Color.GREEN); - - drawManager.drawClear(this, this.returnCode, this.level); - - drawManager.completeDrawing(this); - } - -} diff --git a/src/screen/GameScreen.java b/src/screen/GameScreen.java deleted file mode 100644 index 97b76eb5..00000000 --- a/src/screen/GameScreen.java +++ /dev/null @@ -1,1205 +0,0 @@ -package screen; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.awt.event.KeyEvent; -import java.util.HashSet; -import java.util.Set; - -import java.awt.*; -import java.io.IOException; -import java.util.*; -import java.util.List; - -import engine.*; -import entity.*; - -/** - * Implements the game screen, where the action happens. - * - * @author Roberto Izquierdo Amo - * - */ -public class GameScreen extends Screen { - - /** Milliseconds until the screen accepts user input. */ - private static final int INPUT_DELAY = 6000; - /** Bonus score for each life remaining at the end of the level. */ - private static final int LIFE_SCORE = 100; - /** Minimum time between bonus ship's appearances. */ - private static final int BONUS_SHIP_INTERVAL = 20000; - /** Maximum variance in the time between bonus ship's appearances. */ - private static final int BONUS_SHIP_VARIANCE = 10000; - /** Time until bonus ship explosion disappears. */ - private static final int BONUS_SHIP_EXPLOSION = 500; - /** Time from finishing the level to screen change. */ - private static final int SCREEN_CHANGE_INTERVAL = 1500; - /** Height of the interface separation line. */ - private static final int SEPARATION_LINE_HEIGHT = 40; - - /** Current game state. */ - private GameState gameState; - /** Current game difficulty settings. */ - private GameSettings gameSettings; - /** Player's freedom. */ - private Replayability replayability = new Replayability(SelectScreen.skillModeOn ? 1:0); - /** Current difficulty level number. */ - private int level; - /** Formation of enemy ships. */ - private EnemyShipFormation enemyShipFormation; - - /** First Player's ship. */ - private Ship ship; - /** Second Player's ship. **/ - private Ship ship2; - - private int shipWidth = 13*2; - - /** Bonus enemy ship that appears sometimes. */ - private EnemyShip enemyShipSpecial; - /** Minimum time between bonus ship appearances. */ - private Cooldown enemyShipSpecialCooldown; - /** Time until bonus ship explosion disappears. */ - private Cooldown enemyShipSpecialExplosionCooldown; - /** Time from finishing the level to screen change. */ - private Cooldown screenFinishedCooldown; - - /** Set of all bullets fired by on screen ships. */ - private Set bullets; - - private Set items; - /** Current score. */ - private int score; - /** First Player's lives left. */ - private int lives; - /** Total bullets shot by the player. */ - private int bulletsShot; - /** Second Player's lives left. */ - private int lives2; - /** Player 1's remaining magazines */ - private int magazine; - /** Player 2's remaining magazines */ - private int magazine2; - /** Number of bullets used in player 1's active magazine */ - private int bullet_count; - /** Number of bullets used in player 2's active magazine */ - private int bullet_count2; - /** Total bullets shot by the player1. */ - private int bulletsShot1; - /** Total bullets shot by the player2. */ - private int bulletsShot2; - /** Total ships destroyed by the player. */ - private int shipsDestroyed; - private int shipsDestroyed2; - /** Moment the game starts. */ - private long gameStartTime; - /** Checks if the level is finished. */ - private boolean levelFinished; - /** Checks if a bonus life is received. */ - private boolean bonusLife; - private int escapeCnt = 0; - private int per=0; - private int originalSpeed; - private boolean speedBoosted; - - /** list of past high scores */ - private int highScore; - - private boolean isPause = false; - - private List auxiliaryShips = new ArrayList<>(); - private boolean existAuxiliaryShips = false; - private int pauseCnt = 0; - private boolean manual = false; - - /** Checks item is bomb **/ - private boolean isBomb = false; - - /** Checks life increase item is used. **/ - private boolean haslifeItemUsed = false; - - - - /** - * Constructor, establishes the properties of the screen. - * - * @param gameState - * Current game state. - * @param gameSettings - * Current game settings. - * @param bonusLife - * Checks if a bonus life is awarded this level. - * @param width - * Screen width. - * @param height - * Screen height. - * @param fps - * Frames per second, frame rate at which the game is run. - */ - public GameScreen(final GameState gameState, - final GameSettings gameSettings, final boolean bonusLife, - final int width, final int height, final int fps) { - super(width, height, fps); - - this.gameState = gameState; - this.gameSettings = gameSettings; - this.bonusLife = bonusLife; - this.level = gameState.getLevel(); - this.score = gameState.getScore(); - this.lives = gameState.getLivesRemaining1p(); - this.bulletsShot1 = gameState.getBulletsShot1(); - this.shipsDestroyed = gameState.getShipsDestroyed(); - if(gameState.getMode() == 2){ - this.shipsDestroyed2 = gameState.getShipsDestroyed2(); - } - - if (gameState.getMode() == 2) { - this.lives2 = gameState.getLivesRemaining2p(); - this.bulletsShot2 = gameState.getBulletsShot2(); - } - - if (this.bonusLife) { - if (gameState.getMode() == 1) { - this.lives++; - } else { - if (this.lives == Core.getMaxLives()) { - this.lives2++; - } else if (this.lives2 == Core.getMaxLives()) { - this.lives++; - } else { - this.lives++; - this.lives2++; - } - } - } - - try { - if (this.gameState.getMode() == 1) { - List highScores = Core.getFileManager().loadHighScores(1); - this.highScore = highScores.stream().mapToInt(Score::getScore).max().orElseThrow(NoSuchElementException::new); - } else { - List highScores = Core.getFileManager().loadHighScores(2); - this.highScore = highScores.stream().mapToInt(Score::getScore).max().orElseThrow(NoSuchElementException::new); - } - } catch (NumberFormatException | NoSuchElementException | IOException e) { - logger.warning("Couldn't load high score!"); - } - } - - /** - * Initializes basic screen properties, and adds necessary elements. - */ - public final void initialize() { - super.initialize(); - - enemyShipFormation = new EnemyShipFormation(this.gameSettings, this.gameState); - enemyShipFormation.attach(this); - Player player; - List existShopItems; - try { - player = Core.getFileManager().getCurrentPlayer(); - existShopItems= player.getItem(); - } catch (IOException e) { - throw new RuntimeException(e); - } - // 게임 모드 별 함선 생성 제어 - if (gameState.getMode() == 1){ - this.ship = new Ship(this.width / 2, this.height - 30, Color.GREEN, DrawManager.SpriteType.Ship, false); - if(existShopItems.get(0)){ - this.ship.buyItemSpeed(); - } - if(existShopItems.get(1)){ - this.ship.applyLifeIncreaseItem(true); - } - if(existShopItems.get(2)){ - this.ship.applyFasterShootingItem(); - } - } - if (gameState.getMode() == 2) { - this.ship = new Ship(this.width / 2 - 85, this.height - 30, Color.GREEN, DrawManager.SpriteType.Ship, false); - this.ship2 = new Ship(this.width / 2 + 60, this.height - 30, Color.RED, DrawManager.SpriteType.Ship2, false); - if(existShopItems.get(0)){ - this.ship.buyItemSpeed(); - this.ship2.buyItemSpeed(); - } - if(existShopItems.get(1)){ - this.ship.applyLifeIncreaseItem(true); - this.ship2.applyLifeIncreaseItem(true); - } - if(existShopItems.get(2)){ - this.ship.applyFasterShootingItem(); - this.ship2.applyFasterShootingItem(); - } - } - - // Appears each 10-30 seconds. - this.enemyShipSpecialCooldown = Core.getVariableCooldown( - BONUS_SHIP_INTERVAL, BONUS_SHIP_VARIANCE); - this.enemyShipSpecialCooldown.reset(); - this.enemyShipSpecialExplosionCooldown = Core - .getCooldown(BONUS_SHIP_EXPLOSION); - this.screenFinishedCooldown = Core.getCooldown(SCREEN_CHANGE_INTERVAL); - this.bullets = new HashSet(); - this.items = new HashSet(); - - // Special input delay / countdown. - this.gameStartTime = System.currentTimeMillis(); - this.inputDelay = Core.getCooldown(INPUT_DELAY); - this.inputDelay.reset(); - - this.magazine=5; - this.magazine2=5; - this.bullet_count=0; - this.bullet_count2=0; - - // Adjust bullet shooting interval and speed by level. - if (this.level==1) { - this.ship.setOriginalSpeed(4); - if (gameState.getMode()==2) { - this.ship2.setOriginalSpeed(4); - } - } else if (this.level==2) { - this.ship.setOriginalSpeed(4); - if (gameState.getMode()==2) { - this.ship2.setOriginalSpeed(4); - } - } else if (this.level==3) { - this.ship.setOriginalSpeed(3); - if (gameState.getMode()==2) { - this.ship2.setOriginalSpeed(3); - } - } else if (this.level==4) { - this.ship.setOriginalSpeed(3); - if (gameState.getMode()==2) { - this.ship2.setOriginalSpeed(3); - } - } else if (this.level==5) { - this.ship.setOriginalSpeed(3); - if (gameState.getMode()==2) { - this.ship2.setOriginalSpeed(3); - } - } else if (this.level==6) { - this.ship.setOriginalSpeed(2); - if (gameState.getMode()==2) { - this.ship2.setOriginalSpeed(2); - } - } else { - this.ship.setOriginalSpeed(2); - if (gameState.getMode()==2) { - this.ship2.setOriginalSpeed(2); - } - } - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - if(gameState.getMode() == 1) { - this.score += LIFE_SCORE * Math.max(0, (this.lives - 1)); - } - if(gameState.getMode() == 2) { - this.score += LIFE_SCORE * Math.max(0,(this.lives + this.lives2 - 1)); - } - this.logger.info("Screen cleared with a score of " + this.score); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected final void update() { - super.update(); - - if (this.inputDelay.checkFinished() && inputManager.isKeyDown(KeyEvent.VK_CONTROL)){ - isPause = true; - } - if (this.inputDelay.checkFinished() && inputManager.isKeyDown(KeyEvent.VK_SHIFT)){ - manual = true; - } - if (ship.getHasLifeIncreaseItem() && this.gameState.getLevel() == 1 && !this.haslifeItemUsed){ - this.lives++; - if (this.gameState.getMode() == 2){ - this.lives2++; - } - this.haslifeItemUsed = true; - } - - if (!isPause && !manual) { - - if (this.inputDelay.checkFinished() && !this.levelFinished) { - - if (gameState.getMode() == 1 && !this.ship.isDestroyed()) { - boolean moveRight = inputManager.isKeyDown(Core.getKeySettingCode(1)); - boolean moveLeft = inputManager.isKeyDown(Core.getKeySettingCode(0)); - - boolean isRightBorder = this.ship.getPositionX() - + this.ship.getWidth() + this.ship.getSpeed() > this.width - 1; - boolean isLeftBorder = this.ship.getPositionX() - - this.ship.getSpeed() < 1; - - if (moveRight && !isRightBorder) { - this.ship.moveRight(); - } - if (moveLeft && !isLeftBorder) { - this.ship.moveLeft(); - } - if (this.ship.getItemImpact()) { - this.ship.itemImpactUpdate(); - } - - if (replayability.getReplay() == 0 && inputManager.isKeyDown(Core.getKeySettingCode(2))) { - if (this.ship.shoot(this.bullets, 1)) - this.bulletsShot1++; - if (this.ship.isExistAuxiliaryShips()) { - for (Ship auxiliaryShip : this.ship.getAuxiliaryShips()) { - if (auxiliaryShip.shoot(this.bullets, 1)) - this.bulletsShot1++; - } - } - if (this.ship.getItemImpact()) { - this.ship.itemImpactUpdate(); - } - - } - if (replayability.getReplay() == 1) { - if (this.bullet_count <= 9 && inputManager.isKeyDown(Core.getKeySettingCode(2))) { - if (this.ship.shoot(this.bullets, 1)) { - this.bulletsShot1++; - this.bullet_count++; - SoundManager.playSound("SFX/S_Ally_Shoot_a", "AllyShootA", false, false); - } - if (this.ship.isExistAuxiliaryShips()) { - for (Ship auxiliaryShip : this.ship.getAuxiliaryShips()) { - if (auxiliaryShip.shoot(this.bullets, 1)) { - this.bulletsShot1++; - SoundManager.playSound("SFX/S_Ally_Shoot_b", "AllyShootB", false, false); - } - } - } - } - if (this.ship.getItemImpact()) { - this.ship.itemImpactUpdate(); - } - if (inputManager.speed == 3) { - per = 1; - } else if (inputManager.countH_u >= 7 && inputManager.countH_d >= 7 && bullet_count <= 7) { - per = 2; - } - if (inputManager.magazine) { - if (this.bullet_count == 10) { - inputManager.countH_d = 0; - inputManager.countH_u = 0; - inputManager.speed = 0; - this.magazine--; - this.bullet_count = 0; - this.logger.info("player1_magazine" + this.magazine); - } - inputManager.magazine = false; - } - } - - if (!this.ship.isDestroyed()) { - List auxiliaryShips = this.ship.getAuxiliaryShips(); - if (this.ship.getItemImpact()) { - this.ship.itemImpactUpdate(); - } - if (this.ship.isExistAuxiliaryShips()) { - auxiliaryShips.get(0).setPositionX(ship.getPositionX() - 25); - auxiliaryShips.get(0).setPositionY(ship.getPositionY()); - auxiliaryShips.get(1).setPositionX(ship.getPositionX() + 25); - auxiliaryShips.get(1).setPositionY(ship.getPositionY()); - } else { - auxiliaryShips.get(0).destroy(); - auxiliaryShips.get(1).destroy(); - } - if (inputManager.isKeyDown(Core.getKeySettingCode(7))) - if (this.ship.itemCoolTime()) - useItem(this.ship.getItemQueue().deque(), this.ship); - } - - - } else if (gameState.getMode() == 2 && !(this.ship.isDestroyed() && this.ship2.isDestroyed())) { - boolean moveRight1p = inputManager.isKeyDown(Core.getKeySettingCode(1)); - boolean moveLeft1p = inputManager.isKeyDown(Core.getKeySettingCode(0)); - - boolean moveRight2p = inputManager.isKeyDown(Core.getKeySettingCode(9)); - boolean moveLeft2p = inputManager.isKeyDown(Core.getKeySettingCode(8)); - - boolean isRightBorder1p = this.ship.getPositionX() - + this.ship.getWidth() + this.ship.getSpeed() > this.width - 1; - boolean isLeftBorder1p = this.ship.getPositionX() - - this.ship.getSpeed() < 1; - - boolean isRightBorder2p = this.ship2.getPositionX() - + this.ship2.getWidth() + this.ship2.getSpeed() > this.width - 1; - boolean isLeftBorder2p = this.ship2.getPositionX() - - this.ship2.getSpeed() < 1; - - if (moveRight1p && !isRightBorder1p && (this.lives > 0)) { - this.ship.moveRight(); - } - if (moveRight2p && !isRightBorder2p && (this.lives2 > 0)) { - this.ship2.moveRight(); - } - if (moveLeft1p && !isLeftBorder1p && (this.lives > 0)) { - this.ship.moveLeft(); - } - if (moveLeft2p && !isLeftBorder2p && (this.lives2 > 0)) { - this.ship2.moveLeft(); - } - if (this.ship.getItemImpact() || this.ship2.getItemImpact()) { - this.ship.itemImpactUpdate(); - this.ship2.itemImpactUpdate(); - } - - if (replayability.getReplay() == 0) { - if (inputManager.isKeyDown(Core.getKeySettingCode(2)) && (this.lives > 0)) { - if (this.ship.shoot(this.bullets, 1)) { - this.bulletsShot1++; - this.bullet_count++; - } - if (this.ship.isExistAuxiliaryShips()) { - for (Ship auxiliaryShip : this.ship.getAuxiliaryShips()) - if (auxiliaryShip.shoot(this.bullets, 1)) { - this.bulletsShot1++; - } - } - if (this.ship.getItemImpact() || this.ship2.getItemImpact()) { - this.ship.itemImpactUpdate(); - this.ship2.itemImpactUpdate(); - } - } - if (inputManager.isKeyDown(Core.getKeySettingCode(10)) && (this.lives2 > 0)) { - if (this.ship2.shoot(this.bullets, 2)) { - this.bulletsShot2++; - this.bullet_count2++; - } - if (this.ship2.isExistAuxiliaryShips()) { - for (Ship auxiliaryShip : this.ship2.getAuxiliaryShips()) - if (auxiliaryShip.shoot(this.bullets, 2)) { - this.bulletsShot2++; - } - } - if (this.ship.getItemImpact() || this.ship2.getItemImpact()) { - this.ship.itemImpactUpdate(); - this.ship2.itemImpactUpdate(); - } - } - } else if (replayability.getReplay() == 1) { - //player1 - if (this.bullet_count <= 9 && inputManager.isKeyDown(Core.getKeySettingCode(2)) && (this.lives > 0)) { - if (this.ship.shoot(this.bullets, 1)) { - SoundManager.playSound("SFX/S_Ally_Shoot_a", "AllyShoota", false, false); - this.bulletsShot1++; - this.bullet_count++; - } - if (this.ship.isExistAuxiliaryShips()) { - for (Ship auxiliaryShip : this.ship.getAuxiliaryShips()) - if (auxiliaryShip.shoot(this.bullets, 1)) { - this.bulletsShot1++; - SoundManager.playSound("SFX/S_Ally_Shoot_b", "AllyShootb", false, false); - } - } - if (this.ship.getItemImpact() || this.ship2.getItemImpact()) { - this.ship.itemImpactUpdate(); - this.ship2.itemImpactUpdate(); - } - - } - if (inputManager.speed1 == 3) - per = 1; - if (inputManager.one >= 7 && inputManager.two >= 7 && bullet_count <= 7) - per = 2; - if (inputManager.magazine) { - if (this.bullet_count == 10) { - inputManager.one = 0; - inputManager.two = 0; - inputManager.speed = 0; - this.magazine--; - this.bullet_count = 0; - this.logger.info("player1_magazine" + this.magazine); - } - inputManager.magazine = false; - } - - if (!this.ship.isDestroyed()) { - List auxiliaryShips = this.ship.getAuxiliaryShips(); - if (this.ship.getItemImpact()) { - this.ship.itemImpactUpdate(); - } - if (this.ship.isExistAuxiliaryShips()) { - auxiliaryShips.get(0).setPositionX(ship.getPositionX() - 30); - auxiliaryShips.get(0).setPositionY(ship.getPositionY()); - auxiliaryShips.get(1).setPositionX(ship.getPositionX() + 30); - auxiliaryShips.get(1).setPositionY(ship.getPositionY()); - } else { - auxiliaryShips.get(0).destroy(); - auxiliaryShips.get(1).destroy(); - } - if (inputManager.isKeyDown(Core.getKeySettingCode(7))) - if (this.ship.itemCoolTime()) - useItem(this.ship.getItemQueue().deque(), this.ship); - } - - //player2 - if (this.bullet_count2 <= 9 && inputManager.isKeyDown(Core.getKeySettingCode(10)) && (this.lives2 > 0)) { - if (this.ship2.shoot(this.bullets, 2)) { - this.bulletsShot2++; - this.bullet_count2++; - SoundManager.playSound("SFX/S_Ally_Shoot_c", "AllyShootc", false, false); - } - if (this.ship2.getItemImpact()) { - this.ship2.itemImpactUpdate(); - } - if (this.ship2.isExistAuxiliaryShips()) { - for (Ship auxiliaryShip : this.ship2.getAuxiliaryShips()) - if (auxiliaryShip.shoot(this.bullets, 2)) { - SoundManager.playSound("SFX/S_Ally_Shoot_d", "AllyShootd", false, false); - this.bulletsShot2++; - } - } - } - if (inputManager.speed2 == 3) - per = 3; - if (inputManager.seven >= 7 && inputManager.eight >= 7 && bullet_count2 <= 7) - per = 4; - if (inputManager.magazine2) { - if (this.bullet_count2 == 10) { - inputManager.seven = 0; - inputManager.eight = 0; - inputManager.speed2 = 0; - this.magazine2--; - this.bullet_count2 = 0; - this.logger.info("player2_magazine" + this.magazine2); - } - inputManager.magazine2 = false; - } - - // item - if (!this.ship2.isDestroyed()) { - List auxiliaryShips = this.ship2.getAuxiliaryShips(); - if (this.ship2.getItemImpact()) { - this.ship2.itemImpactUpdate(); - } - if (this.ship2.isExistAuxiliaryShips()) { - auxiliaryShips.get(0).setPositionX(ship2.getPositionX() - 30); - auxiliaryShips.get(0).setPositionY(ship2.getPositionY()); - auxiliaryShips.get(1).setPositionX(ship2.getPositionX() + 30); - auxiliaryShips.get(1).setPositionY(ship2.getPositionY()); - } else { - auxiliaryShips.get(0).destroy(); - auxiliaryShips.get(1).destroy(); - } - if (inputManager.isKeyDown(Core.getKeySettingCode(15))) - if (this.ship2.itemCoolTime()) - useItem(this.ship2.getItemQueue().deque(), this.ship2); - } - } - } - - - if (this.enemyShipSpecial != null) { - if (!this.enemyShipSpecial.isDestroyed()) - this.enemyShipSpecial.move(2, 0); - else if (this.enemyShipSpecialExplosionCooldown.checkFinished()) { - SoundManager.playSound("SFX/S_Enemy_Destroy_b", "SpecialEnemyShipDestroyed", false, false); - this.enemyShipSpecial = null; - } - } - - if (this.enemyShipSpecial == null - && this.enemyShipSpecialCooldown.checkFinished()) { - SoundManager.playSound("SFX/S_Enemy_Special", "specialEnemyAppear", false, false); - this.enemyShipSpecial = new EnemyShip(); - this.enemyShipSpecialCooldown.reset(); - this.logger.info("A special ship appears"); - } - - if (this.enemyShipSpecial != null - && this.enemyShipSpecial.getPositionX() > this.width) { - this.escapeCnt++; - if (this.level == 7) { - this.lives--; - this.logger.info("This level is 7 and escaped ship is 1, so you lost on life."); - } else if (this.level == 6 && this.escapeCnt == 2) { - this.lives--; - this.logger.info("Escaped 2."); - this.escapeCnt = 0; - this.logger.info("This level is 6 and escaped ship is 2, so you lost on life."); - } else if (this.level == 5 && this.escapeCnt == 3) { - this.lives--; - this.logger.info("Escaped 3."); - this.escapeCnt = 0; - this.logger.info("This level is 5 and escaped ship is 3, so you lost on life."); - } else { - this.logger.info("The special ship has escaped"); - } - this.enemyShipSpecial = null; - } - - /** If you use up all your magazines and bullets and then recharge your magazine, - * you'll have one less live and five new magazines.*/ - if (this.magazine < 0) { - this.lives--; - this.magazine = 5; - } - if (this.magazine2 < 0) { - this.lives2--; - this.magazine2 = 5; - } - - this.ship.update(); - if (this.gameState.getMode() == 2) { - this.ship2.update(); - } - - this.enemyShipFormation.update(); - this.enemyShipFormation.shoot(this.bullets); - } - - useSkill(); - manageCollisions(); - cleanBullets(); - updateItems(); - //draw(); - - if ((this.enemyShipFormation.isEmpty() || (this.gameState.getMode() == 1 && this.lives == 0) || (this.gameState.getMode() == 2 && this.lives == 0 && this.lives2 == 0)) - && !this.levelFinished) { - this.levelFinished = true; - this.screenFinishedCooldown.reset(); - } - - if (this.levelFinished && this.screenFinishedCooldown.checkFinished()) - this.isRunning = false; - - } else { - if (inputManager.isKeyDown(KeyEvent.VK_CONTROL)) { - pauseCnt++; - try { - Thread.sleep(500); - } catch (InterruptedException e) {} - } - if (inputManager.isKeyDown(KeyEvent.VK_SPACE)) { - if (pauseCnt % 2 == 1) { //quit - this.returnCode = 1; - this.isRunning = false; - } else { //resume - isPause = false; - } - manual = false; - } - } - - //AchievementManager.getInstance().checkLuckySeven(this.score); - - draw(); - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - - if (SelectScreen.skillModeOn) { - drawManager.drawAmmo(this, this.magazine, this.bullet_count); - - if (this.gameState.getMode() == 2) { - drawManager.drawAmmo2(this, this.magazine2, this.bullet_count2); - } - } - - - if (this.gameState.getMode() == 1) { - if (this.lives > 0) { - drawManager.drawEntity(this.ship, this.ship.getPositionX(), - this.ship.getPositionY()); - } - if (this.lives < 1) { - drawManager.clearEntity(this.ship, this.ship.getPositionX(), this.ship.getPositionY()); - } - } else { - if (this.lives > 0) { - drawManager.drawEntity(this.ship, this.ship.getPositionX(), - this.ship.getPositionY()); - } - if (this.lives2 > 0) { - drawManager.drawEntity(this.ship2, this.ship2.getPositionX(), - this.ship2.getPositionY()); - } - if (this.lives < 1) { - drawManager.clearEntity(this.ship, this.ship.getPositionX(), this.ship.getPositionY()); - } - if (this.lives2 < 1) { - drawManager.clearEntity(this.ship2, this.ship2.getPositionX(), this.ship2.getPositionY()); - } - } - - if (this.enemyShipSpecial != null) - drawManager.drawEntity(this.enemyShipSpecial, - this.enemyShipSpecial.getPositionX(), - this.enemyShipSpecial.getPositionY()); - - enemyShipFormation.draw(); - - for (Bullet bullet : this.bullets) - drawManager.drawEntity(bullet, bullet.getPositionX(), - bullet.getPositionY()); - - for (Item item : this.items) - drawManager.drawEntity(item, item.getPositionX(), - item.getPositionY()); - if (this.ship.isExistAuxiliaryShips()) { - for (Ship auxiliaryShip : this.ship.getAuxiliaryShips()) { - drawManager.drawEntity(auxiliaryShip, auxiliaryShip.getPositionX(), auxiliaryShip.getPositionY()); - } - } - if (gameState.getMode() == 2 && this.ship2.isExistAuxiliaryShips()) { - for (Ship auxiliaryShip : this.ship2.getAuxiliaryShips()) { - drawManager.drawEntity(auxiliaryShip, auxiliaryShip.getPositionX(), auxiliaryShip.getPositionY()); - } - } - - drawManager.drawScore(this, this.score); - drawManager.drawLives(this, this.lives); - drawManager.drawItems(this, this.ship.getItemQueue().getItemQue(), this.ship.getItemQueue().getSize()); - if (this.gameState.getMode() == 2) { - drawManager.drawLives2(this, this.lives2); - drawManager.drawItems2(this, this.ship2.getItemQueue().getItemQue(), this.ship2.getItemQueue().getSize()); - } - drawManager.drawHighScore(this, this.highScore); - drawManager.drawHorizontalLine(this, SEPARATION_LINE_HEIGHT - 1, Color.GREEN); - drawManager.drawHorizontalLine(this, this.height - 1, Color.GREEN); //separation line for bottom hud - - // Countdown to game start. - if (!this.inputDelay.checkFinished()) { - int countdown = (int) ((INPUT_DELAY - - (System.currentTimeMillis() - - this.gameStartTime)) / 1000); - long beep = ((INPUT_DELAY - (System.currentTimeMillis() - this.gameStartTime))); - - if ((beep<3995 && beep>3975) || (beep<2995 && beep>2975) || (beep<1995 && beep>1975)) - SoundManager.playSound("SFX/S_LevelStart_b", "level_start_beep", false, false); - if ((beep<995 && beep>975)) - SoundManager.playSound("SFX/S_LevelStart_a", "level_start_count", false, false); - drawManager.drawCountDown(this, this.level, countdown, - this.bonusLife); - drawManager.drawHorizontalLine(this, this.height / 2 - this.height - / 12, Color.GREEN); - drawManager.drawHorizontalLine(this, this.height / 2 + this.height - / 12, Color.GREEN); - } - - if(manual){ - drawManager.drawWindow(this, 0, this.height / 2 - this.height / 12 - 90, 180); - drawManager.drawManualMenu(this); - drawManager.drawHorizontalLine(this, this.height / 2 - this.height / 12 - 90, Color.CYAN); - drawManager.drawHorizontalLine(this, this.height / 2 - this.height / 12 - 50, Color.CYAN); - drawManager.drawHorizontalLine(this, this.height / 2 + this.height / 12 + 90, Color.CYAN); - } - - if (isPause){ - drawManager.drawWindow(this, 0, this.height / 2 - this.height / 12 - 40, 40); - drawManager.drawPauseMenu(this, pauseCnt%2); - drawManager.drawHorizontalLine(this, this.height / 2 - this.height / 12 - 40, Color.YELLOW); - drawManager.drawHorizontalLine(this, this.height / 2 - this.height / 12, Color.YELLOW); - drawManager.drawHorizontalLine(this, this.height / 2 + this.height / 12, Color.YELLOW); - } - - drawManager.completeDrawing(this); - } - - /** - * Cleans bullets that go off screen. - */ - private void cleanBullets() { - Set recyclable = new HashSet(); - for (Bullet bullet : this.bullets) { - bullet.update(); - if (bullet.getPositionY() < SEPARATION_LINE_HEIGHT - || bullet.getPositionY() > this.height) - recyclable.add(bullet); - } - this.bullets.removeAll(recyclable); - BulletPool.recycle(recyclable); - } - - /** - * 아이템이 화면 아래나 Ship 닿을 시 아이템 청소 - * */ - private void updateItems() { - Set recyclableItem = new HashSet(); - for (Item item : this.items) { - item.update(); - if (item.getPositionY() < SEPARATION_LINE_HEIGHT - || item.getPositionY() > this.height) - recyclableItem.add(item); - } - this.items.removeAll(recyclableItem); - ItemPool.recycle(recyclableItem); - } - - /** - * Manages collisions between bullets and ships. - */ - private void manageCollisions() { - Set recyclable = new HashSet(); - if (gameState.getMode() == 1) { - for (Bullet bullet : this.bullets) { - if (bullet.getSpeed() > 0) { - if (checkCollision(bullet, this.ship) && !this.levelFinished && !this.ship.isInvincible()) { - recyclable.add(bullet); - if (!this.ship.isDestroyed()) { - this.ship.destroy(); - if (this.lives > 0) { - this.lives--; - } - if (this.lives <= 0) - SoundManager.playSound("SFX/S_Ally_Destroy_b", "Allay_Des_b", false, false); - else - SoundManager.playSound("SFX/S_Ally_Destroy_a", "Allay_Des_a", false, false); - this.logger.info("Hit on player1 ship, " + this.lives + " lives remaining."); - } - } - } else { - for (EnemyShip enemyShip : this.enemyShipFormation) { - if (!enemyShip.isDestroyed() && checkCollision(bullet, enemyShip)) { - if (this.isBomb) { - List enemyShips = this.enemyShipFormation.destroyByBomb(enemyShip); - SoundManager.playSound("SFX/S_Item_Bomb", "Bomb", false, false); - for (EnemyShip enemy : enemyShips) { - this.score += enemy.getPointValue(); - this.shipsDestroyed++; - } - } else { - this.score += enemyShip.getPointValue(); - this.shipsDestroyed++; - this.enemyShipFormation.destroy(enemyShip); - } - - if (enemyShip.hasItem() && enemyShip.isDestroyed()) { - items.add(new Item(enemyShip.getPositionX(), enemyShip.getPositionY(), enemyShip.getItemRange(), level)); - SoundManager.playSound("SFX/S_Item_Create", "itemCreate", false, false); - } - - setBomb(false); - - recyclable.add(bullet); - } - } - - if (this.enemyShipSpecial != null && bullet.getShooter() == 1 && !this.enemyShipSpecial.isDestroyed() - && checkCollision(bullet, this.enemyShipSpecial)) { - shipsDestroyed++; - this.score += this.enemyShipSpecial.getPointValue(); - this.enemyShipSpecial.destroy(); - this.enemyShipSpecialExplosionCooldown.reset(); - recyclable.add(bullet); - } - } - } - } - - if (gameState.getMode() == 2) { - for (Bullet bullet : this.bullets) { - if (bullet.getSpeed() > 0) { - if (checkCollision(bullet, this.ship) && !this.levelFinished && !this.ship.isInvincible()) { - recyclable.add(bullet); - if (!this.ship.isDestroyed()) { - this.ship.destroy(); - if (this.lives > 0) { - this.lives--; - } - if (this.lives <= 0) - SoundManager.playSound("SFX/S_Ally_Destroy_b", "Allay_Des_b", false, false); - else - SoundManager.playSound("SFX/S_Ally_Destroy_a", "Allay_Des_a", false, false); - this.logger.info("Hit on player1 ship, " + this.lives + " lives remaining."); - } - } - if (checkCollision(bullet, this.ship2) && !this.levelFinished && !this.ship2.isInvincible()) { - recyclable.add(bullet); - if (!this.ship2.isDestroyed()) { - this.ship2.destroy(); - if (this.lives2 > 0) { - this.lives2--; - } - if (this.lives2 <= 0) - SoundManager.playSound("SFX/S_Ally_Destroy_b", "Allay_Des_b", false, false); - else - SoundManager.playSound("SFX/S_Ally_Destroy_a", "Allay_Des_a", false, false); - this.logger.info("Hit on player2 ship, " + this.lives2 + " lives remaining."); - } - } - } else { - for (EnemyShip enemyShip : this.enemyShipFormation) { - if (bullet.getShooter() == 1 && !enemyShip.isDestroyed() && checkCollision(bullet, enemyShip)) { - - if (this.isBomb){ - List enemyShips = this.enemyShipFormation.destroyByBomb(enemyShip); - SoundManager.playSound("SFX/S_Item_Bomb", "Bomb", false, false); - for(EnemyShip enemy : enemyShips) { - this.score += enemy.getPointValue(); - this.shipsDestroyed++; - } - } - else { - this.score += enemyShip.getPointValue(); - this.shipsDestroyed++; - this.enemyShipFormation.destroy(enemyShip); - } - - if (enemyShip.hasItem() && enemyShip.isDestroyed()) { - items.add(new Item(enemyShip.getPositionX(), enemyShip.getPositionY(), enemyShip.getItemRange(), level)); - } - - setBomb(false); - recyclable.add(bullet); - } else if(!enemyShip.isDestroyed() && checkCollision(bullet, enemyShip)) { - - if (this.isBomb){ - List enemyShips = this.enemyShipFormation.destroyByBomb(enemyShip); - SoundManager.playSound("SFX/S_Item_Bomb", "Bomb", false, false); - for(EnemyShip enemy : enemyShips) { - this.score += enemy.getPointValue(); - this.shipsDestroyed++; - } - } - else { - this.score += enemyShip.getPointValue(); - this.shipsDestroyed2++; - this.enemyShipFormation.destroy(enemyShip); - } - - if (enemyShip.hasItem() && enemyShip.isDestroyed()) { - items.add(new Item(enemyShip.getPositionX(), enemyShip.getPositionY(), enemyShip.getItemRange(), level)); - } - - setBomb(false); - recyclable.add(bullet); - } - } - - if (this.enemyShipSpecial != null && bullet.getShooter() == 1 && !this.enemyShipSpecial.isDestroyed() - && checkCollision(bullet, this.enemyShipSpecial)) { - shipsDestroyed++; - this.score += this.enemyShipSpecial.getPointValue(); - this.enemyShipSpecial.destroy(); - this.enemyShipSpecialExplosionCooldown.reset(); - recyclable.add(bullet); - } - - if (this.enemyShipSpecial != null && bullet.getShooter() == 2 && !this.enemyShipSpecial.isDestroyed() - && checkCollision(bullet, this.enemyShipSpecial)) { - shipsDestroyed2++; - this.score += this.enemyShipSpecial.getPointValue(); - this.enemyShipSpecial.destroy(); - this.enemyShipSpecialExplosionCooldown.reset(); - recyclable.add(bullet); - } - } - } - } - - Set recyclableItem = new HashSet(); - - if (gameState.getMode() == 1) { - for (Item item : this.items) { - if (checkCollision(item, this.ship) && !this.levelFinished && this.lives != 0) { - recyclableItem.add(item); - SoundManager.playSound("SFX/S_Item_Get", "ItemGet", false, false); - this.ship.getItemQueue().enque(item); - } - } - } - if (gameState.getMode() == 2) { - for (Item item : this.items) { - if (checkCollision(this.ship, this.ship2) && checkCollision(this.ship, item) && checkCollision(this.ship2, item) && !this.levelFinished && this.lives != 0 && this.lives2 != 0) { - recyclableItem.add(item); - SoundManager.playSound("SFX/S_Item_Get", "ItemGet", false, false); - if(this.ship.getItemQueue().getSize() == this.ship2.getItemQueue().getSize()){ - if(new Random().nextInt(100) > 50) this.ship.getItemQueue().enque(item); - else this.ship2.getItemQueue().enque(item); - } - else if(this.ship.getItemQueue().getSize() > this.ship2.getItemQueue().getSize()) this.ship2.getItemQueue().enque(item); - else this.ship.getItemQueue().enque(item); - } - else { - if (checkCollision(item, this.ship) && !this.levelFinished && this.lives != 0) { - recyclableItem.add(item); - SoundManager.playSound("SFX/S_Item_Get", "ItemGet", false, false); - this.ship.getItemQueue().enque(item); - } - else if (checkCollision(item, this.ship2) && !this.levelFinished && this.lives2 != 0) { - recyclableItem.add(item); - SoundManager.playSound("SFX/S_Item_Get", "ItemGet", false, false); - this.ship2.getItemQueue().enque(item); - } - } - } - } - - this.bullets.removeAll(recyclable); - this.items.removeAll(recyclableItem); - BulletPool.recycle(recyclable); - ItemPool.recycle(recyclableItem); - } - - - /** Use skill*/ - private void useSkill(){ - if (per>0 && !this.levelFinished) { - if (per == 1 && !speedBoosted) { // s 연타 -> 1초간 속도 빨라지기 - originalSpeed = ship.getOriginalSpeed(); - ship.setSpeed(originalSpeed + 2); - this.logger.info("SpeedUp"); - - ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); - executor.schedule(() -> { - ship.resetSpeed(); - speedBoosted = false; - executor.shutdown(); - }, 1, TimeUnit.SECONDS); - - speedBoosted = true; - }else if (per == 2) { //위아래화살표 연타 -> 총 세발 - bullets.add(BulletPool.getBullet(ship.getPositionX(), - ship.getPositionY(), ship.getBULLET_SPEED(), 1)); - bullets.add(BulletPool.getBullet(ship.getPositionX() + shipWidth/2, - ship.getPositionY(), ship.getBULLET_SPEED(), 1)); - bullets.add(BulletPool.getBullet(ship.getPositionX() + shipWidth, - ship.getPositionY(), ship.getBULLET_SPEED(), 1)); - this.logger.info("Three bullets"); - this.bulletsShot1+=3; - this.bullet_count+=3; - }else if (per == 3 && !speedBoosted) { // s 연타 -> 1초간 속도 빨라지기 - originalSpeed = ship2.getOriginalSpeed(); - ship2.setSpeed(originalSpeed + 2); - this.logger.info("SpeedUp"); - - ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); - executor.schedule(() -> { - ship2.resetSpeed(); - speedBoosted = false; - executor.shutdown(); - }, 1, TimeUnit.SECONDS); - - speedBoosted = true; - }else if (per == 4) { //위아래화살표 연타 -> 총 세발 - bullets.add(BulletPool.getBullet(ship2.getPositionX(), - ship2.getPositionY(), ship2.getBULLET_SPEED(), 2)); - bullets.add(BulletPool.getBullet(ship2.getPositionX() + shipWidth/2, - ship2.getPositionY(), ship2.getBULLET_SPEED(), 2)); - bullets.add(BulletPool.getBullet(ship2.getPositionX() + shipWidth, - ship2.getPositionY(), ship2.getBULLET_SPEED(), 2)); - this.logger.info("Three bullets"); - this.bulletsShot2+=3; - this.bullet_count2+=3; - } - per = 0; - inputManager.countH_d = 0; - inputManager.countH_u = 0; - inputManager.one = 0; - inputManager.speed = 0; - inputManager.two = 0; - inputManager.seven = 0; - inputManager.eight = 0; - inputManager.speed1 = 0; - inputManager.speed2 = 0; - } - } - - /** - * Checks if two entities are colliding. - * - * @param a - * First entity, the bullet. - * @param b - * Second entity, the ship. - * @return Result of the collision test. - */ - private boolean checkCollision(final Entity a, final Entity b) { - // Calculate center point of the entities in both axis. - int centerAX = a.getPositionX() + a.getWidth() / 2; - int centerAY = a.getPositionY() + a.getHeight() / 2; - int centerBX = b.getPositionX() + b.getWidth() / 2; - int centerBY = b.getPositionY() + b.getHeight() / 2; - // Calculate maximum distance without collision. - int maxDistanceX = a.getWidth() / 2 + b.getWidth() / 2; - int maxDistanceY = a.getHeight() / 2 + b.getHeight() / 2; - // Calculates distance. - int distanceX = Math.abs(centerAX - centerBX); - int distanceY = Math.abs(centerAY - centerBY); - - return distanceX < maxDistanceX && distanceY < maxDistanceY; - } - - /** - * Returns a GameState object representing the status of the game for 1p mode. - * - * @return Current game state. - */ - public final GameState getGameState1p() { - return new GameState(this.level, this.score, this.lives, - this.bulletsShot1, this.shipsDestroyed); - } - /** - * Returns a GameState object representing the status of the game for 2p mode. - * - * @return Current game state. - */ - public final GameState getGameState2p() { - return new GameState(this.level, this.score, this.lives, this.lives2, - this.bulletsShot1, this.bulletsShot2, this.shipsDestroyed, this.shipsDestroyed2); - } - - /** 아이템 종류에 맞는 기능 실행 */ - private void useItem(Item item, Ship ship) { - if(item == null) { - this.logger.info("보유한 아이템이 없습니다"); - } - else{ - if (!item.getIsGet() && - item.getItemType() == Item.ItemType.SubPlaneItem) { - ship.setAuxiliaryShipsMode(); - this.logger.info("SubPlane Item 사용"); - SoundManager.playSound("SFX/S_Item_SubShip", "SubPlaneItem", false, true); // 보조비행기 아이템 bgm - - } - else if (!item.getIsGet() && - item.getItemType() == Item.ItemType.SpeedUpItem) { - ship.setItemSpeed(); - SoundManager.playSound("SFX/S_Item_SpeedUp", "SpeedUpItem", false, true); // 속도 증가 아이템 bgm - - - } - else if (!item.getIsGet() && - item.getItemType() == Item.ItemType.InvincibleItem) { - ship.runInvincible(); - this.logger.info("Invincible Item 사용"); - SoundManager.playSound("SFX/S_Item_Invicible", "InvincibleItem", false, true); // 무적 상태 아이템 bgm - - } - else if (!item.getIsGet() && - item.getItemType() == Item.ItemType.BombItem) { - setBomb(true); - this.logger.info("Bomb Item 사용"); - SoundManager.playSound("SFX/S_Item_Bomb_Equipped", "InvincibleItem", false, true); // 무적 상태 아이템 bgm - - - } - item.setIsGet(); - this.logger.info("You have " + this.ship.getItemQueue().getSize() + " items"); - } - } - public void setBomb(boolean isBomb){ - this.isBomb = isBomb; - } - -} diff --git a/src/screen/HighScoreScreen.java b/src/screen/HighScoreScreen.java deleted file mode 100644 index 1bf5fd28..00000000 --- a/src/screen/HighScoreScreen.java +++ /dev/null @@ -1,83 +0,0 @@ -package screen; - -import java.awt.event.KeyEvent; -import java.io.IOException; -import java.util.List; - -import engine.Core; -import engine.Score; -import engine.SoundManager; - -/** - * Implements the high scores screen, it shows player records. - * - * @author Roberto Izquierdo Amo - * - */ -public class HighScoreScreen extends Screen { - - /** List of past high scores from 1p mode. */ - private List highScores_1p; - /** List of past high scores from 2p mode. */ - private List highScores_2p; - - /** - * Constructor, establishes the properties of the screen. - * - * @param width - * Screen width. - * @param height - * Screen height. - * @param fps - * Frames per second, frame rate at which the game is run. - */ - public HighScoreScreen(final int width, final int height, final int fps) { - super(width, height, fps); - - this.returnCode = 1; - - try { - this.highScores_1p = Core.getFileManager().loadHighScores(1); - this.highScores_2p = Core.getFileManager().loadHighScores(2); - } catch (NumberFormatException | IOException e) { - logger.warning("Couldn't load high scores!"); - } - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected final void update() { - super.update(); - - draw(); - if ((inputManager.isKeyDown(KeyEvent.VK_SPACE) || inputManager.isKeyDown(KeyEvent.VK_ESCAPE)) - && this.inputDelay.checkFinished()) { - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - this.isRunning = false; - } - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - drawManager.drawHighScoreMenu(this); - drawManager.drawHighScores_1p(this, this.highScores_1p); - drawManager.drawHighScores_2p(this, this.highScores_2p); - - drawManager.completeDrawing(this); - } -} diff --git a/src/screen/ItemShopScreen.java b/src/screen/ItemShopScreen.java deleted file mode 100644 index a3b3de90..00000000 --- a/src/screen/ItemShopScreen.java +++ /dev/null @@ -1,175 +0,0 @@ -package screen; - -import engine.*; - -import java.awt.event.KeyEvent; -import java.io.IOException; -import java.util.List; - -/** - * Implements the high scores screen, it shows player records. - * - * @author Roberto Izquierdo Amo - */ - - -public class ItemShopScreen extends Screen { - - private static final int SELECTION_TIME = 300; - - public ItemShopScreen(final int width, final int height, final int fps) { - super(width, height, fps); - //defaults to center - this.returnCode = 71; - this.selectionCooldown = Core.getCooldown(SELECTION_TIME); - this.selectionCooldown.reset(); - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - private Cooldown selectionCooldown; - - protected final void update() { - super.update(); - - draw(); - if (this.selectionCooldown.checkFinished() && this.inputDelay.checkFinished()) { - if (inputManager.isKeyDown(KeyEvent.VK_LEFT) || inputManager.isKeyDown(KeyEvent.VK_A)) { - previousMenuItem(); - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_RIGHT) || inputManager.isKeyDown(KeyEvent.VK_D)) { - nextMenuItem(); - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_SPACE)) { - // Determine the selected item - int selectedItem = this.returnCode; - int itemPrice = 0; - - // Update currency and item based on the selected item - if (selectedItem == 70) { - itemPrice = 10; - try { - if (Core.getFileManager().getCurrentPlayer().getItem().get(0) == true) { - logger.info("Player already has the item"); - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - } else if (Core.getFileManager().getCurrentPlayer().getCurrency() >= itemPrice) { - try { - Core.getFileManager().updatePlayerItem(0); - Core.getFileManager().updateCurrencyOfCurrentPlayer(-itemPrice); - SoundManager.playSound("SFX/S_Achievement", "S_achievement", false, false); - } catch (IOException e) { - throw new RuntimeException(e); - } - logger.info("Player bought Speed item successfully"); - } else { - logger.info("Player has Insufficient Balance"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - - } else if (selectedItem == 71) { - itemPrice = 15; - try { - if (Core.getFileManager().getCurrentPlayer().getItem().get(1) == true) { - logger.info("Player already has the item"); - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - } else if (Core.getFileManager().getCurrentPlayer().getCurrency() >= itemPrice) { - try { - Core.getFileManager().updatePlayerItem(1); - Core.getFileManager().updateCurrencyOfCurrentPlayer(-itemPrice); - SoundManager.playSound("SFX/S_Achievement", "S_achievement", false, false); - } catch (IOException e) { - throw new RuntimeException(e); - } - logger.info("Player bought Additional Health item successfully"); - } else { - logger.info("Player has Insufficient Balance"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - - - } else if (selectedItem == 72) { - itemPrice = 20; - try { - if (Core.getFileManager().getCurrentPlayer().getItem().get(2) == true) { - logger.info("Player already has the item"); - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - } else if (Core.getFileManager().getCurrentPlayer().getCurrency() >= itemPrice) { - try { - Core.getFileManager().updatePlayerItem(2); - Core.getFileManager().updateCurrencyOfCurrentPlayer(-itemPrice); - SoundManager.playSound("SFX/S_Achievement", "S_achievement", false, false); - } catch (IOException e) { - throw new RuntimeException(e); - } - logger.info("Player bought Shooting Faster item successfully"); - } else { - logger.info("Player has Insufficient Balance"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - - } - this.selectionCooldown.reset(); - - } - if (inputManager.isKeyDown(KeyEvent.VK_ESCAPE)) { - this.returnCode = 1; - this.isRunning = false; - } - } - } - - - /** - * Shifts the focus to the next menu item (horizontally). - */ - private void nextMenuItem() { - if (this.returnCode == 72) - this.returnCode = 70; - else if (this.returnCode == 70) - this.returnCode = 71; - else if (this.returnCode == 71) - this.returnCode = 72; - } - - /** - * Shifts the focus to the previous menu item (horizontally). - */ - private void previousMenuItem() { - if (this.returnCode == 70) - this.returnCode = 72; - else if (this.returnCode == 72) - this.returnCode = 71; - else if (this.returnCode == 71) - this.returnCode = 70; - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - drawManager.drawItemShopMenu(this, this.returnCode); - - drawManager.completeDrawing(this); - } -} \ No newline at end of file diff --git a/src/screen/LoginScreen.java b/src/screen/LoginScreen.java deleted file mode 100644 index 03f05362..00000000 --- a/src/screen/LoginScreen.java +++ /dev/null @@ -1,131 +0,0 @@ -package screen; - -import engine.Cooldown; -import engine.Core; -import engine.Player; - -import java.awt.event.KeyEvent; -import java.io.IOException; - -/** - * Implements the title screen. - * - * @author Roberto Izquierdo Amo - * - */ - -public class LoginScreen extends Screen { - - /** Milliseconds between changes in user selection. */ - private static final int SELECTION_TIME = 200; - private char[] name; - /** Character of players name selected for change. */ - private int nameCharSelected; - /** Time between changes in user selection. */ - - private Player player; - - private Cooldown selectionCooldown; - /** Code of first mayus character. */ - private static final int FIRST_CHAR = 65; - /** Code of last mayus character. */ - private static final int LAST_CHAR = 90; - - - /** - * Constructor, establishes the properties of the screen. - * - * @param width - * Screen width. - * @param height - * Screen height. - * @param fps - * Frames per second, frame rate at which the game is run. - */ - public LoginScreen(final int width, final int height, final int fps) { - super(width, height, fps); - - // Defaults to play. - this.returnCode = 2; - this.selectionCooldown = Core.getCooldown(SELECTION_TIME); - this.selectionCooldown.reset(); - this.name = "AAA".toCharArray(); - this.nameCharSelected = 0; - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected final void update() { - super.update(); - - draw(); - if (this.selectionCooldown.checkFinished() - && this.inputDelay.checkFinished()) { - if (inputManager.isKeyDown(KeyEvent.VK_RIGHT)) { - this.nameCharSelected = this.nameCharSelected == 2 ? 0 - : this.nameCharSelected + 1; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_LEFT)) { - this.nameCharSelected = this.nameCharSelected == 0 ? 2 - : this.nameCharSelected - 1; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_UP)) { - this.name[this.nameCharSelected] = - (char) (this.name[this.nameCharSelected] - == LAST_CHAR ? FIRST_CHAR - : this.name[this.nameCharSelected] + 1); - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_DOWN)) { - this.name[this.nameCharSelected] = - (char) (this.name[this.nameCharSelected] - == FIRST_CHAR ? LAST_CHAR - : this.name[this.nameCharSelected] - 1); - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_SPACE)) { - try { - Player loadedPlayer = Core.getFileManager().loadPlayer(name); - if(loadedPlayer == null){ - Core.getFileManager().saveNewPlayer(name); - logger.info("New player saved successfully"); - } else { - Core.getFileManager().updateLoginTimeOfCurrentPlayer(); - logger.info("Player loaded successfully"); - } - } catch (IOException e) { - logger.warning("Couldn't load or save player! Error: " + e.getMessage()); - } - - // Proceed to main menu. - this.returnCode = 1; - this.isRunning = false; - } - } - - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - drawManager.drawUsernameInput(this, this.name, this.nameCharSelected); - - drawManager.completeDrawing(this); - } -} diff --git a/src/screen/ScoreScreen.java b/src/screen/ScoreScreen.java deleted file mode 100644 index 543cc47a..00000000 --- a/src/screen/ScoreScreen.java +++ /dev/null @@ -1,257 +0,0 @@ -package screen; - -import engine.*; - -import java.awt.event.KeyEvent; -import java.io.IOException; -import java.util.Collections; -import java.util.List; - -/** - * Implements the score screen. - * - * @author Roberto Izquierdo Amo - */ -public class ScoreScreen extends Screen { - - /** - * Milliseconds between changes in user selection. - */ - private static final int SELECTION_TIME = 200; - /** - * Maximum number of high scores. - */ - private static final int MAX_HIGH_SCORE_NUM = 7; - /** - * Code of first mayus character. - */ - private static final int FIRST_CHAR = 65; - /** - * Code of last mayus character. - */ - private static final int LAST_CHAR = 90; - - /** - * Current gameMode. - */ - private final int gameMode; - /** - * Current score. - */ - private final int score; - /** - * 1p's lives left. - */ - private final int livesRemaining1; - /** - * 2p's lives left. - */ - private int livesRemaining2; - /** - * Total bullets shot by the players. - */ - private final int bulletsShot1; - private int bulletsShot2; - /** - * Total ships destroyed by the player. - */ - private final int shipsDestroyed1; - private int shipsDestroyed2; - /** - * List of past high scores. - */ - private List highScores; - /** - * Checks if current score is a new high score. - */ - private boolean isNewRecord; - /** - * Player name for record input. - */ - private char[] name; - /** - * Character of players name selected for change. - */ - private int nameCharSelected; - /** - * Time between changes in user selection. - */ - private final Cooldown selectionCooldown; - - /** - * Constructor, establishes the properties of the screen. - * - * @param width Screen width. - * @param height Screen height. - * @param fps Frames per second, frame rate at which the game is run. - * @param gameState Current game state. - */ - public ScoreScreen(final int width, final int height, final int fps, - final GameState gameState) { - super(width, height, fps); - - this.gameMode = gameState.getMode(); - this.score = gameState.getScore(); - this.livesRemaining1 = gameState.getLivesRemaining1p(); - this.bulletsShot1 = gameState.getBulletsShot1(); - if (gameState.getMode() == 2) { - this.livesRemaining2 = gameState.getLivesRemaining2p(); - this.bulletsShot2 = gameState.getBulletsShot2(); - this.shipsDestroyed2 = gameState.getShipsDestroyed2(); - } - - this.shipsDestroyed1 = gameState.getShipsDestroyed(); - this.isNewRecord = false; - try { - this.name = Core.getFileManager().getCurrentPlayer().getName().toCharArray(); - } catch (IOException e) { - logger.warning("An error occurred while accessing player data: " + e.getMessage()); - } - this.nameCharSelected = 0; - this.selectionCooldown = Core.getCooldown(SELECTION_TIME); - this.selectionCooldown.reset(); - - AchievementManager.getInstance().checkScore(this.score); - - try { - this.highScores = Core.getFileManager().loadHighScores(this.gameMode); - if (highScores.size() < MAX_HIGH_SCORE_NUM - || highScores.get(highScores.size() - 1).getScore() - < this.score) - this.isNewRecord = true; - - } catch (IOException e) { - logger.warning("Couldn't load high scores!"); - } - try { - Core.getFileManager().resetPlayerItem(); - } catch (IOException e) { - logger.warning("Couldn't reset item!"); - } - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected final void update() { - super.update(); - - if (gameMode == 1) { - draw(); - } else { - draw2(); - } - - if (this.inputDelay.checkFinished()) { - if (inputManager.isKeyDown(KeyEvent.VK_ESCAPE)) { - // Return to main menu. - this.returnCode = 1; - this.isRunning = false; - saveScore(gameMode); - } else if (inputManager.isKeyDown(KeyEvent.VK_SPACE)) { - // Play again. - this.returnCode = 7; - this.isRunning = false; - saveScore(gameMode); - } - - if (this.isNewRecord && this.selectionCooldown.checkFinished()) { - if (inputManager.isKeyDown(KeyEvent.VK_RIGHT)) { - this.nameCharSelected = this.nameCharSelected == 2 ? 0 - : this.nameCharSelected + 1; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_LEFT)) { - this.nameCharSelected = this.nameCharSelected == 0 ? 2 - : this.nameCharSelected - 1; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_UP)) { - this.name[this.nameCharSelected] = - (char) (this.name[this.nameCharSelected] - == LAST_CHAR ? FIRST_CHAR - : this.name[this.nameCharSelected] + 1); - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_DOWN)) { - this.name[this.nameCharSelected] = - (char) (this.name[this.nameCharSelected] - == FIRST_CHAR ? LAST_CHAR - : this.name[this.nameCharSelected] - 1); - this.selectionCooldown.reset(); - } - } - } - - } - - /** - * Saves the score as a high score. - * - * @param gameMode Current game mode. - */ - private void saveScore(final int gameMode) { - highScores.add(new Score(new String(this.name), score)); - try { - Core.getFileManager().updateCurrencyOfCurrentPlayer(score / 10); - } catch (IOException e) { - throw new RuntimeException(); - } - Collections.sort(highScores); - if (highScores.size() > MAX_HIGH_SCORE_NUM) - highScores.remove(highScores.size() - 1); - - try { - Core.getFileManager().saveHighScores(highScores, gameMode); - } catch (IOException e) { - logger.warning("Couldn't load high scores!"); - } - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - - drawManager.drawGameOver(this, this.inputDelay.checkFinished(), - this.isNewRecord); - drawManager.drawResults(this, this.score, this.livesRemaining1, - this.shipsDestroyed1, (float) this.shipsDestroyed1 - / this.bulletsShot1, this.isNewRecord); - - if (this.isNewRecord) - drawManager.drawNameInput(this, this.name, this.nameCharSelected); - - drawManager.completeDrawing(this); - } - - /** - * Draws the elements associated with the screen for 2P mode. - */ - private void draw2() { - drawManager.initDrawing(this); - - drawManager.drawGameOver(this, this.inputDelay.checkFinished(), - this.isNewRecord); - drawManager.drawResults(this, this.score, this.livesRemaining1, this.livesRemaining2, - this.shipsDestroyed1 + this.shipsDestroyed2, (float) this.shipsDestroyed1 - / this.bulletsShot1, (float) this.shipsDestroyed2 / this.bulletsShot2, this.isNewRecord); - - if (this.isNewRecord) - drawManager.drawNameInput(this, this.name, this.nameCharSelected); - - drawManager.completeDrawing(this); - } -} diff --git a/src/screen/Screen.java b/src/screen/Screen.java deleted file mode 100644 index a32ba9f5..00000000 --- a/src/screen/Screen.java +++ /dev/null @@ -1,130 +0,0 @@ -package screen; - -import java.awt.Insets; -import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; - -import engine.Cooldown; -import engine.Core; -import engine.DrawManager; -import engine.InputManager; - -/** - * Implements a generic screen. - * - * @author Roberto Izquierdo Amo - * - */ -public class Screen { - - /** Milliseconds until the screen accepts user input. */ - private static final int INPUT_DELAY = 1000; - - /** Draw Manager instance. */ - protected DrawManager drawManager; - /** Input Manager instance. */ - protected InputManager inputManager; - /** Application logger. */ - protected Logger logger; - - /** Screen width. */ - protected int width; - /** Screen height. */ - protected int height; - /** Frames per second shown on the screen. */ - protected int fps; - /** Screen insets. */ - protected Insets insets; - /** Time until the screen accepts user input. */ - protected Cooldown inputDelay; - - /** If the screen is running. */ - protected boolean isRunning; - /** What kind of screen goes next. */ - protected int returnCode; - - protected boolean soundSelect; - - - /** - * Constructor, establishes the properties of the screen. - * - * @param width - * Screen width. - * @param height - * Screen height. - * @param fps - * Frames per second, frame rate at which the game is run. - */ - public Screen(final int width, final int height, final int fps) { - this.width = width; - this.height = height; - this.fps = fps; - - this.drawManager = Core.getDrawManager(); - this.inputManager = Core.getInputManager(); - this.logger = Core.getLogger(); - this.inputDelay = Core.getCooldown(INPUT_DELAY); - this.inputDelay.reset(); - this.returnCode = 0; - this.soundSelect = true; - } - - /** - * Initializes basic screen properties. - */ - public void initialize() { - - } - - /** - * Activates the screen. - * - * @return Next screen code. - */ - public int run() { - this.isRunning = true; - - while (this.isRunning) { - long time = System.currentTimeMillis(); - - update(); - - - time = (1000 / this.fps) - (System.currentTimeMillis() - time); - if (time > 0) { - try { - TimeUnit.MILLISECONDS.sleep(time); - } catch (InterruptedException e) { - return 0; - } - } - } - - return 0; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected void update() { - } - - /** - * Getter for screen width. - * - * @return Screen width. - */ - public final int getWidth() { - return this.width; - } - - /** - * Getter for screen height. - * - * @return Screen height. - */ - public final int getHeight() { - return this.height; - } -} \ No newline at end of file diff --git a/src/screen/SelectScreen.java b/src/screen/SelectScreen.java deleted file mode 100644 index d2425c50..00000000 --- a/src/screen/SelectScreen.java +++ /dev/null @@ -1,106 +0,0 @@ -package screen; - -import engine.Cooldown; -import engine.Core; -import engine.SoundManager; - -import java.awt.event.KeyEvent; - -public class SelectScreen extends Screen{ - - /** Milliseconds between changes in user selection. */ - private static final int SELECTION_TIME = 200; - - /** Time between changes in user selection. */ - private Cooldown selectionCooldown; - /** Check 1P, 2P Mode */ - public static int gameMode = 1; - /** Check Skill Mode */ - public static boolean skillModeOn = true; - /** Separate function when space is down*/ - private boolean canEscape = false; - - /** - * Constructor, establishes the properties of the screen. - * - * @param width Screen width. - * @param height Screen height. - * @param fps Frames per second, frame rate at which the game is run. - */ - public SelectScreen(int width, int height, int fps){ - super(width, height, fps); - this.returnCode = 8; - this.selectionCooldown = Core.getCooldown(SELECTION_TIME); - this.selectionCooldown.reset(); - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected final void update() { - super.update(); - - draw(); - if (this.selectionCooldown.checkFinished() - && this.inputDelay.checkFinished()) { - if(!canEscape){ - if(inputManager.isKeyDown(KeyEvent.VK_ESCAPE)){ - this.returnCode = 1; - this.isRunning = false; - } - if (inputManager.isKeyDown(KeyEvent.VK_RIGHT) - || inputManager.isKeyDown(KeyEvent.VK_D)|| inputManager.isKeyDown(KeyEvent.VK_LEFT)|| inputManager.isKeyDown(KeyEvent.VK_A)) { - if(gameMode == 1) gameMode = 2; - else gameMode= 1; - this.selectionCooldown.reset();} - if (inputManager.isKeyDown(KeyEvent.VK_SPACE)){ - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - canEscape = true; - this.selectionCooldown.reset(); - - - } - } - else{ - if(inputManager.isKeyDown(KeyEvent.VK_ESCAPE)){ - canEscape = false; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_RIGHT) - || inputManager.isKeyDown(KeyEvent.VK_D)|| inputManager.isKeyDown(KeyEvent.VK_LEFT)|| inputManager.isKeyDown(KeyEvent.VK_A)) { - skillModeOn = !skillModeOn; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_SPACE)){ - this.isRunning = false; - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - } - - } - - } - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - - drawManager.drawSelect2PModeAndSkillModeScreen(this,gameMode,skillModeOn, canEscape); - - drawManager.completeDrawing(this); - } - -} diff --git a/src/screen/SettingScreen.java b/src/screen/SettingScreen.java deleted file mode 100644 index 14c181b3..00000000 --- a/src/screen/SettingScreen.java +++ /dev/null @@ -1,251 +0,0 @@ -package screen; -import engine.*; - -import java.awt.event.KeyEvent; -import java.io.IOException; - - -public class SettingScreen extends Screen { - /** Milliseconds between changes in user selection. */ - private static final int SELECTION_TIME = 200; - /** Time between changes in user selection. */ - private Cooldown selectionCooldown; - /** What is selected setting item? */ - private int itemCode =0; - /** Check select */ - private boolean selected =false; - /** Check what key is selected */ - private int keyNum =0; - /** Check when user enters keyChange */ - private boolean keyChangeMode = false; - /** For the situation some keys are not set */ - private int tempKeyCode; - private String tempKeyString; - /** - * Constructor, establishes the properties of the screen. - * - * @param width - * Screen width. - * @param height - * Screen height. - * @param fps - * Frames per second, frame rate at which the game is run. - */ - public SettingScreen(final int width, final int height, final int fps) { - super(width, height, fps); - this.returnCode = 1; - this.selectionCooldown = Core.getCooldown(SELECTION_TIME); - this.selectionCooldown.reset(); - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected final void update() { - super.update(); - - draw(); - if (this.selectionCooldown.checkFinished() - && this.inputDelay.checkFinished()) { - /** Move up and down when not selected */ - if ((inputManager.isKeyDown(KeyEvent.VK_UP) - || inputManager.isKeyDown(KeyEvent.VK_W)) && !selected) { - previousSettingItem(); - this.selectionCooldown.reset(); - } - if ((inputManager.isKeyDown(KeyEvent.VK_DOWN) - || inputManager.isKeyDown(KeyEvent.VK_S)) && !selected) { - nextSettingItem(); - this.selectionCooldown.reset(); - } - - /** Setting Sound */ - if((inputManager.isKeyDown(KeyEvent.VK_RIGHT) - || inputManager.isKeyDown(KeyEvent.VK_D)) && itemCode<2 && selected && !keyChangeMode){ - switch (itemCode){ - /** Entire Sound Setting */ - case 0: - if(Core.soundVolume < 100){ - Core.soundVolume ++; - SoundManager.setMasterVolume(Core.soundVolume); - } - break; - /** BGM On/Off */ - case 1: - Core.bgmOn = !Core.bgmOn; - SoundManager.bgmSetting(Core.bgmOn); - this.selectionCooldown.reset(); - break; - /** Keys Setting */ - case 2: case 3: - if(keyNum>0) keyNum--; - this.selectionCooldown.reset(); - break; - default: - break; - } - } - if((inputManager.isKeyDown(KeyEvent.VK_LEFT) - || inputManager.isKeyDown(KeyEvent.VK_A)) && itemCode<2 && selected && !keyChangeMode){ - switch (itemCode){ - /** Entire Sound Setting */ - case 0: - if(Core.soundVolume >0){ - Core.soundVolume --; - SoundManager.setMasterVolume(Core.soundVolume); - } - break; - /** BGM On/Off */ - case 1: - Core.bgmOn = !Core.bgmOn; - SoundManager.bgmSetting(Core.bgmOn); - this.selectionCooldown.reset(); - break; - default: - break; - } - } - - /** Move up and down when selecting key */ - if((inputManager.isKeyDown(KeyEvent.VK_UP) - || inputManager.isKeyDown(KeyEvent.VK_W)) && itemCode>1 && selected && !keyChangeMode){ - /** Keys Setting */ - if(keyNum>0) keyNum--; - this.selectionCooldown.reset(); - } - if((inputManager.isKeyDown(KeyEvent.VK_DOWN) - || inputManager.isKeyDown(KeyEvent.VK_S)) && itemCode>1 && selected && !keyChangeMode){ - /** Keys Setting */ - if(keyNum<7) keyNum++; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_ESCAPE) && !selected){ - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - saveSetting(); - this.isRunning = false; - } - /** - * 1P Keys Setting Mode - * 2P Keys Setting Mode - * Receive 1P Keys Setting Input - * Receive 2P Keys Setting Input - * Selected - * */ - if (itemCode == 2 && selected && !keyChangeMode && inputManager.isKeyDown(KeyEvent.VK_SPACE)){ - keyChangeMode =true; - tempKeyCode = Core.getKeySettingCode(keyNum); - tempKeyString = Core.getKeySettingString(keyNum); - Core.setKeySettingString(keyNum, ""); - this.selectionCooldown.reset(); - } - else if(itemCode == 3 && selected && !keyChangeMode && inputManager.isKeyDown(KeyEvent.VK_SPACE)){ - keyChangeMode =true; - tempKeyCode = Core.getKeySettingCode(keyNum +8); - tempKeyString = Core.getKeySettingString(keyNum +8); - Core.setKeySettingString(keyNum +8, ""); - this.selectionCooldown.reset(); - } - else if(itemCode == 2 && selected && keyChangeMode && inputManager.getcheck()){ - int temp = inputManager.getKeyCode(); - String tempS = inputManager.getKeyString(); - for(int i=0;i<16;i++){ - if(Core.getKeySettingCode(i) == temp){ - Core.setKeySettingCode(i,tempKeyCode); - Core.setKeySettingString(i,tempKeyString); - } - } - Core.setKeySettingString(keyNum, tempS); - Core.setKeySettingCode(keyNum, temp); - keyChangeMode = false; - this.selectionCooldown.reset(); - } - else if(itemCode == 3 && selected && keyChangeMode && inputManager.getcheck()){ - int temp = inputManager.getKeyCode(); - String tempS = inputManager.getKeyString(); - for(int i=0;i<16;i++){ - if(Core.getKeySettingCode(i) == temp){ - Core.setKeySettingCode(i, tempKeyCode); - Core.setKeySettingString(i, tempKeyString); - } - } - Core.setKeySettingString(keyNum +8, tempS); - Core.setKeySettingCode(keyNum +8, temp); - keyChangeMode = false; - this.selectionCooldown.reset(); - } - else if ((inputManager.isKeyDown(KeyEvent.VK_SPACE) || inputManager.isKeyDown(KeyEvent.VK_ESCAPE)) - && selected && !keyChangeMode && itemCode<2) { - keyNum = 0; - selected = false; - this.selectionCooldown.reset(); - } - else if ((inputManager.isKeyDown(KeyEvent.VK_LEFT) || inputManager.isKeyDown(KeyEvent.VK_A) - || inputManager.isKeyDown(KeyEvent.VK_ESCAPE)) && selected && !keyChangeMode && itemCode>1) { - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - keyNum = 0; - selected = false; - this.selectionCooldown.reset(); - } - else if (inputManager.isKeyDown(KeyEvent.VK_SPACE) && !selected && !keyChangeMode) { - selected = true; - this.selectionCooldown.reset(); - } - } - } - - /** - * Shifts the focus to the next setting item. - */ - private void nextSettingItem() { - if (this.itemCode == 3) - this.itemCode = 0; - else - this.itemCode++; - } - - /** - * Shifts the focus to the previous setting item. - */ - private void previousSettingItem() { - if (this.itemCode == 0) - this.itemCode = 3; - else - this.itemCode--; - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - drawManager.drawSetting(this, itemCode, selected); - drawManager.drawSettingDetail(this, itemCode, selected, Core.soundVolume, Core.bgmOn, keyNum); - - drawManager.completeDrawing(this); - } - - private void saveSetting(){ - Core.setting.get(0).value = Core.soundVolume; - Core.setting.get(1).value = Core.bgmOn ? 1:0; - for (int i =0; i < 16; i++) { - Core.setting.get(i+2).value = Core.getKeySettingCode(i); - Core.setting.get(i+2).name = Core.getKeySettingString(i); - } - try { - FileManager.saveSettings(Core.setting); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/screen/SkinSelectionScreen.java b/src/screen/SkinSelectionScreen.java deleted file mode 100644 index bc4f8898..00000000 --- a/src/screen/SkinSelectionScreen.java +++ /dev/null @@ -1,68 +0,0 @@ -package screen; - -import engine.Cooldown; -import engine.Core; -import engine.SoundManager; - -import engine.DrawManager; -import engine.FileManager; - -import java.awt.event.KeyEvent; -import java.util.Map; - -public class SkinSelectionScreen extends Screen{ - private static final int SELECTION_TIME = 100; - private Cooldown selectionCooldown; - private int skincode_1p=0; - private int skincode_2p=0; - private FileManager fileManager; - - private static Map spriteMap; - - public SkinSelectionScreen(final int width, final int height, final int fps) { - - super(width, height, fps); - - this.returnCode = 7; - this.selectionCooldown = Core.getCooldown(SELECTION_TIME); - this.selectionCooldown.reset(); - - } - public final int run() { - super.run(); - return this.returnCode; - } - protected final void update() { - super.update(); - draw(); - if (this.selectionCooldown.checkFinished() && this.inputDelay.checkFinished()) { - if(inputManager.isKeyDown(KeyEvent.VK_ESCAPE)){this.returnCode = 2; isRunning = false;} - if (inputManager.isKeyDown(KeyEvent.VK_UP) && skincode_1p> 0) { - skincode_1p--; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_DOWN) && skincode_1p < 5) { - skincode_1p++; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_W) && skincode_2p > 0) { - skincode_2p--; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_S) && skincode_2p < 5) { - skincode_2p++; - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_SPACE)) { - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - this.isRunning = false; - } - } - } - - public void draw(){ - drawManager.initDrawing(this); - drawManager.drawSkinSelectionMenu(this, skincode_1p,skincode_2p); - drawManager.completeDrawing(this); - } -} diff --git a/src/screen/TitleScreen.java b/src/screen/TitleScreen.java deleted file mode 100644 index 5c7ebee1..00000000 --- a/src/screen/TitleScreen.java +++ /dev/null @@ -1,116 +0,0 @@ -package screen; - -import java.awt.event.KeyEvent; -import java.util.logging.Logger; - -import engine.Cooldown; -import engine.Core; -import engine.InputManager; -import engine.SoundManager; - -/** - * Implements the title screen. - * - * @author Roberto Izquierdo Amo - * - */ -public class TitleScreen extends Screen { - - /** Milliseconds between changes in user selection. */ - private static final int SELECTION_TIME = 200; - - /** Time between changes in user selection. */ - private Cooldown selectionCooldown; - - /** - * Constructor, establishes the properties of the screen. - * - * @param width - * Screen width. - * @param height - * Screen height. - * @param fps - * Frames per second, frame rate at which the game is run. - */ - public TitleScreen(final int width, final int height, final int fps) { - super(width, height, fps); - - // Defaults to play. - this.returnCode = 2; - this.selectionCooldown = Core.getCooldown(SELECTION_TIME); - this.selectionCooldown.reset(); - } - - /** - * Starts the action. - * - * @return Next screen code. - */ - public final int run() { - super.run(); - - return this.returnCode; - } - - /** - * Updates the elements on screen and checks for events. - */ - protected final void update() { - super.update(); - - draw(); - if (this.selectionCooldown.checkFinished() - && this.inputDelay.checkFinished()) { - if (inputManager.isKeyDown(KeyEvent.VK_UP) - || inputManager.isKeyDown(KeyEvent.VK_W)) { - previousMenuItem(); - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_DOWN) - || inputManager.isKeyDown(KeyEvent.VK_S)) { - nextMenuItem(); - this.selectionCooldown.reset(); - } - if (inputManager.isKeyDown(KeyEvent.VK_SPACE)){ - SoundManager.playSound("SFX/S_MenuClick", "menu_select", false, false); - this.isRunning = false; - } - } - } - - /** - * Shifts the focus to the next menu item. - */ - private void nextMenuItem() { - if (this.returnCode == 6) - this.returnCode = 0; - else if (this.returnCode == 0) - this.returnCode = 2; - else - this.returnCode++; - } - - /** - * Shifts the focus to the previous menu item. - */ - private void previousMenuItem() { - if (this.returnCode == 0) - this.returnCode = 6; - else if (this.returnCode == 2) - this.returnCode = 0; - else - this.returnCode--; - } - - /** - * Draws the elements associated with the screen. - */ - private void draw() { - drawManager.initDrawing(this); - - drawManager.drawTitle(this); - drawManager.drawMenu(this, this.returnCode); - - drawManager.completeDrawing(this); - } -}