├── .gitignore ├── .prettierignore ├── LICENSE ├── README.md ├── backend ├── classifier │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── config │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── requirements.txt └── frontend ├── package-lock.json ├── package.json ├── public └── images │ ├── favicon.ico │ ├── image_classification.png │ └── img1.jpg └── src ├── components ├── ClassifierButtons.js ├── ClassifierHeader.js ├── ClassifierResult.js ├── ClassifyAgain.js ├── CustomDivider.js ├── Description.js ├── DescriptionItem.js ├── Hero.js ├── HeroButtons.js ├── ImageDropzone.js └── Spacer.js ├── layout ├── Footer.js ├── Header.js ├── Layout.js └── Sidebar.js ├── pages ├── _app.js ├── _document.js ├── classifier.js └── index.js ├── theme └── theme.js └── utils ├── capitalizeFirstLetter.js ├── createEmotionCache.js └── replaceUnderscore.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .DS_Store 3 | .next/ 4 | db.sqlite3 5 | node_modules/ 6 | venv/ 7 | backend/media/images -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.html -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Bob's Programming Academy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Image Classification 2 | 3 | This is an image classification app built using **Django 3**, **Django REST Framework 3**, **Next.js 12**, and **Material UI 5**. The app uses **Inception-ResNet-v2** to classify images selected by the user. 4 | 5 | 6 | ![plot](https://github.com/BobsProgrammingAcademy/Image-Classification/blob/main/frontend/public/images/image_classification.png?raw=true) 7 | 8 | 9 | ## Table of Contents 10 | - [Prerequisites](#prerequisites) 11 | - [Installation](#installation) 12 | - [Running the application](#run-the-application) 13 | - [Customizing the application](#customize-the-application) 14 | - [Copyright and License](#copyright-and-license) 15 | 16 | 17 | ## Prerequisites 18 | 19 | Install the following prerequisites: 20 | 21 | 1. [Python 3.7-3.10](https://www.python.org/downloads/) 22 |
This project uses **TensorFlow v2.8.0**. For TensorFlow to work, you must install a correct version of Python on your machine. More information [here](https://www.tensorflow.org/install/source#tested_build_configurations). 23 | 2. [Node.js](https://nodejs.org/en/) 24 | 3. [Visual Studio Code](https://code.visualstudio.com/download) 25 | 26 | 27 | ## Installation 28 | 29 | ### Backend 30 | 31 | #### 1. Create a virtual environment 32 | 33 | From the **root** directory, run: 34 | 35 | ```bash 36 | cd backend 37 | ``` 38 | ```bash 39 | python -m venv venv 40 | ``` 41 | 42 | #### 2. Activate the virtual environment 43 | 44 | From the **backend** directory, run: 45 | 46 | On macOS: 47 | 48 | ```bash 49 | source venv/bin/activate 50 | ``` 51 | 52 | On Windows: 53 | 54 | ```bash 55 | venv\scripts\activate 56 | ``` 57 | 58 | #### 3. Install required backend dependencies 59 | 60 | From the **backend** directory, run: 61 | 62 | ```bash 63 | pip install -r requirements.txt 64 | ``` 65 | 66 | #### 4. Run migrations 67 | 68 | From the **backend** directory, run: 69 | 70 | ```bash 71 | python manage.py makemigrations 72 | ``` 73 | 74 | ```bash 75 | python manage.py migrate 76 | ``` 77 | 78 | ### Frontend 79 | 80 | #### 1. Install required frontend dependencies 81 | 82 | From the **root** directory, run: 83 | 84 | ```bash 85 | cd frontend 86 | ``` 87 | ```bash 88 | npm install 89 | ``` 90 | 91 | ## Run the application 92 | 93 | To run the application, you need to have both the backend and the frontend up and running. 94 | 95 | ### 1. Run backend 96 | 97 | From the **backend** directory, run: 98 | 99 | ```bash 100 | python manage.py runserver 101 | ``` 102 | 103 | ### 2. Run frontend 104 | 105 | From the **frontend** directory, run: 106 | 107 | ```bash 108 | npm run dev 109 | ``` 110 | 111 | ## View the application 112 | 113 | Go to http://localhost:3000/ to view the application. 114 | 115 | ## Customize the application 116 | 117 | This section describes how to customize the application. 118 | 119 | ### 1. Changing Colors 120 | 121 | To modify the colors in the application, make changes in the ```frontend/src/theme/theme.js``` file. 122 | 123 | ### 2. Changing Fonts 124 | 125 | To modify the fonts in the application, first, add a new font to the ```frontend/src/pages/_document.js``` file, and then make changes in the ```frontend/src/theme/theme.js``` file. 126 | 127 | ### 3. Changing Logo 128 | 129 | To modify the logo in the application, make changes in the ```frontend/src/layout/Header.js``` and ```frontend/src/layout/Sidebar.js``` files. 130 | 131 | ### 4. Changing the Image in the Hero Section 132 | 133 | To modify the image in the Hero section, make changes in the ```frontend/src/components/Hero.js``` and ```frontend/src/layout/Footer.js``` files. 134 | 135 | ### 5. Changing the Text in the Hero Section 136 | 137 | To modify the text in the Hero section, make changes in the ```frontend/src/components/Hero.js``` file. 138 | 139 | ### 6. Changing Buttons in the Hero Section 140 | 141 | To modify the two buttons in the Hero section, make changes in the ```frontend/src/components/HeroButtons.js``` file. 142 | 143 | ### 7. Changing the App Description 144 | 145 | To modify the app's description on the home page, make changes in the ```frontend/src/components/Description.js``` file. 146 | 147 | ## Copyright and License 148 | 149 | Copyright © 2022 Bob's Programming Academy. Code released under the MIT license. 150 | 3 151 | -------------------------------------------------------------------------------- /backend/classifier/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BobsProgrammingAcademy/image-classification/fcd3db10948301436783b592913843395d13016d/backend/classifier/__init__.py -------------------------------------------------------------------------------- /backend/classifier/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Classifier 3 | 4 | admin.site.register(Classifier) 5 | -------------------------------------------------------------------------------- /backend/classifier/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | class ClassifierConfig(AppConfig): 4 | default_auto_field = 'django.db.models.BigAutoField' 5 | name = 'classifier' 6 | -------------------------------------------------------------------------------- /backend/classifier/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.12 on 2022-02-09 22:32 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Classifier', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('image', models.ImageField(upload_to='images')), 19 | ('result', models.CharField(blank=True, max_length=250)), 20 | ('date_uploaded', models.DateTimeField(auto_now_add=True)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /backend/classifier/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BobsProgrammingAcademy/image-classification/fcd3db10948301436783b592913843395d13016d/backend/classifier/migrations/__init__.py -------------------------------------------------------------------------------- /backend/classifier/models.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import os 3 | import ssl 4 | import numpy as np 5 | import tensorflow as tf 6 | from django.conf import settings 7 | from django.db import models 8 | from PIL import Image 9 | 10 | 11 | class Classifier(models.Model): 12 | image = models.ImageField(upload_to='images') 13 | result = models.CharField(max_length=250, blank=True) 14 | date_uploaded = models.DateTimeField(auto_now_add=True) 15 | 16 | def __str__(self): 17 | return 'Image classfied at {}'.format(self.date_uploaded.strftime('%Y-%m-%d %H:%M')) 18 | 19 | def save(self, *args, **kwargs): 20 | try: 21 | # SSL certificate necessary so we can download weights of the InceptionResNetV2 model 22 | ssl._create_default_https_context = ssl._create_unverified_context 23 | 24 | img = Image.open(self.image) 25 | img_array = tf.keras.preprocessing.image.img_to_array(img) 26 | dimensions = (299, 299) 27 | 28 | # Interpolation - a method of constructing new data points within the range 29 | # of a discrete set of known data points. 30 | resized_image = cv2.resize(img_array, dimensions, interpolation=cv2.INTER_AREA) 31 | ready_image = np.expand_dims(resized_image, axis=0) 32 | ready_image = tf.keras.applications.inception_resnet_v2.preprocess_input(ready_image) 33 | 34 | model = tf.keras.applications.InceptionResNetV2(weights='imagenet') 35 | prediction = model.predict(ready_image) 36 | decoded = tf.keras.applications.inception_resnet_v2.decode_predictions(prediction)[0][0][1] 37 | self.result = str(decoded) 38 | print('Success') 39 | except Exception as e: 40 | print('Classification failed:', e) 41 | 42 | return super().save(*args, **kwargs) 43 | -------------------------------------------------------------------------------- /backend/classifier/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Classifier 3 | 4 | class ClassifierSerializer(serializers.ModelSerializer): 5 | class Meta: 6 | model = Classifier 7 | fields = '__all__' 8 | -------------------------------------------------------------------------------- /backend/classifier/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /backend/classifier/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from rest_framework import routers 3 | 4 | from .views import ClassifierViewSet 5 | 6 | router = routers.DefaultRouter() 7 | router.register(r'classifier', ClassifierViewSet) 8 | 9 | urlpatterns = [ 10 | path('', include(router.urls)), 11 | ] -------------------------------------------------------------------------------- /backend/classifier/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | 3 | from .serializers import ClassifierSerializer 4 | from .models import Classifier 5 | 6 | class ClassifierViewSet(viewsets.ModelViewSet): 7 | queryset = Classifier.objects.all().order_by('-date_uploaded') 8 | serializer_class = ClassifierSerializer 9 | -------------------------------------------------------------------------------- /backend/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BobsProgrammingAcademy/image-classification/fcd3db10948301436783b592913843395d13016d/backend/config/__init__.py -------------------------------------------------------------------------------- /backend/config/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for config project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /backend/config/settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pathlib import Path 3 | 4 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 5 | BASE_DIR = Path(__file__).resolve().parent.parent 6 | 7 | 8 | # Quick-start development settings - unsuitable for production 9 | # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ 10 | 11 | # SECURITY WARNING: keep the secret key used in production secret! 12 | SECRET_KEY = 'django-insecure-@oqfb_hfa9v0*j68%2-r1oz69y_@=e%i(l$yxy3tl#suqgnzbn' 13 | 14 | # SECURITY WARNING: don't run with debug turned on in production! 15 | DEBUG = True 16 | 17 | ALLOWED_HOSTS = [] 18 | 19 | 20 | # Application definition 21 | 22 | INSTALLED_APPS = [ 23 | 'django.contrib.admin', 24 | 'django.contrib.auth', 25 | 'django.contrib.contenttypes', 26 | 'django.contrib.sessions', 27 | 'django.contrib.messages', 28 | 'django.contrib.staticfiles', 29 | 30 | # 3rd party 31 | 'rest_framework', 32 | 'corsheaders', 33 | 34 | # Local 35 | 'classifier', 36 | ] 37 | 38 | MIDDLEWARE = [ 39 | 'corsheaders.middleware.CorsMiddleware', 40 | 'django.middleware.security.SecurityMiddleware', 41 | 'django.contrib.sessions.middleware.SessionMiddleware', 42 | 'django.middleware.common.CommonMiddleware', 43 | 'django.middleware.csrf.CsrfViewMiddleware', 44 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 45 | 'django.contrib.messages.middleware.MessageMiddleware', 46 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 47 | ] 48 | 49 | ROOT_URLCONF = 'config.urls' 50 | 51 | TEMPLATES = [ 52 | { 53 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 54 | 'DIRS': [], 55 | 'APP_DIRS': True, 56 | 'OPTIONS': { 57 | 'context_processors': [ 58 | 'django.template.context_processors.debug', 59 | 'django.template.context_processors.request', 60 | 'django.contrib.auth.context_processors.auth', 61 | 'django.contrib.messages.context_processors.messages', 62 | ], 63 | }, 64 | }, 65 | ] 66 | 67 | WSGI_APPLICATION = 'config.wsgi.application' 68 | 69 | 70 | # Database 71 | # https://docs.djangoproject.com/en/3.2/ref/settings/#databases 72 | 73 | DATABASES = { 74 | 'default': { 75 | 'ENGINE': 'django.db.backends.sqlite3', 76 | 'NAME': BASE_DIR / 'db.sqlite3', 77 | } 78 | } 79 | 80 | 81 | # Password validation 82 | # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators 83 | 84 | AUTH_PASSWORD_VALIDATORS = [ 85 | { 86 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 87 | }, 88 | { 89 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 90 | }, 91 | { 92 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 93 | }, 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 96 | }, 97 | ] 98 | 99 | 100 | # Internationalization 101 | # https://docs.djangoproject.com/en/3.2/topics/i18n/ 102 | 103 | LANGUAGE_CODE = 'en-us' 104 | 105 | TIME_ZONE = 'UTC' 106 | 107 | USE_I18N = True 108 | 109 | USE_L10N = True 110 | 111 | USE_TZ = True 112 | 113 | 114 | # Static files (CSS, JavaScript, Images) 115 | # https://docs.djangoproject.com/en/3.2/howto/static-files/ 116 | 117 | STATIC_URL = '/static/' 118 | STATICFILES_DIRS = [os.path.join(BASE_DIR, 'build/static')] 119 | STATIC_ROOT = os.path.join(BASE_DIR, 'static') 120 | 121 | MEDIA_URL = '/media/' 122 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 123 | 124 | 125 | # Default primary key field type 126 | # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field 127 | 128 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 129 | 130 | CORS_ORIGIN_ALLOW_ALL = True 131 | 132 | FILE_UPLOAD_PERMISSIONS=0o640 133 | -------------------------------------------------------------------------------- /backend/config/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.conf.urls.static import static 3 | from django.contrib import admin 4 | from django.urls import path, include 5 | 6 | urlpatterns = [ 7 | path('admin/', admin.site.urls), 8 | path('api/', include('classifier.urls')) 9 | ] 10 | 11 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 12 | urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 13 | -------------------------------------------------------------------------------- /backend/config/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for config project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /backend/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /backend/requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==1.0.0 2 | asgiref==3.5.0 3 | astunparse==1.6.3 4 | cached-property==1.5.2 5 | cachetools==5.0.0 6 | certifi==2021.10.8 7 | charset-normalizer==2.0.11 8 | Django==3.2.12 9 | django-cors-headers==3.11.0 10 | djangorestframework==3.13.1 11 | flatbuffers==2.0 12 | gast==0.5.3 13 | google-auth==2.6.0 14 | google-auth-oauthlib==0.4.6 15 | google-pasta==0.2.0 16 | grpcio==1.43.0 17 | h5py==3.6.0 18 | idna==3.3 19 | importlib-metadata==4.10.1 20 | keras==2.8.0 21 | Keras-Preprocessing==1.1.2 22 | libclang==13.0.0 23 | Markdown==3.3.6 24 | numpy==1.21.5 25 | oauthlib==3.2.0 26 | opencv-python==4.5.5.62 27 | opt-einsum==3.3.0 28 | Pillow==9.0.1 29 | protobuf==3.19.4 30 | pyasn1==0.4.8 31 | pyasn1-modules==0.2.8 32 | pytz==2021.3 33 | requests==2.27.1 34 | requests-oauthlib==1.3.1 35 | rsa==4.8 36 | six==1.16.0 37 | sqlparse==0.4.2 38 | tensorboard==2.8.0 39 | tensorboard-data-server==0.6.1 40 | tensorboard-plugin-wit==1.8.1 41 | tensorflow==2.8.0 42 | tensorflow-io-gcs-filesystem==0.24.0 43 | termcolor==1.1.0 44 | tf-estimator-nightly==2.8.0.dev2021122109 45 | typing_extensions==4.0.1 46 | urllib3==1.26.8 47 | Werkzeug==2.0.3 48 | wrapt==1.13.3 49 | zipp==3.7.0 50 | -------------------------------------------------------------------------------- /frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "image-classification", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "image-classification", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@emotion/cache": "^11.7.1", 13 | "@emotion/react": "^11.7.1", 14 | "@emotion/server": "^11.4.0", 15 | "@emotion/styled": "^11.6.0", 16 | "@fortawesome/fontawesome-svg-core": "^1.3.0", 17 | "@fortawesome/free-regular-svg-icons": "^6.0.0", 18 | "@fortawesome/react-fontawesome": "^0.1.17", 19 | "@mui/icons-material": "^5.3.1", 20 | "@mui/material": "^5.4.0", 21 | "aos": "^2.3.4", 22 | "axios": "^0.25.0", 23 | "next": "^12.0.10", 24 | "prop-types": "^15.8.1", 25 | "react": "^17.0.2", 26 | "react-dom": "^17.0.2", 27 | "react-dropzone": "^11.5.3", 28 | "react-lazy-load-image-component": "^1.5.1" 29 | }, 30 | "devDependencies": { 31 | "regenerator-runtime": "^0.13.9" 32 | } 33 | }, 34 | "node_modules/@ampproject/remapping": { 35 | "version": "2.2.1", 36 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", 37 | "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", 38 | "peer": true, 39 | "dependencies": { 40 | "@jridgewell/gen-mapping": "^0.3.0", 41 | "@jridgewell/trace-mapping": "^0.3.9" 42 | }, 43 | "engines": { 44 | "node": ">=6.0.0" 45 | } 46 | }, 47 | "node_modules/@babel/code-frame": { 48 | "version": "7.22.5", 49 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", 50 | "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", 51 | "dependencies": { 52 | "@babel/highlight": "^7.22.5" 53 | }, 54 | "engines": { 55 | "node": ">=6.9.0" 56 | } 57 | }, 58 | "node_modules/@babel/compat-data": { 59 | "version": "7.22.5", 60 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", 61 | "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", 62 | "peer": true, 63 | "engines": { 64 | "node": ">=6.9.0" 65 | } 66 | }, 67 | "node_modules/@babel/core": { 68 | "version": "7.22.5", 69 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", 70 | "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", 71 | "peer": true, 72 | "dependencies": { 73 | "@ampproject/remapping": "^2.2.0", 74 | "@babel/code-frame": "^7.22.5", 75 | "@babel/generator": "^7.22.5", 76 | "@babel/helper-compilation-targets": "^7.22.5", 77 | "@babel/helper-module-transforms": "^7.22.5", 78 | "@babel/helpers": "^7.22.5", 79 | "@babel/parser": "^7.22.5", 80 | "@babel/template": "^7.22.5", 81 | "@babel/traverse": "^7.22.5", 82 | "@babel/types": "^7.22.5", 83 | "convert-source-map": "^1.7.0", 84 | "debug": "^4.1.0", 85 | "gensync": "^1.0.0-beta.2", 86 | "json5": "^2.2.2", 87 | "semver": "^6.3.0" 88 | }, 89 | "engines": { 90 | "node": ">=6.9.0" 91 | }, 92 | "funding": { 93 | "type": "opencollective", 94 | "url": "https://opencollective.com/babel" 95 | } 96 | }, 97 | "node_modules/@babel/generator": { 98 | "version": "7.22.5", 99 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", 100 | "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", 101 | "peer": true, 102 | "dependencies": { 103 | "@babel/types": "^7.22.5", 104 | "@jridgewell/gen-mapping": "^0.3.2", 105 | "@jridgewell/trace-mapping": "^0.3.17", 106 | "jsesc": "^2.5.1" 107 | }, 108 | "engines": { 109 | "node": ">=6.9.0" 110 | } 111 | }, 112 | "node_modules/@babel/helper-compilation-targets": { 113 | "version": "7.22.5", 114 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", 115 | "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", 116 | "peer": true, 117 | "dependencies": { 118 | "@babel/compat-data": "^7.22.5", 119 | "@babel/helper-validator-option": "^7.22.5", 120 | "browserslist": "^4.21.3", 121 | "lru-cache": "^5.1.1", 122 | "semver": "^6.3.0" 123 | }, 124 | "engines": { 125 | "node": ">=6.9.0" 126 | }, 127 | "peerDependencies": { 128 | "@babel/core": "^7.0.0" 129 | } 130 | }, 131 | "node_modules/@babel/helper-environment-visitor": { 132 | "version": "7.22.5", 133 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", 134 | "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", 135 | "peer": true, 136 | "engines": { 137 | "node": ">=6.9.0" 138 | } 139 | }, 140 | "node_modules/@babel/helper-function-name": { 141 | "version": "7.22.5", 142 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", 143 | "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", 144 | "peer": true, 145 | "dependencies": { 146 | "@babel/template": "^7.22.5", 147 | "@babel/types": "^7.22.5" 148 | }, 149 | "engines": { 150 | "node": ">=6.9.0" 151 | } 152 | }, 153 | "node_modules/@babel/helper-hoist-variables": { 154 | "version": "7.22.5", 155 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", 156 | "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", 157 | "peer": true, 158 | "dependencies": { 159 | "@babel/types": "^7.22.5" 160 | }, 161 | "engines": { 162 | "node": ">=6.9.0" 163 | } 164 | }, 165 | "node_modules/@babel/helper-module-imports": { 166 | "version": "7.22.5", 167 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", 168 | "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", 169 | "dependencies": { 170 | "@babel/types": "^7.22.5" 171 | }, 172 | "engines": { 173 | "node": ">=6.9.0" 174 | } 175 | }, 176 | "node_modules/@babel/helper-module-transforms": { 177 | "version": "7.22.5", 178 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", 179 | "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", 180 | "peer": true, 181 | "dependencies": { 182 | "@babel/helper-environment-visitor": "^7.22.5", 183 | "@babel/helper-module-imports": "^7.22.5", 184 | "@babel/helper-simple-access": "^7.22.5", 185 | "@babel/helper-split-export-declaration": "^7.22.5", 186 | "@babel/helper-validator-identifier": "^7.22.5", 187 | "@babel/template": "^7.22.5", 188 | "@babel/traverse": "^7.22.5", 189 | "@babel/types": "^7.22.5" 190 | }, 191 | "engines": { 192 | "node": ">=6.9.0" 193 | } 194 | }, 195 | "node_modules/@babel/helper-plugin-utils": { 196 | "version": "7.16.7", 197 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", 198 | "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", 199 | "engines": { 200 | "node": ">=6.9.0" 201 | } 202 | }, 203 | "node_modules/@babel/helper-simple-access": { 204 | "version": "7.22.5", 205 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", 206 | "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", 207 | "peer": true, 208 | "dependencies": { 209 | "@babel/types": "^7.22.5" 210 | }, 211 | "engines": { 212 | "node": ">=6.9.0" 213 | } 214 | }, 215 | "node_modules/@babel/helper-split-export-declaration": { 216 | "version": "7.22.5", 217 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", 218 | "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", 219 | "peer": true, 220 | "dependencies": { 221 | "@babel/types": "^7.22.5" 222 | }, 223 | "engines": { 224 | "node": ">=6.9.0" 225 | } 226 | }, 227 | "node_modules/@babel/helper-string-parser": { 228 | "version": "7.22.5", 229 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", 230 | "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", 231 | "engines": { 232 | "node": ">=6.9.0" 233 | } 234 | }, 235 | "node_modules/@babel/helper-validator-identifier": { 236 | "version": "7.22.5", 237 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", 238 | "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", 239 | "engines": { 240 | "node": ">=6.9.0" 241 | } 242 | }, 243 | "node_modules/@babel/helper-validator-option": { 244 | "version": "7.22.5", 245 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", 246 | "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", 247 | "peer": true, 248 | "engines": { 249 | "node": ">=6.9.0" 250 | } 251 | }, 252 | "node_modules/@babel/helpers": { 253 | "version": "7.22.5", 254 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", 255 | "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", 256 | "peer": true, 257 | "dependencies": { 258 | "@babel/template": "^7.22.5", 259 | "@babel/traverse": "^7.22.5", 260 | "@babel/types": "^7.22.5" 261 | }, 262 | "engines": { 263 | "node": ">=6.9.0" 264 | } 265 | }, 266 | "node_modules/@babel/highlight": { 267 | "version": "7.22.5", 268 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", 269 | "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", 270 | "dependencies": { 271 | "@babel/helper-validator-identifier": "^7.22.5", 272 | "chalk": "^2.0.0", 273 | "js-tokens": "^4.0.0" 274 | }, 275 | "engines": { 276 | "node": ">=6.9.0" 277 | } 278 | }, 279 | "node_modules/@babel/parser": { 280 | "version": "7.22.5", 281 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", 282 | "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", 283 | "peer": true, 284 | "bin": { 285 | "parser": "bin/babel-parser.js" 286 | }, 287 | "engines": { 288 | "node": ">=6.0.0" 289 | } 290 | }, 291 | "node_modules/@babel/plugin-syntax-jsx": { 292 | "version": "7.16.7", 293 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", 294 | "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", 295 | "dependencies": { 296 | "@babel/helper-plugin-utils": "^7.16.7" 297 | }, 298 | "engines": { 299 | "node": ">=6.9.0" 300 | }, 301 | "peerDependencies": { 302 | "@babel/core": "^7.0.0-0" 303 | } 304 | }, 305 | "node_modules/@babel/runtime": { 306 | "version": "7.17.0", 307 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz", 308 | "integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==", 309 | "dependencies": { 310 | "regenerator-runtime": "^0.13.4" 311 | }, 312 | "engines": { 313 | "node": ">=6.9.0" 314 | } 315 | }, 316 | "node_modules/@babel/template": { 317 | "version": "7.22.5", 318 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", 319 | "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", 320 | "peer": true, 321 | "dependencies": { 322 | "@babel/code-frame": "^7.22.5", 323 | "@babel/parser": "^7.22.5", 324 | "@babel/types": "^7.22.5" 325 | }, 326 | "engines": { 327 | "node": ">=6.9.0" 328 | } 329 | }, 330 | "node_modules/@babel/traverse": { 331 | "version": "7.22.5", 332 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", 333 | "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", 334 | "peer": true, 335 | "dependencies": { 336 | "@babel/code-frame": "^7.22.5", 337 | "@babel/generator": "^7.22.5", 338 | "@babel/helper-environment-visitor": "^7.22.5", 339 | "@babel/helper-function-name": "^7.22.5", 340 | "@babel/helper-hoist-variables": "^7.22.5", 341 | "@babel/helper-split-export-declaration": "^7.22.5", 342 | "@babel/parser": "^7.22.5", 343 | "@babel/types": "^7.22.5", 344 | "debug": "^4.1.0", 345 | "globals": "^11.1.0" 346 | }, 347 | "engines": { 348 | "node": ">=6.9.0" 349 | } 350 | }, 351 | "node_modules/@babel/types": { 352 | "version": "7.22.5", 353 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", 354 | "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", 355 | "dependencies": { 356 | "@babel/helper-string-parser": "^7.22.5", 357 | "@babel/helper-validator-identifier": "^7.22.5", 358 | "to-fast-properties": "^2.0.0" 359 | }, 360 | "engines": { 361 | "node": ">=6.9.0" 362 | } 363 | }, 364 | "node_modules/@emotion/babel-plugin": { 365 | "version": "11.7.2", 366 | "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", 367 | "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", 368 | "dependencies": { 369 | "@babel/helper-module-imports": "^7.12.13", 370 | "@babel/plugin-syntax-jsx": "^7.12.13", 371 | "@babel/runtime": "^7.13.10", 372 | "@emotion/hash": "^0.8.0", 373 | "@emotion/memoize": "^0.7.5", 374 | "@emotion/serialize": "^1.0.2", 375 | "babel-plugin-macros": "^2.6.1", 376 | "convert-source-map": "^1.5.0", 377 | "escape-string-regexp": "^4.0.0", 378 | "find-root": "^1.1.0", 379 | "source-map": "^0.5.7", 380 | "stylis": "4.0.13" 381 | }, 382 | "peerDependencies": { 383 | "@babel/core": "^7.0.0" 384 | } 385 | }, 386 | "node_modules/@emotion/cache": { 387 | "version": "11.7.1", 388 | "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", 389 | "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", 390 | "dependencies": { 391 | "@emotion/memoize": "^0.7.4", 392 | "@emotion/sheet": "^1.1.0", 393 | "@emotion/utils": "^1.0.0", 394 | "@emotion/weak-memoize": "^0.2.5", 395 | "stylis": "4.0.13" 396 | } 397 | }, 398 | "node_modules/@emotion/hash": { 399 | "version": "0.8.0", 400 | "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", 401 | "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" 402 | }, 403 | "node_modules/@emotion/is-prop-valid": { 404 | "version": "1.1.1", 405 | "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz", 406 | "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==", 407 | "dependencies": { 408 | "@emotion/memoize": "^0.7.4" 409 | } 410 | }, 411 | "node_modules/@emotion/memoize": { 412 | "version": "0.7.5", 413 | "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", 414 | "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" 415 | }, 416 | "node_modules/@emotion/react": { 417 | "version": "11.7.1", 418 | "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz", 419 | "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==", 420 | "dependencies": { 421 | "@babel/runtime": "^7.13.10", 422 | "@emotion/cache": "^11.7.1", 423 | "@emotion/serialize": "^1.0.2", 424 | "@emotion/sheet": "^1.1.0", 425 | "@emotion/utils": "^1.0.0", 426 | "@emotion/weak-memoize": "^0.2.5", 427 | "hoist-non-react-statics": "^3.3.1" 428 | }, 429 | "peerDependencies": { 430 | "@babel/core": "^7.0.0", 431 | "react": ">=16.8.0" 432 | }, 433 | "peerDependenciesMeta": { 434 | "@babel/core": { 435 | "optional": true 436 | }, 437 | "@types/react": { 438 | "optional": true 439 | } 440 | } 441 | }, 442 | "node_modules/@emotion/serialize": { 443 | "version": "1.0.2", 444 | "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", 445 | "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", 446 | "dependencies": { 447 | "@emotion/hash": "^0.8.0", 448 | "@emotion/memoize": "^0.7.4", 449 | "@emotion/unitless": "^0.7.5", 450 | "@emotion/utils": "^1.0.0", 451 | "csstype": "^3.0.2" 452 | } 453 | }, 454 | "node_modules/@emotion/server": { 455 | "version": "11.4.0", 456 | "resolved": "https://registry.npmjs.org/@emotion/server/-/server-11.4.0.tgz", 457 | "integrity": "sha512-IHovdWA3V0DokzxLtUNDx4+hQI82zUXqQFcVz/om2t44O0YSc+NHB+qifnyAOoQwt3SXcBTgaSntobwUI9gnfA==", 458 | "dependencies": { 459 | "@emotion/utils": "^1.0.0", 460 | "html-tokenize": "^2.0.0", 461 | "multipipe": "^1.0.2", 462 | "through": "^2.3.8" 463 | }, 464 | "peerDependencies": { 465 | "@emotion/css": "^11.0.0-rc.0" 466 | }, 467 | "peerDependenciesMeta": { 468 | "@emotion/css": { 469 | "optional": true 470 | } 471 | } 472 | }, 473 | "node_modules/@emotion/sheet": { 474 | "version": "1.1.0", 475 | "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", 476 | "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" 477 | }, 478 | "node_modules/@emotion/styled": { 479 | "version": "11.6.0", 480 | "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz", 481 | "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==", 482 | "dependencies": { 483 | "@babel/runtime": "^7.13.10", 484 | "@emotion/babel-plugin": "^11.3.0", 485 | "@emotion/is-prop-valid": "^1.1.1", 486 | "@emotion/serialize": "^1.0.2", 487 | "@emotion/utils": "^1.0.0" 488 | }, 489 | "peerDependencies": { 490 | "@babel/core": "^7.0.0", 491 | "@emotion/react": "^11.0.0-rc.0", 492 | "react": ">=16.8.0" 493 | }, 494 | "peerDependenciesMeta": { 495 | "@babel/core": { 496 | "optional": true 497 | }, 498 | "@types/react": { 499 | "optional": true 500 | } 501 | } 502 | }, 503 | "node_modules/@emotion/unitless": { 504 | "version": "0.7.5", 505 | "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", 506 | "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" 507 | }, 508 | "node_modules/@emotion/utils": { 509 | "version": "1.0.0", 510 | "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", 511 | "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" 512 | }, 513 | "node_modules/@emotion/weak-memoize": { 514 | "version": "0.2.5", 515 | "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", 516 | "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" 517 | }, 518 | "node_modules/@fortawesome/fontawesome-common-types": { 519 | "version": "0.3.0", 520 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.3.0.tgz", 521 | "integrity": "sha512-CA3MAZBTxVsF6SkfkHXDerkhcQs0QPofy43eFdbWJJkZiq3SfiaH1msOkac59rQaqto5EqWnASboY1dBuKen5w==", 522 | "deprecated": "Please upgrade to 6.1.0. https://fontawesome.com/docs/changelog/", 523 | "hasInstallScript": true, 524 | "engines": { 525 | "node": ">=6" 526 | } 527 | }, 528 | "node_modules/@fortawesome/fontawesome-svg-core": { 529 | "version": "1.3.0", 530 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.3.0.tgz", 531 | "integrity": "sha512-UIL6crBWhjTNQcONt96ExjUnKt1D68foe3xjEensLDclqQ6YagwCRYVQdrp/hW0ALRp/5Fv/VKw+MqTUWYYvPg==", 532 | "deprecated": "Please upgrade to 6.1.0. https://fontawesome.com/docs/changelog/", 533 | "hasInstallScript": true, 534 | "dependencies": { 535 | "@fortawesome/fontawesome-common-types": "^0.3.0" 536 | }, 537 | "engines": { 538 | "node": ">=6" 539 | } 540 | }, 541 | "node_modules/@fortawesome/free-regular-svg-icons": { 542 | "version": "6.0.0", 543 | "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.0.0.tgz", 544 | "integrity": "sha512-lYK6oyQL8HwZUAVWGqF7TGuwQBVfphNBVTdvPSD3h4gmQfGazm/xcwg3kmtcRycu3y6QspOC7hPXSoJbVqSYCw==", 545 | "hasInstallScript": true, 546 | "dependencies": { 547 | "@fortawesome/fontawesome-common-types": "^0.3.0" 548 | }, 549 | "engines": { 550 | "node": ">=6" 551 | } 552 | }, 553 | "node_modules/@fortawesome/react-fontawesome": { 554 | "version": "0.1.17", 555 | "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.17.tgz", 556 | "integrity": "sha512-dX43Z5IvMaW7fwzU8farosYjKNGfRb2HB/DgjVBHeJZ/NSnuuaujPPx0YOdcAq+n3mqn70tyCde2HM1mqbhiuw==", 557 | "dependencies": { 558 | "prop-types": "^15.8.1" 559 | }, 560 | "peerDependencies": { 561 | "@fortawesome/fontawesome-svg-core": "~1 || >=1.3.0-beta1", 562 | "react": ">=16.x" 563 | } 564 | }, 565 | "node_modules/@jridgewell/gen-mapping": { 566 | "version": "0.3.3", 567 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 568 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 569 | "peer": true, 570 | "dependencies": { 571 | "@jridgewell/set-array": "^1.0.1", 572 | "@jridgewell/sourcemap-codec": "^1.4.10", 573 | "@jridgewell/trace-mapping": "^0.3.9" 574 | }, 575 | "engines": { 576 | "node": ">=6.0.0" 577 | } 578 | }, 579 | "node_modules/@jridgewell/resolve-uri": { 580 | "version": "3.1.0", 581 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 582 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 583 | "peer": true, 584 | "engines": { 585 | "node": ">=6.0.0" 586 | } 587 | }, 588 | "node_modules/@jridgewell/set-array": { 589 | "version": "1.1.2", 590 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 591 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 592 | "peer": true, 593 | "engines": { 594 | "node": ">=6.0.0" 595 | } 596 | }, 597 | "node_modules/@jridgewell/sourcemap-codec": { 598 | "version": "1.4.15", 599 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 600 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 601 | "peer": true 602 | }, 603 | "node_modules/@jridgewell/trace-mapping": { 604 | "version": "0.3.18", 605 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 606 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 607 | "peer": true, 608 | "dependencies": { 609 | "@jridgewell/resolve-uri": "3.1.0", 610 | "@jridgewell/sourcemap-codec": "1.4.14" 611 | } 612 | }, 613 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { 614 | "version": "1.4.14", 615 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 616 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 617 | "peer": true 618 | }, 619 | "node_modules/@mui/base": { 620 | "version": "5.0.0-alpha.67", 621 | "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.67.tgz", 622 | "integrity": "sha512-yK2++NivZUitAVpheMc5QVuwrVCphrTw85L6qjKcvnSpB8wmVYne58CY2vzMCNEuHkuHG2jccq9/JlRZFGAanw==", 623 | "dependencies": { 624 | "@babel/runtime": "^7.16.7", 625 | "@emotion/is-prop-valid": "^1.1.1", 626 | "@mui/utils": "^5.3.0", 627 | "@popperjs/core": "^2.4.4", 628 | "clsx": "^1.1.1", 629 | "prop-types": "^15.7.2", 630 | "react-is": "^17.0.2" 631 | }, 632 | "engines": { 633 | "node": ">=12.0.0" 634 | }, 635 | "funding": { 636 | "type": "opencollective", 637 | "url": "https://opencollective.com/mui" 638 | }, 639 | "peerDependencies": { 640 | "@types/react": "^16.8.6 || ^17.0.0", 641 | "react": "^17.0.0", 642 | "react-dom": "^17.0.0" 643 | }, 644 | "peerDependenciesMeta": { 645 | "@types/react": { 646 | "optional": true 647 | } 648 | } 649 | }, 650 | "node_modules/@mui/icons-material": { 651 | "version": "5.3.1", 652 | "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.3.1.tgz", 653 | "integrity": "sha512-8zBWCaE8DHjIGZhGgMod92p6Rm38EhXrS+cZtaV0+jOTMeWh7z+mvswXzb/rVKc0ZYqw6mQYBcn2uEs2yclI9w==", 654 | "dependencies": { 655 | "@babel/runtime": "^7.16.7" 656 | }, 657 | "engines": { 658 | "node": ">=12.0.0" 659 | }, 660 | "funding": { 661 | "type": "opencollective", 662 | "url": "https://opencollective.com/mui" 663 | }, 664 | "peerDependencies": { 665 | "@mui/material": "^5.0.0", 666 | "@types/react": "^16.8.6 || ^17.0.0", 667 | "react": "^17.0.0" 668 | }, 669 | "peerDependenciesMeta": { 670 | "@types/react": { 671 | "optional": true 672 | } 673 | } 674 | }, 675 | "node_modules/@mui/material": { 676 | "version": "5.4.0", 677 | "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.0.tgz", 678 | "integrity": "sha512-vfBIAMsRNWI/A4p/eP01MjqhSACwxRGYp/2Yi7WAU64PpI/TXR4b9SRl+XJMMJXVC7+abu4E3hTdF3oqwMCSYA==", 679 | "dependencies": { 680 | "@babel/runtime": "^7.16.7", 681 | "@mui/base": "5.0.0-alpha.67", 682 | "@mui/system": "^5.4.0", 683 | "@mui/types": "^7.1.0", 684 | "@mui/utils": "^5.3.0", 685 | "@types/react-transition-group": "^4.4.4", 686 | "clsx": "^1.1.1", 687 | "csstype": "^3.0.10", 688 | "hoist-non-react-statics": "^3.3.2", 689 | "prop-types": "^15.7.2", 690 | "react-is": "^17.0.2", 691 | "react-transition-group": "^4.4.2" 692 | }, 693 | "engines": { 694 | "node": ">=12.0.0" 695 | }, 696 | "funding": { 697 | "type": "opencollective", 698 | "url": "https://opencollective.com/mui" 699 | }, 700 | "peerDependencies": { 701 | "@emotion/react": "^11.5.0", 702 | "@emotion/styled": "^11.3.0", 703 | "@types/react": "^16.8.6 || ^17.0.0", 704 | "react": "^17.0.0", 705 | "react-dom": "^17.0.0" 706 | }, 707 | "peerDependenciesMeta": { 708 | "@emotion/react": { 709 | "optional": true 710 | }, 711 | "@emotion/styled": { 712 | "optional": true 713 | }, 714 | "@types/react": { 715 | "optional": true 716 | } 717 | } 718 | }, 719 | "node_modules/@mui/private-theming": { 720 | "version": "5.3.0", 721 | "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.3.0.tgz", 722 | "integrity": "sha512-EBobUEyM9fMnteKrVPp8pTMUh81xXakyfdpkoh7Y19q9JpD2eh7QGAQVJVj0JBFlcUJD60NIE4K8rdokrRmLwg==", 723 | "dependencies": { 724 | "@babel/runtime": "^7.16.7", 725 | "@mui/utils": "^5.3.0", 726 | "prop-types": "^15.7.2" 727 | }, 728 | "engines": { 729 | "node": ">=12.0.0" 730 | }, 731 | "funding": { 732 | "type": "opencollective", 733 | "url": "https://opencollective.com/mui" 734 | }, 735 | "peerDependencies": { 736 | "@types/react": "^16.8.6 || ^17.0.0", 737 | "react": "^17.0.0" 738 | }, 739 | "peerDependenciesMeta": { 740 | "@types/react": { 741 | "optional": true 742 | } 743 | } 744 | }, 745 | "node_modules/@mui/styled-engine": { 746 | "version": "5.3.0", 747 | "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.3.0.tgz", 748 | "integrity": "sha512-I4YemFy9WnCLUdZ5T+6egpzc8e7Jq/uh9AJ3QInZHbyNu/9I2SWvNn7vHjWOT/D8Y8LMzIOhu5WwZbzjez7YRw==", 749 | "dependencies": { 750 | "@babel/runtime": "^7.16.7", 751 | "@emotion/cache": "^11.7.1", 752 | "prop-types": "^15.7.2" 753 | }, 754 | "engines": { 755 | "node": ">=12.0.0" 756 | }, 757 | "funding": { 758 | "type": "opencollective", 759 | "url": "https://opencollective.com/mui" 760 | }, 761 | "peerDependencies": { 762 | "@emotion/react": "^11.4.1", 763 | "@emotion/styled": "^11.3.0", 764 | "react": "^17.0.0" 765 | }, 766 | "peerDependenciesMeta": { 767 | "@emotion/react": { 768 | "optional": true 769 | }, 770 | "@emotion/styled": { 771 | "optional": true 772 | } 773 | } 774 | }, 775 | "node_modules/@mui/system": { 776 | "version": "5.4.0", 777 | "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.0.tgz", 778 | "integrity": "sha512-LX7g5gK5yCwiueSUVG73uVNc0yeHjsWUIFLrnPjP3m+J7O38RkPqyao5nZahhaSL1PGNbR9+zfkxljXthO9QqA==", 779 | "dependencies": { 780 | "@babel/runtime": "^7.16.7", 781 | "@mui/private-theming": "^5.3.0", 782 | "@mui/styled-engine": "^5.3.0", 783 | "@mui/types": "^7.1.0", 784 | "@mui/utils": "^5.3.0", 785 | "clsx": "^1.1.1", 786 | "csstype": "^3.0.10", 787 | "prop-types": "^15.7.2" 788 | }, 789 | "engines": { 790 | "node": ">=12.0.0" 791 | }, 792 | "funding": { 793 | "type": "opencollective", 794 | "url": "https://opencollective.com/mui" 795 | }, 796 | "peerDependencies": { 797 | "@emotion/react": "^11.5.0", 798 | "@emotion/styled": "^11.3.0", 799 | "@types/react": "^16.8.6 || ^17.0.0", 800 | "react": "^17.0.0" 801 | }, 802 | "peerDependenciesMeta": { 803 | "@emotion/react": { 804 | "optional": true 805 | }, 806 | "@emotion/styled": { 807 | "optional": true 808 | }, 809 | "@types/react": { 810 | "optional": true 811 | } 812 | } 813 | }, 814 | "node_modules/@mui/types": { 815 | "version": "7.1.0", 816 | "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz", 817 | "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==", 818 | "peerDependencies": { 819 | "@types/react": "*" 820 | }, 821 | "peerDependenciesMeta": { 822 | "@types/react": { 823 | "optional": true 824 | } 825 | } 826 | }, 827 | "node_modules/@mui/utils": { 828 | "version": "5.3.0", 829 | "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.3.0.tgz", 830 | "integrity": "sha512-O/E9IQKPMg0OrN7+gkn7Ga5o5WA2iXQGdyqNBFPNrYzxOvwzsEtM5K7MtTCGGYKFe8mhTRM0ZOjh5OM0dglw+Q==", 831 | "dependencies": { 832 | "@babel/runtime": "^7.16.7", 833 | "@types/prop-types": "^15.7.4", 834 | "@types/react-is": "^16.7.1 || ^17.0.0", 835 | "prop-types": "^15.7.2", 836 | "react-is": "^17.0.2" 837 | }, 838 | "engines": { 839 | "node": ">=12.0.0" 840 | }, 841 | "funding": { 842 | "type": "opencollective", 843 | "url": "https://opencollective.com/mui" 844 | }, 845 | "peerDependencies": { 846 | "react": "^17.0.0" 847 | } 848 | }, 849 | "node_modules/@next/env": { 850 | "version": "12.0.10", 851 | "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.10.tgz", 852 | "integrity": "sha512-mQVj0K6wQ5WEk/sL9SZ+mJXJUaG7el8CpZ6io1uFe9GgNTSC7EgUyNGqM6IQovIFc5ukF4O/hqsdh3S/DCgT2g==" 853 | }, 854 | "node_modules/@next/swc-android-arm64": { 855 | "version": "12.0.10", 856 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.10.tgz", 857 | "integrity": "sha512-xYwXGkNhzZZsM5MD7KRwF5ZNiC8OLPtVMUiagpPnwENg8Hb0GSQo/NbYWXM8YrawEwp9LaZ7OXiuRKPh2JyBdA==", 858 | "cpu": [ 859 | "arm64" 860 | ], 861 | "optional": true, 862 | "os": [ 863 | "android" 864 | ], 865 | "engines": { 866 | "node": ">= 10" 867 | } 868 | }, 869 | "node_modules/@next/swc-darwin-arm64": { 870 | "version": "12.0.10", 871 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.10.tgz", 872 | "integrity": "sha512-f2zngulkpIJKWHckhRi7X8GZ+J/tNgFF7lYIh7Qx15JH0OTBsjkqxORlkzy+VZyHJ5sWTCaI6HYYd3ow6qkEEg==", 873 | "cpu": [ 874 | "arm64" 875 | ], 876 | "optional": true, 877 | "os": [ 878 | "darwin" 879 | ], 880 | "engines": { 881 | "node": ">= 10" 882 | } 883 | }, 884 | "node_modules/@next/swc-darwin-x64": { 885 | "version": "12.0.10", 886 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.10.tgz", 887 | "integrity": "sha512-Qykcu/gVC5oTvOQoRBhyuS5GYm5SbcgrFTsaLFkGBmEkg9eMQRiaCswk4IafpDXVzITkVFurzSM28q3tLW2qUw==", 888 | "cpu": [ 889 | "x64" 890 | ], 891 | "optional": true, 892 | "os": [ 893 | "darwin" 894 | ], 895 | "engines": { 896 | "node": ">= 10" 897 | } 898 | }, 899 | "node_modules/@next/swc-linux-arm-gnueabihf": { 900 | "version": "12.0.10", 901 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.10.tgz", 902 | "integrity": "sha512-EhqrTFsIXAXN9B/fiiW/QKUK/lSLCXRsLalkUp58KDfMqVLLlj1ORbESAcswiNQOChLuHQSldGEEtOBPQZcd9A==", 903 | "cpu": [ 904 | "arm" 905 | ], 906 | "optional": true, 907 | "os": [ 908 | "linux" 909 | ], 910 | "engines": { 911 | "node": ">= 10" 912 | } 913 | }, 914 | "node_modules/@next/swc-linux-arm64-gnu": { 915 | "version": "12.0.10", 916 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.10.tgz", 917 | "integrity": "sha512-kqGtC72g3+JYXZbY2ca6digXR5U6AQ6Dzv4eAxYluMePLHjI/Xye1mf9dwVsgmeXfrD/IRDp5K/3A6UNvBm4oQ==", 918 | "cpu": [ 919 | "arm64" 920 | ], 921 | "optional": true, 922 | "os": [ 923 | "linux" 924 | ], 925 | "engines": { 926 | "node": ">= 10" 927 | } 928 | }, 929 | "node_modules/@next/swc-linux-arm64-musl": { 930 | "version": "12.0.10", 931 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.10.tgz", 932 | "integrity": "sha512-bG9zTSNwnSgc1Un/7oz1ZVN4UeXsTWrsQhAGWU78lLLCn4Zj9HQoUCRCGLt0OVs2DBZ+WC8CzzFliQ1SKipVbg==", 933 | "cpu": [ 934 | "arm64" 935 | ], 936 | "optional": true, 937 | "os": [ 938 | "linux" 939 | ], 940 | "engines": { 941 | "node": ">= 10" 942 | } 943 | }, 944 | "node_modules/@next/swc-linux-x64-gnu": { 945 | "version": "12.0.10", 946 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.10.tgz", 947 | "integrity": "sha512-c79PcfWtyThiYRa1+3KVfDq0zXaI8o1d6dQWNVqDrtLz5HKM/rbjLdvoNuxDwUeZhxI/d9CtyH6GbuKPw5l/5A==", 948 | "cpu": [ 949 | "x64" 950 | ], 951 | "optional": true, 952 | "os": [ 953 | "linux" 954 | ], 955 | "engines": { 956 | "node": ">= 10" 957 | } 958 | }, 959 | "node_modules/@next/swc-linux-x64-musl": { 960 | "version": "12.0.10", 961 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.10.tgz", 962 | "integrity": "sha512-g/scgn+21/MLfizOCZOZt+MxNj2/8Tdlwjvy+QZcSUPZRUI2Y5o3HwBvI1f/bSci+NGRU+bUAO0NFtRJ9MzH5w==", 963 | "cpu": [ 964 | "x64" 965 | ], 966 | "optional": true, 967 | "os": [ 968 | "linux" 969 | ], 970 | "engines": { 971 | "node": ">= 10" 972 | } 973 | }, 974 | "node_modules/@next/swc-win32-arm64-msvc": { 975 | "version": "12.0.10", 976 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.10.tgz", 977 | "integrity": "sha512-gl6B/ravwMeY5Nv4Il2/ARYJQ6u+KPRwGMjS1ZrNudIKlNn4YBeXh5A4cIVm+dHaff6/O/lGOa5/SUYDMZpkww==", 978 | "cpu": [ 979 | "arm64" 980 | ], 981 | "optional": true, 982 | "os": [ 983 | "win32" 984 | ], 985 | "engines": { 986 | "node": ">= 10" 987 | } 988 | }, 989 | "node_modules/@next/swc-win32-ia32-msvc": { 990 | "version": "12.0.10", 991 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.10.tgz", 992 | "integrity": "sha512-7RVpZ3tSThC6j+iZB0CUYmFiA3kXmN+pE7QcfyAxFaflKlaZoWNMKHIEZDuxSJc6YmQ6kyxsjqxVay2F5+/YCg==", 993 | "cpu": [ 994 | "ia32" 995 | ], 996 | "optional": true, 997 | "os": [ 998 | "win32" 999 | ], 1000 | "engines": { 1001 | "node": ">= 10" 1002 | } 1003 | }, 1004 | "node_modules/@next/swc-win32-x64-msvc": { 1005 | "version": "12.0.10", 1006 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.10.tgz", 1007 | "integrity": "sha512-oUIWRKd24jFLRWUYO1CZmML5+32BcpVfqhimGaaZIXcOkfQW+iqiAzdqsv688zaGtyKGeB9ZtiK3NDf+Q0v+Vw==", 1008 | "cpu": [ 1009 | "x64" 1010 | ], 1011 | "optional": true, 1012 | "os": [ 1013 | "win32" 1014 | ], 1015 | "engines": { 1016 | "node": ">= 10" 1017 | } 1018 | }, 1019 | "node_modules/@popperjs/core": { 1020 | "version": "2.11.2", 1021 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", 1022 | "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", 1023 | "funding": { 1024 | "type": "opencollective", 1025 | "url": "https://opencollective.com/popperjs" 1026 | } 1027 | }, 1028 | "node_modules/@types/parse-json": { 1029 | "version": "4.0.0", 1030 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 1031 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" 1032 | }, 1033 | "node_modules/@types/prop-types": { 1034 | "version": "15.7.4", 1035 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", 1036 | "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" 1037 | }, 1038 | "node_modules/@types/react": { 1039 | "version": "17.0.39", 1040 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", 1041 | "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", 1042 | "dependencies": { 1043 | "@types/prop-types": "*", 1044 | "@types/scheduler": "*", 1045 | "csstype": "^3.0.2" 1046 | } 1047 | }, 1048 | "node_modules/@types/react-is": { 1049 | "version": "17.0.3", 1050 | "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", 1051 | "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", 1052 | "dependencies": { 1053 | "@types/react": "*" 1054 | } 1055 | }, 1056 | "node_modules/@types/react-transition-group": { 1057 | "version": "4.4.4", 1058 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", 1059 | "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", 1060 | "dependencies": { 1061 | "@types/react": "*" 1062 | } 1063 | }, 1064 | "node_modules/@types/scheduler": { 1065 | "version": "0.16.2", 1066 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 1067 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" 1068 | }, 1069 | "node_modules/ansi-styles": { 1070 | "version": "3.2.1", 1071 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1072 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1073 | "dependencies": { 1074 | "color-convert": "^1.9.0" 1075 | }, 1076 | "engines": { 1077 | "node": ">=4" 1078 | } 1079 | }, 1080 | "node_modules/aos": { 1081 | "version": "2.3.4", 1082 | "resolved": "https://registry.npmjs.org/aos/-/aos-2.3.4.tgz", 1083 | "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==", 1084 | "dependencies": { 1085 | "classlist-polyfill": "^1.0.3", 1086 | "lodash.debounce": "^4.0.6", 1087 | "lodash.throttle": "^4.0.1" 1088 | } 1089 | }, 1090 | "node_modules/attr-accept": { 1091 | "version": "2.2.2", 1092 | "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", 1093 | "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", 1094 | "engines": { 1095 | "node": ">=4" 1096 | } 1097 | }, 1098 | "node_modules/axios": { 1099 | "version": "0.25.0", 1100 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", 1101 | "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", 1102 | "dependencies": { 1103 | "follow-redirects": "^1.14.7" 1104 | } 1105 | }, 1106 | "node_modules/babel-plugin-macros": { 1107 | "version": "2.8.0", 1108 | "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", 1109 | "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", 1110 | "dependencies": { 1111 | "@babel/runtime": "^7.7.2", 1112 | "cosmiconfig": "^6.0.0", 1113 | "resolve": "^1.12.0" 1114 | } 1115 | }, 1116 | "node_modules/browserslist": { 1117 | "version": "4.21.9", 1118 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", 1119 | "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", 1120 | "funding": [ 1121 | { 1122 | "type": "opencollective", 1123 | "url": "https://opencollective.com/browserslist" 1124 | }, 1125 | { 1126 | "type": "tidelift", 1127 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1128 | }, 1129 | { 1130 | "type": "github", 1131 | "url": "https://github.com/sponsors/ai" 1132 | } 1133 | ], 1134 | "peer": true, 1135 | "dependencies": { 1136 | "caniuse-lite": "^1.0.30001503", 1137 | "electron-to-chromium": "^1.4.431", 1138 | "node-releases": "^2.0.12", 1139 | "update-browserslist-db": "^1.0.11" 1140 | }, 1141 | "bin": { 1142 | "browserslist": "cli.js" 1143 | }, 1144 | "engines": { 1145 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1146 | } 1147 | }, 1148 | "node_modules/buffer-from": { 1149 | "version": "0.1.2", 1150 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", 1151 | "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==" 1152 | }, 1153 | "node_modules/callsites": { 1154 | "version": "3.1.0", 1155 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1156 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1157 | "engines": { 1158 | "node": ">=6" 1159 | } 1160 | }, 1161 | "node_modules/caniuse-lite": { 1162 | "version": "1.0.30001512", 1163 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", 1164 | "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", 1165 | "funding": [ 1166 | { 1167 | "type": "opencollective", 1168 | "url": "https://opencollective.com/browserslist" 1169 | }, 1170 | { 1171 | "type": "tidelift", 1172 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1173 | }, 1174 | { 1175 | "type": "github", 1176 | "url": "https://github.com/sponsors/ai" 1177 | } 1178 | ] 1179 | }, 1180 | "node_modules/chalk": { 1181 | "version": "2.4.2", 1182 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1183 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1184 | "dependencies": { 1185 | "ansi-styles": "^3.2.1", 1186 | "escape-string-regexp": "^1.0.5", 1187 | "supports-color": "^5.3.0" 1188 | }, 1189 | "engines": { 1190 | "node": ">=4" 1191 | } 1192 | }, 1193 | "node_modules/chalk/node_modules/escape-string-regexp": { 1194 | "version": "1.0.5", 1195 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1196 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1197 | "engines": { 1198 | "node": ">=0.8.0" 1199 | } 1200 | }, 1201 | "node_modules/classlist-polyfill": { 1202 | "version": "1.2.0", 1203 | "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz", 1204 | "integrity": "sha1-k1vC39lFiodrJ5YXUUY4vKqWSi4=" 1205 | }, 1206 | "node_modules/clsx": { 1207 | "version": "1.1.1", 1208 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", 1209 | "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", 1210 | "engines": { 1211 | "node": ">=6" 1212 | } 1213 | }, 1214 | "node_modules/color-convert": { 1215 | "version": "1.9.3", 1216 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1217 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1218 | "dependencies": { 1219 | "color-name": "1.1.3" 1220 | } 1221 | }, 1222 | "node_modules/color-name": { 1223 | "version": "1.1.3", 1224 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1225 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 1226 | }, 1227 | "node_modules/convert-source-map": { 1228 | "version": "1.8.0", 1229 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 1230 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 1231 | "dependencies": { 1232 | "safe-buffer": "~5.1.1" 1233 | } 1234 | }, 1235 | "node_modules/core-util-is": { 1236 | "version": "1.0.3", 1237 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1238 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 1239 | }, 1240 | "node_modules/cosmiconfig": { 1241 | "version": "6.0.0", 1242 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", 1243 | "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", 1244 | "dependencies": { 1245 | "@types/parse-json": "^4.0.0", 1246 | "import-fresh": "^3.1.0", 1247 | "parse-json": "^5.0.0", 1248 | "path-type": "^4.0.0", 1249 | "yaml": "^1.7.2" 1250 | }, 1251 | "engines": { 1252 | "node": ">=8" 1253 | } 1254 | }, 1255 | "node_modules/csstype": { 1256 | "version": "3.0.10", 1257 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", 1258 | "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" 1259 | }, 1260 | "node_modules/debug": { 1261 | "version": "4.3.4", 1262 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1263 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1264 | "peer": true, 1265 | "dependencies": { 1266 | "ms": "2.1.2" 1267 | }, 1268 | "engines": { 1269 | "node": ">=6.0" 1270 | }, 1271 | "peerDependenciesMeta": { 1272 | "supports-color": { 1273 | "optional": true 1274 | } 1275 | } 1276 | }, 1277 | "node_modules/dom-helpers": { 1278 | "version": "5.2.1", 1279 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", 1280 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", 1281 | "dependencies": { 1282 | "@babel/runtime": "^7.8.7", 1283 | "csstype": "^3.0.2" 1284 | } 1285 | }, 1286 | "node_modules/duplexer2": { 1287 | "version": "0.1.4", 1288 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 1289 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 1290 | "dependencies": { 1291 | "readable-stream": "^2.0.2" 1292 | } 1293 | }, 1294 | "node_modules/duplexer2/node_modules/isarray": { 1295 | "version": "1.0.0", 1296 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1297 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1298 | }, 1299 | "node_modules/duplexer2/node_modules/readable-stream": { 1300 | "version": "2.3.7", 1301 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1302 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1303 | "dependencies": { 1304 | "core-util-is": "~1.0.0", 1305 | "inherits": "~2.0.3", 1306 | "isarray": "~1.0.0", 1307 | "process-nextick-args": "~2.0.0", 1308 | "safe-buffer": "~5.1.1", 1309 | "string_decoder": "~1.1.1", 1310 | "util-deprecate": "~1.0.1" 1311 | } 1312 | }, 1313 | "node_modules/duplexer2/node_modules/string_decoder": { 1314 | "version": "1.1.1", 1315 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1316 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1317 | "dependencies": { 1318 | "safe-buffer": "~5.1.0" 1319 | } 1320 | }, 1321 | "node_modules/electron-to-chromium": { 1322 | "version": "1.4.449", 1323 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.449.tgz", 1324 | "integrity": "sha512-TxLRpRUj/107ATefeP8VIUWNOv90xJxZZbCW/eIbSZQiuiFANCx2b7u+GbVc9X4gU+xnbvypNMYVM/WArE1DNQ==", 1325 | "peer": true 1326 | }, 1327 | "node_modules/error-ex": { 1328 | "version": "1.3.2", 1329 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1330 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1331 | "dependencies": { 1332 | "is-arrayish": "^0.2.1" 1333 | } 1334 | }, 1335 | "node_modules/escalade": { 1336 | "version": "3.1.1", 1337 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1338 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1339 | "peer": true, 1340 | "engines": { 1341 | "node": ">=6" 1342 | } 1343 | }, 1344 | "node_modules/escape-string-regexp": { 1345 | "version": "4.0.0", 1346 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1347 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1348 | "engines": { 1349 | "node": ">=10" 1350 | }, 1351 | "funding": { 1352 | "url": "https://github.com/sponsors/sindresorhus" 1353 | } 1354 | }, 1355 | "node_modules/file-selector": { 1356 | "version": "0.2.4", 1357 | "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", 1358 | "integrity": "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==", 1359 | "dependencies": { 1360 | "tslib": "^2.0.3" 1361 | }, 1362 | "engines": { 1363 | "node": ">= 10" 1364 | } 1365 | }, 1366 | "node_modules/find-root": { 1367 | "version": "1.1.0", 1368 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 1369 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" 1370 | }, 1371 | "node_modules/follow-redirects": { 1372 | "version": "1.14.7", 1373 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", 1374 | "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", 1375 | "funding": [ 1376 | { 1377 | "type": "individual", 1378 | "url": "https://github.com/sponsors/RubenVerborgh" 1379 | } 1380 | ], 1381 | "engines": { 1382 | "node": ">=4.0" 1383 | }, 1384 | "peerDependenciesMeta": { 1385 | "debug": { 1386 | "optional": true 1387 | } 1388 | } 1389 | }, 1390 | "node_modules/function-bind": { 1391 | "version": "1.1.1", 1392 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1393 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1394 | }, 1395 | "node_modules/gensync": { 1396 | "version": "1.0.0-beta.2", 1397 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1398 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1399 | "peer": true, 1400 | "engines": { 1401 | "node": ">=6.9.0" 1402 | } 1403 | }, 1404 | "node_modules/globals": { 1405 | "version": "11.12.0", 1406 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1407 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1408 | "peer": true, 1409 | "engines": { 1410 | "node": ">=4" 1411 | } 1412 | }, 1413 | "node_modules/has": { 1414 | "version": "1.0.3", 1415 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1416 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1417 | "dependencies": { 1418 | "function-bind": "^1.1.1" 1419 | }, 1420 | "engines": { 1421 | "node": ">= 0.4.0" 1422 | } 1423 | }, 1424 | "node_modules/has-flag": { 1425 | "version": "3.0.0", 1426 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1427 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1428 | "engines": { 1429 | "node": ">=4" 1430 | } 1431 | }, 1432 | "node_modules/hoist-non-react-statics": { 1433 | "version": "3.3.2", 1434 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", 1435 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", 1436 | "dependencies": { 1437 | "react-is": "^16.7.0" 1438 | } 1439 | }, 1440 | "node_modules/hoist-non-react-statics/node_modules/react-is": { 1441 | "version": "16.13.1", 1442 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1443 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 1444 | }, 1445 | "node_modules/html-tokenize": { 1446 | "version": "2.0.1", 1447 | "resolved": "https://registry.npmjs.org/html-tokenize/-/html-tokenize-2.0.1.tgz", 1448 | "integrity": "sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==", 1449 | "dependencies": { 1450 | "buffer-from": "~0.1.1", 1451 | "inherits": "~2.0.1", 1452 | "minimist": "~1.2.5", 1453 | "readable-stream": "~1.0.27-1", 1454 | "through2": "~0.4.1" 1455 | }, 1456 | "bin": { 1457 | "html-tokenize": "bin/cmd.js" 1458 | } 1459 | }, 1460 | "node_modules/import-fresh": { 1461 | "version": "3.3.0", 1462 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1463 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1464 | "dependencies": { 1465 | "parent-module": "^1.0.0", 1466 | "resolve-from": "^4.0.0" 1467 | }, 1468 | "engines": { 1469 | "node": ">=6" 1470 | }, 1471 | "funding": { 1472 | "url": "https://github.com/sponsors/sindresorhus" 1473 | } 1474 | }, 1475 | "node_modules/inherits": { 1476 | "version": "2.0.4", 1477 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1478 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1479 | }, 1480 | "node_modules/is-arrayish": { 1481 | "version": "0.2.1", 1482 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1483 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1484 | }, 1485 | "node_modules/is-core-module": { 1486 | "version": "2.8.1", 1487 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 1488 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 1489 | "dependencies": { 1490 | "has": "^1.0.3" 1491 | }, 1492 | "funding": { 1493 | "url": "https://github.com/sponsors/ljharb" 1494 | } 1495 | }, 1496 | "node_modules/isarray": { 1497 | "version": "0.0.1", 1498 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1499 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1500 | }, 1501 | "node_modules/js-tokens": { 1502 | "version": "4.0.0", 1503 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1504 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1505 | }, 1506 | "node_modules/jsesc": { 1507 | "version": "2.5.2", 1508 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1509 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1510 | "peer": true, 1511 | "bin": { 1512 | "jsesc": "bin/jsesc" 1513 | }, 1514 | "engines": { 1515 | "node": ">=4" 1516 | } 1517 | }, 1518 | "node_modules/json-parse-even-better-errors": { 1519 | "version": "2.3.1", 1520 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1521 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 1522 | }, 1523 | "node_modules/json5": { 1524 | "version": "2.2.3", 1525 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 1526 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 1527 | "peer": true, 1528 | "bin": { 1529 | "json5": "lib/cli.js" 1530 | }, 1531 | "engines": { 1532 | "node": ">=6" 1533 | } 1534 | }, 1535 | "node_modules/lines-and-columns": { 1536 | "version": "1.2.4", 1537 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1538 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 1539 | }, 1540 | "node_modules/lodash.debounce": { 1541 | "version": "4.0.8", 1542 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 1543 | "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" 1544 | }, 1545 | "node_modules/lodash.throttle": { 1546 | "version": "4.1.1", 1547 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", 1548 | "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" 1549 | }, 1550 | "node_modules/loose-envify": { 1551 | "version": "1.4.0", 1552 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1553 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1554 | "dependencies": { 1555 | "js-tokens": "^3.0.0 || ^4.0.0" 1556 | }, 1557 | "bin": { 1558 | "loose-envify": "cli.js" 1559 | } 1560 | }, 1561 | "node_modules/lru-cache": { 1562 | "version": "5.1.1", 1563 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1564 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1565 | "peer": true, 1566 | "dependencies": { 1567 | "yallist": "^3.0.2" 1568 | } 1569 | }, 1570 | "node_modules/minimist": { 1571 | "version": "1.2.5", 1572 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1573 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1574 | }, 1575 | "node_modules/ms": { 1576 | "version": "2.1.2", 1577 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1578 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1579 | "peer": true 1580 | }, 1581 | "node_modules/multipipe": { 1582 | "version": "1.0.2", 1583 | "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz", 1584 | "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=", 1585 | "dependencies": { 1586 | "duplexer2": "^0.1.2", 1587 | "object-assign": "^4.1.0" 1588 | } 1589 | }, 1590 | "node_modules/nanoid": { 1591 | "version": "3.2.0", 1592 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 1593 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", 1594 | "bin": { 1595 | "nanoid": "bin/nanoid.cjs" 1596 | }, 1597 | "engines": { 1598 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1599 | } 1600 | }, 1601 | "node_modules/next": { 1602 | "version": "12.0.10", 1603 | "resolved": "https://registry.npmjs.org/next/-/next-12.0.10.tgz", 1604 | "integrity": "sha512-1y3PpGzpb/EZzz1jgne+JfZXKAVJUjYXwxzrADf/LWN+8yi9o79vMLXpW3mevvCHkEF2sBnIdjzNn16TJrINUw==", 1605 | "dependencies": { 1606 | "@next/env": "12.0.10", 1607 | "caniuse-lite": "^1.0.30001283", 1608 | "postcss": "8.4.5", 1609 | "styled-jsx": "5.0.0", 1610 | "use-subscription": "1.5.1" 1611 | }, 1612 | "bin": { 1613 | "next": "dist/bin/next" 1614 | }, 1615 | "engines": { 1616 | "node": ">=12.22.0" 1617 | }, 1618 | "optionalDependencies": { 1619 | "@next/swc-android-arm64": "12.0.10", 1620 | "@next/swc-darwin-arm64": "12.0.10", 1621 | "@next/swc-darwin-x64": "12.0.10", 1622 | "@next/swc-linux-arm-gnueabihf": "12.0.10", 1623 | "@next/swc-linux-arm64-gnu": "12.0.10", 1624 | "@next/swc-linux-arm64-musl": "12.0.10", 1625 | "@next/swc-linux-x64-gnu": "12.0.10", 1626 | "@next/swc-linux-x64-musl": "12.0.10", 1627 | "@next/swc-win32-arm64-msvc": "12.0.10", 1628 | "@next/swc-win32-ia32-msvc": "12.0.10", 1629 | "@next/swc-win32-x64-msvc": "12.0.10" 1630 | }, 1631 | "peerDependencies": { 1632 | "fibers": ">= 3.1.0", 1633 | "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", 1634 | "react": "^17.0.2 || ^18.0.0-0", 1635 | "react-dom": "^17.0.2 || ^18.0.0-0", 1636 | "sass": "^1.3.0" 1637 | }, 1638 | "peerDependenciesMeta": { 1639 | "fibers": { 1640 | "optional": true 1641 | }, 1642 | "node-sass": { 1643 | "optional": true 1644 | }, 1645 | "sass": { 1646 | "optional": true 1647 | } 1648 | } 1649 | }, 1650 | "node_modules/node-releases": { 1651 | "version": "2.0.12", 1652 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", 1653 | "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", 1654 | "peer": true 1655 | }, 1656 | "node_modules/object-assign": { 1657 | "version": "4.1.1", 1658 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1659 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1660 | "engines": { 1661 | "node": ">=0.10.0" 1662 | } 1663 | }, 1664 | "node_modules/object-keys": { 1665 | "version": "0.4.0", 1666 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 1667 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" 1668 | }, 1669 | "node_modules/parent-module": { 1670 | "version": "1.0.1", 1671 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1672 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1673 | "dependencies": { 1674 | "callsites": "^3.0.0" 1675 | }, 1676 | "engines": { 1677 | "node": ">=6" 1678 | } 1679 | }, 1680 | "node_modules/parse-json": { 1681 | "version": "5.2.0", 1682 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1683 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1684 | "dependencies": { 1685 | "@babel/code-frame": "^7.0.0", 1686 | "error-ex": "^1.3.1", 1687 | "json-parse-even-better-errors": "^2.3.0", 1688 | "lines-and-columns": "^1.1.6" 1689 | }, 1690 | "engines": { 1691 | "node": ">=8" 1692 | }, 1693 | "funding": { 1694 | "url": "https://github.com/sponsors/sindresorhus" 1695 | } 1696 | }, 1697 | "node_modules/path-parse": { 1698 | "version": "1.0.7", 1699 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1700 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1701 | }, 1702 | "node_modules/path-type": { 1703 | "version": "4.0.0", 1704 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1705 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1706 | "engines": { 1707 | "node": ">=8" 1708 | } 1709 | }, 1710 | "node_modules/picocolors": { 1711 | "version": "1.0.0", 1712 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1713 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1714 | }, 1715 | "node_modules/postcss": { 1716 | "version": "8.4.5", 1717 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", 1718 | "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", 1719 | "dependencies": { 1720 | "nanoid": "^3.1.30", 1721 | "picocolors": "^1.0.0", 1722 | "source-map-js": "^1.0.1" 1723 | }, 1724 | "engines": { 1725 | "node": "^10 || ^12 || >=14" 1726 | }, 1727 | "funding": { 1728 | "type": "opencollective", 1729 | "url": "https://opencollective.com/postcss/" 1730 | } 1731 | }, 1732 | "node_modules/process-nextick-args": { 1733 | "version": "2.0.1", 1734 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1735 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1736 | }, 1737 | "node_modules/prop-types": { 1738 | "version": "15.8.1", 1739 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 1740 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 1741 | "dependencies": { 1742 | "loose-envify": "^1.4.0", 1743 | "object-assign": "^4.1.1", 1744 | "react-is": "^16.13.1" 1745 | } 1746 | }, 1747 | "node_modules/prop-types/node_modules/react-is": { 1748 | "version": "16.13.1", 1749 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1750 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 1751 | }, 1752 | "node_modules/react": { 1753 | "version": "17.0.2", 1754 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 1755 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 1756 | "dependencies": { 1757 | "loose-envify": "^1.1.0", 1758 | "object-assign": "^4.1.1" 1759 | }, 1760 | "engines": { 1761 | "node": ">=0.10.0" 1762 | } 1763 | }, 1764 | "node_modules/react-dom": { 1765 | "version": "17.0.2", 1766 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 1767 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 1768 | "dependencies": { 1769 | "loose-envify": "^1.1.0", 1770 | "object-assign": "^4.1.1", 1771 | "scheduler": "^0.20.2" 1772 | }, 1773 | "peerDependencies": { 1774 | "react": "17.0.2" 1775 | } 1776 | }, 1777 | "node_modules/react-dropzone": { 1778 | "version": "11.5.3", 1779 | "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.5.3.tgz", 1780 | "integrity": "sha512-68+T6sWW5L89qJnn3SD1aRazhuRBhTT9JOI1W8vI5YWsfegM4C7tlGbPH1AgEbmZY5s8E8L0QhX0e3VdAa0KWA==", 1781 | "dependencies": { 1782 | "attr-accept": "^2.2.1", 1783 | "file-selector": "^0.2.2", 1784 | "prop-types": "^15.7.2" 1785 | }, 1786 | "engines": { 1787 | "node": ">= 10" 1788 | }, 1789 | "peerDependencies": { 1790 | "react": ">= 16.8" 1791 | } 1792 | }, 1793 | "node_modules/react-is": { 1794 | "version": "17.0.2", 1795 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 1796 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" 1797 | }, 1798 | "node_modules/react-lazy-load-image-component": { 1799 | "version": "1.5.1", 1800 | "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.1.tgz", 1801 | "integrity": "sha512-grTEZzURLHPkq7JoipcBBQU44ijdF4fH3Cb+eSD5eSAaMsjugbXqTaVWm5ruPUNLduoNR9KKQF6bOR9h2WphEg==", 1802 | "dependencies": { 1803 | "lodash.debounce": "^4.0.8", 1804 | "lodash.throttle": "^4.1.1" 1805 | }, 1806 | "peerDependencies": { 1807 | "react": "^15.x.x || ^16.x.x || ^17.x.x", 1808 | "react-dom": "^15.x.x || ^16.x.x || ^17.x.x" 1809 | } 1810 | }, 1811 | "node_modules/react-transition-group": { 1812 | "version": "4.4.2", 1813 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", 1814 | "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", 1815 | "dependencies": { 1816 | "@babel/runtime": "^7.5.5", 1817 | "dom-helpers": "^5.0.1", 1818 | "loose-envify": "^1.4.0", 1819 | "prop-types": "^15.6.2" 1820 | }, 1821 | "peerDependencies": { 1822 | "react": ">=16.6.0", 1823 | "react-dom": ">=16.6.0" 1824 | } 1825 | }, 1826 | "node_modules/readable-stream": { 1827 | "version": "1.0.34", 1828 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 1829 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 1830 | "dependencies": { 1831 | "core-util-is": "~1.0.0", 1832 | "inherits": "~2.0.1", 1833 | "isarray": "0.0.1", 1834 | "string_decoder": "~0.10.x" 1835 | } 1836 | }, 1837 | "node_modules/regenerator-runtime": { 1838 | "version": "0.13.9", 1839 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 1840 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 1841 | }, 1842 | "node_modules/resolve": { 1843 | "version": "1.22.0", 1844 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1845 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1846 | "dependencies": { 1847 | "is-core-module": "^2.8.1", 1848 | "path-parse": "^1.0.7", 1849 | "supports-preserve-symlinks-flag": "^1.0.0" 1850 | }, 1851 | "bin": { 1852 | "resolve": "bin/resolve" 1853 | }, 1854 | "funding": { 1855 | "url": "https://github.com/sponsors/ljharb" 1856 | } 1857 | }, 1858 | "node_modules/resolve-from": { 1859 | "version": "4.0.0", 1860 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1861 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1862 | "engines": { 1863 | "node": ">=4" 1864 | } 1865 | }, 1866 | "node_modules/safe-buffer": { 1867 | "version": "5.1.2", 1868 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1869 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1870 | }, 1871 | "node_modules/scheduler": { 1872 | "version": "0.20.2", 1873 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 1874 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 1875 | "dependencies": { 1876 | "loose-envify": "^1.1.0", 1877 | "object-assign": "^4.1.1" 1878 | } 1879 | }, 1880 | "node_modules/semver": { 1881 | "version": "6.3.0", 1882 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1883 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1884 | "peer": true, 1885 | "bin": { 1886 | "semver": "bin/semver.js" 1887 | } 1888 | }, 1889 | "node_modules/source-map": { 1890 | "version": "0.5.7", 1891 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1892 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1893 | "engines": { 1894 | "node": ">=0.10.0" 1895 | } 1896 | }, 1897 | "node_modules/source-map-js": { 1898 | "version": "1.0.2", 1899 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1900 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1901 | "engines": { 1902 | "node": ">=0.10.0" 1903 | } 1904 | }, 1905 | "node_modules/string_decoder": { 1906 | "version": "0.10.31", 1907 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1908 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1909 | }, 1910 | "node_modules/styled-jsx": { 1911 | "version": "5.0.0", 1912 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", 1913 | "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", 1914 | "engines": { 1915 | "node": ">= 12.0.0" 1916 | }, 1917 | "peerDependencies": { 1918 | "react": ">= 16.8.0 || 17.x.x || 18.x.x" 1919 | }, 1920 | "peerDependenciesMeta": { 1921 | "@babel/core": { 1922 | "optional": true 1923 | }, 1924 | "babel-plugin-macros": { 1925 | "optional": true 1926 | } 1927 | } 1928 | }, 1929 | "node_modules/stylis": { 1930 | "version": "4.0.13", 1931 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", 1932 | "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" 1933 | }, 1934 | "node_modules/supports-color": { 1935 | "version": "5.5.0", 1936 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1937 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1938 | "dependencies": { 1939 | "has-flag": "^3.0.0" 1940 | }, 1941 | "engines": { 1942 | "node": ">=4" 1943 | } 1944 | }, 1945 | "node_modules/supports-preserve-symlinks-flag": { 1946 | "version": "1.0.0", 1947 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1948 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1949 | "engines": { 1950 | "node": ">= 0.4" 1951 | }, 1952 | "funding": { 1953 | "url": "https://github.com/sponsors/ljharb" 1954 | } 1955 | }, 1956 | "node_modules/through": { 1957 | "version": "2.3.8", 1958 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1959 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1960 | }, 1961 | "node_modules/through2": { 1962 | "version": "0.4.2", 1963 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", 1964 | "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", 1965 | "dependencies": { 1966 | "readable-stream": "~1.0.17", 1967 | "xtend": "~2.1.1" 1968 | } 1969 | }, 1970 | "node_modules/to-fast-properties": { 1971 | "version": "2.0.0", 1972 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1973 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1974 | "engines": { 1975 | "node": ">=4" 1976 | } 1977 | }, 1978 | "node_modules/tslib": { 1979 | "version": "2.3.1", 1980 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1981 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1982 | }, 1983 | "node_modules/update-browserslist-db": { 1984 | "version": "1.0.11", 1985 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", 1986 | "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", 1987 | "funding": [ 1988 | { 1989 | "type": "opencollective", 1990 | "url": "https://opencollective.com/browserslist" 1991 | }, 1992 | { 1993 | "type": "tidelift", 1994 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1995 | }, 1996 | { 1997 | "type": "github", 1998 | "url": "https://github.com/sponsors/ai" 1999 | } 2000 | ], 2001 | "peer": true, 2002 | "dependencies": { 2003 | "escalade": "^3.1.1", 2004 | "picocolors": "^1.0.0" 2005 | }, 2006 | "bin": { 2007 | "update-browserslist-db": "cli.js" 2008 | }, 2009 | "peerDependencies": { 2010 | "browserslist": ">= 4.21.0" 2011 | } 2012 | }, 2013 | "node_modules/use-subscription": { 2014 | "version": "1.5.1", 2015 | "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", 2016 | "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", 2017 | "dependencies": { 2018 | "object-assign": "^4.1.1" 2019 | }, 2020 | "peerDependencies": { 2021 | "react": "^16.8.0 || ^17.0.0" 2022 | } 2023 | }, 2024 | "node_modules/util-deprecate": { 2025 | "version": "1.0.2", 2026 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2027 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2028 | }, 2029 | "node_modules/xtend": { 2030 | "version": "2.1.2", 2031 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 2032 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 2033 | "dependencies": { 2034 | "object-keys": "~0.4.0" 2035 | }, 2036 | "engines": { 2037 | "node": ">=0.4" 2038 | } 2039 | }, 2040 | "node_modules/yallist": { 2041 | "version": "3.1.1", 2042 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 2043 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 2044 | "peer": true 2045 | }, 2046 | "node_modules/yaml": { 2047 | "version": "1.10.2", 2048 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2049 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 2050 | "engines": { 2051 | "node": ">= 6" 2052 | } 2053 | } 2054 | } 2055 | } 2056 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "image-classification", 3 | "version": "1.0.0", 4 | "description": "Image Classification", 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "author": "MG", 11 | "license": "MIT", 12 | "dependencies": { 13 | "@emotion/cache": "^11.7.1", 14 | "@emotion/react": "^11.7.1", 15 | "@emotion/server": "^11.4.0", 16 | "@emotion/styled": "^11.6.0", 17 | "@fortawesome/fontawesome-svg-core": "^1.3.0", 18 | "@fortawesome/free-regular-svg-icons": "^6.0.0", 19 | "@fortawesome/react-fontawesome": "^0.1.17", 20 | "@mui/icons-material": "^5.3.1", 21 | "@mui/material": "^5.4.0", 22 | "aos": "^2.3.4", 23 | "axios": "^0.25.0", 24 | "next": "^12.0.10", 25 | "prop-types": "^15.8.1", 26 | "react": "^17.0.2", 27 | "react-dom": "^17.0.2", 28 | "react-dropzone": "^11.5.3", 29 | "react-lazy-load-image-component": "^1.5.1" 30 | }, 31 | "devDependencies": { 32 | "regenerator-runtime": "^0.13.9" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /frontend/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BobsProgrammingAcademy/image-classification/fcd3db10948301436783b592913843395d13016d/frontend/public/images/favicon.ico -------------------------------------------------------------------------------- /frontend/public/images/image_classification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BobsProgrammingAcademy/image-classification/fcd3db10948301436783b592913843395d13016d/frontend/public/images/image_classification.png -------------------------------------------------------------------------------- /frontend/public/images/img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BobsProgrammingAcademy/image-classification/fcd3db10948301436783b592913843395d13016d/frontend/public/images/img1.jpg -------------------------------------------------------------------------------- /frontend/src/components/ClassifierButtons.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Button from '@mui/material/Button'; 3 | import Box from '@mui/material/Box'; 4 | import { useTheme, useMediaQuery } from '@mui/material'; 5 | 6 | // Material Icons 7 | import ResetIcon from '@mui/icons-material/RotateLeft'; 8 | import SendIcon from '@mui/icons-material/SendToMobile'; 9 | 10 | const ClassifierButtons = ({ submitOnClick, resetOnClick }) => { 11 | const theme = useTheme(); 12 | const isMd = useMediaQuery(theme.breakpoints.up('md'), { 13 | defaultMatches: true, 14 | }); 15 | 16 | return ( 17 | <> 18 | 19 | 26 | 48 | 53 | 75 | 76 | 77 | 78 | 79 | ); 80 | }; 81 | 82 | export default ClassifierButtons; 83 | -------------------------------------------------------------------------------- /frontend/src/components/ClassifierHeader.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Box from '@mui/material/Box'; 3 | import Grid from '@mui/material/Grid'; 4 | import Typography from '@mui/material/Typography'; 5 | import { useTheme } from '@mui/material'; 6 | 7 | const ClassifierHeader = () => { 8 | const theme = useTheme(); 9 | 10 | return ( 11 | <> 12 | 13 | 14 | Image Classifier 15 | 16 | 17 | 18 | Select an Image for Classification 19 | 20 | 21 | 22 | 23 | ); 24 | }; 25 | 26 | export default ClassifierHeader; 27 | -------------------------------------------------------------------------------- /frontend/src/components/ClassifierResult.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Box from '@mui/material/Box'; 3 | import Card from '@mui/material/Card'; 4 | import CardContent from '@mui/material/CardContent'; 5 | import Grid from '@mui/material/Grid'; 6 | import Typography from '@mui/material/Typography'; 7 | import { useTheme } from '@mui/material'; 8 | 9 | const ClassifierResult = ({ selectedImage, classificationResult }) => { 10 | const theme = useTheme(); 11 | 12 | return ( 13 | <> 14 | 15 | 16 | 17 | 18 | 24 | 25 | Result 26 | 27 | 28 | 29 | 30 | The image you have selected: 31 |
32 |
33 |
34 | 42 | 52 | 53 |
54 |
55 | 56 | The machine learning model has classified this image as: 57 |
58 |
59 |
60 | 66 | {classificationResult} 67 | 68 |
69 |
70 |
71 |
72 |
73 | 74 | ); 75 | }; 76 | 77 | export default ClassifierResult; 78 | -------------------------------------------------------------------------------- /frontend/src/components/ClassifyAgain.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Button from '@mui/material/Button'; 3 | import Box from '@mui/material/Box'; 4 | import Grid from '@mui/material/Grid'; 5 | import { useTheme, useMediaQuery } from '@mui/material'; 6 | 7 | // Material Icons 8 | import SendIcon from '@mui/icons-material/SendToMobile'; 9 | 10 | const ClassifyAgain = ({ submitOnClick }) => { 11 | const theme = useTheme(); 12 | const isMd = useMediaQuery(theme.breakpoints.up('md'), { 13 | defaultMatches: true, 14 | }); 15 | 16 | return ( 17 | <> 18 | 19 | 20 | 27 | 49 | 50 | 51 | 52 | 53 | ); 54 | }; 55 | 56 | export default ClassifyAgain; 57 | -------------------------------------------------------------------------------- /frontend/src/components/CustomDivider.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Box from '@mui/material/Box'; 3 | import Divider from '@mui/material/Divider'; 4 | 5 | const CustomDivider = () => { 6 | return ( 7 | 13 | 14 | 15 | ); 16 | }; 17 | 18 | export default CustomDivider; 19 | -------------------------------------------------------------------------------- /frontend/src/components/Description.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Box from '@mui/material/Box'; 3 | import Container from '@mui/material/Container'; 4 | import Grid from '@mui/material/Grid'; 5 | import Typography from '@mui/material/Typography'; 6 | import { useTheme } from '@mui/material'; 7 | 8 | // Material Icons 9 | import SendToMobileOutlinedIcon from '@mui/icons-material/SendToMobileOutlined'; 10 | import GetAppOutlinedIcon from '@mui/icons-material/GetAppOutlined'; 11 | import AddAPhotoOutlinedIcon from '@mui/icons-material/AddAPhotoOutlined'; 12 | 13 | import DescriptionItem from './DescriptionItem'; 14 | 15 | const Description = () => { 16 | const theme = useTheme(); 17 | 18 | return ( 19 | 26 | 31 | 42 | 49 | How Does It Work? 50 | 51 | 60 | A step-by-step guide on how to use the app 61 | 62 | 63 | } 65 | title='Select an Image' 66 | subtitle='Select an image for classification and drag-and-drop it into the provided dropzone in the browser.' 67 | /> 68 | 71 | } 72 | title='Send the Image for Classification' 73 | subtitle='Press the Send Image button to send the image to the machine learning model for classification.' 74 | /> 75 | } 77 | title='Get the Classification Result' 78 | subtitle='Next, the machine learning model classifies the image, and the result of the classification is then printed on the screen.' 79 | /> 80 | 81 | 82 | 83 | 84 | ); 85 | }; 86 | 87 | export default Description; 88 | -------------------------------------------------------------------------------- /frontend/src/components/DescriptionItem.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Avatar from '@mui/material/Avatar'; 3 | import Box from '@mui/material/Box'; 4 | import Grid from '@mui/material/Grid'; 5 | import Typography from '@mui/material/Typography'; 6 | import { useTheme } from '@mui/material'; 7 | 8 | const DescriptionItem = ({ icon, title, subtitle }) => { 9 | const theme = useTheme(); 10 | 11 | return ( 12 | 13 | 14 | 15 | 23 | {icon} 24 | 25 | 26 | {title} 27 | 28 | 29 | {subtitle} 30 | 31 | 32 | 33 | 34 | ); 35 | }; 36 | 37 | export default DescriptionItem; 38 | -------------------------------------------------------------------------------- /frontend/src/components/Hero.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Box from '@mui/material/Box'; 3 | import Grid from '@mui/material/Grid'; 4 | import Typography from '@mui/material/Typography'; 5 | import { useTheme, useMediaQuery } from '@mui/material'; 6 | import { LazyLoadImage } from 'react-lazy-load-image-component'; 7 | 8 | import HeroButtons from '../components/HeroButtons'; 9 | 10 | const Hero = () => { 11 | const theme = useTheme(); 12 | const isMd = useMediaQuery(theme.breakpoints.up('md'), { 13 | defaultMatches: true, 14 | }); 15 | 16 | return ( 17 | 24 | 25 | 26 | 27 | 28 | 34 | Select an Image for Classification 35 | 36 | 37 | 38 | 46 | The App Will Tell You What Is On the Image You Have Selected 47 | 48 | 49 | 50 | 51 | 52 | 60 | 72 | 83 | 84 | 85 | 86 | 87 | ); 88 | }; 89 | 90 | export default Hero; 91 | -------------------------------------------------------------------------------- /frontend/src/components/HeroButtons.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Box from '@mui/material/Box'; 3 | import Button from '@mui/material/Button'; 4 | import { useTheme, useMediaQuery } from '@mui/material'; 5 | 6 | // Material Icons 7 | import InfoIcon from '@mui/icons-material/HelpOutline'; 8 | import PlayIcon from '@mui/icons-material/PlayCircleOutlineOutlined'; 9 | 10 | const HeroButtons = () => { 11 | const theme = useTheme(); 12 | const isMd = useMediaQuery(theme.breakpoints.up('md'), { 13 | defaultMatches: true, 14 | }); 15 | 16 | return ( 17 | <> 18 | 25 | 48 | 53 | 76 | 77 | 78 | 79 | ); 80 | }; 81 | 82 | export default HeroButtons; 83 | -------------------------------------------------------------------------------- /frontend/src/components/ImageDropzone.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Dropzone from 'react-dropzone'; 3 | 4 | // Material UI 5 | import Box from '@mui/material/Box'; 6 | import Link from '@mui/material/Link'; 7 | import Typography from '@mui/material/Typography'; 8 | import { useTheme } from '@mui/material'; 9 | 10 | // Font Awesome Icons 11 | import { library } from '@fortawesome/fontawesome-svg-core'; 12 | import { faImage as ImageIcon } from '@fortawesome/free-regular-svg-icons'; 13 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 14 | library.add(ImageIcon); 15 | 16 | const ImageDropzone = ({ accept, onDrop }) => { 17 | const theme = useTheme(); 18 | 19 | return ( 20 | 21 | {({ isDragActive, getRootProps, getInputProps }) => ( 22 |
23 | 47 | 48 | 55 | 56 | 57 | 65 | 66 | 67 | 71 | Drag and drop an image here, or{' '} 72 | click to select an image 73 | 74 | 75 | 76 | 77 |
78 | )} 79 |
80 | ); 81 | }; 82 | 83 | export default ImageDropzone; 84 | -------------------------------------------------------------------------------- /frontend/src/components/Spacer.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Box from '@mui/material/Box'; 3 | import { useTheme } from '@mui/material'; 4 | 5 | const Spacer = ({ sx = [] }) => { 6 | const theme = useTheme(); 7 | 8 | return ( 9 | 17 | ); 18 | }; 19 | 20 | export default Spacer; 21 | -------------------------------------------------------------------------------- /frontend/src/layout/Footer.js: -------------------------------------------------------------------------------- 1 | // Material UI 2 | import Box from '@mui/material/Box'; 3 | import Divider from '@mui/material/Divider'; 4 | import Grid from '@mui/material/Grid'; 5 | import Hidden from '@mui/material/Hidden'; 6 | import Link from '@mui/material/Link'; 7 | import List from '@mui/material/List'; 8 | import ListItemButton from '@mui/material/ListItemButton'; 9 | import ListItemText from '@mui/material/ListItemText'; 10 | import Typography from '@mui/material/Typography'; 11 | import { useTheme } from '@mui/material'; 12 | 13 | const Footer = () => { 14 | const theme = useTheme(); 15 | 16 | return ( 17 | <> 18 | 28 | 29 | 34 | 35 | 36 | 37 | 44 | 45 | 51 | Privacy Policy 52 | 53 | } 54 | /> 55 | 56 | 57 | 63 | Terms of Use 64 | 65 | } 66 | /> 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 80 | Copyright © {new Date().getFullYear()} Bob's 81 | Programming Academy. 82 | 83 | } 84 | /> 85 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | Photo by{' '} 98 | 105 | Josh Power 106 | {' '} 107 | on{' '} 108 | 115 | Unsplash 116 | 117 | . 118 | 119 | } 120 | /> 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | ); 129 | }; 130 | 131 | export default Footer; 132 | -------------------------------------------------------------------------------- /frontend/src/layout/Header.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | 3 | // Material UI 4 | import AppBar from '@mui/material/AppBar'; 5 | import Button from '@mui/material/Button'; 6 | import Box from '@mui/material/Box'; 7 | import Divider from '@mui/material/Divider'; 8 | import IconButton from '@mui/material/IconButton'; 9 | import Toolbar from '@mui/material/Toolbar'; 10 | import Typography from '@mui/material/Typography'; 11 | import { useTheme } from '@mui/material'; 12 | 13 | // Material Icons 14 | import MenuIcon from '@mui/icons-material/Menu'; 15 | import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; 16 | import CameraAltIcon from '@mui/icons-material/CameraAlt'; 17 | import InsertPhotoOutlinedIcon from '@mui/icons-material/InsertPhotoOutlined'; 18 | 19 | const Header = ({ onSidebarMobileOpen }) => { 20 | const theme = useTheme(); 21 | 22 | return ( 23 | <> 24 | 31 | 32 | 37 | 38 | 39 | 40 | 41 | 42 | 49 | 60 | Image Classification 61 | 62 | 63 | 64 | 65 | 66 | 84 | 103 | 104 | 105 | 106 | 107 | ); 108 | }; 109 | 110 | export default Header; 111 | -------------------------------------------------------------------------------- /frontend/src/layout/Layout.js: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | // Material UI 5 | import Box from '@mui/material/Box'; 6 | import { useTheme } from '@mui/material'; 7 | 8 | import Header from './Header'; 9 | import Footer from './Footer'; 10 | import Sidebar from './Sidebar'; 11 | 12 | const Layout = ({ children }) => { 13 | const theme = useTheme(); 14 | 15 | const [isSidebarMobileOpen, setIsSidebarMobileOpen] = useState(false); 16 | 17 | return ( 18 | 24 |
setIsSidebarMobileOpen(true)} /> 25 | setIsSidebarMobileOpen(false)} 27 | openMobile={isSidebarMobileOpen} 28 | /> 29 |
{children}
30 |