diff --git a/backend/code/src/game/game.ts b/backend/code/src/game/game.ts index f1c65c0..060131c 100644 --- a/backend/code/src/game/game.ts +++ b/backend/code/src/game/game.ts @@ -2,189 +2,261 @@ import { EventEmitter2 } from '@nestjs/event-emitter'; import { Server, Socket } from 'socket.io'; export class Game { - - constructor(private readonly eventEmitter: EventEmitter2 , private readonly server: Server) {} - - private screenAdapter(player,x:number , y:number , ballsize:number){ - let scale_x = player.w / this.w; - let scale_y = player.h / this.h; - - let new_x = x * scale_x; - let new_y = y * scale_y; - - let new_ball_size = ballsize * Math.min(scale_x, scale_y) - return {x:new_x, y:new_y, ballsize:new_ball_size,p1Score:this.p1Score,p2Score:this.p2Score} + constructor( + private readonly eventEmitter: EventEmitter2, + private readonly server: Server, + ) {} + + private screenAdapter(player, x: number, y: number, ballsize: number) { + const scale_x = player.w / this.w; + const scale_y = player.h / this.h; + + const new_x = x * scale_x; + const new_y = y * scale_y; + + const new_ball_size = ballsize * Math.min(scale_x, scale_y); + return { + x: new_x, + y: new_y, + ballsize: new_ball_size, + p1Score: this.p1Score, + p2Score: this.p2Score, + }; } - private paddleAdapterP1toP2(player1, player2, p1PaddleY:number , p2PaddleY:number, side:boolean){ - let scale = this.h / player1.h; - - this.p1PaddleY = (p1PaddleY * scale) ; + private paddleAdapterP1toP2( + player1, + player2, + p1PaddleY: number, + p2PaddleY: number, + side: boolean, + ) { + const scale = this.h / player1.h; + if ( + p1PaddleY * scale - this.paddleHeight / 6 > 0 && + p1PaddleY * scale + this.paddleHeight < this.h + ) { + this.p1PaddleY = p1PaddleY * scale; + } - let scale2 = player2.h / this.h ; + const scale2 = player2.h / this.h; - let newPos = this.p1PaddleY * scale2; - let scale_y = player2.h / this.h; + const newPos = this.p1PaddleY * scale2; + // let scale_y = player2.h / this.h; // let center = this.paddleHeight * scale_y; - return {p1PaddleY:newPos,p2PaddleY:p2PaddleY,side:side}; + if (p2PaddleY - player2.h / 6 / 6 < 0) { + p2PaddleY = 0; + } else if (p2PaddleY + player2.h / 6 > player2.h) { + p2PaddleY = player2.h - player2.h / 6; + } + return { p1PaddleY: newPos, p2PaddleY: p2PaddleY, side: side }; } - private paddleAdapterP2toP1(player1, player2, p1PaddleY:number , p2PaddleY:number, side:boolean){ - let scale = this.h / player2.h; - - this.p2PaddleY = (p2PaddleY * scale) ; + private paddleAdapterP2toP1( + player1, + player2, + p1PaddleY: number, + p2PaddleY: number, + side: boolean, + ) { + const scale = this.h / player2.h; + if ( + p2PaddleY * scale - this.paddleHeight / 6 >= 0 && + p2PaddleY * scale + this.paddleHeight <= this.h + ) + this.p2PaddleY = p2PaddleY * scale; - let scale2 = player1.h / this.h ; + const scale2 = player1.h / this.h; - let newPos = this.p2PaddleY * scale2; - let scale_y = player1.h / this.h; + const newPos = this.p2PaddleY * scale2; + // let scale_y = player1.h / this.h; // let center = this.paddleHeight * scale_y; - return {p1PaddleY:p1PaddleY,p2PaddleY:newPos,side:side}; - + if (p1PaddleY - player1.h / 6 / 6 < 0) { + p1PaddleY = 0; + } else if (p1PaddleY + player1.h / 6 > player1.h) { + p1PaddleY = player1.h - player1.h / 6; + } + return { p1PaddleY: p1PaddleY, p2PaddleY: newPos, side: side }; } - private up1(){ - if (this.p1PaddleY - this.paddleHeight / 6 >= 0) - { - this.eventp1Paddle -= this.paddleHeight / 6 - + private up1() { + this.eventp1Paddle -= this.p1Res.h / 6 / 6; + if (this.eventp1Paddle - this.p1Res.h / 6 / 6 < 0) { + this.eventp1Paddle = 0; } } - private down1(){ - if (this.p1PaddleY + this.paddleHeight <= this.h) - { - this.eventp1Paddle += this.paddleHeight / 6 - - + private down1() { + this.eventp1Paddle += this.p1Res.h / 6 / 6; + if (this.eventp1Paddle + this.p1Res.h / 6 > this.p1Res.h) { + this.eventp1Paddle = this.p1Res.h - this.p1Res.h / 6; } } - private up2(){ - if (this.p2PaddleY - this.paddleHeight / 6 >= 0) - { - this.eventp2Paddle -= this.paddleHeight / 6 + private up2() { + this.eventp2Paddle -= this.p2Res.h / 6 / 6; + if (this.eventp2Paddle - this.p2Res.h / 6 / 6 < 0) { + this.eventp2Paddle = 0; } - } - private down2(){ - if (this.p2PaddleY+ this.paddleHeight <= this.h) - { - this.eventp2Paddle += this.paddleHeight / 6 - + private down2() { + this.eventp2Paddle += this.p2Res.h / 6 / 6; + if (this.eventp2Paddle - this.p2Res.h / 6 / 6 < 0) { + this.eventp2Paddle = 0; } } - private async loop() { - if (this.closeGame) - return ; + if (this.closeGame) return; console.log('loop'); - if (this.x + (this.ballSize / 2) + this.dx >= this.w || this.x + this.dx <= 0) + if ( + this.x + this.dx + this.ballSize / 2 >= this.w || + this.x + this.dx - this.ballSize / 2 <= 0 + ) this.dx *= -1; - if (this.y + (this.ballSize / 2) + this.dy >= this.h || this.y + this.dy <= 0) + if ( + this.y + this.dy + this.ballSize / 2 >= this.h || + this.y + this.dy - this.ballSize / 2 <= 0 + ) this.dy *= -1; if ( - (this.y >= this.p1PaddleY && this.y <= this.p1PaddleY + this.paddleHeight - && (this.x + (this.ballSize )) <= this.paddleWidth + 40) - ) - { - + this.y > this.p1PaddleY && + this.y < this.p1PaddleY + this.paddleHeight && + this.x <= this.paddleWidth + this.gap + this.ballSize / 2 + ) { this.dx *= -1; - this.dy *= Math.random() * 2.5 - + this.dy = Math.random() * (4 - 1.5) + 1.5; } + if ( - (this.y >= this.p2PaddleY && this.y <= this.p2PaddleY + this.paddleHeight - && (this.x + (this.ballSize )) >= ( this.w - (this.paddleWidth + 20)) ) - ){ + this.y > this.p1PaddleY && + this.y < this.p1PaddleY + this.paddleHeight && + this.x >= this.w - (this.paddleWidth + this.gap + this.ballSize / 2) + ) { this.dx *= -1; - this.dy *= Math.random() * 2.5 + this.dy = Math.random() * (4 - 1.5) + 1.5; } if ( - ((this.y < this.p2PaddleY || this.y > this.p2PaddleY + this.paddleHeight) - && (this.x + (this.ballSize )) >= ( this.w - (this.paddleWidth + 5)) ) - ){ + (this.y < this.p2PaddleY || + this.y > this.p2PaddleY + this.paddleHeight) && + this.x + this.ballSize / 2 >= this.w - (this.paddleWidth + this.gap) + ) { + console.log(`${this.p1PaddleY} ${this.x} ${this.y} ${this.ballSize}`); this.p1Score += 1; - this.init() + this.init(); this.checkForWinner(); - await new Promise(resolve => setTimeout(resolve, 1000)); + await new Promise((resolve) => setTimeout(resolve, 1000)); } if ( - ((this.y < this.p1PaddleY || this.y > this.p1PaddleY + this.paddleHeight) - && (this.x ) <= this.paddleWidth + 5) - ) - { - this.p2Score += 1; - this.init(); - this.checkForWinner(); - await new Promise(resolve => setTimeout(resolve, 1000)); - } - - console.log(this.x) - console.log(this.y) + (this.y < this.p1PaddleY || + this.y > this.p1PaddleY + this.paddleHeight) && + this.x - this.ballSize / 2 <= this.paddleWidth + this.gap + ) { + console.log(`${this.p1PaddleY} ${this.x} ${this.y} ${this.ballSize}`); + this.p2Score += 1; + this.init(); + this.checkForWinner(); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + + console.log(this.x); + console.log(this.y); + // const forwardx = this.x + this.dx; + // const forwardy = this.y + this.dy + // if (forwardx > this.) { + // } this.x += this.dx; this.y += this.dy; - console.log(this.p1Res) - console.log(this.p2Res) - if (parseFloat((this.p1Res.w / this.p1Res.h).toFixed(1)) !== 1.8 && parseFloat((this.p2Res.w / this.p2Res.h).toFixed(1)) !== 1.9){ - this.p1socket.emit("screen Error") - this.emitGameEnd("end") - this.p1socket.emit("lose","trying cheat"); - this.p2socket.emit("win","you win other player try to cheat"); - }else{ - this.p1socket.emit("ball",this.screenAdapter(this.p1Res,this.x,this.y,this.ballSize)) - this.p2socket.emit("paddle",this.paddleAdapterP1toP2(this.p1Res, this.p2Res ,this.eventp1Paddle,this.eventp2Paddle,true)) + if ( + parseFloat((this.p1Res.w / this.p1Res.h).toFixed(1)) !== 1.8 && + parseFloat((this.p2Res.w / this.p2Res.h).toFixed(1)) !== 1.9 + ) { + this.p1socket.emit('screen Error'); + this.emitGameEnd('p1Leave'); + this.p1socket.emit('lose', 'trying cheat'); + this.p2socket.emit('win', 'you win other player try to cheat'); + } else { + this.p1socket.emit( + 'ball', + this.screenAdapter(this.p1Res, this.x, this.y, this.ballSize), + ); + this.p2socket.emit( + 'paddle', + this.paddleAdapterP1toP2( + this.p1Res, + this.p2Res, + this.eventp1Paddle, + this.eventp2Paddle, + true, + ), + ); } - - if (parseFloat((this.p2Res.w / this.p2Res.h).toFixed(1)) !== 1.8 && parseFloat((this.p2Res.w / this.p2Res.h).toFixed(1)) !== 1.9){ - this.p1socket.emit("screen Error") - this.emitGameEnd("end") - this.p1socket.emit("win","you win other player try to cheat"); - this.p2socket.emit("lose","trying cheat"); - }else{ - this.p2socket.emit("ball",this.screenAdapter(this.p2Res,this.x,this.y,this.ballSize)) - this.p1socket.emit("paddle",this.paddleAdapterP2toP1(this.p1Res, this.p2Res ,this.eventp1Paddle,this.eventp2Paddle,true)) + if ( + parseFloat((this.p2Res.w / this.p2Res.h).toFixed(1)) !== 1.8 && + parseFloat((this.p2Res.w / this.p2Res.h).toFixed(1)) !== 1.9 + ) { + this.p1socket.emit('screen Error'); + this.emitGameEnd('p2Leave'); + this.p1socket.emit('win', 'you win other player try to cheat'); + this.p2socket.emit('lose', 'trying cheat'); + } else { + this.p2socket.emit( + 'ball', + this.screenAdapter(this.p2Res, this.x, this.y, this.ballSize), + ); + this.p1socket.emit( + 'paddle', + this.paddleAdapterP2toP1( + this.p1Res, + this.p2Res, + this.eventp1Paddle, + this.eventp2Paddle, + true, + ), + ); } - - - await this.sleep(20); + await this.sleep(this.frames); this.loop(); } - - - private async sleepCounter(){ + private async sleepCounter() { let timer = 5000; for (let i = 0; i < 6; i++) { - await new Promise(resolve => setTimeout(resolve, 1000)); - this.server.emit("timer", timer); + await new Promise((resolve) => setTimeout(resolve, 1000)); + this.server.to(this.gameid).emit('timer', timer); timer -= 1000; } } async start(ngameid: string) { console.log('game started', ngameid); this.gameid = ngameid; - await this.sleepCounter() + await this.sleepCounter(); // await this.setplayerScokets(this.p1socket, this.p2socket ,) this.loop(); } - - setplayerScokets(p1socket: Socket, p2socket: Socket , p1Data:any, p2Data:any) { + setplayerScokets( + p1socket: Socket, + p2socket: Socket, + p1Data: any, + p2Data: any, + ) { this.p1socket = p1socket; this.p2socket = p2socket; this.p1Data = p1Data; this.p2Data = p2Data; console.log(p1Data); console.log(p2Data); - this.server.emit("players",[p1Data,p2Data]) - console.log("newfunc") + this.server.emit('players', [p1Data, p2Data]); + console.log('newfunc'); + setInterval(() => { + this.frames -= 1; + }, 2000); this.p1socket.on('up', () => { this.up1(); }); @@ -197,10 +269,18 @@ export class Game { this.p2socket.on('down', () => { this.down2(); }); - this.p1socket.on("mouse", (data) => {this.eventp1Paddle = data}); - this.p2socket.on("mouse", (data) => {this.eventp2Paddle = data}); - this.p1socket.on("screen", (data) =>{this.p1Res = data}) - this.p2socket.on("screen", (data) =>{this.p2Res = data}) + this.p1socket.on('mouse', (data) => { + this.eventp1Paddle = data; + }); + this.p2socket.on('mouse', (data) => { + this.eventp2Paddle = data; + }); + this.p1socket.on('screen', (data) => { + this.p1Res = data; + }); + this.p2socket.on('screen', (data) => { + this.p2Res = data; + }); this.p1socket.on('disconnect', () => { console.log('p1 disconnected'); this.emitGameEnd('p1 disconnected'); @@ -209,44 +289,63 @@ export class Game { console.log('p2 disconnected'); this.emitGameEnd('p2 disconnected'); }); - this.p1socket.on("leave", () => {this.emitGameEnd("end"); - this.p2socket.emit("win","you win other player leave the game"); - this.p1socket.emit("lose","you win other player leave the game"); - this.emitGameEnd('leave'); - }) - this.p2socket.on("leave", () => {this.emitGameEnd("end"); - this.p1socket.emit("win","you win other player leave the game"); - this.p2socket.emit("lose","you lost other player leave the game"); - this.emitGameEnd('leave'); - }) - + this.p1socket.on('leave', () => { + this.emitGameEnd('p1Leave'); + this.p2socket.emit('win', 'you win other player leave the game'); + this.p1socket.emit('lose', 'you win other player leave the game'); + }); + this.p2socket.on('leave', () => { + this.emitGameEnd('p2Leave'); + this.p1socket.emit('win', 'you win other player leave the game'); + this.p2socket.emit('lose', 'you lost other player leave the game'); + }); } - private checkForWinner(){ - if (this.p1Score >= 5) - { - this.p1socket.emit("win","you win"); - this.p2socket.emit("lose","you lose"); - this.emitGameEnd("end") + private checkForWinner() { + if (this.p1Score >= 5) { + this.p1socket.emit('win', 'you win'); + this.p2socket.emit('lose', 'you lose'); + this.emitGameEnd('end'); } - if (this.p2Score >= 5) - { - this.p2socket.emit("win","you win"); - this.p1socket.emit("lose","you lose"); - this.emitGameEnd("end") + if (this.p2Score >= 5) { + this.p2socket.emit('win', 'you win'); + this.p1socket.emit('lose', 'you lose'); + this.emitGameEnd('end'); } - } private emitGameEnd(message: string) { console.log('game end'); - this.eventEmitter.emit('game.end', { - message: message, - gameid: this.gameid, - p1Data: this.p1Data, - p2Data: this.p2Data, - p1Score: this.p1Score, - p2Score: this.p2Score, - }); this.closeGame = true; + if (message === 'p1Leave') { + this.eventEmitter.emit('game.end', { + resign: 1, + message: message, + gameid: this.gameid, + p1Data: this.p1Data, + p2Data: this.p2Data, + p1Score: this.p1Score, + p2Score: this.p2Score, + }); + } else if (message === 'p2Leave') { + this.eventEmitter.emit('game.end', { + resign: 2, + message: message, + gameid: this.gameid, + p1Data: this.p1Data, + p2Data: this.p2Data, + p1Score: this.p1Score, + p2Score: this.p2Score, + }); + } else { + this.eventEmitter.emit('game.end', { + resign: 0, + message: message, + gameid: this.gameid, + p1Data: this.p1Data, + p2Data: this.p2Data, + p1Score: this.p1Score, + p2Score: this.p2Score, + }); + } } private sleep(ms: number) { @@ -255,27 +354,30 @@ export class Game { }); } - private init(){ - this.x = this.w / 2; - this.y = this.h / 2; - this.ballSize = this.w / 42; - this.dx = this.w / 200; - this.dy = this.w / 200; - this.p1PaddleY = this.h / 2; - this.p2PaddleY = this.h / 2; + private init() { + this.x = this.w / 2; + this.y = this.h / 2; + this.ballSize = this.w / 42; + this.dx = Math.random() > 0.5 ? this.w / 220 : (this.w / 220) * -1; + this.dy = Math.random() > 0.5 ? this.w / 220 : (this.w / 220) * -1; + this.p1PaddleY = this.h / 2; + this.p2PaddleY = this.h / 2; + this.frames = 25; } private gameid: string; private p1socket: Socket; private p2socket: Socket; private p1Data: any; private p2Data: any; + private frames: number = 25; private w: number = 1067; private h: number = 600; private x: number = this.w / 2; private y: number = this.h / 2; + private gap: number = this.w / 100; private ballSize: number = this.w / 42; - private dx: number = this.w / 200; - private dy: number = this.w / 200; + private dx: number = Math.random() > 0.5 ? this.w / 220 : (this.w / 220) * -1; + private dy: number = Math.random() > 0.5 ? this.w / 220 : (this.w / 220) * -1; private p1PaddleY: number = this.h / 2; private p2PaddleY: number = this.h / 2; private eventp1Paddle: number = 0; @@ -283,8 +385,8 @@ export class Game { private paddleHeight: number = this.h / 6; private paddleWidth: number = this.w / 70; private p1Score: number = 0; - private p2Score: number = 0; - private p1Res = {h:0,w:0}; - private p2Res = {h:0,w:0}; + private p2Score: number = 0; + private p1Res = { h: 0, w: 0 }; + private p2Res = { h: 0, w: 0 }; private closeGame = false; } diff --git a/backend/code/src/gateways/gateways.gateway.ts b/backend/code/src/gateways/gateways.gateway.ts index 1b25dbb..8ca9e3c 100644 --- a/backend/code/src/gateways/gateways.gateway.ts +++ b/backend/code/src/gateways/gateways.gateway.ts @@ -12,7 +12,7 @@ import {} from '@nestjs/platform-socket.io'; import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; import { PrismaService } from 'src/prisma/prisma.service'; import { Game } from 'src/game/game'; -import { $Enums, Notification , Match } from '@prisma/client'; +import { $Enums, Notification } from '@prisma/client'; @WebSocketGateway(3004, { cors: { @@ -211,7 +211,7 @@ export class Gateways implements OnGatewayConnection, OnGatewayDisconnect { // } @OnEvent('game.launched') async handleGameLaunchedEvent(clients: any) { - const game_channel = `Game:${clients[0].socket.id}:${clients[1].socket.id}`; + const game_channel = `Game:${clients[0].socket.id}:${clients[1].socket.id}`; console.log(game_channel); clients.forEach((client: any) => { client.socket.join(game_channel); @@ -234,18 +234,42 @@ export class Gateways implements OnGatewayConnection, OnGatewayDisconnect { console.log('game ended'); console.log(data); this.server.to(data.gameid).emit('game.end', data); - console.log(data) - - await this.prisma.match.create({ - data: { - participant1Id: data.p1Data.userId, - participant2Id: data.p2Data.userId, - winner_id: data.p1Score > data.p2Score ? data.p1Data.userId : data.p2Data.userId , - score1: data.p1Score, - score2: data.p2Score, - }, - }); - + console.log(data); + if (data.resign === 0) { + await this.prisma.match.create({ + data: { + participant1Id: data.p1Data.userId, + participant2Id: data.p2Data.userId, + winner_id: + data.p1Score > data.p2Score + ? data.p1Data.userId + : data.p2Data.userId, + score1: data.p1Score, + score2: data.p2Score, + }, + }); + } else if (data.resign === 1) { + await this.prisma.match.create({ + data: { + participant1Id: data.p1Data.userId, + participant2Id: data.p2Data.userId, + winner_id: data.p2Data.userId, + score1: 0, + score2: 5, + }, + }); + } else if (data.resign === 2) { + await this.prisma.match.create({ + data: { + participant1Id: data.p1Data.userId, + participant2Id: data.p2Data.userId, + winner_id: data.p1Data.userId, + score1: 5, + score2: 0, + }, + }); + } + this.games_map.delete(data.gameid); } diff --git a/backend/code/src/profile/profile.service.ts b/backend/code/src/profile/profile.service.ts index d97f361..716332d 100644 --- a/backend/code/src/profile/profile.service.ts +++ b/backend/code/src/profile/profile.service.ts @@ -28,8 +28,8 @@ export class ProfileService { wonMatches === 0 ? null : wonMatches >= 100 - ? 2 - : Math.floor(Math.log10(wonMatches)); + ? 2 + : Math.floor(Math.log10(wonMatches)); return new ProfileDto({ ...user, achievement }, false); } @@ -58,8 +58,8 @@ export class ProfileService { wonMatches === 0 ? null : wonMatches >= 100 - ? 2 - : Math.floor(Math.log10(wonMatches)); + ? 2 + : Math.floor(Math.log10(wonMatches)); return new ProfileDto({ ...user, achievement }, true); } diff --git a/docker-compose-dev.yaml b/docker-compose-dev.yaml index 2c70888..e07e576 100644 --- a/docker-compose-dev.yaml +++ b/docker-compose-dev.yaml @@ -23,6 +23,7 @@ services : networks: - pongnet backend: + container_name: backend build: context: ./backend dockerfile: Dockerfile.dev diff --git a/frontend/code/src/Api/base.tsx b/frontend/code/src/Api/base.tsx index ae68f3d..4003abd 100644 --- a/frontend/code/src/Api/base.tsx +++ b/frontend/code/src/Api/base.tsx @@ -5,7 +5,8 @@ import axios from "axios"; // const navigate = useNavigate(); // return navigate; // }; -const api = axios.create({ + +const apiWithoutManager = axios.create({ baseURL: `${process.env.REACT_APP_API_ENDPOINT}`, timeout: 10000, withCredentials: true, @@ -15,26 +16,105 @@ const api = axios.create({ }, }); - let refreshAttempted = 0; - - const errorHandler = async (error: any) => { - - if (error?.response?.status === 401) { - if (refreshAttempted <= 2) { +const ConcurrencyManager = (axios: any, MAX_CONCURRENT = 10) => { + if (MAX_CONCURRENT < 1){ + //eslint-disable-next-line + throw "Concurrency Manager Error: minimun concurrent requests is 1"; + } + let instance = { + queue: [] as any[], + running: [] as any[], + shiftInitial: () => { + setTimeout(() => { + if (instance.running.length < MAX_CONCURRENT) { + instance.shift(); + } + }, 0); + }, + push: (reqHandler: any) => { + instance.queue.push(reqHandler); + instance.shiftInitial(); + }, + shift: () => { + if (instance.queue.length) { + const queued = instance.queue.shift(); + queued.resolver(queued.request); + instance.running.push(queued); + } + }, + // Use as interceptor. Queue outgoing requests + requestHandler: (req: any) => { + return new Promise(resolve => { + instance.push({ request: req, resolver: resolve }); + }); + }, + // Use as interceptor. Execute queued request upon receiving a response + responseHandler: (res: any) => { + instance.running.shift(); + instance.shift(); + return res; + }, + responseErrorHandler: async (error: any) => { + if (error?.response?.status === 401) { try { - refreshAttempted++; - await api.get("auth/refresh"); - return api.request(error.config); - } catch (refreshError) {} - } else { - refreshAttempted--; + const refreshError = await apiWithoutManager.get("auth/refresh").then(() => null).catch((err: any) => err); + if (refreshError && window.location.pathname !== '/') { + instance.queue = []; + instance.running = []; + window.location.href = '/'; + return; + } + const res = await apiWithoutManager.request(error.config); + return instance.responseHandler(res); + } catch (refreshError) { } } + return Promise.reject(instance.responseHandler(error)); + }, + interceptors: { + request: null, + response: null + }, + detach: () => { + axios.interceptors.request.eject(instance.interceptors.request); + axios.interceptors.response.eject(instance.interceptors.response); } - return Promise.reject(error); }; - api.interceptors.response.use( - (response) => response, - (error) => errorHandler(error) + // queue concurrent requests + instance.interceptors.request = axios.interceptors.request.use( + instance.requestHandler ); - - export default api; + instance.interceptors.response = axios.interceptors.response.use( + instance.responseHandler, + instance.responseErrorHandler, + ); + return instance; +}; + +const api = axios.create({ + baseURL: `${process.env.REACT_APP_API_ENDPOINT}`, + timeout: 10000, + withCredentials: true, + headers: { + "Cache-Control": "no-cache", + "Content-Type": "application/json", + }, +}); + +// init your manager. +ConcurrencyManager(api, 1); + +// const errorHandler = async (error: any) => { +// if (error?.response?.status === 401) { +// try { +// await api.get("auth/refresh"); +// return api.request(error.config); +// } catch (refreshError) {} +// } +// return Promise.reject(error); +// }; +// api.interceptors.response.use( +// (response) => response, +// (error) => errorHandler(error) +// ); + +export default api; diff --git a/frontend/code/src/Components/Chat/Services/SocketsServices.ts b/frontend/code/src/Components/Chat/Services/SocketsServices.ts index 2a30076..1ce5a74 100644 --- a/frontend/code/src/Components/Chat/Services/SocketsServices.ts +++ b/frontend/code/src/Components/Chat/Services/SocketsServices.ts @@ -1,43 +1,54 @@ import { io } from 'socket.io-client'; import { create } from 'zustand' +interface SocketStore { + socket: any; + connected: boolean; -const reconnect = () => { - return io("http://localhost:3004", { - transports: ['websocket'], - }); + setSocket: () => any; } -export const useSocketStore:any = create((set:any) => ({ - socket:null, - connected:false, - setSocket : () => { - - var s:any; - - const soc = set((state:any) => { - if (state.socket === null){ - s = io("http://localhost:3004", { - transports: ['websocket'], - 'reconnection': true, - 'reconnectionDelay': 1000, - 'reconnectionDelayMax' : 1000, - 'reconnectionAttempts': 5 - }); - - - s.on('connect_error', async() => { - await new Promise(r => setTimeout((r) => { - console.log("inside"); - s = reconnect(); - s.on('connect' , () => {console.log("connected")} - ) - },1000)) - }); - return {socket:s} - } - return state - }) - return soc ? soc : s; - - }})) + +export const useSocketStore = create((set, get) => ({ + socket: null, + connected: false, + setSocket: () => { + let newSocket: any = null; + + set((state) => { + if (state.socket === null) { + newSocket = io("http://localhost:3004", { + transports: ['websocket'], + 'reconnection': true, + 'reconnectionDelay': 1000, + 'reconnectionDelayMax': 1000, + 'reconnectionAttempts': 5 + }); + + // Set socket + set({ ...state, socket: newSocket }); + + newSocket.on('connect', () => { + console.log('Connected!'); + // Set connected state + set({ ...state, connected: true }); + }); + + newSocket.on('connect_error', async () => { + await new Promise((resolve) => setTimeout(() => { + // Set connected state + set({ ...state, connected: false }); + newSocket.connect(); + resolve(newSocket); + }, 1000)) + }); + + return { ...state, socket: newSocket }; + } + + return state; + }); + + return newSocket; + } +})) diff --git a/frontend/code/src/Components/Game/index.tsx b/frontend/code/src/Components/Game/index.tsx index cd8fc9d..130bcd3 100644 --- a/frontend/code/src/Components/Game/index.tsx +++ b/frontend/code/src/Components/Game/index.tsx @@ -1,12 +1,11 @@ -import { useCallback, useEffect , useState} from "react" +import { useCallback, useEffect } from "react" import { Rect, Stage , Layer , Circle, Line} from "react-konva" import { BsFillArrowRightCircleFill, BsFillArrowLeftCircleFill} from "react-icons/bs"; -import { useUserStore } from "../../Stores/stores"; import { useGameState } from "./States/GameState"; import { useSocketStore } from "../Chat/Services/SocketsServices"; import { useNavigate } from "react-router-dom"; -const DURATION = 25; +const DURATION = 20; type Cords = { x:number; y:number; @@ -42,15 +41,18 @@ export const Game = () => { const navigate = useNavigate() const leave = useCallback(() => { socketStore.socket.emit("leave") + // eslint-disable-next-line },[]) const handleMove = throttlify((e :any) => { socketStore.socket.emit("mouse",e.evt.layerY); }) const ArrowUp = () => { socketStore.socket.emit("up"); + socketStore.socket.off("up"); } const ArrowDown = () => { socketStore.socket.emit("down") + socketStore.socket.off("down"); } useEffect(() => { document.addEventListener('keydown', (event) =>{ @@ -61,12 +63,11 @@ export const Game = () => { }) socketStore.socket.on("ball", (cord:Cords) => { gameState.setBall({x:cord.x,y:cord.y,size:cord.ballsize,p1Score:cord.p1Score,p2Score:cord.p2Score}) - console.log(gameState.ball) }) socketStore.socket.on("paddle", (paddles:any) => { gameState.setLPaddle(paddles.p1PaddleY); gameState.setRPaddle(paddles.p2PaddleY); - if (gameState?.side != paddles.side) + if (gameState?.side !== paddles.side) gameState.setSide(paddles.side); }) socketStore.socket.on("screen Error", () =>{ @@ -79,11 +80,19 @@ export const Game = () => { }) return () => { socketStore.socket.off("ball"); - socketStore.socket.off("mouse") + socketStore.socket.off("mouse"); + socketStore.socket.off("down"); + socketStore.socket.off("up"); + socketStore.socket.off("leave") + window.removeEventListener("keydown",()=>{}); + } + // eslint-disable-next-line },[]) /* eslint-disable */ useEffect(() => { + if (!gameState.p1) + navigate("/home") const divh = document.getElementById('Game')?.offsetHeight const divw = document.getElementById('Game')?.offsetWidth socketStore.socket.emit("screen",{h:divh,w:divw}) @@ -102,7 +111,10 @@ export const Game = () => { return () => { socketStore.socket.off("screen"); + window.removeEventListener("resize",()=>{}); + } + // disable eslit next line },[]) @@ -123,24 +135,24 @@ export const Game = () => {
- + {gameState.ball.p1Score}
{gameState?.ball.p2Score} - +
- + - - + + diff --git a/frontend/code/src/Components/Layout/Assets/Modal.tsx b/frontend/code/src/Components/Layout/Assets/Modal.tsx index 8e45606..3882c45 100644 --- a/frontend/code/src/Components/Layout/Assets/Modal.tsx +++ b/frontend/code/src/Components/Layout/Assets/Modal.tsx @@ -8,7 +8,6 @@ export const Modal = () => { const [resOpacity , setResOpacity] = useState(""); const [result , setResutl] = useState(undefined); const [status , setStatus] = useState(undefined); - var gameId:string; const [timer , setTimer] = useState(undefined); const [gameid , setGameId] = useState(undefined); const socketStore = useSocketStore(); @@ -69,8 +68,10 @@ export const Modal = () => { socketStore.socket.off("lose") socketStore.socket.off("win") socketStore.socket.off("timer") + socketStore.socket.off("game.launched") + socketStore.socket.off("players") } - +// eslint-disable-next-line },[timer]) return ( diff --git a/frontend/code/src/Components/Play/index.tsx b/frontend/code/src/Components/Play/index.tsx index 3cd792e..e79ee4e 100644 --- a/frontend/code/src/Components/Play/index.tsx +++ b/frontend/code/src/Components/Play/index.tsx @@ -18,7 +18,7 @@ export const Play = () => { } return( <> -
+
diff --git a/frontend/code/src/Components/Profile/assets/Table.tsx b/frontend/code/src/Components/Profile/assets/Table.tsx index 3d15311..d73ac6d 100644 --- a/frontend/code/src/Components/Profile/assets/Table.tsx +++ b/frontend/code/src/Components/Profile/assets/Table.tsx @@ -42,6 +42,7 @@ export const Table = (props: any) => { setHasMore(true); fetchData(); offset.current += 20; + // eslint-disable-next-line }, [props.props.props]); console.log(props); return history.length > 0 || loading === true ? ( diff --git a/nginx/default.conf b/nginx/default.conf index 780d28b..17b3ab5 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -42,7 +42,7 @@ server { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; - proxy_pass http://backend:3001; + proxy_pass http://backend:3004; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 557dc3d..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1345 +0,0 @@ -{ - "name": "PongGame-WebApp", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@emotion/react": "^11.11.1", - "@emotion/styled": "^11.11.0", - "@material-ui/core": "^4.12.4", - "@mui/material": "^5.14.13", - "lord-icon-element": "^4.1.2", - "lottie-web": "^5.12.2", - "socket.io-client": "^4.7.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", - "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", - "dependencies": { - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", - "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", - "dependencies": { - "@floating-ui/dom": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" - }, - "node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/core/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@material-ui/core/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/styles/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@material-ui/styles/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@material-ui/styles/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/system/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@material-ui/utils/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.19.tgz", - "integrity": "sha512-maNBgAscddyPNzFZQUJDF/puxM27Li+NqSBsr/lAP8TLns2VvWS2SoL3OKFOIoRnAMKGY/Ic6Aot6gCYeQnssA==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.13", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.13.tgz", - "integrity": "sha512-3ZUbzcH4yloLKlV6Y+S0Edn2wef9t+EGHSfEkwVCn8E0ULdshifEFgfEroKRegQifDIwcKS/ofccxuZ8njTAYg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - } - }, - "node_modules/@mui/material": { - "version": "5.14.13", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.13.tgz", - "integrity": "sha512-iPEFwhoVG789UVsXX4gqd1eJUlcLW1oceqwJYQN8Z4MpcAKfL9Lv3fda65AwG7pQ5lf+d7IbHzm4m48SWZxI2g==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/base": "5.0.0-beta.19", - "@mui/core-downloads-tracker": "^5.14.13", - "@mui/system": "^5.14.13", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "@types/react-transition-group": "^4.4.7", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "5.14.13", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.13.tgz", - "integrity": "sha512-5EFqk4tqiSwPguj4NW/6bUf4u1qoUWXy9lrKfNh9H6oAohM+Ijv/7qSxFjnxPGBctj469/Sc5aKAR35ILBKZLQ==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/utils": "^5.14.13", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.14.13", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.13.tgz", - "integrity": "sha512-1ff/egFQl26hiwcUtCMKAkp4Sgqpm3qIewmXq+GN27fb44lDIACquehMFBuadOjceOFmbIXbayzbA46ZyqFYzA==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.14.13", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.13.tgz", - "integrity": "sha512-+5+Dx50lG4csbx2sGjrKLozXQJeCpJ4dIBZolyFLkZ+XphD1keQWouLUvJkPQ3MSglLLKuD37pp52YjMncZMEQ==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/private-theming": "^5.14.13", - "@mui/styled-engine": "^5.14.13", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.6.tgz", - "integrity": "sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "5.14.13", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.13.tgz", - "integrity": "sha512-2AFpyXWw7uDCIqRu7eU2i/EplZtks5LAMzQvIhC79sPV9IhOZU2qwOWVnPtdctRXiQJOAaXulg+A37pfhEueQw==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@types/prop-types": "^15.7.7", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "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/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" - }, - "node_modules/@types/react": { - "version": "17.0.68", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.68.tgz", - "integrity": "sha512-y8heXejd/Gi43S28GOqIFmr6BzhLa3anMlPojRu4rHh3MtRrrpB+BtLEcqP3XPO1urXByzBdkOLU7sodYWnpkA==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.7.tgz", - "integrity": "sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "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/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/engine.io-client": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", - "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/jss": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", - "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", - "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", - "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-global": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", - "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-nested": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", - "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", - "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", - "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", - "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lord-icon-element": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lord-icon-element/-/lord-icon-element-4.1.2.tgz", - "integrity": "sha512-h9wnAn8DHouWerICgZxZnzCsoUic+1dfQznMtLNIMm8j7goqxS4INGNjo7+Wv/54ixlmO4rfJPPkCwaF5jOlGQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/lottie-web": { - "version": "5.12.2", - "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz", - "integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==" - }, - "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/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/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "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/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 2b902a5..0000000 --- a/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "dependencies": { - "@emotion/react": "^11.11.1", - "@emotion/styled": "^11.11.0", - "@material-ui/core": "^4.12.4", - "@mui/material": "^5.14.13", - "lord-icon-element": "^4.1.2", - "lottie-web": "^5.12.2", - "socket.io-client": "^4.7.2" - } -}