├── .gitignore ├── README.md ├── bin └── www ├── client └── build │ ├── asset-manifest.json │ ├── assets │ ├── auth-illustration.svg │ ├── imgs │ │ └── bg │ │ │ └── error-404.png │ ├── logo.svg │ └── logoIcon.svg │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── favicon1.ico │ ├── index.html │ ├── manifest.json │ ├── robots.txt │ └── static │ ├── css │ ├── main.6c657092.css │ └── main.6c657092.css.map │ ├── js │ ├── 787.59db3541.chunk.js │ ├── 787.59db3541.chunk.js.map │ ├── main.ed45ed54.js │ ├── main.ed45ed54.js.LICENSE.txt │ └── main.ed45ed54.js.map │ └── media │ ├── roboto-all-300-normal.168d6383e73339293ac3.woff │ ├── roboto-all-400-normal.c5d001fa922fa66a147f.woff │ ├── roboto-all-500-normal.0ab669b7a0d19b178f57.woff │ ├── roboto-all-700-normal.a457fde362a540fcadff.woff │ ├── roboto-cyrillic-300-normal.1431d1cef06ad04f5458.woff2 │ ├── roboto-cyrillic-400-normal.71a33b6b50457b2c903a.woff2 │ ├── roboto-cyrillic-500-normal.cad7d3d9cb265e334e58.woff2 │ ├── roboto-cyrillic-700-normal.d010f1f324e111a22e53.woff2 │ ├── roboto-cyrillic-ext-300-normal.4777461b144e55145268.woff2 │ ├── roboto-cyrillic-ext-400-normal.804378952da8a10faae2.woff2 │ ├── roboto-cyrillic-ext-500-normal.62ced72e5832f02c2796.woff2 │ ├── roboto-cyrillic-ext-700-normal.be4d02458ce53887dc37.woff2 │ ├── roboto-greek-300-normal.db2632771401f61463fe.woff2 │ ├── roboto-greek-400-normal.c35e4c3958e209d17b31.woff2 │ ├── roboto-greek-500-normal.9ac81fefbe6c319ea40b.woff2 │ ├── roboto-greek-700-normal.50e795c1345353b0e996.woff2 │ ├── roboto-greek-ext-300-normal.35b9d6be04b95f0f0530.woff2 │ ├── roboto-greek-ext-400-normal.169619821ea93019d1bb.woff2 │ ├── roboto-greek-ext-500-normal.6fb9cffb1d3e72bf9293.woff2 │ ├── roboto-greek-ext-700-normal.bd9854c751441ccc1a70.woff2 │ ├── roboto-latin-300-normal.c48fb6765a9fcb00b330.woff2 │ ├── roboto-latin-400-normal.b009a76ad6afe4ebd301.woff2 │ ├── roboto-latin-500-normal.f25d774ecfe0996f8eb5.woff2 │ ├── roboto-latin-700-normal.227c93190fe7f82de3f8.woff2 │ ├── roboto-latin-ext-300-normal.dc7dcec8e3f654e0ed63.woff2 │ ├── roboto-latin-ext-400-normal.861b791f9de857a6e7bc.woff2 │ ├── roboto-latin-ext-500-normal.9165081d10e1ba601384.woff2 │ ├── roboto-latin-ext-700-normal.ed67ad54b1a8f5d21150.woff2 │ ├── roboto-vietnamese-300-normal.32fc45a3d1e8ea11fabc.woff2 │ ├── roboto-vietnamese-400-normal.3230f9b040f3c630e0c3.woff2 │ ├── roboto-vietnamese-500-normal.d8642a3d1d4ef6179644.woff2 │ └── roboto-vietnamese-700-normal.3425a701027d0699e369.woff2 ├── config ├── config.js ├── express.js ├── mongoose.js └── storeOptioins.js ├── controllers ├── auth.js ├── group.js ├── metrics.js └── wage.js ├── middleware ├── auth.js └── checkObjectId.js ├── models ├── group.js ├── metrics.js ├── user.js └── wage.js ├── package-lock.json ├── package.json ├── routes ├── auth.js ├── group.js ├── metrics.js └── routes.js ├── server.js └── utils ├── auth.js └── isEmpty.js /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .env 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Smart-Metrics-Logbook-Backend 2 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /* Sets up the environment variables from your .env file*/ 4 | require('dotenv').config(); 5 | 6 | /** 7 | * Module dependencies. 8 | */ 9 | 10 | var app = require('../server'); 11 | var http = require('http'); 12 | const mongoose = require('mongoose'); 13 | 14 | /** 15 | * Get port from environment and store in Express. 16 | */ 17 | 18 | var port = normalizePort(process.env.PORT || 8000); 19 | app.set('port', port); 20 | 21 | /** 22 | * Create HTTP server. 23 | */ 24 | 25 | var server = http.createServer(app); 26 | 27 | /** 28 | * Listen on provided port, on all network interfaces. 29 | */ 30 | 31 | server.listen(port); 32 | server.on('error', onError); 33 | server.on('listening', onListening); 34 | 35 | /** 36 | * Normalize a port into a number, string, or false. 37 | */ 38 | 39 | function normalizePort(val) { 40 | var port = parseInt(val, 10); 41 | 42 | if (isNaN(port)) { 43 | // named pipe 44 | return val; 45 | } 46 | 47 | if (port >= 0) { 48 | // port number 49 | return port; 50 | } 51 | 52 | return false; 53 | } 54 | 55 | /** 56 | * Event listener for HTTP server "error" event. 57 | */ 58 | 59 | function onError(error) { 60 | if (error.syscall !== 'listen') { 61 | throw error; 62 | } 63 | 64 | var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; 65 | 66 | // handle specific listen errors with friendly messages 67 | switch (error.code) { 68 | case 'EACCES': 69 | console.error(bind + ' requires elevated privileges'); 70 | process.exit(1); 71 | break; 72 | case 'EADDRINUSE': 73 | console.error(bind + ' is already in use'); 74 | process.exit(1); 75 | break; 76 | default: 77 | throw error; 78 | } 79 | } 80 | 81 | /** 82 | * Event listener for HTTP server "listening" event. 83 | */ 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; 87 | 88 | console.log('Listening on ' + bind); 89 | 90 | //connect to db 91 | connectDatabase(); 92 | } 93 | 94 | /** 95 | * use mongoose to connect to MongoDB Atlas 96 | */ 97 | 98 | function connectDatabase() { 99 | //option object to avoid deprecation warnings 100 | mongoose 101 | .connect(process.env.MONGODB_URI_PRODUCTION, { 102 | useNewUrlParser: true, 103 | useCreateIndex: true, 104 | useUnifiedTopology: true, 105 | }) 106 | .catch((e) => console.error('Connection error :' + e)); 107 | 108 | //check pending connection 109 | //error may not return immediately 110 | const connection = mongoose.connection; 111 | connection.once('open', () => { 112 | console.log('Successfully connected to MongoDB'); 113 | }); 114 | } 115 | -------------------------------------------------------------------------------- /client/build/asset-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "main.css": "/static/css/main.6c657092.css", 4 | "main.js": "/static/js/main.ed45ed54.js", 5 | "static/js/787.59db3541.chunk.js": "/static/js/787.59db3541.chunk.js", 6 | "static/media/roboto-all-500-normal.woff": "/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff", 7 | "static/media/roboto-all-700-normal.woff": "/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff", 8 | "static/media/roboto-all-400-normal.woff": "/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff", 9 | "static/media/roboto-all-300-normal.woff": "/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff", 10 | "static/media/roboto-latin-500-normal.woff2": "/static/media/roboto-latin-500-normal.f25d774ecfe0996f8eb5.woff2", 11 | "static/media/roboto-latin-700-normal.woff2": "/static/media/roboto-latin-700-normal.227c93190fe7f82de3f8.woff2", 12 | "static/media/roboto-latin-400-normal.woff2": "/static/media/roboto-latin-400-normal.b009a76ad6afe4ebd301.woff2", 13 | "static/media/roboto-latin-300-normal.woff2": "/static/media/roboto-latin-300-normal.c48fb6765a9fcb00b330.woff2", 14 | "static/media/roboto-cyrillic-ext-400-normal.woff2": "/static/media/roboto-cyrillic-ext-400-normal.804378952da8a10faae2.woff2", 15 | "static/media/roboto-cyrillic-ext-300-normal.woff2": "/static/media/roboto-cyrillic-ext-300-normal.4777461b144e55145268.woff2", 16 | "static/media/roboto-cyrillic-ext-500-normal.woff2": "/static/media/roboto-cyrillic-ext-500-normal.62ced72e5832f02c2796.woff2", 17 | "static/media/roboto-cyrillic-ext-700-normal.woff2": "/static/media/roboto-cyrillic-ext-700-normal.be4d02458ce53887dc37.woff2", 18 | "static/media/roboto-latin-ext-400-normal.woff2": "/static/media/roboto-latin-ext-400-normal.861b791f9de857a6e7bc.woff2", 19 | "static/media/roboto-latin-ext-700-normal.woff2": "/static/media/roboto-latin-ext-700-normal.ed67ad54b1a8f5d21150.woff2", 20 | "static/media/roboto-latin-ext-500-normal.woff2": "/static/media/roboto-latin-ext-500-normal.9165081d10e1ba601384.woff2", 21 | "static/media/roboto-latin-ext-300-normal.woff2": "/static/media/roboto-latin-ext-300-normal.dc7dcec8e3f654e0ed63.woff2", 22 | "static/media/roboto-cyrillic-500-normal.woff2": "/static/media/roboto-cyrillic-500-normal.cad7d3d9cb265e334e58.woff2", 23 | "static/media/roboto-cyrillic-700-normal.woff2": "/static/media/roboto-cyrillic-700-normal.d010f1f324e111a22e53.woff2", 24 | "static/media/roboto-cyrillic-400-normal.woff2": "/static/media/roboto-cyrillic-400-normal.71a33b6b50457b2c903a.woff2", 25 | "static/media/roboto-cyrillic-300-normal.woff2": "/static/media/roboto-cyrillic-300-normal.1431d1cef06ad04f5458.woff2", 26 | "static/media/roboto-greek-300-normal.woff2": "/static/media/roboto-greek-300-normal.db2632771401f61463fe.woff2", 27 | "static/media/roboto-greek-400-normal.woff2": "/static/media/roboto-greek-400-normal.c35e4c3958e209d17b31.woff2", 28 | "static/media/roboto-greek-500-normal.woff2": "/static/media/roboto-greek-500-normal.9ac81fefbe6c319ea40b.woff2", 29 | "static/media/roboto-greek-700-normal.woff2": "/static/media/roboto-greek-700-normal.50e795c1345353b0e996.woff2", 30 | "static/media/roboto-vietnamese-500-normal.woff2": "/static/media/roboto-vietnamese-500-normal.d8642a3d1d4ef6179644.woff2", 31 | "static/media/roboto-vietnamese-400-normal.woff2": "/static/media/roboto-vietnamese-400-normal.3230f9b040f3c630e0c3.woff2", 32 | "static/media/roboto-vietnamese-700-normal.woff2": "/static/media/roboto-vietnamese-700-normal.3425a701027d0699e369.woff2", 33 | "static/media/roboto-vietnamese-300-normal.woff2": "/static/media/roboto-vietnamese-300-normal.32fc45a3d1e8ea11fabc.woff2", 34 | "static/media/roboto-greek-ext-500-normal.woff2": "/static/media/roboto-greek-ext-500-normal.6fb9cffb1d3e72bf9293.woff2", 35 | "static/media/roboto-greek-ext-400-normal.woff2": "/static/media/roboto-greek-ext-400-normal.169619821ea93019d1bb.woff2", 36 | "static/media/roboto-greek-ext-300-normal.woff2": "/static/media/roboto-greek-ext-300-normal.35b9d6be04b95f0f0530.woff2", 37 | "static/media/roboto-greek-ext-700-normal.woff2": "/static/media/roboto-greek-ext-700-normal.bd9854c751441ccc1a70.woff2", 38 | "index.html": "/index.html", 39 | "main.6c657092.css.map": "/static/css/main.6c657092.css.map", 40 | "main.ed45ed54.js.map": "/static/js/main.ed45ed54.js.map", 41 | "787.59db3541.chunk.js.map": "/static/js/787.59db3541.chunk.js.map" 42 | }, 43 | "entrypoints": [ 44 | "static/css/main.6c657092.css", 45 | "static/js/main.ed45ed54.js" 46 | ] 47 | } -------------------------------------------------------------------------------- /client/build/assets/imgs/bg/error-404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/assets/imgs/bg/error-404.png -------------------------------------------------------------------------------- /client/build/assets/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/build/assets/logoIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | Created with Fabric.js 3.5.0 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /client/build/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/favicon-16x16.png -------------------------------------------------------------------------------- /client/build/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/favicon-32x32.png -------------------------------------------------------------------------------- /client/build/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/favicon.ico -------------------------------------------------------------------------------- /client/build/favicon1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/favicon1.ico -------------------------------------------------------------------------------- /client/build/index.html: -------------------------------------------------------------------------------- 1 | Smart Metrcis Logbook
-------------------------------------------------------------------------------- /client/build/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Smart Metrics Logbook", 3 | "name": "Smart Metrics Logbook", 4 | "icons": [ 5 | { 6 | "src": "./favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /client/build/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /client/build/static/css/main.6c657092.css: -------------------------------------------------------------------------------- 1 | @font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-cyrillic-ext-300-normal.4777461b144e55145268.woff2) format("woff2"),url(/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-cyrillic-300-normal.1431d1cef06ad04f5458.woff2) format("woff2"),url(/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-greek-ext-300-normal.35b9d6be04b95f0f0530.woff2) format("woff2"),url(/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-greek-300-normal.db2632771401f61463fe.woff2) format("woff2"),url(/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-vietnamese-300-normal.32fc45a3d1e8ea11fabc.woff2) format("woff2"),url(/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-latin-ext-300-normal.dc7dcec8e3f654e0ed63.woff2) format("woff2"),url(/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff) format("woff");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-latin-300-normal.c48fb6765a9fcb00b330.woff2) format("woff2"),url(/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-cyrillic-ext-400-normal.804378952da8a10faae2.woff2) format("woff2"),url(/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-cyrillic-400-normal.71a33b6b50457b2c903a.woff2) format("woff2"),url(/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-greek-ext-400-normal.169619821ea93019d1bb.woff2) format("woff2"),url(/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-greek-400-normal.c35e4c3958e209d17b31.woff2) format("woff2"),url(/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-vietnamese-400-normal.3230f9b040f3c630e0c3.woff2) format("woff2"),url(/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-latin-ext-400-normal.861b791f9de857a6e7bc.woff2) format("woff2"),url(/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff) format("woff");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-latin-400-normal.b009a76ad6afe4ebd301.woff2) format("woff2"),url(/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-cyrillic-ext-500-normal.62ced72e5832f02c2796.woff2) format("woff2"),url(/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-cyrillic-500-normal.cad7d3d9cb265e334e58.woff2) format("woff2"),url(/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-greek-ext-500-normal.6fb9cffb1d3e72bf9293.woff2) format("woff2"),url(/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-greek-500-normal.9ac81fefbe6c319ea40b.woff2) format("woff2"),url(/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-vietnamese-500-normal.d8642a3d1d4ef6179644.woff2) format("woff2"),url(/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-latin-ext-500-normal.9165081d10e1ba601384.woff2) format("woff2"),url(/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff) format("woff");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-latin-500-normal.f25d774ecfe0996f8eb5.woff2) format("woff2"),url(/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-cyrillic-ext-700-normal.be4d02458ce53887dc37.woff2) format("woff2"),url(/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-cyrillic-700-normal.d010f1f324e111a22e53.woff2) format("woff2"),url(/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-greek-ext-700-normal.bd9854c751441ccc1a70.woff2) format("woff2"),url(/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-greek-700-normal.50e795c1345353b0e996.woff2) format("woff2"),url(/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-vietnamese-700-normal.3425a701027d0699e369.woff2) format("woff2"),url(/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-latin-ext-700-normal.ed67ad54b1a8f5d21150.woff2) format("woff2"),url(/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff) format("woff");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-latin-700-normal.227c93190fe7f82de3f8.woff2) format("woff2"),url(/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.circles-loader{display:inline-block;height:80px;position:relative;width:80px;z-index:1000}.circles-loader div{-webkit-animation:circles-loader 1.2s cubic-bezier(.5,0,.5,1) infinite;animation:circles-loader 1.2s cubic-bezier(.5,0,.5,1) infinite;-webkit-transform-origin:40px 40px;transform-origin:40px 40px}.circles-loader div:after{background:#797979;border-radius:50%;content:" ";display:block;height:7px;margin:-4px 0 0 -4px;position:absolute;width:7px}.circles-loader div:first-child{-webkit-animation-delay:-36ms;animation-delay:-36ms}.circles-loader div:first-child:after{left:63px;top:63px}.circles-loader div:nth-child(2){-webkit-animation-delay:-72ms;animation-delay:-72ms}.circles-loader div:nth-child(2):after{left:56px;top:68px}.circles-loader div:nth-child(3){-webkit-animation-delay:-.108s;animation-delay:-.108s}.circles-loader div:nth-child(3):after{left:48px;top:71px}.circles-loader div:nth-child(4){-webkit-animation-delay:-.144s;animation-delay:-.144s}.circles-loader div:nth-child(4):after{left:40px;top:72px}.circles-loader div:nth-child(5){-webkit-animation-delay:-.18s;animation-delay:-.18s}.circles-loader div:nth-child(5):after{left:32px;top:71px}.circles-loader div:nth-child(6){-webkit-animation-delay:-.216s;animation-delay:-.216s}.circles-loader div:nth-child(6):after{left:24px;top:68px}.circles-loader div:nth-child(7){-webkit-animation-delay:-.252s;animation-delay:-.252s}.circles-loader div:nth-child(7):after{left:17px;top:63px}.circles-loader div:nth-child(8){-webkit-animation-delay:-.288s;animation-delay:-.288s}.circles-loader div:nth-child(8):after{left:12px;top:56px}@-webkit-keyframes circles-loader{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes circles-loader{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}:root{--toastify-color-light:#fff;--toastify-color-dark:#121212;--toastify-color-info:#3498db;--toastify-color-success:#07bc0c;--toastify-color-warning:#f1c40f;--toastify-color-error:#e74c3c;--toastify-color-transparent:hsla(0,0%,100%,.7);--toastify-icon-color-info:var(--toastify-color-info);--toastify-icon-color-success:var(--toastify-color-success);--toastify-icon-color-warning:var(--toastify-color-warning);--toastify-icon-color-error:var(--toastify-color-error);--toastify-toast-width:320px;--toastify-toast-background:#fff;--toastify-toast-min-height:64px;--toastify-toast-max-height:800px;--toastify-font-family:sans-serif;--toastify-z-index:9999;--toastify-text-color-light:#757575;--toastify-text-color-dark:#fff;--toastify-text-color-info:#fff;--toastify-text-color-success:#fff;--toastify-text-color-warning:#fff;--toastify-text-color-error:#fff;--toastify-spinner-color:#616161;--toastify-spinner-color-empty-area:#e0e0e0;--toastify-color-progress-light:linear-gradient(90deg,#4cd964,#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);--toastify-color-progress-dark:#bb86fc;--toastify-color-progress-info:var(--toastify-color-info);--toastify-color-progress-success:var(--toastify-color-success);--toastify-color-progress-warning:var(--toastify-color-warning);--toastify-color-progress-error:var(--toastify-color-error)}.Toastify__toast-container{box-sizing:border-box;color:#fff;padding:4px;position:fixed;-webkit-transform:translate3d(0,0,9999 px);-webkit-transform:translate3d(0,0,var(--toastify-z-index) px);width:320px;width:var(--toastify-toast-width);z-index:9999;z-index:var(--toastify-z-index)}.Toastify__toast-container--top-left{left:1em;top:1em}.Toastify__toast-container--top-center{left:50%;top:1em;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.Toastify__toast-container--top-right{right:1em;top:1em}.Toastify__toast-container--bottom-left{bottom:1em;left:1em}.Toastify__toast-container--bottom-center{bottom:1em;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.Toastify__toast-container--bottom-right{bottom:1em;right:1em}@media only screen and (max-width:480px){.Toastify__toast-container{left:0;margin:0;padding:0;width:100vw}.Toastify__toast-container--top-center,.Toastify__toast-container--top-left,.Toastify__toast-container--top-right{top:0;-webkit-transform:translateX(0);transform:translateX(0)}.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-right{bottom:0;-webkit-transform:translateX(0);transform:translateX(0)}.Toastify__toast-container--rtl{left:auto;right:0}}.Toastify__toast{border-radius:4px;box-shadow:0 1px 10px 0 rgba(0,0,0,.1),0 2px 15px 0 rgba(0,0,0,.05);box-sizing:border-box;cursor:default;direction:ltr;display:flex;font-family:sans-serif;font-family:var(--toastify-font-family);justify-content:space-between;margin-bottom:1rem;max-height:800px;max-height:var(--toastify-toast-max-height);min-height:64px;min-height:var(--toastify-toast-min-height);overflow:hidden;padding:8px;position:relative;z-index:0}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-body{align-items:center;display:flex;flex:1 1 auto;margin:auto 0;padding:6px}.Toastify__toast-body>div:last-child{flex:1 1;word-break:break-word}.Toastify__toast-icon{-webkit-margin-end:10px;display:flex;flex-shrink:0;margin-inline-end:10px;width:20px}.Toastify--animate{-webkit-animation-duration:.7s;animation-duration:.7s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.Toastify--animate-icon{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@media only screen and (max-width:480px){.Toastify__toast{border-radius:0;margin-bottom:0}}.Toastify__toast-theme--dark{background:#121212;background:var(--toastify-color-dark);color:#fff;color:var(--toastify-text-color-dark)}.Toastify__toast-theme--colored.Toastify__toast--default,.Toastify__toast-theme--light{background:#fff;background:var(--toastify-color-light);color:#757575;color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{background:#3498db;background:var(--toastify-color-info);color:#fff;color:var(--toastify-text-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{background:#07bc0c;background:var(--toastify-color-success);color:#fff;color:var(--toastify-text-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{background:#f1c40f;background:var(--toastify-color-warning);color:#fff;color:var(--toastify-text-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{background:#e74c3c;background:var(--toastify-color-error);color:#fff;color:var(--toastify-text-color-error)}.Toastify__progress-bar-theme--light{background:linear-gradient(90deg,#4cd964,#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:#bb86fc;background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:#3498db;background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:#07bc0c;background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:#f1c40f;background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:#e74c3c;background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning{background:hsla(0,0%,100%,.7);background:var(--toastify-color-transparent)}.Toastify__close-button{align-self:flex-start;background:transparent;border:none;color:#fff;cursor:pointer;opacity:.7;outline:none;padding:0;transition:.3s ease}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:focus,.Toastify__close-button:hover{opacity:1}@-webkit-keyframes Toastify__trackProgress{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}to{-webkit-transform:scaleX(0);transform:scaleX(0)}}@keyframes Toastify__trackProgress{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}to{-webkit-transform:scaleX(0);transform:scaleX(0)}}.Toastify__progress-bar{bottom:0;height:5px;left:0;opacity:.7;position:absolute;-webkit-transform-origin:left;transform-origin:left;width:100%;z-index:9999;z-index:var(--toastify-z-index)}.Toastify__progress-bar--animated{-webkit-animation:Toastify__trackProgress linear 1 forwards;animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.Toastify__progress-bar--rtl{left:auto;right:0;-webkit-transform-origin:right;transform-origin:right}.Toastify__spinner{-webkit-animation:Toastify__spin .65s linear infinite;animation:Toastify__spin .65s linear infinite;border:2px solid #e0e0e0;border-color:var(--toastify-spinner-color-empty-area);border-radius:100%;border-right-color:#616161;border-right-color:var(--toastify-spinner-color);box-sizing:border-box;height:20px;width:20px}@-webkit-keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes Toastify__bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@-webkit-keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@-webkit-keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@-webkit-keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes Toastify__bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--bottom-left,.Toastify__bounce-enter--top-left{-webkit-animation-name:Toastify__bounceInLeft;animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--bottom-right,.Toastify__bounce-enter--top-right{-webkit-animation-name:Toastify__bounceInRight;animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{-webkit-animation-name:Toastify__bounceInDown;animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{-webkit-animation-name:Toastify__bounceInUp;animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--bottom-left,.Toastify__bounce-exit--top-left{-webkit-animation-name:Toastify__bounceOutLeft;animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--bottom-right,.Toastify__bounce-exit--top-right{-webkit-animation-name:Toastify__bounceOutRight;animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{-webkit-animation-name:Toastify__bounceOutUp;animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{-webkit-animation-name:Toastify__bounceOutDown;animation-name:Toastify__bounceOutDown}@-webkit-keyframes Toastify__zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-webkit-keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{-webkit-animation-name:Toastify__zoomIn;animation-name:Toastify__zoomIn}.Toastify__zoom-exit{-webkit-animation-name:Toastify__zoomOut;animation-name:Toastify__zoomOut}@-webkit-keyframes Toastify__flipIn{0%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{opacity:1;-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes Toastify__flipIn{0%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{opacity:1;-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes Toastify__flipOut{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{opacity:1;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}@keyframes Toastify__flipOut{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{opacity:1;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}.Toastify__flip-enter{-webkit-animation-name:Toastify__flipIn;animation-name:Toastify__flipIn}.Toastify__flip-exit{-webkit-animation-name:Toastify__flipOut;animation-name:Toastify__flipOut}@-webkit-keyframes Toastify__slideInRight{0%{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInRight{0%{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInLeft{0%{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInLeft{0%{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInUp{0%{-webkit-transform:translate3d(0,110%,0);transform:translate3d(0,110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInUp{0%{-webkit-transform:translate3d(0,110%,0);transform:translate3d(0,110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInDown{0%{-webkit-transform:translate3d(0,-110%,0);transform:translate3d(0,-110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInDown{0%{-webkit-transform:translate3d(0,-110%,0);transform:translate3d(0,-110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,500px,0);transform:translate3d(0,500px,0);visibility:hidden}}@keyframes Toastify__slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,500px,0);transform:translate3d(0,500px,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,-500px,0);transform:translate3d(0,-500px,0);visibility:hidden}}@keyframes Toastify__slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,-500px,0);transform:translate3d(0,-500px,0);visibility:hidden}}.Toastify__slide-enter--bottom-left,.Toastify__slide-enter--top-left{-webkit-animation-name:Toastify__slideInLeft;animation-name:Toastify__slideInLeft}.Toastify__slide-enter--bottom-right,.Toastify__slide-enter--top-right{-webkit-animation-name:Toastify__slideInRight;animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{-webkit-animation-name:Toastify__slideInDown;animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{-webkit-animation-name:Toastify__slideInUp;animation-name:Toastify__slideInUp}.Toastify__slide-exit--bottom-left,.Toastify__slide-exit--top-left{-webkit-animation-name:Toastify__slideOutLeft;animation-name:Toastify__slideOutLeft}.Toastify__slide-exit--bottom-right,.Toastify__slide-exit--top-right{-webkit-animation-name:Toastify__slideOutRight;animation-name:Toastify__slideOutRight}.Toastify__slide-exit--top-center{-webkit-animation-name:Toastify__slideOutUp;animation-name:Toastify__slideOutUp}.Toastify__slide-exit--bottom-center{-webkit-animation-name:Toastify__slideOutDown;animation-name:Toastify__slideOutDown}@-webkit-keyframes Toastify__spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes Toastify__spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}[data-simplebar]{align-content:flex-start;align-items:flex-start;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;position:relative}.simplebar-wrapper{height:inherit;max-height:inherit;max-width:inherit;overflow:hidden;width:inherit}.simplebar-mask{direction:inherit;height:auto!important;overflow:hidden;width:auto!important;z-index:0}.simplebar-mask,.simplebar-offset{bottom:0;left:0;margin:0;padding:0;position:absolute;right:0;top:0}.simplebar-offset{-webkit-overflow-scrolling:touch;box-sizing:inherit!important;direction:inherit!important;resize:none!important}.simplebar-content-wrapper{-ms-overflow-style:none;box-sizing:border-box!important;direction:inherit;display:block;height:100%;max-height:100%;max-width:100%;overflow:auto;position:relative;scrollbar-width:none;width:auto}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{display:none;height:0;width:0}.simplebar-content:after,.simplebar-content:before{content:" ";display:table}.simplebar-placeholder{max-height:100%;max-width:100%;pointer-events:none;width:100%}.simplebar-height-auto-observer-wrapper{box-sizing:inherit!important;flex-basis:0;flex-grow:inherit;flex-shrink:0;float:left;height:100%;margin:0;max-height:1px;max-width:1px;overflow:hidden;padding:0;pointer-events:none;position:relative;width:100%;z-index:-1}.simplebar-height-auto-observer{box-sizing:inherit;display:block;height:1000%;left:0;min-height:1px;min-width:1px;opacity:0;top:0;width:1000%;z-index:-1}.simplebar-height-auto-observer,.simplebar-track{overflow:hidden;pointer-events:none;position:absolute}.simplebar-track{bottom:0;right:0;z-index:1}[data-simplebar].simplebar-dragging,[data-simplebar].simplebar-dragging .simplebar-content{-webkit-touch-callout:none;pointer-events:none;-webkit-user-select:none;user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{left:0;min-height:10px;position:absolute;right:0}.simplebar-scrollbar:before{background:#000;border-radius:7px;content:"";opacity:0;position:absolute;transition:opacity .2s linear .5s}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;transition-delay:0s;transition-duration:0s}.simplebar-track.simplebar-vertical{top:0;width:11px}.simplebar-scrollbar:before{bottom:2px;left:2px;right:2px;top:2px}.simplebar-track.simplebar-horizontal{height:11px;left:0}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{bottom:0;left:0;min-height:0;min-width:10px;right:auto;top:0;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{left:0;right:auto}.simplebar-dummy-scrollbar-size{-ms-overflow-style:scrollbar!important;direction:rtl;height:500px;opacity:0;overflow-x:scroll;overflow-y:hidden;position:fixed;visibility:hidden;width:500px}.simplebar-dummy-scrollbar-size>div{height:200%;margin:10px 0;width:200%}.simplebar-hide-scrollbar{-ms-overflow-style:none;left:0;overflow-y:scroll;position:fixed;scrollbar-width:none;visibility:hidden}#root{--toastify-font-family:"Poppins",sans-serif;display:flex;flex:1 1 auto;flex-direction:column;font-family:Roboto,Helvetica,Arial,"sans-serif"!important;height:100%;width:100%}::-webkit-scrollbar{height:6px;width:6px}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);border-radius:6px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}::-webkit-scrollbar-track{border-radius:6px}p{font-family:Roboto,Helvetica,Arial,"sans-serif"!important} 2 | /*# sourceMappingURL=main.6c657092.css.map*/ -------------------------------------------------------------------------------- /client/build/static/css/main.6c657092.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"static/css/main.6c657092.css","mappings":"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nB,2EAAiD,CAJjD,qBAAsB,CADtB,WAAY,CADZ,UN6QF,CO1QA,2CACE,kBAJA,uHPkRA,COvQA,GACE,SAAU,CACV,2EPyQF,COvQA,IACE,SAAU,CACV,yEPyQF,COvQA,IACE,uEPyQF,COvQA,IACE,uEPyQF,COvQA,GACE,qCPyQF,CACF,COjSA,mCACE,kBAJA,uHPkRA,COvQA,GACE,SAAU,CACV,2EPyQF,COvQA,IACE,SAAU,CACV,yEPyQF,COvQA,IACE,uEPyQF,COvQA,IACE,uEPyQF,COvQA,GACE,qCPyQF,CACF,COtQA,4CACE,IACE,SAAU,CACV,yEPwQF,COtQA,GACE,SAAU,CACV,2EPwQF,CACF,COhRA,oCACE,IACE,SAAU,CACV,yEPwQF,COtQA,GACE,SAAU,CACV,2EPwQF,CACF,COrQA,0CACE,kBA1CA,uHPkTA,COjQA,GACE,SAAU,CACV,6EPmQF,COjQA,IACE,SAAU,CACV,uEPmQF,COjQA,IACE,yEPmQF,COjQA,IACE,qEPmQF,COjQA,GACE,qCPmQF,CACF,CO3RA,kCACE,kBA1CA,uHPkTA,COjQA,GACE,SAAU,CACV,6EPmQF,COjQA,IACE,SAAU,CACV,uEPmQF,COjQA,IACE,yEPmQF,COjQA,IACE,qEPmQF,COjQA,GACE,qCPmQF,CACF,COhQA,2CACE,IACE,SAAU,CACV,uEPkQF,COhQA,GACE,SAAU,CACV,6EPkQF,CACF,CO1QA,mCACE,IACE,SAAU,CACV,uEPkQF,COhQA,GACE,SAAU,CACV,6EPkQF,CACF,CO/PA,wCACE,kBAhFA,uHPkVA,CO3PA,GACE,SAAU,CACV,2EP6PF,CO3PA,IACE,SAAU,CACV,yEP6PF,CO3PA,IACE,uEP6PF,CO3PA,IACE,uEP6PF,CO3PA,GACE,uDP6PF,CACF,COrRA,gCACE,kBAhFA,uHPkVA,CO3PA,GACE,SAAU,CACV,2EP6PF,CO3PA,IACE,SAAU,CACV,yEP6PF,CO3PA,IACE,uEP6PF,CO3PA,IACE,uEP6PF,CO3PA,GACE,uDP6PF,CACF,CO1PA,yCACE,IACE,yEP4PF,CO1PA,QAEE,SAAU,CAC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","sources":["../node_modules/@fontsource/roboto/300.css","../node_modules/@fontsource/roboto/400.css","../node_modules/@fontsource/roboto/500.css","../node_modules/@fontsource/roboto/700.css","components/loader/CirclesLoader.scss","../node_modules/react-toastify/scss/_variables.scss","../node_modules/react-toastify/dist/ReactToastify.css","../node_modules/react-toastify/scss/_toastContainer.scss","../node_modules/react-toastify/scss/_toast.scss","../node_modules/react-toastify/scss/_theme.scss","../node_modules/react-toastify/scss/_closeButton.scss","../node_modules/react-toastify/scss/_progressBar.scss","../node_modules/react-toastify/scss/_icons.scss","../node_modules/react-toastify/scss/animations/_bounce.scss","../node_modules/react-toastify/scss/animations/_zoom.scss","../node_modules/react-toastify/scss/animations/_flip.scss","../node_modules/react-toastify/scss/animations/_slide.scss","../node_modules/react-toastify/scss/animations/_spin.scss","../node_modules/simplebar-react/dist/simplebar.min.css","styles/index.scss"],"sourcesContent":["/* roboto-cyrillic-ext-300-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url('./files/roboto-cyrillic-ext-300-normal.woff2') format('woff2'), url('./files/roboto-all-300-normal.woff') format('woff');\n unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;\n}\n/* roboto-cyrillic-300-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url('./files/roboto-cyrillic-300-normal.woff2') format('woff2'), url('./files/roboto-all-300-normal.woff') format('woff');\n unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;\n}\n/* roboto-greek-ext-300-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url('./files/roboto-greek-ext-300-normal.woff2') format('woff2'), url('./files/roboto-all-300-normal.woff') format('woff');\n unicode-range: U+1F00-1FFF;\n}\n/* roboto-greek-300-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url('./files/roboto-greek-300-normal.woff2') format('woff2'), url('./files/roboto-all-300-normal.woff') format('woff');\n unicode-range: U+0370-03FF;\n}\n/* roboto-vietnamese-300-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url('./files/roboto-vietnamese-300-normal.woff2') format('woff2'), url('./files/roboto-all-300-normal.woff') format('woff');\n unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;\n}\n/* roboto-latin-ext-300-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url('./files/roboto-latin-ext-300-normal.woff2') format('woff2'), url('./files/roboto-all-300-normal.woff') format('woff');\n unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n/* roboto-latin-300-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url('./files/roboto-latin-300-normal.woff2') format('woff2'), url('./files/roboto-all-300-normal.woff') format('woff');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}\n","/* roboto-cyrillic-ext-400-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url('./files/roboto-cyrillic-ext-400-normal.woff2') format('woff2'), url('./files/roboto-all-400-normal.woff') format('woff');\n unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;\n}\n/* roboto-cyrillic-400-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url('./files/roboto-cyrillic-400-normal.woff2') format('woff2'), url('./files/roboto-all-400-normal.woff') format('woff');\n unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;\n}\n/* roboto-greek-ext-400-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url('./files/roboto-greek-ext-400-normal.woff2') format('woff2'), url('./files/roboto-all-400-normal.woff') format('woff');\n unicode-range: U+1F00-1FFF;\n}\n/* roboto-greek-400-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url('./files/roboto-greek-400-normal.woff2') format('woff2'), url('./files/roboto-all-400-normal.woff') format('woff');\n unicode-range: U+0370-03FF;\n}\n/* roboto-vietnamese-400-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url('./files/roboto-vietnamese-400-normal.woff2') format('woff2'), url('./files/roboto-all-400-normal.woff') format('woff');\n unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;\n}\n/* roboto-latin-ext-400-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url('./files/roboto-latin-ext-400-normal.woff2') format('woff2'), url('./files/roboto-all-400-normal.woff') format('woff');\n unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n/* roboto-latin-400-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url('./files/roboto-latin-400-normal.woff2') format('woff2'), url('./files/roboto-all-400-normal.woff') format('woff');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}\n","/* roboto-cyrillic-ext-500-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url('./files/roboto-cyrillic-ext-500-normal.woff2') format('woff2'), url('./files/roboto-all-500-normal.woff') format('woff');\n unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;\n}\n/* roboto-cyrillic-500-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url('./files/roboto-cyrillic-500-normal.woff2') format('woff2'), url('./files/roboto-all-500-normal.woff') format('woff');\n unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;\n}\n/* roboto-greek-ext-500-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url('./files/roboto-greek-ext-500-normal.woff2') format('woff2'), url('./files/roboto-all-500-normal.woff') format('woff');\n unicode-range: U+1F00-1FFF;\n}\n/* roboto-greek-500-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url('./files/roboto-greek-500-normal.woff2') format('woff2'), url('./files/roboto-all-500-normal.woff') format('woff');\n unicode-range: U+0370-03FF;\n}\n/* roboto-vietnamese-500-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url('./files/roboto-vietnamese-500-normal.woff2') format('woff2'), url('./files/roboto-all-500-normal.woff') format('woff');\n unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;\n}\n/* roboto-latin-ext-500-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url('./files/roboto-latin-ext-500-normal.woff2') format('woff2'), url('./files/roboto-all-500-normal.woff') format('woff');\n unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n/* roboto-latin-500-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url('./files/roboto-latin-500-normal.woff2') format('woff2'), url('./files/roboto-all-500-normal.woff') format('woff');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}\n","/* roboto-cyrillic-ext-700-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url('./files/roboto-cyrillic-ext-700-normal.woff2') format('woff2'), url('./files/roboto-all-700-normal.woff') format('woff');\n unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;\n}\n/* roboto-cyrillic-700-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url('./files/roboto-cyrillic-700-normal.woff2') format('woff2'), url('./files/roboto-all-700-normal.woff') format('woff');\n unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;\n}\n/* roboto-greek-ext-700-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url('./files/roboto-greek-ext-700-normal.woff2') format('woff2'), url('./files/roboto-all-700-normal.woff') format('woff');\n unicode-range: U+1F00-1FFF;\n}\n/* roboto-greek-700-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url('./files/roboto-greek-700-normal.woff2') format('woff2'), url('./files/roboto-all-700-normal.woff') format('woff');\n unicode-range: U+0370-03FF;\n}\n/* roboto-vietnamese-700-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url('./files/roboto-vietnamese-700-normal.woff2') format('woff2'), url('./files/roboto-all-700-normal.woff') format('woff');\n unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;\n}\n/* roboto-latin-ext-700-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url('./files/roboto-latin-ext-700-normal.woff2') format('woff2'), url('./files/roboto-all-700-normal.woff') format('woff');\n unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n/* roboto-latin-700-normal*/\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url('./files/roboto-latin-700-normal.woff2') format('woff2'), url('./files/roboto-all-700-normal.woff') format('woff');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}\n",".circles-loader {\r\n display: inline-block;\r\n position: relative;\r\n width: 80px;\r\n height: 80px;\r\n z-index: 1000;\r\n}\r\n.circles-loader div {\r\n animation: circles-loader 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\r\n transform-origin: 40px 40px;\r\n}\r\n.circles-loader div:after {\r\n content: \" \";\r\n display: block;\r\n position: absolute;\r\n width: 7px;\r\n height: 7px;\r\n border-radius: 50%;\r\n background: #797979;\r\n margin: -4px 0 0 -4px;\r\n}\r\n.circles-loader div:nth-child(1) {\r\n animation-delay: -0.036s;\r\n}\r\n.circles-loader div:nth-child(1):after {\r\n top: 63px;\r\n left: 63px;\r\n}\r\n.circles-loader div:nth-child(2) {\r\n animation-delay: -0.072s;\r\n}\r\n.circles-loader div:nth-child(2):after {\r\n top: 68px;\r\n left: 56px;\r\n}\r\n.circles-loader div:nth-child(3) {\r\n animation-delay: -0.108s;\r\n}\r\n.circles-loader div:nth-child(3):after {\r\n top: 71px;\r\n left: 48px;\r\n}\r\n.circles-loader div:nth-child(4) {\r\n animation-delay: -0.144s;\r\n}\r\n.circles-loader div:nth-child(4):after {\r\n top: 72px;\r\n left: 40px;\r\n}\r\n.circles-loader div:nth-child(5) {\r\n animation-delay: -0.18s;\r\n}\r\n.circles-loader div:nth-child(5):after {\r\n top: 71px;\r\n left: 32px;\r\n}\r\n.circles-loader div:nth-child(6) {\r\n animation-delay: -0.216s;\r\n}\r\n.circles-loader div:nth-child(6):after {\r\n top: 68px;\r\n left: 24px;\r\n}\r\n.circles-loader div:nth-child(7) {\r\n animation-delay: -0.252s;\r\n}\r\n.circles-loader div:nth-child(7):after {\r\n top: 63px;\r\n left: 17px;\r\n}\r\n.circles-loader div:nth-child(8) {\r\n animation-delay: -0.288s;\r\n}\r\n.circles-loader div:nth-child(8):after {\r\n top: 56px;\r\n left: 12px;\r\n}\r\n@keyframes circles-loader {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n","$rt-namespace: 'Toastify';\n$rt-mobile: 'only screen and (max-width : 480px)' !default;\n\n:root {\n --toastify-color-light: #fff;\n --toastify-color-dark: #121212;\n --toastify-color-info: #3498db;\n --toastify-color-success: #07bc0c;\n --toastify-color-warning: #f1c40f;\n --toastify-color-error: #e74c3c;\n --toastify-color-transparent: rgba(255, 255, 255, 0.7);\n\n --toastify-icon-color-info: var(--toastify-color-info);\n --toastify-icon-color-success: var(--toastify-color-success);\n --toastify-icon-color-warning: var(--toastify-color-warning);\n --toastify-icon-color-error: var(--toastify-color-error);\n\n --toastify-toast-width: 320px;\n --toastify-toast-background: #fff;\n --toastify-toast-min-height: 64px;\n --toastify-toast-max-height: 800px;\n --toastify-font-family: sans-serif;\n --toastify-z-index: 9999;\n\n --toastify-text-color-light: #757575;\n --toastify-text-color-dark: #fff;\n\n //Used only for colored theme\n --toastify-text-color-info: #fff;\n --toastify-text-color-success: #fff;\n --toastify-text-color-warning: #fff;\n --toastify-text-color-error: #fff;\n\n --toastify-spinner-color: #616161;\n --toastify-spinner-color-empty-area: #e0e0e0;\n\n // Used when no type is provided\n --toastify-color-progress-light: linear-gradient(\n to right,\n #4cd964,\n #5ac8fa,\n #007aff,\n #34aadc,\n #5856d6,\n #ff2d55\n );\n // Used when no type is provided\n --toastify-color-progress-dark: #bb86fc;\n --toastify-color-progress-info: var(--toastify-color-info);\n --toastify-color-progress-success: var(--toastify-color-success);\n --toastify-color-progress-warning: var(--toastify-color-warning);\n --toastify-color-progress-error: var(--toastify-color-error);\n}\n",":root {\n --toastify-color-light: #fff;\n --toastify-color-dark: #121212;\n --toastify-color-info: #3498db;\n --toastify-color-success: #07bc0c;\n --toastify-color-warning: #f1c40f;\n --toastify-color-error: #e74c3c;\n --toastify-color-transparent: rgba(255, 255, 255, 0.7);\n --toastify-icon-color-info: var(--toastify-color-info);\n --toastify-icon-color-success: var(--toastify-color-success);\n --toastify-icon-color-warning: var(--toastify-color-warning);\n --toastify-icon-color-error: var(--toastify-color-error);\n --toastify-toast-width: 320px;\n --toastify-toast-background: #fff;\n --toastify-toast-min-height: 64px;\n --toastify-toast-max-height: 800px;\n --toastify-font-family: sans-serif;\n --toastify-z-index: 9999;\n --toastify-text-color-light: #757575;\n --toastify-text-color-dark: #fff;\n --toastify-text-color-info: #fff;\n --toastify-text-color-success: #fff;\n --toastify-text-color-warning: #fff;\n --toastify-text-color-error: #fff;\n --toastify-spinner-color: #616161;\n --toastify-spinner-color-empty-area: #e0e0e0;\n --toastify-color-progress-light: linear-gradient(\n to right,\n #4cd964,\n #5ac8fa,\n #007aff,\n #34aadc,\n #5856d6,\n #ff2d55\n );\n --toastify-color-progress-dark: #bb86fc;\n --toastify-color-progress-info: var(--toastify-color-info);\n --toastify-color-progress-success: var(--toastify-color-success);\n --toastify-color-progress-warning: var(--toastify-color-warning);\n --toastify-color-progress-error: var(--toastify-color-error);\n}\n\n.Toastify__toast-container {\n z-index: var(--toastify-z-index);\n -webkit-transform: translate3d(0, 0, var(--toastify-z-index) px);\n position: fixed;\n padding: 4px;\n width: var(--toastify-toast-width);\n box-sizing: border-box;\n color: #fff;\n}\n.Toastify__toast-container--top-left {\n top: 1em;\n left: 1em;\n}\n.Toastify__toast-container--top-center {\n top: 1em;\n left: 50%;\n transform: translateX(-50%);\n}\n.Toastify__toast-container--top-right {\n top: 1em;\n right: 1em;\n}\n.Toastify__toast-container--bottom-left {\n bottom: 1em;\n left: 1em;\n}\n.Toastify__toast-container--bottom-center {\n bottom: 1em;\n left: 50%;\n transform: translateX(-50%);\n}\n.Toastify__toast-container--bottom-right {\n bottom: 1em;\n right: 1em;\n}\n\n@media only screen and (max-width : 480px) {\n .Toastify__toast-container {\n width: 100vw;\n padding: 0;\n left: 0;\n margin: 0;\n }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .Toastify__toast-container--top-right {\n top: 0;\n transform: translateX(0);\n }\n .Toastify__toast-container--bottom-left, .Toastify__toast-container--bottom-center, .Toastify__toast-container--bottom-right {\n bottom: 0;\n transform: translateX(0);\n }\n .Toastify__toast-container--rtl {\n right: 0;\n left: initial;\n }\n}\n.Toastify__toast {\n position: relative;\n min-height: var(--toastify-toast-min-height);\n box-sizing: border-box;\n margin-bottom: 1rem;\n padding: 8px;\n border-radius: 4px;\n box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.1), 0 2px 15px 0 rgba(0, 0, 0, 0.05);\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: justify;\n justify-content: space-between;\n max-height: var(--toastify-toast-max-height);\n overflow: hidden;\n font-family: var(--toastify-font-family);\n cursor: default;\n direction: ltr;\n /* webkit only issue #791 */\n z-index: 0;\n}\n.Toastify__toast--rtl {\n direction: rtl;\n}\n.Toastify__toast--close-on-click {\n cursor: pointer;\n}\n.Toastify__toast-body {\n margin: auto 0;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 6px;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n.Toastify__toast-body > div:last-child {\n word-break: break-word;\n -ms-flex: 1;\n flex: 1;\n}\n.Toastify__toast-icon {\n -webkit-margin-end: 10px;\n margin-inline-end: 10px;\n width: 20px;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n display: -ms-flexbox;\n display: flex;\n}\n\n.Toastify--animate {\n animation-fill-mode: both;\n animation-duration: 0.7s;\n}\n\n.Toastify--animate-icon {\n animation-fill-mode: both;\n animation-duration: 0.3s;\n}\n\n@media only screen and (max-width : 480px) {\n .Toastify__toast {\n margin-bottom: 0;\n border-radius: 0;\n }\n}\n.Toastify__toast-theme--dark {\n background: var(--toastify-color-dark);\n color: var(--toastify-text-color-dark);\n}\n.Toastify__toast-theme--light {\n background: var(--toastify-color-light);\n color: var(--toastify-text-color-light);\n}\n.Toastify__toast-theme--colored.Toastify__toast--default {\n background: var(--toastify-color-light);\n color: var(--toastify-text-color-light);\n}\n.Toastify__toast-theme--colored.Toastify__toast--info {\n color: var(--toastify-text-color-info);\n background: var(--toastify-color-info);\n}\n.Toastify__toast-theme--colored.Toastify__toast--success {\n color: var(--toastify-text-color-success);\n background: var(--toastify-color-success);\n}\n.Toastify__toast-theme--colored.Toastify__toast--warning {\n color: var(--toastify-text-color-warning);\n background: var(--toastify-color-warning);\n}\n.Toastify__toast-theme--colored.Toastify__toast--error {\n color: var(--toastify-text-color-error);\n background: var(--toastify-color-error);\n}\n\n.Toastify__progress-bar-theme--light {\n background: var(--toastify-color-progress-light);\n}\n.Toastify__progress-bar-theme--dark {\n background: var(--toastify-color-progress-dark);\n}\n.Toastify__progress-bar--info {\n background: var(--toastify-color-progress-info);\n}\n.Toastify__progress-bar--success {\n background: var(--toastify-color-progress-success);\n}\n.Toastify__progress-bar--warning {\n background: var(--toastify-color-progress-warning);\n}\n.Toastify__progress-bar--error {\n background: var(--toastify-color-progress-error);\n}\n.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--success, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--error {\n background: var(--toastify-color-transparent);\n}\n\n.Toastify__close-button {\n color: #fff;\n background: transparent;\n outline: none;\n border: none;\n padding: 0;\n cursor: pointer;\n opacity: 0.7;\n transition: 0.3s ease;\n -ms-flex-item-align: start;\n align-self: flex-start;\n}\n.Toastify__close-button--light {\n color: #000;\n opacity: 0.3;\n}\n.Toastify__close-button > svg {\n fill: currentColor;\n height: 16px;\n width: 14px;\n}\n.Toastify__close-button:hover, .Toastify__close-button:focus {\n opacity: 1;\n}\n\n@keyframes Toastify__trackProgress {\n 0% {\n transform: scaleX(1);\n }\n 100% {\n transform: scaleX(0);\n }\n}\n.Toastify__progress-bar {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 5px;\n z-index: var(--toastify-z-index);\n opacity: 0.7;\n transform-origin: left;\n}\n.Toastify__progress-bar--animated {\n animation: Toastify__trackProgress linear 1 forwards;\n}\n.Toastify__progress-bar--controlled {\n transition: transform 0.2s;\n}\n.Toastify__progress-bar--rtl {\n right: 0;\n left: initial;\n transform-origin: right;\n}\n\n.Toastify__spinner {\n width: 20px;\n height: 20px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: var(--toastify-spinner-color-empty-area);\n border-right-color: var(--toastify-spinner-color);\n animation: Toastify__spin 0.65s linear infinite;\n}\n\n@keyframes Toastify__bounceInRight {\n from, 60%, 75%, 90%, to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n from {\n opacity: 0;\n transform: translate3d(3000px, 0, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(-25px, 0, 0);\n }\n 75% {\n transform: translate3d(10px, 0, 0);\n }\n 90% {\n transform: translate3d(-5px, 0, 0);\n }\n to {\n transform: none;\n }\n}\n@keyframes Toastify__bounceOutRight {\n 20% {\n opacity: 1;\n transform: translate3d(-20px, 0, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(2000px, 0, 0);\n }\n}\n@keyframes Toastify__bounceInLeft {\n from, 60%, 75%, 90%, to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n 0% {\n opacity: 0;\n transform: translate3d(-3000px, 0, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(25px, 0, 0);\n }\n 75% {\n transform: translate3d(-10px, 0, 0);\n }\n 90% {\n transform: translate3d(5px, 0, 0);\n }\n to {\n transform: none;\n }\n}\n@keyframes Toastify__bounceOutLeft {\n 20% {\n opacity: 1;\n transform: translate3d(20px, 0, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(-2000px, 0, 0);\n }\n}\n@keyframes Toastify__bounceInUp {\n from, 60%, 75%, 90%, to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n from {\n opacity: 0;\n transform: translate3d(0, 3000px, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(0, -20px, 0);\n }\n 75% {\n transform: translate3d(0, 10px, 0);\n }\n 90% {\n transform: translate3d(0, -5px, 0);\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__bounceOutUp {\n 20% {\n transform: translate3d(0, -10px, 0);\n }\n 40%, 45% {\n opacity: 1;\n transform: translate3d(0, 20px, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(0, -2000px, 0);\n }\n}\n@keyframes Toastify__bounceInDown {\n from, 60%, 75%, 90%, to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n 0% {\n opacity: 0;\n transform: translate3d(0, -3000px, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(0, 25px, 0);\n }\n 75% {\n transform: translate3d(0, -10px, 0);\n }\n 90% {\n transform: translate3d(0, 5px, 0);\n }\n to {\n transform: none;\n }\n}\n@keyframes Toastify__bounceOutDown {\n 20% {\n transform: translate3d(0, 10px, 0);\n }\n 40%, 45% {\n opacity: 1;\n transform: translate3d(0, -20px, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(0, 2000px, 0);\n }\n}\n.Toastify__bounce-enter--top-left, .Toastify__bounce-enter--bottom-left {\n animation-name: Toastify__bounceInLeft;\n}\n.Toastify__bounce-enter--top-right, .Toastify__bounce-enter--bottom-right {\n animation-name: Toastify__bounceInRight;\n}\n.Toastify__bounce-enter--top-center {\n animation-name: Toastify__bounceInDown;\n}\n.Toastify__bounce-enter--bottom-center {\n animation-name: Toastify__bounceInUp;\n}\n\n.Toastify__bounce-exit--top-left, .Toastify__bounce-exit--bottom-left {\n animation-name: Toastify__bounceOutLeft;\n}\n.Toastify__bounce-exit--top-right, .Toastify__bounce-exit--bottom-right {\n animation-name: Toastify__bounceOutRight;\n}\n.Toastify__bounce-exit--top-center {\n animation-name: Toastify__bounceOutUp;\n}\n.Toastify__bounce-exit--bottom-center {\n animation-name: Toastify__bounceOutDown;\n}\n\n@keyframes Toastify__zoomIn {\n from {\n opacity: 0;\n transform: scale3d(0.3, 0.3, 0.3);\n }\n 50% {\n opacity: 1;\n }\n}\n@keyframes Toastify__zoomOut {\n from {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n transform: scale3d(0.3, 0.3, 0.3);\n }\n to {\n opacity: 0;\n }\n}\n.Toastify__zoom-enter {\n animation-name: Toastify__zoomIn;\n}\n\n.Toastify__zoom-exit {\n animation-name: Toastify__zoomOut;\n}\n\n@keyframes Toastify__flipIn {\n from {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n animation-timing-function: ease-in;\n opacity: 0;\n }\n 40% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n animation-timing-function: ease-in;\n }\n 60% {\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n 80% {\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n to {\n transform: perspective(400px);\n }\n}\n@keyframes Toastify__flipOut {\n from {\n transform: perspective(400px);\n }\n 30% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n to {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n.Toastify__flip-enter {\n animation-name: Toastify__flipIn;\n}\n\n.Toastify__flip-exit {\n animation-name: Toastify__flipOut;\n}\n\n@keyframes Toastify__slideInRight {\n from {\n transform: translate3d(110%, 0, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__slideInLeft {\n from {\n transform: translate3d(-110%, 0, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__slideInUp {\n from {\n transform: translate3d(0, 110%, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__slideInDown {\n from {\n transform: translate3d(0, -110%, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__slideOutRight {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n visibility: hidden;\n transform: translate3d(110%, 0, 0);\n }\n}\n@keyframes Toastify__slideOutLeft {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n visibility: hidden;\n transform: translate3d(-110%, 0, 0);\n }\n}\n@keyframes Toastify__slideOutDown {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n visibility: hidden;\n transform: translate3d(0, 500px, 0);\n }\n}\n@keyframes Toastify__slideOutUp {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n visibility: hidden;\n transform: translate3d(0, -500px, 0);\n }\n}\n.Toastify__slide-enter--top-left, .Toastify__slide-enter--bottom-left {\n animation-name: Toastify__slideInLeft;\n}\n.Toastify__slide-enter--top-right, .Toastify__slide-enter--bottom-right {\n animation-name: Toastify__slideInRight;\n}\n.Toastify__slide-enter--top-center {\n animation-name: Toastify__slideInDown;\n}\n.Toastify__slide-enter--bottom-center {\n animation-name: Toastify__slideInUp;\n}\n\n.Toastify__slide-exit--top-left, .Toastify__slide-exit--bottom-left {\n animation-name: Toastify__slideOutLeft;\n}\n.Toastify__slide-exit--top-right, .Toastify__slide-exit--bottom-right {\n animation-name: Toastify__slideOutRight;\n}\n.Toastify__slide-exit--top-center {\n animation-name: Toastify__slideOutUp;\n}\n.Toastify__slide-exit--bottom-center {\n animation-name: Toastify__slideOutDown;\n}\n\n@keyframes Toastify__spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/*# sourceMappingURL=ReactToastify.css.map */",".#{$rt-namespace}__toast-container {\n z-index: var(--toastify-z-index);\n -webkit-transform: translate3d(0, 0, var(--toastify-z-index) px);\n position: fixed;\n padding: 4px;\n width: var(--toastify-toast-width);\n box-sizing: border-box;\n color: #fff;\n &--top-left {\n top: 1em;\n left: 1em;\n }\n &--top-center {\n top: 1em;\n left: 50%;\n transform: translateX(-50%);\n }\n &--top-right {\n top: 1em;\n right: 1em;\n }\n &--bottom-left {\n bottom: 1em;\n left: 1em;\n }\n &--bottom-center {\n bottom: 1em;\n left: 50%;\n transform: translateX(-50%);\n }\n &--bottom-right {\n bottom: 1em;\n right: 1em;\n }\n}\n\n@media #{$rt-mobile} {\n .#{$rt-namespace}__toast-container {\n width: 100vw;\n padding: 0;\n left: 0;\n margin: 0;\n &--top-left,\n &--top-center,\n &--top-right {\n top: 0;\n transform: translateX(0);\n }\n &--bottom-left,\n &--bottom-center,\n &--bottom-right {\n bottom: 0;\n transform: translateX(0);\n }\n &--rtl {\n right: 0;\n left: initial;\n }\n }\n}\n",".#{$rt-namespace}__toast {\n position: relative;\n min-height: var(--toastify-toast-min-height);\n box-sizing: border-box;\n margin-bottom: 1rem;\n padding: 8px;\n border-radius: 4px;\n box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.1), 0 2px 15px 0 rgba(0, 0, 0, 0.05);\n display: flex;\n justify-content: space-between;\n max-height: var(--toastify-toast-max-height);\n overflow: hidden;\n font-family: var(--toastify-font-family);\n cursor: default;\n direction: ltr;\n /* webkit only issue #791 */\n z-index: 0;\n &--rtl {\n direction: rtl;\n }\n &--close-on-click {\n cursor: pointer;\n }\n &-body {\n margin: auto 0;\n flex: 1 1 auto;\n padding: 6px;\n display: flex;\n align-items: center;\n & > div:last-child {\n word-break: break-word;\n flex: 1;\n }\n }\n &-icon {\n margin-inline-end: 10px;\n width: 20px;\n flex-shrink: 0;\n display: flex;\n }\n}\n\n.#{$rt-namespace}--animate {\n animation-fill-mode: both;\n animation-duration: 0.7s;\n}\n\n.#{$rt-namespace}--animate-icon {\n animation-fill-mode: both;\n animation-duration: 0.3s;\n}\n\n@media #{$rt-mobile} {\n .#{$rt-namespace}__toast {\n margin-bottom: 0;\n border-radius: 0;\n }\n}\n",".#{$rt-namespace}__toast {\n &-theme--dark {\n background: var(--toastify-color-dark);\n color: var(--toastify-text-color-dark);\n }\n &-theme--light {\n background: var(--toastify-color-light);\n color: var(--toastify-text-color-light);\n }\n &-theme--colored#{&}--default {\n background: var(--toastify-color-light);\n color: var(--toastify-text-color-light);\n }\n &-theme--colored#{&}--info {\n color: var(--toastify-text-color-info);\n background: var(--toastify-color-info);\n }\n &-theme--colored#{&}--success {\n color: var(--toastify-text-color-success);\n background: var(--toastify-color-success);\n }\n &-theme--colored#{&}--warning {\n color: var(--toastify-text-color-warning);\n background: var(--toastify-color-warning);\n }\n &-theme--colored#{&}--error {\n color: var(--toastify-text-color-error);\n background: var(--toastify-color-error);\n }\n}\n\n.#{$rt-namespace}__progress-bar {\n &-theme--light {\n background: var(--toastify-color-progress-light);\n }\n &-theme--dark {\n background: var(--toastify-color-progress-dark);\n }\n &--info {\n background: var(--toastify-color-progress-info);\n }\n &--success {\n background: var(--toastify-color-progress-success);\n }\n &--warning {\n background: var(--toastify-color-progress-warning);\n }\n &--error {\n background: var(--toastify-color-progress-error);\n }\n &-theme--colored#{&}--info,\n &-theme--colored#{&}--success,\n &-theme--colored#{&}--warning,\n &-theme--colored#{&}--error {\n background: var(--toastify-color-transparent);\n }\n}\n",".#{$rt-namespace}__close-button {\n color: #fff;\n background: transparent;\n outline: none;\n border: none;\n padding: 0;\n cursor: pointer;\n opacity: 0.7;\n transition: 0.3s ease;\n align-self: flex-start;\n\n &--light {\n color: #000;\n opacity: 0.3;\n }\n\n & > svg {\n fill: currentColor;\n height: 16px;\n width: 14px;\n }\n\n &:hover,\n &:focus {\n opacity: 1;\n }\n}\n","@keyframes #{$rt-namespace}__trackProgress {\n 0% {\n transform: scaleX(1);\n }\n 100% {\n transform: scaleX(0);\n }\n}\n\n.#{$rt-namespace}__progress-bar {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 5px;\n z-index: var(--toastify-z-index);\n opacity: 0.7;\n transform-origin: left;\n\n &--animated {\n animation: #{$rt-namespace}__trackProgress linear 1 forwards;\n }\n\n &--controlled {\n transition: transform 0.2s;\n }\n\n &--rtl {\n right: 0;\n left: initial;\n transform-origin: right;\n }\n}\n",".#{$rt-namespace}__spinner {\n width: 20px;\n height: 20px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: var(--toastify-spinner-color-empty-area);\n border-right-color: var(--toastify-spinner-color);\n animation: #{$rt-namespace}__spin 0.65s linear infinite;\n}\n","@mixin timing-function {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes #{$rt-namespace}__bounceInRight {\n from,\n 60%,\n 75%,\n 90%,\n to {\n @include timing-function;\n }\n from {\n opacity: 0;\n transform: translate3d(3000px, 0, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(-25px, 0, 0);\n }\n 75% {\n transform: translate3d(10px, 0, 0);\n }\n 90% {\n transform: translate3d(-5px, 0, 0);\n }\n to {\n transform: none;\n }\n}\n\n@keyframes #{$rt-namespace}__bounceOutRight {\n 20% {\n opacity: 1;\n transform: translate3d(-20px, 0, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__bounceInLeft {\n from,\n 60%,\n 75%,\n 90%,\n to {\n @include timing-function;\n }\n 0% {\n opacity: 0;\n transform: translate3d(-3000px, 0, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(25px, 0, 0);\n }\n 75% {\n transform: translate3d(-10px, 0, 0);\n }\n 90% {\n transform: translate3d(5px, 0, 0);\n }\n to {\n transform: none;\n }\n}\n\n@keyframes #{$rt-namespace}__bounceOutLeft {\n 20% {\n opacity: 1;\n transform: translate3d(20px, 0, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__bounceInUp {\n from,\n 60%,\n 75%,\n 90%,\n to {\n @include timing-function;\n }\n from {\n opacity: 0;\n transform: translate3d(0, 3000px, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(0, -20px, 0);\n }\n 75% {\n transform: translate3d(0, 10px, 0);\n }\n 90% {\n transform: translate3d(0, -5px, 0);\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__bounceOutUp {\n 20% {\n transform: translate3d(0, -10px, 0);\n }\n 40%,\n 45% {\n opacity: 1;\n transform: translate3d(0, 20px, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__bounceInDown {\n from,\n 60%,\n 75%,\n 90%,\n to {\n @include timing-function;\n }\n 0% {\n opacity: 0;\n transform: translate3d(0, -3000px, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(0, 25px, 0);\n }\n 75% {\n transform: translate3d(0, -10px, 0);\n }\n 90% {\n transform: translate3d(0, 5px, 0);\n }\n to {\n transform: none;\n }\n}\n\n@keyframes #{$rt-namespace}__bounceOutDown {\n 20% {\n transform: translate3d(0, 10px, 0);\n }\n 40%,\n 45% {\n opacity: 1;\n transform: translate3d(0, -20px, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n.#{$rt-namespace}__bounce-enter {\n &--top-left,\n &--bottom-left {\n animation-name: #{$rt-namespace}__bounceInLeft;\n }\n &--top-right,\n &--bottom-right {\n animation-name: #{$rt-namespace}__bounceInRight;\n }\n &--top-center {\n animation-name: #{$rt-namespace}__bounceInDown;\n }\n &--bottom-center {\n animation-name: #{$rt-namespace}__bounceInUp;\n }\n}\n\n.#{$rt-namespace}__bounce-exit {\n &--top-left,\n &--bottom-left {\n animation-name: #{$rt-namespace}__bounceOutLeft;\n }\n &--top-right,\n &--bottom-right {\n animation-name: #{$rt-namespace}__bounceOutRight;\n }\n &--top-center {\n animation-name: #{$rt-namespace}__bounceOutUp;\n }\n &--bottom-center {\n animation-name: #{$rt-namespace}__bounceOutDown;\n }\n}\n","@keyframes #{$rt-namespace}__zoomIn {\n from {\n opacity: 0;\n transform: scale3d(0.3, 0.3, 0.3);\n }\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes #{$rt-namespace}__zoomOut {\n from {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n transform: scale3d(0.3, 0.3, 0.3);\n }\n to {\n opacity: 0;\n }\n}\n\n.#{$rt-namespace}__zoom-enter {\n animation-name: #{$rt-namespace}__zoomIn;\n}\n\n.#{$rt-namespace}__zoom-exit {\n animation-name: #{$rt-namespace}__zoomOut;\n}\n","@keyframes #{$rt-namespace}__flipIn {\n from {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n animation-timing-function: ease-in;\n opacity: 0;\n }\n 40% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n animation-timing-function: ease-in;\n }\n 60% {\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n 80% {\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n to {\n transform: perspective(400px);\n }\n}\n\n@keyframes #{$rt-namespace}__flipOut {\n from {\n transform: perspective(400px);\n }\n 30% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n to {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n\n.#{$rt-namespace}__flip-enter {\n animation-name: #{$rt-namespace}__flipIn;\n}\n\n.#{$rt-namespace}__flip-exit {\n animation-name: #{$rt-namespace}__flipOut;\n}\n","@mixin transform {\n transform: translate3d(0, 0, 0);\n}\n\n@keyframes #{$rt-namespace}__slideInRight {\n from {\n transform: translate3d(110%, 0, 0);\n visibility: visible;\n }\n to {\n @include transform;\n }\n}\n\n@keyframes #{$rt-namespace}__slideInLeft {\n from {\n transform: translate3d(-110%, 0, 0);\n visibility: visible;\n }\n to {\n @include transform;\n }\n}\n\n@keyframes #{$rt-namespace}__slideInUp {\n from {\n transform: translate3d(0, 110%, 0);\n visibility: visible;\n }\n to {\n @include transform;\n }\n}\n\n@keyframes #{$rt-namespace}__slideInDown {\n from {\n transform: translate3d(0, -110%, 0);\n visibility: visible;\n }\n to {\n @include transform;\n }\n}\n\n@keyframes #{$rt-namespace}__slideOutRight {\n from {\n @include transform;\n }\n to {\n visibility: hidden;\n transform: translate3d(110%, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__slideOutLeft {\n from {\n @include transform;\n }\n to {\n visibility: hidden;\n transform: translate3d(-110%, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__slideOutDown {\n from {\n @include transform;\n }\n to {\n visibility: hidden;\n transform: translate3d(0, 500px, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__slideOutUp {\n from {\n @include transform;\n }\n to {\n visibility: hidden;\n transform: translate3d(0, -500px, 0);\n }\n}\n\n.#{$rt-namespace}__slide-enter {\n &--top-left,\n &--bottom-left {\n animation-name: #{$rt-namespace}__slideInLeft;\n }\n &--top-right,\n &--bottom-right {\n animation-name: #{$rt-namespace}__slideInRight;\n }\n &--top-center {\n animation-name: #{$rt-namespace}__slideInDown;\n }\n &--bottom-center {\n animation-name: #{$rt-namespace}__slideInUp;\n }\n}\n\n.#{$rt-namespace}__slide-exit {\n &--top-left,\n &--bottom-left {\n animation-name: #{$rt-namespace}__slideOutLeft;\n }\n &--top-right,\n &--bottom-right {\n animation-name: #{$rt-namespace}__slideOutRight;\n }\n &--top-center {\n animation-name: #{$rt-namespace}__slideOutUp;\n }\n &--bottom-center {\n animation-name: #{$rt-namespace}__slideOutDown;\n }\n}\n","@keyframes #{$rt-namespace}__spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","[data-simplebar]{position:relative;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}.simplebar-wrapper{overflow:hidden;width:inherit;height:inherit;max-width:inherit;max-height:inherit}.simplebar-mask{direction:inherit;position:absolute;overflow:hidden;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:0}.simplebar-offset{direction:inherit!important;box-sizing:inherit!important;resize:none!important;position:absolute;top:0;left:0;bottom:0;right:0;padding:0;margin:0;-webkit-overflow-scrolling:touch}.simplebar-content-wrapper{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:auto;max-width:100%;max-height:100%;overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{display:none;width:0;height:0}.simplebar-content:after,.simplebar-content:before{content:' ';display:table}.simplebar-placeholder{max-height:100%;max-width:100%;width:100%;pointer-events:none}.simplebar-height-auto-observer-wrapper{box-sizing:inherit!important;height:100%;width:100%;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;flex-grow:inherit;flex-shrink:0;flex-basis:0}.simplebar-height-auto-observer{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:1000%;width:1000%;min-height:1px;min-width:1px;overflow:hidden;pointer-events:none;z-index:-1}.simplebar-track{z-index:1;position:absolute;right:0;bottom:0;pointer-events:none;overflow:hidden}[data-simplebar].simplebar-dragging{pointer-events:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-simplebar].simplebar-dragging .simplebar-content{pointer-events:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{position:absolute;left:0;right:0;min-height:10px}.simplebar-scrollbar:before{position:absolute;content:'';background:#000;border-radius:7px;left:2px;right:2px;opacity:0;transition:opacity .2s .5s linear}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;transition-delay:0s;transition-duration:0s}.simplebar-track.simplebar-vertical{top:0;width:11px}.simplebar-scrollbar:before{top:2px;bottom:2px;left:2px;right:2px}.simplebar-track.simplebar-horizontal{left:0;height:11px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{right:auto;left:0;top:0;bottom:0;min-height:0;min-width:10px;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{right:auto;left:0}.simplebar-dummy-scrollbar-size{direction:rtl;position:fixed;opacity:0;visibility:hidden;height:500px;width:500px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:scrollbar!important}.simplebar-dummy-scrollbar-size>div{width:200%;height:200%;margin:10px 0}.simplebar-hide-scrollbar{position:fixed;left:0;visibility:hidden;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}\n","#root {\r\n --toastify-font-family: \"Poppins\", sans-serif;\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n height: 100%;\r\n width: 100%;\r\n font-family: \"Roboto\", \"Helvetica\", \"Arial\", \"sans-serif\" !important;\r\n}\r\n\r\n::-webkit-scrollbar {\r\n width: 6px;\r\n height: 6px;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n background-color: #0003;\r\n border-radius: 6px;\r\n transition: all 0.2s ease-in-out;\r\n}\r\n::-webkit-scrollbar-track {\r\n border-radius: 6px;\r\n}\r\np {\r\n font-family: \"Roboto\", \"Helvetica\", \"Arial\", \"sans-serif\" !important;\r\n}\r\n"],"names":[],"sourceRoot":""} -------------------------------------------------------------------------------- /client/build/static/js/787.59db3541.chunk.js: -------------------------------------------------------------------------------- 1 | "use strict";(self.webpackChunksmart_metrics_logbook=self.webpackChunksmart_metrics_logbook||[]).push([[787],{787:function(e,t,n){n.r(t),n.d(t,{getCLS:function(){return y},getFCP:function(){return g},getFID:function(){return F},getLCP:function(){return P},getTTFB:function(){return D}});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},f=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,p=function(){return"hidden"===document.visibilityState?0:1/0},d=function(){f((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=p(),d(),s((function(){setTimeout((function(){v=p(),d()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(f&&f.disconnect(),e.startTime-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},p=c("layout-shift",v);p&&(n=m(i,r,t),f((function(){p.takeRecords().map(v),n(!0)})),s((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,k(removeEventListener),S())},S=function(){if(r>=0&&r1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},k=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},F=function(e,t){var n,a=l(),v=u("FID"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]); 2 | //# sourceMappingURL=787.59db3541.chunk.js.map -------------------------------------------------------------------------------- /client/build/static/js/787.59db3541.chunk.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"static/js/787.59db3541.chunk.js","mappings":"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","sources":["../node_modules/web-vitals/dist/web-vitals.js"],"sourcesContent":["var e,t,n,i,r=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:\"v2-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12)}},a=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if(\"first-input\"===e&&!(\"PerformanceEventTiming\"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},o=function(e,t){var n=function n(i){\"pagehide\"!==i.type&&\"hidden\"!==document.visibilityState||(e(i),t&&(removeEventListener(\"visibilitychange\",n,!0),removeEventListener(\"pagehide\",n,!0)))};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},u=function(e){addEventListener(\"pageshow\",(function(t){t.persisted&&e(t)}),!0)},c=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},f=-1,s=function(){return\"hidden\"===document.visibilityState?0:1/0},m=function(){o((function(e){var t=e.timeStamp;f=t}),!0)},v=function(){return f<0&&(f=s(),m(),u((function(){setTimeout((function(){f=s(),m()}),0)}))),{get firstHiddenTime(){return f}}},d=function(e,t){var n,i=v(),o=r(\"FCP\"),f=function(e){\"first-contentful-paint\"===e.name&&(m&&m.disconnect(),e.startTime-1&&e(t)},f=r(\"CLS\",0),s=0,m=[],v=function(e){if(!e.hadRecentInput){var t=m[0],i=m[m.length-1];s&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(s+=e.value,m.push(e)):(s=e.value,m=[e]),s>f.value&&(f.value=s,f.entries=m,n())}},h=a(\"layout-shift\",v);h&&(n=c(i,f,t),o((function(){h.takeRecords().map(v),n(!0)})),u((function(){s=0,l=-1,f=r(\"CLS\",0),n=c(i,f,t)})))},T={passive:!0,capture:!0},y=new Date,g=function(i,r){e||(e=r,t=i,n=new Date,w(removeEventListener),E())},E=function(){if(t>=0&&t1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,t){var n=function(){g(e,t),r()},i=function(){r()},r=function(){removeEventListener(\"pointerup\",n,T),removeEventListener(\"pointercancel\",i,T)};addEventListener(\"pointerup\",n,T),addEventListener(\"pointercancel\",i,T)}(t,e):g(t,e)}},w=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(t){return e(t,S,T)}))},L=function(n,f){var s,m=v(),d=r(\"FID\"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},\"complete\"===document.readyState?setTimeout(t,0):addEventListener(\"load\",(function(){return setTimeout(t,0)}))};export{h as getCLS,d as getFCP,L as getFID,F as getLCP,P as getTTFB};\n"],"names":["e","t","n","i","r","name","value","delta","entries","id","concat","Date","now","Math","floor","random","a","PerformanceObserver","supportedEntryTypes","includes","self","getEntries","map","observe","type","buffered","o","document","visibilityState","removeEventListener","addEventListener","u","persisted","c","f","s","m","timeStamp","v","setTimeout","firstHiddenTime","d","disconnect","startTime","push","window","performance","getEntriesByName","requestAnimationFrame","p","l","h","hadRecentInput","length","takeRecords","T","passive","capture","y","g","w","E","entryType","target","cancelable","processingStart","forEach","S","L","b","F","once","P","getEntriesByType","timing","max","navigationStart","responseStart","readyState"],"sourceRoot":""} -------------------------------------------------------------------------------- /client/build/static/js/main.ed45ed54.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | * ApexCharts v3.37.1 3 | * (c) 2018-2023 ApexCharts 4 | * Released under the MIT License. 5 | */ 6 | 7 | /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ 8 | 9 | /*! svg.draggable.js - v2.2.2 - 2019-01-08 10 | * https://github.com/svgdotjs/svg.draggable.js 11 | * Copyright (c) 2019 Wout Fierens; Licensed MIT */ 12 | 13 | /*! svg.filter.js - v2.0.2 - 2016-02-24 14 | * https://github.com/wout/svg.filter.js 15 | * Copyright (c) 2016 Wout Fierens; Licensed MIT */ 16 | 17 | /** 18 | * @license React 19 | * react-dom.production.min.js 20 | * 21 | * Copyright (c) Facebook, Inc. and its affiliates. 22 | * 23 | * This source code is licensed under the MIT license found in the 24 | * LICENSE file in the root directory of this source tree. 25 | */ 26 | 27 | /** 28 | * @license React 29 | * react-is.production.min.js 30 | * 31 | * Copyright (c) Facebook, Inc. and its affiliates. 32 | * 33 | * This source code is licensed under the MIT license found in the 34 | * LICENSE file in the root directory of this source tree. 35 | */ 36 | 37 | /** 38 | * @license React 39 | * react-jsx-runtime.production.min.js 40 | * 41 | * Copyright (c) Facebook, Inc. and its affiliates. 42 | * 43 | * This source code is licensed under the MIT license found in the 44 | * LICENSE file in the root directory of this source tree. 45 | */ 46 | 47 | /** 48 | * @license React 49 | * react.production.min.js 50 | * 51 | * Copyright (c) Facebook, Inc. and its affiliates. 52 | * 53 | * This source code is licensed under the MIT license found in the 54 | * LICENSE file in the root directory of this source tree. 55 | */ 56 | 57 | /** 58 | * @license React 59 | * scheduler.production.min.js 60 | * 61 | * Copyright (c) Facebook, Inc. and its affiliates. 62 | * 63 | * This source code is licensed under the MIT license found in the 64 | * LICENSE file in the root directory of this source tree. 65 | */ 66 | 67 | /** 68 | * @license React 69 | * use-sync-external-store-shim.production.min.js 70 | * 71 | * Copyright (c) Facebook, Inc. and its affiliates. 72 | * 73 | * This source code is licensed under the MIT license found in the 74 | * LICENSE file in the root directory of this source tree. 75 | */ 76 | 77 | /** 78 | * @license React 79 | * use-sync-external-store-shim/with-selector.production.min.js 80 | * 81 | * Copyright (c) Facebook, Inc. and its affiliates. 82 | * 83 | * This source code is licensed under the MIT license found in the 84 | * LICENSE file in the root directory of this source tree. 85 | */ 86 | 87 | /** 88 | * @mui/styled-engine v5.12.0 89 | * 90 | * @license MIT 91 | * This source code is licensed under the MIT license found in the 92 | * LICENSE file in the root directory of this source tree. 93 | */ 94 | 95 | /** 96 | * @remix-run/router v1.3.3 97 | * 98 | * Copyright (c) Remix Software Inc. 99 | * 100 | * This source code is licensed under the MIT license found in the 101 | * LICENSE.md file in the root directory of this source tree. 102 | * 103 | * @license MIT 104 | */ 105 | 106 | /** 107 | * React Router DOM v6.8.2 108 | * 109 | * Copyright (c) Remix Software Inc. 110 | * 111 | * This source code is licensed under the MIT license found in the 112 | * LICENSE.md file in the root directory of this source tree. 113 | * 114 | * @license MIT 115 | */ 116 | 117 | /** 118 | * React Router v6.8.2 119 | * 120 | * Copyright (c) Remix Software Inc. 121 | * 122 | * This source code is licensed under the MIT license found in the 123 | * LICENSE.md file in the root directory of this source tree. 124 | * 125 | * @license MIT 126 | */ 127 | 128 | /** @license React v16.13.1 129 | * react-is.production.min.js 130 | * 131 | * Copyright (c) Facebook, Inc. and its affiliates. 132 | * 133 | * This source code is licensed under the MIT license found in the 134 | * LICENSE file in the root directory of this source tree. 135 | */ 136 | 137 | /** @license React v17.0.2 138 | * react-is.production.min.js 139 | * 140 | * Copyright (c) Facebook, Inc. and its affiliates. 141 | * 142 | * This source code is licensed under the MIT license found in the 143 | * LICENSE file in the root directory of this source tree. 144 | */ 145 | 146 | //! Copyright (c) JS Foundation and other contributors 147 | 148 | //! github.com/moment/moment-timezone 149 | 150 | //! license : MIT 151 | 152 | //! moment-timezone.js 153 | 154 | //! moment.js 155 | 156 | //! version : 0.5.43 157 | -------------------------------------------------------------------------------- /client/build/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-all-300-normal.168d6383e73339293ac3.woff -------------------------------------------------------------------------------- /client/build/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff -------------------------------------------------------------------------------- /client/build/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff -------------------------------------------------------------------------------- /client/build/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff -------------------------------------------------------------------------------- /client/build/static/media/roboto-cyrillic-300-normal.1431d1cef06ad04f5458.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-cyrillic-300-normal.1431d1cef06ad04f5458.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-cyrillic-400-normal.71a33b6b50457b2c903a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-cyrillic-400-normal.71a33b6b50457b2c903a.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-cyrillic-500-normal.cad7d3d9cb265e334e58.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-cyrillic-500-normal.cad7d3d9cb265e334e58.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-cyrillic-700-normal.d010f1f324e111a22e53.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-cyrillic-700-normal.d010f1f324e111a22e53.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-cyrillic-ext-300-normal.4777461b144e55145268.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-cyrillic-ext-300-normal.4777461b144e55145268.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-cyrillic-ext-400-normal.804378952da8a10faae2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-cyrillic-ext-400-normal.804378952da8a10faae2.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-cyrillic-ext-500-normal.62ced72e5832f02c2796.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-cyrillic-ext-500-normal.62ced72e5832f02c2796.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-cyrillic-ext-700-normal.be4d02458ce53887dc37.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-cyrillic-ext-700-normal.be4d02458ce53887dc37.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-greek-300-normal.db2632771401f61463fe.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-greek-300-normal.db2632771401f61463fe.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-greek-400-normal.c35e4c3958e209d17b31.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-greek-400-normal.c35e4c3958e209d17b31.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-greek-500-normal.9ac81fefbe6c319ea40b.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-greek-500-normal.9ac81fefbe6c319ea40b.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-greek-700-normal.50e795c1345353b0e996.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-greek-700-normal.50e795c1345353b0e996.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-greek-ext-300-normal.35b9d6be04b95f0f0530.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-greek-ext-300-normal.35b9d6be04b95f0f0530.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-greek-ext-400-normal.169619821ea93019d1bb.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-greek-ext-400-normal.169619821ea93019d1bb.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-greek-ext-500-normal.6fb9cffb1d3e72bf9293.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-greek-ext-500-normal.6fb9cffb1d3e72bf9293.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-greek-ext-700-normal.bd9854c751441ccc1a70.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-greek-ext-700-normal.bd9854c751441ccc1a70.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-latin-300-normal.c48fb6765a9fcb00b330.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-latin-300-normal.c48fb6765a9fcb00b330.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-latin-400-normal.b009a76ad6afe4ebd301.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-latin-400-normal.b009a76ad6afe4ebd301.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-latin-500-normal.f25d774ecfe0996f8eb5.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-latin-500-normal.f25d774ecfe0996f8eb5.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-latin-700-normal.227c93190fe7f82de3f8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-latin-700-normal.227c93190fe7f82de3f8.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-latin-ext-300-normal.dc7dcec8e3f654e0ed63.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-latin-ext-300-normal.dc7dcec8e3f654e0ed63.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-latin-ext-400-normal.861b791f9de857a6e7bc.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-latin-ext-400-normal.861b791f9de857a6e7bc.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-latin-ext-500-normal.9165081d10e1ba601384.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-latin-ext-500-normal.9165081d10e1ba601384.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-latin-ext-700-normal.ed67ad54b1a8f5d21150.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-latin-ext-700-normal.ed67ad54b1a8f5d21150.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-vietnamese-300-normal.32fc45a3d1e8ea11fabc.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-vietnamese-300-normal.32fc45a3d1e8ea11fabc.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-vietnamese-400-normal.3230f9b040f3c630e0c3.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-vietnamese-400-normal.3230f9b040f3c630e0c3.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-vietnamese-500-normal.d8642a3d1d4ef6179644.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-vietnamese-500-normal.d8642a3d1d4ef6179644.woff2 -------------------------------------------------------------------------------- /client/build/static/media/roboto-vietnamese-700-normal.3425a701027d0699e369.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/client/build/static/media/roboto-vietnamese-700-normal.3425a701027d0699e369.woff2 -------------------------------------------------------------------------------- /config/config.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/config/config.js -------------------------------------------------------------------------------- /config/express.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const bodyParser = require("body-parser"); 3 | const cors = require("cors"); 4 | const morgan = require("morgan"); 5 | 6 | const { json } = express; 7 | 8 | 9 | // const helmet = require("helmet"); 10 | const app = express(); 11 | app.use(cors()); 12 | // app.use(bodyParser.urlencoded({ extended: false })); 13 | app.use(bodyParser.json()); 14 | // app.use(json()); 15 | app.use(morgan("dev")); 16 | // app.use(helmet()); 17 | app.use(express.json()); 18 | 19 | // app.get("/", (req, res) => { 20 | // res.send("Hello World!"); 21 | // }); 22 | 23 | 24 | 25 | // app.use( 26 | // helmet.contentSecurityPolicy({ 27 | // directives: { 28 | // defaultSrc: ["'self'"], 29 | // connectSrc: ["'self'", "http://127.0.0.1:8000"], 30 | // }, 31 | // }) 32 | // ); 33 | 34 | module.exports = app; 35 | -------------------------------------------------------------------------------- /config/mongoose.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const dotenv = require("dotenv"); 3 | dotenv.config(); 4 | mongoose 5 | .connect(process.env.MONGODB_URI_PRODUCTION, { 6 | useNewUrlParser: true, 7 | useUnifiedTopology: true, 8 | useFindAndModify: false, 9 | }) 10 | .catch((err) => console.error("Connection error :" + err)); 11 | const db = mongoose.connection; 12 | 13 | module.exports = db; 14 | -------------------------------------------------------------------------------- /config/storeOptioins.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | //create new connection for session store 4 | const connection = mongoose.createConnection(process.env.MONGODB_URI_PRODUCTION, { 5 | useNewUrlParser: true, 6 | useUnifiedTopology: true, 7 | }); 8 | 9 | module.exports = storeOptions = { 10 | mongooseConnection: connection, 11 | //automatically remove after 3 hours 12 | ttl: 3 * 60 * 60, 13 | }; 14 | -------------------------------------------------------------------------------- /controllers/auth.js: -------------------------------------------------------------------------------- 1 | const User = require("../models/user"); 2 | const Metrics = require("../models/metrics"); 3 | const jwt = require("jsonwebtoken"); 4 | const bcrypt = require("bcrypt"); 5 | const { createJWT } = require("../utils/auth"); 6 | 7 | // @route POST api/auth/register 8 | // @desc Register user 9 | // @access Public 10 | exports.register = async (req, res, next) => { 11 | const { name, email, password } = req.body; 12 | 13 | try { 14 | let user = await User.findOne({ email }); 15 | 16 | if (user) { 17 | return res 18 | .status(400) 19 | .json({ errors: [{ msg: "Email already exists" }] }); 20 | } 21 | 22 | user = new User({ 23 | name, 24 | email, 25 | password, 26 | }); 27 | 28 | const salt = await bcrypt.genSalt(10); 29 | user.password = await bcrypt.hash(password, salt); 30 | Metrics.insertM 31 | 32 | await user.save(); 33 | 34 | const payload = { 35 | user: { 36 | id: user.id, 37 | }, 38 | }; 39 | 40 | jwt.sign( 41 | payload, 42 | process.env.TOKEN_SECRET, 43 | { expiresIn: "5 days" }, 44 | (err, token) => { 45 | if (err) throw err; 46 | res.json({ doc: token }); 47 | } 48 | ); 49 | } catch (err) { 50 | console.error(err.message); 51 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 52 | } 53 | }; 54 | 55 | 56 | exports.login = async (req, res) => { 57 | const { email, password } = req.body; 58 | 59 | try { 60 | let user = await User.findOne({ email }); 61 | 62 | if (!user) { 63 | return res 64 | .status(400) 65 | .json({ errors: [{ msg: "The email does not exists!" }] }); 66 | } 67 | 68 | const isMatch = await bcrypt.compare(password, user.password); 69 | 70 | if (!isMatch) { 71 | return res 72 | .status(400) 73 | .json({ errors: [{ msg: "Password is incorrect!" }] }); 74 | } 75 | 76 | const payload = { 77 | user: { 78 | id: user.id, 79 | }, 80 | }; 81 | 82 | jwt.sign( 83 | payload, 84 | process.env.TOKEN_SECRET, 85 | { expiresIn: "5 days" }, 86 | (err, token) => { 87 | if (err) throw err; 88 | res.json({ doc: token }); 89 | } 90 | ); 91 | } catch (err) { 92 | console.error(err.message); 93 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 94 | } 95 | }; 96 | 97 | // function delay(time) { 98 | // return new Promise((resolve) => setTimeout(resolve, time)); 99 | // } 100 | // @route GET api/auth/load_user 101 | // @desc Get user by token 102 | // @access Private 103 | exports.loadUser = async (req, res) => { 104 | try { 105 | const user = await User.findById(req.user.id).select("-password"); 106 | 107 | res.json({ doc: user }); 108 | } catch (err) { 109 | console.error(err.message); 110 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 111 | } 112 | }; 113 | -------------------------------------------------------------------------------- /controllers/group.js: -------------------------------------------------------------------------------- 1 | const Group = require("../models/group"); 2 | const { check, validationResult } = require("express-validator"); 3 | 4 | exports.addGroup = async (req, res, next) => { 5 | const errors = validationResult(req); 6 | if (!errors.isEmpty()) { 7 | return res.status(400).json({ errors: errors.array() }); 8 | } 9 | try { 10 | const newGroup = new Group({ 11 | userId: req.user.id, 12 | name: req.body.name, 13 | contents: req.body.contents, 14 | }); 15 | 16 | const group = await newGroup.save(); 17 | 18 | res.json({ doc: group }); 19 | } catch (err) { 20 | console.error(err.message); 21 | res.status(500).json({ errors: [{ msg: "Group name duplicated!" }] }); 22 | } 23 | }; 24 | 25 | exports.updateGroup = async (req, res) => { 26 | const errors = validationResult(req); 27 | if (!errors.isEmpty()) { 28 | return res.status(400).json({ errors: errors.array() }); 29 | } 30 | try { 31 | const group = await Group.findByIdAndUpdate( 32 | { _id: req.body._id }, 33 | req.body, 34 | { 35 | new: true, 36 | } 37 | ); 38 | res.status(200).json({ doc: group }); 39 | } catch (err) { 40 | console.error(err.message); 41 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 42 | } 43 | }; 44 | 45 | exports.getUserGroup = async (req, res, next) => { 46 | try { 47 | const groups = await Group.find({ userId: req.user.id }); 48 | res.json({ docs: groups }); 49 | } catch (err) { 50 | console.error(err.message); 51 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 52 | } 53 | }; 54 | 55 | exports.deleteGroupById = async (req, res, next) => { 56 | try { 57 | const group = await Group.findOne({ _id: req.query._id }); 58 | group.delete(); 59 | res.status(200).json(); 60 | } catch (err) { 61 | console.error(err.message); 62 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 63 | } 64 | }; 65 | -------------------------------------------------------------------------------- /controllers/metrics.js: -------------------------------------------------------------------------------- 1 | const Metrics = require("../models/metrics"); 2 | const { validationResult } = require("express-validator"); 3 | const Wage = require("../models/wage"); 4 | const Group = require("../models/group"); 5 | exports.addMetrics = async (req, res, next) => { 6 | const errors = validationResult(req); 7 | if (!errors.isEmpty()) { 8 | return res.status(400).json({ errors: errors.array() }); 9 | } 10 | 11 | try { 12 | const newMetrics = new Metrics({ 13 | userId: req.user.id, 14 | name: req.body.name, 15 | description: req.body.description, 16 | fieldType: req.body.fieldType, 17 | prefix: req.body.prefix, 18 | postfix: req.body.postfix, 19 | chartType: req.body.chartType, 20 | status: req.body.status, 21 | ignore: req.body.ignore, 22 | timing: req.body.timing, 23 | }); 24 | 25 | const metrics = await newMetrics.save(); 26 | 27 | res.json({ doc: metrics }); 28 | } catch (err) { 29 | console.error(err.message); 30 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 31 | } 32 | }; 33 | 34 | exports.updateMetrics = async (req, res) => { 35 | const errors = validationResult(req); 36 | if (!errors.isEmpty()) { 37 | return res.status(400).json({ errors: errors.array() }); 38 | } 39 | try { 40 | const metric = await Metrics.findByIdAndUpdate( 41 | { _id: req.body._id }, 42 | req.body, 43 | { 44 | new: true, 45 | } 46 | ); 47 | res.status(200).json({ doc: metric }); 48 | } catch (err) { 49 | console.error(err.message); 50 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 51 | } 52 | }; 53 | 54 | exports.getUserMetrics = async (req, res, next) => { 55 | try { 56 | const metrics = await Metrics.find({ userId: req.user.id }); 57 | res.json({ docs: metrics }); 58 | } catch (err) { 59 | console.error(err.message); 60 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 61 | } 62 | }; 63 | 64 | exports.deleteMetricById = async (req, res, next) => { 65 | try { 66 | const metric = await Metrics.findOne({ _id: req.query._id }); 67 | await Wage.deleteMany({ metricsId: req.query._id }); 68 | await Group.updateMany( 69 | { contents: req.query._id }, 70 | { $pull: { contents: req.query._id } } 71 | ); 72 | 73 | metric.delete(); 74 | res.status(200).json(); 75 | } catch (err) { 76 | console.error(err.message); 77 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 78 | } 79 | }; 80 | -------------------------------------------------------------------------------- /controllers/wage.js: -------------------------------------------------------------------------------- 1 | const Wage = require("../models/wage"); 2 | const { check, validationResult } = require("express-validator"); 3 | 4 | (exports.addMetricsWage = async (req, res) => { 5 | const errors = validationResult(req); 6 | if (!errors.isEmpty()) { 7 | return res.status(400).json({ errors: errors.array() }); 8 | } 9 | 10 | try { 11 | const newWage = new Wage({ 12 | userId: req.user.id, 13 | metricsId: req.body.metricId, 14 | wage: req.body.metricValue, 15 | }); 16 | 17 | const wage = await newWage.save(); 18 | 19 | res.json({ doc: wage }); 20 | } catch (err) { 21 | console.error(err.message); 22 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 23 | } 24 | }), 25 | (exports.updateMetricsWage = async (req, res) => { 26 | const errors = validationResult(req); 27 | if (!errors.isEmpty()) { 28 | return res.status(400).json({ errors: errors.array() }); 29 | } 30 | try { 31 | const wage = await Wage.findByIdAndUpdate( 32 | { _id: req.body._id }, 33 | req.body, 34 | { new: true } 35 | ); 36 | 37 | res.status(200).json({ doc: wage }); 38 | } catch (err) { 39 | console.error(err.message); 40 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 41 | } 42 | }); 43 | exports.getUserMetricsAllWages = async (req, res) => { 44 | try { 45 | const wages = await Wage.find({ userId: req.user.id }); 46 | res.json({ docs: wages }); 47 | } catch (err) { 48 | console.error(err.message); 49 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 50 | } 51 | }; 52 | exports.getUserMetricsAllTodayWages = async (req, res) => { 53 | const today = new Date(); 54 | try { 55 | const wages = await Wage.find({ userId: req?.user?.id }); 56 | 57 | const results = wages.filter( 58 | (wage) => 59 | parseInt(new Date(wage.createdAt).getFullYear()) === 60 | parseInt(today.getFullYear()) && 61 | parseInt(new Date(wage.createdAt).getMonth()) === 62 | parseInt(today.getMonth()) && 63 | parseInt(new Date(wage.createdAt).getDate()) === 64 | parseInt(today.getDate()) 65 | ); 66 | res.json({ docs: results }); 67 | } catch (err) { 68 | // console.error(err.message); 69 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 70 | } 71 | }; 72 | exports.getLastestMetricsWagesById = async (req, res) => { 73 | try { 74 | const wages = await Wage.find({ userId: req.user.id }) 75 | .sort({ 76 | createdAt: -1, 77 | }) 78 | .limit(3); 79 | res.status(200).json({ docs: wages }); 80 | } catch (err) { 81 | // console.error(err.message); 82 | // res.status(500).json({ errors: [{ msg: "Server error!" }] }); 83 | } 84 | }; 85 | exports.deleteMetricWageById = async (req, res) => { 86 | try { 87 | const wage = await Wage.findOne({ _id: req.query._id }); 88 | wage.delete(); 89 | res.status(200).json(); 90 | } catch (err) { 91 | console.error(err.message); 92 | res.status(500).json({ errors: [{ msg: "Server error!" }] }); 93 | } 94 | }; 95 | -------------------------------------------------------------------------------- /middleware/auth.js: -------------------------------------------------------------------------------- 1 | const jwt = require("jsonwebtoken"); 2 | const User = require("../models/user"); 3 | require("dotenv").config(); 4 | 5 | module.exports = function (req, res, next) { 6 | // Get token from header 7 | 8 | const token = req.header("x-auth-token"); 9 | 10 | // Check if not token 11 | if (!token) { 12 | return res 13 | .status(401) 14 | .json({ errors: [{ msg: "No token, authorization denied" }] }); 15 | } 16 | 17 | // Verify token 18 | try { 19 | jwt.verify(token, process.env.TOKEN_SECRET, async (error, decoded) => { 20 | if (error) { 21 | return res 22 | .status(401) 23 | .json({ errors: [{ msg: "Token is not valid" }] }); 24 | } else { 25 | const user = await User.findOne({ _id: decoded.user.id }); 26 | 27 | if (user?._id) { 28 | req.user = decoded.user; 29 | next(); 30 | } else { 31 | return res 32 | .status(401) 33 | .json({ errors: [{ msg: "Token is not valid" }] }); 34 | } 35 | } 36 | }); 37 | } catch (err) { 38 | console.error("something wrong with auth middleware"); 39 | res.status(500).json({ errors: [{ msg: "Server Error" }] }); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /middleware/checkObjectId.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | // middleware to check for a valid object id 3 | const checkObjectId = (idToCheck) => (req, res, next) => { 4 | if (!mongoose.Types.ObjectId.isValid(req.params[idToCheck])) 5 | return res.status(400).json({ msg: 'Invalid ID' }); 6 | next(); 7 | }; 8 | 9 | module.exports = checkObjectId; 10 | -------------------------------------------------------------------------------- /models/group.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const Schema = mongoose.Schema; 3 | 4 | const groupSchema = new Schema( 5 | { 6 | name: { 7 | type: String, 8 | required: true, 9 | }, 10 | 11 | userId: { 12 | type: Schema.Types.ObjectId, 13 | required: true, 14 | }, 15 | contents: [ 16 | { 17 | type: Schema.Types.ObjectId, 18 | }, 19 | ], 20 | }, 21 | { 22 | timestamps: true, 23 | collection: "group", 24 | } 25 | ); 26 | module.exports = mongoose.model("group", groupSchema); 27 | -------------------------------------------------------------------------------- /models/metrics.js: -------------------------------------------------------------------------------- 1 | const { ObjectId } = require("mongoose"); 2 | const mongoose = require("mongoose"); 3 | const Schema = mongoose.Schema; 4 | const metricsSchema = new Schema( 5 | { 6 | userId: { 7 | type: Schema.Types.ObjectId, 8 | required: true, 9 | }, 10 | name: { 11 | type: String, 12 | }, 13 | description: { 14 | type: String, 15 | }, 16 | fieldType: { 17 | type: String, 18 | }, 19 | prefix: { 20 | type: String, 21 | }, 22 | postfix: { 23 | type: String, 24 | }, 25 | chartType: { 26 | type: String, 27 | }, 28 | status: { 29 | type: String, 30 | }, 31 | ignore: { 32 | type: Boolean, 33 | default: true, 34 | }, 35 | timing: { 36 | type: String, 37 | }, 38 | }, 39 | { 40 | timestamps: true, 41 | collection: "metrics", 42 | } 43 | ); 44 | module.exports = mongoose.model("metrics", metricsSchema); 45 | -------------------------------------------------------------------------------- /models/user.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const Metrics = require("./metrics"); 3 | const Schema = mongoose.Schema; 4 | const userSchema = new Schema( 5 | { 6 | name: { 7 | type: String, 8 | required: true, 9 | }, 10 | email: { 11 | type: String, 12 | required: true, 13 | unique: true, 14 | }, 15 | password: { 16 | type: String, 17 | required: true, 18 | }, 19 | }, 20 | { 21 | timestamps: true, 22 | collection: "user", 23 | } 24 | ); 25 | 26 | // userSchema.pre("save", async function (next) { 27 | // try { 28 | // // Create new profile with predefined fields 29 | 30 | // const newOtherDocs = [ 31 | // { 32 | // userId: this._id, 33 | // chartType: "line", 34 | // description: "", 35 | // fieldType: "number", 36 | // name: "Mood", 37 | // order: "", 38 | // postfix: "", 39 | // prefix: "", 40 | // status: "active", 41 | // timing: "daily", 42 | // }, 43 | // { 44 | // userId: this._id, 45 | // chartType: "line", 46 | // description: "", 47 | // fieldType: "number", 48 | // name: "Heart rate", 49 | // order: "", 50 | // postfix: "", 51 | // prefix: "", 52 | // status: "active", 53 | // timing: "daily", 54 | // }, 55 | // { 56 | // userId: this._id, 57 | // chartType: "line", 58 | // description: "", 59 | // fieldType: "number", 60 | // name: "Weight", 61 | // order: "", 62 | // postfix: "", 63 | // prefix: "", 64 | // status: "active", 65 | // timing: "daily", 66 | // }, 67 | // ]; 68 | 69 | // // Save new profile 70 | // await Metrics.insertMany(newOtherDocs); 71 | 72 | // next(); 73 | // } catch (err) { 74 | // console.error(err.message); 75 | // next(err); 76 | // } 77 | // }); 78 | module.exports = mongoose.model("user", userSchema); 79 | -------------------------------------------------------------------------------- /models/wage.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const Schema = mongoose.Schema; 3 | const wageSchema = new Schema( 4 | { 5 | userId: { 6 | type: Schema.Types.ObjectId, 7 | required: true, 8 | }, 9 | metricsId: { 10 | type: Schema.Types.ObjectId, 11 | required: true, 12 | }, 13 | wage: { 14 | type: String, 15 | }, 16 | }, 17 | { 18 | timestamps: true, 19 | collection: "wage", 20 | } 21 | ); 22 | module.exports = mongoose.model("wage", wageSchema); 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node ./bin/www", 8 | "dev": "nodemon ./bin/www", 9 | "debug": "nodemon --inspect ./bin/www", 10 | "test": "NODE_ENV=test ./node_modules/.bin/mocha --exit --timeout 30000", 11 | "heroku-postbuild": "cd client && npm install --only=dev && npm install && npm run build" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "dependencies": { 16 | "bcrypt": "^5.1.0", 17 | "body-parser": "^1.20.1", 18 | "config": "^3.3.9", 19 | "connect-mongo": "^5.0.0", 20 | "cors": "^2.8.5", 21 | "cross-env": "^7.0.3", 22 | "dotenv": "^16.0.3", 23 | "express": "^4.18.2", 24 | "express-session": "^1.17.3", 25 | "express-validator": "^6.15.0", 26 | "helmet": "^6.0.1", 27 | "http-errors": "^2.0.0", 28 | "jsonwebtoken": "^9.0.0", 29 | "lodash": "^4.17.21", 30 | "mongodb": "^5.4.0", 31 | "mongoose": "^5.9.6", 32 | "morgan": "^1.10.0" 33 | }, 34 | "devDependencies": { 35 | "nodemon": "^2.0.20" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /routes/auth.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | 4 | const { register, login, loadUser } = require("../controllers/auth.js"); 5 | const auth = require("../middleware/auth"); 6 | 7 | router.get("/loadUser", auth, loadUser); // load user 8 | router.post("/register", register); 9 | router.post("/login", login); 10 | 11 | module.exports = router; 12 | -------------------------------------------------------------------------------- /routes/group.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const { 4 | addGroup, 5 | getUserGroup, 6 | deleteGroupById, 7 | updateGroup, 8 | } = require("../controllers/group.js"); 9 | const auth = require("../middleware/auth"); 10 | 11 | router.post("", auth, addGroup); 12 | router.put("", auth, updateGroup); 13 | router.get("", auth, getUserGroup); 14 | router.delete("", auth, deleteGroupById); 15 | 16 | module.exports = router; 17 | -------------------------------------------------------------------------------- /routes/metrics.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const { 4 | addMetrics, 5 | getUserMetrics, 6 | deleteMetricById, 7 | updateMetrics, 8 | } = require("../controllers/metrics.js"); 9 | const { 10 | addMetricsWage, 11 | updateMetricsWage, 12 | getUserMetricsAllWages, 13 | getUserMetricsAllTodayWages, 14 | deleteMetricWageById, 15 | getLastestMetricsWagesById, 16 | } = require("../controllers/wage.js"); 17 | const auth = require("../middleware/auth"); 18 | 19 | router.post("", auth, addMetrics); 20 | router.put("", auth, updateMetrics); 21 | router.get("", auth, getUserMetrics); 22 | router.delete("", auth, deleteMetricById); 23 | router.post("/wage", auth, addMetricsWage); 24 | router.put("/wage", auth, updateMetricsWage); 25 | router.get("/wage", auth, getUserMetricsAllWages); 26 | router.get("/wage/today", auth, getUserMetricsAllTodayWages); 27 | router.delete("/wage", auth, deleteMetricWageById); 28 | router.get("/wage/lastest", auth, getLastestMetricsWagesById); 29 | 30 | module.exports = router; 31 | -------------------------------------------------------------------------------- /routes/routes.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const express = require("express"); 3 | const authRountes = require("./auth"); 4 | const metricsRoutes = require("./metrics"); 5 | const groupRoutes = require("./group"); 6 | module.exports = (app) => { 7 | // const router = express.Router(); 8 | 9 | // //sample route 10 | // router.get("/hello", (req, res) => { 11 | // res.send("Hello World!"); 12 | // }); 13 | 14 | app.use("/api/auth", authRountes); 15 | app.use("/api/metrics", metricsRoutes); 16 | app.use("/api/group", groupRoutes); 17 | app.get("/api/*", (req, res) => { 18 | res.status(404).json({ 19 | message: "Not found", 20 | }); 21 | }); 22 | app.use(express.static(path.join(__dirname, "../client", "build"))); 23 | app.get("*", (req, res) => { 24 | res.sendFile(path.join(__dirname, "../client", "build", "index.html")); 25 | }); 26 | }; 27 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | // const app = require("./config/express"); 2 | // const mongoose = require("./config/mongoose"); 3 | 4 | // require("dotenv").config(); 5 | // //middlewares 6 | 7 | // const port = process.env.PORT; 8 | 9 | // mongoose.on("connected", () => { 10 | // app.listen(port || 8000, () => { 11 | // require("./routes/routes")(app); 12 | // console.log("----------Metric LogoBook -----------"); 13 | // console.log(`Server app listening on port ${port}`); 14 | // }); 15 | // }); 16 | // module.exports = app; 17 | 18 | const path = require("path"); 19 | const createError = require("http-errors"); 20 | const cors = require("cors"); 21 | const express = require("express"); 22 | // const session = require("express-session"); 23 | // const MongoStore = require("connect-mongo")(session); 24 | // const storeOptions = require("./config/storeOptions"); 25 | const logger = require("morgan"); 26 | const authRoutes = require("./routes/auth"); 27 | const metricsRoutes = require("./routes/metrics"); 28 | const groupRoutes = require("./routes/group"); 29 | 30 | const { json, urlencoded } = express; 31 | 32 | var app = express(); 33 | 34 | app.use(cors()); 35 | app.use(logger("dev")); 36 | app.use(json()); 37 | app.use(urlencoded({ extended: false })); 38 | app.use(express.static(path.join(__dirname, "client", "build"))); 39 | 40 | // app.use( 41 | // session({ 42 | // name: "sess_calendapp", 43 | // secret: process.env.SESS_SECRET, 44 | // store: new MongoStore(storeOptions), 45 | // resave: false, 46 | // saveUninitialized: false, 47 | // cookie: { 48 | // maxAge: 1000 * 60 * 60, 49 | // httpOnly: false, 50 | // secure: false, 51 | // }, 52 | // }) 53 | // ); 54 | 55 | app.use("/api/auth", authRoutes); 56 | app.use("/api/metrics", metricsRoutes); 57 | app.use("/api/group", groupRoutes); 58 | 59 | app.get("*", (req, res) => { 60 | res.sendFile(path.join(__dirname, "client", "build", "index.html")); 61 | }); 62 | 63 | // catch 404 and forward to error handler 64 | app.use(function (req, res, next) { 65 | next(createError(404)); 66 | }); 67 | 68 | // error handler 69 | app.use(function (err, req, res, next) { 70 | // set locals, only providing error in development 71 | console.log(err); 72 | res.locals.message = err.message; 73 | res.locals.error = req.app.get("env") === "development" ? err : {}; 74 | // render the error page 75 | res.status(err.status || 500); 76 | res.json({ error: err }); 77 | }); 78 | 79 | module.exports = app; 80 | -------------------------------------------------------------------------------- /utils/auth.js: -------------------------------------------------------------------------------- 1 | const jwt = require("jsonwebtoken"); 2 | 3 | exports.createJWT = (email, userId, duration) => { 4 | const payload = { 5 | email, 6 | userId, 7 | duration 8 | }; 9 | return jwt.sign(payload, process.env.TOKEN_SECRET, { 10 | expiresIn: duration, 11 | }); 12 | }; -------------------------------------------------------------------------------- /utils/isEmpty.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dev-miro26/Metrics-for-health-Node-backend/4bdefddef6aba164aea287487dacdff8e67f5ffa/utils/isEmpty.js --------------------------------------------------------------------------------