diff --git a/.gitignore b/.gitignore index 5096d97..9d2c20b 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,51 @@ /bwo-server/node_modules /bwo-server/resources/data/tmp/ /bwo-server/resources/data/service-account-file.json -/.vscode \ No newline at end of file +/.vscode +.DS_Store + + +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/bwo-server/core/core_server.js b/bwo-server/core/core_server.js index d696273..795439a 100644 --- a/bwo-server/core/core_server.js +++ b/bwo-server/core/core_server.js @@ -2,13 +2,18 @@ import moment from 'moment'; import express from 'express' import http from 'http' import game_server from "./game.js" -import socketio from 'socket.io' +import { Server } from "socket.io"; + import { loadLog, saveLog } from '../resources/data/state_manager.js' export default function startServer(config) { const app = express() const server = http.createServer(app) - const sockets = socketio(server) + const sockets = new Server(server, { + cors: { + origin: "*", + }, + }); const game = game_server(); @@ -21,7 +26,10 @@ export default function startServer(config) { sockets.on('connection', (socket) => { const playerId = socket.id; - //console.log(`Player on lobby: ${playerId}`) + console.log(`Player on lobby: ${playerId}`) + // sockets.to(playerId).emit('onSetup', playerId) + // console.log(`Player on lobby2: ${playerId}`) + game.addSocket(socket) var lastMoveUpdateTime = moment().format(); @@ -136,6 +144,7 @@ export default function startServer(config) { }) //app.use(express.static('public')) + app.use(express.json()); app.get('/', (request, response) => { saveLog('server-info', `Requested ./ from web.`); @@ -165,7 +174,7 @@ export default function startServer(config) { return response.send(isEmpty); }) - server.listen(config.port, () => { + server.listen(config.port, "0.0.0.0",() => { saveLog('server-status', 'server started successfully'); console.log(`Server running on port: ${config.port} in [${config.environment}] mode.`) }) diff --git a/bwo-server/core/entity/enemy/enemys.js b/bwo-server/core/entity/enemy/enemys.js index 68761a3..e277e03 100644 --- a/bwo-server/core/entity/enemy/enemys.js +++ b/bwo-server/core/entity/enemy/enemys.js @@ -269,12 +269,13 @@ export function simulateMove(state, callback) { function isInsideFoundation(state, player) { var isInside = false; + if (state.foundations == null) return false; Object.entries(state.foundations).forEach(foundation => { //console.log(foundation[1].walls) var pX = player.x / 16; var pY = player.y / 16; - if (pX >= foundation[1].x-1 && pX <= foundation[1].x + foundation[1].w+1 && - pY >= foundation[1].y-1 && pY <= foundation[1].y + foundation[1].h+1) { + if (pX >= foundation[1].x - 1 && pX <= foundation[1].x + foundation[1].w + 1 && + pY >= foundation[1].y - 1 && pY <= foundation[1].y + foundation[1].h + 1) { isInside = true; return isInside; } diff --git a/bwo-server/core/entity/foundation/foundation.js b/bwo-server/core/entity/foundation/foundation.js index fcce587..a30123f 100644 --- a/bwo-server/core/entity/foundation/foundation.js +++ b/bwo-server/core/entity/foundation/foundation.js @@ -27,6 +27,11 @@ export function getAllFoundationsAroundPlayer(playerId) { var width = 40 var height = 50 + + console.log("state !!!",state); + + if(state.foundations == null) return []; + var foundationArray = Object.entries(state.foundations).filter((foundation) => { return foundation[1].x > mPlayer.x/16 - width && foundation[1].y > mPlayer.y/16 - height diff --git a/bwo-server/package-lock.json b/bwo-server/package-lock.json index 0af6cd1..0f98c08 100644 --- a/bwo-server/package-lock.json +++ b/bwo-server/package-lock.json @@ -1,8 +1,4037 @@ { "name": "bwo", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "bwo", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.18.2", + "extend": "^3.0.2", + "firebase": "^7.20.0", + "firebase-admin": "^9.1.1", + "lerp": "^1.0.3", + "minimist": "^1.2.5", + "moment": "^2.28.0", + "moment-timezone": "^0.5.31", + "socket.io": "^4.5.2" + }, + "devDependencies": { + "nodemon": "^2.0.4" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.5.0.tgz", + "integrity": "sha512-WyQ8BT6JSoXpg4q7SV9Yg5EPXbGbG8FkkXAIhV/AnslCglhpxegO1FU33qbuT4Grzc525hZJA97oqtQS8tm4Wg==", + "dependencies": { + "@firebase/analytics-types": "0.4.0", + "@firebase/component": "0.1.19", + "@firebase/installations": "0.4.17", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.4.0.tgz", + "integrity": "sha512-Jj2xW+8+8XPfWGkv9HPv/uR+Qrmq37NPYT352wf7MvE9LrstpLVmFg3LqG6MCRr5miLAom5sen2gZ+iOhVDeRA==" + }, + "node_modules/@firebase/analytics/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/analytics/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/app": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.11.tgz", + "integrity": "sha512-FH++PaoyTzfTAVuJ0gITNYEIcjT5G+D0671La27MU8Vvr6MTko+5YUZ4xS9QItyotSeRF4rMJ1KR7G8LSyySiA==", + "dependencies": { + "@firebase/app-types": "0.6.1", + "@firebase/component": "0.1.19", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.2", + "dom-storage": "2.1.0", + "tslib": "^1.11.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz", + "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg==" + }, + "node_modules/@firebase/app/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/app/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/auth": { + "version": "0.14.9", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.14.9.tgz", + "integrity": "sha512-PxYa2r5qUEdheXTvqROFrMstK8W4uPiP7NVfp+2Bec+AjY5PxZapCx/YFDLkU0D7YBI82H74PtZrzdJZw7TJ4w==", + "dependencies": { + "@firebase/auth-types": "0.10.1" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz", + "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "0.x" + } + }, + "node_modules/@firebase/auth-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.1.tgz", + "integrity": "sha512-/+gBHb1O9x/YlG7inXfxff/6X3BPZt4zgBv4kql6HEmdzNQCodIRlEYnI+/da+lN+dha7PjaFH7C7ewMmfV7rw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "0.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.18.tgz", + "integrity": "sha512-c8gd1k/e0sbBTR0xkLIYUN8nVkA0zWxcXGIvdfYtGEsNw6n7kh5HkcxKXOPB8S7bcPpqZkGgBIfvd94IyG2gaQ==", + "dependencies": { + "@firebase/util": "0.3.1", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/database": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.11.tgz", + "integrity": "sha512-QOHhB7+CdjVhEXG9CyX0roA9ARJcEuwbozz0Bix+ULuZqjQ58KUFHMH1apW6EEiUP22d/mYD7dNXsUGshjL9PA==", + "dependencies": { + "@firebase/auth-interop-types": "0.1.5", + "@firebase/component": "0.1.18", + "@firebase/database-types": "0.5.2", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.1", + "faye-websocket": "0.11.3", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/database-types": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.2.tgz", + "integrity": "sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g==", + "dependencies": { + "@firebase/app-types": "0.6.1" + } + }, + "node_modules/@firebase/firestore": { + "version": "1.16.7", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.16.7.tgz", + "integrity": "sha512-MrX7te1eUib2pUzD3dLWdRuM7EPcCxtPwO4M9og3IFYr1U3XlxybD7kxyYswltHcUm6+kba3VKL1rvkqZ1sn2g==", + "dependencies": { + "@firebase/component": "0.1.19", + "@firebase/firestore-types": "1.12.1", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.2", + "@firebase/webchannel-wrapper": "0.3.0", + "@grpc/grpc-js": "^1.0.0", + "@grpc/proto-loader": "^0.5.0", + "node-fetch": "2.6.0", + "tslib": "^1.11.1" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.12.1.tgz", + "integrity": "sha512-CpWcDriYnGDoAl0D9DcSuwX0b/fXqi7qOwuuTI1M0SYxau48G8cqhVjzjqPDgEM3kDGYJTnPN3ALS0Z4cnwERQ==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/firestore/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/firestore/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/functions": { + "version": "0.4.51", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.4.51.tgz", + "integrity": "sha512-PPx8eZcr4eoU9BITOUGUVurs4WZu8Thj3uCWx766dU3mV1W/7kRgtiptmW0XJUB18FZ1PT3+Hadd6V6vjtLgYw==", + "dependencies": { + "@firebase/component": "0.1.19", + "@firebase/functions-types": "0.3.17", + "@firebase/messaging-types": "0.5.0", + "isomorphic-fetch": "2.2.1", + "tslib": "^1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.3.17.tgz", + "integrity": "sha512-DGR4i3VI55KnYk4IxrIw7+VG7Q3gA65azHnZxo98Il8IvYLr2UTBlSh72dTLlDf25NW51HqvJgYJDKvSaAeyHQ==" + }, + "node_modules/@firebase/functions/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/functions/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/installations": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.17.tgz", + "integrity": "sha512-AE/TyzIpwkC4UayRJD419xTqZkKzxwk0FLht3Dci8WI2OEKHSwoZG9xv4hOBZebe+fDzoV2EzfatQY8c/6Avig==", + "dependencies": { + "@firebase/component": "0.1.19", + "@firebase/installations-types": "0.3.4", + "@firebase/util": "0.3.2", + "idb": "3.0.2", + "tslib": "^1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz", + "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/installations/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", + "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" + }, + "node_modules/@firebase/messaging": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.7.1.tgz", + "integrity": "sha512-iev/ST9v0xd/8YpGYrZtDcqdD9J6ZWzSuceRn8EKy5vIgQvW/rk2eTQc8axzvDpQ36ZfphMYuhW6XuNrR3Pd2Q==", + "dependencies": { + "@firebase/component": "0.1.19", + "@firebase/installations": "0.4.17", + "@firebase/messaging-types": "0.5.0", + "@firebase/util": "0.3.2", + "idb": "3.0.2", + "tslib": "^1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/messaging-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.5.0.tgz", + "integrity": "sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/messaging/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/messaging/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/performance": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.4.1.tgz", + "integrity": "sha512-eAqS3/456xnUwuTg4w58x2fYbvTtQpgt67lpBUX3DuhOqwiM8+JELRte52nDgum2lTaTZWiu5de9mPuAYx2WDg==", + "dependencies": { + "@firebase/component": "0.1.19", + "@firebase/installations": "0.4.17", + "@firebase/logger": "0.2.6", + "@firebase/performance-types": "0.0.13", + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.13.tgz", + "integrity": "sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA==" + }, + "node_modules/@firebase/performance/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/performance/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/polyfill": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", + "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", + "dependencies": { + "core-js": "3.6.5", + "promise-polyfill": "8.1.3", + "whatwg-fetch": "2.0.4" + } + }, + "node_modules/@firebase/polyfill/node_modules/whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.28.tgz", + "integrity": "sha512-4zSdyxpt94jAnFhO8toNjG8oMKBD+xTuBIcK+Nw8BdQWeJhEamgXlupdBARUk1uf3AvYICngHH32+Si/dMVTbw==", + "dependencies": { + "@firebase/component": "0.1.19", + "@firebase/installations": "0.4.17", + "@firebase/logger": "0.2.6", + "@firebase/remote-config-types": "0.1.9", + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz", + "integrity": "sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA==" + }, + "node_modules/@firebase/remote-config/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/remote-config/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/storage": { + "version": "0.3.43", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.3.43.tgz", + "integrity": "sha512-Jp54jcuyimLxPhZHFVAhNbQmgTu3Sda7vXjXrNpPEhlvvMSq4yuZBR6RrZxe/OrNVprLHh/6lTCjwjOVSo3bWA==", + "dependencies": { + "@firebase/component": "0.1.19", + "@firebase/storage-types": "0.3.13", + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.3.13.tgz", + "integrity": "sha512-pL7b8d5kMNCCL0w9hF7pr16POyKkb3imOW7w0qYrhBnbyJTdVxMWZhb0HxCFyQWC0w3EiIFFmxoz8NTFZDEFog==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "0.x" + } + }, + "node_modules/@firebase/storage/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/storage/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/util": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.1.tgz", + "integrity": "sha512-zjVd9rfL08dRRdZILFn1RZTHb1euCcnD9N/9P56gdBcm2bvT5XsCC4G6t5toQBpE/H/jYe5h6MZMqfLu3EQLXw==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.3.0.tgz", + "integrity": "sha512-VniCGPIgSGNEgOkh5phb3iKmSGIzcwrccy3IomMFRWPCMiCk2y98UQNJEoDs1yIHtZMstVjYWKYxnunIGzC5UQ==" + }, + "node_modules/@google-cloud/common": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.3.2.tgz", + "integrity": "sha512-W7JRLBEJWYtZQQuGQX06U6GBOSLrSrlvZxv6kGNwJtFrusu6AVgZltQ9Pajuz9Dh9aSXy9aTnBcyxn2/O0EGUw==", + "optional": true, + "dependencies": { + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^6.0.0", + "retry-request": "^4.1.1", + "teeny-request": "^7.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/common/node_modules/duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/@google-cloud/common/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@google-cloud/firestore": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.2.0.tgz", + "integrity": "sha512-YCiKaTYCbXSoEvZ8cTmpgg4ebAvmFUOu3hj/aX+lHiOK7LsoFVi4jgNknogSqIiv04bxAysTBodpgn8XoZ4l5g==", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^2.2.0" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.4.tgz", + "integrity": "sha512-fKI+jYQdV1F9jtG6tSRro3ilNSeBWVmTzxc8Z0kiPRXcj8eshh9fiF8TtxfDefyUKgTdWgHpzGBwLbZ/OGikJg==", + "optional": true, + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", + "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.2.tgz", + "integrity": "sha512-EvuabjzzZ9E2+OaYf+7P9OAiiwbTxKYL0oGLnREQd+Su2NTQBpomkdlkBowFvyWsaV0d1sSGxrKpSNcrhPqbxg==", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/storage": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.3.0.tgz", + "integrity": "sha512-3t5UF3SZ14Bw2kcBHubCai6EIugU2GnQOstYWVSFuoO8IJ94RAaIOPq/dtexvQbUTpBTAGpd5smVR9WPL1mJVw==", + "optional": true, + "dependencies": { + "@google-cloud/common": "^3.3.0", + "@google-cloud/paginator": "^3.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.0", + "compressible": "^2.0.12", + "concat-stream": "^2.0.0", + "date-and-time": "^0.14.0", + "duplexify": "^3.5.0", + "extend": "^3.0.2", + "gaxios": "^3.0.0", + "gcs-resumable-upload": "^3.1.0", + "hash-stream-validation": "^0.2.2", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "onetime": "^5.1.0", + "p-limit": "^3.0.1", + "pumpify": "^2.0.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/storage/node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@google-cloud/storage/node_modules/p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "optional": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.1.tgz", + "integrity": "sha512-zyFq9eW0U4vGyhJS/oeW3mIeKTzB13we9rBclcisfRHxGQbC9FCOKQ5BBA2129yZwRVMt4hQia1igGzECeuY9g==", + "dependencies": { + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@types/node": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", + "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==" + }, + "node_modules/@grpc/proto-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", + "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "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/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "devOptional": true + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "node_modules/@types/node": { + "version": "10.17.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", + "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==" + }, + "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==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "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/agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/agent-base/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==", + "optional": true + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "devOptional": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "optional": true + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "optional": true + }, + "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/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "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==", + "devOptional": true, + "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==", + "devOptional": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "optional": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "optional": true, + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "devOptional": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "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": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "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==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/date-and-time": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz", + "integrity": "sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA==", + "optional": true + }, + "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/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "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/dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "dependencies": { + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=4.5.0" + } + }, + "node_modules/dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==", + "engines": { + "node": "*" + } + }, + "node_modules/dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "devOptional": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "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/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "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==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "devOptional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/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/engine.io/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/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "optional": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/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/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "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/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/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "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==", + "optional": true + }, + "node_modules/fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", + "optional": true + }, + "node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/firebase": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-7.20.0.tgz", + "integrity": "sha512-ijgiUPB93UGWw2P2kgUQgghu5WOn/WR2J8C/V6ZSeI1PQqiEwsfn0kvw4iMJeqLQpA/FVeZz/+p0ubE5kzqhBA==", + "dependencies": { + "@firebase/analytics": "0.5.0", + "@firebase/app": "0.6.11", + "@firebase/app-types": "0.6.1", + "@firebase/auth": "0.14.9", + "@firebase/database": "0.6.12", + "@firebase/firestore": "1.16.7", + "@firebase/functions": "0.4.51", + "@firebase/installations": "0.4.17", + "@firebase/messaging": "0.7.1", + "@firebase/performance": "0.4.1", + "@firebase/polyfill": "0.3.36", + "@firebase/remote-config": "0.1.28", + "@firebase/storage": "0.3.43", + "@firebase/util": "0.3.2" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/firebase-admin": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-9.1.1.tgz", + "integrity": "sha512-HkzY9yN/kOe1EQgjheURAQ4pFBerI54TBL0+nj1fwzKnAnGCpcI73Bbwx99Pk3u2x4rj6bDcsZfz9bA8y7DWtQ==", + "dependencies": { + "@firebase/database": "^0.6.10", + "@firebase/database-types": "^0.5.2", + "@types/node": "^10.10.0", + "dicer": "^0.3.0", + "jsonwebtoken": "^8.5.1", + "node-forge": "^0.9.1" + }, + "engines": { + "node": ">=10.10.0" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^4.0.0", + "@google-cloud/storage": "^5.0.0" + } + }, + "node_modules/firebase/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/firebase/node_modules/@firebase/database": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.12.tgz", + "integrity": "sha512-OLUxp8TkXiML4X5LWM5IACsSDvo3fcf4mTbTe5RF+N6TRFv0Svzlet5OgGIa3ET1dQvNiisrMX7zzRa0OTLs7Q==", + "dependencies": { + "@firebase/auth-interop-types": "0.1.5", + "@firebase/component": "0.1.19", + "@firebase/database-types": "0.5.2", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.2", + "faye-websocket": "0.11.3", + "tslib": "^1.11.1" + } + }, + "node_modules/firebase/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "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/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "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/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "optional": true + }, + "node_modules/gaxios": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.1.0.tgz", + "integrity": "sha512-DDTn3KXVJJigtz+g0J3vhcfbDbKtAroSTxauWsdnP57sM5KZ3d2c/3D9RKFJ86s43hfw6WULg6TXYw/AYiBlpA==", + "optional": true, + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcp-metadata": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.1.4.tgz", + "integrity": "sha512-5J/GIH0yWt/56R3dNaNWPGQ/zXsZOddYECfJaqxFWgrZ9HC2Kvc5vl9upOgUUHKzURjAVf2N+f6tEJiojqXUuA==", + "optional": true, + "dependencies": { + "gaxios": "^3.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcs-resumable-upload": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz", + "integrity": "sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A==", + "optional": true, + "dependencies": { + "abort-controller": "^3.0.0", + "configstore": "^5.0.0", + "extend": "^3.0.2", + "gaxios": "^3.0.0", + "google-auth-library": "^6.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + }, + "bin": { + "gcs-upload": "build/src/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "optional": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "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-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "dependencies": { + "ini": "^1.3.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/google-auth-library": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.0.6.tgz", + "integrity": "sha512-fWYdRdg55HSJoRq9k568jJA1lrhg9i2xgfhVIMJbskUmbDpJGHsbv9l41DGhCDXM21F9Kn4kUwdysgxSYBYJUw==", + "optional": true, + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^3.0.0", + "gcp-metadata": "^4.1.0", + "gtoken": "^5.0.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-gax": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.7.0.tgz", + "integrity": "sha512-0dBATy8mMVlfOBrT85Q+NzBpZ4OJZUMrPI9wJULpiIDq2w1zlN30Duor+fQUcMEjanYEc72G58M4iUVve0jfXw==", + "optional": true, + "dependencies": { + "@grpc/grpc-js": "~1.1.1", + "@grpc/proto-loader": "^0.5.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^3.6.0", + "google-auth-library": "^6.0.0", + "is-stream-ended": "^0.1.4", + "lodash.at": "^4.6.0", + "lodash.has": "^4.5.2", + "node-fetch": "^2.6.0", + "protobufjs": "^6.9.0", + "retry-request": "^4.0.0", + "semver": "^6.0.0", + "walkdir": "^0.4.0" + }, + "bin": { + "compileProtos": "build/tools/compileProtos.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-gax/node_modules/@grpc/grpc-js": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.8.tgz", + "integrity": "sha512-64hg5rmEm6F/NvlWERhHmmgxbWU8nD2TMWE+9TvG7/WcOrFT3fzg/Uu631pXRFwmJ4aWO/kp9vVSlr8FUjBDLA==", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.6.0-pre14", + "@types/node": "^12.12.47", + "google-auth-library": "^6.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/google-gax/node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.2.tgz", + "integrity": "sha512-q2Qle60Ht2OQBCp9S5hv1JbI4uBBq6/mqSevFNK3ZEgRDBCAkWqZPUhD/K9gXOHrHKluliHiVq2L9sw1mVyAIg==", + "optional": true, + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.1.1" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/google-gax/node_modules/@types/node": { + "version": "12.20.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.12.tgz", + "integrity": "sha512-KQZ1al2hKOONAs2MFv+yTQP1LkDWMrRJ9YCVRalXltOfXsBmH5IownLxQaiq0lnAHwAViLnh2aTYqrPcRGEbgg==", + "optional": true + }, + "node_modules/google-gax/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/google-gax/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==", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/google-gax/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/google-gax/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/google-gax/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==", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/google-gax/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-gax/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "optional": true, + "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/google-gax/node_modules/yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-p12-pem": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.2.tgz", + "integrity": "sha512-tbjzndQvSIHGBLzHnhDs3cL4RBjLbLXc2pYvGH+imGVu5b4RMAttUTdnmW2UH0t11QeBTXZ7wlXPS7hrypO/tg==", + "optional": true, + "dependencies": { + "node-forge": "^0.9.0" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "devOptional": true + }, + "node_modules/gtoken": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.3.tgz", + "integrity": "sha512-Nyd1wZCMRc2dj/mAD0LlfQLcAO06uKdpKJXvK85SGrF5+5+Bpfil9u/2aw35ltvEHjvl0h5FMKN5knEU+9JrOg==", + "optional": true, + "dependencies": { + "gaxios": "^3.0.0", + "google-p12-pem": "^3.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gtoken/node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-stream-validation": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.3.tgz", + "integrity": "sha512-OEohGLoUOh+bwsIpHpdvhIXFyRGjeLqJbT8Yc5QTZPbRM7LKywagTQxnX/6mghLDOrD9YGz88hy5mLN2eKflYQ==", + "optional": true, + "dependencies": { + "through2": "^2.0.0" + } + }, + "node_modules/hash-stream-validation/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "optional": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": 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-parser-js": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", + "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" + }, + "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/http-proxy-agent/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/http-proxy-agent/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==", + "optional": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/https-proxy-agent/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==", + "optional": true + }, + "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/idb": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", + "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" + }, + "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": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "devOptional": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/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-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==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "optional": true + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "devOptional": true + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dependencies": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch/node_modules/node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "optional": true, + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/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/jsonwebtoken/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/jsonwebtoken/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/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lerp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lerp/-/lerp-1.0.3.tgz", + "integrity": "sha1-oYyJaPkXiW3hXM/MKNVaa3Med24=" + }, + "node_modules/lodash.at": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", + "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=", + "optional": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "node_modules/lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", + "optional": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "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/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "optional": true, + "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==", + "devOptional": true, + "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==", + "devOptional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.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/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/moment": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz", + "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==", + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/nodemon": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", + "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^4.0.0" + }, + "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.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "devOptional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "optional": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/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/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-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "optional": true + }, + "node_modules/promise-polyfill": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", + "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" + }, + "node_modules/protobufjs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz", + "integrity": "sha512-pb8kTchL+1Ceg4lFd5XUpK8PdWacbvV5SK2ULH2ebrYtl4GjJmS24m6CKME67jzV53tbJxHlnNOSqQHbTsR9JQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/protobufjs/node_modules/@types/node": { + "version": "13.13.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.15.tgz", + "integrity": "sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw==" + }, + "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==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "devOptional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "optional": true, + "dependencies": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "node_modules/pumpify/node_modules/duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/pumpify/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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.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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "node_modules/readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/retry-request": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.2.tgz", + "integrity": "sha512-fa4OwUcplhOYIhTm7zt6xsUfoApWo+auhvxbpPR4XLxHj0k67MhPItpCzYWzOEjtJlCH4MJ5V0qUrXiu/pOpag==", + "optional": true, + "dependencies": { + "debug": "^4.1.1", + "through2": "^3.0.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/retry-request/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/retry-request/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==", + "optional": true + }, + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "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/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/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/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/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/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/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "devOptional": true + }, + "node_modules/snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", + "optional": true + }, + "node_modules/socket.io": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", + "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + }, + "node_modules/socket.io-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/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/socket.io-parser/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/socket.io/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/socket.io/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/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/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "optional": true + }, + "node_modules/streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "engines": { + "node": ">=0.8.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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "devOptional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "devOptional": true + }, + "node_modules/string-width/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==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "devOptional": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "optional": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/teeny-request": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.0.tgz", + "integrity": "sha512-kWD3sdGmIix6w7c8ZdVKxWq+3YwVPGWz+Mq0wRZXayEKY/YHb63b8uphfBzcFDmyq8frD9+UTc3wLyOhltRbtg==", + "optional": true, + "dependencies": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.2.0", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "optional": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "optional": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "devOptional": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "dependencies": { + "debug": "^2.2.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "devOptional": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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-notifier": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", + "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "dev": true, + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "optional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz", + "integrity": "sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ==" + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "devOptional": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "devOptional": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "engines": { + "node": ">=0.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==", + "optional": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } + }, "dependencies": { "@firebase/analytics": { "version": "0.5.0", @@ -90,12 +4119,14 @@ "@firebase/auth-interop-types": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz", - "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==" + "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==", + "requires": {} }, "@firebase/auth-types": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.1.tgz", - "integrity": "sha512-/+gBHb1O9x/YlG7inXfxff/6X3BPZt4zgBv4kql6HEmdzNQCodIRlEYnI+/da+lN+dha7PjaFH7C7ewMmfV7rw==" + "integrity": "sha512-/+gBHb1O9x/YlG7inXfxff/6X3BPZt4zgBv4kql6HEmdzNQCodIRlEYnI+/da+lN+dha7PjaFH7C7ewMmfV7rw==", + "requires": {} }, "@firebase/component": { "version": "0.1.18", @@ -166,7 +4197,8 @@ "@firebase/firestore-types": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.12.1.tgz", - "integrity": "sha512-CpWcDriYnGDoAl0D9DcSuwX0b/fXqi7qOwuuTI1M0SYxau48G8cqhVjzjqPDgEM3kDGYJTnPN3ALS0Z4cnwERQ==" + "integrity": "sha512-CpWcDriYnGDoAl0D9DcSuwX0b/fXqi7qOwuuTI1M0SYxau48G8cqhVjzjqPDgEM3kDGYJTnPN3ALS0Z4cnwERQ==", + "requires": {} }, "@firebase/functions": { "version": "0.4.51", @@ -238,7 +4270,8 @@ "@firebase/installations-types": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz", - "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q==" + "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q==", + "requires": {} }, "@firebase/logger": { "version": "0.2.6", @@ -280,7 +4313,8 @@ "@firebase/messaging-types": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.5.0.tgz", - "integrity": "sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg==" + "integrity": "sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg==", + "requires": {} }, "@firebase/performance": { "version": "0.4.1", @@ -406,7 +4440,8 @@ "@firebase/storage-types": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.3.13.tgz", - "integrity": "sha512-pL7b8d5kMNCCL0w9hF7pr16POyKkb3imOW7w0qYrhBnbyJTdVxMWZhb0HxCFyQWC0w3EiIFFmxoz8NTFZDEFog==" + "integrity": "sha512-pL7b8d5kMNCCL0w9hF7pr16POyKkb3imOW7w0qYrhBnbyJTdVxMWZhb0HxCFyQWC0w3EiIFFmxoz8NTFZDEFog==", + "requires": {} }, "@firebase/util": { "version": "0.3.1", @@ -625,6 +4660,11 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -643,7 +4683,18 @@ "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "devOptional": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" }, "@types/long": { "version": "4.0.1", @@ -671,19 +4722,14 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "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==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, "agent-base": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", @@ -742,6 +4788,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "devOptional": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -762,33 +4809,18 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, "arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "optional": true }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", @@ -812,26 +4844,23 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" } }, "boxen": { @@ -881,9 +4910,9 @@ "optional": true }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cacheable-request": { "version": "6.1.0", @@ -917,6 +4946,15 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -991,6 +5029,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, "requires": { "color-name": "~1.1.4" } @@ -998,22 +5037,8 @@ "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==" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true }, "compressible": { "version": "2.0.18", @@ -1059,6 +5084,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "devOptional": true, "requires": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", @@ -1069,11 +5095,18 @@ } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "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==" + } } }, "content-type": { @@ -1082,9 +5115,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", @@ -1102,10 +5135,20 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "optional": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "devOptional": true }, "date-and-time": { "version": "0.14.2", @@ -1143,14 +5186,14 @@ "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "dicer": { "version": "0.3.0", @@ -1169,6 +5212,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "devOptional": true, "requires": { "is-obj": "^2.0.0" } @@ -1202,7 +5246,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "emoji-regex": { "version": "7.0.3", @@ -1213,7 +5257,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "encoding": { "version": "0.1.13", @@ -1237,82 +5281,52 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "devOptional": true, "requires": { "once": "^1.4.0" } }, "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" }, "dependencies": { "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "engine.io-client": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", - "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==" }, "ent": { "version": "2.2.0", @@ -1335,12 +5349,12 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "event-target-shim": { "version": "5.0.1", @@ -1349,40 +5363,48 @@ "optional": true }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "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.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "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" + }, + "dependencies": { + "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==" + } } }, "extend": { @@ -1420,16 +5442,16 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" } }, @@ -1503,14 +5525,14 @@ } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fsevents": { "version": "2.1.3", @@ -1519,6 +5541,11 @@ "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -1569,6 +5596,16 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "optional": true }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -1771,7 +5808,8 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "devOptional": true }, "gtoken": { "version": "5.0.3", @@ -1793,25 +5831,25 @@ } } }, - "has-binary2": { + "has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "isarray": "2.0.1" + "function-bind": "^1.1.1" } }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -1846,15 +5884,15 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "http-parser-js": { @@ -1945,17 +5983,13 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "devOptional": true }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -2032,7 +6066,8 @@ "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "devOptional": true }, "is-path-inside": { "version": "3.0.2", @@ -2055,7 +6090,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "devOptional": true }, "is-yarn-global": { "version": "0.3.0", @@ -2063,11 +6099,6 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, "isomorphic-fetch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", @@ -2271,6 +6302,7 @@ "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==", + "devOptional": true, "requires": { "semver": "^6.0.0" }, @@ -2278,14 +6310,15 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "devOptional": true } } }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "merge-descriptors": { "version": "1.0.1", @@ -2303,16 +6336,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -2360,9 +6393,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "node-fetch": { "version": "2.6.0", @@ -2430,10 +6463,20 @@ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", "dev": true }, + "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==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -2442,6 +6485,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "devOptional": true, "requires": { "wrappy": "1" } @@ -2487,16 +6531,6 @@ } } }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2558,11 +6592,11 @@ } }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "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==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -2576,6 +6610,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "devOptional": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -2627,9 +6662,12 @@ } }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } }, "range-parser": { "version": "1.2.1", @@ -2637,12 +6675,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -2784,52 +6822,63 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "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": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "devOptional": true }, "snakeize": { "version": "0.1.0", @@ -2838,110 +6887,66 @@ "optional": true }, "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", + "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.0" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" - }, - "socket.io-client": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" }, "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "stream-events": { "version": "1.0.5", @@ -2963,10 +6968,20 @@ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, + "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==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "devOptional": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2976,37 +6991,32 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "devOptional": true }, "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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "devOptional": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "devOptional": true }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "devOptional": true, "requires": { "ansi-regex": "^5.0.0" } } } }, - "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==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -3064,21 +7074,8 @@ "requires": { "inherits": "^2.0.4", "readable-stream": "2 || 3" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "optional": true - } } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -3095,9 +7092,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "touch": { "version": "3.1.0", @@ -3138,6 +7135,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "devOptional": true, "requires": { "is-typedarray": "^1.0.0" } @@ -3155,6 +7153,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "devOptional": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -3162,7 +7161,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "update-notifier": { "version": "4.1.0", @@ -3254,12 +7253,14 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "devOptional": true }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "devOptional": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -3268,25 +7269,22 @@ } }, "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==" + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "devOptional": true }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -3298,11 +7296,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "optional": true - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } } diff --git a/bwo-server/package.json b/bwo-server/package.json index c1613c2..4a59617 100644 --- a/bwo-server/package.json +++ b/bwo-server/package.json @@ -6,12 +6,13 @@ "type": "module", "scripts": { "start": "node server.js --env=development --resetstate ", + "dev": "nodemon server.js --env=localhost --resetstate ", "test": "jasmine" }, "author": "Dannark", "license": "ISC", "dependencies": { - "express": "^4.17.1", + "express": "^4.18.2", "extend": "^3.0.2", "firebase": "^7.20.0", "firebase-admin": "^9.1.1", @@ -19,7 +20,7 @@ "minimist": "^1.2.5", "moment": "^2.28.0", "moment-timezone": "^0.5.31", - "socket.io": "^2.4.0" + "socket.io": "^4.5.2" }, "devDependencies": { "nodemon": "^2.0.4" @@ -29,4 +30,4 @@ "/resources/data/tmp/*" ] } -} +} \ No newline at end of file diff --git a/bwo-server/resources/data/firebase_storage.js b/bwo-server/resources/data/firebase_storage.js index 469f216..a21cc17 100644 --- a/bwo-server/resources/data/firebase_storage.js +++ b/bwo-server/resources/data/firebase_storage.js @@ -61,7 +61,7 @@ export function loadState() { if (loadedState != undefined && loadedState != '') { defaulState = loadedState; } - //console.log('defaulState',defaulState); + console.log('defaulState',defaulState); return defaulState; } diff --git a/bwo-server/resources/data/tmp/game-state.json b/bwo-server/resources/data/tmp/game-state.json index 6b8fd02..1a9190f 100644 --- a/bwo-server/resources/data/tmp/game-state.json +++ b/bwo-server/resources/data/tmp/game-state.json @@ -1 +1 @@ -{"statistics":{"msgRecived":107,"msgSent":341},"players":{},"enemys":{"_2yoamkfru":{"enemyId":"_2yoamkfru","name":"Skull","x":1166.9859985793114,"y":-1740.9588328160362,"toX":1166.9859985793114,"toY":-1740.9588328160362,"hp":6,"lv":1},"_u5q309e2b":{"enemyId":"_u5q309e2b","name":"Skull","x":-1489,"y":-1907,"toX":-1582,"toY":-1907,"hp":6,"lv":1,"last_damage_stamp":"2020-08-26T21:29:22-03:00"}},"trees":{}} \ No newline at end of file +{"statistics":{"msgRecived":1258,"msgSent":3698},"players":{},"enemys":{"_2yoamkfru":{"enemyId":"_2yoamkfru","name":"Skull","x":987.9859985793114,"y":-3824.958832816036,"toX":987.9859985793114,"toY":-3824.958832816036,"hp":6,"lv":1},"_u5q309e2b":{"enemyId":"_u5q309e2b","name":"Skull","x":1128,"y":-3287,"toX":1128,"toY":-3287,"hp":6,"lv":1,"last_damage_stamp":"2020-08-26T21:29:22-03:00"},"_je8szqll5":{"enemyId":"_je8szqll5","name":"Skull","x":-1357,"y":11894,"toX":-1357,"toY":11894,"hp":6,"lv":1},"_8dp6aic79":{"enemyId":"_8dp6aic79","name":"Skull","x":-112,"y":11961,"toX":-112,"toY":11961,"hp":6,"lv":1,"last_damage_stamp":"2022-10-19T14:38:59+07:00"},"_rp0tcu819":{"enemyId":"_rp0tcu819","name":"Skull","x":1368,"y":11689,"toX":1368,"toY":11689,"hp":6,"lv":1},"_xh4mpjivd":{"enemyId":"_xh4mpjivd","name":"Skull","x":1107,"y":9748,"toX":1107,"toY":9748,"hp":6,"lv":1},"_ju51zzglh":{"enemyId":"_ju51zzglh","name":"Skull","x":1435,"y":10672,"toX":1435,"toY":10672,"hp":6,"lv":1,"last_damage_stamp":"2022-10-19T14:32:36+07:00"},"_9lukz6vfq":{"enemyId":"_9lukz6vfq","name":"Skull","x":3678,"y":12476,"toX":3581,"toY":12512,"hp":6,"lv":1},"_nyyf79jny":{"enemyId":"_nyyf79jny","name":"Skull","x":2326,"y":12311,"toX":2436,"toY":12311,"hp":6,"lv":1},"_v4p1ja28y":{"enemyId":"_v4p1ja28y","name":"Skull","x":3810,"y":12485,"toX":3810,"toY":12485,"hp":6,"lv":1},"_hvn7dgw1b":{"enemyId":"_hvn7dgw1b","name":"Skull","x":5654,"y":12166,"toX":5654,"toY":12166,"hp":6,"lv":1},"_r3nduc1so":{"enemyId":"_r3nduc1so","name":"Skull","x":4353,"y":12670,"toX":4278,"toY":12704,"hp":6,"lv":1},"_gzdji60op":{"enemyId":"_gzdji60op","name":"Skull","x":4236,"y":10464,"toX":4236,"toY":10464,"hp":6,"lv":1},"_unkqc13d1":{"enemyId":"_unkqc13d1","name":"Skull","x":6150,"y":12013,"toX":6150,"toY":12013,"hp":6,"lv":1},"_os3d3pgh5":{"enemyId":"_os3d3pgh5","name":"Skull","x":5699,"y":12197,"toX":5722,"toY":12121,"hp":6,"lv":1,"last_damage_stamp":"2022-10-19T14:34:08+07:00"},"_0lnwn8evp":{"enemyId":"_0lnwn8evp","name":"Skull","x":58,"y":527,"toX":-36,"toY":499,"hp":6,"lv":1,"last_damage_stamp":"2022-10-19T14:34:50+07:00"},"_24pndtefo":{"enemyId":"_24pndtefo","name":"Skull","x":639,"y":19,"toX":639,"toY":19,"hp":6,"lv":1},"_m2vdv1ob9":{"enemyId":"_m2vdv1ob9","name":"Skull","x":71,"y":-1584,"toX":-24,"toY":-1688,"hp":6,"lv":1},"_dus5k2imz":{"enemyId":"_dus5k2imz","name":"Skull","x":-702,"y":-303,"toX":-798,"toY":-276,"hp":6,"lv":1,"last_damage_stamp":"2022-10-19T14:52:09+07:00"},"_2fmw50tli":{"enemyId":"_2fmw50tli","name":"Skull","x":-304,"y":-103,"toX":-245,"toY":-65,"hp":6,"lv":1,"last_damage_stamp":"2022-10-19T14:52:08+07:00"}},"trees":{}} \ No newline at end of file diff --git a/lib/Effects/Effect.dart b/lib/Effects/Effect.dart index 99399ae..813c2cc 100644 --- a/lib/Effects/Effect.dart +++ b/lib/Effects/Effect.dart @@ -1,3 +1,5 @@ +// ignore_for_file: file_names + import 'package:flutter/material.dart'; abstract class Effect { diff --git a/lib/Effects/damage_effect.dart b/lib/Effects/damage_effect.dart index e20bf70..6c7f6da 100644 --- a/lib/Effects/damage_effect.dart +++ b/lib/Effects/damage_effect.dart @@ -1,8 +1,7 @@ import 'dart:math'; import 'dart:ui'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../game_controller.dart'; @@ -56,11 +55,12 @@ class DamageText { driftX += 15 * GameController.deltaTime * xRandomDirection; initialFontSize = lerpDouble(initialFontSize, 8, GameController.deltaTime * 1); - var textConfig = TextConfig( - fontSize: initialFontSize, - color: isMine ? Colors.white : Color.fromRGBO(229, 184, 46, 1), - fontFamily: "Blocktopia"); - textConfig.render(c, "$damage", Position(posX + driftX, posY + driftY)); + var textConfig = TextPaint( + style: TextStyle( + fontSize: initialFontSize, + color: isMine ? Colors.white : Color.fromRGBO(229, 184, 46, 1), + fontFamily: "Blocktopia")); + textConfig.render(c, "$damage", Vector2(posX + driftX, posY + driftY)); if (GameController.time > lifeTime) { markedToBeDestroyed = true; diff --git a/lib/Effects/ripple_water_effect.dart b/lib/Effects/ripple_water_effect.dart index 530f2d8..a680dca 100644 --- a/lib/Effects/ripple_water_effect.dart +++ b/lib/Effects/ripple_water_effect.dart @@ -1,11 +1,11 @@ import 'dart:ui'; -import 'package:flame/position.dart'; +import 'package:flame/extensions.dart'; import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; import '../game_controller.dart'; import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; class RippleWaterEffect { double animSpeed = 1; @@ -55,8 +55,10 @@ class Ripple { var halfwidth = (16 * _scale) / 2; var halfheight = (16 * _scale) / 2; - ripple.renderScaled(c, Position(x - halfwidth, y - halfheight), - scale: _scale, overridePaint: p); + ripple.render(c, + position: Vector2(x - halfwidth, y - halfheight), + size: Vector2.all(SpriteController.spriteSize * _scale), + overridePaint: p); } bool isAlive() { diff --git a/lib/Effects/walk_effect.dart b/lib/Effects/walk_effect.dart index d5e209e..b22a446 100644 --- a/lib/Effects/walk_effect.dart +++ b/lib/Effects/walk_effect.dart @@ -1,13 +1,15 @@ import 'dart:math'; import 'dart:ui'; -import 'package:flame/animation.dart' as anim; -import 'package:flame/position.dart'; +import 'package:flame/components.dart'; +import 'package:flame/extensions.dart'; import 'package:flutter/material.dart'; import '../game_controller.dart'; import '../map/ground.dart'; import '../server/utils/server_utils.dart'; +import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; class WalkEffect { double animSpeed = 1; @@ -92,32 +94,30 @@ class WalkEffect { timeInFutureForSoundSteps = GameController.time + delay; if (ServerUtils.database == 'production') { - //Flame.audio.play(audioName, volume: volume); + // FlameAudio.play(audioName, volume: volume); } } } } -class GrassFX { +class GrassFX extends SpriteAnimationGroupComponent { double x, y; - anim.Animation grassAnim; Paint p = Paint(); GrassFX(this.x, this.y) { - grassAnim = anim.Animation.sequenced('effects/walk_grass.png', 6, - textureWidth: 16, textureHeight: 16, loop: false, stepTime: 0.1); p.color = Color.fromRGBO(255, 255, 255, .75); } void draw(Canvas c) { - grassAnim.update(GameController.deltaTime); - grassAnim - .getSprite() - .renderPosition(c, Position(x - 7, y - 8), overridePaint: p); + PreloadAssets.getGrassAnim().update(GameController.deltaTime); + PreloadAssets.getGrassAnim().getSprite().render(c, + position: Vector2(x - 7, y - 8), + overridePaint: p, + size: Vector2.all(SpriteController.spriteSize)); } bool isAlive() { - return grassAnim.isLastFrame == false; + return PreloadAssets.getGrassAnim().isLastFrame == false; } } diff --git a/lib/Entity/Enemys/Enemy.dart b/lib/Entity/Enemys/Enemy.dart index d40b98b..489453e 100644 --- a/lib/Entity/Enemys/Enemy.dart +++ b/lib/Entity/Enemys/Enemy.dart @@ -1,15 +1,13 @@ import 'dart:math'; -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../../game_controller.dart'; import '../../map/map_controller.dart'; import '../../utils/on_animation_end.dart'; import '../../utils/sprite_controller.dart'; -import '../entity.dart'; +import '../Entity.dart'; import 'ia_controller.dart'; import 'ia_network_controller.dart'; @@ -54,13 +52,15 @@ class Enemy extends Entity implements OnAnimationEnd { stopAnimWhenIdle: stopAnimWhenIdle); } //debugDraw(c); - TextConfig(fontSize: 11.0, color: Colors.white, fontFamily: "Blocktopia") - .render(c, name, Position(x, y - 32), anchor: Anchor.bottomCenter); + TextPaint( + style: TextStyle( + fontSize: 11.0, color: Colors.white, fontFamily: "Blocktopia")) + .render(c, name, Vector2(x, y - 32), anchor: Anchor.bottomCenter); } @override - void update() { - super.update(); + void update(double dt) { + super.update(dt); iaController.update(); slowSpeedWhenItSinks(mapHeight); moveWithPhysics(); diff --git a/lib/Entity/Enemys/Skull.dart b/lib/Entity/Enemys/Skull.dart index cb7b131..4d22fd5 100644 --- a/lib/Entity/Enemys/Skull.dart +++ b/lib/Entity/Enemys/Skull.dart @@ -1,3 +1,5 @@ +// ignore_for_file: file_names + import 'package:flutter/material.dart'; import '../../map/map_controller.dart'; diff --git a/lib/Entity/Enemys/ia_controller.dart b/lib/Entity/Enemys/ia_controller.dart index 8d6ab59..11e1ebf 100644 --- a/lib/Entity/Enemys/ia_controller.dart +++ b/lib/Entity/Enemys/ia_controller.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../entity.dart'; +import '../Entity.dart'; import 'enemy.dart'; abstract class IAController { diff --git a/lib/Entity/Enemys/ia_network_controller.dart b/lib/Entity/Enemys/ia_network_controller.dart index 91a45de..d113e2c 100644 --- a/lib/Entity/Enemys/ia_network_controller.dart +++ b/lib/Entity/Enemys/ia_network_controller.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../entity.dart'; +import '../Entity.dart'; import 'enemy.dart'; import 'ia_controller.dart'; diff --git a/lib/Entity/Entity.dart b/lib/Entity/Entity.dart index d05d110..1ceea06 100644 --- a/lib/Entity/Entity.dart +++ b/lib/Entity/Entity.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:flame/position.dart'; +import 'package:flame/extensions.dart'; import 'package:flame/sprite.dart'; import 'package:flutter/material.dart'; @@ -9,6 +9,7 @@ import '../effects/ripple_water_effect.dart'; import '../effects/walk_effect.dart'; import '../scene/game_scene.dart'; import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; import 'physics_entity.dart'; import 'player/player.dart'; import 'status.dart'; @@ -54,7 +55,7 @@ abstract class Entity extends PhysicsEntity { print("drawning wrongly, this draw method should be overwritten."); } - void update() { + void update(double dt) { if (!isActive || marketToBeRemoved) { return; } @@ -94,13 +95,12 @@ abstract class Entity extends PhysicsEntity { var sizeX = 16 * shadownSize / 2; var sizeY = (16 - 3) * shadownSize; - shadownLarge?.renderScaled( + shadownLarge?.render( c, - Position( - x - sizeX * distanceToGround + shadownOffset.dx, - y - sizeY * distanceToGround + shadownOffset.dy, - ), - scale: shadownSize * distanceToGround, + position: Vector2(x - sizeX * distanceToGround + shadownOffset.dx, + y - sizeY * distanceToGround + shadownOffset.dy), + size: Vector2.all( + SpriteController.spriteSize * shadownSize * distanceToGround), overridePaint: p, ); } diff --git a/lib/Entity/Equipment.dart b/lib/Entity/Equipment.dart index 49f44dc..654c74c 100644 --- a/lib/Entity/Equipment.dart +++ b/lib/Entity/Equipment.dart @@ -1,3 +1,5 @@ +// ignore_for_file: file_names + import 'package:flutter/material.dart'; import '../utils/on_animation_end.dart'; diff --git a/lib/Entity/Items/Items.dart b/lib/Entity/Items/Items.dart index 8a3eb8c..01f9472 100644 --- a/lib/Entity/Items/Items.dart +++ b/lib/Entity/Items/Items.dart @@ -1,10 +1,11 @@ -import 'package:flame/flame.dart'; -import 'package:flame/position.dart'; +import 'package:flame/extensions.dart'; import 'package:flame/sprite.dart'; +import 'package:flame_audio/flame_audio.dart'; import 'package:flutter/material.dart'; import '../../game_controller.dart'; -import '../entity.dart'; +import '../../utils/sprite_controller.dart'; +import '../Entity.dart'; import '../player/player.dart'; import 'item_database.dart'; @@ -31,7 +32,7 @@ class Item extends Entity { } void loadSprite() async { - sprite = await Sprite.loadSprite(proprieties.imgPath); + sprite = await Sprite.load(proprieties.imgPath); } @override @@ -46,8 +47,10 @@ class Item extends Entity { p.color = Color.fromRGBO(255, 255, 255, alphaBlink); var pivot = Offset((proprieties.zoom * 16) / 2, (proprieties.zoom * 16)); - sprite.renderScaled(c, Position(x - pivot.dx, y - pivot.dy - z), - scale: proprieties.zoom, overridePaint: p); + sprite.render(c, + position: Vector2(x - pivot.dx, y - pivot.dy - z), + size: Vector2.all(SpriteController.spriteSize * proprieties.zoom), + overridePaint: p); updatePhysics(); if (GameController.time > lifeTime) { @@ -65,11 +68,11 @@ class Item extends Entity { playerEntity.status.addEnergy(proprieties.energy); playerEntity.status.addHungriness(proprieties.hungriness); - Flame.audio.play("items/eating_apple.mp3", volume: 0.3); + FlameAudio.play("items/eating_apple.mp3", volume: 0.3); } else if (proprieties.itemType == ItemType.weapon) { if (playerEntity is Player) { amount--; //removes item from inventory - playerEntity.equipmentController.equipItem(this); + (playerEntity).equipmentController.equipItem(this); } } } diff --git a/lib/Entity/Player/Player.dart b/lib/Entity/Player/Player.dart index aba5cc2..3731efb 100644 --- a/lib/Entity/Player/Player.dart +++ b/lib/Entity/Player/Player.dart @@ -1,33 +1,30 @@ import 'dart:math'; -import 'dart:ui'; -import 'package:flame/anchor.dart'; -import 'package:flame/flame.dart'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; +import 'package:flame_audio/flame_audio.dart'; import 'package:flutter/material.dart'; +import '../../entity/player/player_actions.dart'; +import '../../entity/player/player_network.dart'; import '../../game_controller.dart'; import '../../hud/build/build_foundation.dart'; import '../../hud/build/build_hud.dart'; import '../../hud/inventory.dart'; import '../../hud/player_hud.dart'; import '../../map/map_controller.dart'; -import '../../scene/scene_object.dart' ''; +import '../../scene/scene_object.dart'; import '../../utils/on_animation_end.dart'; import '../../utils/preload_assets.dart'; -import '../../utils/sprite_controller.dart' ''; -import '../entity.dart'; +import '../../utils/sprite_controller.dart'; +import '../Entity.dart'; import '../equipment_controller.dart'; import '../items/items.dart'; import 'input_controller.dart'; -import 'player_actions.dart'; -import 'player_network.dart'; class Player extends Entity implements OnAnimationEnd { - final TextConfig _text = - TextConfig(fontSize: 12.0, color: Colors.white, fontFamily: "Blocktopia"); + final TextPaint _text = TextPaint( + style: TextStyle( + fontSize: 12.0, color: Colors.white, fontFamily: "Blocktopia")); SpriteController walkSprites; SpriteController attackSprites; @@ -103,16 +100,16 @@ class Player extends Entity implements OnAnimationEnd { stopAnimWhenIdle: stopAnimWhenIdle); } //debugDraw(c); - _text.render(c, name, Position(x, y - 45), anchor: Anchor.bottomCenter); + _text.render(c, name, Vector2(x, y - 45), anchor: Anchor.bottomCenter); } @override - void update() { - super.update(); + void update(double dt) { + super.update(dt); if (isActive == false) { return; } - _inputController?.update(); + _inputController?.update(dt); slowSpeedWhenItSinks(mapHeight); moveWithPhysics(); @@ -123,7 +120,9 @@ class Player extends Entity implements OnAnimationEnd { void die(Canvas c) { if (status.isAlive() == false) { isActive = false; - _deathSprite?.renderScaled(c, Position(x - 16, y - 32), scale: 2); + _deathSprite?.render(c, + position: Vector2(x - 16, y - 32), + size: Vector2.all(SpriteController.spriteSize * 2)); if (!isMine) return; @@ -170,7 +169,7 @@ class Player extends Entity implements OnAnimationEnd { if (entity is Item) { _inventory.addItem(entity) ? entity.destroy() : null; - Flame.audio.play("pickup_item1.mp3", volume: 0.9); + FlameAudio.play("pickup_item1.mp3", volume: 0.9); } } diff --git a/lib/Entity/Player/input_controller.dart b/lib/Entity/Player/input_controller.dart index 5868315..159de6a 100644 --- a/lib/Entity/Player/input_controller.dart +++ b/lib/Entity/Player/input_controller.dart @@ -21,12 +21,12 @@ class InputController { joystick = JoystickUI(player, player.sceneObject.hud); } - void update() { + void update(double dt) { if (!player.isMine) { return; } - joystick.update(isEnable: player.canWalk); + joystick.update(dt, isEnable: player.canWalk); } void registerAccelerometer() { diff --git a/lib/Entity/Player/joystick_ui.dart b/lib/Entity/Player/joystick_ui.dart index fbc4963..428e8fc 100644 --- a/lib/Entity/Player/joystick_ui.dart +++ b/lib/Entity/Player/joystick_ui.dart @@ -19,7 +19,7 @@ class JoystickUI extends UIElement { drawOnHUD = true; } - void update({bool isEnable = true}) { + void update(double dt, {bool isEnable = true}) { this.isEnable = isEnable; _player.xSpeed = 0; _player.ySpeed = 0; diff --git a/lib/Entity/Player/player_actions.dart b/lib/Entity/Player/player_actions.dart index 0b5dcd1..642fb7b 100644 --- a/lib/Entity/Player/player_actions.dart +++ b/lib/Entity/Player/player_actions.dart @@ -7,6 +7,8 @@ import '../../utils/tap_state.dart'; import '../enemys/enemy.dart'; import 'player.dart'; +// import '../enemys/enemy.dart'; + class PlayerActions { Player player; PlayerActions(this.player); diff --git a/lib/Entity/Player/player_network.dart b/lib/Entity/Player/player_network.dart index 025df13..984ee0a 100644 --- a/lib/Entity/Player/player_network.dart +++ b/lib/Entity/Player/player_network.dart @@ -1,6 +1,6 @@ import 'dart:ui'; -import 'package:flame/flame.dart'; +import 'package:flame_audio/flame_audio.dart'; import '../../game_controller.dart'; import '../../scene/game_scene.dart'; @@ -86,14 +86,14 @@ class PlayerNetwork { /// Attack Enemy Entity, the damage is not calculated on the server-side. void attackEnemy(String enemyId, int damage) { - Flame.audio.play('punch.mp3', volume: 0.4); + FlameAudio.play('punch.mp3', volume: 0.4); var jsonData = {"enemyId": enemyId, "damage": damage}; GameScene.serverController.sendMessage("onPlayerAttackEnemy", jsonData); } void hitTreeAnimation(double targetX, double targetY) { player.currentSprite = player.attackSprites; - Flame.audio.play("punch.mp3", volume: 0.5); + FlameAudio.play("punch.mp3", volume: 0.5); player.status.consumeHungriness(0.3); var targetPos = Offset(targetX, targetY); diff --git a/lib/Entity/Status.dart b/lib/Entity/Status.dart index 977239c..d7ec4ea 100644 --- a/lib/Entity/Status.dart +++ b/lib/Entity/Status.dart @@ -1,3 +1,5 @@ +// ignore_for_file: file_names + import '../game_controller.dart'; class Status { diff --git a/lib/Entity/wall/door.dart b/lib/Entity/wall/door.dart index 1dead7a..6ed08fb 100644 --- a/lib/Entity/wall/door.dart +++ b/lib/Entity/wall/door.dart @@ -1,12 +1,15 @@ -import 'package:flame/position.dart'; +import 'dart:developer'; + +import 'package:flame/extensions.dart'; import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; import '../../utils/preload_assets.dart'; +import '../../utils/sprite_controller.dart'; import 'furniture.dart'; class Door extends Furniture { Sprite openDoor; + Sprite sprite; bool show = true; bool isOpen = false; @@ -18,10 +21,12 @@ class Door extends Furniture { void loadsprite() { openDoor = PreloadAssets.getFurnitureSprite('${imageId}_open'); + sprite = PreloadAssets.getFurnitureSprite(imageId); } @override void draw(Canvas c) { + var pivot = Offset((zoom * 16) / 2, height); if (isOpen) { currentSprite = openDoor; isActive = false; @@ -29,7 +34,11 @@ class Door extends Furniture { currentSprite = sprite; isActive = true; } - super.draw(c); - //sprite?.renderScaled(c, Position(x, y), scale: 1); + log('${x - pivot.dy}, $y + ${pivot.dy}'); + currentSprite?.render(c, + position: Vector2(x - pivot.dx, y - SpriteController.spriteSize * 5), + size: + Vector2(currentSprite.srcSize.x * 2, currentSprite.srcSize.y * 2)); + // super.draw(c); } } diff --git a/lib/Entity/wall/foundation.dart b/lib/Entity/wall/foundation.dart index 8c148ab..803bc44 100644 --- a/lib/Entity/wall/foundation.dart +++ b/lib/Entity/wall/foundation.dart @@ -1,14 +1,13 @@ -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; -import '../../entity/wall/Roof.dart'; import '../../map/ground.dart'; import '../../map/map_controller.dart'; import '../../map/tile.dart'; import '../../scene/game_scene.dart'; import '../../utils/tap_state.dart'; import '../player/player.dart'; +import 'Roof.dart'; import 'door.dart'; import 'furniture.dart'; import 'wall.dart'; @@ -31,8 +30,11 @@ class Foundation { bool _isPreviousInsideFoundation = false; Paint p = Paint(); - final TextConfig _txt10 = TextConfig( - fontSize: 10.0, color: Colors.blueGrey[700], fontFamily: "Blocktopia"); + final TextPaint _txt10 = TextPaint( + style: TextStyle( + fontSize: 10.0, + color: Colors.blueGrey[700], + fontFamily: "Blocktopia")); Foundation(this.foundationData, this._map, this._player) { setup(foundationData); @@ -187,7 +189,7 @@ class Foundation { _drawLineGrid(c); - _txt10.render(c, 'Building area', Position(bounds.left, bounds.bottom)); + _txt10.render(c, 'Building area', Vector2(bounds.left, bounds.bottom)); } void _drawLineGrid(Canvas c) { diff --git a/lib/Entity/wall/furniture.dart b/lib/Entity/wall/furniture.dart index e70f234..b24b2a1 100644 --- a/lib/Entity/wall/furniture.dart +++ b/lib/Entity/wall/furniture.dart @@ -1,11 +1,11 @@ import 'dart:math'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../../utils/preload_assets.dart'; -import '../entity.dart'; +import '../../utils/sprite_controller.dart'; +import '../Entity.dart'; class Furniture extends Entity { Sprite sprite; @@ -45,11 +45,13 @@ class Furniture extends Entity { void draw(Canvas c) { if (currentSprite == null) return; if (currentSprite.src == null) return; + // Or originalSize var pivot = - Offset((zoom * 16) / 2, (currentSprite.size.y * 2) - height + 16); + Offset((zoom * 16) / 2, (currentSprite.srcSize.y * 2) - height + 16); - currentSprite.renderScaled(c, Position(x - pivot.dx, y - pivot.dy - z), - scale: 2); + currentSprite.render(c, + position: Vector2(x - pivot.dx, y - pivot.dy - z), + size: Vector2.all(SpriteController.spriteSize * 2)); //showCollisionBox = true; showCollisionBox ? debugDraw(c) : null; diff --git a/lib/Entity/wall/roof.dart b/lib/Entity/wall/roof.dart index 24554ea..88f53fb 100644 --- a/lib/Entity/wall/roof.dart +++ b/lib/Entity/wall/roof.dart @@ -1,8 +1,8 @@ -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../../utils/preload_assets.dart'; +import '../../utils/sprite_controller.dart'; class Roof { int selectedIndex = 0; @@ -19,6 +19,9 @@ class Roof { void draw(Canvas c, double x, double y) { selectedIndex = (x ~/ 16) % roofSprite.length; - roofSprite[selectedIndex]?.renderScaled(c, Position(x, y - 80), scale: 1); + roofSprite[selectedIndex]?.render(c, + position: Vector2(x, y - 80), + size: Vector2( + SpriteController.spriteSize, SpriteController.spriteSize * 5)); } } diff --git a/lib/Entity/wall/wall.dart b/lib/Entity/wall/wall.dart index a73ceb6..4b395e0 100644 --- a/lib/Entity/wall/wall.dart +++ b/lib/Entity/wall/wall.dart @@ -1,9 +1,9 @@ -import 'package:flame/position.dart'; +import 'package:flame/extensions.dart'; import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; import '../../utils/preload_assets.dart'; -import '../entity.dart'; +import '../../utils/sprite_controller.dart'; +import '../Entity.dart'; import 'foundation.dart'; class Wall extends Entity { @@ -64,17 +64,19 @@ class Wall extends Entity { } void draw(Canvas c) { - if (sprites.length == 0 || lowSprites.length == 0) return; + if (sprites.isEmpty || lowSprites.isEmpty) return; var pivot = Offset((zoom * 16) / 2, height); selectWallSprite(); if (showLow) { - currentLowSprite.renderScaled(c, Position(x - pivot.dx, y - pivot.dy - z), - scale: 1); + currentLowSprite.render(c, + position: Vector2(x - pivot.dx, y - pivot.dy - z), + size: Vector2(SpriteController.spriteSize, height)); } else { - currentSprite.renderScaled(c, Position(x - pivot.dx, y - pivot.dy - z), - scale: 1); + currentSprite.render(c, + position: Vector2(x - pivot.dx, y - pivot.dy - z), + size: Vector2(SpriteController.spriteSize, height)); } showCollisionBox ? debugDraw(c) : null; diff --git a/lib/Map/Tile.dart b/lib/Map/Tile.dart index 841fd4d..9484d45 100644 --- a/lib/Map/Tile.dart +++ b/lib/Map/Tile.dart @@ -1,8 +1,10 @@ -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; +// ignore_for_file: file_names + +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; class Tile { int posX; @@ -38,8 +40,10 @@ class Tile { } void draw(Canvas c) { - //c.drawRect(boxRect, boxPaint); - tileSprite?.renderScaled(c, Position(boxRect.left, boxRect.top)); + c.drawRect(boxRect, boxPaint); + tileSprite?.render(c, + position: Vector2(boxRect.left, boxRect.top), + size: Vector2.all(SpriteController.spriteSize)); } dynamic toObject() { diff --git a/lib/Map/ground.dart b/lib/Map/ground.dart index 5607f82..6ffd47d 100644 --- a/lib/Map/ground.dart +++ b/lib/Map/ground.dart @@ -1,13 +1,12 @@ -import 'dart:math'; -import 'dart:ui'; +import 'dart:math' as math; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../effects/foam_water_effect.dart'; import '../effects/water_stars_effect.dart'; import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; import 'tile.dart'; class Ground extends Tile { @@ -39,10 +38,13 @@ class Ground extends Tile { boxPaint.color = foamWaterEffect.getFoamColor(height, posX, posY); //Colors.blue[200]; } + c.drawRect(boxRect, boxPaint); if (grass != null) { - grass.renderScaled(c, Position(boxRect.left, boxRect.top), scale: 1); + grass.render(c, + position: Vector2(boxRect.left, boxRect.top), + size: Vector2.all(SpriteController.spriteSize * 1)); } if (height < 107) { @@ -54,8 +56,8 @@ class Ground extends Tile { height = heightLvl; var green = 255 - heightLvl; - if (heightLvl > 142 && heightLvl < 152 && Random().nextInt(100) > 98) { - var id = Random().nextInt(5) + 1; + if (heightLvl > 142 && heightLvl < 152 && math.Random().nextInt(100) > 98) { + var id = math.Random().nextInt(5) + 1; grass = PreloadAssets.getEnviromentSprite("floor$id"); /*grass = Sprite("enviroment/floor${id}.png", width: size.toDouble(), height: size.toDouble());*/ @@ -74,24 +76,24 @@ class Ground extends Tile { } else if (heightLvl < sand) { return Colors.amber[200]; } else if (heightLvl < lowGrass) { - if (Random().nextInt(100) > 95) { - var id = Random().nextInt(4) + 7; + if (math.Random().nextInt(100) > 95) { + var id = math.Random().nextInt(4) + 7; grass = PreloadAssets.getEnviromentSprite("grass$id"); /*grass = Sprite("enviroment/grass$id.png", width: size.toDouble(), height: size.toDouble());*/ } return Color.fromRGBO(116, green + 50, 54, 1); } else if (heightLvl < 160) { - if (Random().nextInt(100) > 96) { - var id = Random().nextInt(2) + 11; + if (math.Random().nextInt(100) > 96) { + var id = math.Random().nextInt(2) + 11; grass = PreloadAssets.getEnviromentSprite("grass$id"); /*grass = Sprite("enviroment/grass$id.png", width: size.toDouble(), height: size.toDouble());*/ } return Color.fromRGBO(82, green + 40, 46, 1); } else if (heightLvl < 185) { - if (Random().nextInt(100) > 98) { - var id = Random().nextInt(2) + 13; + if (math.Random().nextInt(100) > 98) { + var id = math.Random().nextInt(2) + 13; grass = PreloadAssets.getEnviromentSprite("grass$id"); /*grass = Sprite("enviroment/grass${id}.png", width: size.toDouble(), height: size.toDouble());*/ diff --git a/lib/Map/map_controller.dart b/lib/Map/map_controller.dart index 76aad0f..43ded56 100644 --- a/lib/Map/map_controller.dart +++ b/lib/Map/map_controller.dart @@ -1,13 +1,13 @@ import 'dart:ui' as ui; -import 'package:BWO/utils/timer_helper.dart'; import 'package:fast_noise/fast_noise.dart'; import 'package:flutter/material.dart'; -import '../entity/entity.dart'; +import '../entity/Entity.dart'; import '../entity/player/player.dart'; import '../game_controller.dart'; import '../hud/build/build_foundation.dart'; +import '../utils/timer_helper.dart'; import 'ground.dart'; import 'tile.dart'; import 'tree.dart'; diff --git a/lib/Map/tree.dart b/lib/Map/tree.dart index f4909ba..dbee229 100644 --- a/lib/Map/tree.dart +++ b/lib/Map/tree.dart @@ -1,11 +1,11 @@ import 'dart:math'; import 'dart:ui'; -import 'package:flame/flame_audio.dart'; -import 'package:flame/sprite_batch.dart'; -import 'package:flutter/material.dart'; +import 'package:flame/extensions.dart'; +import 'package:flame/sprite.dart'; +import 'package:flame_audio/flame_audio.dart'; -import '../entity/entity.dart'; +import '../entity/Entity.dart'; import '../entity/items/item_database.dart'; import '../entity/items/items.dart'; import '../game_controller.dart'; @@ -26,7 +26,6 @@ class Tree extends Entity { int _applesLeft = 1; - final FlameAudio _audio = FlameAudio(); double _deadRotation = 0; double _gravityRotation = 0; @@ -50,13 +49,13 @@ class Tree extends Entity { } void loadSprite() async { - //_tree = await SpriteBatch.withAsset('trees/${_spriteImage}.png'); + // _tree = await SpriteBatch.load('trees/$_spriteImage.png'); _tree = PreloadAssets.getTreeSprite(_spriteImage); _tree.add( - rect: Rect.fromLTWH(0, 0, 16, 16), - offset: Offset( + source: Rect.fromLTWH(0, 0, 16, 16), + offset: Vector2( posX.toDouble() * _tileSize, (posY.toDouble() - 1) * _tileSize), - anchor: Offset(8, 14), + anchor: Vector2(8, 14), scale: _tileSize.toDouble(), rotation: 0 //-0.05 ); @@ -74,7 +73,7 @@ class Tree extends Entity { isActive ? _tree.render(c) : null; } - //isActive ? debugDraw(c) : null; + // isActive ? debugDraw(c) : null; } void _checksDeath() { @@ -133,10 +132,10 @@ class Tree extends Entity { void _updateFrame(double rot) { _tree.clear(); _tree.add( - rect: Rect.fromLTWH(0, 0, 16, 16), - offset: Offset( + source: Rect.fromLTWH(0, 0, 16, 16), + offset: Vector2( posX.toDouble() * _tileSize, (posY.toDouble() - 1) * _tileSize), - anchor: Offset(8, 14), + anchor: Vector2(8, 14), scale: _tileSize.toDouble(), rotation: rot //-0.05 ); @@ -181,7 +180,7 @@ class Tree extends Entity { status.setLife(hp); - _audio.play('punch.mp3', volume: 0.4); + FlameAudio.play('punch.mp3', volume: 0.4); } } diff --git a/lib/effects/Effect.dart b/lib/effects/Effect.dart index 99399ae..813c2cc 100644 --- a/lib/effects/Effect.dart +++ b/lib/effects/Effect.dart @@ -1,3 +1,5 @@ +// ignore_for_file: file_names + import 'package:flutter/material.dart'; abstract class Effect { diff --git a/lib/effects/damage_effect.dart b/lib/effects/damage_effect.dart index e20bf70..6c7f6da 100644 --- a/lib/effects/damage_effect.dart +++ b/lib/effects/damage_effect.dart @@ -1,8 +1,7 @@ import 'dart:math'; import 'dart:ui'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../game_controller.dart'; @@ -56,11 +55,12 @@ class DamageText { driftX += 15 * GameController.deltaTime * xRandomDirection; initialFontSize = lerpDouble(initialFontSize, 8, GameController.deltaTime * 1); - var textConfig = TextConfig( - fontSize: initialFontSize, - color: isMine ? Colors.white : Color.fromRGBO(229, 184, 46, 1), - fontFamily: "Blocktopia"); - textConfig.render(c, "$damage", Position(posX + driftX, posY + driftY)); + var textConfig = TextPaint( + style: TextStyle( + fontSize: initialFontSize, + color: isMine ? Colors.white : Color.fromRGBO(229, 184, 46, 1), + fontFamily: "Blocktopia")); + textConfig.render(c, "$damage", Vector2(posX + driftX, posY + driftY)); if (GameController.time > lifeTime) { markedToBeDestroyed = true; diff --git a/lib/effects/ripple_water_effect.dart b/lib/effects/ripple_water_effect.dart index 530f2d8..a680dca 100644 --- a/lib/effects/ripple_water_effect.dart +++ b/lib/effects/ripple_water_effect.dart @@ -1,11 +1,11 @@ import 'dart:ui'; -import 'package:flame/position.dart'; +import 'package:flame/extensions.dart'; import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; import '../game_controller.dart'; import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; class RippleWaterEffect { double animSpeed = 1; @@ -55,8 +55,10 @@ class Ripple { var halfwidth = (16 * _scale) / 2; var halfheight = (16 * _scale) / 2; - ripple.renderScaled(c, Position(x - halfwidth, y - halfheight), - scale: _scale, overridePaint: p); + ripple.render(c, + position: Vector2(x - halfwidth, y - halfheight), + size: Vector2.all(SpriteController.spriteSize * _scale), + overridePaint: p); } bool isAlive() { diff --git a/lib/effects/walk_effect.dart b/lib/effects/walk_effect.dart index d5e209e..b22a446 100644 --- a/lib/effects/walk_effect.dart +++ b/lib/effects/walk_effect.dart @@ -1,13 +1,15 @@ import 'dart:math'; import 'dart:ui'; -import 'package:flame/animation.dart' as anim; -import 'package:flame/position.dart'; +import 'package:flame/components.dart'; +import 'package:flame/extensions.dart'; import 'package:flutter/material.dart'; import '../game_controller.dart'; import '../map/ground.dart'; import '../server/utils/server_utils.dart'; +import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; class WalkEffect { double animSpeed = 1; @@ -92,32 +94,30 @@ class WalkEffect { timeInFutureForSoundSteps = GameController.time + delay; if (ServerUtils.database == 'production') { - //Flame.audio.play(audioName, volume: volume); + // FlameAudio.play(audioName, volume: volume); } } } } -class GrassFX { +class GrassFX extends SpriteAnimationGroupComponent { double x, y; - anim.Animation grassAnim; Paint p = Paint(); GrassFX(this.x, this.y) { - grassAnim = anim.Animation.sequenced('effects/walk_grass.png', 6, - textureWidth: 16, textureHeight: 16, loop: false, stepTime: 0.1); p.color = Color.fromRGBO(255, 255, 255, .75); } void draw(Canvas c) { - grassAnim.update(GameController.deltaTime); - grassAnim - .getSprite() - .renderPosition(c, Position(x - 7, y - 8), overridePaint: p); + PreloadAssets.getGrassAnim().update(GameController.deltaTime); + PreloadAssets.getGrassAnim().getSprite().render(c, + position: Vector2(x - 7, y - 8), + overridePaint: p, + size: Vector2.all(SpriteController.spriteSize)); } bool isAlive() { - return grassAnim.isLastFrame == false; + return PreloadAssets.getGrassAnim().isLastFrame == false; } } diff --git a/lib/entity/Equipment.dart b/lib/entity/Equipment.dart deleted file mode 100644 index 49f44dc..0000000 --- a/lib/entity/Equipment.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../utils/on_animation_end.dart'; -import '../utils/sprite_controller.dart'; -import 'items/items.dart'; - -class Equipment implements OnAnimationEnd { - SpriteController equipmentAttack; - SpriteController equipmentWalk; - SpriteController currentSprite; - - String spriteFolder; - Item item; - - Equipment(this.item) { - spriteFolder = item.proprieties.equipmentFolderSprite; - loadSprite(spriteFolder); - } - - void loadSprite(String spriteFolder) async { - var _viewPort = Rect.fromLTWH(0, 0, 32, 32); - var _pivot = Offset(16, 24); - var _scale = 3.0; - var framesCount = 0; - - equipmentWalk = SpriteController("equipment/weapons/$spriteFolder/walk", - _viewPort, _pivot, _scale, Offset(4, 1), framesCount, this); - equipmentAttack = SpriteController("equipment/weapons/$spriteFolder/attack", - _viewPort, _pivot, _scale, Offset(5, 1), framesCount, this); - - currentSprite = equipmentWalk; - } - - @override - void onAnimationEnd() { - if (currentSprite == equipmentAttack) { - currentSprite = equipmentWalk; - currentSprite.direcion = equipmentAttack.direcion; - } - } -} diff --git a/lib/entity/Status.dart b/lib/entity/Status.dart deleted file mode 100644 index 977239c..0000000 --- a/lib/entity/Status.dart +++ /dev/null @@ -1,229 +0,0 @@ -import '../game_controller.dart'; - -class Status { - double _statusMultiplier = 1; - int _hp; - int _maxHP; - - double _energy; - double _maxEnergy; - - double _calories = 0; - final double _maxCalories = 100; - - int _force = 2; - int _defense = 0; - final int _treeCut = 1; - - int _level = 1; - int _exp = 0; - int _maxExp = 1; - - //regenaration settings - bool autoRegenHP = true; - - final double _energyRegenSpeed = .6; - final double _caloriesDecressSpeed = .15; //takes about 10 minutes - - Status({int maxHP = 10, double maxEnergy = 5}) { - _maxHP = maxHP; - _maxEnergy = maxEnergy; - - _levelUpRamp(); - refillStatus(); - } - - void update(double walkSpeed) { - _statusRegeneration(walkSpeed); - //_levelUpRamp(); - } - - void _statusRegeneration(double walkSpeed) { - if (isAlive() == false) return; - - if (_calories > 0) { - _calories -= GameController.deltaTime * _caloriesDecressSpeed; - } else { - _calories = 0; - } - - if (walkSpeed >= 2) { - if (_energy > 0) { - var energyDecrease = GameController.deltaTime * _energyRegenSpeed * .7; - energyDecrease *= walkSpeed / 3; - _energy -= energyDecrease; - } - } - - if (_energy < _maxEnergy) { - if (_calories > 0) { - _energy += GameController.deltaTime * - _energyRegenSpeed * - 2 * - (_calories / 100); - } else { - if (_energy < _maxEnergy / 2) { - _energy += GameController.deltaTime * 0.04; - } - } - } else { - _energy = _maxEnergy; - } - - //_regenerateHP(walkSpeed); //Will work from server side Only - } - - // void _regenerateHP(double walkSpeed) { - // if (autoRegenHP == false) return; - // if (_hp < _maxHP && GameController.time > _hpRegenTime) { - // if (walkSpeed == 0) { - // _hpRegenTime = GameController.time + _hpRegenFrequency * .5; - // } else { - // _hpRegenTime = GameController.time + _hpRegenFrequency; - // } - // _hp += 1; - // } - // } - - int getLevel() { - return _level; - } - - void setLevel(int lv, double statusMultiplier) { - _level = lv; - _statusMultiplier = statusMultiplier; - _levelUpRamp(); - //refillStatus(); - } - - int getHP() { - return _hp; - } - - int getMaxHP() { - return _maxHP; - } - - double getEnergy() { - return _energy; - } - - double getMaxEnergy() { - return _maxEnergy; - } - - int getExp() { - return _exp; - } - - int getMaxExp() { - return _maxExp; - } - - double getCalories() { - return _calories; - } - - double getMaxCalories() { - return _maxCalories; - } - - void takeDamage(int damage) { - _hp -= (damage - _defense).clamp(0, double.infinity); - if (_hp < 0) { - _hp = 0; - } - } - - bool useEnergy(int energy) { - if (_energy >= energy) { - _energy -= energy; - - return true; - } else { - return false; - } - } - - bool consumeHungriness(double calories) { - if (_calories >= calories) { - _calories -= calories; - return true; - } else { - return false; - } - } - - void addLife(int life) { - _hp += life; - if (_hp > _maxHP) { - _hp = _maxHP; - } - } - - void addEnergy(int energy) { - _energy += energy; - if (_energy > _maxEnergy) { - _energy = _maxEnergy; - } - } - - void addHungriness(double hungriness) { - _calories += hungriness; - if (_calories > _maxCalories) { - _calories = _maxCalories; - } - } - - bool isAlive() { - return _hp > 0; - } - - void refillStatus() { - _hp = _maxHP; - _energy = _maxEnergy; - _calories = _maxCalories; - } - - // ignore: use_setters_to_change_properties - void setLife(int n) { - _hp = n; - } - - @Deprecated('This method was moved to the server') - void addExp(int amount) { - _exp += amount; - _levelUpRamp(); - } - - // ignore: use_setters_to_change_properties - void setExp(int xp) { - _exp = xp; - } - - int getBaseAttackDamage() { - return _force; - } - - int getBaseCutTreeDamage() { - return _treeCut + (_force * 0.2).floor(); - } - - void _levelUpRamp() { - var startBaseExp = 10; - var rampMultiplier = .35; - _maxExp = - (_level * startBaseExp + ((_level * _level * _level) * rampMultiplier)) - .toInt(); - _updateStatus(); - } - - void _updateStatus() { - _maxHP = (_statusMultiplier * (10 + ((_level * _level) * .5))).toInt(); - _maxEnergy = _statusMultiplier * (5 + _level * .5); - - //gives +1 force for each 3 levels - _force = 2 + (_level ~/ 3); - _defense = 0 + (_level ~/ 4); - } -} diff --git a/lib/entity/enemys/Skull.dart b/lib/entity/enemys/Skull.dart deleted file mode 100644 index cb7b131..0000000 --- a/lib/entity/enemys/Skull.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../map/map_controller.dart'; -import 'enemy.dart'; - -class Skull extends Enemy { - Skull(double x, double y, MapController map, String name, String id, - {Offset moveTo = Offset.zero}) - : super(x, y, map, "enemys/miniskull", id) { - iaController.walkSpeed = 1; - - moveTo != Offset.zero ? iaController.moveTo(moveTo.dx, moveTo.dy) : null; - - super.name = name; - status.setLevel(2, .5); - } -} diff --git a/lib/entity/enemys/enemy.dart b/lib/entity/enemys/enemy.dart deleted file mode 100644 index d40b98b..0000000 --- a/lib/entity/enemys/enemy.dart +++ /dev/null @@ -1,118 +0,0 @@ -import 'dart:math'; - -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; -import 'package:flutter/material.dart'; - -import '../../game_controller.dart'; -import '../../map/map_controller.dart'; -import '../../utils/on_animation_end.dart'; -import '../../utils/sprite_controller.dart'; -import '../entity.dart'; -import 'ia_controller.dart'; -import 'ia_network_controller.dart'; - -class Enemy extends Entity implements OnAnimationEnd { - MapController map; - IAController iaController; - bool respawn = false; - double respawnTime = 0; - String spriteFolder; - - Enemy(double x, double y, this.map, this.spriteFolder, String myId) - : super(x, y) { - _loadSprites(spriteFolder); - shadownSize = 1.2; - id = myId; - iaController = IANetworkController(this); - } - - SpriteController walkSprites; - SpriteController attackSprites; - SpriteController currentSprite; - - void draw(Canvas c) { - if (isActive == false) { - return; - } - mapHeight = map.getHeightOnPos(posX, posY); - - var maxWalkSpeed = 2; - var walkSpeed = max(xSpeed.abs(), ySpeed.abs()); - var deltaSpeed = (walkSpeed / maxWalkSpeed); - var animSpeed = 0.07 + (0.1 - (deltaSpeed * 0.1)); - - if (currentSprite != null) { - var stopAnimWhenIdle = true; - if (currentSprite.folder.contains("attack")) { - stopAnimWhenIdle = false; - animSpeed = 0.07; - } - - currentSprite.draw(c, x, y, xSpeed, ySpeed, animSpeed, mapHeight, - stopAnimWhenIdle: stopAnimWhenIdle); - } - //debugDraw(c); - TextConfig(fontSize: 11.0, color: Colors.white, fontFamily: "Blocktopia") - .render(c, name, Position(x, y - 32), anchor: Anchor.bottomCenter); - } - - @override - void update() { - super.update(); - iaController.update(); - slowSpeedWhenItSinks(mapHeight); - moveWithPhysics(); - updatePhysics(); - die(); - } - - void die() { - if (status.isAlive() == false) { - if (isActive) { - isActive = false; - if (respawn) { - respawnTime = GameController.time + 10; - } else { - destroy(); - } - } - if (GameController.time > respawnTime) { - isActive = true; - status.refillStatus(); - } - } - } - - @override - void getHut(int damage, Entity other, {bool isMine = false}) { - super.getHut(damage, other, isMine: isMine); - iaController.target = other; - } - - void _loadSprites(spriteFolder) { - var _viewPort = Rect.fromLTWH(0, 0, 16, 16); - var _pivot = Offset(8, 16); - var _scale = 3.0; - var _gradeSize = Offset(4, 1); - var framesCount = 0; - - width = 6 * _scale; - height = 6 * _scale; - - walkSprites = SpriteController("$spriteFolder/walk", _viewPort, _pivot, - _scale, _gradeSize, framesCount, this); - attackSprites = SpriteController("$spriteFolder/attack", _viewPort, _pivot, - _scale, _gradeSize, framesCount, this); - - currentSprite = walkSprites; - } - - @override - void onAnimationEnd() { - if (currentSprite == attackSprites) { - currentSprite = walkSprites; - } - } -} diff --git a/lib/entity/enemys/ia_controller.dart b/lib/entity/enemys/ia_controller.dart deleted file mode 100644 index 8d6ab59..0000000 --- a/lib/entity/enemys/ia_controller.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../entity.dart'; -import 'enemy.dart'; - -abstract class IAController { - Enemy self; - Entity target; - - IAController(this.self); - - double walkSpeed = .5; - - void update() {} - - void patrolArea() {} - - void moveTo(double targetX, double targetY) {} - - Offset getDestination() { - return Offset.zero; - } - - void searchForTargetsEntity() {} - - void attackTarget(Entity target, {int damage = 0, int targetHp = 0}) {} -} diff --git a/lib/entity/enemys/ia_local_controller.dart b/lib/entity/enemys/ia_local_controller.dart deleted file mode 100644 index 67094a3..0000000 --- a/lib/entity/enemys/ia_local_controller.dart +++ /dev/null @@ -1,146 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import '../../game_controller.dart'; -import '../player/player.dart'; -import 'enemy.dart'; -import 'ia_controller.dart'; - -/// This class controlls enemy locally (offline mode). -class IALocalController extends IAController { - double walkSpeed = .5; - int patrolAreaRange = 300; - AggressiveLevel agressiveLevel = AggressiveLevel.passive; - - ///when it sees the target at this distance it will immediately attack it - int seeTargetDistanceMin = 80; - - ///when it sees the target at this distance it will only - ///attack if it is running - final int _seeTargetDistanceMax = 224; - int attackDistance = 40; - double attackFrequencyInSec = 2; - - double _followingSpeed = 0; - Offset _destPoint; - double _newPatrolAreaDelay = 0; - final double _stopDistance = 24; - double _attackSpeedDelay = 0; - final double _loseTargetDistance = 250; - - IALocalController(Enemy self) : super(self) { - _destPoint = Offset(self.x, self.y); - - if (_destPoint.distance > 500 * 16) { - agressiveLevel = AggressiveLevel.aggressive; - } - } - - void update() { - if (self.status.isAlive() == false) { - return; - } - patrolArea(); - searchForTargetsEntity(); - moveTo(_destPoint.dx, _destPoint.dy); - _attackingTarget(); - } - - void patrolArea() { - if (target != null) { - return; - } - if (GameController.time > _newPatrolAreaDelay) { - _newPatrolAreaDelay = GameController.time + Random().nextInt(5) + 5; - _destPoint = Offset( - self.x + Random().nextInt(patrolAreaRange) - patrolAreaRange / 2, - self.y + Random().nextInt(patrolAreaRange) - patrolAreaRange / 2); - } - } - - void moveTo(double targetX, double targetY) { - if (self.currentSprite != self.walkSprites) { - return; - } - - var distanceX = (self.x - targetX); - var distanceY = (self.y - targetY); - var dirX = distanceX.clamp(-1, 1); - var dirY = distanceY.clamp(-1, 1); - - self.xSpeed = 0; - self.ySpeed = 0; - - if (distanceX.abs() > _stopDistance) { - self.xSpeed = (walkSpeed + _followingSpeed) * dirX; - } - if (distanceY.abs() > _stopDistance) { - self.ySpeed = (walkSpeed + _followingSpeed) * dirY; - } - } - - void searchForTargetsEntity() { - if (agressiveLevel == AggressiveLevel.passive) { - return; - } - _followingSpeed = target == null ? 0 : 1; - for (var entity in self.map.entitysOnViewport) { - if (entity != self && - entity.isActive && - entity.status.isAlive() && - entity is Player) { - var distance = - (Offset(self.x, self.y) - Offset(entity.x, entity.y)).distance; - - if (distance < seeTargetDistanceMin) { - target = entity; - } - var targetSpeed = (entity.xSpeed + entity.ySpeed).abs(); - - if (distance < _seeTargetDistanceMax && targetSpeed > 1.5) { - target = entity; - } - } - } - if (target != null) { - _destPoint = Offset(target.x, target.y); - } - } - - void _attackingTarget() { - if (target == null) { - return; - } - var distanceToTarget = - (Offset(self.x, self.y) - Offset(target.x, target.y)).distance; - - if (distanceToTarget > _loseTargetDistance || - target.status.isAlive() == false) { - target = null; - return; - } - - var totalSpeed = self.xSpeed + self.ySpeed; - if (GameController.time > _attackSpeedDelay && - distanceToTarget < attackDistance && - totalSpeed < 1) { - _attackSpeedDelay = GameController.time + attackFrequencyInSec; - - self.currentSprite - .setDirection(Offset(target.x, target.y), Offset(self.x, self.y)); - self.currentSprite = self.attackSprites; - self.currentSprite - .setDirection(Offset(target.x, target.y), Offset(self.x, self.y)); - target.getHut(self.status.getBaseAttackDamage(), self, isMine: false); - } - } -} - -enum AggressiveLevel { - /// Attack only when you attack first - passive, - - /// Attack you when see - aggressive, -} diff --git a/lib/entity/enemys/ia_network_controller.dart b/lib/entity/enemys/ia_network_controller.dart deleted file mode 100644 index 91a45de..0000000 --- a/lib/entity/enemys/ia_network_controller.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../entity.dart'; -import 'enemy.dart'; -import 'ia_controller.dart'; - -/// This class controlls enemy from network (online mode). - -class IANetworkController extends IAController { - int patrolAreaRange = 300; - - /// when this unit see the target at this distance it will immediately - /// attack it - int seeTargetDistanceMin = 80; - - /// when this unit see the target at this distance it will attack only - /// if it is running - int seeTargetDistanceMax = 224; - int attackDistance = 40; - double attackFrequencyInSec = 2; - - final double _followingSpeed = 0; - Offset _destPoint; - final double _stopDistance = 24; - - IANetworkController(Enemy self) : super(self) { - _destPoint = Offset(self.x, self.y); - } - - void update() { - if (self.status.isAlive() == false) { - return; - } - //searchForTargetsEntity(); - _moving(); - } - - void moveTo(double targetX, double targetY) { - _destPoint = Offset(targetX, targetY); - } - - @override - Offset getDestination() { - return _destPoint; - } - - void _moving() { - if (self.currentSprite != self.walkSprites) { - return; - } - - var distanceX = (self.x - _destPoint.dx); - var distanceY = (self.y - _destPoint.dy); - var dirX = distanceX.clamp(-1, 1); - var dirY = distanceY.clamp(-1, 1); - - self.xSpeed = 0; - self.ySpeed = 0; - - if (distanceX.abs() > _stopDistance) { - self.xSpeed = (walkSpeed + _followingSpeed) * dirX; - } - if (distanceY.abs() > _stopDistance) { - self.ySpeed = (walkSpeed + _followingSpeed) * dirY; - } - } - - void attackTarget(Entity target, {int damage = 0, int targetHp = 0}) { - this.target = target; - if (target != null) { - _destPoint = Offset(target.x, target.y); - - var distance = (_destPoint - Offset(self.x, self.y)).distance; - if (distance > 250 && damage > 0) { - self.x = _destPoint.dx; - self.y = _destPoint.dy; - } - } - - //show damage - if (damage > 0) { - self.currentSprite - .setDirection(Offset(target.x, target.y), Offset(self.x, self.y)); - self.currentSprite = self.attackSprites; - self.currentSprite - .setDirection(Offset(target.x, target.y), Offset(self.x, self.y)); - - target.getHut(damage, self, isMine: false); - //target.showDamage(damage, false); - target.status.setLife(targetHp); - } - } -} diff --git a/lib/entity/entity.dart b/lib/entity/entity.dart deleted file mode 100644 index d05d110..0000000 --- a/lib/entity/entity.dart +++ /dev/null @@ -1,137 +0,0 @@ -import 'dart:math'; - -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; - -import '../effects/damage_effect.dart'; -import '../effects/ripple_water_effect.dart'; -import '../effects/walk_effect.dart'; -import '../scene/game_scene.dart'; -import '../utils/preload_assets.dart'; -import 'physics_entity.dart'; -import 'player/player.dart'; -import 'status.dart'; - -abstract class Entity extends PhysicsEntity { - Status status = Status(); - bool marketToBeRemoved = false; - bool isActive = true; - - String name; - String id; - - ///tiled position - int posX; - int posY; - - int mapHeight = 1; - double width = 16; - double height = 16; - - Rect collisionBox; - bool isCollisionTrigger = false; - - double worldSize; - - Paint p = Paint(); - - double shadownSize = 2; - Sprite shadownLarge; - Offset shadownOffset = Offset.zero; - final RippleWaterEffect _rippleWaterEffect = RippleWaterEffect(); - final WalkEffect _walkEffect = WalkEffect(); - final DamageEffect _damageEffect = DamageEffect(); - - Entity(double x, double y) : super(x, y) { - worldSize = GameScene.worldSize.toDouble(); - - shadownLarge = PreloadAssets.getEffectSprite('shadown_large'); - updatePhysics(); - } - - void draw(Canvas c) { - print("drawning wrongly, this draw method should be overwritten."); - } - - void update() { - if (!isActive || marketToBeRemoved) { - return; - } - var walkSpeed = max(inputSpeed.dx.abs(), inputSpeed.dy.abs()); - status.update(walkSpeed); - if (status.getEnergy() <= 0) { - maxSpeedEnergyMultiplier = .5; - } else { - maxSpeedEnergyMultiplier = 1; - } - } - - void debugDraw(Canvas c) { - p.color = Colors.red; - p.strokeWidth = 1; - p.style = PaintingStyle.stroke; - c.drawRect(collisionBox, p); - } - - void drawEffects(Canvas c) { - if (!isActive) { - return; - } - _drawShadown(c); - if (this is Player) { - _rippleWaterEffect.draw(c, x, y, mapHeight); - _walkEffect.draw(c, x, y, mapHeight, inputSpeed); - } - _damageEffect.draw(c, x, y); - } - - void _drawShadown(Canvas c) { - var distanceToGround = 1 - (z.abs().clamp(0, 100) / 100); - var p = Paint(); - p.color = Color.fromRGBO(255, 255, 255, distanceToGround); - - var sizeX = 16 * shadownSize / 2; - var sizeY = (16 - 3) * shadownSize; - - shadownLarge?.renderScaled( - c, - Position( - x - sizeX * distanceToGround + shadownOffset.dx, - y - sizeY * distanceToGround + shadownOffset.dy, - ), - scale: shadownSize * distanceToGround, - overridePaint: p, - ); - } - - void updatePhysics() { - posX = (x / worldSize).floor(); - posY = (y / worldSize).floor(); - - collisionBox = Rect.fromLTWH(x - (width / 2), y - height, width, height); - - updateGravity(); - moveFriction(); - } - - void getHut(int damage, Entity other, {bool isMine = false}) { - status.takeDamage(damage); - showDamage(damage, isMine: isMine); - } - - void showDamage(int damage, {bool isMine = false}) { - _damageEffect.addText(damage, isMine: isMine); - } - - void onTriggerStay(Entity entity) {} - - void destroy() { - marketToBeRemoved = true; - } - - @override - String toString() { - return """name: $name, (x: $x, y: $y), isActive: $isActive, isAlive: ${status.isAlive()}, hp: ${status.getHP()}, marketToBeRemoved: $marketToBeRemoved, id: $id"""; - } -} diff --git a/lib/entity/equipment_controller.dart b/lib/entity/equipment_controller.dart deleted file mode 100644 index a59f2f9..0000000 --- a/lib/entity/equipment_controller.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'equipment.dart'; -import 'items/items.dart'; -import 'player/player.dart'; -import 'player/player_actions.dart'; - -class EquipmentController { - Equipment _weapon; - - Player player; - - EquipmentController(this.player); - - void equipItem(Item item) { - _weapon = Equipment(item); - } - - void draw(Canvas c, double animSpeed, {bool stopAnimWhenIdle = true}) { - _weapon?.currentSprite?.draw(c, player.x, player.y, player.xSpeed, - player.ySpeed, animSpeed, player.mapHeight, - stopAnimWhenIdle: stopAnimWhenIdle); - } - - void setDirection(Offset targetPos, Offset playerPos) { - _weapon?.currentSprite?.setDirection(targetPos, playerPos); - } - - void setAction(DoAction action) { - if (action == DoAction.attack) { - _weapon?.currentSprite = _weapon?.equipmentAttack; - } - } - - int getMaxAttackDamage() { - var damage = player.status.getBaseAttackDamage(); - damage += _weapon != null ? _weapon.item.proprieties.damage : 0; - return damage; - } - - int getMaxCutTreeDamage() { - var damage = player.status.getBaseCutTreeDamage(); - damage += _weapon != null ? _weapon.item.proprieties.treeCut : 0; - return damage; - } -} diff --git a/lib/entity/items/item_database.dart b/lib/entity/items/item_database.dart deleted file mode 100644 index cc5c443..0000000 --- a/lib/entity/items/item_database.dart +++ /dev/null @@ -1,43 +0,0 @@ -final Map itemListDatabase = { - 0: ItemDB("Apple", "items/apple3.png", 1, - hp: 4, hungriness: 35, itemType: ItemType.usable), - 1: ItemDB("Log", "items/log.png", 2), - 2: ItemDB("Green Apple", "items/apple_green.png", 1, - itemType: ItemType.usable, energy: 5, hungriness: 50), - 3: ItemDB("Orange", "items/orange.png", 1, itemType: ItemType.usable), - 4: ItemDB("Wood Axe", "items/axe.png", 1, - itemType: ItemType.weapon, - equipmentFolderSprite: "axe", - damage: 1, - treeCut: 1), -}; - -class ItemDB { - String name, imgPath; - double zoom = 1; - - //useable Effects - int hp = 0; - int energy = 0; - double hungriness = 0; - - ItemType itemType = ItemType.none; - String equipmentFolderSprite; - - //status when equip - int damage = 0; - int defense = 0; - int treeCut = 0; - - ItemDB(this.name, this.imgPath, this.zoom, - {this.hp = 0, - this.energy = 0, - this.hungriness = 0, - this.itemType = ItemType.none, - this.equipmentFolderSprite, - this.damage = 0, - this.defense = 0, - this.treeCut = 0}); -} - -enum ItemType { none, usable, weapon } diff --git a/lib/entity/items/items.dart b/lib/entity/items/items.dart deleted file mode 100644 index 8a3eb8c..0000000 --- a/lib/entity/items/items.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flame/flame.dart'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; - -import '../../game_controller.dart'; -import '../entity.dart'; -import '../player/player.dart'; -import 'item_database.dart'; - -class Item extends Entity { - ItemDB proprieties; - Sprite sprite; - - double lifeTime = 0; - Paint p = Paint(); - - double alphaBlink = 1; - double blinkTimeBeforeDelete = 0; - - int amount = 1; - - Item(double x, double y, double z, this.proprieties) : super(x, y) { - super.z = z; - bounciness = 0.12; - lifeTime = GameController.time + 16; - loadSprite(); - shadownSize = proprieties.zoom; - - isCollisionTrigger = true; //make item to be pickedUp - } - - void loadSprite() async { - sprite = await Sprite.loadSprite(proprieties.imgPath); - } - - @override - void draw(Canvas c) { - if (sprite != null) { - if (GameController.time > lifeTime - 3) { - blink(.08); - } else if (GameController.time > lifeTime - 6) { - blink(.2); - } - - p.color = Color.fromRGBO(255, 255, 255, alphaBlink); - - var pivot = Offset((proprieties.zoom * 16) / 2, (proprieties.zoom * 16)); - sprite.renderScaled(c, Position(x - pivot.dx, y - pivot.dy - z), - scale: proprieties.zoom, overridePaint: p); - updatePhysics(); - - if (GameController.time > lifeTime) { - destroy(); - } - - //debugDraw(c); - } - } - - void use(Entity playerEntity) { - if (proprieties.itemType == ItemType.usable) { - amount--; //removes item from inventory - playerEntity.status.addLife(proprieties.hp); - playerEntity.status.addEnergy(proprieties.energy); - playerEntity.status.addHungriness(proprieties.hungriness); - - Flame.audio.play("items/eating_apple.mp3", volume: 0.3); - } else if (proprieties.itemType == ItemType.weapon) { - if (playerEntity is Player) { - amount--; //removes item from inventory - playerEntity.equipmentController.equipItem(this); - } - } - } - - void blink(double speed) { - if (GameController.time > blinkTimeBeforeDelete) { - blinkTimeBeforeDelete = GameController.time + speed; - alphaBlink = alphaBlink < 1 ? 1 : .3; - } - } -} diff --git a/lib/entity/physics_entity.dart b/lib/entity/physics_entity.dart deleted file mode 100644 index 5577ee7..0000000 --- a/lib/entity/physics_entity.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import '../game_controller.dart'; - -abstract class PhysicsEntity { - double x, y, z = 0; - - //the velocity you want to move - double xSpeed = 0; - double ySpeed = 0; - //the current velocity - Offset velocity = Offset.zero; - Offset impulse = Offset.zero; - Offset inputSpeed = Offset.zero; - - double maxSpeedEnergyMultiplier = 1; - - double _gravity = 0.0; - double _acceleraction = 0.0; - - double bounciness = .1; - double friction = 3; - - PhysicsEntity(this.x, this.y); - - void moveWithPhysics() { - velocity = Offset( - xSpeed * GameController.deltaTime * 50, - ySpeed * GameController.deltaTime * 50, - ) * - maxSpeedEnergyMultiplier; - x -= velocity.dx; - y -= velocity.dy; - - inputSpeed = Offset(xSpeed, ySpeed); - } - - void moveFriction() { - impulse = - Offset.lerp(impulse, Offset.zero, GameController.deltaTime * friction); - x += impulse.dx; - y += impulse.dy; - } - - void updateGravity() { - if (z > 0) { - _acceleraction += (1 * GameController.deltaTime); - _gravity += _acceleraction * 1.0; - - if (_gravity > 10) { - //_gravity max 10m/s err. I mean 10pixels/deltaTime - _gravity = 10; - } - z -= _gravity; - } - - if (z < 0) { - z = 0; - if (_gravity >= 1) { - z = 1; - var impulseForce = _gravity / 2; - var rForceX = (Random().nextDouble() - 0.5) * impulseForce; - var rForceY = (Random().nextDouble() - 0.5) * impulseForce; - impulse = Offset(rForceX, rForceY); - } - _gravity = -_gravity * bounciness; - _acceleraction = 0; - } - } - - void slowSpeedWhenItSinks(int mapHeight, {double slowSpeedFactor = 0.6}) { - var sink = ((105 - mapHeight) * 0.2).clamp(0, 4); - double slowFactor = 1 - ((sink * 0.25) * slowSpeedFactor); - - xSpeed *= slowFactor; - ySpeed *= slowFactor; - } -} diff --git a/lib/entity/player/input_controller.dart b/lib/entity/player/input_controller.dart deleted file mode 100644 index 5868315..0000000 --- a/lib/entity/player/input_controller.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:sensors/sensors.dart'; - -import '../../utils/tap_state.dart'; -import 'joystick_ui.dart'; -import 'player.dart'; - -class InputController { - Player player; - - double previousY = 0; - double defaultY = 6.9; //angle standing up - - int accelerationSpeed = 4; - double maxAngle = 5; - double speedMultiplier = .6; - - JoystickUI joystick; - - InputController(this.player) { - //registerAccelerometer(); - joystick = JoystickUI(player, player.sceneObject.hud); - } - - void update() { - if (!player.isMine) { - return; - } - - joystick.update(isEnable: player.canWalk); - } - - void registerAccelerometer() { - accelerometerEvents.listen((event) { - if (!player.isMine) { - return; - } - var eventX = event.x; - var eventY = event.y; - if (event.z < 0) { - eventX = eventX * 1; - eventY = eventY * -1; - } - - if (TapState.isTapingRight() && TapState.isTapingBottom()) { - player.xSpeed = - (eventX * accelerationSpeed).clamp(-maxAngle, maxAngle).toDouble() * - speedMultiplier; - player.ySpeed = ((eventY - defaultY) * -accelerationSpeed) - .clamp(-maxAngle, maxAngle) - .toDouble() * - speedMultiplier; - } else { - previousY = eventY; - player.xSpeed = 0; - player.ySpeed = 0; - } - - if (player.ySpeed.abs() + player.xSpeed.abs() < 0.6 || - player.playerActions.isDoingAction) { - player.xSpeed = 0; - player.ySpeed = 0; - } - }); - } -} diff --git a/lib/entity/player/joystick_ui.dart b/lib/entity/player/joystick_ui.dart deleted file mode 100644 index fbc4963..0000000 --- a/lib/entity/player/joystick_ui.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../ui/hud.dart'; -import '../../ui/ui_element.dart'; -import '../../utils/tap_state.dart'; -import 'player.dart'; - -class JoystickUI extends UIElement { - final Player _player; - Offset _input = Offset.zero; - - double maxSpeedRadius = 3; - - final Paint _p = Paint(); - - bool isEnable = true; - - JoystickUI(this._player, HUD hudRef) : super(hudRef) { - drawOnHUD = true; - } - - void update({bool isEnable = true}) { - this.isEnable = isEnable; - _player.xSpeed = 0; - _player.ySpeed = 0; - - if (TapState.isTapingRight() && isEnable) { - var diff = (TapState.pressedPosition - TapState.currentPosition) * 0.1; - _input = diff; - - if (diff.distance > maxSpeedRadius) { - _input *= maxSpeedRadius / diff.distance; - } - if (_input.distance > 0.6) { - _player.xSpeed = _input.dx; - _player.ySpeed = _input.dy; - } - } - } - - @override - void draw(Canvas c) { - if (TapState.isTapingRight() && isEnable) { - _p.color = Color.fromRGBO(0, 0, 0, .25); - _p.strokeWidth = 0; - _p.style = PaintingStyle.fill; - c.drawCircle(TapState.pressedPosition, 32, _p); - - _p.strokeWidth = 3; - _p.style = PaintingStyle.stroke; - c.drawCircle(TapState.pressedPosition, 38, _p); - - _p.color = Color.fromRGBO(0, 0, 0, .25); - _p.style = PaintingStyle.fill; - _p.strokeWidth = 0; - c.drawCircle(TapState.pressedPosition - (_input * 10), 16, _p); - } - } -} diff --git a/lib/entity/player/player.dart b/lib/entity/player/player.dart deleted file mode 100644 index aba5cc2..0000000 --- a/lib/entity/player/player.dart +++ /dev/null @@ -1,203 +0,0 @@ -import 'dart:math'; -import 'dart:ui'; - -import 'package:flame/anchor.dart'; -import 'package:flame/flame.dart'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flame/text_config.dart'; -import 'package:flutter/material.dart'; - -import '../../game_controller.dart'; -import '../../hud/build/build_foundation.dart'; -import '../../hud/build/build_hud.dart'; -import '../../hud/inventory.dart'; -import '../../hud/player_hud.dart'; -import '../../map/map_controller.dart'; -import '../../scene/scene_object.dart' ''; -import '../../utils/on_animation_end.dart'; -import '../../utils/preload_assets.dart'; -import '../../utils/sprite_controller.dart' ''; -import '../entity.dart'; -import '../equipment_controller.dart'; -import '../items/items.dart'; -import 'input_controller.dart'; -import 'player_actions.dart'; -import 'player_network.dart'; - -class Player extends Entity implements OnAnimationEnd { - final TextConfig _text = - TextConfig(fontSize: 12.0, color: Colors.white, fontFamily: "Blocktopia"); - - SpriteController walkSprites; - SpriteController attackSprites; - SpriteController currentSprite; - Sprite _deathSprite; - double _timeToRespawn = 0; - - PlayerActions playerActions; - InputController _inputController; - final MapController _map; - - Inventory _inventory; - // ignore: unused_field - PlayerHUD _playerHUD; - PlayerNetwork playerNetwork; - bool isMine; - SceneObject sceneObject; - String spriteFolder; - - EquipmentController equipmentController; - - bool canWalk = true; - - Player(double x, double y, this._map, String myName, String myId, - this.sceneObject, - {this.spriteFolder = "human/male1", this.isMine = false}) - : super(x, y) { - playerActions = PlayerActions(this); - playerNetwork = PlayerNetwork(this); - - if (isMine) { - _inventory = Inventory(this, sceneObject.hud); - _playerHUD = PlayerHUD(this, sceneObject.hud); - BuildHUD(this, _map, sceneObject.hud); - _map.buildFoundation = BuildFoundation(this, _map); - equipmentController = EquipmentController(this); - _inputController = InputController(this); - } - id = myId; - name = myName; - - _loadSprites(); - } - - void draw(Canvas c) { - die(c); - if (isActive == false) { - return; - } - mapHeight = _map.getHeightOnPos(posX, posY); - - var maxWalkSpeed = 3.0; - if (_inputController != null) { - maxWalkSpeed = - (_inputController.maxAngle * _inputController.speedMultiplier); - } - var walkSpeed = max(xSpeed.abs(), ySpeed.abs()) * maxSpeedEnergyMultiplier; - var deltaSpeed = (walkSpeed / maxWalkSpeed); - var animSpeed = 0.07 + (0.1 - (deltaSpeed * 0.1)); - //var playAnim = animSpeed < .17; - - if (currentSprite != null) { - var stopAnimWhenIdle = true; - if (currentSprite.folder.contains("/attack")) { - stopAnimWhenIdle = false; - animSpeed = 0.07; - } - - currentSprite.draw(c, x, y, xSpeed, ySpeed, animSpeed, mapHeight, - stopAnimWhenIdle: stopAnimWhenIdle); //0.125 = 12fps - - equipmentController?.draw(c, animSpeed, - stopAnimWhenIdle: stopAnimWhenIdle); - } - //debugDraw(c); - _text.render(c, name, Position(x, y - 45), anchor: Anchor.bottomCenter); - } - - @override - void update() { - super.update(); - if (isActive == false) { - return; - } - _inputController?.update(); - - slowSpeedWhenItSinks(mapHeight); - moveWithPhysics(); - playerActions.interactWithTrees(_map); - playerNetwork.update(); - } - - void die(Canvas c) { - if (status.isAlive() == false) { - isActive = false; - _deathSprite?.renderScaled(c, Position(x - 16, y - 32), scale: 2); - - if (!isMine) return; - - if (_timeToRespawn == 0) { - _timeToRespawn = GameController.time + 5; - } - if (GameController.time > _timeToRespawn) { - _timeToRespawn = 0; - //x = 0; - //y = 0; - //status.refillStatus(); - //isActive = true; - - playerNetwork.refillStatus(); - } - } - } - - void respawn() { - x = 0; - y = 0; - playerNetwork.setTargetPosition(x, y); - isActive = true; - status.refillStatus(); - } - - void setDirection(Offset target) { - currentSprite.setDirection(target, Offset(x, y)); - equipmentController?.setDirection(target, Offset(x, y)); - } - - void setTargetPosition(double newX, double newY) { - playerNetwork.setTargetPosition(newX, newY); - } - - @override - void getHut(int damage, Entity other, {bool isMine = false}) { - super.getHut(damage, other, isMine: isMine); - } - - @override - void onTriggerStay(Entity entity) { - if (!isMine) return; - if (entity is Item) { - _inventory.addItem(entity) ? entity.destroy() : null; - - Flame.audio.play("pickup_item1.mp3", volume: 0.9); - } - } - - void _loadSprites() { - _deathSprite = PreloadAssets.getEffectSprite('rip'); - var _viewPort = Rect.fromLTWH(0, 0, 16, 16); - var _pivot = Offset(8, 16); - var _scale = 3.0; - var _gradeSize = Offset(4, 1); - var _framesCount = 0; - - width = 10 * _scale; - height = 6 * _scale; - - walkSprites = SpriteController("$spriteFolder/walk", _viewPort, _pivot, - _scale, _gradeSize, _framesCount, this); - attackSprites = SpriteController("$spriteFolder/attack", _viewPort, _pivot, - _scale, Offset(5, 1), _framesCount, this); - - currentSprite = walkSprites; - } - - @override - void onAnimationEnd() { - if (currentSprite == attackSprites) { - currentSprite = walkSprites; - currentSprite.direcion = attackSprites.direcion; - } - } -} diff --git a/lib/entity/player/player_actions.dart b/lib/entity/player/player_actions.dart deleted file mode 100644 index 0b5dcd1..0000000 --- a/lib/entity/player/player_actions.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../hud/build/build_hud.dart'; -import '../../map/map_controller.dart'; -import '../../map/tree.dart'; -import '../../utils/tap_state.dart'; -import '../enemys/enemy.dart'; -import 'player.dart'; - -class PlayerActions { - Player player; - PlayerActions(this.player); - - bool isDoingAction = false; - - void interactWithTrees(MapController map) { - if (!player.isMine) { - return; - } - isDoingAction = false; - - if (BuildHUD.buildBtState == BuildButtonState.build) return; - - if (TapState.isTapingLeft()) { - for (var entity in map.entitysOnViewport) { - var target = Offset(entity.x, entity.y); - var distance = (Offset(player.x, player.y) - target).distance; - - if (distance <= 3.0 * player.worldSize && isDoingAction == false) { - if (entity is Tree && entity.status.isAlive()) { - isDoingAction = true; - - if (player.currentSprite != player.attackSprites) { - var hasEnergy = player.status.useEnergy(1); - if (hasEnergy) { - player.equipmentController.setAction(DoAction.attack); - player.currentSprite = player.attackSprites; - player.status.consumeHungriness(0.3); - //entity.doDamage(); - - player.playerNetwork.sendHitTree( - entity.x.round(), - entity.y.round(), - player.equipmentController.getMaxCutTreeDamage()); - } - } - player.setDirection(target); - } else if (entity is Enemy) { - isDoingAction = true; - - if (player.currentSprite != player.attackSprites && - entity.status.isAlive()) { - player.currentSprite = player.attackSprites; - player.equipmentController.setAction(DoAction.attack); - - /*entity.getHut( - player.equipmentController.getMaxAttackDamage(), player, - isMine: true);*/ - //send damage to cloud - player.playerNetwork.attackEnemy( - entity.id, player.equipmentController.getMaxAttackDamage()); - } - player.setDirection(target); - } - } - } - } else { - //player.currentSprite = player.walkSprites; - } - } -} - -enum DoAction { attack } diff --git a/lib/entity/player/player_network.dart b/lib/entity/player/player_network.dart deleted file mode 100644 index 025df13..0000000 --- a/lib/entity/player/player_network.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'dart:ui'; - -import 'package:flame/flame.dart'; - -import '../../game_controller.dart'; -import '../../scene/game_scene.dart'; -import 'player.dart'; - -class PlayerNetwork { - Player player; - double lerpSpeed = 1.9; - - int lastX = 0; - int lastY = 0; - - double newX = 0; - double newY = 0; - - double _nextSendUpdate = 0; - double updateFrequency = 0.25; - - PlayerNetwork(this.player) { - lastX = player.posX; - lastY = player.posY; - } - - void update() { - if (!player.isMine) { - _moveLerpPosition(); - } else { - _sendPositionToServer(); - } - } - - void _sendPositionToServer() { - if (GameController.time > _nextSendUpdate) { - _nextSendUpdate = GameController.time + updateFrequency; - if (lastX != player.x.toInt() || lastY != player.y.toInt()) { - lastX = player.x.toInt(); - lastY = player.y.toInt(); - //SEND POSITION TO SERVER - - GameScene.serverController.movePlayer(); - } - } - } - - void _moveLerpPosition() { - var targetPos = Offset(newX.toDouble(), newY.toDouble()); - - var distance = (Offset(player.x, player.y) - targetPos).distance; - - if (newX == 0 && newY == 0) { - return; - } - - if (distance > 250) { - print('teleporting player ${player.name} because he is too far'); - player.x = targetPos.dx; - player.y = targetPos.dy; - } else { - if (distance > 8) { - player.setDirection(targetPos); - player.x = lerpDouble( - player.x, targetPos.dx, GameController.deltaTime * lerpSpeed); - player.y = lerpDouble( - player.y, targetPos.dy, GameController.deltaTime * lerpSpeed); - } - } - } - - void setTargetPosition(double newX, double newY) { - this.newX = newX; - this.newY = newY; - } - - void sendHitTree(int x, int y, int damage) { - var jsonData = { - "name": "${player.name}", - "x": x, - "y": y, - "damage": damage, - }; - GameScene.serverController.sendMessage("onTreeHit", jsonData); - } - - /// Attack Enemy Entity, the damage is not calculated on the server-side. - void attackEnemy(String enemyId, int damage) { - Flame.audio.play('punch.mp3', volume: 0.4); - var jsonData = {"enemyId": enemyId, "damage": damage}; - GameScene.serverController.sendMessage("onPlayerAttackEnemy", jsonData); - } - - void hitTreeAnimation(double targetX, double targetY) { - player.currentSprite = player.attackSprites; - Flame.audio.play("punch.mp3", volume: 0.5); - player.status.consumeHungriness(0.3); - - var targetPos = Offset(targetX, targetY); - player.setDirection(targetPos); - } - - void refillStatus() { - if (player.isMine) { - var jsonData = { - "action": "reviving", - "hp": player.status.getMaxHP(), - "x": 0, - "y": 0, - }; - GameScene.serverController.sendMessage("onUpdate", jsonData); - } - } -} diff --git a/lib/entity/wall/door.dart b/lib/entity/wall/door.dart deleted file mode 100644 index 1dead7a..0000000 --- a/lib/entity/wall/door.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; - -import '../../utils/preload_assets.dart'; -import 'furniture.dart'; - -class Door extends Furniture { - Sprite openDoor; - bool show = true; - bool isOpen = false; - - Door(double newPosX, double newPosY, double width, double height, - String imageId) - : super(newPosX, newPosY, width, height, imageId) { - loadsprite(); - } - - void loadsprite() { - openDoor = PreloadAssets.getFurnitureSprite('${imageId}_open'); - } - - @override - void draw(Canvas c) { - if (isOpen) { - currentSprite = openDoor; - isActive = false; - } else { - currentSprite = sprite; - isActive = true; - } - super.draw(c); - //sprite?.renderScaled(c, Position(x, y), scale: 1); - } -} diff --git a/lib/entity/wall/foundation.dart b/lib/entity/wall/foundation.dart deleted file mode 100644 index 8c148ab..0000000 --- a/lib/entity/wall/foundation.dart +++ /dev/null @@ -1,324 +0,0 @@ -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; -import 'package:flutter/material.dart'; - -import '../../entity/wall/Roof.dart'; -import '../../map/ground.dart'; -import '../../map/map_controller.dart'; -import '../../map/tile.dart'; -import '../../scene/game_scene.dart'; -import '../../utils/tap_state.dart'; -import '../player/player.dart'; -import 'door.dart'; -import 'furniture.dart'; -import 'wall.dart'; - -class Foundation { - final MapController _map; - final Player _player; - double left, top, width, height; - dynamic foundationData; - //final List wallList = []; - final Map wallList = {}; - final Map tileList = {}; - final Map furnitureList = {}; - Roof roof = Roof(); - bool isValidTerrain = true; - - Rect bounds = Rect.zero; - - WallLevel showWallLevel = WallLevel.upstair; - bool _isPreviousInsideFoundation = false; - - Paint p = Paint(); - final TextConfig _txt10 = TextConfig( - fontSize: 10.0, color: Colors.blueGrey[700], fontFamily: "Blocktopia"); - - Foundation(this.foundationData, this._map, this._player) { - setup(foundationData); - } - - void setup(dynamic mFoundationData) { - foundationData = mFoundationData; - - wallList.forEach((key, value) { - value.destroy(); - }); - wallList.clear(); - - left = foundationData['x'].toDouble(); - top = foundationData['y'].toDouble(); - width = foundationData['w'].toDouble(); - height = foundationData['h'].toDouble(); - - var wallDataList = foundationData['walls']; - - for (var data in wallDataList) { - var x = data['x'].toDouble(); - var y = data['y'].toDouble(); - var imgId = data['id']; - - var wall = Wall(x, y, imgId, this); - wallList['_${wall.posX}_${wall.posY}'] = wall; - _map.addEntity(wall); - } - - bounds = getBuildingArea(); - } - - void save() { - var foundationObject = fromListToObject(); - GameScene.serverController.sendMessage('onFoundationAdd', foundationObject); - } - - dynamic fromListToObject() { - var finalObject = { - 'owner': foundationData['owner'], - 'name': foundationData['name'], - 'x': foundationData['x'], - 'y': foundationData['y'], - 'w': foundationData['w'], - 'h': foundationData['h'], - 'walls': [], - 'floors': [], - 'furnitures': [] - }; - - wallList.forEach((key, item) { - finalObject["walls"] = [...finalObject["walls"], item.toObject()]; - }); - - tileList.forEach((key, value) { - finalObject["floors"] = [...finalObject["floors"], value.toObject()]; - }); - - furnitureList.forEach((key, value) { - finalObject["furnitures"] = [ - ...finalObject["furnitures"], - value.toObject() - ]; - }); - - return finalObject; - } - - void addWall(double x, double y, int imgId) { - if (isInsideFoundation(x, y)) { - var wall = Wall(x, y, imgId, this); - switchWallHeight(wall); - - var foundWall = wallList[wall.id]; - - if (foundWall == null) { - _map.addEntity(wall); - wallList['_${wall.posX}_${wall.posY}'] = wall; - } else { - foundWall.marketToBeRemoved = wall.marketToBeRemoved; - foundWall.imageId = wall.imageId; - } - } - } - - void deleteWall(double x, double y) { - if (isInsideFoundation(x, y)) { - var wall = Wall(x, y, 1, this); - - var foundWall = wallList[wall.id]; - - if (foundWall != null) { - wallList.remove(wall.id); - foundWall.destroy(); - } - } - } - - void addFloor(double x, double y, int imgId) { - if (isInsideFoundation(x, y)) { - var posX = x.floor(); - var posY = y.floor(); - - var t = Tile(posX, posY, Ground.lowGrass, 16, null, - tileSpritePath: 'floor$imgId', idImg: imgId); - tileList['_${posX}_$posY'] = t; - - if (_map.map[posY] == null) { - _map.map[posY] = {posX: null}; //initialize line - } - if (_map.map[posY][posX] == null) { - _map.map[posY][posX] = {0: null}; //initialize line - } - _map.map[posY][posX][0] = t; - } - } - - void addFurniture(final Furniture f) { - var found = furnitureList[f.id]; - - if (found == null && f.imageId != null) { - _map.addEntity(f); - furnitureList[f.id] = f; - } else { - found.marketToBeRemoved = f.marketToBeRemoved; - } - } - - void deleteFurniture(double x, double y) { - Furniture toBeDeleted; - furnitureList.forEach((key, furniture) { - if (furniture.isInside(x.floor(), y.floor())) { - toBeDeleted = furniture; - } - }); - if (toBeDeleted != null) { - furnitureList.remove(toBeDeleted.id); - toBeDeleted.destroy(); - } - } - - void drawBuildArea(Canvas c) { - bounds = getBuildingArea(); - if (isValidTerrain) { - p.color = Color.fromRGBO(55, 59, 150, .2); - } else { - p.color = Color.fromRGBO(203, 43, 49, .2); - } - - c.drawRect(bounds, p); - - _drawLineGrid(c); - - _txt10.render(c, 'Building area', Position(bounds.left, bounds.bottom)); - } - - void _drawLineGrid(Canvas c) { - p.color = Color.fromRGBO(55, 59, 150, .02); - for (var y = 0; y < height; y++) { - for (var x = 0; x < width; x++) { - p.strokeWidth = 0.5; - if (x % 4 == 0 && y % 4 == 0) { - p.strokeWidth = 2.5; - } - //vertical line - c.drawLine( - Offset(bounds.left + (x * 16), bounds.top), - Offset(bounds.left + (x * 16), bounds.bottom), - p, - ); - //horizontal line - c.drawLine( - Offset(bounds.left, bounds.top + (y * 16)), - Offset(bounds.right, bounds.top + (y * 16)), - p, - ); - } - } - } - - Rect getBuildingArea() { - var offset = TapState.worldToScreenPoint(_map); - - var area = Rect.fromLTWH( - (left * 16) + offset.dx, - (top * 16) + offset.dy, - width * 16, - height * 16, - ); - - return area; - } - - /// Using Grid coordinates - bool isInsideFoundation(double posX, double posY, - {double wPoint = 0, double hPoint = 0}) { - return posX >= left && - posX + wPoint < (left + width) && - posY >= top && - posY + hPoint <= (top + height); - } - - void switchDoor({bool isBuildingMode = false}) { - furnitureList.forEach((key, furniture) { - if (furniture is Door) { - var isOpen = _player.posY.toDouble() >= furniture.posY - 2 && - _player.posY.toDouble() <= furniture.posY + 2 && - _player.posX.toDouble() >= furniture.posX - 2 && - _player.posX.toDouble() <= furniture.posX + 2; - furniture.isOpen = isOpen; - furniture.isOpen = isBuildingMode ? false : furniture.isOpen; - } - }); - } - - void switchWallHeightAll({bool isBuildingMode = false}) { - wallList.forEach((key, wall) { - switchWallHeight(wall); - }); - _isPreviousInsideFoundation = - isInsideFoundation(_player.posX.toDouble(), _player.posY.toDouble()); - } - - void switchWallHeight(Wall wall, {bool isBuildingMode = false}) { - var isCurrentInsideFoundation = - isInsideFoundation(_player.posX.toDouble(), _player.posY.toDouble()); - - if (isCurrentInsideFoundation != _isPreviousInsideFoundation) { - if (isCurrentInsideFoundation) { - //enter house - showWallLevel = WallLevel.mid; - wall.showLow = false; - } else { - //leave house - showWallLevel = WallLevel.upstair; - wall.showLow = false; - } - } - - if (showWallLevel == WallLevel.mid) { - var leftRow = left.floor() == wall.posX; - var rightRow = (left.ceil() + width - 1) == wall.posX; - var topLine = (top + 1).floor() == wall.posY; - - if (leftRow || rightRow || topLine) { - wall.showLow = false; - } else { - wall.showLow = true; - } - } else if (showWallLevel == WallLevel.hight) { - wall.showLow = false; - } else if (showWallLevel == WallLevel.low) { - wall.showLow = true; - } - - wall.showCollisionBox = isBuildingMode; - roof.show = (showWallLevel == WallLevel.upstair); - } - - void drawRoof(Canvas c) { - if (!roof.show) return; - - for (var y = top + 4; y < top + height; y++) { - var firstWallPos = 0.0; - var lastWallPos = 0; - var wallsOnLine = 0; - - for (var x = left; x < left + width; x++) { - var wall = wallList['_${x.toInt()}_${y.toInt() + 1}']; - - if (wall != null) { - wallsOnLine++; - if (firstWallPos == 0) firstWallPos = x; - lastWallPos = x.toInt(); - } - - if (x == left + width - 1 && wallsOnLine > 1) { - //last pos - var lineSize = lastWallPos - firstWallPos; - - for (var i = 0; i <= lineSize; i++) { - roof?.draw(c, (firstWallPos + i) * 16, y * 16 - 64); - } - } - } - } - } -} diff --git a/lib/entity/wall/furniture.dart b/lib/entity/wall/furniture.dart deleted file mode 100644 index e70f234..0000000 --- a/lib/entity/wall/furniture.dart +++ /dev/null @@ -1,97 +0,0 @@ -import 'dart:math'; - -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; - -import '../../utils/preload_assets.dart'; -import '../entity.dart'; - -class Furniture extends Entity { - Sprite sprite; - Sprite currentSprite; - String imageId; - final double zoom = 1; - - bool showLow = false; - bool showCollisionBox = false; - - double width, height; - - Furniture( - double newPosX, double newPosY, this.width, this.height, this.imageId) - : super(newPosX.floor() * 16.0 + 8, (newPosY.ceil() + 1) * 16.0) { - loadSprite(); - - shadownSize = 1; - //shadownLarge = PreloadAssets.getEffectSprite('shadown_square'); - shadownLarge = null; - shadownOffset = Offset(0, 14); - - id = '_${newPosX.floor()}_${posY.ceil() + 1}'; - - width *= 16; - height *= 16; - collisionBox = Rect.fromLTWH(x - 8, y - 16, width, height); - } - - void loadSprite() { - sprite = PreloadAssets.getFurnitureSprite(imageId); - currentSprite = sprite; - //sprite = await Sprite.loadSprite('walls/$_imgPath'); - //lowSprite = await Sprite.loadSprite('walls/low_$_imgPath'); - } - - void draw(Canvas c) { - if (currentSprite == null) return; - if (currentSprite.src == null) return; - var pivot = - Offset((zoom * 16) / 2, (currentSprite.size.y * 2) - height + 16); - - currentSprite.renderScaled(c, Position(x - pivot.dx, y - pivot.dy - z), - scale: 2); - - //showCollisionBox = true; - showCollisionBox ? debugDraw(c) : null; - } - - bool isInside(int pointX, int pointY) { - return pointX >= posX && - pointX < (posX + width ~/ 16) && - pointY >= posY - 1 && - pointY < (posY - 1 + height ~/ 16); - } - - bool isIntersecting( - double pointX, double pointY, double wPoint, double hPoint) { - var r1 = Rectangle( - pointX.floorToDouble() + 0.1, - pointY.floorToDouble(), - wPoint - 0.2, - hPoint, - ); - var r2 = Rectangle( - posX.toDouble(), - posY.toDouble() - 1, - (width / 16), - (height / 16) - 1, - ); - - return r1.intersects(r2); - } - - @override - String toString() { - return """id:$imageId, x:$posX y:$posY"""; - } - - dynamic toObject() { - return { - 'id': imageId, - 'x': posX, - 'y': posY - 1, - 'w': width / 16, - 'h': height / 16 - }; - } -} diff --git a/lib/entity/wall/roof.dart b/lib/entity/wall/roof.dart deleted file mode 100644 index 24554ea..0000000 --- a/lib/entity/wall/roof.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; - -import '../../utils/preload_assets.dart'; - -class Roof { - int selectedIndex = 0; - List roofSprite = []; - bool show = true; - Roof() { - loadsprite(); - } - - void loadsprite() { - roofSprite.add(PreloadAssets.getRoofSprite('roof1')); - roofSprite.add(PreloadAssets.getRoofSprite('roof2')); - } - - void draw(Canvas c, double x, double y) { - selectedIndex = (x ~/ 16) % roofSprite.length; - roofSprite[selectedIndex]?.renderScaled(c, Position(x, y - 80), scale: 1); - } -} diff --git a/lib/entity/wall/wall.dart b/lib/entity/wall/wall.dart deleted file mode 100644 index a73ceb6..0000000 --- a/lib/entity/wall/wall.dart +++ /dev/null @@ -1,113 +0,0 @@ -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; - -import '../../utils/preload_assets.dart'; -import '../entity.dart'; -import 'foundation.dart'; - -class Wall extends Entity { - List sprites = []; - Sprite leftSprite; - Sprite rightSprite; - - Sprite lowLeftSprite; - Sprite lowRightSprite; - - int spriteIndex = 0; - - Sprite currentSprite; - Sprite currentLowSprite; - - List lowSprites = []; - int imageId; - String _imgPath; - final double zoom = 1; - - bool showLow = false; - bool showCollisionBox = false; - - final Foundation _foundation; - - Wall(double newPosX, double newPosY, this.imageId, this._foundation) - : super(newPosX.floor() * 16.0 + 8, newPosY.ceil() * 16.0) { - _imgPath = getImageId(imageId); - loadSprite(); - - shadownSize = 1; - shadownLarge = PreloadAssets.getEffectSprite('shadown_square'); - //shadownLarge = Sprite("shadown_square.png"); - shadownOffset = Offset(0, 13); - - height = (zoom * 16) * 5; - id = '_${newPosX.floor()}_${posY.ceil()}'; - } - - void loadSprite() { - lowSprites.add(PreloadAssets.getWallSprite('low_$_imgPath')); - sprites.add(PreloadAssets.getWallSprite(_imgPath)); - - leftSprite = PreloadAssets.getWallSprite('${_imgPath}_left'); - rightSprite = PreloadAssets.getWallSprite('${_imgPath}_right'); - lowLeftSprite = PreloadAssets.getWallSprite('low_${_imgPath}_left'); - lowRightSprite = PreloadAssets.getWallSprite('low_${_imgPath}_right'); - - for (var i = 2; i <= 5; i++) { - var nextSprite = PreloadAssets.getWallSprite('${_imgPath}_$i'); - if (nextSprite == null) return; - sprites.add(nextSprite); - - var lowNextSprite = PreloadAssets.getWallSprite('low_${_imgPath}_$i'); - if (nextSprite == null) return; - lowSprites.add(lowNextSprite); - } - } - - void draw(Canvas c) { - if (sprites.length == 0 || lowSprites.length == 0) return; - var pivot = Offset((zoom * 16) / 2, height); - - selectWallSprite(); - - if (showLow) { - currentLowSprite.renderScaled(c, Position(x - pivot.dx, y - pivot.dy - z), - scale: 1); - } else { - currentSprite.renderScaled(c, Position(x - pivot.dx, y - pivot.dy - z), - scale: 1); - } - - showCollisionBox ? debugDraw(c) : null; - } - - void selectWallSprite() { - spriteIndex = posX % sprites.length; - //if (spriteIndex >= sprites.length) spriteIndex = 0; - currentSprite = sprites[spriteIndex]; - currentLowSprite = lowSprites[spriteIndex]; - - var leftWall = _foundation.wallList['_${posX - 1}_$posY']; - var rightWall = _foundation.wallList['_${posX + 1}_$posY']; - if (leftWall == null && rightWall != null && leftSprite != null) { - currentSprite = leftSprite; - } - if (rightWall == null && leftWall != null && rightSprite != null) { - currentSprite = rightSprite; - } - } - - String getImageId(int imageId) { - return 'wall$imageId'; - } - - @override - String toString() { - return """id:$imageId, x:$posX y:$posY"""; - } - - dynamic toObject() { - return {'id': imageId, 'x': posX, 'y': posY}; - } -} - -enum WallLevel { low, mid, hight, upstair } diff --git a/lib/game_controller.dart b/lib/game_controller.dart index 9cd9fcd..2b6dfa3 100644 --- a/lib/game_controller.dart +++ b/lib/game_controller.dart @@ -1,7 +1,7 @@ import 'dart:ui'; +import 'package:flame/events.dart'; import 'package:flame/game.dart'; -import 'package:flame/gestures.dart'; import 'package:flutter/material.dart'; import 'scene/character_creation/character_creation.dart'; @@ -22,14 +22,16 @@ class GameController extends Game with PanDetector { static int tapState = TapState.up; static int preTapState = TapState.up; + static PreloadAssets preloadAssets; + static SceneObject currentScene; - GameController() { - PreloadAssets(); - //_gameScene = GameScene(); //init Game; + Future init() async { + preloadAssets = PreloadAssets(); + await preloadAssets.loadSprites(); } - void _safeStart() { + void _safeStart() async { if (currentScene == null) { KeyboardUI.build(); if (ServerUtils.isOffline) { @@ -41,7 +43,7 @@ class GameController extends Game with PanDetector { } void render(Canvas c) { - if (screenSize == null) return; + if (screenSize == null || currentScene == null) return; var bgPaint = Paint(); bgPaint.color = Color(0xff000000); @@ -59,7 +61,7 @@ class GameController extends Game with PanDetector { List fpsList = []; void update(double dt) { - if (screenSize == null) return; + if (screenSize == null || currentScene == null) return; deltaTime = dt; time += dt; @@ -81,35 +83,35 @@ class GameController extends Game with PanDetector { preTapState = TapState.up; } - currentScene.update(); + currentScene.update(dt); } - void resize(Size size) { - super.resize(size); + @override + void onGameResize(Vector2 size) { + super.onGameResize(size); print('Starting game with $size'); - screenSize = Rect.fromLTWH(0, 0, size.width, size.height); - + screenSize = Rect.fromLTWH(0, 0, size[0], size[1]); _safeStart(); } @override - void onPanDown(DragDownDetails details) { + void onPanDown(DragDownInfo details) { preTapState = TapState.down; - TapState.pressedPosition = details.localPosition; - TapState.currentPosition = details.localPosition; - TapState.lastPosition = details.localPosition; + TapState.pressedPosition = details.raw.localPosition; + TapState.currentPosition = details.raw.localPosition; + TapState.lastPosition = details.raw.localPosition; } @override - void onPanUpdate(DragUpdateDetails details) { + void onPanUpdate(DragUpdateInfo details) { if (tapState == TapState.pressing) { TapState.lastPosition = TapState.currentPosition; - TapState.currentPosition = details.localPosition; + TapState.currentPosition = details.raw.localPosition; } } @override - void onPanEnd(DragEndDetails details) { + void onPanEnd(DragEndInfo details) { tapState = TapState.up; } } diff --git a/lib/hud/build/build_foundation.dart b/lib/hud/build/build_foundation.dart index 0222625..326815a 100644 --- a/lib/hud/build/build_foundation.dart +++ b/lib/hud/build/build_foundation.dart @@ -1,10 +1,12 @@ +// ignore_for_file: lines_longer_than_80_chars + import 'dart:math'; -import 'package:BWO/entity/wall/door.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import '../../entity/player/player.dart'; +import '../../entity/wall/door.dart'; import '../../entity/wall/foundation.dart'; import '../../entity/wall/furniture.dart'; import '../../map/ground.dart'; @@ -62,9 +64,9 @@ class BuildFoundation { void drawRoofs(Canvas c) { var t = TimerHelper(); - foundationList.forEach((element) { + for (var element in foundationList) { element.drawRoof(c); - }); + } t.logDelayPassed("drawRoofs"); } @@ -72,7 +74,7 @@ class BuildFoundation { bool checkIfTerrainLocationIsValid(int x, int y, int w, int h) { var trees = getAmountOfTreesAround(x, y, w, h); - if (trees.length > 0) { + if (trees.isNotEmpty) { Toast.add("This place is blocked by a Tree. You should remove it first."); return false; } @@ -93,7 +95,8 @@ class BuildFoundation { Future getAllFoundationAround(int x, int y, int w, int h) { print('requesting foundation location avaiablity'); - return http.get('${ServerUtils.server}/foundations/at/$x/$y/$w/$h'); + return http + .get(Uri.parse('${ServerUtils.server}/foundations/at/$x/$y/$w/$h')); } bool isInsideSpecialArea(Rectangle r1, Rectangle r2) { diff --git a/lib/hud/build/build_hud.dart b/lib/hud/build/build_hud.dart index 54e44d9..9ce9463 100644 --- a/lib/hud/build/build_hud.dart +++ b/lib/hud/build/build_hud.dart @@ -1,6 +1,5 @@ -import 'package:flame/position.dart'; +import 'package:flame/extensions.dart'; import 'package:flame/sprite.dart'; -import 'package:flutter/material.dart'; import '../../entity/player/player.dart'; import '../../entity/wall/wall.dart'; @@ -8,6 +7,7 @@ import '../../game_controller.dart'; import '../../map/map_controller.dart'; import '../../ui/hud.dart'; import '../../ui/ui_element.dart'; +import '../../utils/sprite_controller.dart'; import '../../utils/tap_state.dart'; import 'build_tools_bar.dart'; @@ -23,8 +23,8 @@ class BuildHUD extends UIElement { Sprite _upstairSprite; Sprite _switchLevelButtonSprite; - Position bPos = Position.empty(); - Position sPos = Position.empty(); + Vector2 bPos = Vector2.zero(); + Vector2 sPos = Vector2.zero(); static BuildButtonState buildBtState = BuildButtonState.none; @@ -39,14 +39,14 @@ class BuildHUD extends UIElement { } void loadSprite() async { - _buildSprite = await Sprite.loadSprite("ui/hammer.png"); - _buildSpriteOpen = await Sprite.loadSprite("ui/hammer_open.png"); - _deleteSprite = await Sprite.loadSprite("ui/handsaw.png"); + _buildSprite = await Sprite.load("ui/hammer.png"); + _buildSpriteOpen = await Sprite.load("ui/hammer_open.png"); + _deleteSprite = await Sprite.load("ui/handsaw.png"); - _lowWallSprite = await Sprite.loadSprite("ui/low_wall.png"); - _midWallSprite = await Sprite.loadSprite("ui/mid_wall.png"); - _fullWallSprite = await Sprite.loadSprite("ui/full_wall.png"); - _upstairSprite = await Sprite.loadSprite("ui/upstair.png"); + _lowWallSprite = await Sprite.load("ui/low_wall.png"); + _midWallSprite = await Sprite.load("ui/mid_wall.png"); + _fullWallSprite = await Sprite.load("ui/full_wall.png"); + _upstairSprite = await Sprite.load("ui/upstair.png"); _switchLevelButtonSprite = _midWallSprite; } @@ -56,13 +56,16 @@ class BuildHUD extends UIElement { _buildSpriteOpen == null || _deleteSprite == null) return; - bPos = Position(10, GameController.screenSize.height - 176); + bPos = Vector2(10, GameController.screenSize.height - 176); if (buildBtState == BuildButtonState.build) { - _buildSpriteOpen.renderScaled(c, bPos, scale: 2); + _buildSpriteOpen.render(c, + position: bPos, size: Vector2.all(SpriteController.spriteSize * 2)); } else if (buildBtState == BuildButtonState.delete) { - _deleteSprite.renderScaled(c, bPos, scale: 2); + _deleteSprite.render(c, + position: bPos, size: Vector2.all(SpriteController.spriteSize * 2)); } else { - _buildSprite.renderScaled(c, bPos, scale: 2); + _buildSprite.render(c, + position: bPos, size: Vector2.all(SpriteController.spriteSize * 2)); } _handlerBuildButtonClick(); @@ -73,12 +76,13 @@ class BuildHUD extends UIElement { // Switch level button if (_map.buildFoundation.myFoundation != null) { - sPos = Position(10, GameController.screenSize.height - 224); + sPos = Vector2(10, GameController.screenSize.height - 224); var sRect = Rect.fromLTWH(sPos.x, sPos.y, 32, 32); if (TapState.clickedAt(sRect)) { _handlerWallLevelButtonClick(); } - _switchLevelButtonSprite?.renderScaled(c, sPos, scale: 2); + _switchLevelButtonSprite?.render(c, + position: sPos, size: Vector2.all(SpriteController.spriteSize * 2)); var isBuildingMode = buildBtState != BuildButtonState.none; _map.buildFoundation.myFoundation ?.switchWallHeightAll(isBuildingMode: isBuildingMode); diff --git a/lib/hud/build/build_subtools_bar.dart b/lib/hud/build/build_subtools_bar.dart index b350266..ed8a411 100644 --- a/lib/hud/build/build_subtools_bar.dart +++ b/lib/hud/build/build_subtools_bar.dart @@ -1,7 +1,5 @@ import 'dart:ui'; -import 'package:flutter/material.dart'; - import '../../game_controller.dart'; import '../../utils/tap_state.dart'; import 'tool_item.dart'; diff --git a/lib/hud/build/build_tools_bar.dart b/lib/hud/build/build_tools_bar.dart index fefeeb8..ecaa579 100644 --- a/lib/hud/build/build_tools_bar.dart +++ b/lib/hud/build/build_tools_bar.dart @@ -1,7 +1,5 @@ import 'dart:ui'; -import 'package:flutter/material.dart'; - import '../../entity/player/player.dart'; import '../../game_controller.dart'; import '../../map/map_controller.dart'; diff --git a/lib/hud/build/tool_item.dart b/lib/hud/build/tool_item.dart index f6888da..c84e844 100644 --- a/lib/hud/build/tool_item.dart +++ b/lib/hud/build/tool_item.dart @@ -1,12 +1,10 @@ -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../../ui/hud.dart'; import '../../ui/ui_element.dart'; import '../../utils/preload_assets.dart'; +import '../../utils/sprite_controller.dart'; import '../../utils/tap_state.dart'; class ToolItem extends UIElement { @@ -15,19 +13,20 @@ class ToolItem extends UIElement { Sprite sprite; Offset pos = Offset.zero; - final TextConfig _text = TextConfig( - fontSize: 12.0, - color: Color.fromRGBO(62, 44, 40, 1), - fontFamily: "Blocktopia"); + final TextPaint _text = TextPaint( + style: TextStyle( + fontSize: 12.0, + color: Color.fromRGBO(62, 44, 40, 1), + fontFamily: "Blocktopia")); Function(ToolItem) callback; bool isSelected = false; - Offset size = Offset.zero; + String name; ToolItem(this.spriteName, this.name, HUD hudRef, this.callback, - {bool isBtSelected = false, this.size = Offset.zero}) + {bool isBtSelected = false, Vector2 size}) : super(hudRef) { isSelected = isBtSelected; loadSprite(); @@ -49,10 +48,12 @@ class ToolItem extends UIElement { } c.drawCircle(pos, 25, _p); - sprite.renderScaled(c, Position(pos.dx - 16, pos.dy - 16), scale: 2); + sprite.render(c, + position: Vector2(pos.dx - 16, pos.dy - 16), + size: Vector2.all(SpriteController.spriteSize * 2)); _text.render( - c, name, Position(bounds.bottomCenter.dx, bounds.bottomCenter.dy + 24), + c, name, Vector2(bounds.bottomCenter.dx, bounds.bottomCenter.dy + 24), anchor: Anchor.bottomCenter); checkPress(); diff --git a/lib/hud/build/tools/build_tools_door.dart b/lib/hud/build/tools/build_tools_door.dart index 11cc01d..26ebb44 100644 --- a/lib/hud/build/tools/build_tools_door.dart +++ b/lib/hud/build/tools/build_tools_door.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:flame/extensions.dart'; import '../../../entity/wall/door.dart'; import '../../../game_controller.dart'; @@ -24,9 +24,9 @@ class BuildToolsDoor extends BuildSubToolsBar { BuildToolsDoor(this._map, this.toolsBar, HUD hudRef) { buttonList = [ - ToolItem("door1", "Door 1", hudRef, onPress, size: Offset(2, 1)), - ToolItem("door2", "Door 2", hudRef, onPress, size: Offset(2, 1)), - ToolItem("door3", "Door 3", hudRef, onPress, size: Offset(2, 1)), + ToolItem("door1", "Door 1", hudRef, onPress, size: Vector2(2, 1)), + ToolItem("door2", "Door 2", hudRef, onPress, size: Vector2(2, 1)), + ToolItem("door3", "Door 3", hudRef, onPress, size: Vector2(2, 1)), ]; } @@ -61,8 +61,8 @@ class BuildToolsDoor extends BuildSubToolsBar { void onPress(ToolItem bt) { selectButtonHighlight(bt); - width = bt.size.dx.floor(); - height = bt.size.dy.floor(); + width = bt.size[0].floor(); + height = bt.size[1].floor(); print('onPress ${bt.spriteName}'); _selectedDoor = bt.spriteName; diff --git a/lib/hud/build/tools/build_tools_foundation.dart b/lib/hud/build/tools/build_tools_foundation.dart index f9be28d..3a7647c 100644 --- a/lib/hud/build/tools/build_tools_foundation.dart +++ b/lib/hud/build/tools/build_tools_foundation.dart @@ -1,3 +1,4 @@ +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../../../entity/player/player.dart'; @@ -17,11 +18,11 @@ class BuildToolsFoundation extends BuildSubToolsBar { BuildToolsFoundation(this._player, this._map, HUD hudRef) { buttonList = [ - ToolItem("foundation", "8x8", hudRef, onPress, size: Offset(8, 8)), - ToolItem("foundation", "16x8", hudRef, onPress, size: Offset(16, 8)), - ToolItem("foundation", "16x16", hudRef, onPress, size: Offset(16, 16)), - ToolItem("foundation", "24x16", hudRef, onPress, size: Offset(24, 16)), - ToolItem("foundation", "24x24", hudRef, onPress, size: Offset(24, 24)), + ToolItem("foundation", "8x8", hudRef, onPress, size: Vector2(8, 8)), + ToolItem("foundation", "16x8", hudRef, onPress, size: Vector2(16, 8)), + ToolItem("foundation", "16x16", hudRef, onPress, size: Vector2(16, 16)), + ToolItem("foundation", "24x16", hudRef, onPress, size: Vector2(24, 16)), + ToolItem("foundation", "24x24", hudRef, onPress, size: Vector2(24, 24)), ]; } diff --git a/lib/hud/build/tools/build_tools_furniture.dart b/lib/hud/build/tools/build_tools_furniture.dart index b5377e8..63b0df6 100644 --- a/lib/hud/build/tools/build_tools_furniture.dart +++ b/lib/hud/build/tools/build_tools_furniture.dart @@ -1,3 +1,4 @@ +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../../../entity/wall/furniture.dart'; @@ -24,9 +25,9 @@ class BuildToolsFurniture extends BuildSubToolsBar { BuildToolsFurniture(this._map, this.toolsBar, HUD hudRef) { buttonList = [ - ToolItem("bed1", "Bed 1", hudRef, onPress, size: Offset(2, 3)), + ToolItem("bed1", "Bed 1", hudRef, onPress, size: Vector2(2, 3)), ToolItem("refrigerator", "Refrigerator", hudRef, onPress, - size: Offset(2, 1)), + size: Vector2(2, 1)), ]; } @@ -61,8 +62,8 @@ class BuildToolsFurniture extends BuildSubToolsBar { void onPress(ToolItem bt) { selectButtonHighlight(bt); - width = bt.size.dx.floor(); - height = bt.size.dy.floor(); + width = bt.size[0].floor(); + height = bt.size[1].floor(); _selectedFurniture = bt.spriteName; } diff --git a/lib/hud/inventory.dart b/lib/hud/inventory.dart index 0d5f6f2..e16f5ed 100644 --- a/lib/hud/inventory.dart +++ b/lib/hud/inventory.dart @@ -1,6 +1,4 @@ -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../entity/items/item_database.dart'; @@ -9,6 +7,7 @@ import '../entity/player/player.dart'; import '../game_controller.dart'; import '../ui/hud.dart'; import '../ui/ui_element.dart'; +import '../utils/sprite_controller.dart'; import '../utils/tap_state.dart'; class Inventory extends UIElement { @@ -20,8 +19,9 @@ class Inventory extends UIElement { final int _maxHorizontalSlots = 2; final double _spaceBetweenSlots = 2; - final TextConfig _config = - TextConfig(fontSize: 11.0, color: Colors.white, fontFamily: "Blocktopia"); + final TextPaint _config = TextPaint( + style: TextStyle( + fontSize: 11.0, color: Colors.white, fontFamily: "Blocktopia")); final Player _player; Sprite _bagSprite; @@ -37,11 +37,11 @@ class Inventory extends UIElement { void loadSprite() async { print("player : ${_player.spriteFolder}"); if (_player.spriteFolder.contains("female")) { - _bagSprite = await Sprite.loadSprite("ui/bag2.png"); - _bagSpriteOpen = await Sprite.loadSprite("ui/bag2_open.png"); + _bagSprite = await Sprite.load("ui/bag2.png"); + _bagSpriteOpen = await Sprite.load("ui/bag2_open.png"); } else { - _bagSprite = await Sprite.loadSprite("ui/bag.png"); - _bagSpriteOpen = await Sprite.loadSprite("ui/bag_open.png"); + _bagSprite = await Sprite.load("ui/bag.png"); + _bagSpriteOpen = await Sprite.load("ui/bag_open.png"); } } @@ -99,13 +99,13 @@ class Inventory extends UIElement { if (itemList[i].sprite == null) { return; //image not ready yet } - itemList[i].sprite.renderScaled( - c, Position(slotRect.left + 4, slotRect.top + 4), - scale: 1.5); + itemList[i].sprite.render(c, + position: Vector2(slotRect.left + 4, slotRect.top + 4), + size: Vector2.all(SpriteController.spriteSize * 1.5)); _config.render( c, "${itemList[i].amount}", - Position(slotRect.left + 2, slotRect.top + 1), + Vector2(slotRect.left + 2, slotRect.top + 1), ); if (GameController.tapState == TapState.down && @@ -128,11 +128,13 @@ class Inventory extends UIElement { void drawBagButton(Canvas c) { if (_bagSprite != null && _bagSpriteOpen != null) { - var bPos = Position(10, GameController.screenSize.height - 128); + var bPos = Vector2(10, GameController.screenSize.height - 128); if (isOpen) { - _bagSpriteOpen.renderScaled(c, bPos, scale: 2); + _bagSpriteOpen.render(c, + position: bPos, size: Vector2.all(SpriteController.spriteSize * 2)); } else { - _bagSprite.renderScaled(c, bPos, scale: 2); + _bagSprite.render(c, + position: bPos, size: Vector2.all(SpriteController.spriteSize * 2)); } var bRect = Rect.fromLTWH(bPos.x, bPos.y, 32, 32); diff --git a/lib/hud/player_hud.dart b/lib/hud/player_hud.dart index 7d7eb44..8c78460 100644 --- a/lib/hud/player_hud.dart +++ b/lib/hud/player_hud.dart @@ -1,12 +1,10 @@ -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../entity/player/player.dart'; import '../ui/hud.dart'; import '../ui/ui_element.dart'; +import '../utils/preload_assets.dart'; /// SHOWS Players stats on HUD. /// This class is added to a list of UIElements on GameScene @@ -14,13 +12,12 @@ class PlayerHUD extends UIElement { final Player _player; final Paint _p = Paint(); - final TextConfig _txt14 = - TextConfig(fontSize: 14.0, color: Colors.white, fontFamily: "Blocktopia"); - final TextConfig _txt10 = - TextConfig(fontSize: 10.0, color: Colors.white, fontFamily: "Blocktopia"); - - final Sprite _stomach = Sprite("ui/stomach.png"); - final Sprite _stomachBack = Sprite("ui/stomach_back.png"); + final TextPaint _txt14 = TextPaint( + style: TextStyle( + fontSize: 14.0, color: Colors.white, fontFamily: "Blocktopia")); + final TextPaint _txt10 = TextPaint( + style: TextStyle( + fontSize: 10.0, color: Colors.white, fontFamily: "Blocktopia")); PlayerHUD(this._player, HUD hudRef) : super(hudRef) { drawOnHUD = true; @@ -60,26 +57,26 @@ class PlayerHUD extends UIElement { _txt14.render( c, "Lv. ${_player.status.getLevel()}", - Position(hp.left, hp.top - 1), + Vector2(hp.left, hp.top - 1), anchor: Anchor.bottomLeft, ); _txt10.render( - c, "${_player.posX}, ${_player.posY}", Position(hp.right, hp.top - 1), + c, "${_player.posX}, ${_player.posY}", Vector2(hp.right, hp.top - 1), anchor: Anchor.bottomRight); drawIcon( c, Rect.fromLTWH(10, xp.bottom + 5, 16, 16), - _stomachBack, - _stomach, + PreloadAssets.getStomachBack(), + PreloadAssets.getStomach(), _player.status.getCalories(), _player.status.getMaxCalories(), ); } Rect drawBar(Canvas c, Rect barRect, Color barColor, double currentVal, - double maxVal, String textValue, TextConfig txt) { + double maxVal, String textValue, TextPaint txt) { var bar2 = Rect.fromLTWH(barRect.left + 2, barRect.top - 2, barRect.width - 4, barRect.height + 4); @@ -101,7 +98,7 @@ class PlayerHUD extends UIElement { txt.render( c, "${textValue == "-0.0" ? 0.0 : textValue}", - Position(barRect.left + 5, barRect.center.dy), + Vector2(barRect.left + 5, barRect.center.dy), anchor: Anchor.centerLeft, ); diff --git a/lib/main.dart b/lib/main.dart index 2f8c237..de8440a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,17 +1,16 @@ -import 'package:flame/util.dart'; +import 'package:flame/flame.dart'; +import 'package:flame/game.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:wakelock/wakelock.dart'; import 'game_controller.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - Wakelock.enable(); - var gameController = GameController(); - runApp(gameController.widget); + // Wakelock.enable(); - var flameUtil = Util(); - flameUtil.fullScreen(); - flameUtil.setOrientation(DeviceOrientation.portraitUp); + await Flame.device.fullScreen(); + await Flame.device.setPortraitUpOnly(); + var gameController = await GameController(); + await gameController.init(); + runApp(GameWidget(game: gameController)); } diff --git a/lib/map/Tile.dart b/lib/map/Tile.dart index 841fd4d..9484d45 100644 --- a/lib/map/Tile.dart +++ b/lib/map/Tile.dart @@ -1,8 +1,10 @@ -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; +// ignore_for_file: file_names + +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; class Tile { int posX; @@ -38,8 +40,10 @@ class Tile { } void draw(Canvas c) { - //c.drawRect(boxRect, boxPaint); - tileSprite?.renderScaled(c, Position(boxRect.left, boxRect.top)); + c.drawRect(boxRect, boxPaint); + tileSprite?.render(c, + position: Vector2(boxRect.left, boxRect.top), + size: Vector2.all(SpriteController.spriteSize)); } dynamic toObject() { diff --git a/lib/map/ground.dart b/lib/map/ground.dart index 5607f82..6ffd47d 100644 --- a/lib/map/ground.dart +++ b/lib/map/ground.dart @@ -1,13 +1,12 @@ -import 'dart:math'; -import 'dart:ui'; +import 'dart:math' as math; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../effects/foam_water_effect.dart'; import '../effects/water_stars_effect.dart'; import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; import 'tile.dart'; class Ground extends Tile { @@ -39,10 +38,13 @@ class Ground extends Tile { boxPaint.color = foamWaterEffect.getFoamColor(height, posX, posY); //Colors.blue[200]; } + c.drawRect(boxRect, boxPaint); if (grass != null) { - grass.renderScaled(c, Position(boxRect.left, boxRect.top), scale: 1); + grass.render(c, + position: Vector2(boxRect.left, boxRect.top), + size: Vector2.all(SpriteController.spriteSize * 1)); } if (height < 107) { @@ -54,8 +56,8 @@ class Ground extends Tile { height = heightLvl; var green = 255 - heightLvl; - if (heightLvl > 142 && heightLvl < 152 && Random().nextInt(100) > 98) { - var id = Random().nextInt(5) + 1; + if (heightLvl > 142 && heightLvl < 152 && math.Random().nextInt(100) > 98) { + var id = math.Random().nextInt(5) + 1; grass = PreloadAssets.getEnviromentSprite("floor$id"); /*grass = Sprite("enviroment/floor${id}.png", width: size.toDouble(), height: size.toDouble());*/ @@ -74,24 +76,24 @@ class Ground extends Tile { } else if (heightLvl < sand) { return Colors.amber[200]; } else if (heightLvl < lowGrass) { - if (Random().nextInt(100) > 95) { - var id = Random().nextInt(4) + 7; + if (math.Random().nextInt(100) > 95) { + var id = math.Random().nextInt(4) + 7; grass = PreloadAssets.getEnviromentSprite("grass$id"); /*grass = Sprite("enviroment/grass$id.png", width: size.toDouble(), height: size.toDouble());*/ } return Color.fromRGBO(116, green + 50, 54, 1); } else if (heightLvl < 160) { - if (Random().nextInt(100) > 96) { - var id = Random().nextInt(2) + 11; + if (math.Random().nextInt(100) > 96) { + var id = math.Random().nextInt(2) + 11; grass = PreloadAssets.getEnviromentSprite("grass$id"); /*grass = Sprite("enviroment/grass$id.png", width: size.toDouble(), height: size.toDouble());*/ } return Color.fromRGBO(82, green + 40, 46, 1); } else if (heightLvl < 185) { - if (Random().nextInt(100) > 98) { - var id = Random().nextInt(2) + 13; + if (math.Random().nextInt(100) > 98) { + var id = math.Random().nextInt(2) + 13; grass = PreloadAssets.getEnviromentSprite("grass$id"); /*grass = Sprite("enviroment/grass${id}.png", width: size.toDouble(), height: size.toDouble());*/ diff --git a/lib/map/map_controller.dart b/lib/map/map_controller.dart index 76aad0f..43ded56 100644 --- a/lib/map/map_controller.dart +++ b/lib/map/map_controller.dart @@ -1,13 +1,13 @@ import 'dart:ui' as ui; -import 'package:BWO/utils/timer_helper.dart'; import 'package:fast_noise/fast_noise.dart'; import 'package:flutter/material.dart'; -import '../entity/entity.dart'; +import '../entity/Entity.dart'; import '../entity/player/player.dart'; import '../game_controller.dart'; import '../hud/build/build_foundation.dart'; +import '../utils/timer_helper.dart'; import 'ground.dart'; import 'tile.dart'; import 'tree.dart'; diff --git a/lib/map/tree.dart b/lib/map/tree.dart index f4909ba..dbee229 100644 --- a/lib/map/tree.dart +++ b/lib/map/tree.dart @@ -1,11 +1,11 @@ import 'dart:math'; import 'dart:ui'; -import 'package:flame/flame_audio.dart'; -import 'package:flame/sprite_batch.dart'; -import 'package:flutter/material.dart'; +import 'package:flame/extensions.dart'; +import 'package:flame/sprite.dart'; +import 'package:flame_audio/flame_audio.dart'; -import '../entity/entity.dart'; +import '../entity/Entity.dart'; import '../entity/items/item_database.dart'; import '../entity/items/items.dart'; import '../game_controller.dart'; @@ -26,7 +26,6 @@ class Tree extends Entity { int _applesLeft = 1; - final FlameAudio _audio = FlameAudio(); double _deadRotation = 0; double _gravityRotation = 0; @@ -50,13 +49,13 @@ class Tree extends Entity { } void loadSprite() async { - //_tree = await SpriteBatch.withAsset('trees/${_spriteImage}.png'); + // _tree = await SpriteBatch.load('trees/$_spriteImage.png'); _tree = PreloadAssets.getTreeSprite(_spriteImage); _tree.add( - rect: Rect.fromLTWH(0, 0, 16, 16), - offset: Offset( + source: Rect.fromLTWH(0, 0, 16, 16), + offset: Vector2( posX.toDouble() * _tileSize, (posY.toDouble() - 1) * _tileSize), - anchor: Offset(8, 14), + anchor: Vector2(8, 14), scale: _tileSize.toDouble(), rotation: 0 //-0.05 ); @@ -74,7 +73,7 @@ class Tree extends Entity { isActive ? _tree.render(c) : null; } - //isActive ? debugDraw(c) : null; + // isActive ? debugDraw(c) : null; } void _checksDeath() { @@ -133,10 +132,10 @@ class Tree extends Entity { void _updateFrame(double rot) { _tree.clear(); _tree.add( - rect: Rect.fromLTWH(0, 0, 16, 16), - offset: Offset( + source: Rect.fromLTWH(0, 0, 16, 16), + offset: Vector2( posX.toDouble() * _tileSize, (posY.toDouble() - 1) * _tileSize), - anchor: Offset(8, 14), + anchor: Vector2(8, 14), scale: _tileSize.toDouble(), rotation: rot //-0.05 ); @@ -181,7 +180,7 @@ class Tree extends Entity { status.setLife(hp); - _audio.play('punch.mp3', volume: 0.4); + FlameAudio.play('punch.mp3', volume: 0.4); } } diff --git a/lib/scene/character_creation/character_creation.dart b/lib/scene/character_creation/character_creation.dart index f6f1acc..f03e557 100644 --- a/lib/scene/character_creation/character_creation.dart +++ b/lib/scene/character_creation/character_creation.dart @@ -1,12 +1,10 @@ -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../../game_controller.dart'; import '../../ui/button_ui.dart'; import '../../ui/input_text_ui.dart'; +import '../../utils/preload_assets.dart'; import '../game_scene.dart'; import '../login/auth.dart'; import '../scene_object.dart'; @@ -18,12 +16,11 @@ class CharacterCreation extends SceneObject { InputTextUI _inputTextUI; - final TextConfig _title = TextConfig( - fontSize: 22.0, - color: Color.fromRGBO(216, 165, 120, 1), - fontFamily: "Blocktopia"); - - final Sprite _backPaper = Sprite("ui/backpaper.png"); + final TextPaint _title = TextPaint( + style: TextStyle( + fontSize: 22.0, + color: Color.fromRGBO(216, 165, 120, 1), + fontFamily: "Blocktopia")); MapPreviewWindows _mapPreviewWindows; final CharacterPreviewWindows _characterPreviewWindows = @@ -36,7 +33,7 @@ class CharacterCreation extends SceneObject { _inputTextUI = InputTextUI( super.hud, - Position(GameController.screenSize.width / 2, + Vector2(GameController.screenSize.width / 2, GameController.screenSize.height * 0.64), "Player Name", backGroundColor: Color.fromRGBO(255, 255, 255, 0), @@ -103,15 +100,15 @@ class CharacterCreation extends SceneObject { _p.color = Colors.blueGrey[800]; c.drawRect(GameController.screenSize, _p); - _backPaper.renderRect(c, GameController.screenSize); + PreloadAssets.getBackPaper()?.renderRect(c, GameController.screenSize); _title.render(c, "Character Creation", - Position((GameController.screenSize.width / 2) + 20, 85), + Vector2((GameController.screenSize.width / 2) + 20, 85), anchor: Anchor.bottomCenter); _mapPreviewWindows.draw(c); _characterPreviewWindows.draw(c); - _inputTextUI.pos = Position( + _inputTextUI.pos = Vector2( GameController.screenSize.width / 2, GameController.screenSize.height * 0.64, ); @@ -129,7 +126,7 @@ class CharacterCreation extends SceneObject { } @override - void update() { - super.update(); + void update(double dt) { + super.update(dt); } } diff --git a/lib/scene/character_creation/character_preview_windows.dart b/lib/scene/character_creation/character_preview_windows.dart index c86bb06..82a11ac 100644 --- a/lib/scene/character_creation/character_preview_windows.dart +++ b/lib/scene/character_creation/character_preview_windows.dart @@ -1,10 +1,11 @@ import 'dart:ui'; -import 'package:flame/position.dart'; +import 'package:flame/components.dart'; +import 'package:flame/flame.dart'; import 'package:flame/sprite.dart'; -import 'package:flame/spritesheet.dart'; import '../../game_controller.dart'; +import '../../utils/sprite_controller.dart'; import '../../utils/tap_state.dart'; class CharacterPreviewWindows { @@ -14,9 +15,8 @@ class CharacterPreviewWindows { List spriteFolder = []; String currentSpriteFolder; - Sprite shadown = Sprite('shadown.png'); - - Position myPos; + Sprite shadown; + Vector2 myPos; int indexSpriteSheet = 2; int indexFrame = 0; double delay = 0; @@ -24,25 +24,32 @@ class CharacterPreviewWindows { final double width = 44; CharacterPreviewWindows() { - sprites[0] = (loadSprite("human/male1")); - sprites[1] = (loadSprite("human/male2")); - sprites[2] = (loadSprite("human/male3")); - sprites[3] = (loadSprite("human/female1")); - sprites[4] = (loadSprite("human/female2")); - sprites[5] = (loadSprite("human/female3")); - sprites[6] = (loadSprite("human/female4")); - sprites[7] = (loadSprite("human/female5")); - sprites[8] = (loadSprite("human/female6")); - _currentSprite = sprites[indexSpriteSheet]; - delay = GameController.time + 2; + init().then((_) { + _currentSprite = sprites[indexSpriteSheet]; + delay = GameController.time + 2; + + myPos = Vector2( + GameController.screenSize.width / 2 + 3, + GameController.screenSize.height * .5, + ); + }); + } - myPos = Position( - GameController.screenSize.width / 2 + 3, - GameController.screenSize.height * .5, - ); + Future init() async { + shadown = await Sprite.load('shadown.png'); + sprites[0] = (await loadSprite("human/male1")); + sprites[1] = (await loadSprite("human/male2")); + sprites[2] = (await loadSprite("human/male3")); + sprites[3] = (await loadSprite("human/female1")); + sprites[4] = (await loadSprite("human/female2")); + sprites[5] = (await loadSprite("human/female3")); + sprites[6] = (await loadSprite("human/female4")); + sprites[7] = (await loadSprite("human/female5")); + sprites[8] = (await loadSprite("human/female6")); } void draw(Canvas c) { + if (_currentSprite == null) return; var leftButton = Rect.fromLTWH(myPos.x - 113, myPos.y, 80, 70); var rightButton = Rect.fromLTWH(myPos.x + 18, myPos.y, 80, 70); @@ -59,29 +66,32 @@ class CharacterPreviewWindows { sprites.forEach((key, value) { var zoom = .9 - ((key - indexSpriteSheet).abs() * .2); var newPos = myPos + - Position( + Vector2( (key * width - (width * indexSpriteSheet)) - (zoom * width), ((16 * 4.0) * (1 - zoom)) / 2, ); if (indexSpriteSheet == key) { - //shadown.renderScaled(c, myPos + Position(8, 22), scale: 3); - value[indexFrame].getSprite(0, 0).renderScaled(c, newPos, scale: 4); + // shadown.render(c, + // position: myPos + Vector2(8, 22), + // size: Vector2.all(SpriteController.spriteSize * 3)); + value[indexFrame].getSprite(0, 0).render(c, + position: newPos, + size: Vector2.all(SpriteController.spriteSize * 4)); } else { var keyDirection = (key - indexSpriteSheet).abs(); - - shadown.renderScaled( - c, newPos + Position(16 / 2 * zoom, (16 + 4) * zoom), - scale: 3 * zoom); + shadown.render(c, + position: newPos + Vector2(16 / 2 * zoom, (16 + 4) * zoom), + size: Vector2.all(SpriteController.spriteSize * 3 * zoom)); var alphaP = Paint(); alphaP.color = Color.fromRGBO( 255, 255, 255, (0.9 - (keyDirection * .4)).clamp(0.2, 1.0)); alphaP.blendMode = BlendMode.luminosity; //luminosity, colorBurn, dstOut - - value[0] - .getSprite(0, 0) - .renderScaled(c, newPos, scale: 4 * zoom, overridePaint: alphaP); + value[0].getSprite(0, 0).render(c, + position: newPos, + size: Vector2.all(SpriteController.spriteSize * 4 * zoom), + overridePaint: alphaP); } }); c.restore(); @@ -98,7 +108,7 @@ class CharacterPreviewWindows { } } - List loadSprite(String folderName) { + Future> loadSprite(String folderName) async { spriteFolder.add(folderName); // ignore: omit_local_variable_types List sprites = []; @@ -113,14 +123,13 @@ class CharacterPreviewWindows { 'forward_right.png', ]; for (var img in images) { - sprites.add(SpriteSheet( - imageName: "$folderName/walk/$img", - textureWidth: 16, - textureHeight: 16, + sprites.add(SpriteSheet.fromColumnsAndRows( + image: await Flame.images.load("$folderName/walk/$img"), + // srcSize: Vector2.all(16), columns: 4, rows: 1)); } - return sprites; + return Future.value(sprites); } String getSpriteSelected() { diff --git a/lib/scene/character_creation/map_view_windows.dart b/lib/scene/character_creation/map_view_windows.dart index de40613..1db798e 100644 --- a/lib/scene/character_creation/map_view_windows.dart +++ b/lib/scene/character_creation/map_view_windows.dart @@ -1,9 +1,7 @@ import 'dart:math'; -import 'dart:ui'; -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; +import 'package:flutter/cupertino.dart'; import '../../game_controller.dart'; import '../../ui/button_list_ui.dart'; @@ -12,10 +10,11 @@ import '../../utils/tap_state.dart'; class MapPreviewWindows { Paint p = Paint(); - TextConfig location = TextConfig( - fontSize: 10.0, - color: Color.fromRGBO(216, 165, 120, 1), - fontFamily: "Blocktopia"); + TextPaint location = TextPaint( + style: TextStyle( + fontSize: 10.0, + color: Color.fromRGBO(216, 165, 120, 1), + fontFamily: "Blocktopia")); Offset targetPos = Offset.zero; Offset newTarget = Offset.zero; @@ -137,14 +136,15 @@ class MapPreviewWindows { c.drawLine(bounds.topCenter, bounds.bottomCenter, p); location.render(c, " ${-targetPos.dx.toInt()}, ${-targetPos.dy.toInt()}", - Position.fromOffset(bounds.center), + Vector2(bounds.center.dx, bounds.center.dy), anchor: Anchor.bottomLeft); - location.render(c, " $legend", Position.fromOffset(bounds.bottomLeft), + location.render( + c, " $legend", Vector2(bounds.bottomLeft.dx, bounds.bottomLeft.dy), anchor: Anchor.bottomLeft); location.render( - c, "Initial Location:", Position(bounds.right + 5, bounds.top + 0), + c, "Initial Location:", Vector2(bounds.right + 5, bounds.top + 0), anchor: Anchor.topLeft); /*_bCenterVillage @@ -171,7 +171,8 @@ class MapPreviewWindows { c.drawRect(safeCityArea, p2); } - location.render(c, rectName, Position.fromOffset(safeCityArea.topLeft), + location.render( + c, rectName, Vector2(safeCityArea.topLeft.dx, safeCityArea.topLeft.dy), anchor: Anchor.bottomLeft); var r1 = Rectangle(safeCityArea.left, safeCityArea.top, safeCityArea.width, diff --git a/lib/scene/game_scene.dart b/lib/scene/game_scene.dart index 39b1cef..d7ad329 100644 --- a/lib/scene/game_scene.dart +++ b/lib/scene/game_scene.dart @@ -1,7 +1,5 @@ -import 'package:flame/anchor.dart'; -import 'package:flame/flame.dart'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; +import 'package:flame_audio/flame_audio.dart'; import 'package:flutter/material.dart'; import '../entity/enemys/enemy.dart'; @@ -16,8 +14,9 @@ import 'scene_object.dart'; class GameScene extends SceneObject { static const int worldSize = 16; - TextConfig config = - TextConfig(fontSize: 12.0, color: Colors.white, fontFamily: "Blocktopia"); + TextPaint config = TextPaint( + style: TextStyle( + fontSize: 12.0, color: Colors.white, fontFamily: "Blocktopia")); Player player; MapController mapController; @@ -47,15 +46,16 @@ class GameScene extends SceneObject { serverController.setPlayer(player); mapController.addPlayerRef(player); - Flame.audio.disableLog(); - Flame.bgm.dispose(); - Flame.bgm.initialize(); + // FlameAudio.audioCache.disableLog(); + FlameAudio.bgm.dispose(); + FlameAudio.bgm.initialize(); if (ServerUtils.database == 'production') { - if (!Flame.bgm.isPlaying) { - Flame.bgm.play('recovery.mp3', volume: .2); + if (!FlameAudio.bgm.isPlaying) { + FlameAudio.bgm.play('recovery.mp3', volume: .2); } } - Flame.audio.loadAll(['footstep_grass1.mp3', 'footstep_grass2.mp3']); + FlameAudio.audioCache + .loadAll(['footstep_grass1.mp3', 'footstep_grass2.mp3']); } @override @@ -69,7 +69,7 @@ class GameScene extends SceneObject { movimentType: MovimentType.follow, tileSize: worldSize); config.render( - c, "FPS: ${getFps()}", Position(GameController.screenSize.width, 0), + c, "FPS: ${getFps()}", Vector2(GameController.screenSize.width, 0), anchor: Anchor.topRight); hud.draw(c); @@ -82,10 +82,10 @@ class GameScene extends SceneObject { } @override - void update() { + void update(double dt) { for (var entity in mapController.entitysOnViewport) { if (entity is Player || entity is Enemy) { - entity.update(); + entity.update(dt); } } diff --git a/lib/scene/login/auth_methods/firebase_auth.dart b/lib/scene/login/auth_methods/firebase_auth.dart index af693a8..d5974e9 100644 --- a/lib/scene/login/auth_methods/firebase_auth.dart +++ b/lib/scene/login/auth_methods/firebase_auth.dart @@ -1,7 +1,10 @@ +// ignore_for_file: lines_longer_than_80_chars + +import 'dart:ui'; + import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_database/firebase_database.dart'; -import 'package:flutter/cupertino.dart'; import 'package:google_sign_in/google_sign_in.dart'; import '../../../game_controller.dart'; @@ -59,13 +62,14 @@ class FirebaseAuth implements AuthService { } void _getVersionNumber() async { - var data = FirebaseDatabase.instance.reference().child('version'); + var data = FirebaseDatabase.instance.ref().child('version'); - data.once().then((snapshot) { - if (snapshot.value == appVersion) { + data.once().then((event) { + if (event.snapshot.value == appVersion) { _createOrReplaceAndLogUser(); } else { - Toast.add("You are out of date. The new version is: ${snapshot.value}"); + Toast.add( + "You are out of date. The new version is: ${event.snapshot.value}"); logout(); } }); @@ -101,20 +105,21 @@ class FirebaseAuth implements AuthService { void retriveCharacterData(String characterName) async { var data = FirebaseDatabase.instance - .reference() + .ref() .child('${ServerUtils.database}/state/players/$characterName'); - data.once().then((snapshot) { - if (snapshot.value != null) { - print('Retrieved character information: ${snapshot.value}'); - - var pName = snapshot.value['name']; - var pX = double.parse(snapshot.value['x'].toString()); - var pY = double.parse(snapshot.value['y'].toString()); - var pSprite = snapshot.value['sprite']; - var pHp = int.parse(snapshot.value['hp'].toString()); - var pXp = int.parse(snapshot.value['xp'].toString()); - var pLv = int.parse(snapshot.value['lv'].toString()); + data.once().then((event) { + if (event.snapshot.value != null) { + print('Retrieved character information: ${event.snapshot.value}'); + var value = event.snapshot.value; + Map data = value as Map; + var pName = data['name']; + var pX = double.parse(data['x'].toString()); + var pY = double.parse(data['y'].toString()); + var pSprite = data['sprite']; + var pHp = int.parse(data['hp'].toString()); + var pXp = int.parse(data['xp'].toString()); + var pLv = int.parse(data['lv'].toString()); print('creating player $pName on position: $pX, $pY'); @@ -129,18 +134,20 @@ class FirebaseAuth implements AuthService { Future isNameAvailable(String characterName) async { var data = FirebaseDatabase.instance - .reference() + .ref() .child('${ServerUtils.database}/state/players/$characterName'); var isAvaiable = false; - await data.once().then((snapshot) { - if (snapshot.value == null) { + await data.once().then((event) { + if (event.snapshot.value == null) { isAvaiable = true; } else { - Toast.add('Character name already taken: ${snapshot.value["name"]}'); + Toast.add( + 'Character name already taken: ${(event.snapshot.value as Map)["name"]}'); } }); + isAvaiable = true; return isAvaiable; } @@ -158,7 +165,8 @@ class FirebaseAuth implements AuthService { //checks if user account has a character already var charName = await usersCollection.doc(mAccount.id).get().then((value) { - var data = value.data(); + var rawData = value.data(); + Map data = rawData as Map; if (data.containsKey('characterName')) { var charName = value.get('characterName'); return charName; diff --git a/lib/scene/login/login.dart b/lib/scene/login/login.dart index 0b86f9b..2506a09 100644 --- a/lib/scene/login/login.dart +++ b/lib/scene/login/login.dart @@ -1,37 +1,39 @@ -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; -import 'package:package_info/package_info.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import '../../game_controller.dart'; import '../../ui/button_ui.dart'; +import '../../utils/preload_assets.dart'; import '../scene_object.dart'; import 'auth.dart'; import 'auth_methods/firebase_auth.dart'; class Login extends SceneObject { - final TextConfig _version = TextConfig( - fontSize: 11, - color: Color.fromRGBO(216, 165, 120, 1), - fontFamily: "Blocktopia"); - final TextConfig _title = TextConfig( - fontSize: 22, - color: Color.fromRGBO(216, 165, 120, 1), - fontFamily: "Blocktopia"); - final TextConfig _text = TextConfig( - fontSize: 16, - color: Color.fromRGBO(216, 165, 120, 1), - fontFamily: "Blocktopia"); + final TextPaint _version = TextPaint( + style: TextStyle( + fontSize: 11, + color: Color.fromRGBO(216, 165, 120, 1), + fontFamily: "Blocktopia")); + final TextPaint _title = TextPaint( + style: TextStyle( + fontSize: 22, + color: Color.fromRGBO(216, 165, 120, 1), + fontFamily: "Blocktopia")); + final TextPaint _text = TextPaint( + style: TextStyle( + fontSize: 16, + color: Color.fromRGBO(216, 165, 120, 1), + fontFamily: "Blocktopia")); String _versionName = "-"; - final Sprite _backPaper = Sprite("ui/backpaper1.png"); + Sprite _backPaper; ButtonUI _loginButton; AuthService _auth; Login() { + _backPaper = PreloadAssets.getBackPaper1(); _loginButton = ButtonUI( super.hud, Rect.fromLTWH( @@ -42,7 +44,7 @@ class Login extends SceneObject { ), "Sign in with Google", padding: Rect.fromLTWH(15, 0, 0, 0), - icon: Sprite('ui/google_sign_in.png')); + icon: PreloadAssets.getGoogleIcon()); _loginButton.onPressedListener = () { _auth?.login(); @@ -55,13 +57,14 @@ class Login extends SceneObject { } void draw(Canvas c) { + if (_loginButton == null) return; super.draw(c); _backPaper.renderRect(c, GameController.screenSize); - _version.render(c, "Version: $_versionName", Position(50, 50)); + _version.render(c, "Version: $_versionName", Vector2(50, 50)); - _title.render(c, "> A letter from the Dev", Position(50, 80)); + _title.render(c, "> A letter from the Dev", Vector2(50, 80)); _text.render( c, """Hello Adventures!\n @@ -78,7 +81,7 @@ on your screen yet. hehe. I thanks you all for the support. By Dannark""", - Position(GameController.screenSize.width / 2, 120), + Vector2(GameController.screenSize.width / 2, 120), anchor: Anchor.topCenter, ); @@ -91,9 +94,14 @@ By Dannark""", } } - Future loadVersion() async { - var packageInfo = await PackageInfo.fromPlatform(); - var version = packageInfo.version; - return version; + Future loadVersion() async { + try { + var packageInfo = await PackageInfo.fromPlatform(); + var version = packageInfo.version; + return version; + // ignore: avoid_catches_without_on_clauses + } catch (e) { + return '1.0.0'; + } } } diff --git a/lib/scene/scene_object.dart b/lib/scene/scene_object.dart index bcc333d..4e92255 100644 --- a/lib/scene/scene_object.dart +++ b/lib/scene/scene_object.dart @@ -1,13 +1,14 @@ +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import '../ui/hud.dart'; -abstract class SceneObject { +abstract class SceneObject extends SpriteComponent { HUD hud = HUD(); SceneObject(); void draw(Canvas c) {} - void update() {} + void update(double dt) {} } diff --git a/lib/server/domain/usecases/entities/foundation_data_controller.dart b/lib/server/domain/usecases/entities/foundation_data_controller.dart index 3b834c6..88f661b 100644 --- a/lib/server/domain/usecases/entities/foundation_data_controller.dart +++ b/lib/server/domain/usecases/entities/foundation_data_controller.dart @@ -11,11 +11,14 @@ class FoundationDataController { } void onFoundationEnterScreen(dynamic data) { - var t = TimerHelper(); - print('onFoundationEnterScreen'); - data.forEach((key, value) { - _buildFoundation.updateOrInstantiateFoundation(value); - }); - t.logDelayPassed('onFoundationEnterScreen:'); + try { + var t = TimerHelper(); + print('onFoundationEnterScreen'); + data.forEach((key, value) { + _buildFoundation.updateOrInstantiateFoundation(value); + }); + t.logDelayPassed('onFoundationEnterScreen:'); + // ignore: avoid_catches_without_on_clauses + } catch (_) {} } } diff --git a/lib/server/domain/usecases/entities/player_data_controller.dart b/lib/server/domain/usecases/entities/player_data_controller.dart index f23fb0a..944c6c4 100644 --- a/lib/server/domain/usecases/entities/player_data_controller.dart +++ b/lib/server/domain/usecases/entities/player_data_controller.dart @@ -65,9 +65,9 @@ class PlayerDataController { void onPlayerUpdate(dynamic data) { var t = TimerHelper(); //print("onPlayerUpdate: $data"); - var hp = int.parse(data['hp'].toString(), onError: (source) => null); - var xp = int.parse(data['xp'].toString(), onError: (source) => null); - var lv = int.parse(data['lv'].toString(), onError: (source) => null); + var hp = int.tryParse(data['hp'].toString()); + var xp = int.tryParse(data['xp'].toString()); + var lv = int.tryParse(data['lv'].toString()); // var x = double.parse(data['x'].toString()); // var y = double.parse(data['y'].toString()); // var xSpeed = double.parse(data['xSpeed'].toString()); diff --git a/lib/server/domain/usecases/entities/tree_data_controller.dart b/lib/server/domain/usecases/entities/tree_data_controller.dart index 155eb80..2438867 100644 --- a/lib/server/domain/usecases/entities/tree_data_controller.dart +++ b/lib/server/domain/usecases/entities/tree_data_controller.dart @@ -18,11 +18,9 @@ class TreeDataController { var x = double.parse(value['x'].toString()); var y = double.parse(value['y'].toString()); var playerId = value['playerId'].toString(); - var deadTime = - int.parse(value['dead_time'].toString(), onError: (source) => null); - var hp = int.parse(value['hp'].toString(), onError: (source) => null); - var damage = - int.parse(value['damage'].toString(), onError: (source) => null); + var deadTime = int.tryParse(value['dead_time'].toString()); + var hp = int.tryParse(value['hp'].toString()); + var damage = int.tryParse(value['damage'].toString()); //Make the hit attack player animation var foundEntity = map.entityList @@ -54,11 +52,11 @@ class TreeDataController { } bool isInsideFoundation(double posX, double posY) { - map.buildFoundation.foundationList.forEach((foundation) { + for (var foundation in map.buildFoundation.foundationList) { if (foundation.isInsideFoundation(posX, posY)) { - return true; + continue; } - }); + } return false; } } diff --git a/lib/server/external/datasources/socket_io_datasource.dart b/lib/server/external/datasources/socket_io_datasource.dart index 711d574..992c9bc 100644 --- a/lib/server/external/datasources/socket_io_datasource.dart +++ b/lib/server/external/datasources/socket_io_datasource.dart @@ -1,11 +1,13 @@ -import 'package:socket_io_client/socket_io_client.dart'; +import 'dart:developer'; + +import 'package:socket_io_client/socket_io_client.dart' as io; import '../../../entity/player/player.dart'; import '../../domain/repositories/server_repository.dart'; import '../../utils/server_utils.dart'; class SocketIoRepository implements ServerRepository { - Socket socket; + io.Socket socket; Player _player; Function(String) callback; @@ -15,14 +17,19 @@ class SocketIoRepository implements ServerRepository { _player = player; - socket = io(ServerUtils.server, { - 'transports': ['websocket'], - 'autoConnect': false - }); + socket = io.io( + ServerUtils.server, + io.OptionBuilder() + .setTransports(['websocket']) + .disableAutoConnect() + .build()); socket.connect(); - socket.on('onSetup', onSetup); - socket.on('disconnect', (_) => print('disconnected')); + socket.onConnect((data) { + log("Connected"); + socket.on('onSetup', onSetup); + socket.on('disconnect', (_) => print('disconnected')); + }); } void setListener(String event, dynamic Function(dynamic) callback) { diff --git a/lib/server/utils/server_utils.dart b/lib/server/utils/server_utils.dart index b097b52..8c077e1 100644 --- a/lib/server/utils/server_utils.dart +++ b/lib/server/utils/server_utils.dart @@ -1,16 +1,18 @@ +// ignore_for_file: avoid_classes_with_only_static_members + import 'package:flutter/material.dart'; +import '../../entity/Entity.dart'; import '../../entity/enemys/enemy.dart'; -import '../../entity/entity.dart'; import '../../entity/player/player.dart'; import '../../map/map_controller.dart'; class ServerUtils { //static const String server = "https://3000-e92204fd-e411-4285-8fd3-cf3515d1c358.ws-us02.gitpod.io"; - //static const String server = "http://192.168.1.111:3000"; - static const String server = "https://borderless-world.herokuapp.com"; - static const String database = 'production'; // production | development - static const bool isOffline = false; + static const String server = "http://192.168.1.7:3000"; + // static const String server = "https://borderless-world.herokuapp.com"; + static const String database = 'development'; // production | development + static const bool isOffline = true; static void addEntityIfNotExist(MapController map, Entity newEntity, {bool updateIfExist = true}) { diff --git a/lib/ui/button_ui.dart b/lib/ui/button_ui.dart index a77b650..5f64907 100644 --- a/lib/ui/button_ui.dart +++ b/lib/ui/button_ui.dart @@ -1,10 +1,9 @@ -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/sprite.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../utils/preload_assets.dart'; +import '../utils/sprite_controller.dart'; import '../utils/tap_state.dart'; import 'hud.dart'; import 'ui_element.dart'; @@ -12,7 +11,7 @@ import 'ui_element.dart'; class ButtonUI extends UIElement { final Paint _p = Paint(); - TextConfig _normalText; + TextPaint _normalText; String text; Color _normalColor; @@ -20,7 +19,7 @@ class ButtonUI extends UIElement { Rect padding = Rect.zero; - Sprite icon = Sprite("ui/backpaper1.png"); + Sprite icon; Function() onPressedListener; @@ -44,11 +43,12 @@ class ButtonUI extends UIElement { _pressedColor = pressedColor != null ? pressedColor : Color.fromRGBO(50, 143, 249, 1); - _normalText = TextConfig( + _normalText = TextPaint( + style: TextStyle( fontSize: fontSize, color: fontColor != null ? fontColor : Color.fromRGBO(224, 223, 168, 1), fontFamily: "Blocktopia", - ); + )); } void draw(Canvas c) { @@ -71,13 +71,13 @@ class ButtonUI extends UIElement { var iconScale = 0.5; var iconHeight = 42 * iconScale; - icon?.renderScaled( - c, Position(bounds.left + 10, bounds.center.dy - iconHeight / 2), - scale: iconScale); + PreloadAssets.getBackPaper1()?.render(c, + position: Vector2(bounds.left + 10, bounds.center.dy - iconHeight / 2), + size: Vector2.all(SpriteController.spriteSize * iconScale)); _normalText.render( c, text, - Position(bounds.center.dx + padding.left, bounds.center.dy + padding.top), + Vector2(bounds.center.dx + padding.left, bounds.center.dy + padding.top), anchor: Anchor.center, ); } diff --git a/lib/ui/input_text_ui.dart b/lib/ui/input_text_ui.dart index b8ee149..6f9d2cc 100644 --- a/lib/ui/input_text_ui.dart +++ b/lib/ui/input_text_ui.dart @@ -1,8 +1,4 @@ -import 'dart:ui'; - -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -13,7 +9,7 @@ import 'keyboard/keyboard_ui.dart'; import 'ui_element.dart'; class InputTextUI extends UIElement implements KeyUIListener { - Position pos; + Vector2 pos; String _inputText = ""; String placeHolder = "Text Example"; int maxLength = 16; @@ -28,8 +24,8 @@ class InputTextUI extends UIElement implements KeyUIListener { Function(String) onConfirmListener; Function(String) onPressedListener; - TextConfig normalText; - TextConfig placeHolderText; + TextPaint normalText; + TextPaint placeHolderText; double rotation = 0; @@ -43,17 +39,19 @@ class InputTextUI extends UIElement implements KeyUIListener { : super(hudRef) { p.color = backGroundColor != null ? backGroundColor : Colors.blueGrey[50]; - normalText = TextConfig( + normalText = TextPaint( + style: TextStyle( fontSize: fontSize, color: normalColor != null ? normalColor : Colors.grey[800], fontFamily: "Blocktopia", - ); + )); - placeHolderText = TextConfig( + placeHolderText = TextPaint( + style: TextStyle( fontSize: fontSize, color: placeholderColor != null ? placeholderColor : Colors.grey[600], fontFamily: "Blocktopia", - ); + )); } void draw(Canvas c) { @@ -68,18 +66,18 @@ class InputTextUI extends UIElement implements KeyUIListener { c.clipRect(bounds); - if (_inputText.length == 0) { + if (_inputText.isEmpty) { placeHolderText.render( c, placeHolder, - Position(bounds.left + padding, bounds.center.dy), + Vector2(bounds.left + padding, bounds.center.dy), anchor: Anchor.centerLeft, ); } else { normalText.render( c, _inputText, - Position(bounds.left + padding - textOffsetX, bounds.center.dy), + Vector2(bounds.left + padding - textOffsetX, bounds.center.dy), anchor: Anchor.centerLeft, ); } @@ -131,7 +129,7 @@ class InputTextUI extends UIElement implements KeyUIListener { @override void onBackspacePressed() { - if (_inputText.length > 0) { + if (_inputText.isNotEmpty) { _inputText = _inputText.substring(0, _inputText.length - 1); } } diff --git a/lib/ui/keyboard/key_button.dart b/lib/ui/keyboard/key_button.dart index edbc08e..26eebee 100644 --- a/lib/ui/keyboard/key_button.dart +++ b/lib/ui/keyboard/key_button.dart @@ -1,8 +1,6 @@ import 'dart:ui'; -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; +import 'package:flame/components.dart'; import 'package:flutter/cupertino.dart'; import '../../game_controller.dart'; @@ -13,11 +11,11 @@ import 'keyboard_ui.dart'; class KeyButton { Rect bounds; - Position pos; + Vector2 pos; double width; double height; - final Position _gridPos; + final Vector2 _gridPos; double padding = 1; @@ -25,7 +23,7 @@ class KeyButton { String keyText; - TextConfig valueText; + TextPaint valueText; double widthMultiplier = 1; Offset animatePos = Offset(0, 0); @@ -47,21 +45,22 @@ class KeyButton { width = viewWidth * (0.1 * widthMultiplier); height = KeyboardUI.keyHeight; - pos = Position( + pos = Vector2( (_gridPos.x * defaultWidth + KeyboardUI.bounds.left + KeyboardUI.paddingX / 2), _gridPos.y * height + KeyboardUI.bounds.top + KeyboardUI.paddingY / 2, ); - valueText = - TextConfig(fontSize: 16.0, color: txtColor, fontFamily: "Blocktopia"); + valueText = TextPaint( + style: TextStyle( + fontSize: 16.0, color: txtColor, fontFamily: "Blocktopia")); initializeAnimation(AnimationType.roll3dCenter); } void draw(Canvas c) { - pos = Position( + pos = Vector2( pos.x, _gridPos.y * height + KeyboardUI.bounds.top + KeyboardUI.paddingY / 2, ); @@ -76,8 +75,8 @@ class KeyButton { c.drawRRect(RRect.fromRectAndRadius(bounds, Radius.circular(5)), p); - var textPosition = Position(pos.x + width / 2, pos.y + height / 2); - textPosition += Position(animatePos.dx, animatePos.dy); + var textPosition = Vector2(pos.x + width / 2, pos.y + height / 2); + textPosition += Vector2(animatePos.dx, animatePos.dy); valueText.render(c, keyText, textPosition, anchor: Anchor.center); diff --git a/lib/ui/keyboard/keyboard_ui.dart b/lib/ui/keyboard/keyboard_ui.dart index 744131e..939dafa 100644 --- a/lib/ui/keyboard/keyboard_ui.dart +++ b/lib/ui/keyboard/keyboard_ui.dart @@ -1,5 +1,4 @@ -import 'package:flame/position.dart'; -import 'package:flutter/cupertino.dart'; +import 'package:flame/game.dart'; import 'package:flutter/material.dart'; import '../../game_controller.dart'; @@ -101,7 +100,7 @@ class KeyboardUI { var obj = lineKeys[i]; xItem += obj.margin; - _buttons.add(KeyButton(Position(xItem, lineIndex.toDouble()), obj)); + _buttons.add(KeyButton(Vector2(xItem, lineIndex.toDouble()), obj)); if (obj is KeyModel) { xItem += obj.widthOnGrid; diff --git a/lib/ui/ui_element.dart b/lib/ui/ui_element.dart index 47975c8..be360ac 100644 --- a/lib/ui/ui_element.dart +++ b/lib/ui/ui_element.dart @@ -1,8 +1,9 @@ +import 'package:flame/components.dart'; import 'package:flutter/material.dart'; import 'hud.dart'; -abstract class UIElement { +abstract class UIElement extends SpriteComponent { Rect bounds = Rect.zero; HUD hudRef; bool drawOnHUD = false; diff --git a/lib/utils/preload_assets.dart b/lib/utils/preload_assets.dart index 0ca25b3..ee2afaa 100644 --- a/lib/utils/preload_assets.dart +++ b/lib/utils/preload_assets.dart @@ -1,183 +1,261 @@ +import 'package:flame/components.dart'; import 'package:flame/sprite.dart'; -import 'package:flame/sprite_batch.dart'; class PreloadAssets { - static final Map _enviromentSpriteList = { - "floor1": Sprite("enviroment/floor1.png"), - "floor2": Sprite("enviroment/floor2.png"), - "floor3": Sprite("enviroment/floor3.png"), - "floor4": Sprite("enviroment/floor4.png"), - "floor5": Sprite("enviroment/floor5.png"), - "grass1": Sprite("enviroment/grass1.png"), - "grass2": Sprite("enviroment/grass2.png"), - "grass3": Sprite("enviroment/grass3.png"), - "grass4": Sprite("enviroment/grass4.png"), - "grass5": Sprite("enviroment/grass5.png"), - "grass6": Sprite("enviroment/grass6.png"), - "grass7": Sprite("enviroment/grass7.png"), - "grass8": Sprite("enviroment/grass8.png"), - "grass9": Sprite("enviroment/grass9.png"), - "grass10": Sprite("enviroment/grass10.png"), - "grass11": Sprite("enviroment/grass11.png"), - "grass12": Sprite("enviroment/grass12.png"), - "grass13": Sprite("enviroment/grass13.png"), - "grass14": Sprite("enviroment/grass14.png"), - }; + static Sprite _googleIcon; + + static Sprite _stomach; + static Sprite _stomachBack; + static SpriteAnimation _grassAnim; + + static Sprite _backPaper; + static Sprite _backPaper1; static final Map _trees = {}; - static final Map _wallSpriteList = { - "wall1": Sprite("walls/wall1.png"), - "wall2": Sprite("walls/wall2.png"), - "wall3": Sprite("walls/wall3.png"), - "wall4": Sprite("walls/wall4.png"), - "wall5": Sprite("walls/wall5.png"), - "wall6": Sprite("walls/wall6.png"), - "wall7": Sprite("walls/wall7.png"), - "wall8": Sprite("walls/wall8.png"), - "wall9": Sprite("walls/wall9.png"), - "wall10": Sprite("walls/wall10.png"), - "wall11": Sprite("walls/wall11.png"), - "wall12": Sprite("walls/wall12.png"), - "wall13": Sprite("walls/wall13.png"), - "wall13_2": Sprite("walls/wall13_2.png"), - "wall13_3": Sprite("walls/wall13_3.png"), - "wall13_4": Sprite("walls/wall13_4.png"), - "wall13_5": Sprite("walls/wall13_5.png"), - "wall13_left": Sprite("walls/wall13_left.png"), - "wall13_right": Sprite("walls/wall13_right.png"), - "wall14": Sprite("walls/wall14.png"), - "wall14_2": Sprite("walls/wall14_2.png"), - "wall14_3": Sprite("walls/wall14_3.png"), - "wall14_left": Sprite("walls/wall14_left.png"), - "wall14_right": Sprite("walls/wall14_right.png"), - "low_wall1": Sprite("walls/low_wall1.png"), - "low_wall2": Sprite("walls/low_wall2.png"), - "low_wall3": Sprite("walls/low_wall3.png"), - "low_wall4": Sprite("walls/low_wall4.png"), - "low_wall5": Sprite("walls/low_wall5.png"), - "low_wall6": Sprite("walls/low_wall6.png"), - "low_wall7": Sprite("walls/low_wall7.png"), - "low_wall8": Sprite("walls/low_wall8.png"), - "low_wall9": Sprite("walls/low_wall9.png"), - "low_wall10": Sprite("walls/low_wall10.png"), - "low_wall11": Sprite("walls/low_wall11.png"), - "low_wall12": Sprite("walls/low_wall12.png"), - "low_wall13": Sprite("walls/low_wall13.png"), - "low_wall13_2": Sprite("walls/low_wall13_2.png"), - "low_wall13_3": Sprite("walls/low_wall13_3.png"), - "low_wall13_4": Sprite("walls/low_wall13_4.png"), - "low_wall13_5": Sprite("walls/low_wall13_5.png"), - "low_wall13_left": Sprite("walls/low_wall13_left.png"), - "low_wall13_right": Sprite("walls/low_wall13_right.png"), - "low_wall14": Sprite("walls/low_wall14.png"), - "low_wall14_2": Sprite("walls/low_wall14_2.png"), - "low_wall14_3": Sprite("walls/low_wall14_3.png"), - "low_wall14_left": Sprite("walls/low_wall14_left.png"), - "low_wall14_right": Sprite("walls/low_wall14_right.png"), - }; - - static final Map _roofsSpriteList = { - "roof1": Sprite("roofs/roof1.png"), - "roof2": Sprite("roofs/roof2.png"), - "roof3": Sprite("roofs/roof3.png"), - }; - - static final Map _floorSpriteList = { - "floor1": Sprite("floors/floor1.png"), - "floor2": Sprite("floors/floor2.png"), - "floor3": Sprite("floors/floor3.png"), - "floor4": Sprite("floors/floor4.png"), - "floor5": Sprite("floors/floor5.png"), - "floor6": Sprite("floors/floor6.png"), - "floor7": Sprite("floors/floor7.png"), - "floor8": Sprite("floors/floor8.png"), - "floor9": Sprite("floors/floor9.png"), - "floor10": Sprite("floors/floor10.png"), - "floor11": Sprite("floors/floor11.png"), - "floor12": Sprite("floors/floor12.png"), - "floor13": Sprite("floors/floor13.png"), - "floor14": Sprite("floors/floor14.png"), - "floor15": Sprite("floors/floor15.png"), - }; - - static final Map _effects = { - "shadown_large": Sprite("shadown_large.png"), - "shadown_square": Sprite("shadown_square.png"), - "ripple": Sprite("effects/ripple.png"), - "rip": Sprite("effects/rip.png"), - }; - - static final Map _furnitureList = { - "bed1": Sprite("furnitures/bed1.png"), - "refrigerator": Sprite("furnitures/refrigerator.png"), - "door1": Sprite("furnitures/door1.png"), - "door1_open": Sprite("furnitures/door1_open.png"), - "door2": Sprite("furnitures/door2.png"), - "door2_open": Sprite("furnitures/door2_open.png"), - "door3": Sprite("furnitures/door3.png"), - "door3_open": Sprite("furnitures/door3_open.png"), - }; - - static final Map _uiSpriteList = { - "foundation": Sprite("ui/foundation.png"), - "wall": Sprite("ui/wall.png"), - "floor_icon": Sprite("ui/floor_icon.png"), - "furniture": Sprite("ui/furniture.png"), - "config": Sprite("ui/config.png"), - "handsaw": Sprite("ui/handsaw.png"), - "accept": Sprite("ui/accept.png"), - "cancel": Sprite("ui/cancel.png"), - "floor1": Sprite("ui/floor1.png"), - "floor2": Sprite("ui/floor2.png"), - "floor3": Sprite("ui/floor3.png"), - "floor4": Sprite("ui/floor4.png"), - "floor5": Sprite("ui/floor5.png"), - "floor6": Sprite("ui/floor6.png"), - "floor7": Sprite("ui/floor7.png"), - "floor8": Sprite("ui/floor8.png"), - "floor9": Sprite("ui/floor9.png"), - "floor10": Sprite("ui/floor10.png"), - "floor11": Sprite("ui/floor11.png"), - "floor12": Sprite("ui/floor12.png"), - "floor13": Sprite("ui/floor13.png"), - "floor14": Sprite("ui/floor14.png"), - "floor15": Sprite("ui/floor15.png"), - "wall1": Sprite("ui/wall1.png"), - "wall2": Sprite("ui/wall2.png"), - "wall3": Sprite("ui/wall3.png"), - "wall4": Sprite("ui/wall4.png"), - "wall5": Sprite("ui/wall5.png"), - "wall6": Sprite("ui/wall6.png"), - "wall7": Sprite("ui/wall7.png"), - "wall8": Sprite("ui/wall8.png"), - "wall9": Sprite("ui/wall9.png"), - "wall10": Sprite("ui/wall10.png"), - "wall11": Sprite("ui/wall11.png"), - "wall12": Sprite("ui/wall12.png"), - "wall13": Sprite("ui/wall13.png"), - "wall14": Sprite("ui/wall14.png"), - "bed1": Sprite("ui/bed1.png"), - "refrigerator": Sprite("ui/refrigerator.png"), - "door1": Sprite("ui/door1.png"), - "door2": Sprite("ui/door2.png"), - "door3": Sprite("ui/door3.png"), - }; - - PreloadAssets() { - loadSprites(); - } + static final Map _enviromentSpriteList = {}; + + static final Map _wallSpriteList = {}; + + static final Map _roofsSpriteList = {}; + + static final Map _floorSpriteList = {}; + + static final Map _effects = {}; + + static final Map _furnitureList = {}; + + static final Map _uiSpriteList = {}; + + Future loadSprites() async { + _googleIcon = await Sprite.load("ui/google_sign_in.png"); + _backPaper = await Sprite.load("ui/backpaper.png"); + _backPaper1 = await Sprite.load("ui/backpaper1.png"); + _grassAnim = await SpriteAnimation.load( + 'effects/walk_grass.png', + SpriteAnimationData.sequenced( + amount: 6, + stepTime: 0.1, + loop: false, + textureSize: Vector2.all(16), + ), + ); + _stomach = await Sprite.load("ui/stomach.png"); + _stomachBack = await Sprite.load("ui/stomach_back.png"); + + print("Loading sprites Chars Assets"); - void loadSprites() async { print("Loading sprites Trees Assets"); - SpriteBatch.withAsset('trees/tree01.png') - .then((value) => _trees['tree01'] = value); - SpriteBatch.withAsset('trees/tree02.png') - .then((value) => _trees['tree02'] = value); - SpriteBatch.withAsset('trees/tree03.png') - .then((value) => _trees['tree03'] = value); - SpriteBatch.withAsset('trees/tree04.png') - .then((value) => _trees['tree04'] = value); + + _trees['tree01'] = await SpriteBatch.load('trees/tree01.png'); + _trees['tree02'] = await SpriteBatch.load('trees/tree02.png'); + _trees['tree03'] = await SpriteBatch.load('trees/tree03.png'); + _trees['tree04'] = await SpriteBatch.load('trees/tree04.png'); + + _enviromentSpriteList["floor1"] = + await Sprite.load("enviroment/floor1.png"); + _enviromentSpriteList["floor2"] = + await Sprite.load("enviroment/floor2.png"); + _enviromentSpriteList["floor3"] = + await Sprite.load("enviroment/floor3.png"); + _enviromentSpriteList["floor4"] = + await Sprite.load("enviroment/floor4.png"); + _enviromentSpriteList["floor5"] = + await Sprite.load("enviroment/floor5.png"); + _enviromentSpriteList["grass1"] = + await Sprite.load("enviroment/grass1.png"); + _enviromentSpriteList["grass2"] = + await Sprite.load("enviroment/grass2.png"); + _enviromentSpriteList["grass3"] = + await Sprite.load("enviroment/grass3.png"); + _enviromentSpriteList["grass4"] = + await Sprite.load("enviroment/grass4.png"); + _enviromentSpriteList["grass5"] = + await Sprite.load("enviroment/grass5.png"); + _enviromentSpriteList["grass6"] = + await Sprite.load("enviroment/grass6.png"); + _enviromentSpriteList["grass7"] = + await Sprite.load("enviroment/grass7.png"); + _enviromentSpriteList["grass8"] = + await Sprite.load("enviroment/grass8.png"); + _enviromentSpriteList["grass9"] = + await Sprite.load("enviroment/grass9.png"); + _enviromentSpriteList["grass10"] = + await Sprite.load("enviroment/grass10.png"); + _enviromentSpriteList["grass11"] = + await Sprite.load("enviroment/grass11.png"); + _enviromentSpriteList["grass12"] = + await Sprite.load("enviroment/grass12.png"); + _enviromentSpriteList["grass13"] = + await Sprite.load("enviroment/grass13.png"); + _enviromentSpriteList["grass14"] = + await Sprite.load("enviroment/grass14.png"); + + _wallSpriteList["wall1"] = await Sprite.load("walls/wall1.png"); + _wallSpriteList["wall2"] = await Sprite.load("walls/wall2.png"); + _wallSpriteList["wall3"] = await Sprite.load("walls/wall3.png"); + _wallSpriteList["wall4"] = await Sprite.load("walls/wall4.png"); + _wallSpriteList["wall5"] = await Sprite.load("walls/wall5.png"); + _wallSpriteList["wall6"] = await Sprite.load("walls/wall6.png"); + _wallSpriteList["wall7"] = await Sprite.load("walls/wall7.png"); + _wallSpriteList["wall8"] = await Sprite.load("walls/wall8.png"); + _wallSpriteList["wall9"] = await Sprite.load("walls/wall9.png"); + _wallSpriteList["wall10"] = await Sprite.load("walls/wall10.png"); + _wallSpriteList["wall11"] = await Sprite.load("walls/wall11.png"); + _wallSpriteList["wall12"] = await Sprite.load("walls/wall12.png"); + _wallSpriteList["wall13"] = await Sprite.load("walls/wall13.png"); + _wallSpriteList["wall13_2"] = await Sprite.load("walls/wall13_2.png"); + _wallSpriteList["wall13_3"] = await Sprite.load("walls/wall13_3.png"); + _wallSpriteList["wall13_4"] = await Sprite.load("walls/wall13_4.png"); + _wallSpriteList["wall13_5"] = await Sprite.load("walls/wall13_5.png"); + _wallSpriteList["wall13_left"] = await Sprite.load("walls/wall13_left.png"); + _wallSpriteList["wall13_right"] = + await Sprite.load("walls/wall13_right.png"); + _wallSpriteList["wall14"] = await Sprite.load("walls/wall14.png"); + _wallSpriteList["wall14_2"] = await Sprite.load("walls/wall14_2.png"); + _wallSpriteList["wall14_3"] = await Sprite.load("walls/wall14_3.png"); + _wallSpriteList["wall14_left"] = await Sprite.load("walls/wall14_left.png"); + _wallSpriteList["wall14_right"] = + await Sprite.load("walls/wall14_right.png"); + _wallSpriteList["low_wall1"] = await Sprite.load("walls/low_wall1.png"); + _wallSpriteList["low_wall2"] = await Sprite.load("walls/low_wall2.png"); + _wallSpriteList["low_wall3"] = await Sprite.load("walls/low_wall3.png"); + _wallSpriteList["low_wall4"] = await Sprite.load("walls/low_wall4.png"); + _wallSpriteList["low_wall5"] = await Sprite.load("walls/low_wall5.png"); + _wallSpriteList["low_wall6"] = await Sprite.load("walls/low_wall6.png"); + _wallSpriteList["low_wall7"] = await Sprite.load("walls/low_wall7.png"); + _wallSpriteList["low_wall8"] = await Sprite.load("walls/low_wall8.png"); + _wallSpriteList["low_wall9"] = await Sprite.load("walls/low_wall9.png"); + _wallSpriteList["low_wall10"] = await Sprite.load("walls/low_wall10.png"); + _wallSpriteList["low_wall11"] = await Sprite.load("walls/low_wall11.png"); + _wallSpriteList["low_wall12"] = await Sprite.load("walls/low_wall12.png"); + _wallSpriteList["low_wall13"] = await Sprite.load("walls/low_wall13.png"); + _wallSpriteList["low_wall13_2"] = + await Sprite.load("walls/low_wall13_2.png"); + _wallSpriteList["low_wall13_3"] = + await Sprite.load("walls/low_wall13_3.png"); + _wallSpriteList["low_wall13_4"] = + await Sprite.load("walls/low_wall13_4.png"); + _wallSpriteList["low_wall13_5"] = + await Sprite.load("walls/low_wall13_5.png"); + _wallSpriteList["low_wall13_left"] = + await Sprite.load("walls/low_wall13_left.png"); + _wallSpriteList["low_wall13_right"] = + await Sprite.load("walls/low_wall13_right.png"); + _wallSpriteList["low_wall14"] = await Sprite.load("walls/low_wall14.png"); + _wallSpriteList["low_wall14_2"] = + await Sprite.load("walls/low_wall14_2.png"); + _wallSpriteList["low_wall14_3"] = + await Sprite.load("walls/low_wall14_3.png"); + _wallSpriteList["low_wall14_left"] = + await Sprite.load("walls/low_wall14_left.png"); + _wallSpriteList["low_wall14_right"] = + await Sprite.load("walls/low_wall14_right.png"); + + _roofsSpriteList["roof1"] = await Sprite.load("roofs/roof1.png"); + _roofsSpriteList["roof2"] = await Sprite.load("roofs/roof2.png"); + _roofsSpriteList["roof3"] = await Sprite.load("roofs/roof3.png"); + + _floorSpriteList["floor1"] = await Sprite.load("floors/floor1.png"); + _floorSpriteList["floor2"] = await Sprite.load("floors/floor2.png"); + _floorSpriteList["floor3"] = await Sprite.load("floors/floor3.png"); + _floorSpriteList["floor4"] = await Sprite.load("floors/floor4.png"); + _floorSpriteList["floor5"] = await Sprite.load("floors/floor5.png"); + _floorSpriteList["floor6"] = await Sprite.load("floors/floor6.png"); + _floorSpriteList["floor7"] = await Sprite.load("floors/floor7.png"); + _floorSpriteList["floor8"] = await Sprite.load("floors/floor8.png"); + _floorSpriteList["floor9"] = await Sprite.load("floors/floor9.png"); + _floorSpriteList["floor10"] = await Sprite.load("floors/floor10.png"); + _floorSpriteList["floor11"] = await Sprite.load("floors/floor11.png"); + _floorSpriteList["floor12"] = await Sprite.load("floors/floor12.png"); + _floorSpriteList["floor13"] = await Sprite.load("floors/floor13.png"); + _floorSpriteList["floor14"] = await Sprite.load("floors/floor14.png"); + _floorSpriteList["floor15"] = await Sprite.load("floors/floor15.png"); + + _effects["shadown_large"] = await Sprite.load("shadown_large.png"); + _effects["shadown_square"] = await Sprite.load("shadown_square.png"); + _effects["ripple"] = await Sprite.load("effects/ripple.png"); + _effects["rip"] = await Sprite.load("effects/rip.png"); + + _furnitureList["bed1"] = await Sprite.load("furnitures/bed1.png"); + _furnitureList["refrigerator"] = + await Sprite.load("furnitures/refrigerator.png"); + _furnitureList["door1"] = await Sprite.load("furnitures/door1.png"); + _furnitureList["door1_open"] = + await Sprite.load("furnitures/door1_open.png"); + _furnitureList["door2"] = await Sprite.load("furnitures/door2.png"); + _furnitureList["door2_open"] = + await Sprite.load("furnitures/door2_open.png"); + _furnitureList["door3"] = await Sprite.load("furnitures/door3.png"); + _furnitureList["door3_open"] = + await Sprite.load("furnitures/door3_open.png"); + + _uiSpriteList["foundation"] = await Sprite.load("ui/foundation.png"); + _uiSpriteList["wall"] = await Sprite.load("ui/wall.png"); + _uiSpriteList["floor_icon"] = await Sprite.load("ui/floor_icon.png"); + _uiSpriteList["furniture"] = await Sprite.load("ui/furniture.png"); + _uiSpriteList["config"] = await Sprite.load("ui/config.png"); + _uiSpriteList["handsaw"] = await Sprite.load("ui/handsaw.png"); + _uiSpriteList["accept"] = await Sprite.load("ui/accept.png"); + _uiSpriteList["cancel"] = await Sprite.load("ui/cancel.png"); + _uiSpriteList["floor1"] = await Sprite.load("ui/floor1.png"); + _uiSpriteList["floor2"] = await Sprite.load("ui/floor2.png"); + _uiSpriteList["floor3"] = await Sprite.load("ui/floor3.png"); + _uiSpriteList["floor4"] = await Sprite.load("ui/floor4.png"); + _uiSpriteList["floor5"] = await Sprite.load("ui/floor5.png"); + _uiSpriteList["floor6"] = await Sprite.load("ui/floor6.png"); + _uiSpriteList["floor7"] = await Sprite.load("ui/floor7.png"); + _uiSpriteList["floor8"] = await Sprite.load("ui/floor8.png"); + _uiSpriteList["floor9"] = await Sprite.load("ui/floor9.png"); + _uiSpriteList["floor10"] = await Sprite.load("ui/floor10.png"); + _uiSpriteList["floor11"] = await Sprite.load("ui/floor11.png"); + _uiSpriteList["floor12"] = await Sprite.load("ui/floor12.png"); + _uiSpriteList["floor13"] = await Sprite.load("ui/floor13.png"); + _uiSpriteList["floor14"] = await Sprite.load("ui/floor14.png"); + _uiSpriteList["floor15"] = await Sprite.load("ui/floor15.png"); + _uiSpriteList["wall1"] = await Sprite.load("ui/wall1.png"); + _uiSpriteList["wall2"] = await Sprite.load("ui/wall2.png"); + _uiSpriteList["wall3"] = await Sprite.load("ui/wall3.png"); + _uiSpriteList["wall4"] = await Sprite.load("ui/wall4.png"); + _uiSpriteList["wall5"] = await Sprite.load("ui/wall5.png"); + _uiSpriteList["wall6"] = await Sprite.load("ui/wall6.png"); + _uiSpriteList["wall7"] = await Sprite.load("ui/wall7.png"); + _uiSpriteList["wall8"] = await Sprite.load("ui/wall8.png"); + _uiSpriteList["wall9"] = await Sprite.load("ui/wall9.png"); + _uiSpriteList["wall10"] = await Sprite.load("ui/wall10.png"); + _uiSpriteList["wall11"] = await Sprite.load("ui/wall11.png"); + _uiSpriteList["wall12"] = await Sprite.load("ui/wall12.png"); + _uiSpriteList["wall13"] = await Sprite.load("ui/wall13.png"); + _uiSpriteList["wall14"] = await Sprite.load("ui/wall14.png"); + _uiSpriteList["bed1"] = await Sprite.load("ui/bed1.png"); + _uiSpriteList["refrigerator"] = await Sprite.load("ui/refrigerator.png"); + _uiSpriteList["door1"] = await Sprite.load("ui/door1.png"); + _uiSpriteList["door2"] = await Sprite.load("ui/door2.png"); + _uiSpriteList["door3"] = await Sprite.load("ui/door3.png"); + } + + static Sprite getGoogleIcon() { + return _googleIcon; + } + + static Sprite getBackPaper() { + return _backPaper; + } + + static Sprite getBackPaper1() { + return _backPaper1; + } + + static SpriteAnimation getGrassAnim() { + return _grassAnim; + } + + static Sprite getStomach() { + return _stomach; + } + + static Sprite getStomachBack() { + return _stomachBack; } static Sprite getEnviromentSprite(String grass) { diff --git a/lib/utils/sprite_controller.dart b/lib/utils/sprite_controller.dart index 4f9c556..9a19f06 100644 --- a/lib/utils/sprite_controller.dart +++ b/lib/utils/sprite_controller.dart @@ -1,12 +1,13 @@ import 'dart:math'; -import 'package:flame/sprite_batch.dart'; -import 'package:flutter/material.dart'; +import 'package:flame/extensions.dart'; +import 'package:flame/sprite.dart'; import '../game_controller.dart'; import 'on_animation_end.dart'; class SpriteController { + static final double spriteSize = 16; int direcion = -3; bool _spritesLoaded = false; String folder; @@ -42,14 +43,14 @@ class SpriteController { } void loadSprites(String folder) async { - _forward = await SpriteBatch.withAsset('$folder/forward.png'); - _backward = await SpriteBatch.withAsset('$folder/backward.png'); - _left = await SpriteBatch.withAsset('$folder/left.png'); - _right = await SpriteBatch.withAsset('$folder/right.png'); - _forwardLeft = await SpriteBatch.withAsset('$folder/forward_left.png'); - _forwardRight = await SpriteBatch.withAsset('$folder/forward_right.png'); - _backwardLeft = await SpriteBatch.withAsset('$folder/backward_left.png'); - _backwardRight = await SpriteBatch.withAsset('$folder/backward_right.png'); + _forward = await SpriteBatch.load('$folder/forward.png'); + _backward = await SpriteBatch.load('$folder/backward.png'); + _left = await SpriteBatch.load('$folder/left.png'); + _right = await SpriteBatch.load('$folder/right.png'); + _forwardLeft = await SpriteBatch.load('$folder/forward_left.png'); + _forwardRight = await SpriteBatch.load('$folder/forward_right.png'); + _backwardLeft = await SpriteBatch.load('$folder/backward_left.png'); + _backwardRight = await SpriteBatch.load('$folder/backward_right.png'); _spritesLoaded = true; } @@ -87,29 +88,29 @@ class SpriteController { } if (direcion >= -1 && direcion <= 0) { - updateFrame(_left, Offset(moveX, moveY), height); + updateFrame(_left, Vector2(moveX, moveY), height); } else if (direcion == -7 || direcion == -8 || direcion == 7) { - updateFrame(_right, Offset(moveX, moveY), height); + updateFrame(_right, Vector2(moveX, moveY), height); } else if (direcion >= 3 && direcion <= 4) { - updateFrame(_backward, Offset(moveX, moveY), height); + updateFrame(_backward, Vector2(moveX, moveY), height); } else if (direcion >= 5 && direcion <= 6) { - updateFrame(_backwardRight, Offset(moveX, moveY), height); + updateFrame(_backwardRight, Vector2(moveX, moveY), height); } else if (direcion >= 1 && direcion <= 2) { - updateFrame(_backwardLeft, Offset(moveX, moveY), height); + updateFrame(_backwardLeft, Vector2(moveX, moveY), height); } else if (direcion >= -4 && direcion <= -3) { - updateFrame(_forward, Offset(moveX, moveY), height); + updateFrame(_forward, Vector2(moveX, moveY), height); } else if (direcion == -2) { - updateFrame(_forwardLeft, Offset(moveX, moveY), height); + updateFrame(_forwardLeft, Vector2(moveX, moveY), height); } else if (direcion >= -6 && direcion <= -5) { - updateFrame(_forwardRight, Offset(moveX, moveY), height); + updateFrame(_forwardRight, Vector2(moveX, moveY), height); } else { - updateFrame(_right, Offset(moveX, moveY), height); + updateFrame(_right, Vector2(moveX, moveY), height); } _currentFrame.render(c); } - void updateFrame(SpriteBatch newFrame, Offset newPosition, int height) { + void updateFrame(SpriteBatch newFrame, Vector2 newPosition, int height) { var maxImageWidth = _gradeSize.dx * _viewPort.width; //_currentFrameId = 4; var x = (_currentFrameId % _gradeSize.dx) * _viewPort.width; @@ -129,9 +130,9 @@ class SpriteController { _currentFrame = newFrame; _currentFrame.clear(); _currentFrame.add( - rect: frame, + source: frame, offset: newPosition, //Offset(moveX, moveY), - anchor: Offset(_pivot.dx, _pivot.dy - sink), + anchor: Vector2(_pivot.dx, _pivot.dy - sink), scale: _scale, ); } diff --git a/lib/utils/toast_message.dart b/lib/utils/toast_message.dart index a392b73..c20c7ee 100644 --- a/lib/utils/toast_message.dart +++ b/lib/utils/toast_message.dart @@ -1,9 +1,6 @@ import 'dart:ui'; -import 'package:flame/anchor.dart'; -import 'package:flame/position.dart'; -import 'package:flame/text_config.dart'; -import 'package:flutter/material.dart'; +import 'package:flame/components.dart'; import 'package:flutter/rendering.dart'; import '../game_controller.dart'; @@ -16,7 +13,7 @@ class Toast { static void draw(Canvas c) { if (_toastList == null) return; - if (_toastList.length > 0) { + if (_toastList.isNotEmpty) { _toastList[0].draw(c); if (!_toastList[0].isAlive()) _toastList.removeAt(0); } @@ -38,9 +35,9 @@ class ToastMessage { DateTime startTime; String text; - Position _currentPos; - Position _fadeIn; - Position _fadeOut; + Vector2 _currentPos; + Vector2 _fadeIn; + Vector2 _fadeOut; Color cNow = Color.fromRGBO(62, 44, 40, .2); Color cIn = Color.fromRGBO(62, 44, 40, 1); @@ -49,15 +46,15 @@ class ToastMessage { final Paint _p = Paint(); ToastMessage(this.text) { - _currentPos = Position( + _currentPos = Vector2( GameController.screenSize.width / 2, GameController.screenSize.height * 0.9, ); - _fadeIn = Position( + _fadeIn = Vector2( GameController.screenSize.width / 2, GameController.screenSize.height * 0.8, ); - _fadeOut = Position( + _fadeOut = Vector2( GameController.screenSize.width / 2, GameController.screenSize.height * 0.9, ); @@ -67,13 +64,13 @@ class ToastMessage { startTime == null ? startTime = DateTime.now() : null; if (isReadyToFadeOut()) { - _currentPos = Position( + _currentPos = Vector2( lerpDouble(_currentPos.x, _fadeOut.x, GameController.deltaTime * speed), lerpDouble(_currentPos.y, _fadeOut.y, GameController.deltaTime * speed), ); cNow = Color.lerp(cNow, cOut, GameController.deltaTime * (speed + 3)); } else { - _currentPos = Position( + _currentPos = Vector2( lerpDouble(_currentPos.x, _fadeIn.x, GameController.deltaTime * speed), lerpDouble(_currentPos.y, _fadeIn.y, GameController.deltaTime * speed), ); @@ -91,11 +88,12 @@ class ToastMessage { _p.color = Color.fromRGBO(244, 223, 168, cNow.alpha / 255.0); c.drawRRect(RRect.fromRectAndRadius(bounds, Radius.circular(5)), _p); - var _text = TextConfig( + var _text = TextPaint( + style: TextStyle( fontSize: 12.0, color: cNow, fontFamily: "Blocktopia", - ); + )); _text.render(c, text, _currentPos, anchor: Anchor.bottomCenter); } diff --git a/pubspec.yaml b/pubspec.yaml index 43a195b..e0ac91c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -26,29 +26,31 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^0.1.3 - flame: ^0.26.0 - extended_image: ^0.7.3-dev + cupertino_icons: ^1.0.5 + flame: ^1.4.0 + flame_audio: ^1.3.2 + extended_image: ^6.3.1 fast_noise: ^0.1.3+1 - sensors: '>=0.4.2+2 <2.0.0' - socket_io_client: ^0.9.11 - wakelock: ^0.1.4+2 - package_info: ^0.4.3 - http: ^0.12.2 + sensors: ^2.0.3 + socket_io_client: ^2.0.0 + wakelock: ^0.6.2 + package_info_plus: ^3.0.0 + http: ^0.13.5 + + google_sign_in: ^5.4.2 + firebase_core: ^2.0.0 + firebase_analytics: ^10.0.1 + firebase_auth: ^4.0.1 + cloud_firestore: ^4.0.1 + firebase_database: ^10.0.1 - google_sign_in: ^4.5.3 - firebase_core: ^0.5.0 - firebase_analytics: ^6.0.0 - firebase_auth: ^0.18.0+1 - cloud_firestore: ^0.14.0+2 - firebase_database: ^4.0.0 dev_dependencies: flutter_test: sdk: flutter effective_dart: ^1.2.4 - flutter_launcher_icons: "^0.7.3" + flutter_launcher_icons: ^0.10.0 flutter_icons: android: "launcher_icon" diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/web/icons/Icon-maskable-192.png differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/web/icons/Icon-maskable-512.png differ diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..15f5680 --- /dev/null +++ b/web/index.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + bwo + + + + + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..e77b396 --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "bwo", + "short_name": "bwo", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +}