From 58e7a46339a2b59910d7f17ca500a52a8d267005 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Thu, 24 Aug 2023 08:33:00 -0600 Subject: [PATCH 01/70] Creating error_email log handler and adding UI components --- api/Dockerfile | 1 + api/README.md | 2 + api/src/admin_new_user.py | 5 +- api/src/admin_user.py | 7 +- api/src/error_email/error_email_template.html | 62 +++++++++++++++ api/src/main.py | 4 + api/src/middleware.py | 12 +-- api/src/smtp_error_handler.py | 76 +++++++++++++++++++ api/tests/data/admin_new_user_data.py | 8 +- api/tests/data/admin_user_data.py | 10 ++- .../receive_error_emails_update.sql | 3 + .../sql_scripts/CVManager_CreateTables.sql | 1 + .../sql_scripts/CVManager_SampleData.sql | 4 +- .../src/features/adminAdduser/AdminAddUser.js | 4 + .../features/adminEditUser/AdminEditUser.js | 6 ++ .../src/features/adminUserTab/AdminUserTab.js | 6 ++ webapp/src/generalSlices/userSlice.js | 1 + webapp/src/generalSlices/userSlice.test.js | 3 + 18 files changed, 199 insertions(+), 16 deletions(-) create mode 100644 api/src/error_email/error_email_template.html create mode 100644 api/src/smtp_error_handler.py create mode 100644 documents/receive_error_emails/receive_error_emails_update.sql diff --git a/api/Dockerfile b/api/Dockerfile index 1fb4feff8..1a9630ef5 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -14,6 +14,7 @@ ENV APP_HOME /app WORKDIR $APP_HOME COPY requirements.txt ./ COPY src/* ./ +COPY src/error_email/* ./error_email/ # Install production dependencies. RUN pip install --no-cache-dir -r requirements.txt diff --git a/api/README.md b/api/README.md index 6049449ab..aac9e42ca 100644 --- a/api/README.md +++ b/api/README.md @@ -168,6 +168,7 @@ body example: "first_name": "John", "last_name": "Doe", "super_user": True, + "receive_error_emails": True, "organizations": [ {"name": "Test Org", "role": "operator"} ] @@ -196,6 +197,7 @@ body example: "first_name": "John", "last_name": "Doe", "super_user": True, + "receive_error_emails": True, "organizations_to_add": [ {"name": "Test Org3", "role": "admin"} ], diff --git a/api/src/admin_new_user.py b/api/src/admin_new_user.py index 6e581db25..475278ff3 100644 --- a/api/src/admin_new_user.py +++ b/api/src/admin_new_user.py @@ -53,8 +53,8 @@ def add_user(user_spec): return {"message": "No special characters are allowed: !\"#$%&'()*+,./:;<=>?@[\]^`{|}~. No sequences of '-' characters are allowed"}, 500 try: - user_insert_query = "INSERT INTO public.users(email, first_name, last_name, super_user) " \ - f"VALUES ('{user_spec['email']}', '{user_spec['first_name']}', '{user_spec['last_name']}', '{'1' if user_spec['super_user'] else '0'}')" + user_insert_query = "INSERT INTO public.users(email, first_name, last_name, super_user, receive_error_emails) " \ + f"VALUES ('{user_spec['email']}', '{user_spec['first_name']}', '{user_spec['last_name']}', '{'1' if user_spec['super_user'] else '0'}', '{'1' if user_spec['receive_error_emails'] else '0'}')" pgquery.insert_db(user_insert_query) user_org_insert_query = "INSERT INTO public.user_organization(user_id, organization_id, role_id) VALUES" @@ -93,6 +93,7 @@ class AdminNewUserSchema(Schema): first_name = fields.Str(required=True) last_name = fields.Str(required=True) super_user = fields.Bool(required=True) + receive_error_emails = fields.Bool(required=True) organizations = fields.List(fields.Nested(UserOrganizationSchema), required=True, validate=validate.Length(min=1)) class AdminNewUser(Resource): diff --git a/api/src/admin_user.py b/api/src/admin_user.py index 92ad38271..a330e72f5 100644 --- a/api/src/admin_user.py +++ b/api/src/admin_user.py @@ -4,7 +4,7 @@ import admin_new_user def get_user_data(user_email): - query = "SELECT email, first_name, last_name, super_user, org.name, roles.name AS role " \ + query = "SELECT email, first_name, last_name, super_user, receive_error_emails, org.name, roles.name AS role " \ "FROM public.users " \ "JOIN public.user_organization AS uo ON uo.user_id = users.user_id " \ "JOIN public.organizations AS org ON org.organization_id = uo.organization_id " \ @@ -22,6 +22,7 @@ def get_user_data(user_email): 'first_name': point['first_name'], 'last_name': point['last_name'], 'super_user': True if point['super_user'] == '1' else False, + 'receive_error_emails': True if point['receive_error_emails'] == '1' else False, 'organizations': [] } user_dict[point['email']]['organizations'].append({ @@ -83,7 +84,8 @@ def modify_user(user_spec): f"email='{user_spec['email']}', " \ f"first_name='{user_spec['first_name']}', " \ f"last_name='{user_spec['last_name']}', " \ - f"super_user='{'1' if user_spec['super_user'] else '0'}' " \ + f"super_user='{'1' if user_spec['super_user'] else '0'}', " \ + f"receive_error_emails='{'1' if user_spec['receive_error_emails'] else '0'}' " \ f"WHERE email = '{user_spec['orig_email']}'" pgquery.insert_db(query) @@ -158,6 +160,7 @@ class AdminUserPatchSchema(Schema): first_name = fields.Str(required=True) last_name = fields.Str(required=True) super_user = fields.Bool(required=True) + receive_error_emails = fields.Bool(required=True) organizations_to_add = fields.List(fields.Nested(UserOrganizationSchema), required=True) organizations_to_modify = fields.List(fields.Nested(UserOrganizationSchema), required=True) organizations_to_remove = fields.List(fields.Nested(UserOrganizationSchema), required=True) diff --git a/api/src/error_email/error_email_template.html b/api/src/error_email/error_email_template.html new file mode 100644 index 000000000..3d0d2ff05 --- /dev/null +++ b/api/src/error_email/error_email_template.html @@ -0,0 +1,62 @@ + + + + + CV Manager API Error Email + + + + + +

+ You are receiving this email because your user is marked to receive error emails on the CV Manager Admin page. +

+
+

This error originated in the ##_ENVIRONMENT_## environment CV Manager API

+
+

Error Message: ##_ERROR_MESSAGE_##

+
+

Error occurred at: ##_ERROR_TIME_##

+
+

View this error in Cloud Run logs: rsu-manager-cloud-run-api logs

+
+

--

+

+ If you no longer wish to receive these emails, please uncheck the "receive error emails" checkbox on the CV + manager portal Admin page, or contact an administrator. +

+
+

+ Please do not reply directly to this email. If you have any questions or comments regarding this email, please + contact ##_CONTACT_EMAIL_## +

+ + diff --git a/api/src/main.py b/api/src/main.py index f42832a80..5173f1d88 100644 --- a/api/src/main.py +++ b/api/src/main.py @@ -22,11 +22,15 @@ from admin_new_org import AdminNewOrg from admin_org import AdminOrg from contact_support import ContactSupportResource +import smtp_error_handler log_level = os.environ.get('LOGGING_LEVEL', 'INFO') logging.basicConfig(format='%(levelname)s:%(message)s', level=log_level) app = Flask(__name__) + +smtp_error_handler.configure_error_emails(app) + app.wsgi_app = Middleware(app.wsgi_app) api = Api(app) diff --git a/api/src/middleware.py b/api/src/middleware.py index cbf641916..70a91c05e 100644 --- a/api/src/middleware.py +++ b/api/src/middleware.py @@ -5,9 +5,9 @@ import os import pgquery -def get_user_role(idinfo): +def get_user_role(idInfo): # Extract important info to query on from authorized token response - email = idinfo["email"] + email = idInfo["email"] query = "SELECT jsonb_build_object('email', u.email, 'first_name', u.first_name, 'last_name', u.last_name, 'organization', org.name, 'role', roles.name, 'super_user', u.super_user) " \ "FROM public.users u " \ @@ -40,7 +40,7 @@ def get_user_role(idinfo): '/admin-user': False, '/admin-new-org': False, '/admin-org': False, - '/rsu-geo-query': True + '/rsu-geo-query': True, } class Middleware(): @@ -62,10 +62,10 @@ def __call__(self, environ, start_response): try: # Verify user token ID is a real token token_id = request.headers['Authorization'] - idinfo = id_token.verify_oauth2_token(token_id, google.auth.transport.requests.Request(), os.environ["GOOGLE_CLIENT_ID"]) + idInfo = id_token.verify_oauth2_token(token_id, google.auth.transport.requests.Request(), os.environ["GOOGLE_CLIENT_ID"]) # Verify authorized user - data = get_user_role(idinfo) + data = get_user_role(idInfo) if data: user_info = { 'name': f'{data[0][0]["first_name"]} {data[0][0]["last_name"]}', @@ -84,7 +84,7 @@ def __call__(self, environ, start_response): # If endpoint requires, check if user is permitted for the specified organization permitted = False - if organization_required[request.path]: + if organization_required.get(request.path, False): requested_org = request.headers['Organization'] for permission in user_info['organizations']: if permission['name'] == requested_org: diff --git a/api/src/smtp_error_handler.py b/api/src/smtp_error_handler.py new file mode 100644 index 000000000..8b04231ab --- /dev/null +++ b/api/src/smtp_error_handler.py @@ -0,0 +1,76 @@ +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +import logging, logging.handlers + +from logging.handlers import SMTPHandler +import smtplib +import datetime +import ssl +import os + +import pgquery + + +def get_subscribed_users(): + query = "SELECT email FROM public.users WHERE receive_error_emails = '1'" + + data = pgquery.query_db(query) + + return [point['email'] for point in data] + + +def configure_error_emails(app): + + mail_handler = SMTP_SSLHandler(mailhost=[os.getenv('CSM_TARGET_SMTP_SERVER_ADDRESS', '10.85.50.92'), int(os.getenv('CSM_TARGET_SMTP_SERVER_PORT', '587'))], + fromaddr=os.getenv('CSM_EMAIL_TO_SEND_FROM', 'rtdh@state.co.us'), + toaddrs=[], + subject='Automated CV Manager API Error', + credentials=[os.getenv('CSM_EMAIL_APP_USERNAME'), os.getenv('CSM_EMAIL_APP_PASSWORD')], + secure=()) + mail_handler.setLevel(logging.ERROR) + mail_handler.setFormatter(logging.Formatter("")) + app.logger.addHandler(mail_handler) + +class SMTP_SSLHandler(SMTPHandler): + def __init__(self, mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None): + super(SMTP_SSLHandler, self).__init__(mailhost, fromaddr, toaddrs, subject, credentials, secure) + + def emit(self, record): + print(f"Sending email {self.mailhost}, {self.fromaddr}, {self.toaddrs}, {self.subject}") + try: + message = MIMEMultipart() + message["Subject"] = self.subject + message["From"] = self.fromaddr + subscribed_users = get_subscribed_users() + logging.debug(f"SUBSCRIBED USERS: {subscribed_users}") + message["To"] = ','.join(subscribed_users) + + if not hasattr(record, 'asctime'): + # 2023-08-23 15:39:29,115 + record.asctime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S,%f")[:-3] + + body_content = open("./error_email/error_email_template.html").read() + EMAIL_KEYS = { + 'ENVIRONMENT': "Dev", + 'ERROR_MESSAGE': self.format(record).replace("\n", "
"), + 'ERROR_TIME': str(record.asctime), + 'CLOUD_RUN_LOGS_LINK': "https://console.cloud.google.com/run/detail/us-central1/rsu-manager-cloud-run-api/logs?authuser=1&project=cdot-oim-cv-dev", + 'CLOUD_RUN_LOGS_NAME': "rsu-manager-cloud-run-api", + 'CONTACT_EMAIL': 'jfrye@neaeraconsulting.com' + } + + for key, value in EMAIL_KEYS.items(): + body_content = body_content.replace(f"##_{key}_##", value) + message.attach(MIMEText(body_content, "html")) + + context = ssl._create_unverified_context() + smtp = smtplib.SMTP(host=self.mailhost, port=self.mailport) + smtp.starttls(context=context) + smtp.ehlo() + smtp.login(self.username, self.password) + smtp.sendmail(self.fromaddr, subscribed_users, message.as_string()) + smtp.quit() + + logging.info("Email sent successfully") + except Exception as e: + logging.exception(e) \ No newline at end of file diff --git a/api/tests/data/admin_new_user_data.py b/api/tests/data/admin_new_user_data.py index bbc3a4dbe..3049e992c 100644 --- a/api/tests/data/admin_new_user_data.py +++ b/api/tests/data/admin_new_user_data.py @@ -9,6 +9,7 @@ "first_name": "John", "last_name": "Doe", "super_user": True, + "receive_error_emails": True, "organizations": [ {"name": "Test Org", "role": "operator"} ] @@ -19,6 +20,7 @@ "first_name": "John", "last_name": "Doe", "super_user": True, + "receive_error_emails": True, "organizations": ["Test Org"] } @@ -29,6 +31,7 @@ "first_name": "John", "last_name": "Doe", "super_user": True, + "receive_error_emails": True, "organizations": [ {"name": "Test Org", "role": "operator"} ] @@ -39,13 +42,14 @@ "first_name": "John--", "last_name": "Doe@#", "super_user": True, + "receive_error_emails": True, "organizations": [ {"name": "Test Org##", "role": "operator"} ] } -user_insert_query = "INSERT INTO public.users(email, first_name, last_name, super_user) " \ - "VALUES ('jdoe@example.com', 'John', 'Doe', '1')" +user_insert_query = "INSERT INTO public.users(email, first_name, last_name, super_user, receive_error_emails) " \ + "VALUES ('jdoe@example.com', 'John', 'Doe', '1', '1')" user_org_insert_query = "INSERT INTO public.user_organization(user_id, organization_id, role_id) VALUES" \ " (" \ diff --git a/api/tests/data/admin_user_data.py b/api/tests/data/admin_user_data.py index e2a1185de..d0100e998 100644 --- a/api/tests/data/admin_user_data.py +++ b/api/tests/data/admin_user_data.py @@ -18,6 +18,7 @@ "first_name": "test", "last_name": "test", "super_user": True, + "receive_error_emails": True, "organizations_to_add": [{"name": "Test Org3", "role": "admin"}], "organizations_to_modify": [{"name": "Test Org2", "role": "user"}], "organizations_to_remove": [{"name": "Test Org1", "role": "user"}] @@ -29,6 +30,7 @@ "first_name": "test", "last_name": "test", "super_user": True, + "receive_error_emails": True, "organizations_to_add": [{"name": "Test Org3", "role": "admin"}], "organizations_to_remove": [{"name": "Test Org1", "role": "user"}] } @@ -39,6 +41,7 @@ "first_name": "test", "last_name": "tes--t", "super_user": True, + "receive_error_emails": True, "organizations_to_add": [{"name": "Test Org3#@", "role": "adm#!in"}], "organizations_to_modify": [{"name": "Test O%@!rg2", "role": "user"}], "organizations_to_remove": [{"name": "Test O!##rg1", "role": "!#user"}] @@ -52,6 +55,7 @@ "first_name": "test", "last_name": "test", "super_user": '1', + "receive_error_emails": '1', "name": "test org", "role": "admin" } @@ -63,11 +67,12 @@ "first_name": "test", "last_name": "test", "super_user": True, + "receive_error_emails": True, "organizations": [{"name": "test org", "role": "admin"}] } ] -expected_get_user_qeury = "SELECT email, first_name, last_name, super_user, org.name, roles.name AS role " \ +expected_get_user_qeury = "SELECT email, first_name, last_name, super_user, receive_error_emails, org.name, roles.name AS role " \ "FROM public.users " \ "JOIN public.user_organization AS uo ON uo.user_id = users.user_id " \ "JOIN public.organizations AS org ON org.organization_id = uo.organization_id " \ @@ -77,7 +82,8 @@ "email='test@email.com', " \ "first_name='test', " \ "last_name='test', " \ - "super_user='1' " \ + "super_user='1', " \ + "receive_error_emails='1' " \ "WHERE email = 'test@email.com'" add_org_sql = "INSERT INTO public.user_organization(user_id, organization_id, role_id) VALUES" \ diff --git a/documents/receive_error_emails/receive_error_emails_update.sql b/documents/receive_error_emails/receive_error_emails_update.sql new file mode 100644 index 000000000..8a5ea5c50 --- /dev/null +++ b/documents/receive_error_emails/receive_error_emails_update.sql @@ -0,0 +1,3 @@ +ALTER TABLE public.users + ADD receive_error_emails bit(1) NOT NULL + DEFAULT B'0'; \ No newline at end of file diff --git a/documents/sql_scripts/CVManager_CreateTables.sql b/documents/sql_scripts/CVManager_CreateTables.sql index 9042840e4..24d9fb5ed 100644 --- a/documents/sql_scripts/CVManager_CreateTables.sql +++ b/documents/sql_scripts/CVManager_CreateTables.sql @@ -296,6 +296,7 @@ CREATE TABLE IF NOT EXISTS public.users first_name character varying(128) NOT NULL, last_name character varying(128) NOT NULL, super_user bit(1) NOT NULL, + receive_error_emails bit(1) NOT NULL, CONSTRAINT users_pkey PRIMARY KEY (user_id), CONSTRAINT users_email UNIQUE (email) ); diff --git a/documents/sql_scripts/CVManager_SampleData.sql b/documents/sql_scripts/CVManager_SampleData.sql index 94f75166f..1e9e3d130 100644 --- a/documents/sql_scripts/CVManager_SampleData.sql +++ b/documents/sql_scripts/CVManager_SampleData.sql @@ -40,8 +40,8 @@ INSERT INTO public.rsu_organization( -- Replace user with a real gmail to test GCP OAuth2.0 support INSERT INTO public.users( - email, first_name, last_name, super_user) - VALUES ('test@gmail.com', 'Test', 'User', '1'); + email, first_name, last_name, super_user, receive_error_emails) + VALUES ('test@gmail.com', 'Test', 'User', '1', '1'); INSERT INTO public.user_organization( user_id, organization_id, role_id) diff --git a/webapp/src/features/adminAdduser/AdminAddUser.js b/webapp/src/features/adminAdduser/AdminAddUser.js index 5ebf891c4..50a0e3cf3 100644 --- a/webapp/src/features/adminAdduser/AdminAddUser.js +++ b/webapp/src/features/adminAdduser/AdminAddUser.js @@ -102,6 +102,10 @@ const AdminAddUser = (props) => { + + + + Organizations { first_name: '', last_name: '', super_user: '', + receive_error_emails: '', organizations_to_add: [], organizations_to_modify: [], organizations_to_remove: [], @@ -66,6 +67,7 @@ const AdminEditUser = (props) => { setValue('first_name', apiData.user_data.first_name) setValue('last_name', apiData.user_data.last_name) setValue('super_user', apiData.user_data.super_user) + setValue('receive_error_emails', apiData.user_data.receive_error_emails) } }, [apiData, setValue]) @@ -120,6 +122,10 @@ const AdminEditUser = (props) => { + + + + Organizations { id: 3, render: (rowData) => (rowData.super_user ? 'Yes' : 'No'), }, + { + title: 'Rcv Err Emails', + field: 'receive_error_emails', + id: 3, + render: (rowData) => (rowData.receive_error_emails ? 'Yes' : 'No'), + }, ]) const loading = useSelector(selectLoading) diff --git a/webapp/src/generalSlices/userSlice.js b/webapp/src/generalSlices/userSlice.js index 22eb7f58f..8f067af53 100644 --- a/webapp/src/generalSlices/userSlice.js +++ b/webapp/src/generalSlices/userSlice.js @@ -78,6 +78,7 @@ export const selectOrganizationName = (state) => state.user.value.organization?. export const selectName = (state) => state.user.value.authLoginData?.data?.name export const selectEmail = (state) => state.user.value.authLoginData?.data?.email export const selectSuperUser = (state) => state.user.value.authLoginData?.data?.super_user +export const selectReceiveErrorEmails = (state) => state.user.value.authLoginData?.data?.receive_error_emails export const selectTokenExpiration = (state) => state.user.value.authLoginData?.expires_at export const selectLoginFailure = (state) => state.user.value.loginFailure export const selectLoading = (state) => state.user.loading diff --git a/webapp/src/generalSlices/userSlice.test.js b/webapp/src/generalSlices/userSlice.test.js index cfd39d3a7..0d5aea311 100644 --- a/webapp/src/generalSlices/userSlice.test.js +++ b/webapp/src/generalSlices/userSlice.test.js @@ -17,6 +17,7 @@ import { selectName, selectEmail, selectSuperUser, + selectReceiveErrorEmails, selectTokenExpiration, selectLoginFailure, selectLoading, @@ -255,6 +256,7 @@ describe('selectors', () => { name: 'name', email: 'email', super_user: 'superUser', + receive_error_emails: 'receiveErrorEmails', }, expires_at: 'expires_at', }, @@ -271,6 +273,7 @@ describe('selectors', () => { expect(selectName(state)).toEqual('name') expect(selectEmail(state)).toEqual('email') expect(selectSuperUser(state)).toEqual('superUser') + expect(selectReceiveErrorEmails(state)).toEqual('receiveErrorEmails') expect(selectTokenExpiration(state)).toEqual('expires_at') expect(selectLoginFailure(state)).toEqual('loginFailure') expect(selectLoading(state)).toEqual('loading') From f196570233f121e7a7280c50bd929c2db1816728 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Thu, 24 Aug 2023 09:03:57 -0600 Subject: [PATCH 02/70] Updating error email environment variables --- api/sample.env | 6 +++++- api/src/smtp_error_handler.py | 24 +++++++++++++++--------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/api/sample.env b/api/sample.env index e7725cb38..def58b20e 100644 --- a/api/sample.env +++ b/api/sample.env @@ -14,4 +14,8 @@ CSM_EMAIL_APP_USERNAME= CSM_EMAIL_APP_PASSWORD= CSM_EMAILS_TO_SEND_TO= CSM_TARGET_SMTP_SERVER_ADDRESS= -CSM_TARGET_SMTP_SERVER_PORT= \ No newline at end of file +CSM_TARGET_SMTP_SERVER_PORT= + +# Error Email Contact Configuration +CLOUD_RUN_LOGS_LINK=https://console.cloud.google.com/run/detail/us-central1/rsu-manager-cloud-run-api/logs?authuser=1&project=cdot-oim-cv-dev +ERROR_EMAIL_CONTACT_EMAIL=jfrye@neaeraconsulting.com \ No newline at end of file diff --git a/api/src/smtp_error_handler.py b/api/src/smtp_error_handler.py index 8b04231ab..176e0aa9b 100644 --- a/api/src/smtp_error_handler.py +++ b/api/src/smtp_error_handler.py @@ -28,35 +28,41 @@ def configure_error_emails(app): credentials=[os.getenv('CSM_EMAIL_APP_USERNAME'), os.getenv('CSM_EMAIL_APP_PASSWORD')], secure=()) mail_handler.setLevel(logging.ERROR) - mail_handler.setFormatter(logging.Formatter("")) + mail_handler.setFormatter(logging.Formatter("")) # this seems weird, but it's the only way I can figure out how to include the stack trace info. This command appends the stack trace to the end of the self.format(record) call. app.logger.addHandler(mail_handler) + + +def get_environment_name(instance_connection_name): + try: + return instance_connection_name.split(':')[0] + except: + return str(instance_connection_name) + class SMTP_SSLHandler(SMTPHandler): def __init__(self, mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None): super(SMTP_SSLHandler, self).__init__(mailhost, fromaddr, toaddrs, subject, credentials, secure) def emit(self, record): - print(f"Sending email {self.mailhost}, {self.fromaddr}, {self.toaddrs}, {self.subject}") try: message = MIMEMultipart() message["Subject"] = self.subject message["From"] = self.fromaddr + subscribed_users = get_subscribed_users() - logging.debug(f"SUBSCRIBED USERS: {subscribed_users}") message["To"] = ','.join(subscribed_users) if not hasattr(record, 'asctime'): - # 2023-08-23 15:39:29,115 + # For some reason, asctime is not always available. So we update it to the current time in the same format (2023-08-23 15:39:29,115) record.asctime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S,%f")[:-3] body_content = open("./error_email/error_email_template.html").read() EMAIL_KEYS = { - 'ENVIRONMENT': "Dev", + 'ENVIRONMENT': get_environment_name(os.getenv('INSTANCE_CONNECTION_NAME', 'cdot-oim-cv-dev:us-west3:rsu-manager')), 'ERROR_MESSAGE': self.format(record).replace("\n", "
"), 'ERROR_TIME': str(record.asctime), - 'CLOUD_RUN_LOGS_LINK': "https://console.cloud.google.com/run/detail/us-central1/rsu-manager-cloud-run-api/logs?authuser=1&project=cdot-oim-cv-dev", - 'CLOUD_RUN_LOGS_NAME': "rsu-manager-cloud-run-api", - 'CONTACT_EMAIL': 'jfrye@neaeraconsulting.com' + 'CLOUD_RUN_LOGS_LINK': os.getenv("CLOUD_RUN_LOGS_LINK", "https://console.cloud.google.com/run/detail/us-central1/rsu-manager-cloud-run-api/logs?authuser=1&project=cdot-oim-cv-dev"), + 'CONTACT_EMAIL': os.getenv("ERROR_EMAIL_CONTACT_EMAIL", 'jfrye@neaeraconsulting.com') } for key, value in EMAIL_KEYS.items(): @@ -71,6 +77,6 @@ def emit(self, record): smtp.sendmail(self.fromaddr, subscribed_users, message.as_string()) smtp.quit() - logging.info("Email sent successfully") + logging.debug(f"Successfully sent error email to {subscribed_users}") except Exception as e: logging.exception(e) \ No newline at end of file From 769bf8012b166b880f2ebada0127a9cddcdbc416 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Thu, 7 Sep 2023 07:38:14 -0600 Subject: [PATCH 03/70] Adding unsubscribe endpoint, updating environment variables --- api/src/error_email/error_email_template.html | 9 +--- api/src/main.py | 2 + api/src/middleware.py | 4 +- api/src/smtp_error_handler.py | 52 ++++++++++++------- api/src/unsub_error_emails.py | 39 ++++++++++++++ 5 files changed, 80 insertions(+), 26 deletions(-) create mode 100644 api/src/unsub_error_emails.py diff --git a/api/src/error_email/error_email_template.html b/api/src/error_email/error_email_template.html index 3d0d2ff05..666e2225a 100644 --- a/api/src/error_email/error_email_template.html +++ b/api/src/error_email/error_email_template.html @@ -46,17 +46,12 @@

Error occurred at: ##_ERROR_TIME_##


-

View this error in Cloud Run logs: rsu-manager-cloud-run-api logs

+

View this error in Logs: rsu-manager-api logs


--

If you no longer wish to receive these emails, please uncheck the "receive error emails" checkbox on the CV - manager portal Admin page, or contact an administrator. -

-
-

- Please do not reply directly to this email. If you have any questions or comments regarding this email, please - contact ##_CONTACT_EMAIL_## + manager portal Admin page, or use this link to unsubscribe: unsubscribe

diff --git a/api/src/main.py b/api/src/main.py index 5173f1d88..6b6536a54 100644 --- a/api/src/main.py +++ b/api/src/main.py @@ -22,6 +22,7 @@ from admin_new_org import AdminNewOrg from admin_org import AdminOrg from contact_support import ContactSupportResource +from unsub_error_emails import UnsubErrorEmails import smtp_error_handler log_level = os.environ.get('LOGGING_LEVEL', 'INFO') @@ -52,6 +53,7 @@ api.add_resource(AdminNewOrg, "/admin-new-org") api.add_resource(AdminOrg, "/admin-org") api.add_resource(ContactSupportResource, "/contact-support") +api.add_resource(UnsubErrorEmails, "/unsubscribe-error-emails/") if __name__ == "__main__": app.run(host="0.0.0.0", port=8080) diff --git a/api/src/middleware.py b/api/src/middleware.py index 70a91c05e..e698bd6be 100644 --- a/api/src/middleware.py +++ b/api/src/middleware.py @@ -58,7 +58,9 @@ def __call__(self, environ, start_response): # if request is hitting the /contact-support endpoint, do not authorize if request.path == "/contact-support": return self.app(environ, start_response) - + elif "/unsubscribe-error-emails" in request.path: + return self.app(environ, start_response) + try: # Verify user token ID is a real token token_id = request.headers['Authorization'] diff --git a/api/src/smtp_error_handler.py b/api/src/smtp_error_handler.py index 176e0aa9b..b1ce02b9c 100644 --- a/api/src/smtp_error_handler.py +++ b/api/src/smtp_error_handler.py @@ -18,14 +18,25 @@ def get_subscribed_users(): return [point['email'] for point in data] +def unsubscribe_user(email: str): + pre_check = f"SELECT receive_error_emails FROM public.users WHERE email = '{email}'" + pre_check_results = pgquery.query_db(pre_check) + if not pre_check_results: + return 404 + + query = f"UPDATE public.users SET receive_error_emails='0' WHERE email = '{email}'" + + pgquery.insert_db(query) + + return 200 + def configure_error_emails(app): - - mail_handler = SMTP_SSLHandler(mailhost=[os.getenv('CSM_TARGET_SMTP_SERVER_ADDRESS', '10.85.50.92'), int(os.getenv('CSM_TARGET_SMTP_SERVER_PORT', '587'))], - fromaddr=os.getenv('CSM_EMAIL_TO_SEND_FROM', 'rtdh@state.co.us'), + mail_handler = SMTP_SSLHandler(mailhost=[os.environ['CSM_TARGET_SMTP_SERVER_ADDRESS'], int(os.environ['CSM_TARGET_SMTP_SERVER_PORT'])], + fromaddr=os.environ['CSM_EMAIL_TO_SEND_FROM'], toaddrs=[], subject='Automated CV Manager API Error', - credentials=[os.getenv('CSM_EMAIL_APP_USERNAME'), os.getenv('CSM_EMAIL_APP_PASSWORD')], + credentials=[os.environ['CSM_EMAIL_APP_USERNAME'], os.environ['CSM_EMAIL_APP_PASSWORD']], secure=()) mail_handler.setLevel(logging.ERROR) mail_handler.setFormatter(logging.Formatter("")) # this seems weird, but it's the only way I can figure out how to include the stack trace info. This command appends the stack trace to the end of the self.format(record) call. @@ -50,32 +61,37 @@ def emit(self, record): message["From"] = self.fromaddr subscribed_users = get_subscribed_users() - message["To"] = ','.join(subscribed_users) if not hasattr(record, 'asctime'): # For some reason, asctime is not always available. So we update it to the current time in the same format (2023-08-23 15:39:29,115) record.asctime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S,%f")[:-3] body_content = open("./error_email/error_email_template.html").read() + + EMAIL_KEYS = { - 'ENVIRONMENT': get_environment_name(os.getenv('INSTANCE_CONNECTION_NAME', 'cdot-oim-cv-dev:us-west3:rsu-manager')), + 'ENVIRONMENT': get_environment_name(os.environ['INSTANCE_CONNECTION_NAME']), 'ERROR_MESSAGE': self.format(record).replace("\n", "
"), 'ERROR_TIME': str(record.asctime), - 'CLOUD_RUN_LOGS_LINK': os.getenv("CLOUD_RUN_LOGS_LINK", "https://console.cloud.google.com/run/detail/us-central1/rsu-manager-cloud-run-api/logs?authuser=1&project=cdot-oim-cv-dev"), - 'CONTACT_EMAIL': os.getenv("ERROR_EMAIL_CONTACT_EMAIL", 'jfrye@neaeraconsulting.com') + 'LOGS_LINK': os.environ["LOGS_LINK"], } - for key, value in EMAIL_KEYS.items(): - body_content = body_content.replace(f"##_{key}_##", value) - message.attach(MIMEText(body_content, "html")) + for email in subscribed_users: + message["To"] = email + + EMAIL_KEYS['UNSUBSCRIBE_LINK'] = os.environ["ERROR_EMAIL_UNSUBSCRIBE_LINK"].format(email=email) + + for key, value in EMAIL_KEYS.items(): + body_content = body_content.replace(f"##_{key}_##", value) + message.attach(MIMEText(body_content, "html")) - context = ssl._create_unverified_context() - smtp = smtplib.SMTP(host=self.mailhost, port=self.mailport) - smtp.starttls(context=context) - smtp.ehlo() - smtp.login(self.username, self.password) - smtp.sendmail(self.fromaddr, subscribed_users, message.as_string()) - smtp.quit() + context = ssl._create_unverified_context() + smtp = smtplib.SMTP(host=self.mailhost, port=self.mailport) + smtp.starttls(context=context) + smtp.ehlo() + smtp.login(self.username, self.password) + smtp.sendmail(self.fromaddr, subscribed_users, message.as_string()) + smtp.quit() logging.debug(f"Successfully sent error email to {subscribed_users}") except Exception as e: diff --git a/api/src/unsub_error_emails.py b/api/src/unsub_error_emails.py new file mode 100644 index 000000000..ab0753dc6 --- /dev/null +++ b/api/src/unsub_error_emails.py @@ -0,0 +1,39 @@ +import logging + +from flask_restful import Resource +import logging +import os +import smtp_error_handler + +def unsubscribe_user(email: str): + return smtp_error_handler.unsubscribe_user(email) + + +# REST endpoint resource class +class UnsubErrorEmails(Resource): + options_headers = { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': 'Content-Type,Authorization', + 'Access-Control-Allow-Methods': 'GET', + 'Access-Control-Max-Age': '3600' + } + + headers = { + 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json' + } + + def options(self): + # CORS support + return ('', 204, self.options_headers) + + def get(self, email): + logging.debug("UbsubErrorEmails GET requested") + if email: + resp_code = unsubscribe_user(email) + + if resp_code == 404: + return (f"User with email {email} does not exist", 404, self.headers) + else: + return (f"User {email} was successfully unsubscribed!", 200, self.headers) + return ("No unsubscribe email was specified", 400, self.headers) \ No newline at end of file From 9602d4127de130ce366b2c550a0bed1fbb5a1735 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Fri, 15 Sep 2023 13:14:53 -0600 Subject: [PATCH 04/70] Adding unit tests and fixing send emails --- api/src/smtp_error_handler.py | 102 ++++++------ api/src/unsub_error_emails.py | 7 +- api/tests/data/smtp_error_handler_data.py | 190 ++++++++++++++++++++++ api/tests/data/unsub_error_emails_data.py | 15 ++ api/tests/src/test_smtp_error_handler.py | 151 +++++++++++++++++ api/tests/src/test_unsub_error_emails.py | 68 ++++++++ 6 files changed, 484 insertions(+), 49 deletions(-) create mode 100644 api/tests/data/smtp_error_handler_data.py create mode 100644 api/tests/data/unsub_error_emails_data.py create mode 100644 api/tests/src/test_smtp_error_handler.py create mode 100644 api/tests/src/test_unsub_error_emails.py diff --git a/api/src/smtp_error_handler.py b/api/src/smtp_error_handler.py index b1ce02b9c..a205caea8 100644 --- a/api/src/smtp_error_handler.py +++ b/api/src/smtp_error_handler.py @@ -1,6 +1,8 @@ from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText -import logging, logging.handlers + +import logging +import logging.handlers from logging.handlers import SMTPHandler import smtplib @@ -12,36 +14,39 @@ def get_subscribed_users(): - query = "SELECT email FROM public.users WHERE receive_error_emails = '1'" + query = "SELECT email FROM public.users WHERE receive_error_emails = '1'" + + data = pgquery.query_db(query) - data = pgquery.query_db(query) + return [point['email'] for point in data] - return [point['email'] for point in data] def unsubscribe_user(email: str): - pre_check = f"SELECT receive_error_emails FROM public.users WHERE email = '{email}'" - pre_check_results = pgquery.query_db(pre_check) - if not pre_check_results: - return 404 - - query = f"UPDATE public.users SET receive_error_emails='0' WHERE email = '{email}'" + pre_check = f"SELECT receive_error_emails FROM public.users WHERE email = '{email}'" + pre_check_results = pgquery.query_db(pre_check) + if not pre_check_results: + return 404 + + query = f"UPDATE public.users SET receive_error_emails='0' WHERE email = '{email}'" + + pgquery.insert_db(query) - pgquery.insert_db(query) - - return 200 + return 200 def configure_error_emails(app): mail_handler = SMTP_SSLHandler(mailhost=[os.environ['CSM_TARGET_SMTP_SERVER_ADDRESS'], int(os.environ['CSM_TARGET_SMTP_SERVER_PORT'])], - fromaddr=os.environ['CSM_EMAIL_TO_SEND_FROM'], - toaddrs=[], - subject='Automated CV Manager API Error', - credentials=[os.environ['CSM_EMAIL_APP_USERNAME'], os.environ['CSM_EMAIL_APP_PASSWORD']], - secure=()) + fromaddr=os.environ['CSM_EMAIL_TO_SEND_FROM'], + toaddrs=[], + subject='Automated CV Manager API Error', + credentials=[ + os.environ['CSM_EMAIL_APP_USERNAME'], os.environ['CSM_EMAIL_APP_PASSWORD']], + secure=()) mail_handler.setLevel(logging.ERROR) - mail_handler.setFormatter(logging.Formatter("")) # this seems weird, but it's the only way I can figure out how to include the stack trace info. This command appends the stack trace to the end of the self.format(record) call. + # this seems weird, but it's the only way I can figure out how to include the stack trace info. This command appends the stack trace to the end of the self.format(record) call. + mail_handler.setFormatter(logging.Formatter("")) app.logger.addHandler(mail_handler) - + def get_environment_name(instance_connection_name): try: @@ -52,47 +57,52 @@ def get_environment_name(instance_connection_name): class SMTP_SSLHandler(SMTPHandler): def __init__(self, mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None): - super(SMTP_SSLHandler, self).__init__(mailhost, fromaddr, toaddrs, subject, credentials, secure) - + super(SMTP_SSLHandler, self).__init__( + mailhost, fromaddr, toaddrs, subject, credentials, secure) + def emit(self, record): try: - message = MIMEMultipart() - message["Subject"] = self.subject - message["From"] = self.fromaddr - + subscribed_users = get_subscribed_users() - + if not hasattr(record, 'asctime'): # For some reason, asctime is not always available. So we update it to the current time in the same format (2023-08-23 15:39:29,115) - record.asctime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S,%f")[:-3] - - body_content = open("./error_email/error_email_template.html").read() - - + record.asctime = datetime.datetime.now().strftime( + "%Y-%m-%d %H:%M:%S,%f")[:-3] + + body_content = open( + "./error_email/error_email_template.html").read() + EMAIL_KEYS = { 'ENVIRONMENT': get_environment_name(os.environ['INSTANCE_CONNECTION_NAME']), 'ERROR_MESSAGE': self.format(record).replace("\n", "
"), 'ERROR_TIME': str(record.asctime), 'LOGS_LINK': os.environ["LOGS_LINK"], } - + + context = ssl._create_unverified_context() + smtp = smtplib.SMTP(host=self.mailhost, port=self.mailport) + smtp.starttls(context=context) + smtp.ehlo() + smtp.login(self.username, self.password) + for email in subscribed_users: + message = MIMEMultipart() + message["Subject"] = self.subject + message["From"] = self.fromaddr message["To"] = email - - EMAIL_KEYS['UNSUBSCRIBE_LINK'] = os.environ["ERROR_EMAIL_UNSUBSCRIBE_LINK"].format(email=email) - + + EMAIL_KEYS['UNSUBSCRIBE_LINK'] = os.environ["ERROR_EMAIL_UNSUBSCRIBE_LINK"].format( + email=email) + for key, value in EMAIL_KEYS.items(): body_content = body_content.replace(f"##_{key}_##", value) message.attach(MIMEText(body_content, "html")) + smtp.sendmail(self.fromaddr, email, + message.as_string()) + smtp.quit() - context = ssl._create_unverified_context() - smtp = smtplib.SMTP(host=self.mailhost, port=self.mailport) - smtp.starttls(context=context) - smtp.ehlo() - smtp.login(self.username, self.password) - smtp.sendmail(self.fromaddr, subscribed_users, message.as_string()) - smtp.quit() - - logging.debug(f"Successfully sent error email to {subscribed_users}") + logging.debug( + f"Successfully sent error email to {subscribed_users}") except Exception as e: - logging.exception(e) \ No newline at end of file + logging.exception(e) diff --git a/api/src/unsub_error_emails.py b/api/src/unsub_error_emails.py index ab0753dc6..0a7de92dc 100644 --- a/api/src/unsub_error_emails.py +++ b/api/src/unsub_error_emails.py @@ -5,6 +5,7 @@ import os import smtp_error_handler + def unsubscribe_user(email: str): return smtp_error_handler.unsubscribe_user(email) @@ -28,12 +29,12 @@ def options(self): return ('', 204, self.options_headers) def get(self, email): - logging.debug("UbsubErrorEmails GET requested") + logging.debug("UnsubErrorEmails GET requested") if email: resp_code = unsubscribe_user(email) - + if resp_code == 404: return (f"User with email {email} does not exist", 404, self.headers) else: return (f"User {email} was successfully unsubscribed!", 200, self.headers) - return ("No unsubscribe email was specified", 400, self.headers) \ No newline at end of file + return ("No unsubscribe email was specified", 400, self.headers) diff --git a/api/tests/data/smtp_error_handler_data.py b/api/tests/data/smtp_error_handler_data.py new file mode 100644 index 000000000..9c074ba2d --- /dev/null +++ b/api/tests/data/smtp_error_handler_data.py @@ -0,0 +1,190 @@ +import multidict + + +##################################### test_data ########################################### +get_subscribed_users_query = "SELECT email FROM public.users WHERE receive_error_emails = '1'" +get_subscribed_users_query_resp = [ + {'email': 'test@gmail.com'}, + {'email': 'test2@gmail.com'}, +] + +get_unsubscribe_user_query = "SELECT receive_error_emails FROM public.users WHERE email = 'test@gmail.com'" +get_unsubscribe_user_remove_query = "UPDATE public.users SET receive_error_emails='0' WHERE email = 'test@gmail.com'" + +subscribed_user_emails = ["test1@gmail.com", "test2@gmail.com"] +html_email_template = """ + + + + CV Manager API Error Email + + + + + +

+ You are receiving this email because your user is marked to receive error emails on the CV Manager Admin page. +

+
+

This error originated in the ##_ENVIRONMENT_## environment CV Manager API

+
+

Error Message: ##_ERROR_MESSAGE_##

+
+

Error occurred at: ##_ERROR_TIME_##

+
+

View this error in Logs: rsu-manager-api logs

+
+

--

+

+ If you no longer wish to receive these emails, please uncheck the "receive error emails" checkbox on the CV + manager portal Admin page, or use this link to unsubscribe: unsubscribe +

+ + +""" + +html_email_body_1 = """ + + + + CV Manager API Error Email + + + + + +

+ You are receiving this email because your user is marked to receive error emails on the CV Manager Admin page. +

+
+

This error originated in the ENVIRONMENT environment CV Manager API

+
+

Error Message: 2023-09-15 00:00:00,000000

+
+

Error occurred at: ERROR_TIME

+
+

View this error in Logs: rsu-manager-api logs

+
+

--

+

+ If you no longer wish to receive these emails, please uncheck the "receive error emails" checkbox on the CV + manager portal Admin page, or use this link to unsubscribe: unsubscribe +

+ + +""" + +html_email_body_2 = """ + + + + CV Manager API Error Email + + + + + +

+ You are receiving this email because your user is marked to receive error emails on the CV Manager Admin page. +

+
+

This error originated in the ENVIRONMENT environment CV Manager API

+
+

Error Message: 2023-09-15 00:00:00,000000

+
+

Error occurred at: ERROR_TIME

+
+

View this error in Logs: rsu-manager-api logs

+
+

--

+

+ If you no longer wish to receive these emails, please uncheck the "receive error emails" checkbox on the CV + manager portal Admin page, or use this link to unsubscribe: unsubscribe +

+ + +""" diff --git a/api/tests/data/unsub_error_emails_data.py b/api/tests/data/unsub_error_emails_data.py new file mode 100644 index 000000000..cce9533eb --- /dev/null +++ b/api/tests/data/unsub_error_emails_data.py @@ -0,0 +1,15 @@ +import multidict + +##################################### request_data ########################################### + +request_params_good = multidict.MultiDict([]) + +##################################### test_data ########################################### +get_subscribed_users_query = "SELECT email FROM public.users WHERE receive_error_emails = '1'" +get_subscribed_users_query_resp = [ + {'email': 'test@gmail.com'}, + {'email': 'test2@gmail.com'}, +] + +get_unsubscribe_user_query = "SELECT receive_error_emails FROM public.users WHERE email = 'test@gmail.com'" +get_unsubscribe_user_remove_query = "UPDATE public.users SET receive_error_emails='0' WHERE email = 'test@gmail.com'" diff --git a/api/tests/src/test_smtp_error_handler.py b/api/tests/src/test_smtp_error_handler.py new file mode 100644 index 000000000..e65d90a98 --- /dev/null +++ b/api/tests/src/test_smtp_error_handler.py @@ -0,0 +1,151 @@ +from collections import namedtuple +import os +from unittest.mock import patch, MagicMock, call, mock_open +from src.smtp_error_handler import SMTP_SSLHandler +import src.smtp_error_handler as smtp_error_handler +import tests.data.smtp_error_handler_data as smtp_error_handler_data +import logging +from unittest.mock import ANY + + +def test_get_environment_name_success(): + expected = "test" + actual = smtp_error_handler.get_environment_name("test:1234") + + assert actual == expected + + +def test_get_environment_name_fail(): + expected = "True" + actual = smtp_error_handler.get_environment_name(True) + + assert actual == str(expected) + + +###################################### Testing Functions ########################################## +@patch('src.smtp_error_handler.pgquery.query_db') +def test_get_subscribed_users_success(mock_query_db): + expected = ['test@gmail.com', 'test2@gmail.com'] + mock_query_db.return_value = smtp_error_handler_data.get_subscribed_users_query_resp + actual = smtp_error_handler.get_subscribed_users() + + calls = [ + call(smtp_error_handler_data.get_subscribed_users_query), + ] + mock_query_db.assert_has_calls(calls) + assert actual == expected + + +@patch('src.smtp_error_handler.pgquery.query_db') +@patch('src.smtp_error_handler.pgquery.insert_db') +def test_unsubscribe_user_success(mock_insert_db, mock_query_db): + mock_query_db.return_value = ['test@gmail.com'] + expected_code = 200 + actual_code = smtp_error_handler.unsubscribe_user("test@gmail.com") + + calls = [ + call(smtp_error_handler_data.get_unsubscribe_user_query) + ] + mock_query_db.assert_has_calls(calls) + calls = [ + call(smtp_error_handler_data.get_unsubscribe_user_remove_query) + ] + mock_insert_db.assert_has_calls(calls) + assert actual_code == expected_code + + +@patch('src.smtp_error_handler.pgquery.query_db') +@patch('src.smtp_error_handler.pgquery.insert_db') +def test_unsubscribe_user_failure(mock_insert_db, mock_query_db): + mock_query_db.return_value = [] + expected_code = 404 + actual_code = smtp_error_handler.unsubscribe_user("test@gmail.com") + + calls = [ + call(smtp_error_handler_data.get_unsubscribe_user_query) + ] + mock_query_db.assert_has_calls(calls) + calls = [] + mock_insert_db.assert_has_calls(calls) + assert actual_code == expected_code + + +EMAIL_TO_SEND_FROM = "test@test.test" +EMAIL_APP_USERNAME = "test" +EMAIL_APP_PASSWORD = "test" +DEFAULT_TARGET_SMTP_SERVER_ADDRESS = "smtp.gmail.com" +DEFAULT_TARGET_SMTP_SERVER_PORT = 587 +INSTANCE_CONNECTION_NAME = "instance_connection:name" +LOGS_LINK = "http://logs_link.com" +ERROR_EMAIL_UNSUBSCRIBE_LINK = "http://unsubscribe-{email}" + + +@patch.dict(os.environ, { + "CSM_TARGET_SMTP_SERVER_ADDRESS": DEFAULT_TARGET_SMTP_SERVER_ADDRESS, + "CSM_TARGET_SMTP_SERVER_PORT": str(DEFAULT_TARGET_SMTP_SERVER_PORT), + "CSM_EMAIL_TO_SEND_FROM": EMAIL_TO_SEND_FROM, + "CSM_EMAIL_APP_USERNAME": EMAIL_APP_USERNAME, + "CSM_EMAIL_APP_PASSWORD": EMAIL_APP_PASSWORD, +}, clear=True) +def test_configure_error_emails(): + app = MagicMock() + app.logger = MagicMock() + app.logger.addHandler = MagicMock() + smtp_error_handler.configure_error_emails(app) + app.logger.addHandler.assert_called_once() + + +@patch.dict(os.environ, { + "LOGS_LINK": LOGS_LINK, + "INSTANCE_CONNECTION_NAME": INSTANCE_CONNECTION_NAME, + "ERROR_EMAIL_UNSUBSCRIBE_LINK": ERROR_EMAIL_UNSUBSCRIBE_LINK +}, clear=True) +@patch("builtins.open", new_callable=mock_open, read_data="data") +@patch('src.smtp_error_handler.smtplib') +@patch('src.smtp_error_handler.get_subscribed_users') +def test_send(mock_get_subscribed_users, mock_smtplib, mock_file): + # prepare + emailHandler = SMTP_SSLHandler(mailhost=[DEFAULT_TARGET_SMTP_SERVER_ADDRESS, DEFAULT_TARGET_SMTP_SERVER_PORT], + fromaddr=EMAIL_TO_SEND_FROM, + toaddrs=[], + subject='Automated CV Manager API Error', + credentials=[ + EMAIL_APP_USERNAME, EMAIL_APP_PASSWORD], + secure=()) + + smtp_obj = MagicMock() + mock_smtplib.SMTP = MagicMock() + mock_smtplib.SMTP.return_value = smtp_obj + + smtp_obj.starttls = MagicMock() + smtp_obj.ehlo = MagicMock() + smtp_obj.login = MagicMock() + smtp_obj.sendmail = MagicMock() + smtp_obj.quit = MagicMock() + mock_get_subscribed_users.return_value = smtp_error_handler_data.subscribed_user_emails + mock_file = MagicMock() + mock_file.read = MagicMock() + mock_file.read.return_value = smtp_error_handler_data.html_email_template + + Record = namedtuple('Record', ['asctime']) + record = Record("2023-09-15 00:00:00,000000") + emailHandler.format = lambda x: "%s".format(x) + + # execute + emailHandler.emit(record) + + # assert + mock_get_subscribed_users.assert_called_once() + smtp_obj.starttls.assert_called_once() + smtp_obj.ehlo.assert_called_once() + smtp_obj.login.assert_called_once_with( + EMAIL_APP_USERNAME, EMAIL_APP_PASSWORD) + + smtp_obj.sendmail.call_count == 2 + print(smtp_obj.sendmail.call_args_list) + smtp_obj.sendmail.assert_any_call( + EMAIL_TO_SEND_FROM, "test1@gmail.com", ANY) + smtp_obj.sendmail.assert_any_call( + EMAIL_TO_SEND_FROM, "test2@gmail.com", ANY) + + smtp_obj.quit.call_count == 2 diff --git a/api/tests/src/test_unsub_error_emails.py b/api/tests/src/test_unsub_error_emails.py new file mode 100644 index 000000000..aba9f6748 --- /dev/null +++ b/api/tests/src/test_unsub_error_emails.py @@ -0,0 +1,68 @@ +from unittest.mock import patch, MagicMock, call +import pytest +import src.unsub_error_emails as unsub_error_emails +import tests.data.unsub_error_emails_data as unsub_error_emails_data +import sqlalchemy +from werkzeug.exceptions import HTTPException + +###################################### Testing Requests ########################################## + + +def test_request_options(): + info = unsub_error_emails.UnsubErrorEmails() + (body, code, headers) = info.options() + assert body == '' + assert code == 204 + assert headers['Access-Control-Allow-Methods'] == 'GET' + + +@patch('src.unsub_error_emails.unsubscribe_user') +def test_unsubscribe_user_success(mock_unsubscribe_user): + email = "test@gmail.com" + mock_unsubscribe_user.return_value = 200 + status = unsub_error_emails.UnsubErrorEmails() + (body, code, headers) = status.get(email) + + mock_unsubscribe_user.assert_called_once() + mock_unsubscribe_user.assert_called_with(email) + assert code == 200 + assert headers['Access-Control-Allow-Origin'] == "*" + assert body == f"User {email} was successfully unsubscribed!" + + +@patch('src.unsub_error_emails.unsubscribe_user') +def test_unsubscribe_user_400(mock_unsubscribe_user): + email = None + mock_unsubscribe_user.return_value = 200 + status = unsub_error_emails.UnsubErrorEmails() + (body, code, headers) = status.get(email) + + mock_unsubscribe_user.assert_not_called() + assert code == 400 + assert headers['Access-Control-Allow-Origin'] == "*" + assert body == f"No unsubscribe email was specified" + + +@patch('src.unsub_error_emails.unsubscribe_user') +def test_unsubscribe_user_404(mock_unsubscribe_user): + email = "test@gmail.com" + mock_unsubscribe_user.return_value = 404 + status = unsub_error_emails.UnsubErrorEmails() + (body, code, headers) = status.get(email) + + mock_unsubscribe_user.assert_called_once() + mock_unsubscribe_user.assert_called_with(email) + assert code == 404 + assert headers['Access-Control-Allow-Origin'] == "*" + assert body == f"User with email {email} does not exist" + + +###################################### Testing Functions ########################################## +@patch('src.unsub_error_emails.smtp_error_handler.unsubscribe_user') +def test_unsubscribe_user(mock_unsubscribe_user): + mock_unsubscribe_user.return_value = "unsub_user_return" + expected_result = "unsub_user_return" + actual_result = unsub_error_emails.unsubscribe_user("test@gmail.com") + + mock_unsubscribe_user.assert_called_with("test@gmail.com") + assert actual_result == expected_result From 7ce30a4cba6fbc81a910786681bf0423ed95b556 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 27 Sep 2023 08:04:55 -0600 Subject: [PATCH 05/70] Initial typescript addition --- .vscode/settings.json | 3 +- webapp/package-lock.json | 232 +- webapp/package.json | 10 +- ...EnvironmentVars.js => EnvironmentVars.tsx} | 58 +- webapp/tsconfig.json | 13 + webapp/yarn.lock | 12795 ++++++++++++++++ 6 files changed, 12968 insertions(+), 143 deletions(-) rename webapp/src/{EnvironmentVars.js => EnvironmentVars.tsx} (98%) create mode 100644 webapp/tsconfig.json create mode 100644 webapp/yarn.lock diff --git a/.vscode/settings.json b/.vscode/settings.json index 81cc0d4fb..1afa3e5d4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,5 +15,6 @@ "python.formatting.blackArgs": ["--line-length", "120"], "[python]": { "editor.defaultFormatter": "ms-python.python" - } + }, + "cSpell.words": ["rsuinfo"] } diff --git a/webapp/package-lock.json b/webapp/package-lock.json index ac79fd108..c9f667ad1 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -56,10 +56,16 @@ "devDependencies": { "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", + "@types/jest": "^29.5.5", + "@types/node": "^20.6.2", + "@types/react": "^17.0.0", + "@types/react-dom": "^18.2.7", "babel-jest": "^29.5.0", "babel-plugin-transform-export-extensions": "^6.22.0", + "eslint": "8.23.1", "jest": "^26.6.0", - "react-test-renderer": "^17.0.2" + "react-test-renderer": "^17.0.2", + "typescript": "^4.9.4" } }, "node_modules/@adobe/css-tools": { @@ -2426,9 +2432,9 @@ "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, "node_modules/@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2453,9 +2459,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2488,14 +2494,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@hello-pangea/dnd": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.2.0.tgz", @@ -2530,18 +2528,27 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -4845,15 +4852,16 @@ } } }, - "node_modules/@material-ui/styles": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", - "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.2", + "@material-ui/utils": "^4.11.3", "clsx": "^1.0.4", "csstype": "^2.5.2", "hoist-non-react-statics": "^3.3.2", @@ -4885,13 +4893,13 @@ } } }, - "node_modules/@material-ui/system": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", - "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", "dependencies": { "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.2", + "@material-ui/utils": "^4.11.3", "csstype": "^2.5.2", "prop-types": "^15.7.2" }, @@ -4927,9 +4935,9 @@ } }, "node_modules/@material-ui/utils": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", - "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -6172,6 +6180,14 @@ "react-dom": "<18.0.0" } }, + "node_modules/@testing-library/react/node_modules/@types/react-dom": { + "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", + "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", + "dependencies": { + "@types/react": "^17" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -6374,9 +6390,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "version": "29.5.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", + "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -6435,9 +6451,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/node": { - "version": "18.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", - "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==" + "version": "20.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.3.tgz", + "integrity": "sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -6476,9 +6492,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.15.tgz", - "integrity": "sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw==", + "version": "17.0.65", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz", + "integrity": "sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -6486,11 +6502,12 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", - "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "devOptional": true, "dependencies": { - "@types/react": "^17" + "@types/react": "*" } }, "node_modules/@types/react-is": { @@ -6999,9 +7016,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "bin": { "acorn": "bin/acorn" }, @@ -10028,15 +10045,14 @@ } }, "node_modules/eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -10047,19 +10063,19 @@ "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", "espree": "^9.4.0", - "esquery": "^1.4.2", + "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -10411,11 +10427,14 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-webpack-plugin": { @@ -10642,13 +10661,13 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -12845,7 +12864,7 @@ "node_modules/is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" }, "node_modules/is-map": { "version": "2.0.2", @@ -12901,14 +12920,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -17423,9 +17434,9 @@ } }, "node_modules/jss": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.9.2.tgz", - "integrity": "sha512-b8G6rWpYLR4teTUbGd4I4EsnWjg7MN0Q5bSsjKhVkJVjhQDy2KzkbD2AW3TuT0RYZVmZZHKIrXDn6kjU14qkUg==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", "dependencies": { "@babel/runtime": "^7.3.1", "csstype": "^3.0.2", @@ -17438,76 +17449,76 @@ } }, "node_modules/jss-plugin-camel-case": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.2.tgz", - "integrity": "sha512-wgBPlL3WS0WDJ1lPJcgjux/SHnDuu7opmgQKSraKs4z8dCCyYMx9IDPFKBXQ8Q5dVYij1FFV0WdxyhuOOAXuTg==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", "dependencies": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", - "jss": "10.9.2" + "jss": "10.10.0" } }, "node_modules/jss-plugin-default-unit": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.2.tgz", - "integrity": "sha512-pYg0QX3bBEFtTnmeSI3l7ad1vtHU42YEEpgW7pmIh+9pkWNWb5dwS/4onSfAaI0kq+dOZHzz4dWe+8vWnanoSg==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", "dependencies": { "@babel/runtime": "^7.3.1", - "jss": "10.9.2" + "jss": "10.10.0" } }, "node_modules/jss-plugin-global": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.9.2.tgz", - "integrity": "sha512-GcX0aE8Ef6AtlasVrafg1DItlL/tWHoC4cGir4r3gegbWwF5ZOBYhx04gurPvWHC8F873aEGqge7C17xpwmp2g==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", "dependencies": { "@babel/runtime": "^7.3.1", - "jss": "10.9.2" + "jss": "10.10.0" } }, "node_modules/jss-plugin-nested": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.9.2.tgz", - "integrity": "sha512-VgiOWIC6bvgDaAL97XCxGD0BxOKM0K0zeB/ECyNaVF6FqvdGB9KBBWRdy2STYAss4VVA7i5TbxFZN+WSX1kfQA==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", "dependencies": { "@babel/runtime": "^7.3.1", - "jss": "10.9.2", + "jss": "10.10.0", "tiny-warning": "^1.0.2" } }, "node_modules/jss-plugin-props-sort": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.2.tgz", - "integrity": "sha512-AP1AyUTbi2szylgr+O0OB7gkIxEGzySLITZ2GpsaoX72YMCGI2jYAc+WUhPfvUnZYiauF4zTnN4V4TGuvFjJlw==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", "dependencies": { "@babel/runtime": "^7.3.1", - "jss": "10.9.2" + "jss": "10.10.0" } }, "node_modules/jss-plugin-rule-value-function": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.2.tgz", - "integrity": "sha512-vf5ms8zvLFMub6swbNxvzsurHfUZ5Shy5aJB2gIpY6WNA3uLinEcxYyraQXItRHi5ivXGqYciFDRM2ZoVoRZ4Q==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", "dependencies": { "@babel/runtime": "^7.3.1", - "jss": "10.9.2", + "jss": "10.10.0", "tiny-warning": "^1.0.2" } }, "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.2.tgz", - "integrity": "sha512-SxcEoH+Rttf9fEv6KkiPzLdXRmI6waOTcMkbbEFgdZLDYNIP9UKNHFy6thhbRKqv0XMQZdrEsbDyV464zE/dUA==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", "dependencies": { "@babel/runtime": "^7.3.1", "css-vendor": "^2.0.8", - "jss": "10.9.2" + "jss": "10.10.0" } }, "node_modules/jss/node_modules/csstype": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/jsx-ast-utils": { "version": "3.3.3", @@ -25011,7 +25022,6 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/webapp/package.json b/webapp/package.json index 601568b40..18571d0a0 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -81,10 +81,16 @@ "devDependencies": { "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", - "babel-plugin-transform-export-extensions": "^6.22.0", + "@types/jest": "^29.5.5", + "@types/node": "^20.6.2", + "@types/react": "^17.0.0", + "@types/react-dom": "^18.2.7", "babel-jest": "^29.5.0", + "babel-plugin-transform-export-extensions": "^6.22.0", "jest": "^26.6.0", - "react-test-renderer": "^17.0.2" + "react-test-renderer": "^17.0.2", + "eslint": "8.23.1", + "typescript": "^4.9.4" }, "jest": { "moduleNameMapper": { diff --git a/webapp/src/EnvironmentVars.js b/webapp/src/EnvironmentVars.tsx similarity index 98% rename from webapp/src/EnvironmentVars.js rename to webapp/src/EnvironmentVars.tsx index 2e98fc6fd..a21d1bef1 100644 --- a/webapp/src/EnvironmentVars.js +++ b/webapp/src/EnvironmentVars.tsx @@ -1,29 +1,29 @@ -class EnvironmentVars { - static getBaseApiUrl() { - return process.env.REACT_APP_GATEWAY_BASE_URL - } - - static MAPBOX_TOKEN = process.env.REACT_APP_MAPBOX_TOKEN - static KEYCLOAK_HOST_URL = process.env.REACT_APP_KEYCLOAK_URL - - static rsuInfoEndpoint = `${this.getBaseApiUrl()}/rsuinfo` - static rsuOnlineEndpoint = `${this.getBaseApiUrl()}/rsu-online-status` - static rsuCountsEndpoint = `${this.getBaseApiUrl()}/rsucounts` - static rsuCommandEndpoint = `${this.getBaseApiUrl()}/rsu-command` - static wzdxEndpoint = `${this.getBaseApiUrl()}/wzdx-feed` - static rsuMapInfoEndpoint = `${this.getBaseApiUrl()}/rsu-map-info` - static rsuGeoQueryEndpoint = `${this.getBaseApiUrl()}/rsu-geo-query` - static bsmDataEndpoint = `${this.getBaseApiUrl()}/rsu-bsm-data` - static issScmsStatusEndpoint = `${this.getBaseApiUrl()}/iss-scms-status` - static ssmSrmEndpoint = `${this.getBaseApiUrl()}/rsu-ssm-srm-data` - static authEndpoint = `${this.getBaseApiUrl()}/user-auth` - static adminAddRsu = `${this.getBaseApiUrl()}/admin-new-rsu` - static adminRsu = `${this.getBaseApiUrl()}/admin-rsu` - static adminAddUser = `${this.getBaseApiUrl()}/admin-new-user` - static adminUser = `${this.getBaseApiUrl()}/admin-user` - static adminAddOrg = `${this.getBaseApiUrl()}/admin-new-org` - static adminOrg = `${this.getBaseApiUrl()}/admin-org` - static contactSupport = `${this.getBaseApiUrl()}/contact-support` -} - -export default EnvironmentVars +class EnvironmentVars { + static getBaseApiUrl() { + return process.env.REACT_APP_GATEWAY_BASE_URL + } + + static MAPBOX_TOKEN = process.env.REACT_APP_MAPBOX_TOKEN + static KEYCLOAK_HOST_URL = process.env.REACT_APP_KEYCLOAK_URL + + static rsuInfoEndpoint = `${this.getBaseApiUrl()}/rsuinfo` + static rsuOnlineEndpoint = `${this.getBaseApiUrl()}/rsu-online-status` + static rsuCountsEndpoint = `${this.getBaseApiUrl()}/rsucounts` + static rsuCommandEndpoint = `${this.getBaseApiUrl()}/rsu-command` + static wzdxEndpoint = `${this.getBaseApiUrl()}/wzdx-feed` + static rsuMapInfoEndpoint = `${this.getBaseApiUrl()}/rsu-map-info` + static rsuGeoQueryEndpoint = `${this.getBaseApiUrl()}/rsu-geo-query` + static bsmDataEndpoint = `${this.getBaseApiUrl()}/rsu-bsm-data` + static issScmsStatusEndpoint = `${this.getBaseApiUrl()}/iss-scms-status` + static ssmSrmEndpoint = `${this.getBaseApiUrl()}/rsu-ssm-srm-data` + static authEndpoint = `${this.getBaseApiUrl()}/user-auth` + static adminAddRsu = `${this.getBaseApiUrl()}/admin-new-rsu` + static adminRsu = `${this.getBaseApiUrl()}/admin-rsu` + static adminAddUser = `${this.getBaseApiUrl()}/admin-new-user` + static adminUser = `${this.getBaseApiUrl()}/admin-user` + static adminAddOrg = `${this.getBaseApiUrl()}/admin-new-org` + static adminOrg = `${this.getBaseApiUrl()}/admin-org` + static contactSupport = `${this.getBaseApiUrl()}/contact-support` +} + +export default EnvironmentVars diff --git a/webapp/tsconfig.json b/webapp/tsconfig.json new file mode 100644 index 000000000..6f8f4b7df --- /dev/null +++ b/webapp/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + "noImplicitAny": false + } +} diff --git a/webapp/yarn.lock b/webapp/yarn.lock new file mode 100644 index 000000000..8377eb3b4 --- /dev/null +++ b/webapp/yarn.lock @@ -0,0 +1,12795 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adobe/css-tools@^4.0.1": + version "4.2.0" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" + integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.16.0", "@babel/core@^7.4.0-0", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0", "@babel/core@>=7.11.0": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.10" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/eslint-parser@^7.16.3": + version "7.19.1" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz" + integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.18.10", "@babel/generator@^7.21.1", "@babel/generator@^7.7.2": + version "7.21.1" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz" + integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz" + integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.3.1" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz" + integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== + dependencies: + "@babel/types" "^7.21.0" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.7", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.16.4": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz" + integrity sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/plugin-syntax-decorators" "^7.21.0" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz" + integrity sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.20.2": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.16.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz" + integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-flow" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" + integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== + dependencies: + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz" + integrity sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.18.6": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz" + integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.21.0" + +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.16.4": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz" + integrity sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.19.0": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz" + integrity sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0", "@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/preset-typescript@^7.16.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz" + integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-transform-typescript" "^7.21.0" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.10.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.0", "@babel/runtime@^7.9.2": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/normalize.css@*": + version "12.0.0" + resolved "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz" + integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== + +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.1.1" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz" + integrity sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw== + +"@date-io/core@^2.15.0", "@date-io/core@^2.16.0": + version "2.16.0" + resolved "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz" + integrity sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg== + +"@date-io/date-fns@^2.15.0": + version "2.16.0" + resolved "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz" + integrity sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/date-fns@^2.16.0": + version "2.16.0" + resolved "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz" + integrity sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/dayjs@^2.15.0": + version "2.16.0" + resolved "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz" + integrity sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/luxon@^2.15.0": + version "2.16.1" + resolved "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz" + integrity sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/moment@^2.15.0": + version "2.16.1" + resolved "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz" + integrity sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ== + dependencies: + "@date-io/core" "^2.16.0" + +"@emotion/babel-plugin@^11.10.5": + version "11.10.5" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz" + integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.1" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.1.3" + +"@emotion/cache@^11.10.5", "@emotion/cache@^11.4.0": + version "11.10.5" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.3" + +"@emotion/core@^11.0.0": + version "11.0.0" + resolved "https://registry.npmjs.org/@emotion/core/-/core-11.0.0.tgz" + integrity sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA== + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/is-prop-valid@^1.1.0", "@emotion/is-prop-valid@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.1.4", "@emotion/react@^11.10.4", "@emotion/react@^11.10.5", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.8.1", "@emotion/react@^11.9.0": + version "11.10.5" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz" + integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== + dependencies: + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== + +"@emotion/styled@^11.10.4", "@emotion/styled@^11.10.5", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": + version "11.10.5" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz" + integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== + +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== + +"@eslint/eslintrc@^1.3.2": + version "1.4.1" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@hello-pangea/dnd@^16.0.0": + version "16.2.0" + resolved "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.2.0.tgz" + integrity sha512-inACvMcvvLr34CG0P6+G/3bprVKhwswxjcsFUSJ+fpOGjhvDj9caiA9X3clby0lgJ6/ILIJjyedHZYECB7GAgA== + dependencies: + "@babel/runtime" "^7.19.4" + css-box-model "^1.2.1" + memoize-one "^6.0.0" + raf-schd "^4.0.3" + react-redux "^8.0.4" + redux "^4.2.0" + use-memo-one "^1.1.3" + +"@hookform/error-message@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@hookform/error-message/-/error-message-2.0.1.tgz" + integrity sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg== + +"@humanwhocodes/config-array@^0.10.4": + version "0.10.7" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz" + integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz" + integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.6.2" + jest-util "^26.6.2" + slash "^3.0.0" + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^26.6.3": + version "26.6.3" + resolved "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz" + integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/reporters" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.6.2" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-resolve-dependencies "^26.6.3" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + jest-watcher "^26.6.2" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== + dependencies: + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== + dependencies: + "@jest/types" "^26.6.2" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz" + integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/types" "^26.6.2" + expect "^26.6.2" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz" + integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.6.2" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^7.0.0" + optionalDependencies: + node-notifier "^8.0.0" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz" + integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz" + integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^26.6.3": + version "26.6.3" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz" + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== + dependencies: + "@jest/test-result" "^26.6.2" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mapbox/geojson-rewind@^0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz" + integrity sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA== + dependencies: + get-stream "^6.0.1" + minimist "^1.2.6" + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz" + integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= + +"@mapbox/mapbox-gl-supported@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz" + integrity sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ== + +"@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0", "@mapbox/point-geometry@0.1.0": + version "0.1.0" + resolved "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz" + integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= + +"@mapbox/tiny-sdf@^2.0.6": + version "2.0.6" + resolved "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz" + integrity sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA== + +"@mapbox/unitbezier@^0.0.1": + version "0.0.1" + resolved "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz" + integrity sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw== + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + +"@material-table/core@^6.1.6": + version "6.1.6" + resolved "https://registry.npmjs.org/@material-table/core/-/core-6.1.6.tgz" + integrity sha512-fbxDj+kqCsdU0MBhJai/5RBgLCnV7R4WboZjYUtOzX5TQcGBCYk/BAae67rwG++0IUSdmKENVawPMNbV0qWROw== + dependencies: + "@babel/runtime" "^7.19.0" + "@date-io/core" "^2.16.0" + "@date-io/date-fns" "^2.16.0" + "@emotion/core" "^11.0.0" + "@emotion/react" "^11.10.4" + "@emotion/styled" "^11.10.4" + "@hello-pangea/dnd" "^16.0.0" + "@mui/icons-material" ">=5.10.6" + "@mui/material" ">=5.10.7" + "@mui/x-date-pickers" "^5.0.3" + classnames "^2.3.2" + date-fns "^2.29.3" + debounce "^1.2.1" + deep-eql "^4.1.1" + deepmerge "^4.2.2" + prop-types "^15.8.1" + react-double-scrollbar "0.0.15" + uuid "^9.0.0" + zustand "^4.1.1" + +"@material-ui/core@^4.12.3": + version "4.12.3" + resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz" + integrity sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.4" + "@material-ui/system" "^4.12.1" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/styles@^4.11.4": + version "4.11.5" + resolved "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz" + integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.3" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.12.1": + version "4.12.2" + resolved "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz" + integrity sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.3" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.11.2", "@material-ui/utils@^4.11.3": + version "4.11.3" + resolved "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz" + integrity sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@mui/base@5.0.0-alpha.119": + version "5.0.0-alpha.119" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.119.tgz" + integrity sha512-XA5zhlYfXi67u613eIF0xRmktkatx6ERy3h+PwrMN5IcWFbgiL1guz8VpdXON+GWb8+G7B8t5oqTFIaCqaSAeA== + dependencies: + "@babel/runtime" "^7.21.0" + "@emotion/is-prop-valid" "^1.2.0" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.11" + "@popperjs/core" "^2.11.6" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/core-downloads-tracker@^5.11.12": + version "5.11.12" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.12.tgz" + integrity sha512-LHh8HZQ5nPVcW5QnyLwkAZ40txc/S2bzKMQ3bTO+5mjuwAJ2AzQrjZINLVy1geY7ei1pHXVqO1hcWHg/QdT44w== + +"@mui/icons-material@^5.11.9", "@mui/icons-material@>=5.10.6": + version "5.11.11" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.11.tgz" + integrity sha512-Eell3ADmQVE8HOpt/LZ3zIma8JSvPh3XgnhwZLT0k5HRqZcd6F/QDHc7xsWtgz09t+UEFvOYJXjtrwKmLdwwpw== + dependencies: + "@babel/runtime" "^7.21.0" + +"@mui/material@^5.0.0", "@mui/material@^5.11.9", "@mui/material@^5.4.1", "@mui/material@>=5.10.7": + version "5.11.12" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.11.12.tgz" + integrity sha512-M6BiIeJjySeEzWeiFJQ9pIjJy6mx5mHPWeMT99wjQdAmA2GxCQhE9A0fh6jQP4jMmYzxhOIhjsGcp0vSdpseXg== + dependencies: + "@babel/runtime" "^7.21.0" + "@mui/base" "5.0.0-alpha.119" + "@mui/core-downloads-tracker" "^5.11.12" + "@mui/system" "^5.11.12" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.12" + "@types/react-transition-group" "^4.4.5" + clsx "^1.2.1" + csstype "^3.1.1" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" + +"@mui/private-theming@^5.11.12": + version "5.11.12" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.12.tgz" + integrity sha512-hnJ0svNI1TPeWZ18E6DvES8PB4NyMLwal6EyXf69rTrYqT6wZPLjB+HiCYfSOCqU/fwArhupSqIIkQpDs8CkAw== + dependencies: + "@babel/runtime" "^7.21.0" + "@mui/utils" "^5.11.12" + prop-types "^15.8.1" + +"@mui/styled-engine-sc@^5.11.9": + version "5.11.11" + resolved "https://registry.npmjs.org/@mui/styled-engine-sc/-/styled-engine-sc-5.11.11.tgz" + integrity sha512-6+HsfcKHlhjQklDoEup7Itl+Xgn+BCsqEpIdIIhlxED4YlOZ38xghxIKrx78XFZznTorbhAspUgDDKIaB5vDMg== + dependencies: + "@babel/runtime" "^7.21.0" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.11.11": + version "5.11.11" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.11.tgz" + integrity sha512-wV0UgW4lN5FkDBXefN8eTYeuE9sjyQdg5h94vtwZCUamGQEzmCOtir4AakgmbWMy0x8OLjdEUESn9wnf5J9MOg== + dependencies: + "@babel/runtime" "^7.21.0" + "@emotion/cache" "^11.10.5" + csstype "^3.1.1" + prop-types "^15.8.1" + +"@mui/system@^5.11.12", "@mui/system@^5.4.1", "@mui/system@>=5.10.7": + version "5.11.12" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.11.12.tgz" + integrity sha512-sYjsXkiwKpZDC3aS6O/6KTjji0jGINLQcrD5EJ5NTkIDiLf19I4HJhnufgKqlTWNfoDBlRohuTf3TzfM06c4ug== + dependencies: + "@babel/runtime" "^7.21.0" + "@mui/private-theming" "^5.11.12" + "@mui/styled-engine" "^5.11.11" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.12" + clsx "^1.2.1" + csstype "^3.1.1" + prop-types "^15.8.1" + +"@mui/types@^7.2.3": + version "7.2.3" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz" + integrity sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw== + +"@mui/utils@^5.10.3", "@mui/utils@^5.11.11", "@mui/utils@^5.11.12": + version "5.11.12" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.11.12.tgz" + integrity sha512-5vH9B/v8pzkpEPO2HvGM54ToXV6cFdAn8UrvdN8TMEEwpn/ycW0jLiyBcgUlPsQ+xha7hqXCPQYHaYFDIcwaiw== + dependencies: + "@babel/runtime" "^7.21.0" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^16.7.1 || ^17.0.0" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/x-date-pickers@^5.0.15", "@mui/x-date-pickers@^5.0.3": + version "5.0.20" + resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz" + integrity sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA== + dependencies: + "@babel/runtime" "^7.18.9" + "@date-io/core" "^2.15.0" + "@date-io/date-fns" "^2.15.0" + "@date-io/dayjs" "^2.15.0" + "@date-io/luxon" "^2.15.0" + "@date-io/moment" "^2.15.0" + "@mui/utils" "^5.10.3" + "@types/react-transition-group" "^4.4.5" + clsx "^1.2.1" + prop-types "^15.7.2" + react-transition-group "^4.4.5" + rifm "^0.12.1" + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.10" + resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz" + integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.23.3" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.4" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@popperjs/core@^2.0.0", "@popperjs/core@^2.11.5", "@popperjs/core@^2.11.6", "@popperjs/core@^2.6.0": + version "2.11.6" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + +"@react-aria/ssr@^3.2.0": + version "3.4.1" + resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.1.tgz" + integrity sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA== + dependencies: + "@swc/helpers" "^0.4.14" + +"@react-keycloak/core@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@react-keycloak/core/-/core-3.2.0.tgz" + integrity sha512-1yzU7gQzs+6E1v6hGqxy0Q+kpMHg9sEcke2yxZR29WoU8KNE8E50xS6UbI8N7rWsgyYw8r9W1cUPCOF48MYjzw== + dependencies: + react-fast-compare "^3.2.0" + +"@react-keycloak/web@3.4.0": + version "3.4.0" + resolved "https://registry.npmjs.org/@react-keycloak/web/-/web-3.4.0.tgz" + integrity sha512-yKKSCyqBtn7dt+VckYOW1IM5NW999pPkxDZOXqJ6dfXPXstYhOQCkTZqh8l7UL14PkpsoaHDh7hSJH8whah01g== + dependencies: + "@babel/runtime" "^7.9.0" + "@react-keycloak/core" "^3.2.0" + hoist-non-react-statics "^3.3.2" + +"@react-oauth/google@^0.2.8": + version "0.2.8" + resolved "https://registry.npmjs.org/@react-oauth/google/-/google-0.2.8.tgz" + integrity sha512-W3sRcU6kSZMGUOk10Vy5kPZPzvsi7+UpM2MxnT6fMVp+whDMKCVope5R01gwRydK9OI+0rozAARCD2NgrbkV7w== + +"@reduxjs/toolkit@^1.9.1": + version "1.9.3" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz" + integrity sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg== + dependencies: + immer "^9.0.16" + redux "^4.2.0" + redux-thunk "^2.4.2" + reselect "^4.1.7" + +"@restart/hooks@^0.4.5", "@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": + version "0.4.7" + resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz" + integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== + dependencies: + dequal "^2.0.2" + +"@restart/ui@^1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/@restart/ui/-/ui-1.4.1.tgz" + integrity sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A== + dependencies: + "@babel/runtime" "^7.18.3" + "@popperjs/core" "^2.11.5" + "@react-aria/ssr" "^3.2.0" + "@restart/hooks" "^0.4.7" + "@types/warning" "^3.0.0" + dequal "^2.0.2" + dom-helpers "^5.2.0" + uncontrollable "^7.2.1" + warning "^4.0.3" + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rushstack/eslint-patch@^1.1.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@swc/helpers@^0.4.14": + version "0.4.14" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz" + integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== + dependencies: + tslib "^2.4.0" + +"@syncfusion/ej2-base@~19.4.52": + version "19.4.52" + resolved "https://registry.npmjs.org/@syncfusion/ej2-base/-/ej2-base-19.4.52.tgz" + integrity sha512-BMJGjscgl5CGpWQW1y1osv+rcKBPYgPBpSfz8FA0XcqhL6wNjGomALmxHznk7QGWC/4bdUhx6AKsGHutMGm/PA== + dependencies: + "@syncfusion/ej2-icons" "~19.4.52" + +"@syncfusion/ej2-buttons@~19.4.52", "@syncfusion/ej2-buttons@~19.4.53", "@syncfusion/ej2-buttons@~19.4.55": + version "19.4.55" + resolved "https://registry.npmjs.org/@syncfusion/ej2-buttons/-/ej2-buttons-19.4.55.tgz" + integrity sha512-Ebvh5GfvOEQaB51EI6a9Cfrmkfmu9gbPeRmLPkXZPEokUSxIqyCP216Nm8NlOeEK3EbPxrOy/L1X9m1nOBM40Q== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + +"@syncfusion/ej2-calendars@19.4.56": + version "19.4.56" + resolved "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-19.4.56.tgz" + integrity sha512-QeBsu2OgJF4ZIRjP4H5U27Ge5nTAYC77r4wo4udb7Z8qTQzuhH/J0b6Jj3g3ptxGUUjzLDOL7OpONRnsXzC3JA== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + "@syncfusion/ej2-buttons" "~19.4.55" + "@syncfusion/ej2-inputs" "~19.4.52" + "@syncfusion/ej2-lists" "~19.4.55" + "@syncfusion/ej2-popups" "~19.4.53" + +"@syncfusion/ej2-data@~19.4.54": + version "19.4.54" + resolved "https://registry.npmjs.org/@syncfusion/ej2-data/-/ej2-data-19.4.54.tgz" + integrity sha512-btJDjKepcaVGtNqVoblhYFhx4sAW1ju+Nq1CBPn4kO0AtRPBQ3Gi47uQgsstkxNMDrv+UG1hNi7PhHpPNOtwUQ== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + +"@syncfusion/ej2-icons@~19.4.52": + version "19.4.52" + resolved "https://registry.npmjs.org/@syncfusion/ej2-icons/-/ej2-icons-19.4.52.tgz" + integrity sha512-hkEvuVA/soEdqFwFSGbj2Z9u6Ajb+4HZNYIKtw6aCwjn/FE5vFuGMFBdkLEX9BRkUl/e/uvyP6/TKBM/nfkY8A== + +"@syncfusion/ej2-inputs@~19.4.52": + version "19.4.52" + resolved "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-19.4.52.tgz" + integrity sha512-141wT1W8DbXM50A1RVHOtruCyPncF6CDOU8RdhtFx9ydbXvbSXH+2i+vKr8UK23qC07z8+YB8/wV7ZAQ5vI0Bw== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + "@syncfusion/ej2-buttons" "~19.4.52" + "@syncfusion/ej2-popups" "~19.4.52" + "@syncfusion/ej2-splitbuttons" "~19.4.52" + +"@syncfusion/ej2-lists@~19.4.55": + version "19.4.55" + resolved "https://registry.npmjs.org/@syncfusion/ej2-lists/-/ej2-lists-19.4.55.tgz" + integrity sha512-EGAcCc2mFOt99oOuT+wXSPEiyfiyHoBSJnAW5pvdCU1mI7FYcArCPVNLY5ynCgngQ7Ih0XxFPkuzEC0qmwlokA== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + "@syncfusion/ej2-buttons" "~19.4.55" + "@syncfusion/ej2-data" "~19.4.54" + +"@syncfusion/ej2-popups@~19.4.52", "@syncfusion/ej2-popups@~19.4.53": + version "19.4.53" + resolved "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-19.4.53.tgz" + integrity sha512-B0Uen6IFsmPR3Ws8NIIszJ2ECpWrH7VFCqcGL1DQnp9tm6+iEafv84ziffVoC4nGj2mHaHl7tNSoZTnOo/TcgQ== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + "@syncfusion/ej2-buttons" "~19.4.53" + +"@syncfusion/ej2-react-base@~19.4.56": + version "19.4.56" + resolved "https://registry.npmjs.org/@syncfusion/ej2-react-base/-/ej2-react-base-19.4.56.tgz" + integrity sha512-mi1OKYgGfOe2MKcnMBuioYbdJea4IXCbFvUxG1WEZI5n3t6CxKH4ZWum7IgBO1kcTkaCdhs8Aj0ACFXUFmOwOQ== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + +"@syncfusion/ej2-react-calendars@^19.4.56": + version "19.4.56" + resolved "https://registry.npmjs.org/@syncfusion/ej2-react-calendars/-/ej2-react-calendars-19.4.56.tgz" + integrity sha512-o5bNc+hct5Jj/8CwvflYxUExddP0gkXpNsXNw3iGu2GCTGEnZ/Xb6OVXv8ammrCcB/Ck8vEliNTOKAEqdMLslA== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + "@syncfusion/ej2-calendars" "19.4.56" + "@syncfusion/ej2-react-base" "~19.4.56" + +"@syncfusion/ej2-splitbuttons@~19.4.52": + version "19.4.52" + resolved "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-19.4.52.tgz" + integrity sha512-EmUh/3gwW04nCF/0UUfS6w3nl6Sy62ysPFqzwFTu9972DHr4R5W7t147PMJnFRa9Q0i/ud5a9/jERU7quaxBDw== + dependencies: + "@syncfusion/ej2-base" "~19.4.52" + "@syncfusion/ej2-popups" "~19.4.52" + +"@testing-library/dom@^8.0.0": + version "8.20.0" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.0.tgz" + integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^5.16.5": + version "5.16.5" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz" + integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^12.1.2": + version "12.1.5" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz" + integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.0.0" + "@types/react-dom" "<18.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7", "@types/babel__core@^7.1.9": + version "7.20.0" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/classnames@^2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz" + integrity sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A== + dependencies: + classnames "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": + version "8.21.1" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz" + integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/geojson@*": + version "7946.0.10" + resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz" + integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== + +"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-proxy@^1.17.8": + version "1.17.10" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz" + integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*", "@types/jest@^29.5.5": + version "29.5.5" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz" + integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mapbox-gl@^2.6.0": + version "2.7.10" + resolved "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-2.7.10.tgz" + integrity sha512-nMVEcu9bAcenvx6oPWubQSPevsekByjOfKjlkr+8P91vawtkxTnopDoXXq1Qn/f4cg3zt0Z2W9DVsVsKRNXJTw== + dependencies: + "@types/geojson" "*" + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/node@*", "@types/node@^20.6.2": + version "20.6.3" + resolved "https://registry.npmjs.org/@types/node/-/node-20.6.3.tgz" + integrity sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.0.0", "@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/prop-types@*", "@types/prop-types@^15.7.5": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^16.8 || ^17.0 || ^18.0", "@types/react-dom@^18.2.7": + version "18.2.7" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== + dependencies: + "@types/react" "*" + +"@types/react-dom@<18.0.0": + version "17.0.20" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz" + integrity sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA== + dependencies: + "@types/react" "^17" + +"@types/react-is@^16.7.1 || ^17.0.0": + version "17.0.3" + resolved "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz" + integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.2.0", "@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.4", "@types/react-transition-group@^4.4.5": + version "4.4.5" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@^16.8.6 || ^17.0.0", "@types/react@^17", "@types/react@^17.0.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@>=16.14.8", "@types/react@>=16.9.11": + version "17.0.65" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz" + integrity sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.1" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.5" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz" + integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== + dependencies: + "@types/jest" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + +"@types/warning@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz" + integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== + +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^15.0.0": + version "15.0.15" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@^5.5.0": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz" + integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== + dependencies: + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/type-utils" "5.54.1" + "@typescript-eslint/utils" "5.54.1" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.54.1.tgz" + integrity sha512-oqSc2Gr4TL/2M0XRJ9abA1o3Wf1cFJTNqWq0kjdStIIvgMQGZ3TSaFFJ2Cvy3Fgqi9UfDZ8u5idbACssIIyHaw== + dependencies: + "@typescript-eslint/utils" "5.54.1" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.5.0": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz" + integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== + dependencies: + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.54.1": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz" + integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== + dependencies: + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" + +"@typescript-eslint/type-utils@5.54.1": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz" + integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== + dependencies: + "@typescript-eslint/typescript-estree" "5.54.1" + "@typescript-eslint/utils" "5.54.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.54.1": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz" + integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== + +"@typescript-eslint/typescript-estree@5.54.1": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz" + integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== + dependencies: + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@^5.43.0", "@typescript-eslint/utils@5.54.1": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz" + integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.54.1": + version "5.54.1" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz" + integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== + dependencies: + "@typescript-eslint/types" "5.54.1" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0, acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.6.0, ajv@>=8: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.8.0, ajv@^8.8.2: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.0.0, aria-query@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +asap@~2.0.3, asap@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^10.4.13: + version "10.4.13" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.6.3" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" + integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" + +babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-jest@^27.4.2, babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== + dependencies: + "@jest/transform" "^29.5.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.2.3: + version "8.3.0" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-istanbul@^6.0.0, babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-named-asset-import@^0.3.8: + version "0.3.8" + resolved "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz" + integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +"babel-plugin-styled-components@>= 1.12.0": + version "2.0.7" + resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz" + integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + picomatch "^2.3.0" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz" + integrity sha512-Eo0rcRaIDMld/W6mVhePiudIuLW+Cr/8eveW3mBREfZORScZgx4rh6BAPyvzdEc/JZvQ+LkC80t0VGFs6FX+lg== + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" + integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz" + integrity sha512-mtzELzINaYqdVglyZrDDVwkcFRuE7s6QUFWXxwffKAHB/NkfbJ2NJSytugB43ytIC8UVt30Ereyx+7gNyTkDLg== + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz" + integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-decorators" "^7.16.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-transform-flow-strip-types" "^7.16.0" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.4" + "@babel/preset-env" "^7.16.4" + "@babel/preset-react" "^7.16.0" + "@babel/preset-typescript" "^7.16.0" + "@babel/runtime" "^7.16.3" + babel-plugin-macros "^3.1.0" + babel-plugin-transform-react-remove-prop-types "^0.4.24" + +babel-runtime@^6.22.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bfj@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.0" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz" + integrity sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, "browserslist@>= 4", "browserslist@>= 4.21.0", browserslist@>=4: + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.0.3: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.2.1: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: + version "1.0.30001462" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001462.tgz" + integrity sha512-PDd20WuOBPiasZ7KbFnmQRyuLE7cFXW2PVd7dmALzbkUXEP46upAuCDm9eY9vho8fgNMGmbAX92QBZHzcnWIqw== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +char-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + +check-types@^11.1.1: + version "11.1.2" + resolved "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz" + integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@*, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.3.1, classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +clean-css@^5.2.2: + version "5.3.2" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + dependencies: + source-map "~0.6.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clsx@^1.0.4, clsx@^1.1.0, clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confusing-browser-globals@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +core-js-compat@^3.25.1: + version "3.29.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.0.tgz" + integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== + dependencies: + browserslist "^4.21.5" + +core-js-pure@^3.23.3: + version "3.29.0" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.0.tgz" + integrity sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz" + integrity sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.19.2: + version "3.29.0" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz" + integrity sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-fetch@^3.0.4: + version "3.1.5" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-box-model@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-declaration-sorter@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz" + integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^6.5.1: + version "6.7.3" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz" + integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.19" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-minimizer-webpack-plugin@^3.2.0: + version "3.4.1" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-to-react-native@^2.0.3: + version "2.3.2" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz" + integrity sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^3.3.0" + +css-to-react-native@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz" + integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz" + integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= + +cssdb@^7.1.0: + version "7.4.1" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.4.1.tgz" + integrity sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.6: + version "5.1.15" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.0.2, csso@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^2.5.2: + version "2.6.17" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz" + integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A== + +csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +csstype@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-arithmetic@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-4.1.0.tgz" + integrity sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg== + +date-fns@^2.0.0, date-fns@^2.25.0: + version "2.28.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + +date-fns@^2.29.3: + version "2.29.3" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + +dayjs@^1.10.7, dayjs@^1.11.7, dayjs@^1.8.17: + version "1.11.7" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^2.3.3: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^2.6.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decimal.js@^10.2.1: + version "10.4.3" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-eql@^4.1.1: + version "4.1.3" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dequal@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domelementtype@^2.0.1: + version "2.2.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domelementtype@1: + version "1.3.1" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +earcut@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz" + integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.284: + version "1.4.325" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.325.tgz" + integrity sha512-K1C03NT4I7BuzsRdCU5RWkgZxtswnKDYM6/eMhkEXqKu4e5T+ck610x3FPzu1y7HVFSiQKZqP16gnJzPpji1TQ== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emittery@^0.7.1: + version "0.7.2" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.0, encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +env-cmd@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz" + integrity sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA== + dependencies: + commander "^4.0.0" + cross-spawn "^7.0.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz" + integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.4" + is-array-buffer "^3.0.1" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-get-iterator@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.7.4" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.25.3: + version "2.27.5" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.7.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-react-hooks@^4.3.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.27.1: + version "7.32.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-plugin-testing-library@^5.0.1: + version "5.10.2" + resolved "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.2.tgz" + integrity sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw== + dependencies: + "@typescript-eslint/utils" "^5.43.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-webpack-plugin@^3.1.1: + version "3.2.0" + resolved "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz" + integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== + dependencies: + "@types/eslint" "^7.29.0 || ^8.4.1" + jest-worker "^28.0.2" + micromatch "^4.0.5" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.3.0, "eslint@>= 6", eslint@>=5, eslint@8.23.1: + version "8.23.1" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz" + integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg== + dependencies: + "@eslint/eslintrc" "^1.3.2" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "@humanwhocodes/module-importer" "^1.0.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== + dependencies: + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +expect@^29.0.0: + version "29.5.0" + resolved "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fbjs@^0.8.9: + version "0.8.18" + resolved "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz" + integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +gl-matrix@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz" + integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1, glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globals@^13.19.0: + version "13.22.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz" + integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz" + integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/history/-/history-5.3.0.tgz" + integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== + dependencies: + "@babel/runtime" "^7.7.6" + +hoist-non-react-statics@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz" + integrity sha512-r8huvKK+m+VraiRipdZYc+U4XW43j6OFG/oIafe7GfDbRpCduRoX9JI/DRxqgtBSCeL+et6N6ibZoedHS2NyOQ== + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@^0.6.2, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.12, ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +immer@^9.0.16, immer@^9.0.7, immer@>=9.0: + version "9.0.17" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.17.tgz" + integrity sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg== + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3, internal-slot@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz" + integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz" + integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== + dependencies: + "@jest/types" "^26.6.2" + execa "^4.0.0" + throat "^5.0.0" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== + dependencies: + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" + prompts "^2.0.1" + yargs "^15.4.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + micromatch "^4.0.2" + pretty-format "^26.6.2" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-fetch-mock@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz" + integrity sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw== + dependencies: + cross-fetch "^3.0.4" + promise-polyfill "^8.1.3" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== + dependencies: + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.6.2" + is-generator-fn "^2.0.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" + throat "^5.0.0" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + dependencies: + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== + dependencies: + "@jest/types" "^26.6.2" + jest-regex-util "^26.0.0" + jest-snapshot "^26.6.2" + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@*, jest-resolve@^27.4.2, jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.2" + read-pkg-up "^7.0.1" + resolve "^1.18.1" + slash "^3.0.0" + +jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-docblock "^26.0.0" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + cjs-module-lexer "^0.6.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.4.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.6.2" + graceful-fs "^4.2.4" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + natural-compare "^1.4.0" + pretty-format "^26.6.2" + semver "^7.3.2" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" + +jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== + dependencies: + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.6.2" + string-length "^4.0.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-watcher@^28.0.0: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^28.0.2: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== + dependencies: + "@types/node" "*" + jest-util "^29.5.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^26.6.0: + version "26.6.3" + resolved "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz" + integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== + dependencies: + "@jest/core" "^26.6.3" + import-local "^3.0.2" + jest-cli "^26.6.3" + +"jest@^27.0.0 || ^28.0.0", jest@^27.4.3: + version "27.5.1" + resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^16.4.0, jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +jss-plugin-camel-case@^10.5.1: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz" + integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.10.0" + +jss-plugin-default-unit@^10.5.1: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz" + integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-global@^10.5.1: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz" + integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-nested@^10.5.1: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz" + integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz" + integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-rule-value-function@^10.5.1: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz" + integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz" + integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.10.0" + +jss@^10.5.1, jss@10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" + integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +kdbush@^4.0.1, kdbush@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz" + integrity sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA== + +keycloak-js@>=9.0.2, keycloak-js@21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/keycloak-js/-/keycloak-js-21.1.1.tgz" + integrity sha512-Viyhf0SOpu2jM/A33vpigSCFLo8l4yg8lqzaGyxXoZ3nGO9lo68B2LwJBDtgpzqDUh8DK//yCOzdWuR2CT4keA== + dependencies: + base64-js "^1.5.1" + js-sha256 "^0.9.0" + +kind-of@^3.0.2, kind-of@^3.0.3: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4, klona@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.1.0" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +"luxon@^1.21.3 || ^2.x || ^3.x", "luxon@^1.28.0 || ^2.0.0 || ^3.0.0", luxon@^2.3.2: + version "2.5.2" + resolved "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz" + integrity sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA== + +lz-string@^1.4.4: + version "1.5.0" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +mapbox-gl@*, mapbox-gl@^2.9.1: + version "2.15.0" + resolved "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-2.15.0.tgz" + integrity sha512-fjv+aYrd5TIHiL7wRa+W7KjtUqKWziJMZUkK5hm8TvJ3OLeNPx4NmW/DgfYhd/jHej8wWL+QJBDbdMMAKvNC0A== + dependencies: + "@mapbox/geojson-rewind" "^0.5.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^2.0.1" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^2.0.6" + "@mapbox/unitbezier" "^0.0.1" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.3" + earcut "^2.2.4" + geojson-vt "^3.2.1" + gl-matrix "^3.4.3" + grid-index "^1.1.0" + kdbush "^4.0.1" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^2.0.0" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^8.0.0" + tinyqueue "^2.0.3" + vt-pbf "^3.1.3" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.4.5: + version "2.7.3" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.3.tgz" + integrity sha512-CD9cXeKeXLcnMw8FZdtfrRrLaM7gwCl4nKuKn2YkY2Bw5wdlB8zU2cCzw+w2zS9RFvbrufTBkMCJACNPwqQA0w== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz" + integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-notifier@^8.0.0, "node-notifier@^8.0.1 || ^9.0.0 || ^10.0.0": + version "8.0.2" + resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz" + integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nwsapi@^2.2.0: + version "2.2.2" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-each-series@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-browser-comments@^4: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.10: + version "12.1.11" + resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-js@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== + dependencies: + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" + +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.0.1: + version "7.8.3" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.11" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.1.4, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3, postcss@^8.3.5, postcss@^8.4, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.4, postcss@^8.4.6, "postcss@>= 8", postcss@>=8, postcss@>=8.0.9: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^7.0.35: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +potpack@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz" + integrity sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: + version "5.6.0" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^27.0.2, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0: + version "29.5.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise-polyfill@^8.1.3: + version "8.3.0" + resolved "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz" + integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +promise@^8.1.0: + version "8.3.0" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types-extra@^1.1.0, prop-types-extra@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + +prop-types@^15.5.0, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +protocol-buffers-schema@^3.3.1: + version "3.5.1" + resolved "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz" + integrity sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + +raf-schd@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz" + integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-slider@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/rc-slider/-/rc-slider-10.1.0.tgz" + integrity sha512-nhC8V0+lNj4gGKZix2QAfcj/EP3NvCtFhNJPFMvXUdn7pe8bSa2vXNSxQVN5b9veVSic4Xeqgd/7KamX3gqznA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.18.1" + shallowequal "^1.1.0" + +rc-util@^5.18.1: + version "5.24.4" + resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.24.4.tgz" + integrity sha512-2a4RQnycV9eV7lVZPEJ7QwJRPlZNc06J7CwcwZo4vIHr3PfUqtYgl1EkUV9ETAc6VRRi8XZOMFhYG63whlIC9Q== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^16.12.0" + shallowequal "^1.1.0" + +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== + dependencies: + core-js "^3.19.2" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" + +react-bootstrap@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.7.0.tgz" + integrity sha512-Jcrn6aUuRVBeSB6dzKODKZU1TONOdhAxu0IDm4Sv74SJUm98dMdhSotF2SNvFEADANoR+stV+7TK6SNX1wWu5w== + dependencies: + "@babel/runtime" "^7.17.2" + "@restart/hooks" "^0.4.6" + "@restart/ui" "^1.4.1" + "@types/react-transition-group" "^4.4.4" + classnames "^2.3.1" + dom-helpers "^5.2.1" + invariant "^2.2.4" + prop-types "^15.8.1" + prop-types-extra "^1.1.0" + react-transition-group "^4.4.2" + uncontrollable "^7.2.1" + warning "^4.0.3" + +react-confirm-alert@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/react-confirm-alert/-/react-confirm-alert-2.8.0.tgz" + integrity sha512-qvNjJWuWUpTh+q4NecUjCMIWLNDl8IwW6JRIky5pzoiFBXsLWSA2Z1VsaDsQedwgyxEpKnMEJFETkDogBpv/kA== + +react-dev-utils@^12.0.0: + version "12.0.1" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +"react-dom@^16.0.0 || ^17.0.0", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8.0 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^17.0.2, "react-dom@^17.0.2 || ^18.0.0", react-dom@<18.0.0, "react-dom@>= 16.8.0", react-dom@>=0.16.0, react-dom@>=16.0.0, react-dom@>=16.14.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.9.0: + version "17.0.2" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-double-scrollbar@0.0.15: + version "0.0.15" + resolved "https://registry.npmjs.org/react-double-scrollbar/-/react-double-scrollbar-0.0.15.tgz" + integrity sha512-dLz3/WBIpgFnzFY0Kb4aIYBMT2BWomHuW2DH6/9jXfS6/zxRRBUFQ04My4HIB7Ma7QoRBpcy8NtkPeFgcGBpgg== + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^3.0.1, react-fast-compare@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz" + integrity sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg== + +react-hook-form@^7.0.0, react-hook-form@^7.41.5: + version "7.41.5" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.41.5.tgz" + integrity sha512-DAKjSJ7X9f16oQrP3TW2/eD9N6HOgrmIahP4LOdFphEWVfGZ2LulFd6f6AQ/YS/0cx/5oc4j8a1PXxuaurWp/Q== + +react-icons@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz" + integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ== + +react-is@^16.12.0, "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, "react-is@^16.8.0 || ^17.0.0", "react-is@>= 16.8.0": + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-map-gl@^7.0.21: + version "7.0.23" + resolved "https://registry.npmjs.org/react-map-gl/-/react-map-gl-7.0.23.tgz" + integrity sha512-874jEtdS/fB2R4jSJKud9va0H0GlxhtiSFuUMATiniQ7A2lQnZLkZIPEWwIPkMmNZDXNlTAkxWEdSHzsqADVAw== + dependencies: + "@types/mapbox-gl" "^2.6.0" + +react-popper@^2.2.4: + version "2.3.0" + resolved "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz" + integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== + dependencies: + react-fast-compare "^3.0.1" + warning "^4.0.2" + +"react-redux@^7.2.1 || ^8.0.2", react-redux@^8.0.4, react-redux@^8.0.5: + version "8.0.5" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz" + integrity sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" + hoist-non-react-statics "^3.3.2" + react-is "^18.0.0" + use-sync-external-store "^1.0.0" + +react-refresh@^0.11.0, "react-refresh@>=0.10.0 <1.0.0": + version "0.11.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== + +react-router-dom@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz" + integrity sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ== + dependencies: + history "^5.2.0" + react-router "6.2.2" + +react-router@6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz" + integrity sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ== + dependencies: + history "^5.2.0" + +react-scripts@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz" + integrity sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" + bfj "^7.0.2" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.0" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.0" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" + optionalDependencies: + fsevents "^2.3.2" + +react-select@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/react-select/-/react-select-5.3.2.tgz" + integrity sha512-W6Irh7U6Ha7p5uQQ2ZnemoCQ8mcfgOtHfw3wuMzG6FAu0P+CYicgofSLOq97BhjMx8jS+h+wwWdCBeVVZ9VqlQ== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.8.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^5.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + +react-shallow-renderer@^16.13.1: + version "16.15.0" + resolved "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + +react-spinners@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/react-spinners/-/react-spinners-0.11.0.tgz" + integrity sha512-rDZc0ABWn/M1OryboGsWVmIPg8uYWl0L35jPUhr40+Yg+syVPjeHwvnB7XWaRpaKus3M0cG9BiJA+ZB0dAwWyw== + dependencies: + "@emotion/react" "^11.1.4" + +react-styled-components@^0.1.11: + version "0.1.11" + resolved "https://registry.npmjs.org/react-styled-components/-/react-styled-components-0.1.11.tgz" + integrity sha512-0jwFvn2IrxyA2FedYWbnYJYCUt1jk26+IVNOJhOrbsG8KM59Ve52ppbB5expDZBADXfsyky38ObUBX65AhQpvA== + dependencies: + styled-components "^2.1.1" + +react-table@^7.8.0: + version "7.8.0" + resolved "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz" + integrity sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA== + +react-tabs@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/react-tabs/-/react-tabs-4.2.1.tgz" + integrity sha512-nQcEN3KrAsSry6f9Jz2oyMQsnh+sLEy31YjlskL/mnI3KU/c7BeyD1VzHZmmcJ15UEFu12pYOXYkdTzZ0uyIbw== + dependencies: + clsx "^1.1.0" + prop-types "^15.5.0" + +react-test-renderer@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz" + integrity sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ== + dependencies: + object-assign "^4.1.1" + react-is "^17.0.2" + react-shallow-renderer "^16.13.1" + scheduler "^0.20.2" + +react-transition-group@^4.3.0, react-transition-group@^4.4.0, react-transition-group@^4.4.2, react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react-widgets@5.8.4: + version "5.8.4" + resolved "https://registry.npmjs.org/react-widgets/-/react-widgets-5.8.4.tgz" + integrity sha512-WcA/K+eVKAW+vyeQKdRqo2gmnLqHbNSDDKQ84j/wyhbautCRrGbjWAmKb4+tI3OzUgCAAEJDZ75azAY2WoKWYQ== + dependencies: + "@restart/hooks" "^0.4.5" + "@types/classnames" "^2.3.1" + "@types/react-transition-group" "^4.4.4" + classnames "^2.3.1" + date-arithmetic "^4.0.1" + dom-helpers "^5.2.1" + prop-types-extra "^1.1.1" + react-transition-group "^4.4.2" + tiny-warning "^1.0.3" + uncontrollable "^7.2.1" + +react@*, "react@^16.0.0 || ^17.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react@^16.8.3 || ^17.0.0-0 || ^18.0.0", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", "react@^17.0.0 || ^18.0.0", react@^17.0.2, "react@^17.0.2 || ^18.0.0", react@<18.0.0, "react@>= 0.14.7", "react@>= 16", "react@>= 16.8.0", react@>=0.14.0, react@>=0.16.0, react@>=15.0.0, react@>=16, react@>=16.0.0, react@>=16.14.0, react@>=16.3.0, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, react@17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +"react@>= 0.14.0 < 17.0.0-0": + version "16.14.0" + resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +reactstrap@^9.1.9: + version "9.1.9" + resolved "https://registry.npmjs.org/reactstrap/-/reactstrap-9.1.9.tgz" + integrity sha512-kcXHdYLmPK7rXzLotum7RI9uwvDZJ01VtjchAwzfKL8SHFZEvi7+JVsnBojf1ZIswRaTX/s8poAgZFgE8oF0zQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@popperjs/core" "^2.6.0" + classnames "^2.2.3" + prop-types "^15.5.8" + react-popper "^2.2.4" + react-transition-group "^4.4.2" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.1" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redux-thunk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" + integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== + +redux@^4, redux@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz" + integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== + dependencies: + "@babel/runtime" "^7.9.2" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz" + integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +reselect@^4.1.7: + version "4.1.7" + resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" + integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rifm@^0.12.1: + version "0.12.1" + resolved "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz" + integrity sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.0.0, rollup@^2.43.1: + version "2.79.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@*: + version "13.0.0" + resolved "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== + +sass-loader@^12.3.0: + version "12.6.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.1.1: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.1.2: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.0" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz" + integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.13" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.2, stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-length@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +styled-components@^2.1.1: + version "2.4.1" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-2.4.1.tgz" + integrity sha512-dO0MpONBmVfjA/DSdpcLYObQZcbM+ZXoBOx5ytk4ZmUuyo3JG7QFMvHQEIvVRL1Uogf6x0DI9XWve6pyW9TTiA== + dependencies: + buffer "^5.0.3" + css-to-react-native "^2.0.3" + fbjs "^0.8.9" + hoist-non-react-statics "^1.2.0" + is-plain-object "^2.0.1" + prop-types "^15.5.4" + stylis "^3.4.0" + supports-color "^3.2.3" + +styled-components@^5.3.1, styled-components@^5.3.6, "styled-components@>= 2": + version "5.3.8" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.8.tgz" + integrity sha512-6jQrlvaJQ16uWVVO0rBfApaTPItkqaG32l3746enNZzpMDxMvzmHzj8rHUg39bvVtom0Y8o8ZzWuchEXKGjVsg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^1.1.0" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylis@^3.4.0: + version "3.5.4" + resolved "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== + +supercluster@^8.0.0: + version "8.0.1" + resolved "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz" + integrity sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ== + dependencies: + kdbush "^4.0.2" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tailwindcss@^3.0.2: + version "3.2.7" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz" + integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.0.9" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: + version "5.3.6" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser@^5.0.0, terser@^5.10.0, terser@^5.14.1: + version "5.16.5" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz" + integrity sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-invariant@^1.0.6: + version "1.3.1" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-warning@^1.0.2, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.4.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3, "type-fest@>=0.17.0 <4.0.0": + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +"typescript@^3.2.1 || ^4", typescript@^4.9.4, "typescript@>= 2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=3.8: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +ua-parser-js@^0.7.30: + version "0.7.34" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.34.tgz" + integrity sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +uncontrollable@^7.2.1: + version "7.2.1" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-memo-one@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz" + integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== + +use-sync-external-store@^1.0.0, use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + +v8-to-istanbul@^7.0.0: + version "7.1.2" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vt-pbf@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz" + integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.2.1" + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@^1.0.8, walker@~1.0.5: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +warning@^4.0.0, warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.6.0, "webpack-dev-server@3.x || 4.x": + version "4.11.1" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== + dependencies: + tapable "^2.0.0" + webpack-sources "^2.2.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.9.0", "webpack@^4.44.2 || ^5.47.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.64.4, "webpack@>= 4", webpack@>=2, "webpack@>=4.43.0 <6.0.0": + version "5.76.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz" + integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.6.2, whatwg-fetch@>=0.10.0: + version "3.6.2" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz" + integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== + dependencies: + idb "^7.0.1" + workbox-core "6.5.4" + +workbox-broadcast-update@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz" + integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== + dependencies: + workbox-core "6.5.4" + +workbox-build@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz" + integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.5.4" + workbox-broadcast-update "6.5.4" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-google-analytics "6.5.4" + workbox-navigation-preload "6.5.4" + workbox-precaching "6.5.4" + workbox-range-requests "6.5.4" + workbox-recipes "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + workbox-streams "6.5.4" + workbox-sw "6.5.4" + workbox-window "6.5.4" + +workbox-cacheable-response@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz" + integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== + dependencies: + workbox-core "6.5.4" + +workbox-core@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz" + integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== + +workbox-expiration@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz" + integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== + dependencies: + idb "^7.0.1" + workbox-core "6.5.4" + +workbox-google-analytics@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz" + integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== + dependencies: + workbox-background-sync "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-navigation-preload@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz" + integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== + dependencies: + workbox-core "6.5.4" + +workbox-precaching@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz" + integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== + dependencies: + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-range-requests@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz" + integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== + dependencies: + workbox-core "6.5.4" + +workbox-recipes@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz" + integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== + dependencies: + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-precaching "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-routing@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz" + integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== + dependencies: + workbox-core "6.5.4" + +workbox-strategies@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz" + integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== + dependencies: + workbox-core "6.5.4" + +workbox-streams@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz" + integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== + dependencies: + workbox-core "6.5.4" + workbox-routing "6.5.4" + +workbox-sw@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz" + integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== + +workbox-webpack-plugin@^6.4.1: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz" + integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== + dependencies: + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.5.4" + +workbox-window@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz" + integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "6.5.4" + +worker-loader@^3.0.8: + version "3.0.8" + resolved "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz" + integrity sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.4.2: + version "8.12.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz" + integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zustand@^4.1.1, zustand@4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/zustand/-/zustand-4.3.1.tgz" + integrity sha512-EVyo/eLlOTcJm/X5M00rwtbYFXwRVTaRteSvhtbTZUCQFJkNfIyHPiJ6Ke68MSWzcKHpPzvqNH4gC2ZS/sbNqw== + dependencies: + use-sync-external-store "1.2.0" From f2f1a9acb8cb9668f6c79d0791bdebadae7c41c8 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 27 Sep 2023 08:10:17 -0600 Subject: [PATCH 06/70] Updating snapshot tests --- .../AdminFormManager.test.js.snap | 58 ++++++++++++++++--- .../__snapshots__/AdminAddUser.test.js.snap | 21 +++++++ .../__snapshots__/AdminEditUser.test.js.snap | 21 +++++++ .../__snapshots__/AdminUserTab.test.js.snap | 44 +++++++++++++- 4 files changed, 135 insertions(+), 9 deletions(-) diff --git a/webapp/src/components/__snapshots__/AdminFormManager.test.js.snap b/webapp/src/components/__snapshots__/AdminFormManager.test.js.snap index d69a9a9a5..02ac89daf 100644 --- a/webapp/src/components/__snapshots__/AdminFormManager.test.js.snap +++ b/webapp/src/components/__snapshots__/AdminFormManager.test.js.snap @@ -520,7 +520,7 @@ exports[`snapshot organization 1`] = ` style="box-sizing: border-box; width: 31%;" >
+ +
+ + Rcv Err Emails + + + +
+ No records to display diff --git a/webapp/src/features/adminAdduser/__snapshots__/AdminAddUser.test.js.snap b/webapp/src/features/adminAdduser/__snapshots__/AdminAddUser.test.js.snap index 7240cb2cd..75a1ebf47 100644 --- a/webapp/src/features/adminAdduser/__snapshots__/AdminAddUser.test.js.snap +++ b/webapp/src/features/adminAdduser/__snapshots__/AdminAddUser.test.js.snap @@ -78,6 +78,27 @@ exports[`should take a snapshot 1`] = `
+
+
+ + +
+
diff --git a/webapp/src/features/adminEditUser/__snapshots__/AdminEditUser.test.js.snap b/webapp/src/features/adminEditUser/__snapshots__/AdminEditUser.test.js.snap index db4f7d58e..deea6334b 100644 --- a/webapp/src/features/adminEditUser/__snapshots__/AdminEditUser.test.js.snap +++ b/webapp/src/features/adminEditUser/__snapshots__/AdminEditUser.test.js.snap @@ -78,6 +78,27 @@ exports[`should take a snapshot 1`] = `
+
+
+ + +
+
diff --git a/webapp/src/features/adminUserTab/__snapshots__/AdminUserTab.test.js.snap b/webapp/src/features/adminUserTab/__snapshots__/AdminUserTab.test.js.snap index 9ddc7e13d..c9a1ea334 100644 --- a/webapp/src/features/adminUserTab/__snapshots__/AdminUserTab.test.js.snap +++ b/webapp/src/features/adminUserTab/__snapshots__/AdminUserTab.test.js.snap @@ -368,6 +368,48 @@ exports[`should take a snapshot 1`] = ` />
+ +
+ + Rcv Err Emails + + + +
+ No records to display From 929ed931bfc66134281c6509d1f46d77fcaa4170 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 27 Sep 2023 08:18:46 -0600 Subject: [PATCH 07/70] switching 404 to 400 --- api/src/unsub_error_emails.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/unsub_error_emails.py b/api/src/unsub_error_emails.py index 0a7de92dc..f74e5789a 100644 --- a/api/src/unsub_error_emails.py +++ b/api/src/unsub_error_emails.py @@ -13,14 +13,14 @@ def unsubscribe_user(email: str): # REST endpoint resource class class UnsubErrorEmails(Resource): options_headers = { - 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Origin': os.environ["CORS_DOMAIN"], 'Access-Control-Allow-Headers': 'Content-Type,Authorization', 'Access-Control-Allow-Methods': 'GET', 'Access-Control-Max-Age': '3600' } headers = { - 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Origin': os.environ["CORS_DOMAIN"], 'Content-Type': 'application/json' } @@ -33,8 +33,8 @@ def get(self, email): if email: resp_code = unsubscribe_user(email) - if resp_code == 404: - return (f"User with email {email} does not exist", 404, self.headers) + if resp_code == 400: + return (f"User with email {email} does not exist", 400, self.headers) else: return (f"User {email} was successfully unsubscribed!", 200, self.headers) return ("No unsubscribe email was specified", 400, self.headers) From 6b5d0faa95a86c8960ec128b7a8429cd973796e2 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 27 Sep 2023 08:20:13 -0600 Subject: [PATCH 08/70] switching 404 to 400 pt 2 --- api/src/smtp_error_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/smtp_error_handler.py b/api/src/smtp_error_handler.py index a205caea8..ebf4fe444 100644 --- a/api/src/smtp_error_handler.py +++ b/api/src/smtp_error_handler.py @@ -25,7 +25,7 @@ def unsubscribe_user(email: str): pre_check = f"SELECT receive_error_emails FROM public.users WHERE email = '{email}'" pre_check_results = pgquery.query_db(pre_check) if not pre_check_results: - return 404 + return 400 query = f"UPDATE public.users SET receive_error_emails='0' WHERE email = '{email}'" From b4b405ac7097378782401ea98f134c5896f1b457 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 27 Sep 2023 08:22:29 -0600 Subject: [PATCH 09/70] Updating unit tests to use 400 resp code --- api/tests/src/test_smtp_error_handler.py | 2 +- api/tests/src/test_unsub_error_emails.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/tests/src/test_smtp_error_handler.py b/api/tests/src/test_smtp_error_handler.py index e65d90a98..0dc277f05 100644 --- a/api/tests/src/test_smtp_error_handler.py +++ b/api/tests/src/test_smtp_error_handler.py @@ -58,7 +58,7 @@ def test_unsubscribe_user_success(mock_insert_db, mock_query_db): @patch('src.smtp_error_handler.pgquery.insert_db') def test_unsubscribe_user_failure(mock_insert_db, mock_query_db): mock_query_db.return_value = [] - expected_code = 404 + expected_code = 400 actual_code = smtp_error_handler.unsubscribe_user("test@gmail.com") calls = [ diff --git a/api/tests/src/test_unsub_error_emails.py b/api/tests/src/test_unsub_error_emails.py index aba9f6748..7c582f2cb 100644 --- a/api/tests/src/test_unsub_error_emails.py +++ b/api/tests/src/test_unsub_error_emails.py @@ -46,13 +46,13 @@ def test_unsubscribe_user_400(mock_unsubscribe_user): @patch('src.unsub_error_emails.unsubscribe_user') def test_unsubscribe_user_404(mock_unsubscribe_user): email = "test@gmail.com" - mock_unsubscribe_user.return_value = 404 + mock_unsubscribe_user.return_value = 400 status = unsub_error_emails.UnsubErrorEmails() (body, code, headers) = status.get(email) mock_unsubscribe_user.assert_called_once() mock_unsubscribe_user.assert_called_with(email) - assert code == 404 + assert code == 400 assert headers['Access-Control-Allow-Origin'] == "*" assert body == f"User with email {email} does not exist" From 587129be22d80ce3c5155945d2188c5159039c83 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Mon, 13 Nov 2023 13:58:35 -0700 Subject: [PATCH 10/70] Converting all files to typescript and working through conversions --- .vscode/settings.json | 3 +- webapp/src/{App.js => App.tsx} | 6 +- ...{api-helper.test.js => api-helper.test.ts} | 13 +- .../src/apis/{api-helper.js => api-helper.ts} | 138 +++++- .../{auth-api.test.js => auth-api.test.ts} | 0 webapp/src/apis/{auth-api.js => auth-api.ts} | 2 +- webapp/src/apis/rsu-api.d.ts | 0 .../apis/{rsu-api.test.js => rsu-api.test.ts} | 0 webapp/src/apis/{rsu-api.js => rsu-api.ts} | 32 +- ...ionOptions.js => AdminDeletionOptions.tsx} | 0 ...nager.test.js => AdminFormManager.test.ts} | 0 ...minFormManager.js => AdminFormManager.tsx} | 52 +-- ...js => AdminOrganizationDeleteMenu.test.ts} | 0 ...enu.js => AdminOrganizationDeleteMenu.tsx} | 75 ++-- ...{AdminTable.test.js => AdminTable.test.ts} | 0 .../{AdminTable.js => AdminTable.tsx} | 62 +-- ...gureItem.test.js => ConfigureItem.test.ts} | 0 .../{ConfigureItem.js => ConfigureItem.tsx} | 0 ...figureRsu.test.js => ConfigureRsu.test.ts} | 100 ++--- .../{ConfigureRsu.js => ConfigureRsu.tsx} | 388 ++++++++--------- ...enu.test.js => ContactSupportMenu.test.ts} | 18 +- ...tSupportMenu.js => ContactSupportMenu.tsx} | 248 +++++------ .../{Header.test.js => Header.test.ts} | 2 +- .../src/components/{Header.js => Header.tsx} | 2 +- .../components/{Help.test.js => Help.test.ts} | 0 webapp/src/components/{Help.js => Help.tsx} | 0 .../{RsuMarker.test.js => RsuMarker.test.ts} | 0 .../{RsuMarker.js => RsuMarker.tsx} | 56 +-- ...bootMenu.test.js => RsuRebootMenu.test.ts} | 0 .../{RsuRebootMenu.js => RsuRebootMenu.tsx} | 132 +++--- ...dateItem.test.js => RsuUpdateItem.test.ts} | 0 .../{RsuUpdateItem.js => RsuUpdateItem.tsx} | 0 ...nmpsetMenu.test.js => SnmpsetMenu.test.ts} | 0 .../{SnmpsetMenu.js => SnmpsetMenu.tsx} | 272 ++++++------ ...pwalkItem.test.js => SnmpwalkItem.test.ts} | 0 .../{SnmpwalkItem.js => SnmpwalkItem.tsx} | 68 +-- ...pwalkMenu.test.js => SnmpwalkMenu.test.ts} | 0 .../{SnmpwalkMenu.js => SnmpwalkMenu.tsx} | 396 +++++++++--------- ...{SsmSrmItem.test.js => SsmSrmItem.test.ts} | 0 .../{SsmSrmItem.js => SsmSrmItem.tsx} | 0 .../components/{Tab.test.js => Tab.test.ts} | 0 webapp/src/components/{Tab.js => Tab.tsx} | 50 +-- .../components/{Tabs.test.js => Tabs.test.ts} | 0 webapp/src/components/{Tabs.js => Tabs.tsx} | 104 ++--- webapp/src/{constants.js => constants.tsx} | 0 ...n.test.js => AdminAddOrganization.test.ts} | 0 ...ganization.js => AdminAddOrganization.tsx} | 2 +- ...t.js => adminAddOrganizationSlice.test.ts} | 0 ...Slice.js => adminAddOrganizationSlice.tsx} | 10 +- ...dminAddRsu.test.js => AdminAddRsu.test.ts} | 0 .../{AdminAddRsu.js => AdminAddRsu.tsx} | 2 +- ...Slice.test.js => adminAddRsuSlice.test.ts} | 0 ...minAddRsuSlice.js => adminAddRsuSlice.tsx} | 48 ++- ...inAddUser.test.js => AdminAddUser.test.ts} | 0 .../{AdminAddUser.js => AdminAddUser.tsx} | 2 +- ...lice.test.js => adminAddUserSlice.test.ts} | 2 +- ...nAddUserSlice.js => adminAddUserSlice.tsx} | 26 +- ....test.js => AdminEditOrganization.test.ts} | 0 ...anization.js => AdminEditOrganization.tsx} | 2 +- ....js => adminEditOrganizationSlice.test.ts} | 0 ...lice.js => adminEditOrganizationSlice.tsx} | 10 +- ...inEditRsu.test.js => AdminEditRsu.test.ts} | 0 .../{AdminEditRsu.js => AdminEditRsu.tsx} | 21 +- ...lice.test.js => adminEditRsuSlice.test.ts} | 0 ...nEditRsuSlice.js => adminEditRsuSlice.tsx} | 83 ++-- ...EditUser.test.js => AdminEditUser.test.ts} | 0 .../{AdminEditUser.js => AdminEditUser.tsx} | 24 +- ...ice.test.js => adminEditUserSlice.test.ts} | 0 ...ditUserSlice.js => adminEditUserSlice.tsx} | 124 ++++-- ...b.test.js => AdminOrganizationTab.test.ts} | 0 ...izationTab.js => AdminOrganizationTab.tsx} | 2 +- ...t.js => adminOrganizationTabSlice.test.ts} | 0 ...Slice.js => adminOrganizationTabSlice.tsx} | 26 +- ...est.js => AdminOrganizationTabRsu.test.ts} | 0 ...nTabRsu.js => AdminOrganizationTabRsu.tsx} | 2 +- ...s => adminOrganizationTabRsuSlice.test.ts} | 0 ...ce.js => adminOrganizationTabRsuSlice.tsx} | 12 +- ...st.js => AdminOrganizationTabUser.test.ts} | 0 ...abUser.js => AdminOrganizationTabUser.tsx} | 2 +- ... => adminOrganizationTabUserSlice.test.ts} | 0 ...e.js => adminOrganizationTabUserSlice.tsx} | 16 +- ...dminRsuTab.test.js => AdminRsuTab.test.ts} | 0 .../{AdminRsuTab.js => AdminRsuTab.tsx} | 2 +- ...Slice.test.js => adminRsuTabSlice.test.ts} | 0 ...minRsuTabSlice.js => adminRsuTabSlice.tsx} | 16 +- ...inUserTab.test.js => AdminUserTab.test.ts} | 0 .../{AdminUserTab.js => AdminUserTab.tsx} | 2 +- ...lice.test.js => adminUserTabSlice.test.ts} | 0 ...nUserTabSlice.js => adminUserTabSlice.tsx} | 14 +- ...figureRSU.test.js => ConfigureRSU.test.ts} | 0 .../{ConfigureRSU.js => ConfigureRSU.tsx} | 2 +- ...ayCounts.test.js => DisplayCounts.test.ts} | 0 .../{DisplayCounts.js => DisplayCounts.tsx} | 13 +- .../menu/{Menu.test.js => Menu.test.ts} | 0 .../src/features/menu/{Menu.js => Menu.tsx} | 2 +- .../{menuSlice.test.js => menuSlice.test.ts} | 0 .../menu/{menuSlice.js => menuSlice.tsx} | 15 +- ...onfigSlice.test.js => configSlice.test.ts} | 0 .../{configSlice.js => configSlice.ts} | 94 +++-- .../{rsuSlice.test.js => rsuSlice.test.ts} | 0 .../{rsuSlice.js => rsuSlice.ts} | 96 ++--- .../{userSlice.test.js => userSlice.test.ts} | 0 .../{userSlice.js => userSlice.tsx} | 30 +- .../{wzdxSlice.test.js => wzdxSlice.test.ts} | 0 .../{wzdxSlice.js => wzdxSlice.ts} | 6 +- webapp/src/{index.js => index.tsx} | 0 ...keycloak-config.js => keycloak-config.tsx} | 20 +- webapp/src/{managers.js => managers.tsx} | 8 +- webapp/src/{store.js => store.tsx} | 4 + webapp/src/types/UserTypes.d.ts | 13 + webapp/tsconfig.json | 4 +- 111 files changed, 1606 insertions(+), 1370 deletions(-) rename webapp/src/{App.js => App.tsx} (94%) rename webapp/src/apis/{api-helper.test.js => api-helper.test.ts} (92%) rename webapp/src/apis/{api-helper.js => api-helper.ts} (58%) rename webapp/src/apis/{auth-api.test.js => auth-api.test.ts} (100%) rename webapp/src/apis/{auth-api.js => auth-api.ts} (91%) create mode 100644 webapp/src/apis/rsu-api.d.ts rename webapp/src/apis/{rsu-api.test.js => rsu-api.test.ts} (100%) rename webapp/src/apis/{rsu-api.js => rsu-api.ts} (62%) rename webapp/src/components/{AdminDeletionOptions.js => AdminDeletionOptions.tsx} (100%) rename webapp/src/components/{AdminFormManager.test.js => AdminFormManager.test.ts} (100%) rename webapp/src/components/{AdminFormManager.js => AdminFormManager.tsx} (81%) rename webapp/src/components/{AdminOrganizationDeleteMenu.test.js => AdminOrganizationDeleteMenu.test.ts} (100%) rename webapp/src/components/{AdminOrganizationDeleteMenu.js => AdminOrganizationDeleteMenu.tsx} (82%) rename webapp/src/components/{AdminTable.test.js => AdminTable.test.ts} (100%) rename webapp/src/components/{AdminTable.js => AdminTable.tsx} (96%) rename webapp/src/components/{ConfigureItem.test.js => ConfigureItem.test.ts} (100%) rename webapp/src/components/{ConfigureItem.js => ConfigureItem.tsx} (100%) rename webapp/src/components/{ConfigureRsu.test.js => ConfigureRsu.test.ts} (96%) rename webapp/src/components/{ConfigureRsu.js => ConfigureRsu.tsx} (96%) rename webapp/src/components/{ContactSupportMenu.test.js => ContactSupportMenu.test.ts} (97%) rename webapp/src/components/{ContactSupportMenu.js => ContactSupportMenu.tsx} (95%) rename webapp/src/components/{Header.test.js => Header.test.ts} (97%) rename webapp/src/components/{Header.js => Header.tsx} (98%) rename webapp/src/components/{Help.test.js => Help.test.ts} (100%) rename webapp/src/components/{Help.js => Help.tsx} (100%) rename webapp/src/components/{RsuMarker.test.js => RsuMarker.test.ts} (100%) rename webapp/src/components/{RsuMarker.js => RsuMarker.tsx} (96%) rename webapp/src/components/{RsuRebootMenu.test.js => RsuRebootMenu.test.ts} (100%) rename webapp/src/components/{RsuRebootMenu.js => RsuRebootMenu.tsx} (94%) rename webapp/src/components/{RsuUpdateItem.test.js => RsuUpdateItem.test.ts} (100%) rename webapp/src/components/{RsuUpdateItem.js => RsuUpdateItem.tsx} (100%) rename webapp/src/components/{SnmpsetMenu.test.js => SnmpsetMenu.test.ts} (100%) rename webapp/src/components/{SnmpsetMenu.js => SnmpsetMenu.tsx} (95%) rename webapp/src/components/{SnmpwalkItem.test.js => SnmpwalkItem.test.ts} (100%) rename webapp/src/components/{SnmpwalkItem.js => SnmpwalkItem.tsx} (96%) rename webapp/src/components/{SnmpwalkMenu.test.js => SnmpwalkMenu.test.ts} (100%) rename webapp/src/components/{SnmpwalkMenu.js => SnmpwalkMenu.tsx} (96%) rename webapp/src/components/{SsmSrmItem.test.js => SsmSrmItem.test.ts} (100%) rename webapp/src/components/{SsmSrmItem.js => SsmSrmItem.tsx} (100%) rename webapp/src/components/{Tab.test.js => Tab.test.ts} (100%) rename webapp/src/components/{Tab.js => Tab.tsx} (95%) rename webapp/src/components/{Tabs.test.js => Tabs.test.ts} (100%) rename webapp/src/components/{Tabs.js => Tabs.tsx} (95%) rename webapp/src/{constants.js => constants.tsx} (100%) rename webapp/src/features/adminAddOrganization/{AdminAddOrganization.test.js => AdminAddOrganization.test.ts} (100%) rename webapp/src/features/adminAddOrganization/{AdminAddOrganization.js => AdminAddOrganization.tsx} (95%) rename webapp/src/features/adminAddOrganization/{adminAddOrganizationSlice.test.js => adminAddOrganizationSlice.test.ts} (100%) rename webapp/src/features/adminAddOrganization/{adminAddOrganizationSlice.js => adminAddOrganizationSlice.tsx} (83%) rename webapp/src/features/adminAddRsu/{AdminAddRsu.test.js => AdminAddRsu.test.ts} (100%) rename webapp/src/features/adminAddRsu/{AdminAddRsu.js => AdminAddRsu.tsx} (99%) rename webapp/src/features/adminAddRsu/{adminAddRsuSlice.test.js => adminAddRsuSlice.test.ts} (100%) rename webapp/src/features/adminAddRsu/{adminAddRsuSlice.js => adminAddRsuSlice.tsx} (79%) rename webapp/src/features/adminAdduser/{AdminAddUser.test.js => AdminAddUser.test.ts} (100%) rename webapp/src/features/adminAdduser/{AdminAddUser.js => AdminAddUser.tsx} (98%) rename webapp/src/features/adminAdduser/{adminAddUserSlice.test.js => adminAddUserSlice.test.ts} (99%) rename webapp/src/features/adminAdduser/{adminAddUserSlice.js => adminAddUserSlice.tsx} (85%) rename webapp/src/features/adminEditOrganization/{AdminEditOrganization.test.js => AdminEditOrganization.test.ts} (100%) rename webapp/src/features/adminEditOrganization/{AdminEditOrganization.js => AdminEditOrganization.tsx} (96%) rename webapp/src/features/adminEditOrganization/{adminEditOrganizationSlice.test.js => adminEditOrganizationSlice.test.ts} (100%) rename webapp/src/features/adminEditOrganization/{adminEditOrganizationSlice.js => adminEditOrganizationSlice.tsx} (86%) rename webapp/src/features/adminEditRsu/{AdminEditRsu.test.js => AdminEditRsu.test.ts} (100%) rename webapp/src/features/adminEditRsu/{AdminEditRsu.js => AdminEditRsu.tsx} (96%) rename webapp/src/features/adminEditRsu/{adminEditRsuSlice.test.js => adminEditRsuSlice.test.ts} (100%) rename webapp/src/features/adminEditRsu/{adminEditRsuSlice.js => adminEditRsuSlice.tsx} (72%) rename webapp/src/features/adminEditUser/{AdminEditUser.test.js => AdminEditUser.test.ts} (100%) rename webapp/src/features/adminEditUser/{AdminEditUser.js => AdminEditUser.tsx} (90%) rename webapp/src/features/adminEditUser/{adminEditUserSlice.test.js => adminEditUserSlice.test.ts} (100%) rename webapp/src/features/adminEditUser/{adminEditUserSlice.js => adminEditUserSlice.tsx} (59%) rename webapp/src/features/adminOrganizationTab/{AdminOrganizationTab.test.js => AdminOrganizationTab.test.ts} (100%) rename webapp/src/features/adminOrganizationTab/{AdminOrganizationTab.js => AdminOrganizationTab.tsx} (98%) rename webapp/src/features/adminOrganizationTab/{adminOrganizationTabSlice.test.js => adminOrganizationTabSlice.test.ts} (100%) rename webapp/src/features/adminOrganizationTab/{adminOrganizationTabSlice.js => adminOrganizationTabSlice.tsx} (82%) rename webapp/src/features/adminOrganizationTabRsu/{AdminOrganizationTabRsu.test.js => AdminOrganizationTabRsu.test.ts} (100%) rename webapp/src/features/adminOrganizationTabRsu/{AdminOrganizationTabRsu.js => AdminOrganizationTabRsu.tsx} (98%) rename webapp/src/features/adminOrganizationTabRsu/{adminOrganizationTabRsuSlice.test.js => adminOrganizationTabRsuSlice.test.ts} (100%) rename webapp/src/features/adminOrganizationTabRsu/{adminOrganizationTabRsuSlice.js => adminOrganizationTabRsuSlice.tsx} (92%) rename webapp/src/features/adminOrganizationTabUser/{AdminOrganizationTabUser.test.js => AdminOrganizationTabUser.test.ts} (100%) rename webapp/src/features/adminOrganizationTabUser/{AdminOrganizationTabUser.js => AdminOrganizationTabUser.tsx} (99%) rename webapp/src/features/adminOrganizationTabUser/{adminOrganizationTabUserSlice.test.js => adminOrganizationTabUserSlice.test.ts} (100%) rename webapp/src/features/adminOrganizationTabUser/{adminOrganizationTabUserSlice.js => adminOrganizationTabUserSlice.tsx} (92%) rename webapp/src/features/adminRsuTab/{AdminRsuTab.test.js => AdminRsuTab.test.ts} (100%) rename webapp/src/features/adminRsuTab/{AdminRsuTab.js => AdminRsuTab.tsx} (98%) rename webapp/src/features/adminRsuTab/{adminRsuTabSlice.test.js => adminRsuTabSlice.test.ts} (100%) rename webapp/src/features/adminRsuTab/{adminRsuTabSlice.js => adminRsuTabSlice.tsx} (86%) rename webapp/src/features/adminUserTab/{AdminUserTab.test.js => AdminUserTab.test.ts} (100%) rename webapp/src/features/adminUserTab/{AdminUserTab.js => AdminUserTab.tsx} (98%) rename webapp/src/features/adminUserTab/{adminUserTabSlice.test.js => adminUserTabSlice.test.ts} (100%) rename webapp/src/features/adminUserTab/{adminUserTabSlice.js => adminUserTabSlice.tsx} (85%) rename webapp/src/features/menu/{ConfigureRSU.test.js => ConfigureRSU.test.ts} (100%) rename webapp/src/features/menu/{ConfigureRSU.js => ConfigureRSU.tsx} (98%) rename webapp/src/features/menu/{DisplayCounts.test.js => DisplayCounts.test.ts} (100%) rename webapp/src/features/menu/{DisplayCounts.js => DisplayCounts.tsx} (91%) rename webapp/src/features/menu/{Menu.test.js => Menu.test.ts} (100%) rename webapp/src/features/menu/{Menu.js => Menu.tsx} (96%) rename webapp/src/features/menu/{menuSlice.test.js => menuSlice.test.ts} (100%) rename webapp/src/features/menu/{menuSlice.js => menuSlice.tsx} (77%) rename webapp/src/generalSlices/{configSlice.test.js => configSlice.test.ts} (100%) rename webapp/src/generalSlices/{configSlice.js => configSlice.ts} (76%) rename webapp/src/generalSlices/{rsuSlice.test.js => rsuSlice.test.ts} (100%) rename webapp/src/generalSlices/{rsuSlice.js => rsuSlice.ts} (81%) rename webapp/src/generalSlices/{userSlice.test.js => userSlice.test.ts} (100%) rename webapp/src/generalSlices/{userSlice.js => userSlice.tsx} (70%) rename webapp/src/generalSlices/{wzdxSlice.test.js => wzdxSlice.test.ts} (100%) rename webapp/src/generalSlices/{wzdxSlice.js => wzdxSlice.ts} (83%) rename webapp/src/{index.js => index.tsx} (100%) rename webapp/src/{keycloak-config.js => keycloak-config.tsx} (96%) rename webapp/src/{managers.js => managers.tsx} (77%) rename webapp/src/{store.js => store.tsx} (95%) create mode 100644 webapp/src/types/UserTypes.d.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index e0e068604..b73cfe99a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,5 +11,6 @@ "prettier.useEditorConfig": false, "prettier.useTabs": false, "prettier.configPath": ".vscode/.prettierrc.json", - "python.testing.pytestArgs": ["services"] + "python.testing.pytestArgs": ["services"], + "cSpell.words": ["rsuinfo"] } diff --git a/webapp/src/App.js b/webapp/src/App.tsx similarity index 94% rename from webapp/src/App.js rename to webapp/src/App.tsx index 8f4a6c165..231381c78 100644 --- a/webapp/src/App.js +++ b/webapp/src/App.tsx @@ -22,12 +22,14 @@ import { selectAuthLoginData, selectRole, selectLoadingGlobal, setKcFailure } fr import { ReactKeycloakProvider } from '@react-keycloak/web' import keycloak from './keycloak-config' import { keycloakLogin } from './generalSlices/userSlice' +import { ThunkDispatch } from 'redux-thunk' +import { RootState } from './store' +import { AnyAction } from '@reduxjs/toolkit' let loginDispatched = false const App = () => { - const dispatch = useDispatch() - + const dispatch: ThunkDispatch = useDispatch() const displayMap = useSelector(selectDisplayMap) const authLoginData = useSelector(selectAuthLoginData) const userRole = useSelector(selectRole) diff --git a/webapp/src/apis/api-helper.test.js b/webapp/src/apis/api-helper.test.ts similarity index 92% rename from webapp/src/apis/api-helper.test.js rename to webapp/src/apis/api-helper.test.ts index 7ddf3bbaa..576d5b560 100644 --- a/webapp/src/apis/api-helper.test.js +++ b/webapp/src/apis/api-helper.test.ts @@ -1,4 +1,5 @@ import ApiHelper from './api-helper' +import fetchMock from 'jest-fetch-mock' beforeEach(() => { fetchMock.mockClear() @@ -52,17 +53,17 @@ it('Test fetch with codes request Error', async () => { it('Test post request', async () => { let expectedResponse = { data: 'Test JSON' } fetchMock.mockResponseOnce(JSON.stringify(expectedResponse)) - let actualResponse = await ApiHelper._postData({ url: 'https://test.com', token: 'testToken' }) + let actualResponse = await ApiHelper._postData({ url: 'https://test.com', token: 'testToken', body: {} }) expect(actualResponse.body).toEqual(expectedResponse) fetchMock.mockResponseOnce('NOT JSON') - actualResponse = await ApiHelper._postData({ url: 'https://test.com', token: 'testToken' }) + actualResponse = await ApiHelper._postData({ url: 'https://test.com', token: 'testToken', body: {} }) expect(actualResponse.body).toEqual(undefined) }) it('Test post request Error', async () => { fetchMock.mockRejectOnce(new Error('fake error message')) - const actualResponse = await ApiHelper._postData({ url: 'https://test.com', token: 'testToken' }) + const actualResponse = await ApiHelper._postData({ url: 'https://test.com', token: 'testToken', body: {} }) expect(actualResponse).toEqual(null) }) @@ -86,16 +87,16 @@ it('Test delete request Error', async () => { it('Test patch request', async () => { const expectedResponse = { data: 'Test JSON' } fetchMock.mockResponseOnce(JSON.stringify(expectedResponse)) - let actualResponse = await ApiHelper._patchData({ url: 'https://test.com', token: 'testToken' }) + let actualResponse = await ApiHelper._patchData({ url: 'https://test.com', token: 'testToken', body: {} }) expect(actualResponse.body).toEqual(expectedResponse) fetchMock.mockResponseOnce('NOT JSON') - actualResponse = await ApiHelper._patchData({ url: 'https://test.com', token: 'testToken' }) + actualResponse = await ApiHelper._patchData({ url: 'https://test.com', token: 'testToken', body: {} }) expect(actualResponse.body).toEqual(undefined) }) it('Test patch request Error', async () => { fetchMock.mockRejectOnce(new Error('fake error message')) - const actualResponse = await ApiHelper._patchData({ url: 'https://test.com', token: 'testToken' }) + const actualResponse = await ApiHelper._patchData({ url: 'https://test.com', token: 'testToken', body: {} }) expect(actualResponse).toEqual(null) }) diff --git a/webapp/src/apis/api-helper.js b/webapp/src/apis/api-helper.ts similarity index 58% rename from webapp/src/apis/api-helper.js rename to webapp/src/apis/api-helper.ts index 0129b925d..627d52c3b 100644 --- a/webapp/src/apis/api-helper.js +++ b/webapp/src/apis/api-helper.ts @@ -1,7 +1,7 @@ class ApiHelper { - formatQueryParams(query_params) { + formatQueryParams(query_params: Record) { if ( - !query_params || // 👈 null and undefined check + !query_params || Object.keys(query_params).length === 0 || Object.getPrototypeOf(query_params) !== Object.prototype ) @@ -16,7 +16,19 @@ class ApiHelper { } // Helper Functions - async _getData({ url, token, query_params = {}, url_ext = '', additional_headers = {} }) { + async _getData({ + url, + token, + query_params = {}, + url_ext = '', + additional_headers = {}, + }: { + url: string + token: string + query_params?: Record + url_ext?: string + additional_headers?: Record + }) { console.debug('GETTING DATA FROM ' + url) try { const resp = await fetch(url + this.formatQueryParams(query_params) + url_ext, { @@ -28,7 +40,17 @@ class ApiHelper { }) console.debug('GOT RESPONSE FROM', url + url_ext, resp) - return await resp.json() + const response = await resp.json() + console.log( + 'GET REQUEST MADE TO ' + + url + + url_ext + + ' WITH QUERY PARAMS ' + + query_params + + ' AND RESPONSE ' + + JSON.stringify(response) + ) + return response } catch (err) { console.error('Error in _getData: ' + err) return null @@ -36,7 +58,19 @@ class ApiHelper { } // Helper Functions - async _getDataWithCodes({ url, token, query_params = {}, url_ext = '', additional_headers = {} }) { + async _getDataWithCodes({ + url, + token, + query_params = {}, + url_ext = '', + additional_headers = {}, + }: { + url: string + token: string + query_params?: Record + url_ext?: string + additional_headers?: Record + }) { console.debug('GETTING DATA FROM ' + url) try { const resp = await fetch(url + this.formatQueryParams(query_params) + url_ext, { @@ -54,6 +88,15 @@ class ApiHelper { } catch (err) { console.error('Error in _getDataWithCodes: ' + err) } + console.log( + 'GET CODES REQUEST MADE TO ' + + url + + url_ext + + ' WITH QUERY PARAMS ' + + query_params + + ' AND RESPONSE ' + + JSON.stringify(respBody) + ) return { body: respBody, @@ -66,12 +109,26 @@ class ApiHelper { } } - async _postData({ url, body, token, query_params = {}, url_ext = '', additional_headers = {} }) { + async _postData({ + url, + body, + token, + query_params = {}, + url_ext = '', + additional_headers = {}, + }: { + url: string + body: Object + token?: string + query_params?: Record + url_ext?: string + additional_headers?: Record + }) { console.debug('POSTING DATA TO ' + url) try { const resp = await fetch(url + this.formatQueryParams(query_params) + url_ext, { method: 'POST', - body, + body: body as BodyInit, headers: { ...additional_headers, Authorization: token, @@ -86,6 +143,17 @@ class ApiHelper { } catch (err) { console.error('Error in _postData: ' + err) } + console.log( + 'POST REQUEST MADE TO ' + + url + + url_ext + + ' WITH QUERY PARAMS ' + + query_params + + ' AND BODY ' + + body + + ' AND RESPONSE ' + + JSON.stringify(respBody) + ) return { body: respBody, @@ -99,7 +167,19 @@ class ApiHelper { } // Helper Functions - async _deleteData({ url, token, query_params = {}, url_ext = '', additional_headers = {} }) { + async _deleteData({ + url, + token, + query_params = {}, + url_ext = '', + additional_headers = {}, + }: { + url: string + token: string + query_params?: Record + url_ext?: string + additional_headers?: Record + }) { console.debug('DELETING DATA FROM ' + url) try { const resp = await fetch(url + this.formatQueryParams(query_params) + url_ext, { @@ -118,6 +198,15 @@ class ApiHelper { } catch (err) { console.error('Error in _deleteData: ' + err) } + console.log( + 'DELETE REQUEST MADE TO ' + + url + + url_ext + + ' WITH QUERY PARAMS ' + + query_params + + ' AND RESPONSE ' + + JSON.stringify(respBody) + ) return { body: respBody, @@ -131,29 +220,52 @@ class ApiHelper { } // Helper Functions - async _patchData({ url, token, body, query_params = {}, url_ext = '', additional_headers = {} }) { + async _patchData({ + url, + token, + body, + query_params = {}, + url_ext = '', + additional_headers = {}, + }: { + url: string + token: string + body: Object + query_params?: Record + url_ext?: string + additional_headers?: Record + }) { console.debug('PATCHING DATA FROM ' + url) try { console.debug('REQUEST BODY', body) const resp = await fetch(url + this.formatQueryParams(query_params) + url_ext, { method: 'PATCH', - body, + body: body as BodyInit, headers: { ...additional_headers, Authorization: token, 'Content-Type': 'application/json', }, }) - console.debug('GOT RESPONSE FROM', url + url_ext, resp) let respBody = undefined - console.log('PATCH RESPONSE 1', resp) try { respBody = await resp.json() } catch (err) { console.error('Error in _patchData: ' + err) } - console.log('PATCH RESPONSE 2', resp) + + console.log( + 'PATCH REQUEST MADE TO ' + + url + + url_ext + + ' WITH QUERY PARAMS ' + + query_params + + ' AND BODY ' + + body + + ' AND RESPONSE ' + + JSON.stringify(respBody) + ) return { body: respBody, diff --git a/webapp/src/apis/auth-api.test.js b/webapp/src/apis/auth-api.test.ts similarity index 100% rename from webapp/src/apis/auth-api.test.js rename to webapp/src/apis/auth-api.test.ts diff --git a/webapp/src/apis/auth-api.js b/webapp/src/apis/auth-api.ts similarity index 91% rename from webapp/src/apis/auth-api.js rename to webapp/src/apis/auth-api.ts index 644133ab9..f6d274e81 100644 --- a/webapp/src/apis/auth-api.js +++ b/webapp/src/apis/auth-api.ts @@ -1,7 +1,7 @@ import EnvironmentVars from '../EnvironmentVars' class AuthApi { - async logIn(token) { + async logIn(token: string) { const content = await fetch(EnvironmentVars.authEndpoint, { method: 'GET', headers: { diff --git a/webapp/src/apis/rsu-api.d.ts b/webapp/src/apis/rsu-api.d.ts new file mode 100644 index 000000000..e69de29bb diff --git a/webapp/src/apis/rsu-api.test.js b/webapp/src/apis/rsu-api.test.ts similarity index 100% rename from webapp/src/apis/rsu-api.test.js rename to webapp/src/apis/rsu-api.test.ts diff --git a/webapp/src/apis/rsu-api.js b/webapp/src/apis/rsu-api.ts similarity index 62% rename from webapp/src/apis/rsu-api.js rename to webapp/src/apis/rsu-api.ts index 7c56329b1..9305b86b2 100644 --- a/webapp/src/apis/rsu-api.js +++ b/webapp/src/apis/rsu-api.ts @@ -3,55 +3,60 @@ import apiHelper from './api-helper' class RsuApi { // External Methods - getRsuInfo = async (token, org, url_ext = '', query_params = {}) => + getRsuInfo = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => apiHelper._getData({ url: EnvironmentVars.rsuInfoEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuOnline = async (token, org, url_ext = '', query_params = {}) => + getRsuOnline = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => apiHelper._getData({ url: EnvironmentVars.rsuOnlineEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuCounts = async (token, org, url_ext = '', query_params = {}) => + getRsuCounts = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => apiHelper._getData({ url: EnvironmentVars.rsuCountsEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuAuth = async (token, org, url_ext = '', query_params = {}) => + getRsuAuth = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => apiHelper._getData({ url: EnvironmentVars.authEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuCommand = async (token, org, url_ext = '', query_params = {}) => + getRsuCommand = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => apiHelper._getData({ url: EnvironmentVars.rsuCommandEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuMapInfo = async (token, org, url_ext = '', query_params = {}) => + getRsuMapInfo = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => apiHelper._getData({ url: EnvironmentVars.rsuMapInfoEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getSsmSrmData = async (token, url_ext = '', query_params = {}) => + getSsmSrmData = async (token: string, url_ext: string = '', query_params: Record = {}) => apiHelper._getData({ url: EnvironmentVars.ssmSrmEndpoint + url_ext, token, query_params, }) - getIssScmsStatus = async (token, org, url_ext = '', query_params = {}) => + getIssScmsStatus = async ( + token: string, + org: string, + url_ext: string = '', + query_params: Record = {} + ) => apiHelper._getData({ url: EnvironmentVars.issScmsStatusEndpoint + url_ext, token, @@ -60,7 +65,7 @@ class RsuApi { }) // WZDx - getWzdxData = async (token, url_ext = '', query_params = {}) => + getWzdxData = async (token: string, url_ext: string = '', query_params = {}) => apiHelper._getData({ url: EnvironmentVars.wzdxEndpoint + url_ext, token, @@ -68,11 +73,11 @@ class RsuApi { }) // POST - postBsmData = async (token, body, url_ext = '') => + postBsmData = async (token: string, body: Object, url_ext: string = '') => apiHelper._postData({ url: EnvironmentVars.bsmDataEndpoint + url_ext, body, token }) // POST - postRsuData = async (token, org, body, url_ext = '') => { + postRsuData = async (token: string, org: string, body: Object, url_ext = '') => { body = JSON.stringify(body) return await apiHelper._postData({ url: EnvironmentVars.rsuCommandEndpoint + url_ext, @@ -83,18 +88,17 @@ class RsuApi { } // POST - postRsuGeo = async (token, org, body, url_ext, onError = () => {}) => { + postRsuGeo = async (token: string, org: string, body: Object, url_ext: string) => { return await apiHelper._postData({ url: EnvironmentVars.rsuGeoQueryEndpoint + url_ext, body, token, additional_headers: { Organization: org }, - onError, }) } // POST - postContactSupport = async (json) => { + postContactSupport = async (json: Object) => { return await apiHelper._postData({ url: EnvironmentVars.contactSupport, body: JSON.stringify(json), diff --git a/webapp/src/components/AdminDeletionOptions.js b/webapp/src/components/AdminDeletionOptions.tsx similarity index 100% rename from webapp/src/components/AdminDeletionOptions.js rename to webapp/src/components/AdminDeletionOptions.tsx diff --git a/webapp/src/components/AdminFormManager.test.js b/webapp/src/components/AdminFormManager.test.ts similarity index 100% rename from webapp/src/components/AdminFormManager.test.js rename to webapp/src/components/AdminFormManager.test.ts diff --git a/webapp/src/components/AdminFormManager.js b/webapp/src/components/AdminFormManager.tsx similarity index 81% rename from webapp/src/components/AdminFormManager.js rename to webapp/src/components/AdminFormManager.tsx index c6b85efe9..1596a7951 100644 --- a/webapp/src/components/AdminFormManager.js +++ b/webapp/src/components/AdminFormManager.tsx @@ -1,24 +1,28 @@ -import React from 'react' -import AdminRsuTab from '../features/adminRsuTab/AdminRsuTab' -import AdminUserTab from '../features/adminUserTab/AdminUserTab' -import AdminOrganizationTab from '../features/adminOrganizationTab/AdminOrganizationTab' - -import '../features/adminRsuTab/Admin.css' - -const AdminFormManager = (props) => { - return ( -
- {(() => { - if (props.activeForm === 'add_rsu') { - return - } else if (props.activeForm === 'add_user') { - return - } else if (props.activeForm === 'add_organization') { - return - } - })()} -
- ) -} - -export default AdminFormManager +import React from 'react' +import AdminRsuTab from '../features/adminRsuTab/AdminRsuTab' +import AdminUserTab from '../features/adminUserTab/AdminUserTab' +import AdminOrganizationTab from '../features/adminOrganizationTab/AdminOrganizationTab' + +import '../features/adminRsuTab/Admin.css' + +interface AdminFormManagerProps { + activeForm: 'add_rsu' | 'add_user' | 'add_organization' +} + +const AdminFormManager = (props: AdminFormManagerProps) => { + return ( +
+ {(() => { + if (props.activeForm === 'add_rsu') { + return + } else if (props.activeForm === 'add_user') { + return + } else if (props.activeForm === 'add_organization') { + return + } + })()} +
+ ) +} + +export default AdminFormManager diff --git a/webapp/src/components/AdminOrganizationDeleteMenu.test.js b/webapp/src/components/AdminOrganizationDeleteMenu.test.ts similarity index 100% rename from webapp/src/components/AdminOrganizationDeleteMenu.test.js rename to webapp/src/components/AdminOrganizationDeleteMenu.test.ts diff --git a/webapp/src/components/AdminOrganizationDeleteMenu.js b/webapp/src/components/AdminOrganizationDeleteMenu.tsx similarity index 82% rename from webapp/src/components/AdminOrganizationDeleteMenu.js rename to webapp/src/components/AdminOrganizationDeleteMenu.tsx index 337a35d23..1fa3d6e01 100644 --- a/webapp/src/components/AdminOrganizationDeleteMenu.js +++ b/webapp/src/components/AdminOrganizationDeleteMenu.tsx @@ -1,35 +1,40 @@ -import React from 'react' -import { confirmAlert } from 'react-confirm-alert' -import DeleteIcon from '@mui/icons-material/Delete' -import 'react-confirm-alert/src/react-confirm-alert.css' -import { Options } from './AdminDeletionOptions' - -import '../features/adminRsuTab/Admin.css' - -const AdminOrganizationDeleteMenu = (props) => { - const handleDelete = () => { - const buttons = [ - { - label: 'Yes', - onClick: () => props.deleteOrganization(), - }, - { label: 'No', onClick: () => {} }, - ] - const alertOptions = Options( - 'Delete Organization', - 'Are you sure you want to delete the "' + props.selectedOrganization + '" organization?', - buttons - ) - confirmAlert(alertOptions) - } - - return ( -
- -
- ) -} - -export default AdminOrganizationDeleteMenu +import React from 'react' +import { confirmAlert } from 'react-confirm-alert' +import DeleteIcon from '@mui/icons-material/Delete' +import 'react-confirm-alert/src/react-confirm-alert.css' +import { Options } from './AdminDeletionOptions' + +import '../features/adminRsuTab/Admin.css' + +interface AdminOrganizationDeleteMenuProps { + selectedOrganization: string + deleteOrganization: () => void +} + +const AdminOrganizationDeleteMenu = (props: AdminOrganizationDeleteMenuProps) => { + const handleDelete = () => { + const buttons = [ + { + label: 'Yes', + onClick: () => props.deleteOrganization(), + }, + { label: 'No', onClick: () => {} }, + ] + const alertOptions = Options( + 'Delete Organization', + 'Are you sure you want to delete the "' + props.selectedOrganization + '" organization?', + buttons + ) + confirmAlert(alertOptions) + } + + return ( +
+ +
+ ) +} + +export default AdminOrganizationDeleteMenu diff --git a/webapp/src/components/AdminTable.test.js b/webapp/src/components/AdminTable.test.ts similarity index 100% rename from webapp/src/components/AdminTable.test.js rename to webapp/src/components/AdminTable.test.ts diff --git a/webapp/src/components/AdminTable.js b/webapp/src/components/AdminTable.tsx similarity index 96% rename from webapp/src/components/AdminTable.js rename to webapp/src/components/AdminTable.tsx index 8e55a497b..15b4bab4c 100644 --- a/webapp/src/components/AdminTable.js +++ b/webapp/src/components/AdminTable.tsx @@ -1,31 +1,31 @@ -import React from 'react' -import MaterialTable from '@material-table/core' -import { ThemeProvider } from '@mui/material' -import { theme } from '../styles' - -import '../features/adminRsuTab/Admin.css' - -const AdminTable = (props) => { - return ( -
- - - -
- ) -} -export default AdminTable +import React from 'react' +import MaterialTable from '@material-table/core' +import { ThemeProvider } from '@mui/material' +import { theme } from '../styles' + +import '../features/adminRsuTab/Admin.css' + +const AdminTable = (props) => { + return ( +
+ + + +
+ ) +} +export default AdminTable diff --git a/webapp/src/components/ConfigureItem.test.js b/webapp/src/components/ConfigureItem.test.ts similarity index 100% rename from webapp/src/components/ConfigureItem.test.js rename to webapp/src/components/ConfigureItem.test.ts diff --git a/webapp/src/components/ConfigureItem.js b/webapp/src/components/ConfigureItem.tsx similarity index 100% rename from webapp/src/components/ConfigureItem.js rename to webapp/src/components/ConfigureItem.tsx diff --git a/webapp/src/components/ConfigureRsu.test.js b/webapp/src/components/ConfigureRsu.test.ts similarity index 96% rename from webapp/src/components/ConfigureRsu.test.js rename to webapp/src/components/ConfigureRsu.test.ts index 80e7b7b58..0228a120b 100644 --- a/webapp/src/components/ConfigureRsu.test.js +++ b/webapp/src/components/ConfigureRsu.test.ts @@ -1,50 +1,50 @@ -import React from 'react' -import { render } from '@testing-library/react' -import ConfigureRsu from './ConfigureRsu' -import { Provider } from 'react-redux' -import { setupStore } from '../store' -import { replaceChaoticIds } from '../utils/test-utils' - -describe('ConfigureRsu component', () => { - it('should take a single RSU snapshot', () => { - const { container } = render( - - - - ) - - expect(replaceChaoticIds(container)).toMatchSnapshot() - }) - - it('should take a multi-RSU snapshot', () => { - const { container } = render( - - - - ) - - expect(replaceChaoticIds(container)).toMatchSnapshot() - }) -}) +import React from 'react' +import { render } from '@testing-library/react' +import ConfigureRsu from './ConfigureRsu' +import { Provider } from 'react-redux' +import { setupStore } from '../store' +import { replaceChaoticIds } from '../utils/test-utils' + +describe('ConfigureRsu component', () => { + it('should take a single RSU snapshot', () => { + const { container } = render( + + + + ) + + expect(replaceChaoticIds(container)).toMatchSnapshot() + }) + + it('should take a multi-RSU snapshot', () => { + const { container } = render( + + + + ) + + expect(replaceChaoticIds(container)).toMatchSnapshot() + }) +}) diff --git a/webapp/src/components/ConfigureRsu.js b/webapp/src/components/ConfigureRsu.tsx similarity index 96% rename from webapp/src/components/ConfigureRsu.js rename to webapp/src/components/ConfigureRsu.tsx index 80be11612..36989bb5f 100644 --- a/webapp/src/components/ConfigureRsu.js +++ b/webapp/src/components/ConfigureRsu.tsx @@ -1,194 +1,194 @@ -import { useState } from 'react' -import SnmpwalkMenu from './SnmpwalkMenu' -import SnmpsetMenu from './SnmpsetMenu' -import RsuRebootMenu from './RsuRebootMenu' -import Accordion from '@mui/material/Accordion' -import AccordionDetails from '@mui/material/AccordionDetails' -import AccordionSummary from '@mui/material/AccordionSummary' -import { useDispatch, useSelector } from 'react-redux' -import { ThemeProvider, createTheme } from '@mui/material' -import ExpandMoreIcon from '@mui/icons-material/ExpandMore' -import Typography from '@mui/material/Typography' -import { selectSelectedRsu, selectRsu } from '../generalSlices/rsuSlice' -import { clearConfig, selectConfigList } from '../generalSlices/configSlice' - -import './css/SnmpwalkMenu.css' - -const ConfigureRsu = () => { - const dispatch = useDispatch() - - const [expanded, setExpanded] = useState(false) - const handleChange = (panel) => (event, isExpanded) => { - setExpanded(isExpanded ? panel : false) - } - const selectedRsu = useSelector(selectSelectedRsu) - const selectedConfigList = useSelector(selectConfigList) - - return ( -
- {selectedRsu && ( -
-

Selected RSU Config

- -

- Roadway: {selectedRsu.properties.primary_route} -
- Milepost: {String(selectedRsu.properties.milepost)} -
- IPv4: {selectedRsu.properties.ipv4_address} -

-
- )} - - {selectedRsu && ( -
- - - } - aria-controls="panel1bh-content" - id="panel1bh-header" - > - Current Configuration - - - - - - - - - - - } - aria-controls="panel2bh-content" - id="panel2bh-header" - className="expand" - > - Message Forwarding - - - - - - - - - - - } - aria-controls="panel3bh-content" - id="panel3bh-header" - > - Reboot - - - - - - - - - - -
- )} - {selectedConfigList.length > 0 && !selectedRsu && ( -
-
-

Multiple RSU Config

- -
-

RSU IP List: {selectedConfigList.join(', ')}

-
- )} - {selectedConfigList.length > 0 && !selectedRsu && ( -
- - - } - aria-controls="panel2bh-content" - id="panel2bh-header" - className="expand" - > - Message Forwarding - - - - - - - - - - -
- )} -
- ) -} - -const accordionTheme = createTheme({ - palette: { - text: { - primary: '#ffffff', - secondary: '#ffffff', - disabled: '#ffffff', - hint: '#ffffff', - }, - divider: '#333', - background: { - paper: '#333', - }, - }, -}) -const innerAccordionTheme = createTheme({ - palette: { - text: { - primary: '#fff', - secondary: '#fff', - disabled: '#fff', - hint: '#fff', - }, - divider: '#333', - background: { - paper: '#333', - }, - }, -}) - -export default ConfigureRsu +import { useState } from 'react' +import SnmpwalkMenu from './SnmpwalkMenu' +import SnmpsetMenu from './SnmpsetMenu' +import RsuRebootMenu from './RsuRebootMenu' +import Accordion from '@mui/material/Accordion' +import AccordionDetails from '@mui/material/AccordionDetails' +import AccordionSummary from '@mui/material/AccordionSummary' +import { useDispatch, useSelector } from 'react-redux' +import { ThemeProvider, createTheme } from '@mui/material' +import ExpandMoreIcon from '@mui/icons-material/ExpandMore' +import Typography from '@mui/material/Typography' +import { selectSelectedRsu, selectRsu } from '../generalSlices/rsuSlice' +import { clearConfig, selectConfigList } from '../generalSlices/configSlice' + +import './css/SnmpwalkMenu.css' + +const ConfigureRsu = () => { + const dispatch: ThunkDispatch = useDispatch() + + const [expanded, setExpanded] = useState(false) + const handleChange = (panel) => (event, isExpanded) => { + setExpanded(isExpanded ? panel : false) + } + const selectedRsu = useSelector(selectSelectedRsu) + const selectedConfigList = useSelector(selectConfigList) + + return ( +
+ {selectedRsu && ( +
+

Selected RSU Config

+ +

+ Roadway: {selectedRsu.properties.primary_route} +
+ Milepost: {String(selectedRsu.properties.milepost)} +
+ IPv4: {selectedRsu.properties.ipv4_address} +

+
+ )} + + {selectedRsu && ( +
+ + + } + aria-controls="panel1bh-content" + id="panel1bh-header" + > + Current Configuration + + + + + + + + + + + } + aria-controls="panel2bh-content" + id="panel2bh-header" + className="expand" + > + Message Forwarding + + + + + + + + + + + } + aria-controls="panel3bh-content" + id="panel3bh-header" + > + Reboot + + + + + + + + + + +
+ )} + {selectedConfigList.length > 0 && !selectedRsu && ( +
+
+

Multiple RSU Config

+ +
+

RSU IP List: {selectedConfigList.join(', ')}

+
+ )} + {selectedConfigList.length > 0 && !selectedRsu && ( +
+ + + } + aria-controls="panel2bh-content" + id="panel2bh-header" + className="expand" + > + Message Forwarding + + + + + + + + + + +
+ )} +
+ ) +} + +const accordionTheme = createTheme({ + palette: { + text: { + primary: '#ffffff', + secondary: '#ffffff', + disabled: '#ffffff', + hint: '#ffffff', + }, + divider: '#333', + background: { + paper: '#333', + }, + }, +}) +const innerAccordionTheme = createTheme({ + palette: { + text: { + primary: '#fff', + secondary: '#fff', + disabled: '#fff', + hint: '#fff', + }, + divider: '#333', + background: { + paper: '#333', + }, + }, +}) + +export default ConfigureRsu diff --git a/webapp/src/components/ContactSupportMenu.test.js b/webapp/src/components/ContactSupportMenu.test.ts similarity index 97% rename from webapp/src/components/ContactSupportMenu.test.js rename to webapp/src/components/ContactSupportMenu.test.ts index 39cc66b45..aeec2fee5 100644 --- a/webapp/src/components/ContactSupportMenu.test.js +++ b/webapp/src/components/ContactSupportMenu.test.ts @@ -1,10 +1,10 @@ -import React from 'react' -import { render } from '@testing-library/react' -import ContactSupportMenu from './ContactSupportMenu' -import { replaceChaoticIds } from '../utils/test-utils' - -it('should take a snapshot', () => { - const { container } = render() - - expect(replaceChaoticIds(container)).toMatchSnapshot() +import React from 'react' +import { render } from '@testing-library/react' +import ContactSupportMenu from './ContactSupportMenu' +import { replaceChaoticIds } from '../utils/test-utils' + +it('should take a snapshot', () => { + const { container } = render() + + expect(replaceChaoticIds(container)).toMatchSnapshot() }) \ No newline at end of file diff --git a/webapp/src/components/ContactSupportMenu.js b/webapp/src/components/ContactSupportMenu.tsx similarity index 95% rename from webapp/src/components/ContactSupportMenu.js rename to webapp/src/components/ContactSupportMenu.tsx index a4ea91d11..aac9393ec 100644 --- a/webapp/src/components/ContactSupportMenu.js +++ b/webapp/src/components/ContactSupportMenu.tsx @@ -1,124 +1,124 @@ -import React, { useState } from 'react' -import { Form } from 'react-bootstrap' -import { useForm } from 'react-hook-form' - -import 'react-widgets/styles.css' -import RsuApi from '../apis/rsu-api' - -import './css/ContactSupportMenu.css' - -const ContactSupportMenu = () => { - const [hidden, setHidden] = useState(true) // hidden by default - const [successMsg, setSuccessMsg] = useState('') - const [errorState, setErrorState] = useState(false) - const [errorMessage, setErrorMessage] = useState('') - const { - register, - handleSubmit, - reset, - formState: { errors }, - } = useForm() - - const onSubmit = async (data) => { - try { - const res = await RsuApi.postContactSupport(data) - const status = res.status - if (status === 200) { - console.debug('Successfully sent email: ' + status) - setSuccessMsg('Successfully sent email') - setErrorState(false) - reset() - } else { - console.error('Something went wrong: ' + status) - setSuccessMsg('') - setErrorState(true) - setErrorMessage('Something went wrong, please try again later') - } - } catch (exception_var) { - console.error(exception_var) - setSuccessMsg('') - setErrorState(true) - setErrorMessage('An exception occurred, please try again later') - } - } - - if (hidden) { - return ( -
- -
- ) - } - - return ( -
-
-
Contact Support
- - Your Email - - {errors.email && {errors.email.message}} - - - Subject - - {errors.subject && {errors.subject.message}} - - - Message - - {errors.message && {errors.message.message}} - - - {successMsg &&

{successMsg}

} - {errorState &&

Error: {errorMessage}

} -
- - -
-
- -
-
-
- ) -} - -export default ContactSupportMenu +import React, { useState } from 'react' +import { Form } from 'react-bootstrap' +import { useForm } from 'react-hook-form' + +import 'react-widgets/styles.css' +import RsuApi from '../apis/rsu-api' + +import './css/ContactSupportMenu.css' + +const ContactSupportMenu = () => { + const [hidden, setHidden] = useState(true) // hidden by default + const [successMsg, setSuccessMsg] = useState('') + const [errorState, setErrorState] = useState(false) + const [errorMessage, setErrorMessage] = useState('') + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm() + + const onSubmit = async (data: Object) => { + try { + const res = await RsuApi.postContactSupport(data) + const status = res.status + if (status === 200) { + console.debug('Successfully sent email: ' + status) + setSuccessMsg('Successfully sent email') + setErrorState(false) + reset() + } else { + console.error('Something went wrong: ' + status) + setSuccessMsg('') + setErrorState(true) + setErrorMessage('Something went wrong, please try again later') + } + } catch (exception_var) { + console.error(exception_var) + setSuccessMsg('') + setErrorState(true) + setErrorMessage('An exception occurred, please try again later') + } + } + + if (hidden) { + return ( +
+ +
+ ) + } + + return ( +
+
+
Contact Support
+ + Your Email + + {errors.email && {errors.email.message}} + + + Subject + + {errors.subject && {errors.subject.message}} + + + Message + + {errors.message && {errors.message.message}} + + + {successMsg &&

{successMsg}

} + {errorState &&

Error: {errorMessage}

} +
+ + +
+
+ +
+
+
+ ) +} + +export default ContactSupportMenu diff --git a/webapp/src/components/Header.test.js b/webapp/src/components/Header.test.ts similarity index 97% rename from webapp/src/components/Header.test.js rename to webapp/src/components/Header.test.ts index 5e196c67a..c9dfe0598 100644 --- a/webapp/src/components/Header.test.js +++ b/webapp/src/components/Header.test.ts @@ -35,7 +35,7 @@ describe('
', () => { user: { value: { loginFailure: true, - atuhLoginData: { + authLoginData: { data: { organizations: [{ name: 'org1', role: 'role1' }], }, diff --git a/webapp/src/components/Header.js b/webapp/src/components/Header.tsx similarity index 98% rename from webapp/src/components/Header.js rename to webapp/src/components/Header.tsx index ba54582d4..9945936eb 100644 --- a/webapp/src/components/Header.js +++ b/webapp/src/components/Header.tsx @@ -24,7 +24,7 @@ import './css/Header.css' import ContactSupportMenu from './ContactSupportMenu' const Header = () => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const { keycloak } = useKeycloak() const authLoginData = useSelector(selectAuthLoginData) diff --git a/webapp/src/components/Help.test.js b/webapp/src/components/Help.test.ts similarity index 100% rename from webapp/src/components/Help.test.js rename to webapp/src/components/Help.test.ts diff --git a/webapp/src/components/Help.js b/webapp/src/components/Help.tsx similarity index 100% rename from webapp/src/components/Help.js rename to webapp/src/components/Help.tsx diff --git a/webapp/src/components/RsuMarker.test.js b/webapp/src/components/RsuMarker.test.ts similarity index 100% rename from webapp/src/components/RsuMarker.test.js rename to webapp/src/components/RsuMarker.test.ts diff --git a/webapp/src/components/RsuMarker.js b/webapp/src/components/RsuMarker.tsx similarity index 96% rename from webapp/src/components/RsuMarker.js rename to webapp/src/components/RsuMarker.tsx index ba0ebad65..e5edd8fac 100644 --- a/webapp/src/components/RsuMarker.js +++ b/webapp/src/components/RsuMarker.tsx @@ -1,28 +1,28 @@ -import React from 'react' - -function RsuMarker(props) { - var circleStyle = { - padding: 5, - display: 'inline-block', - borderRadius: '50%', - width: 5, - height: 5, - } - - if (props.displayType === 'online') { - if (props.onlineStatus === 'online') circleStyle.backgroundColor = '#A1D363' - else if (props.onlineStatus === 'unstable') circleStyle.backgroundColor = '#D1A711' - else if (props.onlineStatus === 'offline') circleStyle.backgroundColor = '#E94F37' - else circleStyle.backgroundColor = '#B0B0B0' - } else if (props.displayType === 'scms') { - if (props.scmsStatus === '1') circleStyle.backgroundColor = '#A1D363' - else if (props.scmsStatus === '0') circleStyle.backgroundColor = '#E94F37' - else circleStyle.backgroundColor = '#B0B0B0' - } else { - circleStyle.backgroundColor = '#B0B0B0' - } - - return
-} - -export default RsuMarker +import React from 'react' + +function RsuMarker(props) { + var circleStyle = { + padding: 5, + display: 'inline-block', + borderRadius: '50%', + width: 5, + height: 5, + } + + if (props.displayType === 'online') { + if (props.onlineStatus === 'online') circleStyle.backgroundColor = '#A1D363' + else if (props.onlineStatus === 'unstable') circleStyle.backgroundColor = '#D1A711' + else if (props.onlineStatus === 'offline') circleStyle.backgroundColor = '#E94F37' + else circleStyle.backgroundColor = '#B0B0B0' + } else if (props.displayType === 'scms') { + if (props.scmsStatus === '1') circleStyle.backgroundColor = '#A1D363' + else if (props.scmsStatus === '0') circleStyle.backgroundColor = '#E94F37' + else circleStyle.backgroundColor = '#B0B0B0' + } else { + circleStyle.backgroundColor = '#B0B0B0' + } + + return
+} + +export default RsuMarker diff --git a/webapp/src/components/RsuRebootMenu.test.js b/webapp/src/components/RsuRebootMenu.test.ts similarity index 100% rename from webapp/src/components/RsuRebootMenu.test.js rename to webapp/src/components/RsuRebootMenu.test.ts diff --git a/webapp/src/components/RsuRebootMenu.js b/webapp/src/components/RsuRebootMenu.tsx similarity index 94% rename from webapp/src/components/RsuRebootMenu.js rename to webapp/src/components/RsuRebootMenu.tsx index 60adc45f8..6e34c1b0d 100644 --- a/webapp/src/components/RsuRebootMenu.js +++ b/webapp/src/components/RsuRebootMenu.tsx @@ -1,66 +1,66 @@ -import React from 'react' -import { confirmAlert } from 'react-confirm-alert' -import 'react-confirm-alert/src/react-confirm-alert.css' -import { useDispatch, useSelector } from 'react-redux' - -import { - selectRebootChangeSuccess, - - // Actions - rebootRsu, -} from '../generalSlices/configSlice' - -import { selectRsuIpv4 } from '../generalSlices/rsuSlice' - -import './css/SnmpwalkMenu.css' - -const RsuRebootMenu = () => { - const dispatch = useDispatch() - const changeSuccess = useSelector(selectRebootChangeSuccess) - - const rsuIp = useSelector(selectRsuIpv4) - - const options = { - title: 'RSU Reboot', - message: 'Are you sure you want to perform a reboot?', - buttons: [ - { - label: 'Yes', - onClick: () => dispatch(rebootRsu([rsuIp])), - }, - { - label: 'No', - onClick: () => {}, - }, - ], - childrenElement: () =>
, - closeOnEscape: true, - closeOnClickOutside: true, - keyCodeForClose: [8, 32], - willUnmount: () => {}, - afterClose: () => {}, - onClickOutside: () => {}, - onKeypressEscape: () => {}, - } - - return ( -
-

Administrator Reboot

- - - - {changeSuccess ? ( -
-

Successful reboot, the RSU will now be offline for a brief time

-

Warning: This action could result in taking the RSU offline

-
- ) : ( -

Warning: This action could result in taking the RSU offline

- )} -
- ) -} - -export default RsuRebootMenu +import React from 'react' +import { confirmAlert } from 'react-confirm-alert' +import 'react-confirm-alert/src/react-confirm-alert.css' +import { useDispatch, useSelector } from 'react-redux' + +import { + selectRebootChangeSuccess, + + // Actions + rebootRsu, +} from '../generalSlices/configSlice' + +import { selectRsuIpv4 } from '../generalSlices/rsuSlice' + +import './css/SnmpwalkMenu.css' + +const RsuRebootMenu = () => { + const dispatch: ThunkDispatch = useDispatch() + const changeSuccess = useSelector(selectRebootChangeSuccess) + + const rsuIp = useSelector(selectRsuIpv4) + + const options = { + title: 'RSU Reboot', + message: 'Are you sure you want to perform a reboot?', + buttons: [ + { + label: 'Yes', + onClick: () => dispatch(rebootRsu([rsuIp])), + }, + { + label: 'No', + onClick: () => {}, + }, + ], + childrenElement: () =>
, + closeOnEscape: true, + closeOnClickOutside: true, + keyCodeForClose: [8, 32], + willUnmount: () => {}, + afterClose: () => {}, + onClickOutside: () => {}, + onKeypressEscape: () => {}, + } + + return ( +
+

Administrator Reboot

+ + + + {changeSuccess ? ( +
+

Successful reboot, the RSU will now be offline for a brief time

+

Warning: This action could result in taking the RSU offline

+
+ ) : ( +

Warning: This action could result in taking the RSU offline

+ )} +
+ ) +} + +export default RsuRebootMenu diff --git a/webapp/src/components/RsuUpdateItem.test.js b/webapp/src/components/RsuUpdateItem.test.ts similarity index 100% rename from webapp/src/components/RsuUpdateItem.test.js rename to webapp/src/components/RsuUpdateItem.test.ts diff --git a/webapp/src/components/RsuUpdateItem.js b/webapp/src/components/RsuUpdateItem.tsx similarity index 100% rename from webapp/src/components/RsuUpdateItem.js rename to webapp/src/components/RsuUpdateItem.tsx diff --git a/webapp/src/components/SnmpsetMenu.test.js b/webapp/src/components/SnmpsetMenu.test.ts similarity index 100% rename from webapp/src/components/SnmpsetMenu.test.js rename to webapp/src/components/SnmpsetMenu.test.ts diff --git a/webapp/src/components/SnmpsetMenu.js b/webapp/src/components/SnmpsetMenu.tsx similarity index 95% rename from webapp/src/components/SnmpsetMenu.js rename to webapp/src/components/SnmpsetMenu.tsx index 49f50781d..a2edec0d9 100644 --- a/webapp/src/components/SnmpsetMenu.js +++ b/webapp/src/components/SnmpsetMenu.tsx @@ -1,136 +1,136 @@ -import React from 'react' -import { useDispatch, useSelector } from 'react-redux' - -import { - selectChangeSuccess, - selectErrorState, - selectDestIp, - selectSnmpMsgType, - selectSnmpFilterMsg, - selectSnmpFilterErr, - - // Actions - submitSnmpSet, - deleteSnmpSet, - filterSnmp, - setDestIp, - setMsgType, -} from '../generalSlices/configSlice' - -import { selectRsuIpv4, selectRsuManufacturer } from '../generalSlices/rsuSlice' - -import './css/SnmpwalkMenu.css' - -const SnmpsetMenu = ({ type, rsuIpList }) => { - const dispatch = useDispatch() - - const changeSuccess = useSelector(selectChangeSuccess) - const errorState = useSelector(selectErrorState) - const destIp = useSelector(selectDestIp) - const snmpMsgType = useSelector(selectSnmpMsgType) - const snmpFilterMsg = useSelector(selectSnmpFilterMsg) - const snmpFilterErr = useSelector(selectSnmpFilterErr) - - const rsuIp = useSelector(selectRsuIpv4) - const rsuManufacturer = useSelector(selectRsuManufacturer) - - return ( -
-

Message Forwarding

-
- - -
- - - {type !== 'single_rsu' && ( - - )} - - {changeSuccess ? ( -
-

Successful write to RSU

-
- ) : ( -

- )} - {errorState !== '' ?

{errorState}

:
} - - {type !== 'single_rsu' ? ( -
-

- By specifying a destination IP address along with a message type, you can add message forwarding to any of - the selected RSUs or delete message forwarding from any RSUs that already have that configuration. -

-
- ) : ( -
- )} - - {rsuManufacturer === 'Yunex' ? ( -
-

- Yunex RSUs use different SNMP tables for message TX and RX forwarding.
BSM and SSM are on the RX - table. MAP, SPaT and SRM are on the TX table.
Start over from the 1 index for each table. -

-
- ) : ( -
- )} - - {rsuManufacturer === 'Commsignia' ? ( -
-

- If you are configuring SPaT or MAP forwarding, apply the TX message
filter after your configuration - has been applied -

- - {snmpFilterMsg !== '' ? ( -
- {snmpFilterErr === true ? ( -

{snmpFilterMsg}

- ) : ( -

{snmpFilterMsg}

- )} -
- ) : ( -
- )} -
- ) : ( -
- )} -
- ) -} - -export default SnmpsetMenu +import React from 'react' +import { useDispatch, useSelector } from 'react-redux' + +import { + selectChangeSuccess, + selectErrorState, + selectDestIp, + selectSnmpMsgType, + selectSnmpFilterMsg, + selectSnmpFilterErr, + + // Actions + submitSnmpSet, + deleteSnmpSet, + filterSnmp, + setDestIp, + setMsgType, +} from '../generalSlices/configSlice' + +import { selectRsuIpv4, selectRsuManufacturer } from '../generalSlices/rsuSlice' + +import './css/SnmpwalkMenu.css' + +const SnmpsetMenu = ({ type, rsuIpList }) => { + const dispatch: ThunkDispatch = useDispatch() + + const changeSuccess = useSelector(selectChangeSuccess) + const errorState = useSelector(selectErrorState) + const destIp = useSelector(selectDestIp) + const snmpMsgType = useSelector(selectSnmpMsgType) + const snmpFilterMsg = useSelector(selectSnmpFilterMsg) + const snmpFilterErr = useSelector(selectSnmpFilterErr) + + const rsuIp = useSelector(selectRsuIpv4) + const rsuManufacturer = useSelector(selectRsuManufacturer) + + return ( +
+

Message Forwarding

+
+ + +
+ + + {type !== 'single_rsu' && ( + + )} + + {changeSuccess ? ( +
+

Successful write to RSU

+
+ ) : ( +

+ )} + {errorState !== '' ?

{errorState}

:
} + + {type !== 'single_rsu' ? ( +
+

+ By specifying a destination IP address along with a message type, you can add message forwarding to any of + the selected RSUs or delete message forwarding from any RSUs that already have that configuration. +

+
+ ) : ( +
+ )} + + {rsuManufacturer === 'Yunex' ? ( +
+

+ Yunex RSUs use different SNMP tables for message TX and RX forwarding.
BSM and SSM are on the RX + table. MAP, SPaT and SRM are on the TX table.
Start over from the 1 index for each table. +

+
+ ) : ( +
+ )} + + {rsuManufacturer === 'Commsignia' ? ( +
+

+ If you are configuring SPaT or MAP forwarding, apply the TX message
filter after your configuration + has been applied +

+ + {snmpFilterMsg !== '' ? ( +
+ {snmpFilterErr === true ? ( +

{snmpFilterMsg}

+ ) : ( +

{snmpFilterMsg}

+ )} +
+ ) : ( +
+ )} +
+ ) : ( +
+ )} +
+ ) +} + +export default SnmpsetMenu diff --git a/webapp/src/components/SnmpwalkItem.test.js b/webapp/src/components/SnmpwalkItem.test.ts similarity index 100% rename from webapp/src/components/SnmpwalkItem.test.js rename to webapp/src/components/SnmpwalkItem.test.ts diff --git a/webapp/src/components/SnmpwalkItem.js b/webapp/src/components/SnmpwalkItem.tsx similarity index 96% rename from webapp/src/components/SnmpwalkItem.js rename to webapp/src/components/SnmpwalkItem.tsx index 6ace40d96..fe558207a 100644 --- a/webapp/src/components/SnmpwalkItem.js +++ b/webapp/src/components/SnmpwalkItem.tsx @@ -1,34 +1,34 @@ -import React from 'react' - -import './css/SnmpItem.css' - -const SnmpwalkItem = (props) => { - return ( -
-

{props.index}

-

- Message Type: {props.content['Message Type']} -

-

- Destination IP: {props.content['IP']} -

-

- Port: {props.content['Port']} -

-

- Protocol: {props.content['Protocol']} -

-

- Start: {props.content['Start DateTime']} -

-

- End: {props.content['End DateTime']} -

-

- Active: {props.content['Config Active']} -

-
- ) -} - -export default SnmpwalkItem +import React from 'react' + +import './css/SnmpItem.css' + +const SnmpwalkItem = (props) => { + return ( +
+

{props.index}

+

+ Message Type: {props.content['Message Type']} +

+

+ Destination IP: {props.content['IP']} +

+

+ Port: {props.content['Port']} +

+

+ Protocol: {props.content['Protocol']} +

+

+ Start: {props.content['Start DateTime']} +

+

+ End: {props.content['End DateTime']} +

+

+ Active: {props.content['Config Active']} +

+
+ ) +} + +export default SnmpwalkItem diff --git a/webapp/src/components/SnmpwalkMenu.test.js b/webapp/src/components/SnmpwalkMenu.test.ts similarity index 100% rename from webapp/src/components/SnmpwalkMenu.test.js rename to webapp/src/components/SnmpwalkMenu.test.ts diff --git a/webapp/src/components/SnmpwalkMenu.js b/webapp/src/components/SnmpwalkMenu.tsx similarity index 96% rename from webapp/src/components/SnmpwalkMenu.js rename to webapp/src/components/SnmpwalkMenu.tsx index 60bc27d4e..6177c11b9 100644 --- a/webapp/src/components/SnmpwalkMenu.js +++ b/webapp/src/components/SnmpwalkMenu.tsx @@ -1,198 +1,198 @@ -import React, { useEffect } from 'react' -import SnmpwalkItem from './SnmpwalkItem' -import { useSelector, useDispatch } from 'react-redux' -import { confirmAlert } from 'react-confirm-alert' -import { Options } from './AdminDeletionOptions' -import { selectRsuManufacturer, selectRsuIpv4 } from '../generalSlices/rsuSlice' -import { - selectMsgFwdConfig, - selectErrorState, - - // Actions - refreshSnmpFwdConfig, -} from '../generalSlices/configSlice' -import Button from '@mui/material/Button' -import DeleteIcon from '@mui/icons-material/Delete' -import RefreshIcon from '@mui/icons-material/Refresh' -import './css/SnmpwalkMenu.css' -import { - // Actions - deleteSnmpSet, -} from '../generalSlices/configSlice' -import { IconButton, ThemeProvider, Tooltip, createTheme } from '@mui/material' - -const SnmpwalkMenu = () => { - const dispatch = useDispatch() - - const msgFwdConfig = useSelector(selectMsgFwdConfig) - const errorState = useSelector(selectErrorState) - - const rsuIp = useSelector(selectRsuIpv4) - const rsuManufacturer = useSelector(selectRsuManufacturer) - - useEffect(() => { - // Refresh Data - dispatch(refreshSnmpFwdConfig([rsuIp])) - }, [rsuIp, dispatch]) - - const handleDelete = (msgType, ip) => { - const buttons = [ - { - label: 'Yes', - onClick: () => { - dispatch( - deleteSnmpSet({ - ipList: [rsuIp], - snmpMsgType: msgType, - destIp: ip, - }) - ) - }, - }, - { - label: 'No', - onClick: () => {}, - }, - ] - const alertOptions = Options( - 'Delete SNMP Configuration', - `Are you sure you want to delete SNMP forwarding for ${msgType} messages to the IP: ${ip}? `, - buttons - ) - - confirmAlert(alertOptions) - } - - return ( -
- -
-

Message Forwarding

- - { - dispatch(refreshSnmpFwdConfig([rsuIp])) - }} - > - - - -
- {rsuManufacturer === 'Yunex' ? ( -
- {Object.hasOwn(msgFwdConfig, 'rsuXmitMsgFwdingTable') && - Object.hasOwn(msgFwdConfig, 'rsuReceivedMsgTable') ? ( -
-

TX Forward Table

- {Object.keys(msgFwdConfig.rsuXmitMsgFwdingTable).map((index) => ( -
- - -
- ))} -

RX Forward Table

- {Object.keys(msgFwdConfig.rsuReceivedMsgTable).map((index) => ( -
- - -
- ))} -
- ) : null} -
- ) : ( -
- {Object.keys(msgFwdConfig).map((index) => ( -
- - -
- ))} -
- )} - {errorState !== '' ?

{errorState}

:
} - -
- ) -} - -const theme = createTheme({ - palette: { - primary: { - main: '#d16d15', - light: '#0e2052', - contrastTextColor: '#0e2052', - }, - secondary: { - main: '#d16d15', - light: '#0e2052', - contrastTextColor: '#0e2052', - }, - text: { - primary: '#ffffff', - secondary: '#ffffff', - disabled: '#ffffff', - hint: '#ffffff', - }, - action: { - disabledBackground: 'rgba(209, 109, 21, 0.2)', - disabled: '#ffffff', - }, - }, - components: { - MuiSvgIcon: { - styleOverrides: { - root: { - color: '#d16d15', - }, - }, - }, - }, - typography: { - allVariants: { - color: '#ffffff', - }, - button: { - textTransform: 'none', - }, - }, -}) - -export default SnmpwalkMenu +import React, { useEffect } from 'react' +import SnmpwalkItem from './SnmpwalkItem' +import { useSelector, useDispatch } from 'react-redux' +import { confirmAlert } from 'react-confirm-alert' +import { Options } from './AdminDeletionOptions' +import { selectRsuManufacturer, selectRsuIpv4 } from '../generalSlices/rsuSlice' +import { + selectMsgFwdConfig, + selectErrorState, + + // Actions + refreshSnmpFwdConfig, +} from '../generalSlices/configSlice' +import Button from '@mui/material/Button' +import DeleteIcon from '@mui/icons-material/Delete' +import RefreshIcon from '@mui/icons-material/Refresh' +import './css/SnmpwalkMenu.css' +import { + // Actions + deleteSnmpSet, +} from '../generalSlices/configSlice' +import { IconButton, ThemeProvider, Tooltip, createTheme } from '@mui/material' + +const SnmpwalkMenu = () => { + const dispatch: ThunkDispatch = useDispatch() + + const msgFwdConfig = useSelector(selectMsgFwdConfig) + const errorState = useSelector(selectErrorState) + + const rsuIp = useSelector(selectRsuIpv4) + const rsuManufacturer = useSelector(selectRsuManufacturer) + + useEffect(() => { + // Refresh Data + dispatch(refreshSnmpFwdConfig([rsuIp])) + }, [rsuIp, dispatch]) + + const handleDelete = (msgType, ip) => { + const buttons = [ + { + label: 'Yes', + onClick: () => { + dispatch( + deleteSnmpSet({ + ipList: [rsuIp], + snmpMsgType: msgType, + destIp: ip, + }) + ) + }, + }, + { + label: 'No', + onClick: () => {}, + }, + ] + const alertOptions = Options( + 'Delete SNMP Configuration', + `Are you sure you want to delete SNMP forwarding for ${msgType} messages to the IP: ${ip}? `, + buttons + ) + + confirmAlert(alertOptions) + } + + return ( +
+ +
+

Message Forwarding

+ + { + dispatch(refreshSnmpFwdConfig([rsuIp])) + }} + > + + + +
+ {rsuManufacturer === 'Yunex' ? ( +
+ {Object.hasOwn(msgFwdConfig, 'rsuXmitMsgFwdingTable') && + Object.hasOwn(msgFwdConfig, 'rsuReceivedMsgTable') ? ( +
+

TX Forward Table

+ {Object.keys(msgFwdConfig.rsuXmitMsgFwdingTable).map((index) => ( +
+ + +
+ ))} +

RX Forward Table

+ {Object.keys(msgFwdConfig.rsuReceivedMsgTable).map((index) => ( +
+ + +
+ ))} +
+ ) : null} +
+ ) : ( +
+ {Object.keys(msgFwdConfig).map((index) => ( +
+ + +
+ ))} +
+ )} + {errorState !== '' ?

{errorState}

:
} + +
+ ) +} + +const theme = createTheme({ + palette: { + primary: { + main: '#d16d15', + light: '#0e2052', + contrastTextColor: '#0e2052', + }, + secondary: { + main: '#d16d15', + light: '#0e2052', + contrastTextColor: '#0e2052', + }, + text: { + primary: '#ffffff', + secondary: '#ffffff', + disabled: '#ffffff', + hint: '#ffffff', + }, + action: { + disabledBackground: 'rgba(209, 109, 21, 0.2)', + disabled: '#ffffff', + }, + }, + components: { + MuiSvgIcon: { + styleOverrides: { + root: { + color: '#d16d15', + }, + }, + }, + }, + typography: { + allVariants: { + color: '#ffffff', + }, + button: { + textTransform: 'none', + }, + }, +}) + +export default SnmpwalkMenu diff --git a/webapp/src/components/SsmSrmItem.test.js b/webapp/src/components/SsmSrmItem.test.ts similarity index 100% rename from webapp/src/components/SsmSrmItem.test.js rename to webapp/src/components/SsmSrmItem.test.ts diff --git a/webapp/src/components/SsmSrmItem.js b/webapp/src/components/SsmSrmItem.tsx similarity index 100% rename from webapp/src/components/SsmSrmItem.js rename to webapp/src/components/SsmSrmItem.tsx diff --git a/webapp/src/components/Tab.test.js b/webapp/src/components/Tab.test.ts similarity index 100% rename from webapp/src/components/Tab.test.js rename to webapp/src/components/Tab.test.ts diff --git a/webapp/src/components/Tab.js b/webapp/src/components/Tab.tsx similarity index 95% rename from webapp/src/components/Tab.js rename to webapp/src/components/Tab.tsx index 9039e4729..94de896d2 100644 --- a/webapp/src/components/Tab.js +++ b/webapp/src/components/Tab.tsx @@ -1,25 +1,25 @@ -import React from 'react' -import PropTypes from 'prop-types' - -const Tab = (props) => { - const { onClick, activeTab, label } = props - let className = 'tab-list-item' - - if (activeTab === label) { - className += ' tab-list-active' - } - - return ( -
  • onClick(label)}> - {label} -
  • - ) -} - -Tab.propTypes = { - activeTab: PropTypes.string.isRequired, - label: PropTypes.string.isRequired, - onClick: PropTypes.func.isRequired, -} - -export default Tab +import React from 'react' +import PropTypes from 'prop-types' + +const Tab = (props) => { + const { onClick, activeTab, label } = props + let className = 'tab-list-item' + + if (activeTab === label) { + className += ' tab-list-active' + } + + return ( +
  • onClick(label)}> + {label} +
  • + ) +} + +Tab.propTypes = { + activeTab: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + onClick: PropTypes.func.isRequired, +} + +export default Tab diff --git a/webapp/src/components/Tabs.test.js b/webapp/src/components/Tabs.test.ts similarity index 100% rename from webapp/src/components/Tabs.test.js rename to webapp/src/components/Tabs.test.ts diff --git a/webapp/src/components/Tabs.js b/webapp/src/components/Tabs.tsx similarity index 95% rename from webapp/src/components/Tabs.js rename to webapp/src/components/Tabs.tsx index 76fed84e4..e9e2dfad3 100644 --- a/webapp/src/components/Tabs.js +++ b/webapp/src/components/Tabs.tsx @@ -1,52 +1,52 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import Tab from './Tab' - -class Tabs extends Component { - static propTypes = { - children: PropTypes.instanceOf(Array).isRequired, - } - - constructor(props) { - super(props) - - this.state = { - activeTab: this.props.children[0].props.label, - } - } - - onClickTabItem = (tab) => { - this.setState({ activeTab: tab }) - } - - render() { - const { - onClickTabItem, - props: { children }, - state: { activeTab }, - } = this - - return ( -
    -
      - {children.map((child) => { - const label = child?.props?.label - if (label !== undefined) { - return - } else { - return null - } - })} -
    -
    - {children.map((child) => { - if (child?.props?.label !== activeTab) return undefined - return child.props.children - })} -
    -
    - ) - } -} - -export default Tabs +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import Tab from './Tab' + +class Tabs extends Component { + static propTypes = { + children: PropTypes.instanceOf(Array).isRequired, + } + + constructor(props) { + super(props) + + this.state = { + activeTab: this.props.children[0].props.label, + } + } + + onClickTabItem = (tab) => { + this.setState({ activeTab: tab }) + } + + render() { + const { + onClickTabItem, + props: { children }, + state: { activeTab }, + } = this + + return ( +
    +
      + {children.map((child) => { + const label = child?.props?.label + if (label !== undefined) { + return + } else { + return null + } + })} +
    +
    + {children.map((child) => { + if (child?.props?.label !== activeTab) return undefined + return child.props.children + })} +
    +
    + ) + } +} + +export default Tabs diff --git a/webapp/src/constants.js b/webapp/src/constants.tsx similarity index 100% rename from webapp/src/constants.js rename to webapp/src/constants.tsx diff --git a/webapp/src/features/adminAddOrganization/AdminAddOrganization.test.js b/webapp/src/features/adminAddOrganization/AdminAddOrganization.test.ts similarity index 100% rename from webapp/src/features/adminAddOrganization/AdminAddOrganization.test.js rename to webapp/src/features/adminAddOrganization/AdminAddOrganization.test.ts diff --git a/webapp/src/features/adminAddOrganization/AdminAddOrganization.js b/webapp/src/features/adminAddOrganization/AdminAddOrganization.tsx similarity index 95% rename from webapp/src/features/adminAddOrganization/AdminAddOrganization.js rename to webapp/src/features/adminAddOrganization/AdminAddOrganization.tsx index 8b67b03ec..88b753090 100644 --- a/webapp/src/features/adminAddOrganization/AdminAddOrganization.js +++ b/webapp/src/features/adminAddOrganization/AdminAddOrganization.tsx @@ -15,7 +15,7 @@ import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' const AdminAddOrganization = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const successMsg = useSelector(selectSuccessMsg) const errorState = useSelector(selectErrorState) const errorMsg = useSelector(selectErrorMsg) diff --git a/webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.test.js b/webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.test.ts similarity index 100% rename from webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.test.js rename to webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.test.ts diff --git a/webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.js b/webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.tsx similarity index 83% rename from webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.js rename to webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.tsx index da45aec08..a10243cad 100644 --- a/webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.js +++ b/webapp/src/features/adminAddOrganization/adminAddOrganizationSlice.tsx @@ -13,7 +13,7 @@ export const addOrg = createAsyncThunk( 'adminAddOrganization/addOrg', async (payload, { getState, dispatch }) => { const { json, reset, updateOrgData } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._postData({ @@ -75,9 +75,9 @@ export const adminAddOrganizationSlice = createSlice({ export const { setSuccessMsg } = adminAddOrganizationSlice.actions -export const selectLoading = (state) => state.adminAddOrganization.loading -export const selectSuccessMsg = (state) => state.adminAddOrganization.value.successMsg -export const selectErrorState = (state) => state.adminAddOrganization.value.errorState -export const selectErrorMsg = (state) => state.adminAddOrganization.value.errorMsg +export const selectLoading = (state: RootState) => state.adminAddOrganization.loading +export const selectSuccessMsg = (state: RootState) => state.adminAddOrganization.value.successMsg +export const selectErrorState = (state: RootState) => state.adminAddOrganization.value.errorState +export const selectErrorMsg = (state: RootState) => state.adminAddOrganization.value.errorMsg export default adminAddOrganizationSlice.reducer diff --git a/webapp/src/features/adminAddRsu/AdminAddRsu.test.js b/webapp/src/features/adminAddRsu/AdminAddRsu.test.ts similarity index 100% rename from webapp/src/features/adminAddRsu/AdminAddRsu.test.js rename to webapp/src/features/adminAddRsu/AdminAddRsu.test.ts diff --git a/webapp/src/features/adminAddRsu/AdminAddRsu.js b/webapp/src/features/adminAddRsu/AdminAddRsu.tsx similarity index 99% rename from webapp/src/features/adminAddRsu/AdminAddRsu.js rename to webapp/src/features/adminAddRsu/AdminAddRsu.tsx index 3255b76f0..b8d06b6b6 100644 --- a/webapp/src/features/adminAddRsu/AdminAddRsu.js +++ b/webapp/src/features/adminAddRsu/AdminAddRsu.tsx @@ -36,7 +36,7 @@ import { useSelector, useDispatch } from 'react-redux' import '../adminRsuTab/Admin.css' const AdminAddRsu = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const successMsg = useSelector(selectSuccessMsg) const errorState = useSelector(selectErrorState) diff --git a/webapp/src/features/adminAddRsu/adminAddRsuSlice.test.js b/webapp/src/features/adminAddRsu/adminAddRsuSlice.test.ts similarity index 100% rename from webapp/src/features/adminAddRsu/adminAddRsuSlice.test.js rename to webapp/src/features/adminAddRsu/adminAddRsuSlice.test.ts diff --git a/webapp/src/features/adminAddRsu/adminAddRsuSlice.js b/webapp/src/features/adminAddRsu/adminAddRsuSlice.tsx similarity index 79% rename from webapp/src/features/adminAddRsu/adminAddRsuSlice.js rename to webapp/src/features/adminAddRsu/adminAddRsuSlice.tsx index b876cfa21..6edd1c81a 100644 --- a/webapp/src/features/adminAddRsu/adminAddRsuSlice.js +++ b/webapp/src/features/adminAddRsu/adminAddRsuSlice.tsx @@ -81,7 +81,7 @@ export const updateApiJson = (apiJson) => { } } -export const checkForm = (state) => { +export const checkForm = (state: RootState) => { if (state.value.selectedRoute === 'Select Route') { return false } else if (state.value.selectedModel === 'Select RSU Model') { @@ -130,7 +130,7 @@ export const updateJson = (data, state) => { export const getRsuCreationData = createAsyncThunk( 'adminAddRsu/getRsuCreationData', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._getData({ @@ -147,7 +147,7 @@ export const createRsu = createAsyncThunk( 'adminAddRsu/createRsu', async (payload, { getState, dispatch }) => { const { json, reset } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._postData({ @@ -172,7 +172,7 @@ export const createRsu = createAsyncThunk( export const submitForm = createAsyncThunk('adminAddRsu/submitForm', async (payload, { getState, dispatch }) => { const { data, reset } = payload - const currentState = getState() + const currentState = getState() as RootState if (checkForm(currentState.adminAddRsu)) { let json = updateJson(data, currentState.adminAddRsu) dispatch(createRsu({ json, reset })) @@ -275,25 +275,27 @@ export const { updateSelectedOrganizations, } = adminAddRsuSlice.actions -export const selectApiData = (state) => state.adminAddRsu.value.apiData -export const selectPrimaryRoutes = (state) => state.adminAddRsu.value.apiData?.primary_routes ?? [] -export const selectRsuModels = (state) => state.adminAddRsu.value.apiData?.rsu_models ?? [] -export const selectSshCredentialGroups = (state) => state.adminAddRsu.value.apiData?.ssh_credential_groups ?? [] -export const selectSnmpCredentialGroups = (state) => state.adminAddRsu.value.apiData?.snmp_credential_groups ?? [] -export const selectSnmpVersions = (state) => state.adminAddRsu.value.apiData?.snmp_version_groups ?? [] -export const selectOrganizations = (state) => state.adminAddRsu.value.apiData?.organizations ?? [] +export const selectApiData = (state: RootState) => state.adminAddRsu.value.apiData +export const selectPrimaryRoutes = (state: RootState) => state.adminAddRsu.value.apiData?.primary_routes ?? [] +export const selectRsuModels = (state: RootState) => state.adminAddRsu.value.apiData?.rsu_models ?? [] +export const selectSshCredentialGroups = (state: RootState) => + state.adminAddRsu.value.apiData?.ssh_credential_groups ?? [] +export const selectSnmpCredentialGroups = (state: RootState) => + state.adminAddRsu.value.apiData?.snmp_credential_groups ?? [] +export const selectSnmpVersions = (state: RootState) => state.adminAddRsu.value.apiData?.snmp_version_groups ?? [] +export const selectOrganizations = (state: RootState) => state.adminAddRsu.value.apiData?.organizations ?? [] -export const selectSuccessMsg = (state) => state.adminAddRsu.value.successMsg -export const selectErrorState = (state) => state.adminAddRsu.value.errorState -export const selectErrorMsg = (state) => state.adminAddRsu.value.errorMsg -export const selectSelectedRoute = (state) => state.adminAddRsu.value.selectedRoute -export const selectOtherRouteDisabled = (state) => state.adminAddRsu.value.otherRouteDisabled -export const selectSelectedModel = (state) => state.adminAddRsu.value.selectedModel -export const selectSelectedSshGroup = (state) => state.adminAddRsu.value.selectedSshGroup -export const selectSelectedSnmpGroup = (state) => state.adminAddRsu.value.selectedSnmpGroup -export const selectSelectedSnmpVersion = (state) => state.adminAddRsu.value.selectedSnmpVersion -export const selectSelectedOrganizations = (state) => state.adminAddRsu.value.selectedOrganizations -export const selectSubmitAttempt = (state) => state.adminAddRsu.value.submitAttempt -export const selectLoading = (state) => state.adminAddRsu.loading +export const selectSuccessMsg = (state: RootState) => state.adminAddRsu.value.successMsg +export const selectErrorState = (state: RootState) => state.adminAddRsu.value.errorState +export const selectErrorMsg = (state: RootState) => state.adminAddRsu.value.errorMsg +export const selectSelectedRoute = (state: RootState) => state.adminAddRsu.value.selectedRoute +export const selectOtherRouteDisabled = (state: RootState) => state.adminAddRsu.value.otherRouteDisabled +export const selectSelectedModel = (state: RootState) => state.adminAddRsu.value.selectedModel +export const selectSelectedSshGroup = (state: RootState) => state.adminAddRsu.value.selectedSshGroup +export const selectSelectedSnmpGroup = (state: RootState) => state.adminAddRsu.value.selectedSnmpGroup +export const selectSelectedSnmpVersion = (state: RootState) => state.adminAddRsu.value.selectedSnmpVersion +export const selectSelectedOrganizations = (state: RootState) => state.adminAddRsu.value.selectedOrganizations +export const selectSubmitAttempt = (state: RootState) => state.adminAddRsu.value.submitAttempt +export const selectLoading = (state: RootState) => state.adminAddRsu.loading export default adminAddRsuSlice.reducer diff --git a/webapp/src/features/adminAdduser/AdminAddUser.test.js b/webapp/src/features/adminAdduser/AdminAddUser.test.ts similarity index 100% rename from webapp/src/features/adminAdduser/AdminAddUser.test.js rename to webapp/src/features/adminAdduser/AdminAddUser.test.ts diff --git a/webapp/src/features/adminAdduser/AdminAddUser.js b/webapp/src/features/adminAdduser/AdminAddUser.tsx similarity index 98% rename from webapp/src/features/adminAdduser/AdminAddUser.js rename to webapp/src/features/adminAdduser/AdminAddUser.tsx index 5ebf891c4..3f8867758 100644 --- a/webapp/src/features/adminAdduser/AdminAddUser.js +++ b/webapp/src/features/adminAdduser/AdminAddUser.tsx @@ -27,7 +27,7 @@ import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' const AdminAddUser = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const successMsg = useSelector(selectSuccessMsg) const selectedOrganizationNames = useSelector(selectSelectedOrganizationNames) const selectedOrganizations = useSelector(selectSelectedOrganizations) diff --git a/webapp/src/features/adminAdduser/adminAddUserSlice.test.js b/webapp/src/features/adminAdduser/adminAddUserSlice.test.ts similarity index 99% rename from webapp/src/features/adminAdduser/adminAddUserSlice.test.js rename to webapp/src/features/adminAdduser/adminAddUserSlice.test.ts index 1d7e09d5a..3bbfa033e 100644 --- a/webapp/src/features/adminAdduser/adminAddUserSlice.test.js +++ b/webapp/src/features/adminAdduser/adminAddUserSlice.test.ts @@ -48,7 +48,7 @@ describe('admin add User reducer', () => { }) describe('async thunks', () => { - const initialState = { + var initialState = { loading: null, value: { successMsg: null, diff --git a/webapp/src/features/adminAdduser/adminAddUserSlice.js b/webapp/src/features/adminAdduser/adminAddUserSlice.tsx similarity index 85% rename from webapp/src/features/adminAdduser/adminAddUserSlice.js rename to webapp/src/features/adminAdduser/adminAddUserSlice.tsx index 4e1de9c83..426a99b54 100644 --- a/webapp/src/features/adminAdduser/adminAddUserSlice.js +++ b/webapp/src/features/adminAdduser/adminAddUserSlice.tsx @@ -19,7 +19,7 @@ const initialState = { export const getUserData = createAsyncThunk( 'adminAddUser/getUserData', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._getDataWithCodes({ @@ -42,7 +42,7 @@ export const createUser = createAsyncThunk( 'adminAddUser/createUser', async (payload, { getState, dispatch }) => { const { json, reset } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._postData({ @@ -72,7 +72,7 @@ export const submitForm = createAsyncThunk( 'adminAddUser/submitForm', async (payload, { getState, dispatch }) => { const { data, reset } = payload - const currentState = getState() + const currentState = getState() as RootState const selectedOrganizations = selectSelectedOrganizations(currentState) if (selectedOrganizations.length !== 0) { const submitOrgs = [...selectedOrganizations].map((org) => ({ ...org })) @@ -192,15 +192,15 @@ export const { setSelectedRole, } = adminAddUserSlice.actions -export const selectLoading = (state) => state.adminAddUser.loading -export const selectSuccessMsg = (state) => state.adminAddUser.value.successMsg -export const selectSelectedOrganizationNames = (state) => state.adminAddUser.value.selectedOrganizationNames -export const selectSelectedOrganizations = (state) => state.adminAddUser.value.selectedOrganizations -export const selectOrganizationNames = (state) => state.adminAddUser.value.organizationNames -export const selectAvailableRoles = (state) => state.adminAddUser.value.availableRoles -export const selectApiData = (state) => state.adminAddUser.value.apiData -export const selectErrorState = (state) => state.adminAddUser.value.errorState -export const selectErrorMsg = (state) => state.adminAddUser.value.errorMsg -export const selectSubmitAttempt = (state) => state.adminAddUser.value.submitAttempt +export const selectLoading = (state: RootState) => state.adminAddUser.loading +export const selectSuccessMsg = (state: RootState) => state.adminAddUser.value.successMsg +export const selectSelectedOrganizationNames = (state: RootState) => state.adminAddUser.value.selectedOrganizationNames +export const selectSelectedOrganizations = (state: RootState) => state.adminAddUser.value.selectedOrganizations +export const selectOrganizationNames = (state: RootState) => state.adminAddUser.value.organizationNames +export const selectAvailableRoles = (state: RootState) => state.adminAddUser.value.availableRoles +export const selectApiData = (state: RootState) => state.adminAddUser.value.apiData +export const selectErrorState = (state: RootState) => state.adminAddUser.value.errorState +export const selectErrorMsg = (state: RootState) => state.adminAddUser.value.errorMsg +export const selectSubmitAttempt = (state: RootState) => state.adminAddUser.value.submitAttempt export default adminAddUserSlice.reducer diff --git a/webapp/src/features/adminEditOrganization/AdminEditOrganization.test.js b/webapp/src/features/adminEditOrganization/AdminEditOrganization.test.ts similarity index 100% rename from webapp/src/features/adminEditOrganization/AdminEditOrganization.test.js rename to webapp/src/features/adminEditOrganization/AdminEditOrganization.test.ts diff --git a/webapp/src/features/adminEditOrganization/AdminEditOrganization.js b/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx similarity index 96% rename from webapp/src/features/adminEditOrganization/AdminEditOrganization.js rename to webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx index 68fd331c9..5903054f8 100644 --- a/webapp/src/features/adminEditOrganization/AdminEditOrganization.js +++ b/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx @@ -16,7 +16,7 @@ import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' const AdminEditOrganization = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const successMsg = useSelector(selectSuccessMsg) const errorState = useSelector(selectErrorState) const errorMsg = useSelector(selectErrorMsg) diff --git a/webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.test.js b/webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.test.ts similarity index 100% rename from webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.test.js rename to webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.test.ts diff --git a/webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.js b/webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.tsx similarity index 86% rename from webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.js rename to webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.tsx index a20d7ad28..0c859f38a 100644 --- a/webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.js +++ b/webapp/src/features/adminEditOrganization/adminEditOrganizationSlice.tsx @@ -31,7 +31,7 @@ export const editOrganization = createAsyncThunk( 'adminEditOrganization/editOrganization', async (payload, { getState, dispatch }) => { const { json, selectedOrg, setValue, updateOrganizationData } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._patchData({ @@ -90,9 +90,9 @@ export const adminEditOrganizationSlice = createSlice({ export const { setSuccessMsg } = adminEditOrganizationSlice.actions -export const selectLoading = (state) => state.adminEditOrganization.loading -export const selectSuccessMsg = (state) => state.adminEditOrganization.value.successMsg -export const selectErrorState = (state) => state.adminEditOrganization.value.errorState -export const selectErrorMsg = (state) => state.adminEditOrganization.value.errorMsg +export const selectLoading = (state: RootState) => state.adminEditOrganization.loading +export const selectSuccessMsg = (state: RootState) => state.adminEditOrganization.value.successMsg +export const selectErrorState = (state: RootState) => state.adminEditOrganization.value.errorState +export const selectErrorMsg = (state: RootState) => state.adminEditOrganization.value.errorMsg export default adminEditOrganizationSlice.reducer diff --git a/webapp/src/features/adminEditRsu/AdminEditRsu.test.js b/webapp/src/features/adminEditRsu/AdminEditRsu.test.ts similarity index 100% rename from webapp/src/features/adminEditRsu/AdminEditRsu.test.js rename to webapp/src/features/adminEditRsu/AdminEditRsu.test.ts diff --git a/webapp/src/features/adminEditRsu/AdminEditRsu.js b/webapp/src/features/adminEditRsu/AdminEditRsu.tsx similarity index 96% rename from webapp/src/features/adminEditRsu/AdminEditRsu.js rename to webapp/src/features/adminEditRsu/AdminEditRsu.tsx index c76cc1d09..ab5c17d7c 100644 --- a/webapp/src/features/adminEditRsu/AdminEditRsu.js +++ b/webapp/src/features/adminEditRsu/AdminEditRsu.tsx @@ -38,8 +38,25 @@ import { useSelector, useDispatch } from 'react-redux' import '../adminRsuTab/Admin.css' +export type AdminEditRsuFormType = { + orig_ip: string + ip: string + geo_position: { + latitude: string + longitude: string + } + milepost: number + primary_route: string + serial_number: string + model: string + scms_id: string + ssh_credential_group: string + snmp_credential_group: string + snmp_version_group: string +} + const AdminEditRsu = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const successMsg = useSelector(selectSuccessMsg) const apiData = useSelector(selectApiData) const errorState = useSelector(selectErrorState) @@ -104,7 +121,7 @@ const AdminEditRsu = (props) => { dispatch(updateSelectedRoute(selectedRoute)) }, [selectedRoute, dispatch]) - const onSubmit = (data) => { + const onSubmit = (data: AdminEditRsuFormType) => { dispatch(submitForm(data)) } diff --git a/webapp/src/features/adminEditRsu/adminEditRsuSlice.test.js b/webapp/src/features/adminEditRsu/adminEditRsuSlice.test.ts similarity index 100% rename from webapp/src/features/adminEditRsu/adminEditRsuSlice.test.js rename to webapp/src/features/adminEditRsu/adminEditRsuSlice.test.ts diff --git a/webapp/src/features/adminEditRsu/adminEditRsuSlice.js b/webapp/src/features/adminEditRsu/adminEditRsuSlice.tsx similarity index 72% rename from webapp/src/features/adminEditRsu/adminEditRsuSlice.js rename to webapp/src/features/adminEditRsu/adminEditRsuSlice.tsx index 1f2e014e9..a6c905cf8 100644 --- a/webapp/src/features/adminEditRsu/adminEditRsuSlice.js +++ b/webapp/src/features/adminEditRsu/adminEditRsuSlice.tsx @@ -3,29 +3,31 @@ import { selectToken } from '../../generalSlices/userSlice' import EnvironmentVars from '../../EnvironmentVars' import apiHelper from '../../apis/api-helper' import { updateTableData as updateRsuTableData } from '../adminRsuTab/adminRsuTabSlice' +import { RootState } from '../../store' +import { AdminEditRsuFormType } from './AdminEditRsu' const initialState = { successMsg: '', apiData: {}, errorState: false, errorMsg: '', - primaryRoutes: [], + primaryRoutes: [] as { name: string }[], selectedRoute: '', otherRouteDisabled: true, - rsuModels: [], + rsuModels: [] as { name: string }[], selectedModel: '', - sshCredentialGroups: [], + sshCredentialGroups: [] as { name: string }[], selectedSshGroup: '', - snmpCredentialGroups: [], + snmpCredentialGroups: [] as { name: string }[], selectedSnmpGroup: '', - snmpVersions: [], + snmpVersions: [] as { name: string }[], selectedSnmpVersion: '', - organizations: [], - selectedOrganizations: [], + organizations: [] as { name: string }[], + selectedOrganizations: [] as { name: string }[], submitAttempt: false, } -export const checkForm = (state) => { +export const checkForm = (state: RootState['adminEditRsu']) => { if (state.value.selectedRoute === '') { return false } else if (state.value.selectedModel === '') { @@ -43,7 +45,7 @@ export const checkForm = (state) => { } } -export const updateJson = (data, state) => { +export const updateJson = (data: AdminEditRsuFormType, state: RootState['adminEditRsu']) => { let json = data if (state.value.selectedRoute !== 'Other') { @@ -81,7 +83,7 @@ export const updateJson = (data, state) => { export const getRsuInfo = createAsyncThunk( 'adminEditRsu/getRsuInfo', async (rsu_ip, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._getDataWithCodes({ @@ -105,7 +107,7 @@ export const getRsuInfo = createAsyncThunk( export const editRsu = createAsyncThunk( 'adminEditRsu/editRsu', async (json, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._patchData({ @@ -127,16 +129,19 @@ export const editRsu = createAsyncThunk( { condition: (_, { getState }) => selectToken(getState()) } ) -export const submitForm = createAsyncThunk('adminEditRsu/submitForm', async (data, { getState, dispatch }) => { - const currentState = getState() - if (checkForm(currentState.adminEditRsu)) { - let json = updateJson(data, currentState.adminEditRsu) - dispatch(editRsu(json)) - return false - } else { - return true +export const submitForm = createAsyncThunk( + 'adminEditRsu/submitForm', + async (data: AdminEditRsuFormType, { getState, dispatch }) => { + const currentState = getState() as RootState + if (checkForm(currentState.adminEditRsu)) { + let json = updateJson(data, currentState.adminEditRsu) + dispatch(editRsu(json)) + return false + } else { + return true + } } -}) +) export const adminEditRsuSlice = createSlice({ name: 'adminEditRsu', @@ -261,24 +266,24 @@ export const { updateStates, } = adminEditRsuSlice.actions -export const selectLoading = (state) => state.adminEditRsu.loading -export const selectSuccessMsg = (state) => state.adminEditRsu.value.successMsg -export const selectApiData = (state) => state.adminEditRsu.value.apiData -export const selectErrorState = (state) => state.adminEditRsu.value.errorState -export const selectErrorMsg = (state) => state.adminEditRsu.value.errorMsg -export const selectPrimaryRoutes = (state) => state.adminEditRsu.value.primaryRoutes -export const selectSelectedRoute = (state) => state.adminEditRsu.value.selectedRoute -export const selectOtherRouteDisabled = (state) => state.adminEditRsu.value.otherRouteDisabled -export const selectRsuModels = (state) => state.adminEditRsu.value.rsuModels -export const selectSelectedModel = (state) => state.adminEditRsu.value.selectedModel -export const selectSshCredentialGroups = (state) => state.adminEditRsu.value.sshCredentialGroups -export const selectSelectedSshGroup = (state) => state.adminEditRsu.value.selectedSshGroup -export const selectSnmpCredentialGroups = (state) => state.adminEditRsu.value.snmpCredentialGroups -export const selectSelectedSnmpGroup = (state) => state.adminEditRsu.value.selectedSnmpGroup -export const selectSnmpVersions = (state) => state.adminEditRsu.value.snmpVersions -export const selectSelectedSnmpVersion = (state) => state.adminEditRsu.value.selectedSnmpVersion -export const selectOrganizations = (state) => state.adminEditRsu.value.organizations -export const selectSelectedOrganizations = (state) => state.adminEditRsu.value.selectedOrganizations -export const selectSubmitAttempt = (state) => state.adminEditRsu.value.submitAttempt +export const selectLoading = (state: RootState) => state.adminEditRsu.loading +export const selectSuccessMsg = (state: RootState) => state.adminEditRsu.value.successMsg +export const selectApiData = (state: RootState) => state.adminEditRsu.value.apiData +export const selectErrorState = (state: RootState) => state.adminEditRsu.value.errorState +export const selectErrorMsg = (state: RootState) => state.adminEditRsu.value.errorMsg +export const selectPrimaryRoutes = (state: RootState) => state.adminEditRsu.value.primaryRoutes +export const selectSelectedRoute = (state: RootState) => state.adminEditRsu.value.selectedRoute +export const selectOtherRouteDisabled = (state: RootState) => state.adminEditRsu.value.otherRouteDisabled +export const selectRsuModels = (state: RootState) => state.adminEditRsu.value.rsuModels +export const selectSelectedModel = (state: RootState) => state.adminEditRsu.value.selectedModel +export const selectSshCredentialGroups = (state: RootState) => state.adminEditRsu.value.sshCredentialGroups +export const selectSelectedSshGroup = (state: RootState) => state.adminEditRsu.value.selectedSshGroup +export const selectSnmpCredentialGroups = (state: RootState) => state.adminEditRsu.value.snmpCredentialGroups +export const selectSelectedSnmpGroup = (state: RootState) => state.adminEditRsu.value.selectedSnmpGroup +export const selectSnmpVersions = (state: RootState) => state.adminEditRsu.value.snmpVersions +export const selectSelectedSnmpVersion = (state: RootState) => state.adminEditRsu.value.selectedSnmpVersion +export const selectOrganizations = (state: RootState) => state.adminEditRsu.value.organizations +export const selectSelectedOrganizations = (state: RootState) => state.adminEditRsu.value.selectedOrganizations +export const selectSubmitAttempt = (state: RootState) => state.adminEditRsu.value.submitAttempt export default adminEditRsuSlice.reducer diff --git a/webapp/src/features/adminEditUser/AdminEditUser.test.js b/webapp/src/features/adminEditUser/AdminEditUser.test.ts similarity index 100% rename from webapp/src/features/adminEditUser/AdminEditUser.test.js rename to webapp/src/features/adminEditUser/AdminEditUser.test.ts diff --git a/webapp/src/features/adminEditUser/AdminEditUser.js b/webapp/src/features/adminEditUser/AdminEditUser.tsx similarity index 90% rename from webapp/src/features/adminEditUser/AdminEditUser.js rename to webapp/src/features/adminEditUser/AdminEditUser.tsx index 2897eb4a7..0d83d49f9 100644 --- a/webapp/src/features/adminEditUser/AdminEditUser.js +++ b/webapp/src/features/adminEditUser/AdminEditUser.tsx @@ -18,14 +18,28 @@ import { getUserData, submitForm, updateOrganizations, + UserApiDataOrgs, } from './adminEditUserSlice' import { useSelector, useDispatch } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' +import { ThunkDispatch, AnyAction } from '@reduxjs/toolkit' +import { RootState } from '../../store' + +interface AdminEditUserProps { + userData: { + email: string + first_name: string + last_name: string + super_user: boolean + organizations: [] + } + updateUserData: () => void +} -const AdminEditUser = (props) => { - const dispatch = useDispatch() +const AdminEditUser = (props: AdminEditUserProps) => { + const dispatch: ThunkDispatch = useDispatch() const successMsg = useSelector(selectSuccessMsg) const selectedOrganizationNames = useSelector(selectSelectedOrganizationNames) const selectedOrganizations = useSelector(selectSelectedOrganizations) @@ -65,11 +79,11 @@ const AdminEditUser = (props) => { setValue('email', apiData.user_data.email) setValue('first_name', apiData.user_data.first_name) setValue('last_name', apiData.user_data.last_name) - setValue('super_user', apiData.user_data.super_user) + setValue('super_user', apiData.user_data.super_user.toString()) } }, [apiData, setValue]) - const onSubmit = (data) => { + const onSubmit = (data: UserApiDataOrgs) => { dispatch(submitForm({ data, updateUserData: props.updateUserData })) } @@ -143,7 +157,7 @@ const AdminEditUser = (props) => { let role = { role: organization.role } return ( - + {organization.name} + } +} +export type UserApiDataOrgs = { + orig_email: string + email: string + first_name: string + last_name: string + super_user: string + organizations_to_add: { name: string; role: string }[] + organizations_to_modify: { name: string; role: string }[] + organizations_to_remove: { name: string; role: string }[] +} const initialState = { successMsg: '', - selectedOrganizationNames: [], - selectedOrganizations: [], - organizationNames: [], - availableRoles: [], - apiData: {}, + selectedOrganizationNames: [] as { name: string; id: number }[], + selectedOrganizations: [] as { name: string; role: string; id: number }[], + organizationNames: [] as { name: string; id: number }[], + availableRoles: [] as { role: string }[], + apiData: undefined as UserApiData | undefined, errorState: false, errorMsg: '', submitAttempt: false, } -export const organizationParser = (data, submitOrgs, apiData) => { +export const organizationParser = ( + data: UserApiDataOrgs, + submitOrgs: Array<{ name: string; role: string }>, + apiData: UserApiData +) => { let orgsToAdd = [] let orgsToModify = [] let orgsToRemove = [] @@ -50,8 +79,8 @@ export const organizationParser = (data, submitOrgs, apiData) => { export const getUserData = createAsyncThunk( 'adminEditUser/getUserData', - async (email, { getState, dispatch }) => { - const currentState = getState() + async (email: string, { getState, dispatch }): Promise => { + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._getDataWithCodes({ @@ -69,14 +98,14 @@ export const getUserData = createAsyncThunk( return { success: false, message: data.message } } }, - { condition: (_, { getState }) => selectToken(getState()) } + { condition: (_, { getState }) => selectToken(getState() as RootState) != undefined } ) export const editUser = createAsyncThunk( 'adminEditUser/editUser', - async (payload, { getState, dispatch }) => { + async (payload: { json: Object; updateUserData: () => void }, { getState, dispatch }) => { const { json, updateUserData } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._patchData({ @@ -94,25 +123,28 @@ export const editUser = createAsyncThunk( return { success: false, message: data.message } } }, - { condition: (_, { getState }) => selectToken(getState()) } + { condition: (_, { getState }) => selectToken(getState() as RootState) != undefined } ) -export const submitForm = createAsyncThunk('adminEditUser/submitForm', async (payload, { getState, dispatch }) => { - const { data, updateUserData } = payload - const currentState = getState() - const selectedOrganizations = selectSelectedOrganizations(currentState) - const apiData = selectApiData(currentState) - - if (selectedOrganizations.length !== 0) { - let submitOrgs = [...selectedOrganizations].map((org) => ({ ...org })) - submitOrgs.forEach((elm) => delete elm.id) - const tempData = organizationParser(data, submitOrgs, apiData) - dispatch(editUser({ json: tempData, updateUserData })) - return false - } else { - return true +export const submitForm = createAsyncThunk( + 'adminEditUser/submitForm', + async (payload: { data: UserApiDataOrgs; updateUserData: () => void }, { getState, dispatch }) => { + const { data, updateUserData } = payload + const currentState = getState() as RootState + const selectedOrganizations = selectSelectedOrganizations(currentState) + const apiData = selectApiData(currentState) + + if (selectedOrganizations.length !== 0) { + let submitOrgs = [...selectedOrganizations].map((org) => ({ ...org })) + submitOrgs.forEach((elm) => delete elm.id) + const tempData = organizationParser(data, submitOrgs, apiData) + dispatch(editUser({ json: tempData, updateUserData })) + return false + } else { + return true + } } -}) +) export const adminEditUserSlice = createSlice({ name: 'adminEditUser', @@ -148,18 +180,20 @@ export const adminEditUserSlice = createSlice({ updateStates: (state, action) => { const data = action.payload if (Object.keys(data).length !== 0) { - let orgData = [] - data.allowed_selections.organizations.forEach((org, index) => orgData.push({ id: index, name: org })) + let orgData: Array<{ id: number; name: string }> = [] + data.allowed_selections.organizations.forEach((org: string, index: number) => + orgData.push({ id: index, name: org }) + ) state.value.organizationNames = orgData - let roleData = [] - data.allowed_selections.roles.forEach((role) => roleData.push({ role })) + let roleData: Array<{ role: string }> = [] + data.allowed_selections.roles.forEach((role: string) => roleData.push({ role })) state.value.availableRoles = roleData - let tempOrganizations = [] - let tempOrganizationNames = [] + let tempOrganizations: Array<{ id: number; name: string; role: string }> = [] + let tempOrganizationNames: Array<{ id: number; name: string }> = [] - data.user_data.organizations.forEach((org, index) => { + data.user_data.organizations.forEach((org: { name: string; role: string }, index: number) => { tempOrganizations.push({ id: index, name: org.name, role: org.role }) tempOrganizationNames.push({ id: index, name: org.name }) }) @@ -174,7 +208,7 @@ export const adminEditUserSlice = createSlice({ .addCase(getUserData.pending, (state) => { state.loading = true }) - .addCase(getUserData.fulfilled, (state, action) => { + .addCase(getUserData.fulfilled, (state, action: { payload: UserDataResp }) => { state.loading = false if (action.payload.success) { state.value.successMsg = action.payload.message @@ -216,15 +250,15 @@ export const adminEditUserSlice = createSlice({ export const { updateOrganizations, setSuccessMsg, updateStates, setSelectedRole } = adminEditUserSlice.actions -export const selectLoading = (state) => state.adminEditUser.loading -export const selectSuccessMsg = (state) => state.adminEditUser.value.successMsg -export const selectSelectedOrganizationNames = (state) => state.adminEditUser.value.selectedOrganizationNames -export const selectSelectedOrganizations = (state) => state.adminEditUser.value.selectedOrganizations -export const selectOrganizationNames = (state) => state.adminEditUser.value.organizationNames -export const selectAvailableRoles = (state) => state.adminEditUser.value.availableRoles -export const selectApiData = (state) => state.adminEditUser.value.apiData -export const selectErrorState = (state) => state.adminEditUser.value.errorState -export const selectErrorMsg = (state) => state.adminEditUser.value.errorMsg -export const selectSubmitAttempt = (state) => state.adminEditUser.value.submitAttempt +export const selectLoading = (state: RootState) => state.adminEditUser.loading +export const selectSuccessMsg = (state: RootState) => state.adminEditUser.value.successMsg +export const selectSelectedOrganizationNames = (state: RootState) => state.adminEditUser.value.selectedOrganizationNames +export const selectSelectedOrganizations = (state: RootState) => state.adminEditUser.value.selectedOrganizations +export const selectOrganizationNames = (state: RootState) => state.adminEditUser.value.organizationNames +export const selectAvailableRoles = (state: RootState) => state.adminEditUser.value.availableRoles +export const selectApiData = (state: RootState) => state.adminEditUser.value.apiData +export const selectErrorState = (state: RootState) => state.adminEditUser.value.errorState +export const selectErrorMsg = (state: RootState) => state.adminEditUser.value.errorMsg +export const selectSubmitAttempt = (state: RootState) => state.adminEditUser.value.submitAttempt export default adminEditUserSlice.reducer diff --git a/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.test.js b/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.test.ts similarity index 100% rename from webapp/src/features/adminOrganizationTab/AdminOrganizationTab.test.js rename to webapp/src/features/adminOrganizationTab/AdminOrganizationTab.test.ts diff --git a/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.js b/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx similarity index 98% rename from webapp/src/features/adminOrganizationTab/AdminOrganizationTab.js rename to webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx index 8d116fed1..19839234c 100644 --- a/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.js +++ b/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx @@ -33,7 +33,7 @@ import { useSelector, useDispatch } from 'react-redux' import '../adminRsuTab/Admin.css' const AdminOrganizationTab = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const activeDiv = useSelector(selectActiveDiv) const title = useSelector(selectTitle) const orgData = useSelector(selectOrgData) diff --git a/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.test.js b/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.test.ts similarity index 100% rename from webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.test.js rename to webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.test.ts diff --git a/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.js b/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.tsx similarity index 82% rename from webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.js rename to webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.tsx index 8ab85347e..654ca08d4 100644 --- a/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.js +++ b/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.tsx @@ -18,7 +18,7 @@ export const getOrgData = createAsyncThunk( 'adminOrganizationTab/getOrgData', async (payload, { getState }) => { const { orgName, all, specifiedOrg } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._getDataWithCodes({ @@ -40,7 +40,7 @@ export const getOrgData = createAsyncThunk( export const deleteOrg = createAsyncThunk( 'adminOrganizationTab/deleteOrg', async (org, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._deleteData({ @@ -65,7 +65,7 @@ export const deleteOrg = createAsyncThunk( export const editOrg = createAsyncThunk( 'adminOrganizationTab/editOrg', async (json, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._patchData({ @@ -173,15 +173,15 @@ export const adminOrganizationTabSlice = createSlice({ export const { updateTitle, setActiveDiv, setSelectedOrg } = adminOrganizationTabSlice.actions -export const selectLoading = (state) => state.adminOrganizationTab.loading -export const selectActiveDiv = (state) => state.adminOrganizationTab.value.activeDiv -export const selectTitle = (state) => state.adminOrganizationTab.value.title -export const selectOrgData = (state) => state.adminOrganizationTab.value.orgData -export const selectSelectedOrg = (state) => state.adminOrganizationTab.value.selectedOrg -export const selectSelectedOrgName = (state) => state.adminOrganizationTab.value.selectedOrg.name -export const selectRsuTableData = (state) => state.adminOrganizationTab.value.rsuTableData -export const selectUserTableData = (state) => state.adminOrganizationTab.value.userTableData -export const selectErrorState = (state) => state.adminOrganizationTab.value.errorState -export const selectErrorMsg = (state) => state.adminOrganizationTab.value.errorMsg +export const selectLoading = (state: RootState) => state.adminOrganizationTab.loading +export const selectActiveDiv = (state: RootState) => state.adminOrganizationTab.value.activeDiv +export const selectTitle = (state: RootState) => state.adminOrganizationTab.value.title +export const selectOrgData = (state: RootState) => state.adminOrganizationTab.value.orgData +export const selectSelectedOrg = (state: RootState) => state.adminOrganizationTab.value.selectedOrg +export const selectSelectedOrgName = (state: RootState) => state.adminOrganizationTab.value.selectedOrg.name +export const selectRsuTableData = (state: RootState) => state.adminOrganizationTab.value.rsuTableData +export const selectUserTableData = (state: RootState) => state.adminOrganizationTab.value.userTableData +export const selectErrorState = (state: RootState) => state.adminOrganizationTab.value.errorState +export const selectErrorMsg = (state: RootState) => state.adminOrganizationTab.value.errorMsg export default adminOrganizationTabSlice.reducer diff --git a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.js b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.ts similarity index 100% rename from webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.js rename to webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.ts diff --git a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.js b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx similarity index 98% rename from webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.js rename to webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx index c590d1b73..b4d2baab6 100644 --- a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.js +++ b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx @@ -28,7 +28,7 @@ import '../adminRsuTab/Admin.css' const AdminOrganizationTabRsu = (props) => { const { selectedOrg, orgPatchJson, fetchPatchOrganization, updateTableData } = props - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const availableRsuList = useSelector(selectAvailableRsuList) const selectedRsuList = useSelector(selectSelectedRsuList) diff --git a/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.test.js b/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.test.ts similarity index 100% rename from webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.test.js rename to webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.test.ts diff --git a/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.js b/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.tsx similarity index 92% rename from webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.js rename to webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.tsx index 3fea25680..e1f3c23ae 100644 --- a/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.js +++ b/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.tsx @@ -21,7 +21,7 @@ export const getRsuDataByIp = async (rsu_ip, token) => { export const getRsuData = createAsyncThunk( 'adminOrganizationTabRsu/getRsuData', async (orgName, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await getRsuDataByIp('all', token) @@ -40,7 +40,7 @@ export const rsuDeleteSingle = createAsyncThunk( 'adminOrganizationTabRsu/rsuDeleteSingle', async (payload, { getState, dispatch }) => { const { rsu, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) let promises = [] @@ -65,7 +65,7 @@ export const rsuDeleteMultiple = createAsyncThunk( 'adminOrganizationTabRsu/rsuDeleteMultiple', async (payload, { getState, dispatch }) => { const { rows, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const invalidRsus = [] @@ -168,8 +168,8 @@ export const adminOrganizationTabRsuSlice = createSlice({ export const { setSelectedRsuList } = adminOrganizationTabRsuSlice.actions -export const selectLoading = (state) => state.adminOrganizationTabRsu.loading -export const selectAvailableRsuList = (state) => state.adminOrganizationTabRsu.value.availableRsuList -export const selectSelectedRsuList = (state) => state.adminOrganizationTabRsu.value.selectedRsuList +export const selectLoading = (state: RootState) => state.adminOrganizationTabRsu.loading +export const selectAvailableRsuList = (state: RootState) => state.adminOrganizationTabRsu.value.availableRsuList +export const selectSelectedRsuList = (state: RootState) => state.adminOrganizationTabRsu.value.selectedRsuList export default adminOrganizationTabRsuSlice.reducer diff --git a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.js b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.ts similarity index 100% rename from webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.js rename to webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.ts diff --git a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.js b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx similarity index 99% rename from webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.js rename to webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx index 5e93f0a41..558e1544a 100644 --- a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.js +++ b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx @@ -31,7 +31,7 @@ import { useSelector, useDispatch } from 'react-redux' import '../adminRsuTab/Admin.css' const AdminOrganizationTabUser = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const { selectedOrg } = props const availableUserList = useSelector(selectAvailableUserList) const selectedUserList = useSelector(selectSelectedUserList) diff --git a/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.test.js b/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.test.ts similarity index 100% rename from webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.test.js rename to webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.test.ts diff --git a/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.js b/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.tsx similarity index 92% rename from webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.js rename to webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.tsx index ca5f34871..96488158c 100644 --- a/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.js +++ b/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.tsx @@ -21,7 +21,7 @@ export const getUserData = async (email, token) => { export const getAvailableRoles = createAsyncThunk( 'adminOrganizationTabUser/getAvailableRoles', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._getDataWithCodes({ @@ -43,7 +43,7 @@ export const getAvailableRoles = createAsyncThunk( export const getAvailableUsers = createAsyncThunk( 'adminOrganizationTabUser/getAvailableUsers', async (orgName, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await getUserData('all', token) @@ -62,7 +62,7 @@ export const userDeleteSingle = createAsyncThunk( 'adminOrganizationTabUser/userDeleteSingle', async (payload, { getState, dispatch }) => { const { user, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) let promises = [] @@ -93,7 +93,7 @@ export const userDeleteMultiple = createAsyncThunk( 'adminOrganizationTabUser/userDeleteMultiple', async (payload, { getState, dispatch }) => { const { users, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const invalidUsers = [] @@ -243,9 +243,9 @@ export const adminOrganizationTabUserSlice = createSlice({ export const { setSelectedUserList, setSelectedUserRole } = adminOrganizationTabUserSlice.actions -export const selectLoading = (state) => state.adminOrganizationTabUser.loading -export const selectAvailableUserList = (state) => state.adminOrganizationTabUser.value.availableUserList -export const selectSelectedUserList = (state) => state.adminOrganizationTabUser.value.selectedUserList -export const selectAvailableRoles = (state) => state.adminOrganizationTabUser.value.availableRoles +export const selectLoading = (state: RootState) => state.adminOrganizationTabUser.loading +export const selectAvailableUserList = (state: RootState) => state.adminOrganizationTabUser.value.availableUserList +export const selectSelectedUserList = (state: RootState) => state.adminOrganizationTabUser.value.selectedUserList +export const selectAvailableRoles = (state: RootState) => state.adminOrganizationTabUser.value.availableRoles export default adminOrganizationTabUserSlice.reducer diff --git a/webapp/src/features/adminRsuTab/AdminRsuTab.test.js b/webapp/src/features/adminRsuTab/AdminRsuTab.test.ts similarity index 100% rename from webapp/src/features/adminRsuTab/AdminRsuTab.test.js rename to webapp/src/features/adminRsuTab/AdminRsuTab.test.ts diff --git a/webapp/src/features/adminRsuTab/AdminRsuTab.js b/webapp/src/features/adminRsuTab/AdminRsuTab.tsx similarity index 98% rename from webapp/src/features/adminRsuTab/AdminRsuTab.js rename to webapp/src/features/adminRsuTab/AdminRsuTab.tsx index 442f8ba90..ba557f8e4 100644 --- a/webapp/src/features/adminRsuTab/AdminRsuTab.js +++ b/webapp/src/features/adminRsuTab/AdminRsuTab.tsx @@ -26,7 +26,7 @@ import { useSelector, useDispatch } from 'react-redux' import './Admin.css' const AdminRsuTab = () => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const activeDiv = useSelector(selectActiveDiv) const tableData = useSelector(selectTableData) diff --git a/webapp/src/features/adminRsuTab/adminRsuTabSlice.test.js b/webapp/src/features/adminRsuTab/adminRsuTabSlice.test.ts similarity index 100% rename from webapp/src/features/adminRsuTab/adminRsuTabSlice.test.js rename to webapp/src/features/adminRsuTab/adminRsuTabSlice.test.ts diff --git a/webapp/src/features/adminRsuTab/adminRsuTabSlice.js b/webapp/src/features/adminRsuTab/adminRsuTabSlice.tsx similarity index 86% rename from webapp/src/features/adminRsuTab/adminRsuTabSlice.js rename to webapp/src/features/adminRsuTab/adminRsuTabSlice.tsx index 3e3ce4e4c..d6c30806c 100644 --- a/webapp/src/features/adminRsuTab/adminRsuTabSlice.js +++ b/webapp/src/features/adminRsuTab/adminRsuTabSlice.tsx @@ -21,7 +21,7 @@ const initialState = { export const updateTableData = createAsyncThunk( 'adminRsuTab/updateTableData', async (_, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) dispatch(getRsuInfoOnly()) @@ -48,7 +48,7 @@ export const deleteRsu = createAsyncThunk( 'adminRsuTab/deleteRsu', async (payload, { getState, dispatch }) => { const { rsu_ip, shouldUpdateTableData } = payload - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await apiHelper._deleteData({ @@ -132,11 +132,11 @@ export const adminRsuTabSlice = createSlice({ export const { setTitle, setActiveDiv, setEditRsuRowData } = adminRsuTabSlice.actions -export const selectLoading = (state) => state.adminRsuTab.loading -export const selectActiveDiv = (state) => state.adminRsuTab.value.activeDiv -export const selectTableData = (state) => state.adminRsuTab.value.tableData -export const selectTitle = (state) => state.adminRsuTab.value.title -export const selectColumns = (state) => state.adminRsuTab.value.columns -export const selectEditRsuRowData = (state) => state.adminRsuTab.value.editRsuRowData +export const selectLoading = (state: RootState) => state.adminRsuTab.loading +export const selectActiveDiv = (state: RootState) => state.adminRsuTab.value.activeDiv +export const selectTableData = (state: RootState) => state.adminRsuTab.value.tableData +export const selectTitle = (state: RootState) => state.adminRsuTab.value.title +export const selectColumns = (state: RootState) => state.adminRsuTab.value.columns +export const selectEditRsuRowData = (state: RootState) => state.adminRsuTab.value.editRsuRowData export default adminRsuTabSlice.reducer diff --git a/webapp/src/features/adminUserTab/AdminUserTab.test.js b/webapp/src/features/adminUserTab/AdminUserTab.test.ts similarity index 100% rename from webapp/src/features/adminUserTab/AdminUserTab.test.js rename to webapp/src/features/adminUserTab/AdminUserTab.test.ts diff --git a/webapp/src/features/adminUserTab/AdminUserTab.js b/webapp/src/features/adminUserTab/AdminUserTab.tsx similarity index 98% rename from webapp/src/features/adminUserTab/AdminUserTab.js rename to webapp/src/features/adminUserTab/AdminUserTab.tsx index 7f81089f2..6d355f3da 100644 --- a/webapp/src/features/adminUserTab/AdminUserTab.js +++ b/webapp/src/features/adminUserTab/AdminUserTab.tsx @@ -25,7 +25,7 @@ import { useSelector, useDispatch } from 'react-redux' import '../adminRsuTab/Admin.css' const AdminUserTab = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const activeDiv = useSelector(selectActiveDiv) const tableData = useSelector(selectTableData) const title = useSelector(selectTitle) diff --git a/webapp/src/features/adminUserTab/adminUserTabSlice.test.js b/webapp/src/features/adminUserTab/adminUserTabSlice.test.ts similarity index 100% rename from webapp/src/features/adminUserTab/adminUserTabSlice.test.js rename to webapp/src/features/adminUserTab/adminUserTabSlice.test.ts diff --git a/webapp/src/features/adminUserTab/adminUserTabSlice.js b/webapp/src/features/adminUserTab/adminUserTabSlice.tsx similarity index 85% rename from webapp/src/features/adminUserTab/adminUserTabSlice.js rename to webapp/src/features/adminUserTab/adminUserTabSlice.tsx index c3488debe..8c8f863cc 100644 --- a/webapp/src/features/adminUserTab/adminUserTabSlice.js +++ b/webapp/src/features/adminUserTab/adminUserTabSlice.tsx @@ -39,7 +39,7 @@ export const deleteUser = async (user_email, token) => { export const getAvailableUsers = createAsyncThunk( 'adminUserTab/getAvailableUsers', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const data = await getUserData('all', token) @@ -57,7 +57,7 @@ export const getAvailableUsers = createAsyncThunk( export const deleteUsers = createAsyncThunk( 'adminUserTab/deleteUser', async (data, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) let promises = [] @@ -112,10 +112,10 @@ export const adminUserTabSlice = createSlice({ export const { updateTitle, setActiveDiv, setEditUserRowData } = adminUserTabSlice.actions -export const selectLoading = (state) => state.adminUserTab.loading -export const selectActiveDiv = (state) => state.adminUserTab.value.activeDiv -export const selectTableData = (state) => state.adminUserTab.value.tableData -export const selectTitle = (state) => state.adminUserTab.value.title -export const selectEditUserRowData = (state) => state.adminUserTab.value.editUserRowData +export const selectLoading = (state: RootState) => state.adminUserTab.loading +export const selectActiveDiv = (state: RootState) => state.adminUserTab.value.activeDiv +export const selectTableData = (state: RootState) => state.adminUserTab.value.tableData +export const selectTitle = (state: RootState) => state.adminUserTab.value.title +export const selectEditUserRowData = (state: RootState) => state.adminUserTab.value.editUserRowData export default adminUserTabSlice.reducer diff --git a/webapp/src/features/menu/ConfigureRSU.test.js b/webapp/src/features/menu/ConfigureRSU.test.ts similarity index 100% rename from webapp/src/features/menu/ConfigureRSU.test.js rename to webapp/src/features/menu/ConfigureRSU.test.ts diff --git a/webapp/src/features/menu/ConfigureRSU.js b/webapp/src/features/menu/ConfigureRSU.tsx similarity index 98% rename from webapp/src/features/menu/ConfigureRSU.js rename to webapp/src/features/menu/ConfigureRSU.tsx index 9cb816d05..b02e0dafa 100644 --- a/webapp/src/features/menu/ConfigureRSU.js +++ b/webapp/src/features/menu/ConfigureRSU.tsx @@ -15,7 +15,7 @@ import { clearConfig, selectConfigList } from '../../generalSlices/configSlice' import '../../components/css/SnmpwalkMenu.css' const ConfigureRSU = () => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const [expanded, setExpanded] = useState(false) const handleChange = (panel) => (event, isExpanded) => { diff --git a/webapp/src/features/menu/DisplayCounts.test.js b/webapp/src/features/menu/DisplayCounts.test.ts similarity index 100% rename from webapp/src/features/menu/DisplayCounts.test.js rename to webapp/src/features/menu/DisplayCounts.test.ts diff --git a/webapp/src/features/menu/DisplayCounts.js b/webapp/src/features/menu/DisplayCounts.tsx similarity index 91% rename from webapp/src/features/menu/DisplayCounts.js rename to webapp/src/features/menu/DisplayCounts.tsx index 474ebdd24..373fcfa85 100644 --- a/webapp/src/features/menu/DisplayCounts.js +++ b/webapp/src/features/menu/DisplayCounts.tsx @@ -21,12 +21,15 @@ import { import { selectPreviousRequest, selectCurrentSort, selectSortedCountList, sortCountList, changeDate } from './menuSlice' import '../../components/css/SnmpwalkMenu.css' +import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' +import { RootState } from '../../store' const messageTypeOptions = MessageTypes.map((type) => { return { value: type, label: type } }) + const DisplayCounts = (props) => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const msgType = useSelector(selectMsgType) const startDate = useSelector(selectStartDate) const endDate = useSelector(selectEndDate) @@ -38,11 +41,11 @@ const DisplayCounts = (props) => { const currentSort = useSelector(selectCurrentSort) const sortedCountList = useSelector(selectSortedCountList) - const dateChanged = (e, type) => { + const dateChanged = (e: Date, type: 'start' | 'end') => { dispatch(changeDate(e, type, requestOut, previousRequest)) } - const getWarningMessage = (warning) => + const getWarningMessage = (warning: string) => warning ? (

    Warning: time ranges greater than 24 hours may have longer load times.

    @@ -51,11 +54,11 @@ const DisplayCounts = (props) => { ) - const sortBy = (key) => { + const sortBy = (key: string) => { dispatch(sortCountList(key, currentSort, countList)) } - const getTable = (messageLoading, sortedCountList) => + const getTable = (messageLoading: boolean, sortedCountList: string[]) => messageLoading ? (
    diff --git a/webapp/src/features/menu/Menu.test.js b/webapp/src/features/menu/Menu.test.ts similarity index 100% rename from webapp/src/features/menu/Menu.test.js rename to webapp/src/features/menu/Menu.test.ts diff --git a/webapp/src/features/menu/Menu.js b/webapp/src/features/menu/Menu.tsx similarity index 96% rename from webapp/src/features/menu/Menu.js rename to webapp/src/features/menu/Menu.tsx index 5370528b8..9faefb4c5 100644 --- a/webapp/src/features/menu/Menu.js +++ b/webapp/src/features/menu/Menu.tsx @@ -22,7 +22,7 @@ const menuStyle = { } const Menu = () => { - const dispatch = useDispatch() + const dispatch: ThunkDispatch = useDispatch() const userRole = useSelector(selectRole) const countList = useSelector(selectCountList) const selectedRsu = useSelector(selectSelectedRsu) diff --git a/webapp/src/features/menu/menuSlice.test.js b/webapp/src/features/menu/menuSlice.test.ts similarity index 100% rename from webapp/src/features/menu/menuSlice.test.js rename to webapp/src/features/menu/menuSlice.test.ts diff --git a/webapp/src/features/menu/menuSlice.js b/webapp/src/features/menu/menuSlice.tsx similarity index 77% rename from webapp/src/features/menu/menuSlice.js rename to webapp/src/features/menu/menuSlice.tsx index e2cebde89..6781a231c 100644 --- a/webapp/src/features/menu/menuSlice.js +++ b/webapp/src/features/menu/menuSlice.tsx @@ -1,5 +1,6 @@ import { createSlice } from '@reduxjs/toolkit' import { updateRowData } from '../../generalSlices/rsuSlice' +import { RootState } from '../../store' const { DateTime } = require('luxon') const initialState = { @@ -80,12 +81,12 @@ export const menuSlice = createSlice({ export const { setCurrentSort, setSortedCountList, setDisplay, setPreviousRequest } = menuSlice.actions -export const selectLoading = (state) => state.menu.loading -export const selectPreviousRequest = (state) => state.menu.value.previousRequest -export const selectDisplay = (state) => state.menu.value.display -export const selectCurrentSort = (state) => state.menu.value.currentSort -export const selectSortedCountList = (state) => state.menu.value.sortedCountList -export const selectDisplayCounts = (state) => state.menu.value.displayCounts -export const selectView = (state) => state.menu.value.view +export const selectLoading = (state: RootState) => state.menu.loading +export const selectPreviousRequest = (state: RootState) => state.menu.value.previousRequest +export const selectDisplay = (state: RootState) => state.menu.value.display +export const selectCurrentSort = (state: RootState) => state.menu.value.currentSort +export const selectSortedCountList = (state: RootState) => state.menu.value.sortedCountList +export const selectDisplayCounts = (state: RootState) => state.menu.value.displayCounts +export const selectView = (state: RootState) => state.menu.value.view export default menuSlice.reducer diff --git a/webapp/src/generalSlices/configSlice.test.js b/webapp/src/generalSlices/configSlice.test.ts similarity index 100% rename from webapp/src/generalSlices/configSlice.test.js rename to webapp/src/generalSlices/configSlice.test.ts diff --git a/webapp/src/generalSlices/configSlice.js b/webapp/src/generalSlices/configSlice.ts similarity index 76% rename from webapp/src/generalSlices/configSlice.js rename to webapp/src/generalSlices/configSlice.ts index cf92c6df0..eb3de0301 100644 --- a/webapp/src/generalSlices/configSlice.js +++ b/webapp/src/generalSlices/configSlice.ts @@ -1,6 +1,7 @@ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit' import RsuApi from '../apis/rsu-api' import { selectToken, selectOrganizationName } from './userSlice' +import { RootState } from '../store' const initialState = { msgFwdConfig: {}, @@ -12,14 +13,14 @@ const initialState = { snmpFilterMsg: '', snmpFilterErr: false, addConfigPoint: false, - configCoordinates: [], - configList: [], + configCoordinates: Array(), + configList: Array(), } export const refreshSnmpFwdConfig = createAsyncThunk( 'config/refreshSnmpFwdConfig', async (ipList, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -38,7 +39,7 @@ export const refreshSnmpFwdConfig = createAsyncThunk( ) export const submitSnmpSet = createAsyncThunk('config/submitSnmpSet', async (ipList, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) const destIp = selectDestIp(currentState) @@ -60,30 +61,40 @@ export const submitSnmpSet = createAsyncThunk('config/submitSnmpSet', async (ipL : { changeSuccess: false, errorState: response.body.RsuFwdSnmpset } }) -export const deleteSnmpSet = createAsyncThunk('config/deleteSnmpSet', async (data, { getState, dispatch }) => { - const currentState = getState() - const token = selectToken(currentState) - const organization = selectOrganizationName(currentState) - let body = {} - - body = { - command: 'rsufwdsnmpset-del', - rsu_ip: data?.ipList, - args: { - dest_ip: data?.destIp, - msg_type: data?.snmpMsgType, +export const deleteSnmpSet = createAsyncThunk( + 'config/deleteSnmpSet', + async ( + data: { + ipList: string[] + destIp: string + snmpMsgType: string }, - } + { getState, dispatch } + ) => { + const currentState = getState() as RootState + const token = selectToken(currentState) + const organization = selectOrganizationName(currentState) + let body = {} - const response = await RsuApi.postRsuData(token, organization, body, '') + body = { + command: 'rsufwdsnmpset-del', + rsu_ip: data?.ipList, + args: { + dest_ip: data?.destIp, + msg_type: data?.snmpMsgType, + }, + } - return response.status === 200 - ? { changeSuccess: true, errorState: '' } - : { changeSuccess: false, errorState: response.body.RsuFwdSnmpset } -}) + const response = await RsuApi.postRsuData(token, organization, body, '') + + return response.status === 200 + ? { changeSuccess: true, errorState: '' } + : { changeSuccess: false, errorState: response.body.RsuFwdSnmpset } + } +) export const filterSnmp = createAsyncThunk('config/filterSnmp', async (ipList, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -104,7 +115,7 @@ export const filterSnmp = createAsyncThunk('config/filterSnmp', async (ipList, { }) export const rebootRsu = createAsyncThunk('config/rebootRsu', async (ipList, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -122,7 +133,7 @@ export const rebootRsu = createAsyncThunk('config/rebootRsu', async (ipList, { g export const geoRsuQuery = createAsyncThunk( 'config/geoRsuQuery', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) const configCoordinates = selectConfigCoordinates(currentState) @@ -140,7 +151,7 @@ export const geoRsuQuery = createAsyncThunk( { // Will guard thunk from being executed condition: (_, { getState, extra }) => { - const currentState = getState() + const currentState = getState() as RootState as RootState const configCoordinates = selectConfigCoordinates(currentState) const valid = configCoordinates.length > 2 @@ -176,7 +187,7 @@ export const configSlice = createSlice({ clearConfig: (state) => { state.value.configCoordinates = [] state.value.configList = [] - state.value.loading = false + state.loading = false }, }, extraReducers: (builder) => { @@ -190,7 +201,7 @@ export const configSlice = createSlice({ state.value.snmpMsgType = 'bsm' state.value.changeSuccess = false state.value.snmpFilterErr = false - state.rebootChangeSuccess = false + state.value.rebootChangeSuccess = false console.debug('Pending refreshSnmpFwdConfig', state.loading) }) .addCase(refreshSnmpFwdConfig.fulfilled, (state, action) => { @@ -261,7 +272,7 @@ export const configSlice = createSlice({ state.value.snmpMsgType = 'bsm' state.value.changeSuccess = false state.value.snmpFilterErr = false - state.rebootChangeSuccess = false + state.value.rebootChangeSuccess = false }) .addCase(geoRsuQuery.fulfilled, (state, action) => { state.value.configList = action.payload.body @@ -274,19 +285,18 @@ export const configSlice = createSlice({ }, }) -export const selectMsgFwdConfig = (state) => state.config.value.msgFwdConfig -export const selectChangeSuccess = (state) => state.config.value.changeSuccess -export const selectRebootChangeSuccess = (state) => state.config.value.rebootChangeSuccess -export const selectErrorState = (state) => state.config.value.errorState -export const selectDestIp = (state) => state.config.value.destIp -export const selectSnmpMsgType = (state) => state.config.value.snmpMsgType -export const selectSnmpFilterMsg = (state) => state.config.value.snmpFilterMsg -export const selectSnmpFilterErr = (state) => state.config.value.snmpFilterErr -export const selectLoading = (state) => state.config.loading -export const selectAddConfigPoint = (state) => state.config.value.addConfigPoint -export const selectConfigCoordinates = (state) => state.config.value.configCoordinates -export const selectConfigList = (state) => state.config.value.configList -export const selectConfigLoading = (state) => state.config.rsuLoading +export const selectMsgFwdConfig = (state: RootState) => state.config.value.msgFwdConfig +export const selectChangeSuccess = (state: RootState) => state.config.value.changeSuccess +export const selectRebootChangeSuccess = (state: RootState) => state.config.value.rebootChangeSuccess +export const selectErrorState = (state: RootState) => state.config.value.errorState +export const selectDestIp = (state: RootState) => state.config.value.destIp +export const selectSnmpMsgType = (state: RootState) => state.config.value.snmpMsgType +export const selectSnmpFilterMsg = (state: RootState) => state.config.value.snmpFilterMsg +export const selectSnmpFilterErr = (state: RootState) => state.config.value.snmpFilterErr +export const selectLoading = (state: RootState) => state.config.loading +export const selectAddConfigPoint = (state: RootState) => state.config.value.addConfigPoint +export const selectConfigCoordinates = (state: RootState) => state.config.value.configCoordinates +export const selectConfigList = (state: RootState) => state.config.value.configList export const { setMsgFwdConfig, setDestIp, setMsgType, toggleConfigPointSelect, updateConfigPoints, clearConfig } = configSlice.actions diff --git a/webapp/src/generalSlices/rsuSlice.test.js b/webapp/src/generalSlices/rsuSlice.test.ts similarity index 100% rename from webapp/src/generalSlices/rsuSlice.test.js rename to webapp/src/generalSlices/rsuSlice.test.ts diff --git a/webapp/src/generalSlices/rsuSlice.js b/webapp/src/generalSlices/rsuSlice.ts similarity index 81% rename from webapp/src/generalSlices/rsuSlice.js rename to webapp/src/generalSlices/rsuSlice.ts index 93ec37027..0714af189 100644 --- a/webapp/src/generalSlices/rsuSlice.js +++ b/webapp/src/generalSlices/rsuSlice.ts @@ -46,7 +46,7 @@ export const updateMessageType = (messageType) => async (dispatch) => { export const getRsuData = createAsyncThunk( 'rsu/getRsuData', async (_, { getState, dispatch }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -76,7 +76,7 @@ export const getRsuData = createAsyncThunk( ) export const getRsuInfoOnly = createAsyncThunk('rsu/getRsuInfoOnly', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) const rsuInfo = await RsuApi.getRsuInfo(token, organization) @@ -85,7 +85,7 @@ export const getRsuInfoOnly = createAsyncThunk('rsu/getRsuInfoOnly', async (_, { }) export const getRsuLastOnline = createAsyncThunk('rsu/getRsuLastOnline', async (rsu_ip, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) const rsuLastOnline = await RsuApi.getRsuOnline(token, organization, '', { rsu_ip }) @@ -93,7 +93,7 @@ export const getRsuLastOnline = createAsyncThunk('rsu/getRsuLastOnline', async ( }) export const _getRsuInfo = createAsyncThunk('rsu/_getRsuInfo', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) const rsuInfo = await RsuApi.getRsuInfo(token, organization) @@ -105,7 +105,7 @@ export const _getRsuInfo = createAsyncThunk('rsu/_getRsuInfo', async (_, { getSt export const _getRsuOnlineStatus = createAsyncThunk( 'rsu/_getRsuOnlineStatus', async (rsuOnlineStatusState, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) const rsuOnlineStatus = (await RsuApi.getRsuOnline(token, organization)) ?? rsuOnlineStatusState @@ -115,7 +115,7 @@ export const _getRsuOnlineStatus = createAsyncThunk( ) export const _getRsuCounts = createAsyncThunk('rsu/_getRsuCounts', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -139,7 +139,7 @@ export const _getRsuCounts = createAsyncThunk('rsu/_getRsuCounts', async (_, { g }) export const _getRsuMapInfo = createAsyncThunk('rsu/_getRsuMapInfo', async ({ startDate, endDate }, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) let local_date = DateTime.local({ zone: 'America/Denver' }) @@ -158,7 +158,7 @@ export const _getRsuMapInfo = createAsyncThunk('rsu/_getRsuMapInfo', async ({ st }) export const getSsmSrmData = createAsyncThunk('rsu/getSsmSrmData', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) return await RsuApi.getSsmSrmData(token) }) @@ -166,7 +166,7 @@ export const getSsmSrmData = createAsyncThunk('rsu/getSsmSrmData', async (_, { g export const getIssScmsStatus = createAsyncThunk( 'rsu/getIssScmsStatus', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -180,7 +180,7 @@ export const getIssScmsStatus = createAsyncThunk( export const updateRowData = createAsyncThunk( 'rsu/updateRowData', async (data, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -222,7 +222,7 @@ export const updateRowData = createAsyncThunk( export const updateBsmData = createAsyncThunk( 'rsu/updateBsmData', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) try { @@ -243,7 +243,7 @@ export const updateBsmData = createAsyncThunk( { // Will guard thunk from being executed condition: (_, { getState }) => { - const { rsu } = getState() + const { rsu } = getState() as RootState const valid = rsu.value.bsmStart !== '' && rsu.value.bsmEnd !== '' && rsu.value.bsmCoordinates.length > 2 return valid }, @@ -253,7 +253,7 @@ export const updateBsmData = createAsyncThunk( export const getMapData = createAsyncThunk( 'rsu/getMapData', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) const selectedRsu = selectSelectedRsu(currentState) @@ -467,41 +467,41 @@ export const rsuSlice = createSlice({ }, }) -export const selectLoading = (state) => state.rsu.loading -export const selectRequestOut = (state) => state.rsu.requestOut - -export const selectSelectedRsu = (state) => state.rsu.value.selectedRsu -export const selectRsuManufacturer = (state) => state.rsu.value.selectedRsu?.properties?.manufacturer_name -export const selectRsuIpv4 = (state) => state.rsu.value.selectedRsu?.properties?.ipv4_address -export const selectRsuPrimaryRoute = (state) => state.rsu.value.selectedRsu?.properties?.primary_route -export const selectRsuData = (state) => state.rsu.value.rsuData -export const selectRsuOnlineStatus = (state) => state.rsu.value.rsuOnlineStatus -export const selectRsuCounts = (state) => state.rsu.value.rsuCounts -export const selectCountList = (state) => state.rsu.value.countList -export const selectCurrentSort = (state) => state.rsu.value.currentSort -export const selectStartDate = (state) => state.rsu.value.startDate -export const selectEndDate = (state) => state.rsu.value.endDate -export const selectMessageLoading = (state) => state.rsu.value.messageLoading -export const selectWarningMessage = (state) => state.rsu.value.warningMessage -export const selectMsgType = (state) => state.rsu.value.msgType -export const selectRsuMapData = (state) => state.rsu.value.rsuMapData -export const selectMapList = (state) => state.rsu.value.mapList -export const selectMapDate = (state) => state.rsu.value.mapDate -export const selectDisplayMap = (state) => state.rsu.value.displayMap -export const selectBsmStart = (state) => state.rsu.value.bsmStart -export const selectBsmEnd = (state) => state.rsu.value.bsmEnd -export const selectAddBsmPoint = (state) => state.rsu.value.addBsmPoint -export const selectBsmCoordinates = (state) => state.rsu.value.bsmCoordinates -export const selectBsmData = (state) => state.rsu.value.bsmData -export const selectBsmDateError = (state) => state.rsu.value.bsmDateError -export const selectBsmFilter = (state) => state.rsu.value.bsmFilter -export const selectBsmFilterStep = (state) => state.rsu.value.bsmFilterStep -export const selectBsmFilterOffset = (state) => state.rsu.value.bsmFilterOffset -export const selectIssScmsStatusData = (state) => state.rsu.value.issScmsStatusData -export const selectSsmDisplay = (state) => state.rsu.value.ssmDisplay -export const selectSrmSsmList = (state) => state.rsu.value.srmSsmList -export const selectSelectedSrm = (state) => state.rsu.value.selectedSrm -export const selectHeatMapData = (state) => state.rsu.value.heatMapData +export const selectLoading = (state: RootState) => state.rsu.loading +export const selectRequestOut = (state: RootState) => state.rsu.requestOut + +export const selectSelectedRsu = (state: RootState) => state.rsu.value.selectedRsu +export const selectRsuManufacturer = (state: RootState) => state.rsu.value.selectedRsu?.properties?.manufacturer_name +export const selectRsuIpv4 = (state: RootState) => state.rsu.value.selectedRsu?.properties?.ipv4_address +export const selectRsuPrimaryRoute = (state: RootState) => state.rsu.value.selectedRsu?.properties?.primary_route +export const selectRsuData = (state: RootState) => state.rsu.value.rsuData +export const selectRsuOnlineStatus = (state: RootState) => state.rsu.value.rsuOnlineStatus +export const selectRsuCounts = (state: RootState) => state.rsu.value.rsuCounts +export const selectCountList = (state: RootState) => state.rsu.value.countList +export const selectCurrentSort = (state: RootState) => state.rsu.value.currentSort +export const selectStartDate = (state: RootState) => state.rsu.value.startDate +export const selectEndDate = (state: RootState) => state.rsu.value.endDate +export const selectMessageLoading = (state: RootState) => state.rsu.value.messageLoading +export const selectWarningMessage = (state: RootState) => state.rsu.value.warningMessage +export const selectMsgType = (state: RootState) => state.rsu.value.msgType +export const selectRsuMapData = (state: RootState) => state.rsu.value.rsuMapData +export const selectMapList = (state: RootState) => state.rsu.value.mapList +export const selectMapDate = (state: RootState) => state.rsu.value.mapDate +export const selectDisplayMap = (state: RootState) => state.rsu.value.displayMap +export const selectBsmStart = (state: RootState) => state.rsu.value.bsmStart +export const selectBsmEnd = (state: RootState) => state.rsu.value.bsmEnd +export const selectAddBsmPoint = (state: RootState) => state.rsu.value.addBsmPoint +export const selectBsmCoordinates = (state: RootState) => state.rsu.value.bsmCoordinates +export const selectBsmData = (state: RootState) => state.rsu.value.bsmData +export const selectBsmDateError = (state: RootState) => state.rsu.value.bsmDateError +export const selectBsmFilter = (state: RootState) => state.rsu.value.bsmFilter +export const selectBsmFilterStep = (state: RootState) => state.rsu.value.bsmFilterStep +export const selectBsmFilterOffset = (state: RootState) => state.rsu.value.bsmFilterOffset +export const selectIssScmsStatusData = (state: RootState) => state.rsu.value.issScmsStatusData +export const selectSsmDisplay = (state: RootState) => state.rsu.value.ssmDisplay +export const selectSrmSsmList = (state: RootState) => state.rsu.value.srmSsmList +export const selectSelectedSrm = (state: RootState) => state.rsu.value.selectedSrm +export const selectHeatMapData = (state: RootState) => state.rsu.value.heatMapData export const { selectRsu, diff --git a/webapp/src/generalSlices/userSlice.test.js b/webapp/src/generalSlices/userSlice.test.ts similarity index 100% rename from webapp/src/generalSlices/userSlice.test.js rename to webapp/src/generalSlices/userSlice.test.ts diff --git a/webapp/src/generalSlices/userSlice.js b/webapp/src/generalSlices/userSlice.tsx similarity index 70% rename from webapp/src/generalSlices/userSlice.js rename to webapp/src/generalSlices/userSlice.tsx index 73eed6bc6..e0141009e 100644 --- a/webapp/src/generalSlices/userSlice.js +++ b/webapp/src/generalSlices/userSlice.tsx @@ -1,11 +1,12 @@ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit' import AuthApi from '../apis/auth-api' import { UserManager, LocalStorageManager } from '../managers' +import { RootState } from '../store' const authDataLocalStorage = LocalStorageManager.getAuthData() const authLoginData = UserManager.isLoginActive(authDataLocalStorage) ? authDataLocalStorage : null -export const keycloakLogin = createAsyncThunk('user/login', async (token, { dispatch }) => { +export const keycloakLogin = createAsyncThunk('user/login', async (token: string, { dispatch }) => { try { if (token) { const data = await AuthApi.logIn(token) @@ -82,21 +83,22 @@ export const userSlice = createSlice({ export const { logout, changeOrganization, setLoading, setLoginFailure, setKcFailure } = userSlice.actions -export const selectAuthLoginData = (state) => state.user.value.authLoginData -export const selectToken = (state) => state.user.value.authLoginData.token -export const selectRole = (state) => state.user.value.organization?.role -export const selectOrganizationName = (state) => state.user.value.organization?.name -export const selectName = (state) => state.user.value.authLoginData?.data?.name -export const selectEmail = (state) => state.user.value.authLoginData?.data?.email -export const selectSuperUser = (state) => state.user.value.authLoginData?.data?.super_user -export const selectTokenExpiration = (state) => state.user.value.authLoginData?.expires_at -export const selectLoginFailure = (state) => state.user.value.loginFailure -export const selectKcFailure = (state) => state.user.value.kcFailure -export const selectLoading = (state) => state.user.loading -export const selectLoadingGlobal = (state) => { +export const selectAuthLoginData = (state: RootState) => state.user.value.authLoginData +export const selectToken = (state: RootState) => state.user.value.authLoginData?.token +export const selectRole = (state: RootState) => state.user.value.organization?.role +export const selectOrganizationName = (state: RootState) => state.user.value.organization?.name +export const selectName = (state: RootState) => state.user.value.authLoginData?.data?.name +export const selectEmail = (state: RootState) => state.user.value.authLoginData?.data?.email +export const selectSuperUser = (state: RootState) => state.user.value.authLoginData?.data?.super_user +export const selectTokenExpiration = (state: RootState) => state.user.value.authLoginData?.expires_at +export const selectLoginFailure = (state: RootState) => state.user.value.loginFailure +export const selectKcFailure = (state: RootState) => state.user.value.kcFailure +export const selectLoading = (state: RootState) => state.user.loading +export const selectLoadingGlobal = (state: RootState) => { let loading = false for (const [key, value] of Object.entries(state)) { - if (value.loading) { + const valueObj = value as Object + if ('loading' in valueObj && valueObj.loading) { loading = true break } diff --git a/webapp/src/generalSlices/wzdxSlice.test.js b/webapp/src/generalSlices/wzdxSlice.test.ts similarity index 100% rename from webapp/src/generalSlices/wzdxSlice.test.js rename to webapp/src/generalSlices/wzdxSlice.test.ts diff --git a/webapp/src/generalSlices/wzdxSlice.js b/webapp/src/generalSlices/wzdxSlice.ts similarity index 83% rename from webapp/src/generalSlices/wzdxSlice.js rename to webapp/src/generalSlices/wzdxSlice.ts index 57dcc4b78..5226517f6 100644 --- a/webapp/src/generalSlices/wzdxSlice.js +++ b/webapp/src/generalSlices/wzdxSlice.ts @@ -5,7 +5,7 @@ import { selectToken } from './userSlice' const initialState = { type: 'FeatureCollection', features: [] } export const getWzdxData = createAsyncThunk('wzdx/getWzdxData', async (_, { getState }) => { - const currentState = getState() + const currentState = getState() as RootState const token = selectToken(currentState) return await RsuApi.getWzdxData(token) }) @@ -32,7 +32,7 @@ export const wzdxSlice = createSlice({ }, }) -export const selectWzdxData = (state) => state.wzdx.value -export const selectLoading = (state) => state.wzdx.loading +export const selectWzdxData = (state: RootState) => state.wzdx.value +export const selectLoading = (state: RootState) => state.wzdx.loading export default wzdxSlice.reducer diff --git a/webapp/src/index.js b/webapp/src/index.tsx similarity index 100% rename from webapp/src/index.js rename to webapp/src/index.tsx diff --git a/webapp/src/keycloak-config.js b/webapp/src/keycloak-config.tsx similarity index 96% rename from webapp/src/keycloak-config.js rename to webapp/src/keycloak-config.tsx index 97b843c8b..8619d0279 100644 --- a/webapp/src/keycloak-config.js +++ b/webapp/src/keycloak-config.tsx @@ -1,10 +1,10 @@ -import Keycloak from 'keycloak-js' -import EnvironmentVars from './EnvironmentVars' - -const keycloak = new Keycloak({ - url: `${EnvironmentVars.KEYCLOAK_HOST_URL}`, - realm: 'cvmanager', - clientId: 'cvmanager-gui', -}) - -export default keycloak +import Keycloak from 'keycloak-js' +import EnvironmentVars from './EnvironmentVars' + +const keycloak = new Keycloak({ + url: `${EnvironmentVars.KEYCLOAK_HOST_URL}`, + realm: 'cvmanager', + clientId: 'cvmanager-gui', +}) + +export default keycloak diff --git a/webapp/src/managers.js b/webapp/src/managers.tsx similarity index 77% rename from webapp/src/managers.js rename to webapp/src/managers.tsx index 1cdccf47d..c9a3d957a 100644 --- a/webapp/src/managers.js +++ b/webapp/src/managers.tsx @@ -1,10 +1,10 @@ const AUTH_DATA_LOCAL_STORAGE_KEY = 'authLoginData' const LocalStorageManager = { - getAuthData: () => { + getAuthData: (): AuthLoginData | null => { return JSON.parse(localStorage.getItem(AUTH_DATA_LOCAL_STORAGE_KEY)) }, - setAuthData: (authData) => { + setAuthData: (authData: AuthLoginData) => { return localStorage.setItem(AUTH_DATA_LOCAL_STORAGE_KEY, JSON.stringify(authData)) }, removeAuthData: () => { @@ -13,7 +13,7 @@ const LocalStorageManager = { } const UserManager = { - getOrganization: (authLoginData, organizationName) => { + getOrganization: (authLoginData: AuthLoginData, organizationName: string) => { let updatedOrg = null for (var i = 0; i < authLoginData.data.organizations.length; i++) { if (organizationName === authLoginData.data.organizations[i].name) { @@ -22,7 +22,7 @@ const UserManager = { } return updatedOrg }, - isLoginActive: (authLoginData) => { + isLoginActive: (authLoginData: AuthLoginData) => { return authLoginData && Date.now() < authLoginData.expires_at }, } diff --git a/webapp/src/store.js b/webapp/src/store.tsx similarity index 95% rename from webapp/src/store.js rename to webapp/src/store.tsx index 7282ed54d..658ab8de9 100644 --- a/webapp/src/store.js +++ b/webapp/src/store.tsx @@ -39,3 +39,7 @@ export const setupStore = (preloadedState) => { preloadedState, }) } + +const tempState = setupStore({}).getState + +export type RootState = ReturnType diff --git a/webapp/src/types/UserTypes.d.ts b/webapp/src/types/UserTypes.d.ts new file mode 100644 index 000000000..c87a42004 --- /dev/null +++ b/webapp/src/types/UserTypes.d.ts @@ -0,0 +1,13 @@ +type AuthLoginData = { + data: { + name: string + email: string + super_user: boolean + organizations: Array<{ + name: string + role: string + }> + } + token: string + expires_at: number +} diff --git a/webapp/tsconfig.json b/webapp/tsconfig.json index 6f8f4b7df..9609c480c 100644 --- a/webapp/tsconfig.json +++ b/webapp/tsconfig.json @@ -8,6 +8,8 @@ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - "noImplicitAny": false + "noImplicitAny": true, + "jsx": "react", + "esModuleInterop": true } } From 31da8807718a3aff26f0c30a07bd5797d807839d Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Mon, 13 Nov 2023 17:12:15 -0700 Subject: [PATCH 11/70] Creating API types --- webapp/src/apis/api-helper.ts | 2 +- .../example_responses/admin-new-rsu_get.json | 8 + .../admin-new-rsu_post_body.json | 13 + .../admin-new-rsu_post_resp.json | 1 + .../example_responses/admin-new-user_get.json | 1 + .../admin-new-user_post_body.json | 7 + .../apis/example_responses/admin-org_get.json | 8 + .../admin-org_patch_body.json | 9 + .../admin-org_patch_resp.json | 1 + .../example_responses/admin-rsu_delete.json | 1 + .../apis/example_responses/admin-rsu_get.json | 199 + .../admin-rsu_patch_body.json | 15 + .../admin-rsu_path_resp.json | 1 + .../example_responses/admin-user_delete.json | 1 + .../example_responses/admin-user_get.json | 97 + .../admin-user_patch_body.json | 10 + .../admin-user_patch_resp.json | 1 + .../admin_new_user_resp.json | 1 + .../iss-scms-status_get.json | 74 + webapp/src/apis/example_responses/log.txt | 4397 +++++++++++++++++ .../rsu-bsm-data_post_body.json | 13 + .../rsu-bsm-data_post_resp.json | 1 + .../rsu-command_post_rsufwdsnmpwalk.json | 40 + .../example_responses/rsu-map-info_get.json | 28 + .../rsu-online-status_get.json | 185 + .../apis/example_responses/rsucounts_get.json | 121 + .../apis/example_responses/rsuinfo_get.json | 214 + webapp/src/apis/rsu-api-types.ts | 71 + webapp/src/apis/rsu-api.d.ts | 0 webapp/src/apis/rsu-api.ts | 83 +- webapp/src/constants.tsx | 3 +- .../AdminEditOrganization.tsx | 2 + webapp/src/generalSlices/configSlice.ts | 4 +- webapp/src/generalSlices/rsuSlice.ts | 36 +- .../pages/{Admin.test.js => Admin.test.ts} | 0 webapp/src/pages/{Admin.js => Admin.tsx} | 110 +- webapp/src/pages/{Map.test.js => Map.test.ts} | 0 webapp/src/pages/{Map.js => Map.tsx} | 2186 ++++---- ...{RsuMapView.test.js => RsuMapView.test.ts} | 0 .../pages/{RsuMapView.js => RsuMapView.tsx} | 28 +- .../src/types/GenericFeatureCollection.d.ts | 29 + webapp/src/types/wzdx/WzdxWorkZoneFeed42.d.ts | 105 + .../types/wzdx/work_zone_feed_schema_42.json | 60 + 43 files changed, 6985 insertions(+), 1181 deletions(-) create mode 100644 webapp/src/apis/example_responses/admin-new-rsu_get.json create mode 100644 webapp/src/apis/example_responses/admin-new-rsu_post_body.json create mode 100644 webapp/src/apis/example_responses/admin-new-rsu_post_resp.json create mode 100644 webapp/src/apis/example_responses/admin-new-user_get.json create mode 100644 webapp/src/apis/example_responses/admin-new-user_post_body.json create mode 100644 webapp/src/apis/example_responses/admin-org_get.json create mode 100644 webapp/src/apis/example_responses/admin-org_patch_body.json create mode 100644 webapp/src/apis/example_responses/admin-org_patch_resp.json create mode 100644 webapp/src/apis/example_responses/admin-rsu_delete.json create mode 100644 webapp/src/apis/example_responses/admin-rsu_get.json create mode 100644 webapp/src/apis/example_responses/admin-rsu_patch_body.json create mode 100644 webapp/src/apis/example_responses/admin-rsu_path_resp.json create mode 100644 webapp/src/apis/example_responses/admin-user_delete.json create mode 100644 webapp/src/apis/example_responses/admin-user_get.json create mode 100644 webapp/src/apis/example_responses/admin-user_patch_body.json create mode 100644 webapp/src/apis/example_responses/admin-user_patch_resp.json create mode 100644 webapp/src/apis/example_responses/admin_new_user_resp.json create mode 100644 webapp/src/apis/example_responses/iss-scms-status_get.json create mode 100644 webapp/src/apis/example_responses/log.txt create mode 100644 webapp/src/apis/example_responses/rsu-bsm-data_post_body.json create mode 100644 webapp/src/apis/example_responses/rsu-bsm-data_post_resp.json create mode 100644 webapp/src/apis/example_responses/rsu-command_post_rsufwdsnmpwalk.json create mode 100644 webapp/src/apis/example_responses/rsu-map-info_get.json create mode 100644 webapp/src/apis/example_responses/rsu-online-status_get.json create mode 100644 webapp/src/apis/example_responses/rsucounts_get.json create mode 100644 webapp/src/apis/example_responses/rsuinfo_get.json create mode 100644 webapp/src/apis/rsu-api-types.ts delete mode 100644 webapp/src/apis/rsu-api.d.ts rename webapp/src/pages/{Admin.test.js => Admin.test.ts} (100%) rename webapp/src/pages/{Admin.js => Admin.tsx} (88%) rename webapp/src/pages/{Map.test.js => Map.test.ts} (100%) rename webapp/src/pages/{Map.js => Map.tsx} (91%) rename webapp/src/pages/{RsuMapView.test.js => RsuMapView.test.ts} (100%) rename webapp/src/pages/{RsuMapView.js => RsuMapView.tsx} (88%) create mode 100644 webapp/src/types/GenericFeatureCollection.d.ts create mode 100644 webapp/src/types/wzdx/WzdxWorkZoneFeed42.d.ts create mode 100644 webapp/src/types/wzdx/work_zone_feed_schema_42.json diff --git a/webapp/src/apis/api-helper.ts b/webapp/src/apis/api-helper.ts index 627d52c3b..d6fc7b920 100644 --- a/webapp/src/apis/api-helper.ts +++ b/webapp/src/apis/api-helper.ts @@ -118,7 +118,7 @@ class ApiHelper { additional_headers = {}, }: { url: string - body: Object + body: Object | string token?: string query_params?: Record url_ext?: string diff --git a/webapp/src/apis/example_responses/admin-new-rsu_get.json b/webapp/src/apis/example_responses/admin-new-rsu_get.json new file mode 100644 index 000000000..c34ba2f1f --- /dev/null +++ b/webapp/src/apis/example_responses/admin-new-rsu_get.json @@ -0,0 +1,8 @@ +{ + "primary_routes": ["C470", "I225", "I25", "I270", "I70", "I76", "Region 1"], + "rsu_models": ["Commsignia ITS-RS4-M", "Kapsch RIS-9160", "Kapsch RIS-9260", "Kapsch RIS-9360", "Yunex RSU2X US"], + "ssh_credential_groups": ["Commsignia BUILD", "I70", "Region 1", "Yunex BUILD"], + "snmp_credential_groups": ["Commsignia BUILD", "I70", "Region 1", "Yunex BUILD"], + "snmp_version_groups": ["12.18", "4.1"], + "organizations": ["brandon_test_org", "CDOT CV", "Region 1", "testorg"] +} diff --git a/webapp/src/apis/example_responses/admin-new-rsu_post_body.json b/webapp/src/apis/example_responses/admin-new-rsu_post_body.json new file mode 100644 index 000000000..c3897050b --- /dev/null +++ b/webapp/src/apis/example_responses/admin-new-rsu_post_body.json @@ -0,0 +1,13 @@ +{ + "ip": "1.1.1.1", + "milepost": 1, + "serial_number": "1234", + "scms_id": "1234", + "geo_position": { "latitude": 12, "longitude": 23 }, + "primary_route": "C470", + "model": "Commsignia ITS-RS4-M", + "ssh_credential_group": "Commsignia BUILD", + "snmp_credential_group": "Commsignia BUILD", + "snmp_version_group": "12.18", + "organizations": ["CDOT CV"] +} diff --git a/webapp/src/apis/example_responses/admin-new-rsu_post_resp.json b/webapp/src/apis/example_responses/admin-new-rsu_post_resp.json new file mode 100644 index 000000000..cd633886b --- /dev/null +++ b/webapp/src/apis/example_responses/admin-new-rsu_post_resp.json @@ -0,0 +1 @@ +{ "message": "New RSU successfully added" } diff --git a/webapp/src/apis/example_responses/admin-new-user_get.json b/webapp/src/apis/example_responses/admin-new-user_get.json new file mode 100644 index 000000000..9526463de --- /dev/null +++ b/webapp/src/apis/example_responses/admin-new-user_get.json @@ -0,0 +1 @@ +{ "organizations": ["brandon_test_org", "CDOT CV", "Region 1", "testorg"], "roles": ["admin", "operator", "user"] } diff --git a/webapp/src/apis/example_responses/admin-new-user_post_body.json b/webapp/src/apis/example_responses/admin-new-user_post_body.json new file mode 100644 index 000000000..c4e3edcec --- /dev/null +++ b/webapp/src/apis/example_responses/admin-new-user_post_body.json @@ -0,0 +1,7 @@ +{ + "email": "test@test.com", + "first_name": "test", + "last_name": "test", + "super_user": true, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] +} diff --git a/webapp/src/apis/example_responses/admin-org_get.json b/webapp/src/apis/example_responses/admin-org_get.json new file mode 100644 index 000000000..da53edfd9 --- /dev/null +++ b/webapp/src/apis/example_responses/admin-org_get.json @@ -0,0 +1,8 @@ +{ + "org_data": [ + { "name": "CDOT CV", "user_count": 12, "rsu_count": 313 }, + { "name": "brandon_test_org", "user_count": 0, "rsu_count": 0 }, + { "name": "Region 1", "user_count": 3, "rsu_count": 28 }, + { "name": "testorg", "user_count": 0, "rsu_count": 0 } + ] +} diff --git a/webapp/src/apis/example_responses/admin-org_patch_body.json b/webapp/src/apis/example_responses/admin-org_patch_body.json new file mode 100644 index 000000000..78fbd90b2 --- /dev/null +++ b/webapp/src/apis/example_responses/admin-org_patch_body.json @@ -0,0 +1,9 @@ +{ + "orig_name": "CDOT CV", + "name": "CDOT CV", + "users_to_add": [], + "users_to_modify": [{ "email": "test@test.com", "role": "admin" }], + "users_to_remove": [], + "rsus_to_add": [], + "rsus_to_remove": ["1.1.1.1"] +} diff --git a/webapp/src/apis/example_responses/admin-org_patch_resp.json b/webapp/src/apis/example_responses/admin-org_patch_resp.json new file mode 100644 index 000000000..00544c6cc --- /dev/null +++ b/webapp/src/apis/example_responses/admin-org_patch_resp.json @@ -0,0 +1 @@ +{ "message": "Organization successfully modified" } diff --git a/webapp/src/apis/example_responses/admin-rsu_delete.json b/webapp/src/apis/example_responses/admin-rsu_delete.json new file mode 100644 index 000000000..423562fe9 --- /dev/null +++ b/webapp/src/apis/example_responses/admin-rsu_delete.json @@ -0,0 +1 @@ +{ "message": "RSU successfully deleted" } diff --git a/webapp/src/apis/example_responses/admin-rsu_get.json b/webapp/src/apis/example_responses/admin-rsu_get.json new file mode 100644 index 000000000..e001b7372 --- /dev/null +++ b/webapp/src/apis/example_responses/admin-rsu_get.json @@ -0,0 +1,199 @@ +{ + "rsu_data": [ + { + "ip": "172.16.28.219", + "geo_position": { "latitude": 39.57312, "longitude": -106.11322 }, + "milepost": 200.68, + "primary_route": "I70", + "serial_number": "RSE00331", + "scms_id": "RSE00331", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.209", + "geo_position": { "latitude": 39.57817, "longitude": -106.11222 }, + "milepost": 201.1, + "primary_route": "I70", + "serial_number": "RSE00341", + "scms_id": "RSE00341", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.214", + "geo_position": { "latitude": 39.59222, "longitude": -106.09605 }, + "milepost": 202.35, + "primary_route": "I70", + "serial_number": "RSE00316", + "scms_id": "RSE00316", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.220", + "geo_position": { "latitude": 39.60247, "longitude": -106.08566 }, + "milepost": 203.3, + "primary_route": "I70", + "serial_number": "RZQ00085", + "scms_id": "RZQ00085", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.185", + "geo_position": { "latitude": 39.61979, "longitude": -106.07284 }, + "milepost": 204.67, + "primary_route": "I70", + "serial_number": "SEM00009", + "scms_id": "SEM00009", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.202", + "geo_position": { "latitude": 39.62442, "longitude": -106.07247 }, + "milepost": 205, + "primary_route": "I70", + "serial_number": "RSE00330", + "scms_id": "RSE00330", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.163", + "geo_position": { "latitude": 39.63075, "longitude": -106.06272 }, + "milepost": 205.7, + "primary_route": "I70", + "serial_number": "RFS00073", + "scms_id": "RFS00073", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.154", + "geo_position": { "latitude": 39.63993, "longitude": -106.04507 }, + "milepost": 206.84, + "primary_route": "I70", + "serial_number": "RSE00334", + "scms_id": "RSE00334", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.197", + "geo_position": { "latitude": 39.6414, "longitude": -106.04239 }, + "milepost": 207.04, + "primary_route": "I70", + "serial_number": "RSE00315", + "scms_id": "RSE00315", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.235", + "geo_position": { "latitude": 39.65298, "longitude": -106.01213 }, + "milepost": 208.91, + "primary_route": "I70", + "serial_number": "RZQ00084", + "scms_id": "RZQ00084", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.184", + "geo_position": { "latitude": 39.65664, "longitude": -105.99598 }, + "milepost": 209.8, + "primary_route": "I70", + "serial_number": "RFS00074", + "scms_id": "RFS00074", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.233", + "geo_position": { "latitude": 39.62009, "longitude": -106.47159 }, + "milepost": 169.52, + "primary_route": "I70", + "serial_number": "RSE00308", + "scms_id": "RSE00308", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.156", + "geo_position": { "latitude": 39.61257, "longitude": -106.45896 }, + "milepost": 170.5, + "primary_route": "I70", + "serial_number": "SEM00004", + "scms_id": "SEM00004", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.135", + "geo_position": { "latitude": 39.61471, "longitude": -106.44254 }, + "milepost": 171.8, + "primary_route": "I70", + "serial_number": "RZQ00090", + "scms_id": "RZQ00090", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + }, + { + "ip": "172.16.28.165", + "geo_position": { "latitude": 39.61624, "longitude": -106.43809 }, + "milepost": 172.1, + "primary_route": "I70", + "serial_number": "SPP00068", + "scms_id": "SPP00068", + "model": "Kapsch RIS-9260", + "ssh_credential_group": "I70", + "snmp_credential_group": "I70", + "snmp_version_group": "4.1", + "organizations": ["CDOT CV"] + } + ] +} diff --git a/webapp/src/apis/example_responses/admin-rsu_patch_body.json b/webapp/src/apis/example_responses/admin-rsu_patch_body.json new file mode 100644 index 000000000..5a832c21a --- /dev/null +++ b/webapp/src/apis/example_responses/admin-rsu_patch_body.json @@ -0,0 +1,15 @@ +{ + "orig_ip": "10.16.28.89", + "ip": "10.16.28.89", + "geo_position": { "latitude": 39.558933, "longitude": -105.006405 }, + "milepost": 18.6, + "primary_route": "C470", + "serial_number": "2149401003477", + "model": "Commsignia ITS-RS4-M", + "scms_id": "2149401003477", + "ssh_credential_group": "Commsignia BUILD", + "snmp_credential_group": "Commsignia BUILD", + "snmp_version_group": "4.1", + "organizations_to_add": [], + "organizations_to_remove": [] +} diff --git a/webapp/src/apis/example_responses/admin-rsu_path_resp.json b/webapp/src/apis/example_responses/admin-rsu_path_resp.json new file mode 100644 index 000000000..c625ccadf --- /dev/null +++ b/webapp/src/apis/example_responses/admin-rsu_path_resp.json @@ -0,0 +1 @@ +{ "message": "RSU successfully modified" } diff --git a/webapp/src/apis/example_responses/admin-user_delete.json b/webapp/src/apis/example_responses/admin-user_delete.json new file mode 100644 index 000000000..ab511999d --- /dev/null +++ b/webapp/src/apis/example_responses/admin-user_delete.json @@ -0,0 +1 @@ +{ "message": "User successfully deleted" } diff --git a/webapp/src/apis/example_responses/admin-user_get.json b/webapp/src/apis/example_responses/admin-user_get.json new file mode 100644 index 000000000..17761f491 --- /dev/null +++ b/webapp/src/apis/example_responses/admin-user_get.json @@ -0,0 +1,97 @@ +{ + "user_data": [ + { + "email": "bpayne@trihydro.com", + "first_name": "Brandon", + "last_name": "Payne", + "super_user": true, + "organizations": [ + { "name": "CDOT CV", "role": "admin" }, + { "name": "Region 1", "role": "admin" } + ] + }, + { + "email": "drewjj901@gmail.com", + "first_name": "Drew", + "last_name": "Johnston", + "super_user": true, + "organizations": [ + { "name": "CDOT CV", "role": "admin" }, + { "name": "Region 1", "role": "admin" } + ] + }, + { + "email": "tonyenglish11@gmail.com", + "first_name": "Tony", + "last_name": "English", + "super_user": true, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] + }, + { + "email": "mwodahl@trihydro.com", + "first_name": "Marc", + "last_name": "Wodahl", + "super_user": false, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] + }, + { + "email": "ivan.neaera@gmail.com", + "first_name": "Ivan", + "last_name": "Yourshaw", + "super_user": false, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] + }, + { + "email": "jfrye@neaeraconsulting.com", + "first_name": "Jacob", + "last_name": "Frye", + "super_user": true, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] + }, + { + "email": "dstephensontrihydro@gmail.com", + "first_name": "Daniel", + "last_name": "Stephenson", + "super_user": true, + "organizations": [ + { "name": "CDOT CV", "role": "admin" }, + { "name": "Region 1", "role": "admin" } + ] + }, + { + "email": "debbieneaeraconsulting@gmail.com", + "first_name": "Debbie", + "last_name": "English", + "super_user": true, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] + }, + { + "email": "michaelenglish47374@gmail.com", + "first_name": "Michael", + "last_name": "English", + "super_user": true, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] + }, + { + "email": "kaylaenglish218@gmail.com", + "first_name": "Kayla", + "last_name": "English", + "super_user": true, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] + }, + { + "email": "test@gmail.com", + "first_name": "test", + "last_name": "test2", + "super_user": false, + "organizations": [{ "name": "CDOT CV", "role": "admin" }] + }, + { + "email": "test@test.test", + "first_name": "test", + "last_name": "test", + "super_user": false, + "organizations": [{ "name": "testorg", "role": "admin" }] + } + ] +} diff --git a/webapp/src/apis/example_responses/admin-user_patch_body.json b/webapp/src/apis/example_responses/admin-user_patch_body.json new file mode 100644 index 000000000..cda59a60e --- /dev/null +++ b/webapp/src/apis/example_responses/admin-user_patch_body.json @@ -0,0 +1,10 @@ +{ + "orig_email": "test@test.test", + "email": "test@test.test", + "first_name": "test", + "last_name": "test", + "super_user": false, + "organizations_to_add": [{ "name": "Region 1", "role": "admin" }], + "organizations_to_modify": [], + "organizations_to_remove": [] +} diff --git a/webapp/src/apis/example_responses/admin-user_patch_resp.json b/webapp/src/apis/example_responses/admin-user_patch_resp.json new file mode 100644 index 000000000..a59a1b82e --- /dev/null +++ b/webapp/src/apis/example_responses/admin-user_patch_resp.json @@ -0,0 +1 @@ +{ "message": "User successfully modified" } diff --git a/webapp/src/apis/example_responses/admin_new_user_resp.json b/webapp/src/apis/example_responses/admin_new_user_resp.json new file mode 100644 index 000000000..6beddf186 --- /dev/null +++ b/webapp/src/apis/example_responses/admin_new_user_resp.json @@ -0,0 +1 @@ +{ "message": "New user successfully added" } diff --git a/webapp/src/apis/example_responses/iss-scms-status_get.json b/webapp/src/apis/example_responses/iss-scms-status_get.json new file mode 100644 index 000000000..b5ea6c5f6 --- /dev/null +++ b/webapp/src/apis/example_responses/iss-scms-status_get.json @@ -0,0 +1,74 @@ +{ + "10.11.81.12": { "health": "1", "expiration": "11/20/2023 10:43:34 AM" }, + "10.11.81.13": { "health": "1", "expiration": "11/23/2023 03:16:11 PM" }, + "10.11.81.14": { "health": "1", "expiration": "11/24/2023 03:49:54 PM" }, + "10.11.81.17": { "health": "1", "expiration": "11/23/2023 11:55:43 AM" }, + "10.11.81.18": { "health": "1", "expiration": "11/24/2023 07:54:17 AM" }, + "10.11.81.19": { "health": "1", "expiration": "11/23/2023 11:10:24 AM" }, + "10.11.81.20": { "health": "1", "expiration": "11/24/2023 06:06:30 AM" }, + "10.11.81.21": { "health": "1", "expiration": "11/23/2023 11:09:02 AM" }, + "10.11.81.22": { "health": "1", "expiration": "11/23/2023 02:28:34 PM" }, + "10.11.81.23": { "health": "1", "expiration": "11/23/2023 11:08:28 AM" }, + "10.11.81.24": { "health": "1", "expiration": "11/22/2023 04:45:02 PM" }, + "10.11.81.25": { "health": "1", "expiration": "11/23/2023 11:07:51 AM" }, + "10.11.81.26": { "health": "1", "expiration": "11/23/2023 11:07:30 AM" }, + "10.11.81.27": { "health": "0", "expiration": "03/14/2022 04:32:12 PM" }, + "10.11.81.28": { "health": "1", "expiration": "11/21/2023 10:44:25 AM" }, + "10.11.81.29": { "health": "1", "expiration": "11/20/2023 02:24:33 PM" }, + "10.11.81.30": { "health": "1", "expiration": "11/23/2023 11:12:07 AM" }, + "10.11.81.31": { "health": "0", "expiration": "04/25/2023 08:43:12 AM" }, + "10.11.81.32": { "health": "1", "expiration": "11/23/2023 11:12:43 AM" }, + "10.11.81.33": { "health": "1", "expiration": "11/23/2023 11:13:00 AM" }, + "10.11.81.34": { "health": "1", "expiration": "11/23/2023 11:14:36 AM" }, + "10.11.81.35": { "health": "1", "expiration": "11/23/2023 11:15:07 AM" }, + "10.11.81.36": { "health": "1", "expiration": "11/23/2023 11:15:22 AM" }, + "10.11.81.37": { "health": "1", "expiration": "11/23/2023 11:15:48 AM" }, + "10.11.81.38": { "health": "1", "expiration": "11/23/2023 11:16:13 AM" }, + "10.11.81.39": { "health": "1", "expiration": "11/22/2023 10:27:14 AM" }, + "10.11.81.40": { "health": "1", "expiration": "11/24/2023 01:13:18 PM" }, + "10.16.28.6": { "health": "1", "expiration": "11/24/2023 06:17:31 PM" }, + "10.16.28.8": { "health": "1", "expiration": "11/20/2023 02:11:31 PM" }, + "10.16.28.9": { "health": "1", "expiration": "11/21/2023 10:15:32 AM" }, + "10.16.28.11": { "health": "1", "expiration": "11/22/2023 07:50:23 AM" }, + "10.16.28.12": { "health": "1", "expiration": "11/22/2023 08:07:55 AM" }, + "10.16.28.13": { "health": "1", "expiration": "11/22/2023 02:08:51 PM" }, + "10.16.28.14": { "health": "1", "expiration": "11/26/2023 09:40:21 AM" }, + "10.16.28.15": { "health": "1", "expiration": "11/26/2023 09:12:50 AM" }, + "10.16.28.21": { "health": "1", "expiration": "11/23/2023 05:27:14 PM" }, + "10.16.28.22": { "health": "1", "expiration": "11/21/2023 08:39:09 AM" }, + "10.16.28.23": { "health": "1", "expiration": "11/21/2023 08:19:59 AM" }, + "10.16.28.24": { "health": "1", "expiration": "11/21/2023 08:45:25 AM" }, + "10.16.28.25": { "health": "1", "expiration": "11/21/2023 05:09:34 PM" }, + "10.16.28.26": { "health": "1", "expiration": "11/23/2023 09:46:28 AM" }, + "10.16.28.28": { "health": "1", "expiration": "11/21/2023 04:43:59 PM" }, + "10.16.28.29": { "health": "1", "expiration": "11/22/2023 04:30:17 PM" }, + "10.16.28.30": { "health": "1", "expiration": "11/27/2023 08:36:14 AM" }, + "10.16.28.31": { "health": "1", "expiration": "11/22/2023 03:27:41 AM" }, + "10.16.28.32": { "health": "0", "expiration": "06/08/2023 06:45:35 AM" }, + "10.16.28.33": { "health": "1", "expiration": "11/20/2023 03:08:14 PM" }, + "10.16.28.34": { "health": "1", "expiration": "11/21/2023 02:27:13 AM" }, + "10.16.28.38": { "health": "1", "expiration": "11/22/2023 06:14:50 PM" }, + "10.16.28.40": { "health": "1", "expiration": "11/21/2023 09:18:47 AM" }, + "10.16.28.41": { "health": "0", "expiration": "10/04/2023 01:17:03 PM" }, + "10.16.28.42": { "health": "1", "expiration": "11/26/2023 10:23:33 AM" }, + "10.16.28.43": { "health": "1", "expiration": "11/20/2023 04:17:35 PM" }, + "10.16.28.44": { "health": "1", "expiration": "11/21/2023 04:03:41 PM" }, + "10.16.28.47": { "health": "0", "expiration": "06/21/2023 04:49:32 PM" }, + "10.16.28.48": { "health": "1", "expiration": "11/22/2023 04:02:14 PM" }, + "10.16.28.51": { "health": "1", "expiration": "11/25/2023 10:00:37 AM" }, + "10.16.28.53": { "health": "1", "expiration": "11/21/2023 11:31:16 AM" }, + "10.16.28.54": { "health": "1", "expiration": "11/21/2023 08:05:00 AM" }, + "10.16.28.55": { "health": "0", "expiration": "07/18/2023 11:09:31 AM" }, + "10.16.28.56": { "health": "1", "expiration": "11/21/2023 08:21:57 AM" }, + "10.16.28.57": { "health": "1", "expiration": "11/21/2023 12:33:39 PM" }, + "10.16.28.58": { "health": "1", "expiration": "11/23/2023 06:06:39 AM" }, + "10.16.28.61": { "health": "1", "expiration": "11/23/2023 12:53:09 AM" }, + "10.16.28.64": { "health": "0", "expiration": "10/25/2023 08:19:32 AM" }, + "10.16.28.65": { "health": "1", "expiration": "11/26/2023 10:10:12 AM" }, + "10.16.28.66": { "health": "1", "expiration": "11/22/2023 05:31:56 PM" }, + "10.16.28.67": { "health": "1", "expiration": "11/21/2023 11:42:32 PM" }, + "10.16.28.68": { "health": "1", "expiration": "11/21/2023 11:04:56 PM" }, + "10.16.28.70": { "health": "0", "expiration": "10/14/2023 06:01:28 PM" }, + "10.16.28.73": { "health": "1", "expiration": "11/23/2023 01:21:00 PM" }, + "10.16.28.74": { "health": "1", "expiration": "11/23/2023 03:53:29 PM" } +} diff --git a/webapp/src/apis/example_responses/log.txt b/webapp/src/apis/example_responses/log.txt new file mode 100644 index 000000000..d33d3a3f2 --- /dev/null +++ b/webapp/src/apis/example_responses/log.txt @@ -0,0 +1,4397 @@ +context.js:5 [DEPRECATED] zustand/context will be removed in the future version. Please use `import { createStore, useStore } from "zustand"` for context usage. See: https://github.com/pmndrs/zustand/discussions/1180 +createContext @ context.js:5 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-online-status WITH QUERY PARAMS [object Object] AND RESPONSE {"172.16.28.204":{"current_status":"online"},"172.16.28.219":{"current_status":"online"},"172.16.28.209":{"current_status":"online"},"172.16.28.214":{"current_status":"online"},"172.16.28.220":{"current_status":"online"},"172.16.28.185":{"current_status":"online"},"172.16.28.202":{"current_status":"online"},"172.16.28.163":{"current_status":"offline"},"172.16.28.154":{"current_status":"online"},"172.16.28.197":{"current_status":"online"},"172.16.28.235":{"current_status":"online"},"172.16.28.184":{"current_status":"online"},"172.16.28.156":{"current_status":"online"},"172.16.28.135":{"current_status":"online"},"172.16.28.165":{"current_status":"online"},"172.16.28.213":{"current_status":"online"},"172.16.28.153":{"current_status":"online"},"172.16.28.134":{"current_status":"online"},"172.16.28.191":{"current_status":"online"},"172.16.28.186":{"current_status":"online"},"172.16.28.226":{"current_status":"online"},"172.16.28.201":{"current_status":"online"},"172.16.28.225":{"current_status":"online"},"10.11.81.12":{"current_status":"online"},"10.11.81.13":{"current_status":"online"},"10.11.81.14":{"current_status":"online"},"10.11.81.18":{"current_status":"online"},"10.11.81.19":{"current_status":"online"},"10.11.81.20":{"current_status":"online"},"10.11.81.21":{"current_status":"online"},"10.11.81.27":{"current_status":"online"},"172.16.28.162":{"current_status":"online"},"172.16.28.136":{"current_status":"online"},"172.16.28.171":{"current_status":"online"},"172.16.28.144":{"current_status":"offline"},"172.16.28.159":{"current_status":"online"},"172.16.28.175":{"current_status":"offline"},"172.16.28.182":{"current_status":"online"},"172.16.28.168":{"current_status":"offline"},"172.16.28.237":{"current_status":"online"},"172.16.28.166":{"current_status":"online"},"172.16.28.195":{"current_status":"online"},"172.16.28.212":{"current_status":"online"},"172.16.28.181":{"current_status":"offline"},"172.16.28.241":{"current_status":"online"},"172.16.28.187":{"current_status":"offline"},"172.16.28.218":{"current_status":"online"},"172.16.28.232":{"current_status":"online"},"172.16.28.143":{"current_status":"online"},"10.11.81.22":{"current_status":"online"},"10.11.81.23":{"current_status":"online"},"10.11.81.24":{"current_status":"online"},"10.11.81.25":{"current_status":"online"},"10.11.81.26":{"current_status":"online"},"10.11.81.28":{"current_status":"online"},"172.16.28.222":{"current_status":"online"},"172.16.28.146":{"current_status":"online"},"172.16.28.132":{"current_status":"online"},"172.16.28.142":{"current_status":"online"},"172.16.28.151":{"current_status":"online"},"172.16.28.167":{"current_status":"online"},"172.16.28.150":{"current_status":"online"},"172.16.28.133":{"current_status":"online"},"172.16.28.174":{"current_status":"online"},"172.16.28.200":{"current_status":"offline"},"172.16.28.236":{"current_status":"online"},"172.16.28.240":{"current_status":"online"},"172.16.28.238":{"current_status":"online"},"172.16.28.228":{"current_status":"online"},"172.16.28.234":{"current_status":"online"},"172.16.28.141":{"current_status":"online"},"172.16.28.217":{"current_status":"online"},"172.16.28.242":{"current_status":"offline"},"172.16.28.177":{"current_status":"online"},"172.16.28.215":{"current_status":"offline"},"172.16.28.224":{"current_status":"offline"},"172.16.28.211":{"current_status":"online"},"172.16.28.190":{"current_status":"offline"},"172.16.28.203":{"current_status":"online"},"172.16.28.173":{"current_status":"offline"},"172.16.28.155":{"current_status":"online"},"172.16.28.152":{"current_status":"offline"},"172.16.28.149":{"current_status":"offline"},"172.16.28.131":{"current_status":"online"},"172.16.28.176":{"current_status":"online"},"172.16.28.137":{"current_status":"online"},"172.16.28.207":{"current_status":"online"},"172.16.28.193":{"current_status":"online"},"172.16.28.148":{"current_status":"online"},"172.16.28.164":{"current_status":"online"},"172.16.28.157":{"current_status":"online"},"172.16.28.169":{"current_status":"online"},"172.16.28.210":{"current_status":"online"},"172.16.28.199":{"current_status":"online"},"172.16.28.188":{"current_status":"online"},"172.16.28.216":{"current_status":"online"},"172.16.28.179":{"current_status":"online"},"172.16.28.208":{"current_status":"online"},"172.16.28.172":{"current_status":"online"},"172.16.28.221":{"current_status":"offline"},"172.16.28.161":{"current_status":"online"},"172.16.28.160":{"current_status":"online"},"172.16.28.229":{"current_status":"online"},"172.16.28.138":{"current_status":"online"},"172.16.28.178":{"current_status":"offline"},"172.16.28.183":{"current_status":"online"},"172.16.28.198":{"current_status":"online"},"172.16.28.147":{"current_status":"online"},"172.16.28.227":{"current_status":"online"},"172.16.28.170":{"current_status":"online"},"172.16.28.192":{"current_status":"online"},"172.16.28.69":{"current_status":"online"},"172.16.28.56":{"current_status":"online"},"172.16.28.57":{"current_status":"online"},"172.16.28.59":{"current_status":"online"},"172.16.28.68":{"current_status":"online"},"172.16.28.72":{"current_status":"online"},"172.16.28.74":{"current_status":"online"},"172.16.28.49":{"current_status":"online"},"172.16.28.42":{"current_status":"online"},"172.16.28.41":{"current_status":"online"},"172.16.28.44":{"current_status":"offline"},"172.16.28.45":{"current_status":"online"},"172.16.28.46":{"current_status":"online"},"172.16.28.48":{"current_status":"online"},"172.16.28.40":{"current_status":"online"},"172.16.28.32":{"current_status":"online"},"172.16.28.33":{"current_status":"online"},"172.16.28.26":{"current_status":"online"},"172.16.28.34":{"current_status":"offline"},"172.16.28.35":{"current_status":"online"},"172.16.28.36":{"current_status":"online"},"172.16.28.29":{"current_status":"online"},"172.16.28.30":{"current_status":"offline"},"172.16.28.25":{"current_status":"online"},"172.16.28.23":{"current_status":"online"},"172.16.28.243":{"current_status":"online"},"172.16.28.112":{"current_status":"online"},"172.16.28.113":{"current_status":"online"},"172.16.28.12":{"current_status":"online"},"172.16.28.80":{"current_status":"online"},"172.16.28.82":{"current_status":"online"},"172.16.28.4":{"current_status":"online"},"172.16.28.100":{"current_status":"online"},"172.16.28.101":{"current_status":"online"},"172.16.28.253":{"current_status":"online"},"10.11.81.29":{"current_status":"online"},"10.11.81.30":{"current_status":"online"},"10.11.81.31":{"current_status":"online"},"10.11.81.32":{"current_status":"online"},"10.11.81.33":{"current_status":"online"},"10.11.81.34":{"current_status":"online"},"10.11.81.35":{"current_status":"online"},"10.11.81.36":{"current_status":"online"},"10.11.81.37":{"current_status":"online"},"10.11.81.38":{"current_status":"online"},"10.11.81.39":{"current_status":"online"},"10.11.81.40":{"current_status":"online"},"172.16.28.98":{"current_status":"online"},"172.16.28.104":{"current_status":"online"},"172.16.28.252":{"current_status":"online"},"172.16.28.54":{"current_status":"online"},"172.16.28.47":{"current_status":"offline"},"172.16.28.21":{"current_status":"online"},"172.16.28.27":{"current_status":"online"},"10.16.28.97":{"current_status":"online"},"10.16.28.84":{"current_status":"online"},"10.16.28.9":{"current_status":"online"},"172.16.28.120":{"current_status":"online"},"10.16.28.99":{"current_status":"online"},"10.16.28.26":{"current_status":"online"},"10.16.28.57":{"current_status":"online"},"10.16.28.28":{"current_status":"online"},"10.16.28.25":{"current_status":"online"},"10.11.81.17":{"current_status":"online"},"172.16.28.20":{"current_status":"online"},"10.16.28.44":{"current_status":"online"},"10.16.28.73":{"current_status":"online"},"10.16.28.74":{"current_status":"online"},"10.16.28.75":{"current_status":"online"},"10.16.28.96":{"current_status":"online"},"10.16.28.86":{"current_status":"online"},"10.16.28.40":{"current_status":"online"}} +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-map-info WITH QUERY PARAMS [object Object] AND RESPONSE ["10.11.81.27","10.11.81.25","10.11.81.24","10.11.81.23","10.11.81.28","10.11.81.22","10.11.81.21","10.11.81.20","10.11.81.14","10.11.81.18","10.11.81.13","10.11.81.19","10.11.81.26","10.11.81.12","10.11.81.30","10.11.81.29","10.11.81.32","10.11.81.33","10.11.81.34","10.11.81.35","10.11.81.36","10.11.81.37","10.11.81.38","10.11.81.39","10.11.81.40","10.11.81.31"] +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsucounts WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.14":{"road":"Region 1","count":0},"10.11.81.22":{"road":"Region 1","count":0},"10.16.28.74":{"road":"I25","count":0},"10.16.28.130":{"road":"I25","count":0},"172.16.28.4":{"road":"I25","count":0},"172.16.28.109":{"road":"I25","count":0},"10.16.28.21":{"road":"C470","count":0},"10.16.28.89":{"road":"C470","count":0},"172.16.28.44":{"road":"C470","count":0},"172.16.28.48":{"road":"C470","count":0},"172.16.28.136":{"road":"I70","count":0},"172.16.28.153":{"road":"I70","count":0},"172.16.28.177":{"road":"I70","count":0},"172.16.28.183":{"road":"I70","count":0},"172.16.28.186":{"road":"I70","count":0},"172.16.28.214":{"road":"I70","count":0},"172.16.28.224":{"road":"I70","count":0},"172.16.28.229":{"road":"I70","count":0},"172.16.28.253":{"road":"I70","count":0},"10.16.28.64":{"road":"I76","count":0},"10.11.81.12":{"road":"Region 1","count":0},"10.16.28.47":{"road":"I25","count":0},"10.16.28.129":{"road":"I25","count":0},"172.16.28.54":{"road":"I25","count":0},"172.16.28.68":{"road":"I25","count":0},"172.16.28.91":{"road":"I25","count":0},"10.16.28.54":{"road":"C470","count":0},"172.16.28.19":{"road":"I70","count":0},"172.16.28.134":{"road":"I70","count":0},"172.16.28.159":{"road":"I70","count":0},"172.16.28.167":{"road":"I70","count":0},"172.16.28.203":{"road":"I70","count":0},"172.16.28.220":{"road":"I70","count":0},"172.16.28.46":{"road":"I270","count":0},"10.11.81.28":{"road":"Region 1","count":0},"10.11.81.34":{"road":"Region 1","count":0},"10.16.28.12":{"road":"I25","count":0},"10.16.28.33":{"road":"I25","count":0},"10.16.28.38":{"road":"I25","count":0},"172.16.28.59":{"road":"I25","count":0},"10.16.28.113":{"road":"C470","count":0},"172.16.28.21":{"road":"I70","count":0},"172.16.28.113":{"road":"I70","count":0},"172.16.28.143":{"road":"I70","count":0},"172.16.28.157":{"road":"I70","count":0},"172.16.28.200":{"road":"I70","count":0},"172.16.28.225":{"road":"I70","count":0},"10.11.81.33":{"road":"Region 1","count":0},"10.11.81.35":{"road":"Region 1","count":0},"10.11.81.37":{"road":"Region 1","count":0},"10.11.81.38":{"road":"Region 1","count":0},"10.16.28.88":{"road":"I25","count":0},"10.16.28.100":{"road":"I25","count":0},"172.16.28.7":{"road":"I25","count":0},"172.16.28.14":{"road":"I25","count":0},"172.16.28.57":{"road":"I25","count":0},"172.16.28.67":{"road":"I25","count":0},"172.16.28.87":{"road":"I25","count":0},"172.16.28.90":{"road":"I25","count":0},"172.16.28.30":{"road":"C470","count":0},"172.16.28.96":{"road":"C470","count":0},"172.16.28.12":{"road":"I70","count":0},"172.16.28.81":{"road":"I70","count":0},"172.16.28.146":{"road":"I70","count":0},"172.16.28.151":{"road":"I70","count":0},"172.16.28.164":{"road":"I70","count":0},"172.16.28.174":{"road":"I70","count":0},"172.16.28.179":{"road":"I70","count":0},"172.16.28.197":{"road":"I70","count":0},"172.16.28.211":{"road":"I70","count":0},"172.16.28.218":{"road":"I70","count":0},"172.16.28.228":{"road":"I70","count":0},"172.16.28.232":{"road":"I70","count":0},"172.16.28.240":{"road":"I70","count":0},"172.16.28.244":{"road":"I76","count":0},"172.16.28.6":{"road":"I225","count":0},"172.16.28.16":{"road":"I270","count":0},"172.16.28.116":{"road":"C470","count":4},"10.11.81.17":{"road":"Region 1","count":0},"10.11.81.21":{"road":"Region 1","count":0},"10.16.28.15":{"road":"I25","count":0},"10.16.28.25":{"road":"I25","count":0},"10.16.28.65":{"road":"I25","count":0},"10.16.28.99":{"road":"I25","count":0},"172.16.28.111":{"road":"I25","count":0},"172.16.28.126":{"road":"I25","count":0},"172.16.28.251":{"road":"I25","count":0},"10.16.28.55":{"road":"C470","count":0},"10.16.28.56":{"road":"C470","count":0},"172.16.28.95":{"road":"C470","count":0},"10.16.28.48":{"road":"I70","count":0},"172.16.28.184":{"road":"I70","count":0},"172.16.28.199":{"road":"I70","count":0},"172.16.28.201":{"road":"I70","count":0},"172.16.28.204":{"road":"I70","count":0},"10.11.81.13":{"road":"Region 1","count":0},"10.11.81.19":{"road":"Region 1","count":0},"10.11.81.31":{"road":"Region 1","count":0},"10.16.28.9":{"road":"I25","count":0},"10.16.28.41":{"road":"I25","count":0},"10.16.28.84":{"road":"I25","count":0},"172.16.28.64":{"road":"I25","count":0},"172.16.28.98":{"road":"I25","count":0},"172.16.28.103":{"road":"I25","count":0},"172.16.28.119":{"road":"I25","count":0},"10.16.28.141":{"road":"C470","count":0},"172.16.28.36":{"road":"C470","count":0},"172.16.28.135":{"road":"I70","count":0},"172.16.28.185":{"road":"I70","count":0},"172.16.28.207":{"road":"I70","count":0},"172.16.28.219":{"road":"I70","count":0},"172.16.28.41":{"road":"I76","count":0},"10.11.81.23":{"road":"Region 1","count":0},"10.16.28.11":{"road":"I25","count":0},"10.16.28.34":{"road":"I25","count":0},"10.16.28.66":{"road":"I25","count":0},"10.16.28.68":{"road":"I25","count":0},"10.16.28.78":{"road":"I25","count":0},"172.16.28.18":{"road":"I25","count":0},"172.16.28.65":{"road":"I25","count":0 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-online-status WITH QUERY PARAMS [object Object] AND RESPONSE {"ip":"172.16.28.65","last_online":"11/06/2023 07:17:00 AM"} +api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-command WITH QUERY PARAMS [object Object] AND BODY {"command":"rsufwdsnmpwalk","rsu_ip":["172.16.28.65"],"args":{}} AND RESPONSE {"RsuFwdSnmpwalk":{"1":{"Message Type":"BSM","IP":"10.235.1.36","Port":46800,"Protocol":"UDP","RSSI":-100,"Frequency":1,"Start DateTime":"2023-04-17 17:48","End DateTime":"2033-04-17 17:48","Forwarding":"On","Config Active":"Enabled"},"2":{"Message Type":"BSM","IP":"10.235.1.66","Port":46800,"Protocol":"UDP","RSSI":-100,"Frequency":1,"Start DateTime":"2023-04-17 17:48","End DateTime":"2033-04-17 17:48","Forwarding":"On","Config Active":"Enabled"},"3":{"Message Type":"BSM","IP":"10.235.1.3","Port":46800,"Protocol":"UDP","RSSI":-100,"Frequency":1,"Start DateTime":"2023-04-17 17:49","End DateTime":"2033-04-17 17:49","Forwarding":"On","Config Active":"Enabled"}}} +react-jsx-dev-runtime.development.js:106 Warning: Each child in a list should have a unique "key" prop. + +Check the render method of `SnmpwalkMenu`. See https://reactjs.org/link/warning-keys for more information. + at div + at SnmpwalkMenu (http://localhost:3000/static/js/bundle.js:2782:76) + at div + at http://localhost:3000/static/js/bundle.js:16648:66 + at AccordionDetails (http://localhost:3000/static/js/bundle.js:44611:82) + at div + at http://localhost:3000/static/js/bundle.js:16648:66 + at Paper (http://localhost:3000/static/js/bundle.js:58075:83) + at http://localhost:3000/static/js/bundle.js:16648:66 + at Accordion (http://localhost:3000/static/js/bundle.js:45073:83) + at InnerThemeProvider (http://localhost:3000/static/js/bundle.js:70008:70) + at ThemeProvider (http://localhost:3000/static/js/bundle.js:69718:5) + at ThemeProvider (http://localhost:3000/static/js/bundle.js:70027:5) + at div + at div + at http://localhost:3000/static/js/bundle.js:16648:66 + at div + at http://localhost:3000/static/js/bundle.js:16648:66 + at div + at http://localhost:3000/static/js/bundle.js:16648:66 + at Transition (http://localhost:3000/static/js/bundle.js:240685:30) + at Collapse (http://localhost:3000/static/js/bundle.js:48431:82) + at div + at http://localhost:3000/static/js/bundle.js:16648:66 + at Paper (http://localhost:3000/static/js/bundle.js:58075:83) + at http://localhost:3000/static/js/bundle.js:16648:66 + at Accordion (http://localhost:3000/static/js/bundle.js:45073:83) + at InnerThemeProvider (http://localhost:3000/static/js/bundle.js:70008:70) + at ThemeProvider (http://localhost:3000/static/js/bundle.js:69718:5) + at ThemeProvider (http://localhost:3000/static/js/bundle.js:70027:5) + at div + at div + at ConfigureRSU (http://localhost:3000/static/js/bundle.js:10749:76) + at div + at div + at Menu (http://localhost:3000/static/js/bundle.js:11581:76) + at div + at div + at Tabs (http://localhost:3000/static/js/bundle.js:3301:5) + at div + at Grid (http://localhost:3000/static/js/bundle.js:38934:35) + at WithStyles (http://localhost:3000/static/js/bundle.js:41422:31) + at div + at GoogleOAuthProvider (http://localhost:3000/static/js/bundle.js:94219:5) + at App (http://localhost:3000/static/js/bundle.js:61:77) + at Provider (http://localhost:3000/static/js/bundle.js:231775:5) +printWarning @ react-jsx-dev-runtime.development.js:106 +error @ react-jsx-dev-runtime.development.js:85 +validateExplicitKey @ react-jsx-dev-runtime.development.js:850 +validateChildKeys @ react-jsx-dev-runtime.development.js:873 +jsxWithValidation @ react-jsx-dev-runtime.development.js:1017 +SnmpwalkMenu @ SnmpwalkMenu.js:132 +renderWithHooks @ react-dom.development.js:12980 +updateFunctionComponent @ react-dom.development.js:15082 +beginWork @ react-dom.development.js:16529 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ SnmpwalkMenu.js:35 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +onClick @ Map.js:738 +(anonymous) @ marker.js:39 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-online-status WITH QUERY PARAMS [object Object] AND RESPONSE {"ip":"172.16.28.65","last_online":"11/06/2023 07:17:00 AM"} +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//iss-scms-status WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.12":{"health":"1","expiration":"11/20/2023 10:43:34 AM"},"10.11.81.13":{"health":"1","expiration":"11/23/2023 03:16:11 PM"},"10.11.81.14":{"health":"1","expiration":"11/24/2023 03:49:54 PM"},"10.11.81.17":{"health":"1","expiration":"11/23/2023 11:55:43 AM"},"10.11.81.18":{"health":"1","expiration":"11/24/2023 07:54:17 AM"},"10.11.81.19":{"health":"1","expiration":"11/23/2023 11:10:24 AM"},"10.11.81.20":{"health":"1","expiration":"11/24/2023 06:06:30 AM"},"10.11.81.21":{"health":"1","expiration":"11/23/2023 11:09:02 AM"},"10.11.81.22":{"health":"1","expiration":"11/23/2023 02:28:34 PM"},"10.11.81.23":{"health":"1","expiration":"11/23/2023 11:08:28 AM"},"10.11.81.24":{"health":"1","expiration":"11/22/2023 04:45:02 PM"},"10.11.81.25":{"health":"1","expiration":"11/23/2023 11:07:51 AM"},"10.11.81.26":{"health":"1","expiration":"11/23/2023 11:07:30 AM"},"10.11.81.27":{"health":"0","expiration":"03/14/2022 04:32:12 PM"},"10.11.81.28":{"health":"1","expiration":"11/21/2023 10:44:25 AM"},"10.11.81.29":{"health":"1","expiration":"11/20/2023 02:24:33 PM"},"10.11.81.30":{"health":"1","expiration":"11/23/2023 11:12:07 AM"},"10.11.81.31":{"health":"0","expiration":"04/25/2023 08:43:12 AM"},"10.11.81.32":{"health":"1","expiration":"11/23/2023 11:12:43 AM"},"10.11.81.33":{"health":"1","expiration":"11/23/2023 11:13:00 AM"},"10.11.81.34":{"health":"1","expiration":"11/23/2023 11:14:36 AM"},"10.11.81.35":{"health":"1","expiration":"11/23/2023 11:15:07 AM"},"10.11.81.36":{"health":"1","expiration":"11/23/2023 11:15:22 AM"},"10.11.81.37":{"health":"1","expiration":"11/23/2023 11:15:48 AM"},"10.11.81.38":{"health":"1","expiration":"11/23/2023 11:16:13 AM"},"10.11.81.39":{"health":"1","expiration":"11/22/2023 10:27:14 AM"},"10.11.81.40":{"health":"1","expiration":"11/24/2023 01:13:18 PM"},"10.16.28.6":{"health":"1","expiration":"11/24/2023 06:17:31 PM"},"10.16.28.8":{"health":"1","expiration":"11/20/2023 02:11:31 PM"},"10.16.28.9":{"health":"1","expiration":"11/21/2023 10:15:32 AM"},"10.16.28.11":{"health":"1","expiration":"11/22/2023 07:50:23 AM"},"10.16.28.12":{"health":"1","expiration":"11/22/2023 08:07:55 AM"},"10.16.28.13":{"health":"1","expiration":"11/22/2023 02:08:51 PM"},"10.16.28.14":{"health":"1","expiration":"11/26/2023 09:40:21 AM"},"10.16.28.15":{"health":"1","expiration":"11/26/2023 09:12:50 AM"},"10.16.28.21":{"health":"1","expiration":"11/23/2023 05:27:14 PM"},"10.16.28.22":{"health":"1","expiration":"11/21/2023 08:39:09 AM"},"10.16.28.23":{"health":"1","expiration":"11/21/2023 08:19:59 AM"},"10.16.28.24":{"health":"1","expiration":"11/21/2023 08:45:25 AM"},"10.16.28.25":{"health":"1","expiration":"11/21/2023 05:09:34 PM"},"10.16.28.26":{"health":"1","expiration":"11/23/2023 09:46:28 AM"},"10.16.28.28":{"health":"1","expiration":"11/21/2023 04:43:59 PM"},"10.16.28.29":{"health":"1","expiration":"11/22/2023 04:30:17 PM"},"10.16.28.30":{"health":"1","expiration":"11/27/2023 08:36:14 AM"},"10.16.28.31":{"health":"1","expiration":"11/22/2023 03:27:41 AM"},"10.16.28.32":{"health":"0","expiration":"06/08/2023 06:45:35 AM"},"10.16.28.33":{"health":"1","expiration":"11/20/2023 03:08:14 PM"},"10.16.28.34":{"health":"1","expiration":"11/21/2023 02:27:13 AM"},"10.16.28.38":{"health":"1","expiration":"11/22/2023 06:14:50 PM"},"10.16.28.40":{"health":"1","expiration":"11/21/2023 09:18:47 AM"},"10.16.28.41":{"health":"0","expiration":"10/04/2023 01:17:03 PM"},"10.16.28.42":{"health":"1","expiration":"11/26/2023 10:23:33 AM"},"10.16.28.43":{"health":"1","expiration":"11/20/2023 04:17:35 PM"},"10.16.28.44":{"health":"1","expiration":"11/21/2023 04:03:41 PM"},"10.16.28.47":{"health":"0","expiration":"06/21/2023 04:49:32 PM"},"10.16.28.48":{"health":"1","expiration":"11/22/2023 04:02:14 PM"},"10.16.28.51":{"health":"1","expiration":"11/25/2023 10:00:37 AM"},"10.16.28.53":{"health":"1","expiration":"11/21/2023 11:31:16 AM"},"10.16.28.54":{"health":"1","expiration":"11/21/2023 08:05:00 AM"},"10.16.28.55":{"health":"0","expiration":"07/18/2023 11:09:31 AM"},"10.16.28.56":{"health":"1","expiration":"11/21/2023 08:21:57 AM"},"10.16.28.57":{"health":"1","expiration":"11/21/2023 12:33:39 PM"},"10.16.28.58":{"health":"1","expiration":"11/23/2023 06:06:39 AM"},"10.16.28.61":{"health":"1","expiration":"11/23/2023 12:53:09 AM"},"10.16.28.64":{"health":"0","expiration":"10/25/2023 08:19:32 AM"},"10.16.28.65":{"health":"1","expiration":"11/26/2023 10:10:12 AM"},"10.16.28.66":{"health":"1","expiration":"11/22/2023 05:31:56 PM"},"10.16.28.67":{"health":"1","expiration":"11/21/2023 11:42:32 PM"},"10.16.28.68":{"health":"1","expiration":"11/21/2023 11:04:56 PM"},"10.16.28.70":{"health":"0","expiration":"10/14/2023 06:01:28 PM"},"10.16.28.73":{"health":"1","expiration":"11/23/2023 01:21:00 PM"},"10.16.28.74":{"health":"1","expiration":"11/23/2023 03:53:29 PM"},"10.16.28.75":{"health":"1","expiration":"11/23/2023 04:23:48 PM" +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//iss-scms-status WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.12":{"health":"1","expiration":"11/20/2023 10:43:34 AM"},"10.11.81.13":{"health":"1","expiration":"11/23/2023 03:16:11 PM"},"10.11.81.14":{"health":"1","expiration":"11/24/2023 03:49:54 PM"},"10.11.81.17":{"health":"1","expiration":"11/23/2023 11:55:43 AM"},"10.11.81.18":{"health":"1","expiration":"11/24/2023 07:54:17 AM"},"10.11.81.19":{"health":"1","expiration":"11/23/2023 11:10:24 AM"},"10.11.81.20":{"health":"1","expiration":"11/24/2023 06:06:30 AM"},"10.11.81.21":{"health":"1","expiration":"11/23/2023 11:09:02 AM"},"10.11.81.22":{"health":"1","expiration":"11/23/2023 02:28:34 PM"},"10.11.81.23":{"health":"1","expiration":"11/23/2023 11:08:28 AM"},"10.11.81.24":{"health":"1","expiration":"11/22/2023 04:45:02 PM"},"10.11.81.25":{"health":"1","expiration":"11/23/2023 11:07:51 AM"},"10.11.81.26":{"health":"1","expiration":"11/23/2023 11:07:30 AM"},"10.11.81.27":{"health":"0","expiration":"03/14/2022 04:32:12 PM"},"10.11.81.28":{"health":"1","expiration":"11/21/2023 10:44:25 AM"},"10.11.81.29":{"health":"1","expiration":"11/20/2023 02:24:33 PM"},"10.11.81.30":{"health":"1","expiration":"11/23/2023 11:12:07 AM"},"10.11.81.31":{"health":"0","expiration":"04/25/2023 08:43:12 AM"},"10.11.81.32":{"health":"1","expiration":"11/23/2023 11:12:43 AM"},"10.11.81.33":{"health":"1","expiration":"11/23/2023 11:13:00 AM"},"10.11.81.34":{"health":"1","expiration":"11/23/2023 11:14:36 AM"},"10.11.81.35":{"health":"1","expiration":"11/23/2023 11:15:07 AM"},"10.11.81.36":{"health":"1","expiration":"11/23/2023 11:15:22 AM"},"10.11.81.37":{"health":"1","expiration":"11/23/2023 11:15:48 AM"},"10.11.81.38":{"health":"1","expiration":"11/23/2023 11:16:13 AM"},"10.11.81.39":{"health":"1","expiration":"11/22/2023 10:27:14 AM"},"10.11.81.40":{"health":"1","expiration":"11/24/2023 01:13:18 PM"},"10.16.28.6":{"health":"1","expiration":"11/24/2023 06:17:31 PM"},"10.16.28.8":{"health":"1","expiration":"11/20/2023 02:11:31 PM"},"10.16.28.9":{"health":"1","expiration":"11/21/2023 10:15:32 AM"},"10.16.28.11":{"health":"1","expiration":"11/22/2023 07:50:23 AM"},"10.16.28.12":{"health":"1","expiration":"11/22/2023 08:07:55 AM"},"10.16.28.13":{"health":"1","expiration":"11/22/2023 02:08:51 PM"},"10.16.28.14":{"health":"1","expiration":"11/26/2023 09:40:21 AM"},"10.16.28.15":{"health":"1","expiration":"11/26/2023 09:12:50 AM"},"10.16.28.21":{"health":"1","expiration":"11/23/2023 05:27:14 PM"},"10.16.28.22":{"health":"1","expiration":"11/21/2023 08:39:09 AM"},"10.16.28.23":{"health":"1","expiration":"11/21/2023 08:19:59 AM"},"10.16.28.24":{"health":"1","expiration":"11/21/2023 08:45:25 AM"},"10.16.28.25":{"health":"1","expiration":"11/21/2023 05:09:34 PM"},"10.16.28.26":{"health":"1","expiration":"11/23/2023 09:46:28 AM"},"10.16.28.28":{"health":"1","expiration":"11/21/2023 04:43:59 PM"},"10.16.28.29":{"health":"1","expiration":"11/22/2023 04:30:17 PM"},"10.16.28.30":{"health":"1","expiration":"11/27/2023 08:36:14 AM"},"10.16.28.31":{"health":"1","expiration":"11/22/2023 03:27:41 AM"},"10.16.28.32":{"health":"0","expiration":"06/08/2023 06:45:35 AM"},"10.16.28.33":{"health":"1","expiration":"11/20/2023 03:08:14 PM"},"10.16.28.34":{"health":"1","expiration":"11/21/2023 02:27:13 AM"},"10.16.28.38":{"health":"1","expiration":"11/22/2023 06:14:50 PM"},"10.16.28.40":{"health":"1","expiration":"11/21/2023 09:18:47 AM"},"10.16.28.41":{"health":"0","expiration":"10/04/2023 01:17:03 PM"},"10.16.28.42":{"health":"1","expiration":"11/26/2023 10:23:33 AM"},"10.16.28.43":{"health":"1","expiration":"11/20/2023 04:17:35 PM"},"10.16.28.44":{"health":"1","expiration":"11/21/2023 04:03:41 PM"},"10.16.28.47":{"health":"0","expiration":"06/21/2023 04:49:32 PM"},"10.16.28.48":{"health":"1","expiration":"11/22/2023 04:02:14 PM"},"10.16.28.51":{"health":"1","expiration":"11/25/2023 10:00:37 AM"},"10.16.28.53":{"health":"1","expiration":"11/21/2023 11:31:16 AM"},"10.16.28.54":{"health":"1","expiration":"11/21/2023 08:05:00 AM"},"10.16.28.55":{"health":"0","expiration":"07/18/2023 11:09:31 AM"},"10.16.28.56":{"health":"1","expiration":"11/21/2023 08:21:57 AM"},"10.16.28.57":{"health":"1","expiration":"11/21/2023 12:33:39 PM"},"10.16.28.58":{"health":"1","expiration":"11/23/2023 06:06:39 AM"},"10.16.28.61":{"health":"1","expiration":"11/23/2023 12:53:09 AM"},"10.16.28.64":{"health":"0","expiration":"10/25/2023 08:19:32 AM"},"10.16.28.65":{"health":"1","expiration":"11/26/2023 10:10:12 AM"},"10.16.28.66":{"health":"1","expiration":"11/22/2023 05:31:56 PM"},"10.16.28.67":{"health":"1","expiration":"11/21/2023 11:42:32 PM"},"10.16.28.68":{"health":"1","expiration":"11/21/2023 11:04:56 PM"},"10.16.28.70":{"health":"0","expiration":"10/14/2023 06:01:28 PM"},"10.16.28.73":{"health":"1","expiration":"11/23/2023 01:21:00 PM"},"10.16.28.74":{"health":"1","expiration":"11/23/2023 03:53:29 PM"},"10.16.28.75":{"health":"1","expiration":"11/23/2023 04:23:48 PM" +api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-bsm-data WITH QUERY PARAMS [object Object] AND BODY {"start":"2023-11-13T13:39:37.686-07:00","end":"2023-11-13T13:39:37.689-07:00","geometry":[[-105.1199509383924,39.88357964587854],[-105.01629278314967,39.878311762940626],[-104.95862864380933,39.84142525180897],[-105.00462265971177,39.78447574656593],[-105.10210251431104,39.80451891549569],[-105.1199509383924,39.88357964587854]]} AND RESPONSE [] +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsucounts WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.14":{"road":"Region 1","count":0},"10.11.81.22":{"road":"Region 1","count":0},"10.16.28.74":{"road":"I25","count":0},"10.16.28.130":{"road":"I25","count":0},"172.16.28.4":{"road":"I25","count":0},"172.16.28.109":{"road":"I25","count":0},"10.16.28.21":{"road":"C470","count":0},"10.16.28.89":{"road":"C470","count":0},"172.16.28.44":{"road":"C470","count":0},"172.16.28.48":{"road":"C470","count":0},"172.16.28.136":{"road":"I70","count":0},"172.16.28.153":{"road":"I70","count":0},"172.16.28.177":{"road":"I70","count":0},"172.16.28.183":{"road":"I70","count":0},"172.16.28.186":{"road":"I70","count":0},"172.16.28.214":{"road":"I70","count":0},"172.16.28.224":{"road":"I70","count":0},"172.16.28.229":{"road":"I70","count":0},"172.16.28.253":{"road":"I70","count":0},"10.16.28.64":{"road":"I76","count":0},"10.11.81.12":{"road":"Region 1","count":0},"10.16.28.47":{"road":"I25","count":0},"10.16.28.129":{"road":"I25","count":0},"172.16.28.54":{"road":"I25","count":0},"172.16.28.68":{"road":"I25","count":0},"172.16.28.91":{"road":"I25","count":0},"10.16.28.54":{"road":"C470","count":0},"172.16.28.19":{"road":"I70","count":0},"172.16.28.134":{"road":"I70","count":0},"172.16.28.159":{"road":"I70","count":0},"172.16.28.167":{"road":"I70","count":0},"172.16.28.203":{"road":"I70","count":0},"172.16.28.220":{"road":"I70","count":0},"172.16.28.46":{"road":"I270","count":0},"10.11.81.28":{"road":"Region 1","count":0},"10.11.81.34":{"road":"Region 1","count":0},"10.16.28.12":{"road":"I25","count":0},"10.16.28.33":{"road":"I25","count":0},"10.16.28.38":{"road":"I25","count":0},"172.16.28.59":{"road":"I25","count":0},"10.16.28.113":{"road":"C470","count":0},"172.16.28.21":{"road":"I70","count":0},"172.16.28.113":{"road":"I70","count":0},"172.16.28.143":{"road":"I70","count":0},"172.16.28.157":{"road":"I70","count":0},"172.16.28.200":{"road":"I70","count":0},"172.16.28.225":{"road":"I70","count":0},"10.11.81.33":{"road":"Region 1","count":0},"10.11.81.35":{"road":"Region 1","count":0},"10.11.81.37":{"road":"Region 1","count":0},"10.11.81.38":{"road":"Region 1","count":0},"10.16.28.88":{"road":"I25","count":0},"10.16.28.100":{"road":"I25","count":0},"172.16.28.7":{"road":"I25","count":0},"172.16.28.14":{"road":"I25","count":0},"172.16.28.57":{"road":"I25","count":0},"172.16.28.67":{"road":"I25","count":0},"172.16.28.87":{"road":"I25","count":0},"172.16.28.90":{"road":"I25","count":0},"172.16.28.30":{"road":"C470","count":0},"172.16.28.96":{"road":"C470","count":0},"172.16.28.12":{"road":"I70","count":0},"172.16.28.81":{"road":"I70","count":0},"172.16.28.146":{"road":"I70","count":0},"172.16.28.151":{"road":"I70","count":0},"172.16.28.164":{"road":"I70","count":0},"172.16.28.174":{"road":"I70","count":0},"172.16.28.179":{"road":"I70","count":0},"172.16.28.197":{"road":"I70","count":0},"172.16.28.211":{"road":"I70","count":0},"172.16.28.218":{"road":"I70","count":0},"172.16.28.228":{"road":"I70","count":0},"172.16.28.232":{"road":"I70","count":0},"172.16.28.240":{"road":"I70","count":0},"172.16.28.244":{"road":"I76","count":0},"172.16.28.6":{"road":"I225","count":0},"172.16.28.16":{"road":"I270","count":0},"172.16.28.116":{"road":"C470","count":4},"10.11.81.17":{"road":"Region 1","count":0},"10.11.81.21":{"road":"Region 1","count":0},"10.16.28.15":{"road":"I25","count":0},"10.16.28.25":{"road":"I25","count":0},"10.16.28.65":{"road":"I25","count":0},"10.16.28.99":{"road":"I25","count":0},"172.16.28.111":{"road":"I25","count":0},"172.16.28.126":{"road":"I25","count":0},"172.16.28.251":{"road":"I25","count":0},"10.16.28.55":{"road":"C470","count":0},"10.16.28.56":{"road":"C470","count":0},"172.16.28.95":{"road":"C470","count":0},"10.16.28.48":{"road":"I70","count":0},"172.16.28.184":{"road":"I70","count":0},"172.16.28.199":{"road":"I70","count":0},"172.16.28.201":{"road":"I70","count":0},"172.16.28.204":{"road":"I70","count":0},"10.11.81.13":{"road":"Region 1","count":0},"10.11.81.19":{"road":"Region 1","count":0},"10.11.81.31":{"road":"Region 1","count":0},"10.16.28.9":{"road":"I25","count":0},"10.16.28.41":{"road":"I25","count":0},"10.16.28.84":{"road":"I25","count":0},"172.16.28.64":{"road":"I25","count":0},"172.16.28.98":{"road":"I25","count":0},"172.16.28.103":{"road":"I25","count":0},"172.16.28.119":{"road":"I25","count":0},"10.16.28.141":{"road":"C470","count":0},"172.16.28.36":{"road":"C470","count":0},"172.16.28.135":{"road":"I70","count":0},"172.16.28.185":{"road":"I70","count":0},"172.16.28.207":{"road":"I70","count":0},"172.16.28.219":{"road":"I70","count":0},"172.16.28.41":{"road":"I76","count":0},"10.11.81.23":{"road":"Region 1","count":0},"10.16.28.11":{"road":"I25","count":0},"10.16.28.34":{"road":"I25","count":0},"10.16.28.66":{"road":"I25","count":0},"10.16.28.68":{"road":"I25","count":0},"10.16.28.78":{"road":"I25","count":0},"172.16.28.18":{"road":"I25","count":0},"172.16.28.65":{"road":"I25","count":0 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsucounts WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.23":{"road":"Region 1","count":0},"10.16.28.11":{"road":"I25","count":0},"10.16.28.34":{"road":"I25","count":0},"10.16.28.66":{"road":"I25","count":0},"10.16.28.68":{"road":"I25","count":0},"10.16.28.78":{"road":"I25","count":0},"172.16.28.18":{"road":"I25","count":0},"172.16.28.65":{"road":"I25","count":0},"172.16.28.97":{"road":"I25","count":0},"172.16.28.124":{"road":"I25","count":0},"172.16.28.249":{"road":"I25","count":0},"172.16.28.32":{"road":"C470","count":0},"172.16.28.40":{"road":"C470","count":0},"10.16.28.29":{"road":"I70","count":0},"172.16.28.80":{"road":"I70","count":0},"172.16.28.147":{"road":"I70","count":0},"172.16.28.170":{"road":"I70","count":0},"172.16.28.42":{"road":"I76","count":0},"10.11.81.28":{"road":"Region 1","count":0},"10.11.81.34":{"road":"Region 1","count":0},"10.16.28.12":{"road":"I25","count":0},"10.16.28.33":{"road":"I25","count":0},"10.16.28.38":{"road":"I25","count":0},"172.16.28.59":{"road":"I25","count":0},"10.16.28.113":{"road":"C470","count":0},"172.16.28.21":{"road":"I70","count":0},"172.16.28.113":{"road":"I70","count":0},"172.16.28.143":{"road":"I70","count":0},"172.16.28.157":{"road":"I70","count":0},"172.16.28.200":{"road":"I70","count":0},"172.16.28.225":{"road":"I70","count":0},"10.11.81.25":{"road":"Region 1","count":0},"10.16.28.40":{"road":"I25","count":0},"10.16.28.43":{"road":"I25","count":0},"10.16.28.44":{"road":"I25","count":0},"10.16.28.95":{"road":"I25","count":0},"10.16.28.96":{"road":"I25","count":0},"172.16.28.5":{"road":"I25","count":0},"172.16.28.27":{"road":"I25","count":0},"172.16.28.121":{"road":"I25","count":0},"10.16.28.22":{"road":"C470","count":0},"10.16.28.114":{"road":"C470","count":0},"10.16.28.142":{"road":"C470","count":0},"172.16.28.154":{"road":"I70","count":0},"172.16.28.161":{"road":"I70","count":0},"172.16.28.172":{"road":"I70","count":0},"172.16.28.182":{"road":"I70","count":0},"10.16.28.67":{"road":"I76","count":0},"172.16.28.47":{"road":"I76","count":0},"172.16.28.86":{"road":"I76","count":0},"172.16.28.26":{"road":"I225","count":0},"10.11.81.14":{"road":"Region 1","count":0},"10.11.81.22":{"road":"Region 1","count":0},"10.16.28.74":{"road":"I25","count":0},"10.16.28.130":{"road":"I25","count":0},"172.16.28.4":{"road":"I25","count":0},"172.16.28.109":{"road":"I25","count":0},"10.16.28.21":{"road":"C470","count":0},"10.16.28.89":{"road":"C470","count":0},"172.16.28.44":{"road":"C470","count":0},"172.16.28.48":{"road":"C470","count":0},"172.16.28.136":{"road":"I70","count":0},"172.16.28.153":{"road":"I70","count":0},"172.16.28.177":{"road":"I70","count":0},"172.16.28.183":{"road":"I70","count":0},"172.16.28.186":{"road":"I70","count":0},"172.16.28.214":{"road":"I70","count":0},"172.16.28.224":{"road":"I70","count":0},"172.16.28.229":{"road":"I70","count":0},"172.16.28.253":{"road":"I70","count":0},"10.16.28.64":{"road":"I76","count":0},"10.16.28.32":{"road":"I25","count":0},"10.16.28.61":{"road":"I25","count":0},"10.16.28.86":{"road":"I25","count":0},"172.16.28.56":{"road":"I25","count":0},"172.16.28.78":{"road":"I25","count":0},"172.16.28.122":{"road":"I25","count":0},"172.16.28.123":{"road":"I25","count":0},"10.16.28.98":{"road":"C470","count":0},"10.16.28.139":{"road":"C470","count":0},"172.16.28.100":{"road":"I70","count":0},"172.16.28.181":{"road":"I70","count":0},"172.16.28.192":{"road":"I70","count":0},"172.16.28.227":{"road":"I70","count":0},"172.16.28.238":{"road":"I70","count":0},"172.16.28.45":{"road":"I270","count":0},"10.11.81.40":{"road":"Region 1","count":0},"172.16.28.106":{"road":"I25","count":0},"172.16.28.239":{"road":"I25","count":0},"172.16.28.246":{"road":"I25","count":0},"10.16.28.13":{"road":"C470","count":0},"172.16.28.11":{"road":"I70","count":0},"172.16.28.132":{"road":"I70","count":0},"172.16.28.165":{"road":"I70","count":0},"172.16.28.193":{"road":"I70","count":0},"172.16.28.202":{"road":"I70","count":0},"172.16.28.215":{"road":"I70","count":0},"172.16.28.217":{"road":"I70","count":0},"172.16.28.221":{"road":"I70","count":0},"10.16.28.51":{"road":"I76","count":0},"172.16.28.25":{"road":"I225","count":0},"172.16.28.34":{"road":"I225","count":0},"172.16.28.15":{"road":"I270","count":0},"10.11.81.24":{"road":"Region 1","count":0},"10.11.81.29":{"road":"Region 1","count":0},"10.11.81.30":{"road":"Region 1","count":0},"10.16.28.8":{"road":"I25","count":0},"10.16.28.28":{"road":"I25","count":0},"10.16.28.70":{"road":"I25","count":0},"10.16.28.85":{"road":"I25","count":0},"10.16.28.87":{"road":"I25","count":0},"172.16.28.20":{"road":"I25","count":0},"172.16.28.69":{"road":"I25","count":0},"172.16.28.77":{"road":"I25","count":0},"172.16.28.85":{"road":"I25","count":0},"172.16.28.94":{"road":"I25","count":0},"172.16.28.108":{"road":"I25","count":0},"172.16.28.127":{"road":"I25","count":0},"172.16.28.129":{"road":"I25","count":0},"172.16.28.252":{"road":"I25","count":0},"172.16.28.49":{"road": +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.test","first_name":"test","last_name":"test","super_user":false,"organizations":[{"name":"testorg","role":"admin"}]}]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ Admin.js:14 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ Admin.js:14 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"10.16.28.89","geo_position":{"latitude":39.558933,"longitude":-105.006405},"milepost":18.5,"primary_route":"C470","serial_number":"2149401003477","scms_id":"2149401003477","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"4.1","organizations":["CDOT CV"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} +api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND BODY {"orig_ip":"10.16.28.89","ip":"10.16.28.89","geo_position":{"latitude":39.558933,"longitude":-105.006405},"milepost":18.6,"primary_route":"C470","serial_number":"2149401003477","model":"Commsignia ITS-RS4-M","scms_id":"2149401003477","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"4.1","organizations_to_add":[],"organizations_to_remove":[]} AND RESPONSE {"message":"RSU successfully modified"} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- +api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND BODY {"orig_ip":"10.16.28.89","ip":"10.16.28.89","geo_position":{"latitude":39.558933,"longitude":-105.006405},"milepost":18.5,"primary_route":"C470","serial_number":"2149401003477","model":"Commsignia ITS-RS4-M","scms_id":"2149401003477","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"4.1","organizations_to_add":[],"organizations_to_remove":[]} AND RESPONSE {"message":"RSU successfully modified"} +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]} +api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND BODY {"ip":"1.1.1.1","milepost":1,"serial_number":"1234","scms_id":"1234","geo_position":{"latitude":12,"longitude":23},"primary_route":"C470","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["CDOT CV"]} AND RESPONSE {"message":"New RSU successfully added"} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:151 DELETE REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"message":"RSU successfully deleted"} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +onDelete @ AdminRsuTab.js:96 +onClick @ AdminRsuTab.js:52 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +onDelete @ AdminRsuTab.js:96 +onClick @ AdminRsuTab.js:52 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":{"email":"test@test.test","first_name":"test","last_name":"test","super_user":false,"organizations":[{"name":"testorg","role":"admin"}]},"allowed_selections":{"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]}} +react-jsx-dev-runtime.development.js:106 Warning: Each child in a list should have a unique "key" prop. + +Check the render method of `AdminEditUser`. See https://reactjs.org/link/warning-keys for more information. + at http://localhost:3000/static/js/bundle.js:159082:5 + at AdminEditUser (http://localhost:3000/static/js/bundle.js:6892:76) + at div + at div + at AdminUserTab (http://localhost:3000/static/js/bundle.js:10275:76) + at div + at AdminFormManager (http://localhost:3000/static/js/bundle.js:954:7) + at div + at div + at TabPanel (http://localhost:3000/static/js/bundle.js:239007:24) + at div + at UncontrolledTabs (http://localhost:3000/static/js/bundle.js:239271:63) + at Tabs (http://localhost:3000/static/js/bundle.js:239110:24) + at div + at Admin (http://localhost:3000/static/js/bundle.js:13290:76) + at div + at div + at Tabs (http://localhost:3000/static/js/bundle.js:3301:5) + at div + at Grid (http://localhost:3000/static/js/bundle.js:38934:35) + at WithStyles (http://localhost:3000/static/js/bundle.js:41422:31) + at div + at GoogleOAuthProvider (http://localhost:3000/static/js/bundle.js:94219:5) + at App (http://localhost:3000/static/js/bundle.js:61:77) + at Provider (http://localhost:3000/static/js/bundle.js:231775:5) +printWarning @ react-jsx-dev-runtime.development.js:106 +error @ react-jsx-dev-runtime.development.js:85 +validateExplicitKey @ react-jsx-dev-runtime.development.js:850 +validateChildKeys @ react-jsx-dev-runtime.development.js:873 +jsxWithValidation @ react-jsx-dev-runtime.development.js:1008 +AdminEditUser @ AdminEditUser.js:135 +renderWithHooks @ react-dom.development.js:12980 +updateFunctionComponent @ react-dom.development.js:15082 +beginWork @ react-dom.development.js:16529 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +getUserData.condition.getState.getState @ adminEditUserSlice.js:66 +await in getUserData.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminEditUser.js:59 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND BODY {"orig_email":"test@test.test","email":"test@test.test","first_name":"test","last_name":"test","super_user":false,"organizations_to_add":[{"name":"Region 1","role":"admin"}],"organizations_to_modify":[],"organizations_to_remove":[]} AND RESPONSE {"message":"User successfully modified"} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.test","first_name":"test","last_name":"test","super_user":false,"organizations":[{"name":"testorg","role":"admin"},{"name":"Region 1","role":"admin"}]}]} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:151 DELETE REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"message":"User successfully deleted"} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND RESPONSE {"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]} +react-jsx-dev-runtime.development.js:106 Warning: Each child in a list should have a unique "key" prop. + +Check the render method of `AdminAddUser`. See https://reactjs.org/link/warning-keys for more information. + at http://localhost:3000/static/js/bundle.js:159082:5 + at AdminAddUser (http://localhost:3000/static/js/bundle.js:4812:76) + at div + at div + at AdminUserTab (http://localhost:3000/static/js/bundle.js:10275:76) + at div + at AdminFormManager (http://localhost:3000/static/js/bundle.js:954:7) + at div + at div + at TabPanel (http://localhost:3000/static/js/bundle.js:239007:24) + at div + at UncontrolledTabs (http://localhost:3000/static/js/bundle.js:239271:63) + at Tabs (http://localhost:3000/static/js/bundle.js:239110:24) + at div + at Admin (http://localhost:3000/static/js/bundle.js:13290:76) + at div + at div + at Tabs (http://localhost:3000/static/js/bundle.js:3301:5) + at div + at Grid (http://localhost:3000/static/js/bundle.js:38934:35) + at WithStyles (http://localhost:3000/static/js/bundle.js:41422:31) + at div + at GoogleOAuthProvider (http://localhost:3000/static/js/bundle.js:94219:5) + at App (http://localhost:3000/static/js/bundle.js:61:77) + at Provider (http://localhost:3000/static/js/bundle.js:231775:5) +printWarning @ react-jsx-dev-runtime.development.js:106 +error @ react-jsx-dev-runtime.development.js:85 +validateExplicitKey @ react-jsx-dev-runtime.development.js:850 +validateChildKeys @ react-jsx-dev-runtime.development.js:873 +jsxWithValidation @ react-jsx-dev-runtime.development.js:1008 +AdminAddUser @ AdminAddUser.js:117 +renderWithHooks @ react-dom.development.js:12980 +updateFunctionComponent @ react-dom.development.js:15082 +beginWork @ react-dom.development.js:16529 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND BODY {"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]} AND RESPONSE {"message":"New user successfully added"} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND RESPONSE {"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":[{"name":"CDOT CV","user_count":12,"rsu_count":313},{"name":"brandon_test_org","user_count":0,"rsu_count":0},{"name":"Region 1","user_count":3,"rsu_count":28},{"name":"testorg","user_count":0,"rsu_count":0}]} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[],"org_rsus":[]},"allowed_selections":{"user_roles":["user","operator","admin"]}} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTabUser.js:129 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTabUser.js:129 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]} +api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND BODY {"ip":"1.1.1.1","milepost":1,"serial_number":"1234","scms_id":"1234","geo_position":{"latitude":12,"longitude":23},"primary_route":"C470","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["CDOT CV","testorg","brandon_test_org"]} AND RESPONSE {"message":"New RSU successfully added"} +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND RESPONSE {"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":[{"name":"CDOT CV","user_count":12,"rsu_count":314},{"name":"brandon_test_org","user_count":0,"rsu_count":1},{"name":"Region 1","user_count":3,"rsu_count":28},{"name":"testorg","user_count":0,"rsu_count":1}]} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"1.1.1.1","geo_position":{"latitude":12,"longitude":23},"milepost":1,"primary_route":"C470","serial_number":"1234","scms_id":"1234","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["CDOT CV","testorg","brandon_test_org"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} +api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND BODY {"orig_name":"CDOT CV","name":"CDOT CV","users_to_add":[],"users_to_modify":[],"users_to_remove":[],"rsus_to_add":[],"rsus_to_remove":["1.1.1.1"]} AND RESPONSE {"message":"Organization successfully modified"} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabRsuSlice.js:58 +Promise.then (async) +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabRsuSlice.js:58 +Promise.then (async) +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabRsuSlice.js:58 +Promise.then (async) +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabRsuSlice.js:58 +Promise.then (async) +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},"allowed_selections":{"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]}} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +updateTableData @ AdminOrganizationTab.js:66 +refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabUserSlice.js:86 +Promise.then (async) +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +updateTableData @ AdminOrganizationTab.js:66 +refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabUserSlice.js:86 +Promise.then (async) +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +updateTableData @ AdminOrganizationTab.js:66 +refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabUserSlice.js:86 +Promise.then (async) +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +updateTableData @ AdminOrganizationTab.js:66 +refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabUserSlice.js:86 +Promise.then (async) +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"1.1.1.1","geo_position":{"latitude":12,"longitude":23},"milepost":1,"primary_route":"C470","serial_number":"1234","scms_id":"1234","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["testorg","brandon_test_org"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},"allowed_selections":{"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]}} +api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND BODY {"orig_email":"test@test.com","email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations_to_add":[{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}],"organizations_to_modify":[],"organizations_to_remove":[]} AND RESPONSE {"message":"User successfully modified"} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}]}]} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND RESPONSE {"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":[{"name":"brandon_test_org","user_count":1,"rsu_count":1},{"name":"Region 1","user_count":3,"rsu_count":28},{"name":"testorg","user_count":1,"rsu_count":1},{"name":"CDOT CV","user_count":12,"rsu_count":313}]} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}]}]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTabRsu.js:80 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTabRsu.js:80 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTabRsu.js:80 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTabRsu.js:80 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +(anonymous) @ AdminOrganizationTab.js:62 +invokePassiveEffectCreate @ react-dom.development.js:20262 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +flushPassiveEffectsImpl @ react-dom.development.js:20332 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushPassiveEffects @ react-dom.development.js:20228 +performSyncWorkOnRoot @ react-dom.development.js:19229 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}]}]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"1.1.1.1","primary_route":"C470","milepost":1}]},"allowed_selections":{"user_roles":["user","operator","admin"]}} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"1.1.1.1","geo_position":{"latitude":12,"longitude":23},"milepost":1,"primary_route":"C470","serial_number":"1234","scms_id":"1234","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["testorg","brandon_test_org"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} +api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND BODY {"orig_name":"brandon_test_org","name":"brandon_test_org","users_to_add":[],"users_to_modify":[],"users_to_remove":[],"rsus_to_add":[],"rsus_to_remove":["1.1.1.1"]} AND RESPONSE {"message":"Organization successfully modified"} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[]},"allowed_selections":{"user_roles":["user","operator","admin"]}} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabRsuSlice.js:58 +Promise.then (async) +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabRsuSlice.js:58 +Promise.then (async) +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabRsuSlice.js:58 +Promise.then (async) +rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 +await in rsuDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +rsuOnDelete @ AdminOrganizationTabRsu.js:84 +onClick @ AdminOrganizationTabRsu.js:49 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}]},"allowed_selections":{"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]}} +api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND BODY {"orig_name":"brandon_test_org","name":"brandon_test_org","users_to_add":[],"users_to_modify":[],"users_to_remove":[{"email":"test@test.com","role":"admin"}],"rsus_to_add":[],"rsus_to_remove":[]} AND RESPONSE {"message":"Organization successfully modified"} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:75 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:75 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +editOrganization @ AdminOrganizationTab.js:77 +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:75 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"testorg","role":"admin"}]}]} +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[],"org_rsus":[]},"allowed_selections":{"user_roles":["user","operator","admin"]}} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +updateTableData @ AdminOrganizationTab.js:66 +refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabUserSlice.js:86 +Promise.then (async) +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +updateTableData @ AdminOrganizationTab.js:66 +refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ adminOrganizationTabUserSlice.js:86 +Promise.then (async) +userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 +await in userDeleteSingle.condition.getState.getState (async) +(anonymous) @ redux-toolkit.esm.js:1461 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +userOnDelete @ AdminOrganizationTabUser.js:133 +onClick @ AdminOrganizationTabUser.js:74 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +discreteUpdates$1 @ react-dom.development.js:19362 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"1.1.1.1","geo_position":{"latitude":12,"longitude":23},"milepost":1,"primary_route":"C470","serial_number":"1234","scms_id":"1234","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["testorg"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} +api-helper.js:151 DELETE REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"message":"RSU successfully deleted"} +index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' +react @ index.js:27 +createStore @ LocalizationStore.js:52 +createStore @ LocalizationStore.js:172 +Provider @ context.js:15 +renderWithHooks @ react-dom.development.js:12980 +mountIndeterminateComponent @ react-dom.development.js:15463 +beginWork @ react-dom.development.js:16517 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +onDelete @ AdminRsuTab.js:96 +onClick @ AdminRsuTab.js:52 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. +setData @ data-manager.js:433 +setDataManagerFields @ material-table.js:694 +MaterialTable @ material-table.js:590 +constructClassInstance @ react-dom.development.js:11097 +updateClassComponent @ react-dom.development.js:15140 +beginWork @ react-dom.development.js:16536 +beginWork$1 @ react-dom.development.js:20634 +performUnitOfWork @ react-dom.development.js:19666 +workLoopSync @ react-dom.development.js:19611 +renderRootSync @ react-dom.development.js:19581 +performSyncWorkOnRoot @ react-dom.development.js:19251 +(anonymous) @ react-dom.development.js:9937 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +flushSyncCallbackQueueImpl @ react-dom.development.js:9933 +flushSyncCallbackQueue @ react-dom.development.js:9922 +batchedUpdates$1 @ react-dom.development.js:19333 +notify @ Subscription.js:15 +notifyNestedSubs @ Subscription.js:73 +handleChangeWrapper @ Subscription.js:77 +dispatch @ redux.js:265 +s @ VM10:3 +(anonymous) @ redux-toolkit.esm.js:554 +(anonymous) @ index.js:19 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ redux.js:612 +(anonymous) @ redux-toolkit.esm.js:1493 +step @ redux-toolkit.esm.js:95 +(anonymous) @ redux-toolkit.esm.js:44 +fulfilled @ redux-toolkit.esm.js:142 +Promise.then (async) +step @ redux-toolkit.esm.js:155 +(anonymous) @ redux-toolkit.esm.js:157 +__async @ redux-toolkit.esm.js:139 +(anonymous) @ redux-toolkit.esm.js:1423 +(anonymous) @ redux-toolkit.esm.js:1499 +(anonymous) @ index.js:16 +(anonymous) @ redux-toolkit.esm.js:430 +dispatch @ VM10:6 +onDelete @ AdminRsuTab.js:96 +onClick @ AdminRsuTab.js:52 +ReactConfirmAlert._this.handleClickButton @ index.js:70 +onClick @ index.js:147 +callCallback @ react-dom.development.js:3555 +invokeGuardedCallbackDev @ react-dom.development.js:3599 +invokeGuardedCallback @ react-dom.development.js:3654 +invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 +executeDispatch @ react-dom.development.js:7290 +processDispatchQueueItemsInOrder @ react-dom.development.js:7316 +processDispatchQueue @ react-dom.development.js:7327 +dispatchEventsForPlugins @ react-dom.development.js:7336 +(anonymous) @ react-dom.development.js:7514 +batchedEventUpdates$1 @ react-dom.development.js:19341 +batchedEventUpdates @ react-dom.development.js:3378 +dispatchEventForPluginEventSystem @ react-dom.development.js:7513 +attemptToDispatchEvent @ react-dom.development.js:5302 +dispatchEvent @ react-dom.development.js:5235 +unstable_runWithPriority @ scheduler.development.js:401 +runWithPriority$1 @ react-dom.development.js:9891 +discreteUpdates$1 @ react-dom.development.js:19356 +discreteUpdates @ react-dom.development.js:3388 +dispatchDiscreteEvent @ react-dom.development.js:5205 +api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I +api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- +api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-bsm-data WITH QUERY PARAMS [object Object] AND BODY {"start":"2023-11-13T10:49:44.000-07:00","end":"2023-11-13T13:54:07.673-07:00","geometry":[[-105.18395329918614,39.796286821490156],[-105.2825684187572,39.73832183013596],[-105.27676752937091,39.675843426647134],[-105.11086209291594,39.666020248412025],[-105.07025586721028,39.756162409815744],[-105.09693995838809,39.794504011035855],[-105.18395329918614,39.796286821490156]]} AND RESPONSE [] diff --git a/webapp/src/apis/example_responses/rsu-bsm-data_post_body.json b/webapp/src/apis/example_responses/rsu-bsm-data_post_body.json new file mode 100644 index 000000000..342551abb --- /dev/null +++ b/webapp/src/apis/example_responses/rsu-bsm-data_post_body.json @@ -0,0 +1,13 @@ +{ + "start": "2023-11-13T10:49:44.000-07:00", + "end": "2023-11-13T13:54:07.673-07:00", + "geometry": [ + [-105.18395329918614, 39.796286821490156], + [-105.2825684187572, 39.73832183013596], + [-105.27676752937091, 39.675843426647134], + [-105.11086209291594, 39.666020248412025], + [-105.07025586721028, 39.756162409815744], + [-105.09693995838809, 39.794504011035855], + [-105.18395329918614, 39.796286821490156] + ] +} diff --git a/webapp/src/apis/example_responses/rsu-bsm-data_post_resp.json b/webapp/src/apis/example_responses/rsu-bsm-data_post_resp.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/webapp/src/apis/example_responses/rsu-bsm-data_post_resp.json @@ -0,0 +1 @@ +[] diff --git a/webapp/src/apis/example_responses/rsu-command_post_rsufwdsnmpwalk.json b/webapp/src/apis/example_responses/rsu-command_post_rsufwdsnmpwalk.json new file mode 100644 index 000000000..ac20021da --- /dev/null +++ b/webapp/src/apis/example_responses/rsu-command_post_rsufwdsnmpwalk.json @@ -0,0 +1,40 @@ +{ + "RsuFwdSnmpwalk": { + "1": { + "Message Type": "BSM", + "IP": "10.235.1.36", + "Port": 46800, + "Protocol": "UDP", + "RSSI": -100, + "Frequency": 1, + "Start DateTime": "2023-04-17 17:48", + "End DateTime": "2033-04-17 17:48", + "Forwarding": "On", + "Config Active": "Enabled" + }, + "2": { + "Message Type": "BSM", + "IP": "10.235.1.66", + "Port": 46800, + "Protocol": "UDP", + "RSSI": -100, + "Frequency": 1, + "Start DateTime": "2023-04-17 17:48", + "End DateTime": "2033-04-17 17:48", + "Forwarding": "On", + "Config Active": "Enabled" + }, + "3": { + "Message Type": "BSM", + "IP": "10.235.1.3", + "Port": 46800, + "Protocol": "UDP", + "RSSI": -100, + "Frequency": 1, + "Start DateTime": "2023-04-17 17:49", + "End DateTime": "2033-04-17 17:49", + "Forwarding": "On", + "Config Active": "Enabled" + } + } +} diff --git a/webapp/src/apis/example_responses/rsu-map-info_get.json b/webapp/src/apis/example_responses/rsu-map-info_get.json new file mode 100644 index 000000000..ad5e56b90 --- /dev/null +++ b/webapp/src/apis/example_responses/rsu-map-info_get.json @@ -0,0 +1,28 @@ +[ + "10.11.81.27", + "10.11.81.25", + "10.11.81.24", + "10.11.81.23", + "10.11.81.28", + "10.11.81.22", + "10.11.81.21", + "10.11.81.20", + "10.11.81.14", + "10.11.81.18", + "10.11.81.13", + "10.11.81.19", + "10.11.81.26", + "10.11.81.12", + "10.11.81.30", + "10.11.81.29", + "10.11.81.32", + "10.11.81.33", + "10.11.81.34", + "10.11.81.35", + "10.11.81.36", + "10.11.81.37", + "10.11.81.38", + "10.11.81.39", + "10.11.81.40", + "10.11.81.31" +] diff --git a/webapp/src/apis/example_responses/rsu-online-status_get.json b/webapp/src/apis/example_responses/rsu-online-status_get.json new file mode 100644 index 000000000..70b77aaf0 --- /dev/null +++ b/webapp/src/apis/example_responses/rsu-online-status_get.json @@ -0,0 +1,185 @@ +{ + "172.16.28.204": { "current_status": "online" }, + "172.16.28.219": { "current_status": "online" }, + "172.16.28.209": { "current_status": "online" }, + "172.16.28.214": { "current_status": "online" }, + "172.16.28.220": { "current_status": "online" }, + "172.16.28.185": { "current_status": "online" }, + "172.16.28.202": { "current_status": "online" }, + "172.16.28.163": { "current_status": "offline" }, + "172.16.28.154": { "current_status": "online" }, + "172.16.28.197": { "current_status": "online" }, + "172.16.28.235": { "current_status": "online" }, + "172.16.28.184": { "current_status": "online" }, + "172.16.28.156": { "current_status": "online" }, + "172.16.28.135": { "current_status": "online" }, + "172.16.28.165": { "current_status": "online" }, + "172.16.28.213": { "current_status": "online" }, + "172.16.28.153": { "current_status": "online" }, + "172.16.28.134": { "current_status": "online" }, + "172.16.28.191": { "current_status": "online" }, + "172.16.28.186": { "current_status": "online" }, + "172.16.28.226": { "current_status": "online" }, + "172.16.28.201": { "current_status": "online" }, + "172.16.28.225": { "current_status": "online" }, + "10.11.81.12": { "current_status": "online" }, + "10.11.81.13": { "current_status": "online" }, + "10.11.81.14": { "current_status": "online" }, + "10.11.81.18": { "current_status": "online" }, + "10.11.81.19": { "current_status": "online" }, + "10.11.81.20": { "current_status": "online" }, + "10.11.81.21": { "current_status": "online" }, + "10.11.81.27": { "current_status": "online" }, + "172.16.28.162": { "current_status": "online" }, + "172.16.28.136": { "current_status": "online" }, + "172.16.28.171": { "current_status": "online" }, + "172.16.28.144": { "current_status": "offline" }, + "172.16.28.159": { "current_status": "online" }, + "172.16.28.175": { "current_status": "offline" }, + "172.16.28.182": { "current_status": "online" }, + "172.16.28.168": { "current_status": "offline" }, + "172.16.28.237": { "current_status": "online" }, + "172.16.28.166": { "current_status": "online" }, + "172.16.28.195": { "current_status": "online" }, + "172.16.28.212": { "current_status": "online" }, + "172.16.28.181": { "current_status": "offline" }, + "172.16.28.241": { "current_status": "online" }, + "172.16.28.187": { "current_status": "offline" }, + "172.16.28.218": { "current_status": "online" }, + "172.16.28.232": { "current_status": "online" }, + "172.16.28.143": { "current_status": "online" }, + "10.11.81.22": { "current_status": "online" }, + "10.11.81.23": { "current_status": "online" }, + "10.11.81.24": { "current_status": "online" }, + "10.11.81.25": { "current_status": "online" }, + "10.11.81.26": { "current_status": "online" }, + "10.11.81.28": { "current_status": "online" }, + "172.16.28.222": { "current_status": "online" }, + "172.16.28.146": { "current_status": "online" }, + "172.16.28.132": { "current_status": "online" }, + "172.16.28.142": { "current_status": "online" }, + "172.16.28.151": { "current_status": "online" }, + "172.16.28.167": { "current_status": "online" }, + "172.16.28.150": { "current_status": "online" }, + "172.16.28.133": { "current_status": "online" }, + "172.16.28.174": { "current_status": "online" }, + "172.16.28.200": { "current_status": "offline" }, + "172.16.28.236": { "current_status": "online" }, + "172.16.28.240": { "current_status": "online" }, + "172.16.28.238": { "current_status": "online" }, + "172.16.28.228": { "current_status": "online" }, + "172.16.28.234": { "current_status": "online" }, + "172.16.28.141": { "current_status": "online" }, + "172.16.28.217": { "current_status": "online" }, + "172.16.28.242": { "current_status": "offline" }, + "172.16.28.177": { "current_status": "online" }, + "172.16.28.215": { "current_status": "offline" }, + "172.16.28.224": { "current_status": "offline" }, + "172.16.28.211": { "current_status": "online" }, + "172.16.28.190": { "current_status": "offline" }, + "172.16.28.203": { "current_status": "online" }, + "172.16.28.173": { "current_status": "offline" }, + "172.16.28.155": { "current_status": "online" }, + "172.16.28.152": { "current_status": "offline" }, + "172.16.28.149": { "current_status": "offline" }, + "172.16.28.131": { "current_status": "online" }, + "172.16.28.176": { "current_status": "online" }, + "172.16.28.137": { "current_status": "online" }, + "172.16.28.207": { "current_status": "online" }, + "172.16.28.193": { "current_status": "online" }, + "172.16.28.148": { "current_status": "online" }, + "172.16.28.164": { "current_status": "online" }, + "172.16.28.157": { "current_status": "online" }, + "172.16.28.169": { "current_status": "online" }, + "172.16.28.210": { "current_status": "online" }, + "172.16.28.199": { "current_status": "online" }, + "172.16.28.188": { "current_status": "online" }, + "172.16.28.216": { "current_status": "online" }, + "172.16.28.179": { "current_status": "online" }, + "172.16.28.208": { "current_status": "online" }, + "172.16.28.172": { "current_status": "online" }, + "172.16.28.221": { "current_status": "offline" }, + "172.16.28.161": { "current_status": "online" }, + "172.16.28.160": { "current_status": "online" }, + "172.16.28.229": { "current_status": "online" }, + "172.16.28.138": { "current_status": "online" }, + "172.16.28.178": { "current_status": "offline" }, + "172.16.28.183": { "current_status": "online" }, + "172.16.28.198": { "current_status": "online" }, + "172.16.28.147": { "current_status": "online" }, + "172.16.28.227": { "current_status": "online" }, + "172.16.28.170": { "current_status": "online" }, + "172.16.28.192": { "current_status": "online" }, + "172.16.28.69": { "current_status": "online" }, + "172.16.28.56": { "current_status": "online" }, + "172.16.28.57": { "current_status": "online" }, + "172.16.28.59": { "current_status": "online" }, + "172.16.28.68": { "current_status": "online" }, + "172.16.28.72": { "current_status": "online" }, + "172.16.28.74": { "current_status": "online" }, + "172.16.28.49": { "current_status": "online" }, + "172.16.28.42": { "current_status": "online" }, + "172.16.28.41": { "current_status": "online" }, + "172.16.28.44": { "current_status": "offline" }, + "172.16.28.45": { "current_status": "online" }, + "172.16.28.46": { "current_status": "online" }, + "172.16.28.48": { "current_status": "online" }, + "172.16.28.40": { "current_status": "online" }, + "172.16.28.32": { "current_status": "online" }, + "172.16.28.33": { "current_status": "online" }, + "172.16.28.26": { "current_status": "online" }, + "172.16.28.34": { "current_status": "offline" }, + "172.16.28.35": { "current_status": "online" }, + "172.16.28.36": { "current_status": "online" }, + "172.16.28.29": { "current_status": "online" }, + "172.16.28.30": { "current_status": "offline" }, + "172.16.28.25": { "current_status": "online" }, + "172.16.28.23": { "current_status": "online" }, + "172.16.28.243": { "current_status": "online" }, + "172.16.28.112": { "current_status": "online" }, + "172.16.28.113": { "current_status": "online" }, + "172.16.28.12": { "current_status": "online" }, + "172.16.28.80": { "current_status": "online" }, + "172.16.28.82": { "current_status": "online" }, + "172.16.28.4": { "current_status": "online" }, + "172.16.28.100": { "current_status": "online" }, + "172.16.28.101": { "current_status": "online" }, + "172.16.28.253": { "current_status": "online" }, + "10.11.81.29": { "current_status": "online" }, + "10.11.81.30": { "current_status": "online" }, + "10.11.81.31": { "current_status": "online" }, + "10.11.81.32": { "current_status": "online" }, + "10.11.81.33": { "current_status": "online" }, + "10.11.81.34": { "current_status": "online" }, + "10.11.81.35": { "current_status": "online" }, + "10.11.81.36": { "current_status": "online" }, + "10.11.81.37": { "current_status": "online" }, + "10.11.81.38": { "current_status": "online" }, + "10.11.81.39": { "current_status": "online" }, + "10.11.81.40": { "current_status": "online" }, + "172.16.28.98": { "current_status": "online" }, + "172.16.28.104": { "current_status": "online" }, + "172.16.28.252": { "current_status": "online" }, + "172.16.28.54": { "current_status": "online" }, + "172.16.28.47": { "current_status": "offline" }, + "172.16.28.21": { "current_status": "online" }, + "172.16.28.27": { "current_status": "online" }, + "10.16.28.97": { "current_status": "online" }, + "10.16.28.84": { "current_status": "online" }, + "10.16.28.9": { "current_status": "online" }, + "172.16.28.120": { "current_status": "online" }, + "10.16.28.99": { "current_status": "online" }, + "10.16.28.26": { "current_status": "online" }, + "10.16.28.57": { "current_status": "online" }, + "10.16.28.28": { "current_status": "online" }, + "10.16.28.25": { "current_status": "online" }, + "10.11.81.17": { "current_status": "online" }, + "172.16.28.20": { "current_status": "online" }, + "10.16.28.44": { "current_status": "online" }, + "10.16.28.73": { "current_status": "online" }, + "10.16.28.74": { "current_status": "online" }, + "10.16.28.75": { "current_status": "online" }, + "10.16.28.96": { "current_status": "online" }, + "10.16.28.86": { "current_status": "online" }, + "10.16.28.40": { "current_status": "online" } +} diff --git a/webapp/src/apis/example_responses/rsucounts_get.json b/webapp/src/apis/example_responses/rsucounts_get.json new file mode 100644 index 000000000..bd368255c --- /dev/null +++ b/webapp/src/apis/example_responses/rsucounts_get.json @@ -0,0 +1,121 @@ +{ + "10.11.81.14": { "road": "Region 1", "count": 0 }, + "10.11.81.22": { "road": "Region 1", "count": 0 }, + "10.16.28.74": { "road": "I25", "count": 0 }, + "10.16.28.130": { "road": "I25", "count": 0 }, + "172.16.28.4": { "road": "I25", "count": 0 }, + "172.16.28.109": { "road": "I25", "count": 0 }, + "10.16.28.21": { "road": "C470", "count": 0 }, + "10.16.28.89": { "road": "C470", "count": 0 }, + "172.16.28.44": { "road": "C470", "count": 0 }, + "172.16.28.48": { "road": "C470", "count": 0 }, + "172.16.28.136": { "road": "I70", "count": 0 }, + "172.16.28.153": { "road": "I70", "count": 0 }, + "172.16.28.177": { "road": "I70", "count": 0 }, + "172.16.28.183": { "road": "I70", "count": 0 }, + "172.16.28.186": { "road": "I70", "count": 0 }, + "172.16.28.214": { "road": "I70", "count": 0 }, + "172.16.28.224": { "road": "I70", "count": 0 }, + "172.16.28.229": { "road": "I70", "count": 0 }, + "172.16.28.253": { "road": "I70", "count": 0 }, + "10.16.28.64": { "road": "I76", "count": 0 }, + "10.11.81.12": { "road": "Region 1", "count": 0 }, + "10.16.28.47": { "road": "I25", "count": 0 }, + "10.16.28.129": { "road": "I25", "count": 0 }, + "172.16.28.54": { "road": "I25", "count": 0 }, + "172.16.28.68": { "road": "I25", "count": 0 }, + "172.16.28.91": { "road": "I25", "count": 0 }, + "10.16.28.54": { "road": "C470", "count": 0 }, + "172.16.28.19": { "road": "I70", "count": 0 }, + "172.16.28.134": { "road": "I70", "count": 0 }, + "172.16.28.159": { "road": "I70", "count": 0 }, + "172.16.28.167": { "road": "I70", "count": 0 }, + "172.16.28.203": { "road": "I70", "count": 0 }, + "172.16.28.220": { "road": "I70", "count": 0 }, + "172.16.28.46": { "road": "I270", "count": 0 }, + "10.11.81.28": { "road": "Region 1", "count": 0 }, + "10.11.81.34": { "road": "Region 1", "count": 0 }, + "10.16.28.12": { "road": "I25", "count": 0 }, + "10.16.28.33": { "road": "I25", "count": 0 }, + "10.16.28.38": { "road": "I25", "count": 0 }, + "172.16.28.59": { "road": "I25", "count": 0 }, + "10.16.28.113": { "road": "C470", "count": 0 }, + "172.16.28.21": { "road": "I70", "count": 0 }, + "172.16.28.113": { "road": "I70", "count": 0 }, + "172.16.28.143": { "road": "I70", "count": 0 }, + "172.16.28.157": { "road": "I70", "count": 0 }, + "172.16.28.200": { "road": "I70", "count": 0 }, + "172.16.28.225": { "road": "I70", "count": 0 }, + "10.11.81.33": { "road": "Region 1", "count": 0 }, + "10.11.81.35": { "road": "Region 1", "count": 0 }, + "10.11.81.37": { "road": "Region 1", "count": 0 }, + "10.11.81.38": { "road": "Region 1", "count": 0 }, + "10.16.28.88": { "road": "I25", "count": 0 }, + "10.16.28.100": { "road": "I25", "count": 0 }, + "172.16.28.7": { "road": "I25", "count": 0 }, + "172.16.28.14": { "road": "I25", "count": 0 }, + "172.16.28.57": { "road": "I25", "count": 0 }, + "172.16.28.67": { "road": "I25", "count": 0 }, + "172.16.28.87": { "road": "I25", "count": 0 }, + "172.16.28.90": { "road": "I25", "count": 0 }, + "172.16.28.30": { "road": "C470", "count": 0 }, + "172.16.28.96": { "road": "C470", "count": 0 }, + "172.16.28.12": { "road": "I70", "count": 0 }, + "172.16.28.81": { "road": "I70", "count": 0 }, + "172.16.28.146": { "road": "I70", "count": 0 }, + "172.16.28.151": { "road": "I70", "count": 0 }, + "172.16.28.164": { "road": "I70", "count": 0 }, + "172.16.28.174": { "road": "I70", "count": 0 }, + "172.16.28.179": { "road": "I70", "count": 0 }, + "172.16.28.197": { "road": "I70", "count": 0 }, + "172.16.28.211": { "road": "I70", "count": 0 }, + "172.16.28.218": { "road": "I70", "count": 0 }, + "172.16.28.228": { "road": "I70", "count": 0 }, + "172.16.28.232": { "road": "I70", "count": 0 }, + "172.16.28.240": { "road": "I70", "count": 0 }, + "172.16.28.244": { "road": "I76", "count": 0 }, + "172.16.28.6": { "road": "I225", "count": 0 }, + "172.16.28.16": { "road": "I270", "count": 0 }, + "172.16.28.116": { "road": "C470", "count": 4 }, + "10.11.81.17": { "road": "Region 1", "count": 0 }, + "10.11.81.21": { "road": "Region 1", "count": 0 }, + "10.16.28.15": { "road": "I25", "count": 0 }, + "10.16.28.25": { "road": "I25", "count": 0 }, + "10.16.28.65": { "road": "I25", "count": 0 }, + "10.16.28.99": { "road": "I25", "count": 0 }, + "172.16.28.111": { "road": "I25", "count": 0 }, + "172.16.28.126": { "road": "I25", "count": 0 }, + "172.16.28.251": { "road": "I25", "count": 0 }, + "10.16.28.55": { "road": "C470", "count": 0 }, + "10.16.28.56": { "road": "C470", "count": 0 }, + "172.16.28.95": { "road": "C470", "count": 0 }, + "10.16.28.48": { "road": "I70", "count": 0 }, + "172.16.28.184": { "road": "I70", "count": 0 }, + "172.16.28.199": { "road": "I70", "count": 0 }, + "172.16.28.201": { "road": "I70", "count": 0 }, + "172.16.28.204": { "road": "I70", "count": 0 }, + "10.11.81.13": { "road": "Region 1", "count": 0 }, + "10.11.81.19": { "road": "Region 1", "count": 0 }, + "10.11.81.31": { "road": "Region 1", "count": 0 }, + "10.16.28.9": { "road": "I25", "count": 0 }, + "10.16.28.41": { "road": "I25", "count": 0 }, + "10.16.28.84": { "road": "I25", "count": 0 }, + "172.16.28.64": { "road": "I25", "count": 0 }, + "172.16.28.98": { "road": "I25", "count": 0 }, + "172.16.28.103": { "road": "I25", "count": 0 }, + "172.16.28.119": { "road": "I25", "count": 0 }, + "10.16.28.141": { "road": "C470", "count": 0 }, + "172.16.28.36": { "road": "C470", "count": 0 }, + "172.16.28.135": { "road": "I70", "count": 0 }, + "172.16.28.185": { "road": "I70", "count": 0 }, + "172.16.28.207": { "road": "I70", "count": 0 }, + "172.16.28.219": { "road": "I70", "count": 0 }, + "172.16.28.41": { "road": "I76", "count": 0 }, + "10.11.81.23": { "road": "Region 1", "count": 0 }, + "10.16.28.11": { "road": "I25", "count": 0 }, + "10.16.28.34": { "road": "I25", "count": 0 }, + "10.16.28.66": { "road": "I25", "count": 0 }, + "10.16.28.68": { "road": "I25", "count": 0 }, + "10.16.28.78": { "road": "I25", "count": 0 }, + "172.16.28.18": { "road": "I25", "count": 0 } +} diff --git a/webapp/src/apis/example_responses/rsuinfo_get.json b/webapp/src/apis/example_responses/rsuinfo_get.json new file mode 100644 index 000000000..e1095342b --- /dev/null +++ b/webapp/src/apis/example_responses/rsuinfo_get.json @@ -0,0 +1,214 @@ +{ + "rsuList": [ + { + "id": 317, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.004905, 39.761463] }, + "properties": { + "rsu_id": 317, + "milepost": 212.05, + "geography": "0101000020E61000008FA50F5D50405AC0990E9D9E77E14340", + "model_name": "RSU2X US", + "ipv4_address": "172.16.28.92", + "primary_route": "I25", + "serial_number": "SPLP7101396", + "manufacturer_name": "Yunex" + } + }, + { + "id": 1, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-106.35329, 39.64216] }, + "properties": { + "rsu_id": 1, + "milepost": 177.3, + "geography": "0101000020E61000003F00A94D9C965AC05166834C32D24340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.204", + "primary_route": "I70", + "serial_number": "RSE00333", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 318, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.017186, 39.75141] }, + "properties": { + "rsu_id": 318, + "milepost": 211.1, + "geography": "0101000020E6100000BDFC4E9319415AC095F1EF332EE04340", + "model_name": "RSU2X US", + "ipv4_address": "172.16.28.93", + "primary_route": "I25", + "serial_number": "SPLP7101384", + "manufacturer_name": "Yunex" + } + }, + { + "id": 68, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.20139, 39.7028] }, + "properties": { + "rsu_id": 68, + "milepost": 259.12, + "geography": "0101000020E610000074EFE192E34C5AC07DD0B359F5D94340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.236", + "primary_route": "I70", + "serial_number": "RSE00328", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 43, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.53613, 39.74438] }, + "properties": { + "rsu_id": 43, + "milepost": 238.8, + "geography": "0101000020E6100000E31934F44F625AC0F3E505D847DF4340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.166", + "primary_route": "I70", + "serial_number": "RFS00085", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 41, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.66319, 39.75177] }, + "properties": { + "rsu_id": 41, + "milepost": 231.2, + "geography": "0101000020E6100000314278B4716A5AC0950ED6FF39E04340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.168", + "primary_route": "I70", + "serial_number": "SPP00062", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 3, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-106.11222, 39.57817] }, + "properties": { + "rsu_id": 3, + "milepost": 201.1, + "geography": "0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.209", + "primary_route": "I70", + "serial_number": "RSE00341", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 42, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.55402, 39.75219] }, + "properties": { + "rsu_id": 42, + "milepost": 237.67, + "geography": "0101000020E61000001D554D1075635AC06A300DC347E04340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.237", + "primary_route": "I70", + "serial_number": "RFS00090", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 58, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.46388, 39.74698] }, + "properties": { + "rsu_id": 58, + "milepost": 242.7, + "geography": "0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.222", + "primary_route": "I70", + "serial_number": "SEM00010", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 67, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.20242, 39.70149] }, + "properties": { + "rsu_id": 67, + "milepost": 259.01, + "geography": "0101000020E61000009B030473F44C5AC04B3CA06CCAD94340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.200", + "primary_route": "I70", + "serial_number": "SPP00067", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 66, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.23415, 39.69836] }, + "properties": { + "rsu_id": 66, + "milepost": 257, + "geography": "0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.174", + "primary_route": "I70", + "serial_number": "RSE00322", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 65, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.24034, 39.70134] }, + "properties": { + "rsu_id": 65, + "milepost": 256.6, + "geography": "0101000020E6100000ECFA05BB614F5AC036B05582C5D94340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.133", + "primary_route": "I70", + "serial_number": "RFS00079", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 63, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.27525, 39.7061] }, + "properties": { + "rsu_id": 63, + "milepost": 254.7, + "geography": "0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.167", + "primary_route": "I70", + "serial_number": "RFS00081", + "manufacturer_name": "Kapsch" + } + }, + { + "id": 62, + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-105.2943, 39.71053] }, + "properties": { + "rsu_id": 62, + "milepost": 253.55, + "geography": "0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340", + "model_name": "RIS-9260", + "ipv4_address": "172.16.28.151", + "primary_route": "I70", + "serial_number": "RSE00309", + "manufacturer_name": "Kapsch" + } + } + ] +} diff --git a/webapp/src/apis/rsu-api-types.ts b/webapp/src/apis/rsu-api-types.ts new file mode 100644 index 000000000..16875d786 --- /dev/null +++ b/webapp/src/apis/rsu-api-types.ts @@ -0,0 +1,71 @@ +export type RsuInfo = { + rsuList: Array<{ + id: number + type: 'Feature' + geometry: { + type: 'Point' + coordinates: Array + } + properties: { + rsu_id: number + milepost: number + geography: string + model_name: string + ipv4_adddress: string + primary_route: string + serial_number: string + manufacturer_name: string + } + }> +} + +export type RsuOnlineStatus = { + [ip: string]: { + current_status: 'online' | 'offline' | 'unstable' + last_online: string | undefined + } +} + +export type RsuCounts = { + [ip: string]: { + road: string + count: number + } +} + +// No response used, this method does not appear to be used +export type GetRsuUserAuthResp = {} + +// No response used, this method does not appear to be used +export type GetRsuCommandResp = {} + +export type RsuMapInfo = string[] + +// No response used, this method does not appear to be used +export type SsmSrmData = {} + +export type IssScmsStatus = { + [ip: string]: { + health: 0 | 1 + expiration: string + } +} + +export type BsmDataPostBody = { + start: string + end: string + geometry: number[][] +} + +export type RsuCommandPostBody = { + command: 'rsufwdsnmpwalk' | 'rsufwdsnmpset' | 'rsufwdsnmpset-del' | 'snmpFilter' | 'reboot' + rsu_ip: string[] + args: Object +} + +export type ApiMsgResp = { message: string } +export type ApiMsgRespWithCodes = { + body: Object + status: number + message: string +} diff --git a/webapp/src/apis/rsu-api.d.ts b/webapp/src/apis/rsu-api.d.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/webapp/src/apis/rsu-api.ts b/webapp/src/apis/rsu-api.ts index 9305b86b2..9b72d946b 100644 --- a/webapp/src/apis/rsu-api.ts +++ b/webapp/src/apis/rsu-api.ts @@ -1,51 +1,100 @@ import EnvironmentVars from '../EnvironmentVars' +import { WZDxWorkZoneFeed } from '../types/wzdx/WzdxWorkZoneFeed42' import apiHelper from './api-helper' +import { + ApiMsgResp, + ApiMsgRespWithCodes, + BsmDataPostBody, + GetRsuCommandResp, + GetRsuUserAuthResp, + IssScmsStatus, + RsuCommandPostBody, + RsuCounts, + RsuInfo, + RsuMapInfo, + RsuOnlineStatus, + SsmSrmData, +} from './rsu-api-types' class RsuApi { // External Methods - getRsuInfo = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => + getRsuInfo = async ( + token: string, + org: string, + url_ext: string = '', + query_params: Record = {} + ): Promise => apiHelper._getData({ url: EnvironmentVars.rsuInfoEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuOnline = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => + getRsuOnline = async ( + token: string, + org: string, + url_ext: string = '', + query_params: Record = {} + ): Promise => apiHelper._getData({ url: EnvironmentVars.rsuOnlineEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuCounts = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => + getRsuCounts = async ( + token: string, + org: string, + url_ext: string = '', + query_params: Record = {} + ): Promise => apiHelper._getData({ url: EnvironmentVars.rsuCountsEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuAuth = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => + getRsuAuth = async ( + token: string, + org: string, + url_ext: string = '', + query_params: Record = {} + ): Promise => apiHelper._getData({ url: EnvironmentVars.authEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuCommand = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => + getRsuCommand = async ( + token: string, + org: string, + url_ext: string = '', + query_params: Record = {} + ): Promise => apiHelper._getData({ url: EnvironmentVars.rsuCommandEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getRsuMapInfo = async (token: string, org: string, url_ext: string = '', query_params: Record = {}) => + getRsuMapInfo = async ( + token: string, + org: string, + url_ext: string = '', + query_params: Record = {} + ): Promise => apiHelper._getData({ url: EnvironmentVars.rsuMapInfoEndpoint + url_ext, token, query_params, additional_headers: { Organization: org }, }) - getSsmSrmData = async (token: string, url_ext: string = '', query_params: Record = {}) => + getSsmSrmData = async ( + token: string, + url_ext: string = '', + query_params: Record = {} + ): Promise => apiHelper._getData({ url: EnvironmentVars.ssmSrmEndpoint + url_ext, token, @@ -56,7 +105,7 @@ class RsuApi { org: string, url_ext: string = '', query_params: Record = {} - ) => + ): Promise => apiHelper._getData({ url: EnvironmentVars.issScmsStatusEndpoint + url_ext, token, @@ -65,7 +114,7 @@ class RsuApi { }) // WZDx - getWzdxData = async (token: string, url_ext: string = '', query_params = {}) => + getWzdxData = async (token: string, url_ext: string = '', query_params = {}): Promise => apiHelper._getData({ url: EnvironmentVars.wzdxEndpoint + url_ext, token, @@ -73,22 +122,26 @@ class RsuApi { }) // POST - postBsmData = async (token: string, body: Object, url_ext: string = '') => + postBsmData = async (token: string, body: BsmDataPostBody, url_ext: string = ''): Promise => apiHelper._postData({ url: EnvironmentVars.bsmDataEndpoint + url_ext, body, token }) // POST - postRsuData = async (token: string, org: string, body: Object, url_ext = '') => { - body = JSON.stringify(body) + postRsuData = async ( + token: string, + org: string, + body: RsuCommandPostBody, + url_ext = '' + ): Promise => { return await apiHelper._postData({ url: EnvironmentVars.rsuCommandEndpoint + url_ext, - body, + body: JSON.stringify(body), token, additional_headers: { Organization: org }, }) } // POST - postRsuGeo = async (token: string, org: string, body: Object, url_ext: string) => { + postRsuGeo = async (token: string, org: string, body: Object, url_ext: string): Promise => { return await apiHelper._postData({ url: EnvironmentVars.rsuGeoQueryEndpoint + url_ext, body, @@ -98,7 +151,7 @@ class RsuApi { } // POST - postContactSupport = async (json: Object) => { + postContactSupport = async (json: Object): Promise => { return await apiHelper._postData({ url: EnvironmentVars.contactSupport, body: JSON.stringify(json), diff --git a/webapp/src/constants.tsx b/webapp/src/constants.tsx index e3bc05c8d..cc907e2ab 100644 --- a/webapp/src/constants.tsx +++ b/webapp/src/constants.tsx @@ -1,4 +1,5 @@ -export const MessageTypes = ['BSM', 'SSM', 'SPAT', 'SRM', 'MAP'] +export const MessageTypes = ['BSM', 'SSM', 'SPAT', 'SRM', 'MAP'] as const +export type MessageType = (typeof MessageTypes)[number] export const DotName = 'CDOT' export const MapboxInitViewState = { latitude: 39.7392, diff --git a/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx b/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx index 5903054f8..cac71e052 100644 --- a/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx +++ b/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx @@ -14,6 +14,8 @@ import { useSelector, useDispatch } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' +import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' +import { RootState } from '../../store' const AdminEditOrganization = (props) => { const dispatch: ThunkDispatch = useDispatch() diff --git a/webapp/src/generalSlices/configSlice.ts b/webapp/src/generalSlices/configSlice.ts index eb3de0301..ab5d3a153 100644 --- a/webapp/src/generalSlices/configSlice.ts +++ b/webapp/src/generalSlices/configSlice.ts @@ -13,8 +13,8 @@ const initialState = { snmpFilterMsg: '', snmpFilterErr: false, addConfigPoint: false, - configCoordinates: Array(), - configList: Array(), + configCoordinates: [] as number[][], + configList: [] as number[], } export const refreshSnmpFwdConfig = createAsyncThunk( diff --git a/webapp/src/generalSlices/rsuSlice.ts b/webapp/src/generalSlices/rsuSlice.ts index 0714af189..c8c7f722f 100644 --- a/webapp/src/generalSlices/rsuSlice.ts +++ b/webapp/src/generalSlices/rsuSlice.ts @@ -1,13 +1,17 @@ -import { createAsyncThunk, createSlice } from '@reduxjs/toolkit' +import { AnyAction, createAsyncThunk, createSlice, ThunkDispatch } from '@reduxjs/toolkit' import RsuApi from '../apis/rsu-api' +import { IssScmsStatus, RsuOnlineStatus } from '../apis/rsu-api-types' +import { MessageType } from '../constants' +import { RootState } from '../store' +import { GenericFeatureCollection } from '../types/GenericFeatureCollection' import { selectToken, selectOrganizationName } from './userSlice' const { DateTime } = require('luxon') const initialState = { selectedRsu: null, rsuData: [], - rsuOnlineStatus: {}, - rsuCounts: {}, + rsuOnlineStatus: {} as RsuOnlineStatus, + rsuCounts: {} as { [ip: string]: { count: number } }, countList: [], currentSort: '', startDate: '', @@ -15,33 +19,34 @@ const initialState = { messageLoading: false, warningMessage: false, msgType: 'BSM', - rsuMapData: {}, + rsuMapData: Array, mapList: [], mapDate: '', displayMap: false, bsmStart: '', bsmEnd: '', addBsmPoint: false, - bsmCoordinates: [], + bsmCoordinates: [] as number[][], bsmData: [], bsmDateError: false, bsmFilter: false, bsmFilterStep: 60, bsmFilterOffset: 0, - issScmsStatusData: {}, + issScmsStatusData: {} as IssScmsStatus, ssmDisplay: false, srmSsmList: [], selectedSrm: [], heatMapData: { type: 'FeatureCollection', features: [], - }, + } as GenericFeatureCollection, } -export const updateMessageType = (messageType) => async (dispatch) => { - dispatch(changeMessageType(messageType)) - dispatch(updateRowData({ message: messageType })) -} +export const updateMessageType = + (messageType: MessageType) => async (dispatch: ThunkDispatch) => { + dispatch(changeMessageType(messageType)) + dispatch(updateRowData({ message: messageType })) + } export const getRsuData = createAsyncThunk( 'rsu/getRsuData', @@ -179,7 +184,14 @@ export const getIssScmsStatus = createAsyncThunk( export const updateRowData = createAsyncThunk( 'rsu/updateRowData', - async (data, { getState }) => { + async ( + data: { + start: string + end: string + message: MessageType + }, + { getState } + ) => { const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) diff --git a/webapp/src/pages/Admin.test.js b/webapp/src/pages/Admin.test.ts similarity index 100% rename from webapp/src/pages/Admin.test.js rename to webapp/src/pages/Admin.test.ts diff --git a/webapp/src/pages/Admin.js b/webapp/src/pages/Admin.tsx similarity index 88% rename from webapp/src/pages/Admin.js rename to webapp/src/pages/Admin.tsx index f5570b547..766ee81f7 100644 --- a/webapp/src/pages/Admin.js +++ b/webapp/src/pages/Admin.tsx @@ -1,54 +1,56 @@ -import React, { useEffect } from 'react' -import AdminFormManager from '../components/AdminFormManager.js' -import { Tab, Tabs, TabList, TabPanel } from 'react-tabs' -import { useDispatch } from 'react-redux' -import { updateTableData as updateRsuTableData } from '../features/adminRsuTab/adminRsuTabSlice' -import { getAvailableUsers } from '../features/adminUserTab/adminUserTabSlice' - -import '../features/adminRsuTab/Admin.css' - -function Admin() { - const dispatch = useDispatch() - - useEffect(() => { - dispatch(updateRsuTableData()) - dispatch(getAvailableUsers()) - }, [dispatch]) - - return ( -
    -

    CV Manager Admin Interface

    - - - -

    RSUs

    -
    - -

    Users

    -
    - -

    Organizations

    -
    -
    - - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    -
    -
    - ) -} - -export default Admin +import React, { useEffect } from 'react' +import AdminFormManager from '../components/AdminFormManager.js' +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs' +import { useDispatch } from 'react-redux' +import { updateTableData as updateRsuTableData } from '../features/adminRsuTab/adminRsuTabSlice' +import { getAvailableUsers } from '../features/adminUserTab/adminUserTabSlice' + +import '../features/adminRsuTab/Admin.css' +import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' +import { RootState } from '../store.js' + +function Admin() { + const dispatch: ThunkDispatch = useDispatch() + + useEffect(() => { + dispatch(updateRsuTableData()) + dispatch(getAvailableUsers()) + }, [dispatch]) + + return ( +
    +

    CV Manager Admin Interface

    + + + +

    RSUs

    +
    + +

    Users

    +
    + +

    Organizations

    +
    +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + ) +} + +export default Admin diff --git a/webapp/src/pages/Map.test.js b/webapp/src/pages/Map.test.ts similarity index 100% rename from webapp/src/pages/Map.test.js rename to webapp/src/pages/Map.test.ts diff --git a/webapp/src/pages/Map.js b/webapp/src/pages/Map.tsx similarity index 91% rename from webapp/src/pages/Map.js rename to webapp/src/pages/Map.tsx index 8468e3a76..6264c2b68 100644 --- a/webapp/src/pages/Map.js +++ b/webapp/src/pages/Map.tsx @@ -1,1086 +1,1100 @@ -import React, { useEffect, useState } from 'react' -import mapboxgl from 'mapbox-gl' // This is a dependency of react-map-gl even if you didn't explicitly install it -import Map, { Marker, Popup, Source, Layer } from 'react-map-gl' -import { Container } from 'reactstrap' -import RsuMarker from '../components/RsuMarker' -import mbStyle from '../styles/mb_style.json' -import EnvironmentVars from '../EnvironmentVars' -import dayjs from 'dayjs' -import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider' -import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs' -import { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker' -import Slider from 'rc-slider' -import Select from 'react-select' -import { MapboxInitViewState } from '../constants' -import { - selectRsuOnlineStatus, - selectMapList, - selectRsuData, - selectRsuCounts, - selectIssScmsStatusData, - selectSelectedRsu, - selectMsgType, - selectRsuIpv4, - selectDisplayMap, - selectHeatMapData, - selectAddBsmPoint, - selectBsmStart, - selectBsmEnd, - selectBsmDateError, - selectBsmData, - selectBsmCoordinates, - selectBsmFilter, - selectBsmFilterStep, - selectBsmFilterOffset, - - // actions - selectRsu, - toggleMapDisplay, - getIssScmsStatus, - getMapData, - getRsuLastOnline, - toggleBsmPointSelect, - clearBsm, - updateBsmPoints, - updateBsmData, - updateBsmDate, - setBsmFilter, - setBsmFilterStep, - setBsmFilterOffset, -} from '../generalSlices/rsuSlice' -import { selectWzdxData, getWzdxData } from '../generalSlices/wzdxSlice' -import { selectOrganizationName } from '../generalSlices/userSlice' -import { - selectConfigCoordinates, - toggleConfigPointSelect, - selectAddConfigPoint, - updateConfigPoints, - geoRsuQuery, - clearConfig, -} from '../generalSlices/configSlice' -import { useSelector, useDispatch } from 'react-redux' -import ClearIcon from '@mui/icons-material/Clear' -import { - Button, - FormControlLabel, - FormGroup, - Grid, - IconButton, - Switch, - TextField, - ThemeProvider, - Tooltip, - createTheme, -} from '@mui/material' - -import 'rc-slider/assets/index.css' -import './css/BsmMap.css' -import './css/Map.css' - -// eslint-disable-next-line import/no-webpack-loader-syntax -mapboxgl.workerClass = require('worker-loader!mapbox-gl/dist/mapbox-gl-csp-worker').default - -const { DateTime } = require('luxon') - -function MapPage(props) { - const dispatch = useDispatch() - - const organization = useSelector(selectOrganizationName) - const rsuData = useSelector(selectRsuData) - const rsuCounts = useSelector(selectRsuCounts) - const selectedRsu = useSelector(selectSelectedRsu) - const mapList = useSelector(selectMapList) - const msgType = useSelector(selectMsgType) - const issScmsStatusData = useSelector(selectIssScmsStatusData) - const rsuOnlineStatus = useSelector(selectRsuOnlineStatus) - const rsuIpv4 = useSelector(selectRsuIpv4) - const displayMap = useSelector(selectDisplayMap) - const addConfigPoint = useSelector(selectAddConfigPoint) - const configCoordinates = useSelector(selectConfigCoordinates) - - const heatMapData = useSelector(selectHeatMapData) - - const bsmData = useSelector(selectBsmData) - const bsmCoordinates = useSelector(selectBsmCoordinates) - const addBsmPoint = useSelector(selectAddBsmPoint) - const startBsmDate = useSelector(selectBsmStart) - const endBsmDate = useSelector(selectBsmEnd) - const bsmDateError = useSelector(selectBsmDateError) - - const filter = useSelector(selectBsmFilter) - const filterStep = useSelector(selectBsmFilterStep) - const filterOffset = useSelector(selectBsmFilterOffset) - - const wzdxData = useSelector(selectWzdxData) - - // Mapbox local state variables - const [viewState, setViewState] = useState(MapboxInitViewState) - - // RSU layer local state variables - const [selectedRsuCount, setSelectedRsuCount] = useState(null) - const [displayType, setDisplayType] = useState('') - - const [configPolygonSource, setConfigPolygonSource] = useState({ - type: 'Feature', - geometry: { - type: 'Polygon', - coordinates: [], - }, - }) - const [configPointSource, setConfigPointSource] = useState({ - type: 'FeatureCollection', - features: [], - }) - - // BSM layer local state variables - const [bsmPolygonSource, setBsmPolygonSource] = useState({ - type: 'Feature', - geometry: { - type: 'Polygon', - coordinates: [], - }, - }) - const [bsmPointSource, setBsmPointSource] = useState({ - type: 'FeatureCollection', - features: [], - }) - - const [baseDate, setBaseDate] = useState(new Date(startBsmDate)) - const [startDate, setStartDate] = useState(new Date(baseDate.getTime() + 60000 * filterOffset * filterStep)) - const [endDate, setEndDate] = useState(new Date(startDate.getTime() + 60000 * filterStep)) - const stepOptions = [ - { value: 1, label: '1 minute' }, - { value: 5, label: '5 minutes' }, - { value: 15, label: '15 minutes' }, - { value: 30, label: '30 minutes' }, - { value: 60, label: '60 minutes' }, - ] - - // WZDx layer local state variables - const [selectedWZDxMarkerIndex, setSelectedWZDxMarkerIndex] = useState(null) - const [selectedWZDxMarker, setSelectedWZDxMarker] = useState(null) - const [wzdxMarkers, setWzdxMarkers] = useState([]) - const [pageOpen, setPageOpen] = useState(true) - - const [activeLayers, setActiveLayers] = useState(['rsu-layer']) - - // useEffects for Mapbox - useEffect(() => { - const listener = (e) => { - if (e.key === 'Escape') { - dispatch(selectRsu(null)) - setSelectedWZDxMarkerIndex(null) - } - } - window.addEventListener('keydown', listener) - - return () => { - window.removeEventListener('keydown', listener) - } - }, [selectedRsu, dispatch, setSelectedWZDxMarkerIndex]) - - // useEffects for RSU layer - useEffect(() => { - dispatch(selectRsu(null)) - }, [organization, dispatch]) - - // useEffects for BSM layer - useEffect(() => { - const localBaseDate = new Date(startBsmDate) - const localStartDate = new Date(localBaseDate.getTime() + 60000 * filterOffset * filterStep) - const localEndDate = new Date(new Date(localStartDate).getTime() + 60000 * filterStep) - setBaseDate(localBaseDate) - setStartDate(localStartDate) - setEndDate(localEndDate) - }, [startBsmDate, filterOffset, filterStep]) - - useEffect(() => { - if (!startBsmDate) { - dateChanged(new Date(), 'start') - } - if (!endBsmDate) { - dateChanged(new Date(), 'end') - } - }, []) - - useEffect(() => { - if (activeLayers.includes('bsm-layer')) { - setBsmPolygonSource((prevPolygonSource) => { - return { - ...prevPolygonSource, - geometry: { - ...prevPolygonSource.geometry, - coordinates: [[...bsmCoordinates]], - }, - } - }) - - const pointSourceFeatures = [] - if ((bsmData?.length ?? 0) > 0) { - for (const [, val] of Object.entries([...bsmData])) { - const bsmDate = new Date(val['properties']['time']) - if (bsmDate >= startDate && bsmDate <= endDate) { - pointSourceFeatures.push(val) - } - } - } else { - bsmCoordinates.forEach((point) => { - pointSourceFeatures.push({ - type: 'Feature', - geometry: { - type: 'Point', - coordinates: [...point], - }, - }) - }) - } - - setBsmPointSource((prevPointSource) => { - return { ...prevPointSource, features: pointSourceFeatures } - }) - } - }, [bsmCoordinates, bsmData, startDate, endDate, activeLayers]) - - useEffect(() => { - if (activeLayers.includes('rsu-layer')) { - setConfigPolygonSource((prevPolygonSource) => { - return { - ...prevPolygonSource, - geometry: { - ...prevPolygonSource.geometry, - coordinates: [[...configCoordinates]], - }, - } - }) - const pointSourceFeatures = [] - configCoordinates.forEach((point) => { - pointSourceFeatures.push({ - type: 'Feature', - geometry: { - type: 'Point', - coordinates: [...point], - }, - }) - }) - - setConfigPointSource((prevPointSource) => { - return { ...prevPointSource, features: pointSourceFeatures } - }) - } - }, [configCoordinates, activeLayers]) - - function dateChanged(e, type) { - try { - let mst = DateTime.fromISO(e.toISOString()) - mst.setZone('America/Denver') - dispatch(updateBsmDate({ type, date: mst.toString() })) - } catch (err) { - console.error('Encountered issue updating date: ', err.message) - } - } - - const addBsmPointToCoordinates = (point) => { - const pointArray = [point.lng, point.lat] - if (bsmCoordinates.length > 1) { - if (bsmCoordinates[0] === bsmCoordinates.slice(-1)[0]) { - let tmp = [...bsmCoordinates] - tmp.pop() - dispatch(updateBsmPoints([...tmp, pointArray, bsmCoordinates[0]])) - } else { - dispatch(updateBsmPoints([...bsmCoordinates, pointArray, bsmCoordinates[0]])) - } - } else { - dispatch(updateBsmPoints([...bsmCoordinates, pointArray])) - } - } - - const addConfigPointToCoordinates = (point) => { - const pointArray = [point.lng, point.lat] - if (configCoordinates?.length > 1) { - if (configCoordinates[0] === configCoordinates.slice(-1)[0]) { - let tmp = [...configCoordinates] - tmp.pop() - dispatch(updateConfigPoints([...tmp, pointArray, configCoordinates[0]])) - } else { - dispatch(updateConfigPoints([...configCoordinates, pointArray, configCoordinates[0]])) - } - } else { - dispatch(updateConfigPoints([...configCoordinates, pointArray])) - } - } - - function defaultSlider(val) { - for (var i = 0; i < stepOptions.length; i++) { - if (stepOptions[i].value === val) { - return stepOptions[i].label - } - } - } - - // useEffects for WZDx layers - useEffect(() => { - if (selectedWZDxMarkerIndex !== null) setSelectedWZDxMarker(wzdxMarkers[selectedWZDxMarkerIndex]) - else setSelectedWZDxMarker(null) - }, [selectedWZDxMarkerIndex, wzdxMarkers]) - - useEffect(() => { - function createPopupTable(data) { - let rows = [] - for (var i = 0; i < data.length; i++) { - let rowID = `row${i}` - let cell = [] - for (var idx = 0; idx < 2; idx++) { - let cellID = `cell${i}-${idx}` - if (i == 0) { - cell.push( - - {data[i][idx]} - - ) - } else { - cell.push( - -
    {data[i][idx]}
    - - ) - } - } - rows.push( - - {cell} - - ) - } - return ( -
    - - {rows} -
    -
    - ) - } - - function getWzdxTable(obj) { - let arr = [] - arr.push(['road_name', obj['properties']['core_details']['road_names'][0]]) - arr.push(['direction', obj['properties']['core_details']['direction']]) - arr.push(['vehicle_impact', obj['properties']['vehicle_impact']]) - arr.push(['workers_present', obj['properties']['workers_present']]) - arr.push(['description', break_line(obj['properties']['core_details']['description'])]) - arr.push(['start_date', obj['properties']['start_date']]) - arr.push(['end_date', obj['properties']['end_date']]) - return arr - } - - function openPopup(index) { - setSelectedWZDxMarkerIndex(index) - dispatch(selectRsu(null)) - } - - function customMarker(feature, index, lat, lng) { - return ( - { - e.originalEvent.stopPropagation() - }} - > -
    openPopup(index)}> - Work Zone Icon -
    -
    - ) - } - - const getAllMarkers = (wzdxData) => { - if (wzdxData?.features?.length > 0) { - var i = -1 - var markers = wzdxData.features.map((feature) => { - const localFeature = { ...feature } - var center_coords_index = Math.round(feature.geometry.coordinates.length / 2) - var lng = feature.geometry.coordinates[0][0] - var lat = feature.geometry.coordinates[0][1] - if (center_coords_index !== 1) { - lat = feature.geometry.coordinates[center_coords_index][1] - lng = feature.geometry.coordinates[center_coords_index][0] - } else { - lat = (feature.geometry.coordinates[0][1] + feature.geometry.coordinates[1][1]) / 2 - lng = (feature.geometry.coordinates[0][0] + feature.geometry.coordinates[1][0]) / 2 - } - i++ - localFeature.properties = { ...feature.properties } - localFeature.properties.table = createPopupTable(getWzdxTable(feature)) - return customMarker(localFeature, i, lat, lng) - }) - return markers - } else { - return [] - } - } - - setWzdxMarkers(getAllMarkers(wzdxData)) - }, [dispatch, wzdxData]) - - const setMapDisplayRsu = async () => { - let display = !displayMap - if (display === true) { - dispatch(getMapData()) - } - dispatch(toggleMapDisplay()) - } - - function break_line(val) { - var arr = [] - var remainingData = '' - var maxLineLength = 40 - for (var i = 0; i < val.length; i += maxLineLength) { - var data = remainingData + val.substring(i, i + maxLineLength) - var index = data.lastIndexOf(' ') - if (data[0] == ' ') { - data = data.substring(1, data.length) - remainingData = data.substring(index, data.length) - } else if (data?.[i + maxLineLength + 1] == ' ') { - remainingData = data.substring(index + 1, data.length) - } else if (data[index] == ' ') { - remainingData = data.substring(index + 1, data.length) - } - arr.push(data.substring(0, index)) - } - return arr.join('\n') - } - - function closePopup() { - setSelectedWZDxMarkerIndex(null) - } - - function getStops() { - // populate tmp array with rsuCounts to get max count value - let max = Math.max(...Object.entries(rsuCounts).map(([, value]) => value.count)) - let stopsArray = [[0, 0.25]] - let weight = 0.5 - for (let i = 1; i < max; i += 500) { - stopsArray.push([i, weight]) - weight += 0.25 - } - return stopsArray - } - - const layers = [ - { - id: 'rsu-layer', - label: 'RSU', - }, - { - id: 'heatmap-layer', - label: 'Heatmap', - type: 'heatmap', - maxzoom: 14, - source: 'heatMapData', - paint: { - 'heatmap-weight': { - property: 'count', - type: 'exponential', - stops: getStops(), - }, - 'heatmap-intensity': ['interpolate', ['linear'], ['zoom'], 0, 0, 10, 1, 13, 2], - 'heatmap-color': [ - 'interpolate', - ['linear'], - ['heatmap-density'], - 0, - 'rgba(33,102,172,0)', - 0.2, - 'rgb(103,169,207)', - 0.4, - 'rgb(209,229,240)', - 0.6, - 'rgb(253,219,199)', - 0.8, - 'rgb(239,138,98)', - 0.9, - 'rgb(255,201,101)', - ], - 'heatmap-opacity': ['interpolate', ['linear'], ['zoom'], 10, 1, 13, 0.6, 14, 0], - }, - }, - { - id: 'bsm-layer', - label: 'BSM Viewer', - }, - { - id: 'wzdx-layer', - label: 'WZDx', - type: 'line', - paint: { - 'line-color': '#F29543', - 'line-width': 8, - }, - }, - ] - - const Legend = () => { - const toggleLayer = (id) => { - if (activeLayers.includes(id)) { - if (id === 'rsu-layer') { - dispatch(selectRsu(null)) - setSelectedRsuCount(null) - } else if (id === 'wzdx-layer') { - setSelectedWZDxMarkerIndex(null) - } - setActiveLayers(activeLayers.filter((layerId) => layerId !== id)) - } else { - if (id === 'wzdx-layer' && wzdxData?.features?.length === 0) { - dispatch(getWzdxData()) - } - setActiveLayers([...activeLayers, id]) - } - } - - return ( -
    -

    Map Layers

    - {layers.map((layer) => ( -
    - -
    - ))} -
    - ) - } - - const isOnline = () => { - return rsuIpv4 in rsuOnlineStatus && rsuOnlineStatus[rsuIpv4].hasOwnProperty('last_online') - ? rsuOnlineStatus[rsuIpv4].last_online - : 'No Data' - } - - const getStatus = () => { - return rsuIpv4 in rsuOnlineStatus && rsuOnlineStatus[rsuIpv4].hasOwnProperty('current_status') - ? rsuOnlineStatus[rsuIpv4].current_status - : 'Offline' - } - - const handleScmsStatus = () => { - dispatch(getIssScmsStatus()) - setDisplayType('scms') - } - - const handleOnlineStatus = () => { - setDisplayType('online') - } - - const handleNoneStatus = () => { - setDisplayType('') - } - - const handleRsuDisplayTypeChange = (event) => { - if (event.target.value === 'online') handleOnlineStatus() - else if (event.target.value === 'scms') handleScmsStatus() - else if (event.target.value === 'none') handleNoneStatus() - } - - const handleButtonToggle = (event, origin) => { - if (origin === 'config') { - dispatch(toggleConfigPointSelect()) - if (addBsmPoint) dispatch(toggleBsmPointSelect()) - } else if (origin === 'bsm') { - dispatch(toggleBsmPointSelect()) - if (addConfigPoint) dispatch(toggleConfigPointSelect()) - } - } - - return ( -
    - - - {activeLayers.includes('rsu-layer') && ( -
    -

    RSU Status

    - - - - - -

    RSU Configuration

    - - - } - label={'Add Points'} - onChange={(e) => handleButtonToggle(e, 'config')} - /> - {configCoordinates.length > 0 && ( - - { - dispatch(clearConfig()) - }} - > - - - - )} - - - - - -
    - )} - {activeLayers.includes('rsu-layer') && selectedRsu !== null && mapList.includes(rsuIpv4) ? ( - - ) : null} -
    - - setViewState(evt.viewState)} - onClick={(e) => { - if (addBsmPoint) { - addBsmPointToCoordinates(e.lngLat) - } - if (addConfigPoint) { - addConfigPointToCoordinates(e.lngLat) - } - }} - > - {activeLayers.includes('rsu-layer') && ( -
    - {configCoordinates?.length > 2 ? ( - - - - - ) : null} - - - -
    - )} - {rsuData?.map( - (rsu) => - activeLayers.includes('rsu-layer') && [ - { - e.originalEvent.stopPropagation() - dispatch(selectRsu(rsu)) - setSelectedWZDxMarkerIndex(null) - dispatch(getRsuLastOnline(rsu.properties.ipv4_address)) - dispatch(getIssScmsStatus()) - if (rsuCounts.hasOwnProperty(rsu.properties.ipv4_address)) - setSelectedRsuCount(rsuCounts[rsu.properties.ipv4_address].count) - else setSelectedRsuCount(0) - }} - > - - , - ] - )} - {activeLayers.includes('heatmap-layer') && ( - - - - )} - {activeLayers.includes('bsm-layer') && ( -
    - {bsmCoordinates.length > 2 ? ( - - - - - ) : null} - - - -
    - )} - {activeLayers.includes('wzdx-layer') && ( -
    - {wzdxMarkers} - - - -
    - )} - {selectedWZDxMarker ? ( - -
    {selectedWZDxMarker.props.feature.properties.table}
    -
    - ) : null} - {selectedRsu ? ( - { - if (pageOpen) { - console.debug('POPUP CLOSED', pageOpen) - dispatch(selectRsu(null)) - setSelectedRsuCount(null) - } - }} - > -
    -

    {rsuIpv4}

    -

    Milepost: {selectedRsu.properties.milepost}

    -

    - Serial Number:{' '} - {selectedRsu.properties.serial_number ? selectedRsu.properties.serial_number : 'Unknown'} -

    -

    Manufacturer: {selectedRsu.properties.manufacturer_name}

    -

    RSU Status: {getStatus()}

    -

    Last Online: {isOnline()}

    - {rsuIpv4 in issScmsStatusData && issScmsStatusData[rsuIpv4] ? ( -
    -

    - SCMS Health: {issScmsStatusData[rsuIpv4].health === '1' ? 'Healthy' : 'Unhealthy'} -

    -

    - SCMS Expiration: - {issScmsStatusData[rsuIpv4].expiration - ? issScmsStatusData[rsuIpv4].expiration - : 'Never downloaded certificates'} -

    -
    - ) : ( -
    -

    RSU is not enrolled with ISS SCMS

    -
    - )} -

    - {msgType} Counts: {selectedRsuCount} -

    -
    -
    - ) : null} -
    -
    - - {activeLayers.includes('bsm-layer') && - (filter ? ( -
    -
    -

    - {startDate.toLocaleString([], dateTimeOptions)} - {endDate.toLocaleTimeString([], dateTimeOptions)} -

    -
    -
    - { - dispatch(setBsmFilterOffset(e)) - }} - /> -
    -
    - toggleLayer(layer.id)} + /> + {layer.label} + +
    + ))} +
    + ) + } + + const isOnline = () => { + return rsuIpv4 in rsuOnlineStatus && rsuOnlineStatus[rsuIpv4].hasOwnProperty('last_online') + ? rsuOnlineStatus[rsuIpv4].last_online + : 'No Data' + } + + const getStatus = () => { + return rsuIpv4 in rsuOnlineStatus && rsuOnlineStatus[rsuIpv4].hasOwnProperty('current_status') + ? rsuOnlineStatus[rsuIpv4].current_status + : 'Offline' + } + + const handleScmsStatus = () => { + dispatch(getIssScmsStatus()) + setDisplayType('scms') + } + + const handleOnlineStatus = () => { + setDisplayType('online') + } + + const handleNoneStatus = () => { + setDisplayType('') + } + + const handleRsuDisplayTypeChange = (event: React.ChangeEvent) => { + if (event.target.value === 'online') handleOnlineStatus() + else if (event.target.value === 'scms') handleScmsStatus() + else if (event.target.value === 'none') handleNoneStatus() + } + + const handleButtonToggle = (event: React.SyntheticEvent, origin: 'config' | 'bsm') => { + if (origin === 'config') { + dispatch(toggleConfigPointSelect()) + if (addBsmPoint) dispatch(toggleBsmPointSelect()) + } else if (origin === 'bsm') { + dispatch(toggleBsmPointSelect()) + if (addConfigPoint) dispatch(toggleConfigPointSelect()) + } + } + + return ( +
    + + + {activeLayers.includes('rsu-layer') && ( +
    +

    RSU Status

    + + + + + +

    RSU Configuration

    + + + } + label={'Add Points'} + onChange={(e) => handleButtonToggle(e, 'config')} + /> + {configCoordinates.length > 0 && ( + + { + dispatch(clearConfig()) + }} + > + + + + )} + + + + + +
    + )} + {activeLayers.includes('rsu-layer') && selectedRsu !== null && mapList.includes(rsuIpv4) ? ( + + ) : null} +
    + + setViewState(evt.viewState)} + onClick={(e) => { + if (addBsmPoint) { + addBsmPointToCoordinates(e.lngLat) + } + if (addConfigPoint) { + addConfigPointToCoordinates(e.lngLat) + } + }} + > + {activeLayers.includes('rsu-layer') && ( +
    + {configCoordinates?.length > 2 ? ( + + + + + ) : null} + + + +
    + )} + {rsuData?.map( + (rsu) => + activeLayers.includes('rsu-layer') && [ + { + e.originalEvent.stopPropagation() + dispatch(selectRsu(rsu)) + setSelectedWZDxMarkerIndex(null) + dispatch(getRsuLastOnline(rsu.properties.ipv4_address)) + dispatch(getIssScmsStatus()) + if (rsuCounts.hasOwnProperty(rsu.properties.ipv4_address)) + setSelectedRsuCount(rsuCounts[rsu.properties.ipv4_address].count) + else setSelectedRsuCount(0) + }} + > + + , + ] + )} + {activeLayers.includes('heatmap-layer') && ( + + + + )} + {activeLayers.includes('bsm-layer') && ( +
    + {bsmCoordinates.length > 2 ? ( + + + + + ) : null} + + + +
    + )} + {activeLayers.includes('wzdx-layer') && ( +
    + {wzdxMarkers} + + + +
    + )} + {selectedWZDxMarker ? ( + +
    {selectedWZDxMarker.props.feature.properties.table}
    +
    + ) : null} + {selectedRsu ? ( + { + if (pageOpen) { + console.debug('POPUP CLOSED', pageOpen) + dispatch(selectRsu(null)) + setSelectedRsuCount(null) + } + }} + > +
    +

    {rsuIpv4}

    +

    Milepost: {selectedRsu.properties.milepost}

    +

    + Serial Number:{' '} + {selectedRsu.properties.serial_number ? selectedRsu.properties.serial_number : 'Unknown'} +

    +

    Manufacturer: {selectedRsu.properties.manufacturer_name}

    +

    RSU Status: {getStatus()}

    +

    Last Online: {isOnline()}

    + {rsuIpv4 in issScmsStatusData && issScmsStatusData[rsuIpv4] ? ( +
    +

    + SCMS Health: {issScmsStatusData[rsuIpv4].health === '1' ? 'Healthy' : 'Unhealthy'} +

    +

    + SCMS Expiration: + {issScmsStatusData[rsuIpv4].expiration + ? issScmsStatusData[rsuIpv4].expiration + : 'Never downloaded certificates'} +

    +
    + ) : ( +
    +

    RSU is not enrolled with ISS SCMS

    +
    + )} +

    + {msgType} Counts: {selectedRsuCount} +

    +
    +
    + ) : null} +
    +
    + + {activeLayers.includes('bsm-layer') && + (filter ? ( +
    +
    +

    + {startDate.toLocaleString([], dateTimeOptions)} - {endDate.toLocaleTimeString([], dateTimeOptions)} +

    +
    +
    + { + dispatch(setBsmFilterOffset(e)) + }} + /> +
    +
    + setViewState(evt.viewState)} onClick={(e) => { @@ -762,11 +763,7 @@ function MapPage(props: MapPageProps) {
    - -
    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -`; - -exports[`snapshot rsu 1`] = ` -
    -
    -
    -
    -

    - CV Manager RSUs - - -

    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - ​ - - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - -
    - - - - - - -
    - - Milepost - - - -
    -
    -
    - - IP Address - - - -
    -
    -
    - - Primary Route - - - -
    -
    -
    - - RSU Model - - - -
    -
    -
    - - Serial Number - - - -
    -
    - - Actions - -
    - No records to display -
    -
    -
    -
    -
    - - - - - - -
    -
    -
    -
    -
    -
    -
    -`; - -exports[`snapshot user 1`] = ` -
    -
    -
    -
    -

    - CV Manager Users - - -

    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - ​ - - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - -
    - - - - - - -
    - - First Name - - - -
    -
    -
    - - Last Name - - - -
    -
    -
    - - Email - - - -
    -
    -
    - - Super User - - - -
    -
    - - Actions - -
    - No records to display -
    -
    -
    -
    -
    - - - - - - -
    -
    -
    -
    -
    -
    -
    -`; diff --git a/webapp/src/components/__snapshots__/AdminOrganizationDeleteMenu.test.js.snap b/webapp/src/components/__snapshots__/AdminOrganizationDeleteMenu.test.tsx.snap similarity index 100% rename from webapp/src/components/__snapshots__/AdminOrganizationDeleteMenu.test.js.snap rename to webapp/src/components/__snapshots__/AdminOrganizationDeleteMenu.test.tsx.snap diff --git a/webapp/src/components/__snapshots__/AdminTable.test.js.snap b/webapp/src/components/__snapshots__/AdminTable.test.tsx.snap similarity index 100% rename from webapp/src/components/__snapshots__/AdminTable.test.js.snap rename to webapp/src/components/__snapshots__/AdminTable.test.tsx.snap diff --git a/webapp/src/components/__snapshots__/ConfigureItem.test.js.snap b/webapp/src/components/__snapshots__/ConfigureItem.test.tsx.snap similarity index 100% rename from webapp/src/components/__snapshots__/ConfigureItem.test.js.snap rename to webapp/src/components/__snapshots__/ConfigureItem.test.tsx.snap diff --git a/webapp/src/components/__snapshots__/ConfigureRsu.test.js.snap b/webapp/src/components/__snapshots__/ConfigureRsu.test.js.snap deleted file mode 100644 index 0e26bbf90..000000000 --- a/webapp/src/components/__snapshots__/ConfigureRsu.test.js.snap +++ /dev/null @@ -1,615 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ConfigureRsu component should take a multi-RSU snapshot 1`] = ` -
    -
    -
    -
    -

    - Multiple RSU Config -

    - -
    -

    - RSU IP List: - 1.1.1.1, 2.2.2.2, 3.3.3.3 -

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -

    - Message Forwarding -

    -
    - - -
    - - -

    -

    -

    -

    - By specifying a destination IP address along with a message type, you can add message forwarding to any of the selected RSUs or delete message forwarding from any RSUs that already have that configuration. -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -`; - -exports[`ConfigureRsu component should take a single RSU snapshot 1`] = ` -
    -
    -
    -

    - Selected RSU Config -

    - -

    - Roadway: - primary_route -
    - Milepost: - 111 -
    - IPv4: - 1.1.1.1 -

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -

    - Message Forwarding -

    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -

    - Message Forwarding -

    -
    - - -
    - -

    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -

    - Administrator Reboot -

    - -

    - Warning: This action could result in taking the RSU offline -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -`; diff --git a/webapp/src/components/__snapshots__/ContactSupportMenu.test.js.snap b/webapp/src/components/__snapshots__/ContactSupportMenu.test.tsx.snap similarity index 100% rename from webapp/src/components/__snapshots__/ContactSupportMenu.test.js.snap rename to webapp/src/components/__snapshots__/ContactSupportMenu.test.tsx.snap diff --git a/webapp/src/components/__snapshots__/Header.test.js.snap b/webapp/src/components/__snapshots__/Header.test.tsx.snap similarity index 90% rename from webapp/src/components/__snapshots__/Header.test.js.snap rename to webapp/src/components/__snapshots__/Header.test.tsx.snap index b8ce3a977..e1f2a8288 100644 --- a/webapp/src/components/__snapshots__/Header.test.js.snap +++ b/webapp/src/components/__snapshots__/Header.test.tsx.snap @@ -28,11 +28,6 @@ exports[`
    should take a snapshot 1`] = `
    -

    - User Unauthorized, Please Contact Support -


    @@ -165,7 +165,7 @@ const AdminOrganizationTab = () => { {activeDiv === 'add_organization' && (
    - +
    )} diff --git a/webapp/src/features/adminOrganizationTab/__snapshots__/AdminOrganizationTab.test.js.snap b/webapp/src/features/adminOrganizationTab/__snapshots__/AdminOrganizationTab.test.js.snap deleted file mode 100644 index f274e87a9..000000000 --- a/webapp/src/features/adminOrganizationTab/__snapshots__/AdminOrganizationTab.test.js.snap +++ /dev/null @@ -1,308 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`should take a snapshot 1`] = ` -
    -
    -
    -

    - CV Manager Organizations - - -

    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -`; diff --git a/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.test.ts b/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.test.ts index 7c0b6fe35..d19d2824a 100644 --- a/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.test.ts +++ b/webapp/src/features/adminOrganizationTab/adminOrganizationTabSlice.test.ts @@ -23,6 +23,7 @@ import { } from './adminOrganizationTabSlice' import apiHelper from '../../apis/api-helper' import EnvironmentVars from '../../EnvironmentVars' +import { RootState } from '../../store' describe('admin organization tab reducer', () => { it('should handle initial state', () => { @@ -43,10 +44,15 @@ describe('admin organization tab reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['adminOrganizationTab'] = { loading: null, value: { - successMsg: null, + activeDiv: null, + title: null, + orgData: null, + selectedOrg: null, + rsuTableData: null, + userTableData: null, errorState: null, errorMsg: null, }, @@ -247,7 +253,7 @@ describe('async thunks', () => { }, }, }) - const json = { data: 'data' } + const json = { data: 'data' } as any const action = editOrg(json) apiHelper._patchData = jest.fn().mockReturnValue({ status: 200, message: 'message' }) @@ -324,10 +330,17 @@ describe('async thunks', () => { }) describe('reducers', () => { - const initialState = { + const initialState: RootState['adminOrganizationTab'] = { loading: null, value: { - selectedRsu: null, + activeDiv: null, + title: null, + orgData: null, + selectedOrg: null, + rsuTableData: null, + userTableData: null, + errorState: null, + errorMsg: null, }, } @@ -406,7 +419,7 @@ describe('selectors', () => { errorMsg: 'errorMsg', }, } - const state = { adminOrganizationTab: initialState } + const state = { adminOrganizationTab: initialState } as any it('selectors return the correct value', async () => { expect(selectLoading(state)).toEqual('loading') diff --git a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.ts b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.tsx similarity index 81% rename from webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.ts rename to webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.tsx index 7f7e7b756..0002eb0b8 100644 --- a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.ts +++ b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.test.tsx @@ -8,7 +8,7 @@ import { replaceChaoticIds } from '../../utils/test-utils' it('should take a snapshot', () => { const { container } = render( - + {}} /> ) diff --git a/webapp/src/features/adminOrganizationTabRsu/__snapshots__/AdminOrganizationTabRsu.test.js.snap b/webapp/src/features/adminOrganizationTabRsu/__snapshots__/AdminOrganizationTabRsu.test.js.snap deleted file mode 100644 index 97e5d95de..000000000 --- a/webapp/src/features/adminOrganizationTabRsu/__snapshots__/AdminOrganizationTabRsu.test.js.snap +++ /dev/null @@ -1,71 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`should take a snapshot 1`] = ` -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -`; diff --git a/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.test.ts b/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.test.ts index 485e97832..bf22a9be2 100644 --- a/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.test.ts +++ b/webapp/src/features/adminOrganizationTabRsu/adminOrganizationTabRsuSlice.test.ts @@ -20,6 +20,7 @@ import { } from './adminOrganizationTabRsuSlice' import apiHelper from '../../apis/api-helper' import EnvironmentVars from '../../EnvironmentVars' +import { RootState } from '../../store' describe('admin organization tab RSU reducer', () => { it('should handle initial state', () => { @@ -34,7 +35,7 @@ describe('admin organization tab RSU reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['adminOrganizationTabRsu'] = { loading: null, value: { availableRsuList: null, @@ -148,15 +149,13 @@ describe('async thunks', () => { }, }, }) - const rsu = { ip: '1.1.1.1' } - const orgPatchJson = { rsus_to_remove: [] } + const rsu = { ip: '1.1.1.1' } as any const selectedOrg = 'selectedOrg' - let fetchPatchOrganization = jest.fn() const updateTableData = jest.fn() let rsuData = { rsu_data: { organizations: ['org1', 'org2'] } } - let action = rsuDeleteSingle({ rsu, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + let action = rsuDeleteSingle({ rsu, selectedOrg, updateTableData }) const jsdomAlert = window.alert try { @@ -169,23 +168,19 @@ describe('async thunks', () => { query_params: { rsu_ip: rsu.ip }, }) expect(apiHelper._getDataWithCodes).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).toHaveBeenCalledWith({ rsus_to_remove: [rsu.ip] }) expect(dispatch).toHaveBeenCalledTimes(1 + 2) expect(window.alert).not.toHaveBeenCalled() // Only 1 organization dispatch = jest.fn() - fetchPatchOrganization = jest.fn() rsuData = { rsu_data: { organizations: ['org1'] } } - action = rsuDeleteSingle({ rsu, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + action = rsuDeleteSingle({ rsu, selectedOrg, updateTableData }) apiHelper._getDataWithCodes = jest.fn().mockReturnValue({ status: 500, message: 'message' }) window.alert = jest.fn() await action(dispatch, getState, undefined) expect(apiHelper._getDataWithCodes).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).not.toHaveBeenCalled() expect(dispatch).toHaveBeenCalledTimes(1 + 2) expect(window.alert).toHaveBeenCalledWith( 'Cannot remove RSU 1.1.1.1 from selectedOrg because it must belong to at least one organization.' @@ -207,16 +202,14 @@ describe('async thunks', () => { }, }, }) - const rows = [{ ip: '1.1.1.1' }, { ip: '1.1.1.2' }, { ip: '1.1.1.3' }] - const orgPatchJson = { rsus_to_remove: [] } + const rows = [{ ip: '1.1.1.1' }, { ip: '1.1.1.2' }, { ip: '1.1.1.3' }] as any const selectedOrg = 'selectedOrg' - let fetchPatchOrganization = jest.fn() const updateTableData = jest.fn() const rsuData = { rsu_data: { organizations: ['org1', 'org2', 'org3'] } } const invalidRsuData = { rsu_data: { organizations: ['org1'] } } - let action = rsuDeleteMultiple({ rows, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + let action = rsuDeleteMultiple({ rows, selectedOrg, updateTableData }) const jsdomAlert = window.alert try { @@ -228,16 +221,13 @@ describe('async thunks', () => { .mockReturnValueOnce({ body: rsuData }) await action(dispatch, getState, undefined) expect(apiHelper._getDataWithCodes).toHaveBeenCalledTimes(3) - expect(fetchPatchOrganization).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).toHaveBeenCalledWith({ rsus_to_remove: [rows[0].ip, rows[1].ip, rows[2].ip] }) expect(dispatch).toHaveBeenCalledTimes(1 + 2) expect(window.alert).not.toHaveBeenCalled() // Only 1 organization dispatch = jest.fn() - fetchPatchOrganization = jest.fn() - action = rsuDeleteMultiple({ rows, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + action = rsuDeleteMultiple({ rows, selectedOrg, updateTableData }) window.alert = jest.fn() apiHelper._getDataWithCodes = jest @@ -247,7 +237,6 @@ describe('async thunks', () => { .mockReturnValueOnce({ body: invalidRsuData }) await action(dispatch, getState, undefined) expect(apiHelper._getDataWithCodes).toHaveBeenCalledTimes(3) - expect(fetchPatchOrganization).not.toHaveBeenCalled() expect(dispatch).toHaveBeenCalledTimes(0 + 2) expect(window.alert).toHaveBeenCalledWith( 'Cannot remove RSU(s) 1.1.1.2, 1.1.1.3 from selectedOrg because they must belong to at least one organization.' @@ -269,13 +258,12 @@ describe('async thunks', () => { }, }, }) - const rsuList = [{ ip: '1.1.1.1' }, { ip: '1.1.1.2' }, { ip: '1.1.1.3' }] - const orgPatchJson = { rsus_to_add: [] } + const rsuList = [{ ip: '1.1.1.1' }, { ip: '1.1.1.2' }, { ip: '1.1.1.3' }] as any const selectedOrg = 'selectedOrg' const fetchPatchOrganization = jest.fn() const updateTableData = jest.fn() - let action = rsuAddMultiple({ rsuList, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + let action = rsuAddMultiple({ rsuList, selectedOrg, updateTableData }) await action(dispatch, getState, undefined) expect(fetchPatchOrganization).toHaveBeenCalledTimes(1) @@ -310,7 +298,7 @@ describe('async thunks', () => { }) describe('reducers', () => { - const initialState = { + const initialState: RootState['adminOrganizationTabRsu'] = { loading: null, value: { availableRsuList: null, @@ -350,7 +338,7 @@ describe('selectors', () => { selectedRsuList: 'selectedRsuList', }, } - const state = { adminOrganizationTabRsu: initialState } + const state = { adminOrganizationTabRsu: initialState } as any it('selectors return the correct value', async () => { expect(selectLoading(state)).toEqual('loading') diff --git a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.ts b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.tsx similarity index 81% rename from webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.ts rename to webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.tsx index d5a721371..8c1d0985d 100644 --- a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.ts +++ b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.test.tsx @@ -8,7 +8,7 @@ import { replaceChaoticIds } from '../../utils/test-utils' it('should take a snapshot', () => { const { container } = render( - + {}} /> ) diff --git a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx index f95c14ad4..cf9660e95 100644 --- a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx +++ b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx @@ -151,9 +151,7 @@ const AdminOrganizationTabUser = (props: AdminOrganizationTabUserProps) => { dispatch( userDeleteSingle({ user: row, - orgPatchJson: props.orgPatchJson, selectedOrg: props.selectedOrg, - fetchPatchOrganization: props.fetchPatchOrganization, updateTableData: props.updateTableData, }) ) diff --git a/webapp/src/features/adminOrganizationTabUser/__snapshots__/AdminOrganizationTabUser.test.js.snap b/webapp/src/features/adminOrganizationTabUser/__snapshots__/AdminOrganizationTabUser.test.tsx.snap similarity index 99% rename from webapp/src/features/adminOrganizationTabUser/__snapshots__/AdminOrganizationTabUser.test.js.snap rename to webapp/src/features/adminOrganizationTabUser/__snapshots__/AdminOrganizationTabUser.test.tsx.snap index 582c86cde..55feb7243 100644 --- a/webapp/src/features/adminOrganizationTabUser/__snapshots__/AdminOrganizationTabUser.test.js.snap +++ b/webapp/src/features/adminOrganizationTabUser/__snapshots__/AdminOrganizationTabUser.test.tsx.snap @@ -21,6 +21,7 @@ exports[`should take a snapshot 1`] = ` class="MuiTypography-root MuiTypography-body1 css-mocked-MuiTypography-root" style="font-size: 18px;" > + Users

    diff --git a/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.test.ts b/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.test.ts index 7258090a5..02352f764 100644 --- a/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.test.ts +++ b/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.test.ts @@ -24,6 +24,7 @@ import { } from './adminOrganizationTabUserSlice' import apiHelper from '../../apis/api-helper' import EnvironmentVars from '../../EnvironmentVars' +import { RootState } from '../../store' describe('admin organization tab User reducer', () => { it('should handle initial state', () => { @@ -39,7 +40,7 @@ describe('admin organization tab User reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['adminOrganizationTabUser'] = { loading: null, value: { availableUserList: null, @@ -238,14 +239,12 @@ describe('async thunks', () => { }, }) const user = { email: 'test@gmail.com', role: 'role1' } - const orgPatchJson = { users_to_remove: [] } const selectedOrg = 'selectedOrg' - let fetchPatchOrganization = jest.fn() const updateTableData = jest.fn() let userData = { user_data: { organizations: ['org1', 'org2'] } } - let action = userDeleteSingle({ user, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + let action = userDeleteSingle({ user, selectedOrg, updateTableData }) const jsdomAlert = window.alert try { @@ -253,23 +252,19 @@ describe('async thunks', () => { apiHelper._getDataWithCodes = jest.fn().mockReturnValue({ body: userData }) await action(dispatch, getState, undefined) expect(apiHelper._getDataWithCodes).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).toHaveBeenCalledWith({ users_to_remove: [user] }) expect(dispatch).toHaveBeenCalledTimes(1 + 2) expect(window.alert).not.toHaveBeenCalled() // Only 1 organization dispatch = jest.fn() - fetchPatchOrganization = jest.fn() userData = { user_data: { organizations: ['org1'] } } - action = userDeleteSingle({ user, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + action = userDeleteSingle({ user, selectedOrg, updateTableData }) window.alert = jest.fn() apiHelper._getDataWithCodes = jest.fn().mockReturnValue({ body: userData }) await action(dispatch, getState, undefined) expect(apiHelper._getDataWithCodes).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).not.toHaveBeenCalled() expect(dispatch).toHaveBeenCalledTimes(1 + 2) expect(window.alert).toHaveBeenCalledWith( 'Cannot remove User test@gmail.com from selectedOrg because they must belong to at least one organization.' @@ -296,7 +291,6 @@ describe('async thunks', () => { { email: 'test2@gmail.com', role: 'role2' }, { email: 'test3@gmail.com', role: 'role3' }, ] - const orgPatchJson = { users_to_remove: [] } const selectedOrg = 'selectedOrg' let fetchPatchOrganization = jest.fn() const updateTableData = jest.fn() @@ -304,7 +298,7 @@ describe('async thunks', () => { const userData = { user_data: { organizations: ['org1', 'org2', 'org3'] } } const invalidUserData = { user_data: { organizations: ['org1'] } } - let action = userDeleteMultiple({ users, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + let action = userDeleteMultiple({ users, selectedOrg, updateTableData }) const jsdomAlert = window.alert try { @@ -315,15 +309,12 @@ describe('async thunks', () => { .mockReturnValueOnce({ body: userData }) .mockReturnValueOnce({ body: userData }) await action(dispatch, getState, undefined) - expect(fetchPatchOrganization).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).toHaveBeenCalledWith({ users_to_remove: users }) expect(dispatch).toHaveBeenCalledTimes(1 + 2) // Only 1 organization dispatch = jest.fn() - fetchPatchOrganization = jest.fn() - action = userDeleteMultiple({ users, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + action = userDeleteMultiple({ users, selectedOrg, updateTableData }) window.alert = jest.fn() apiHelper._getDataWithCodes = jest @@ -332,7 +323,6 @@ describe('async thunks', () => { .mockReturnValueOnce({ body: invalidUserData }) .mockReturnValueOnce({ body: invalidUserData }) await action(dispatch, getState, undefined) - expect(fetchPatchOrganization).not.toHaveBeenCalled() expect(dispatch).toHaveBeenCalledTimes(0 + 2) expect(window.alert).toHaveBeenCalledWith( 'Cannot remove User(s) test2@gmail.com, test3@gmail.com from selectedOrg because they must belong to at least one organization.' @@ -358,18 +348,13 @@ describe('async thunks', () => { { email: 'test@gmail.com', role: 'role1' }, { email: 'test2@gmail.com', role: 'role2' }, ] - const orgPatchJson = { users_to_add: [] } const selectedOrg = 'selectedOrg' let fetchPatchOrganization = jest.fn() const updateTableData = jest.fn() - let action = userAddMultiple({ userList, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + let action = userAddMultiple({ userList, selectedOrg, updateTableData }) await action(dispatch, getState, undefined) - expect(fetchPatchOrganization).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).toHaveBeenCalledWith({ - users_to_add: userList, - }) expect(dispatch).toHaveBeenCalledTimes(1 + 2) }) }) @@ -392,18 +377,13 @@ describe('async thunks', () => { obj1: { newData: { email: 'test@gmail.com', role: 'role1' } }, obj2: { newData: { email: 'test2@gmail.com', role: 'role2' } }, } - const orgPatchJson = { users_to_modify: [] } const selectedOrg = 'selectedOrg' const fetchPatchOrganization = jest.fn() const updateTableData = jest.fn() - const action = userBulkEdit({ json, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData }) + const action = userBulkEdit({ json, selectedOrg, updateTableData }) await action(dispatch, getState, undefined) - expect(fetchPatchOrganization).toHaveBeenCalledTimes(1) - expect(fetchPatchOrganization).toHaveBeenCalledWith({ - users_to_modify: userList, - }) expect(dispatch).toHaveBeenCalledTimes(1 + 2) }) }) @@ -432,11 +412,12 @@ describe('async thunks', () => { }) describe('reducers', () => { - const initialState = { + const initialState: RootState['adminOrganizationTabUser'] = { loading: null, value: { - availableRsuList: null, - selectedRsuList: null, + availableUserList: null, + selectedUserList: null, + availableRoles: null, }, } @@ -451,7 +432,7 @@ describe('reducers', () => { it('setSelectedUserRole reducer updates state correctly', async () => { const email = 'test@gmail.com' const role = 'role1' - const selectedUserList = [{ email, role: 'role2' }] + const selectedUserList = [{ email, role: 'role2' }] as any expect( reducer( { ...initialState, value: { ...initialState.value, selectedUserList } }, @@ -489,7 +470,7 @@ describe('selectors', () => { availableRoles: 'availableRoles', }, } - const state = { adminOrganizationTabUser: initialState } + const state = { adminOrganizationTabUser: initialState } as any it('selectors return the correct value', async () => { expect(selectLoading(state)).toEqual('loading') diff --git a/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.tsx b/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.tsx index 9f4375380..73af90a3f 100644 --- a/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.tsx +++ b/webapp/src/features/adminOrganizationTabUser/adminOrganizationTabUserSlice.tsx @@ -78,14 +78,12 @@ export const userDeleteSingle = createAsyncThunk( async ( payload: { user: { email: string; role: string } - orgPatchJson: { org_name: string; users_to_remove: Array<{ email: string; role: string }> } selectedOrg: string - fetchPatchOrganization: (json: any) => Promise updateTableData: (org: string) => void }, { getState, dispatch } ) => { - const { user, orgPatchJson, selectedOrg, fetchPatchOrganization, updateTableData } = payload + const { user, selectedOrg, updateTableData } = payload const currentState = getState() as RootState const token = selectToken(currentState) @@ -93,10 +91,11 @@ export const userDeleteSingle = createAsyncThunk( const userData = (await getUserData(user.email, token)).body as { user_data: AdminOrgUser } if (userData?.user_data?.organizations?.length > 1) { const userRole = { email: user.email, role: user.role } - let patchJson = { ...orgPatchJson } - - patchJson.users_to_remove = [userRole] - promises.push(fetchPatchOrganization(patchJson)) + const patchJson: adminOrgPatch = { + name: selectedOrg, + users_to_remove: [userRole], + } + promises.push(dispatch(editOrg(patchJson))) } else { alert( 'Cannot remove User ' + diff --git a/webapp/src/features/adminRsuTab/AdminRsuTab.test.ts b/webapp/src/features/adminRsuTab/AdminRsuTab.test.tsx similarity index 100% rename from webapp/src/features/adminRsuTab/AdminRsuTab.test.ts rename to webapp/src/features/adminRsuTab/AdminRsuTab.test.tsx diff --git a/webapp/src/features/adminRsuTab/AdminRsuTab.tsx b/webapp/src/features/adminRsuTab/AdminRsuTab.tsx index 4f83a2d66..0a9c2ff60 100644 --- a/webapp/src/features/adminRsuTab/AdminRsuTab.tsx +++ b/webapp/src/features/adminRsuTab/AdminRsuTab.tsx @@ -146,21 +146,13 @@ const AdminRsuTab = () => {
    {activeDiv === 'rsu_table' && loading === false && (
    - +
    )} {activeDiv === 'add_rsu' && (
    - dispatch(updateTableData())} /> +
    )} diff --git a/webapp/src/features/adminRsuTab/__snapshots__/AdminRsuTab.test.js.snap b/webapp/src/features/adminRsuTab/__snapshots__/AdminRsuTab.test.tsx.snap similarity index 99% rename from webapp/src/features/adminRsuTab/__snapshots__/AdminRsuTab.test.js.snap rename to webapp/src/features/adminRsuTab/__snapshots__/AdminRsuTab.test.tsx.snap index 114b31386..32b18f4af 100644 --- a/webapp/src/features/adminRsuTab/__snapshots__/AdminRsuTab.test.js.snap +++ b/webapp/src/features/adminRsuTab/__snapshots__/AdminRsuTab.test.tsx.snap @@ -541,12 +541,6 @@ exports[`snapshot add 1`] = `

    -

    - Failed to add rsu due to error: - -

    diff --git a/webapp/src/features/adminRsuTab/adminRsuTabSlice.test.ts b/webapp/src/features/adminRsuTab/adminRsuTabSlice.test.ts index 114b76a89..98ab22924 100644 --- a/webapp/src/features/adminRsuTab/adminRsuTabSlice.test.ts +++ b/webapp/src/features/adminRsuTab/adminRsuTabSlice.test.ts @@ -20,6 +20,7 @@ import { } from './adminRsuTabSlice' import apiHelper from '../../apis/api-helper' import EnvironmentVars from '../../EnvironmentVars' +import { RootState } from '../../store' describe('admin RSU tab reducer', () => { it('should handle initial state', () => { @@ -43,7 +44,7 @@ describe('admin RSU tab reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['adminRsuTab'] = { loading: null, value: { activeDiv: null, @@ -216,7 +217,7 @@ describe('async thunks', () => { }, }, }) - const rows = [{ ip: '1.1.1.1' }, { ip: '1.1.1.2' }, { ip: '1.1.1.3' }] + const rows = [{ ip: '1.1.1.1' }, { ip: '1.1.1.2' }, { ip: '1.1.1.3' }] as any let action = deleteMultipleRsus(rows) @@ -227,7 +228,7 @@ describe('async thunks', () => { }) describe('reducers', () => { - const initialState = { + const initialState: RootState['adminRsuTab'] = { loading: null, value: { activeDiv: null, @@ -289,7 +290,7 @@ describe('selectors', () => { editRsuRowData: 'editRsuRowData', }, } - const state = { adminRsuTab: initialState } + const state = { adminRsuTab: initialState } as any it('selectors return the correct value', async () => { expect(selectLoading(state)).toEqual('loading') diff --git a/webapp/src/features/adminUserTab/AdminUserTab.test.ts b/webapp/src/features/adminUserTab/AdminUserTab.test.tsx similarity index 100% rename from webapp/src/features/adminUserTab/AdminUserTab.test.ts rename to webapp/src/features/adminUserTab/AdminUserTab.test.tsx diff --git a/webapp/src/features/adminUserTab/__snapshots__/AdminUserTab.test.js.snap b/webapp/src/features/adminUserTab/__snapshots__/AdminUserTab.test.tsx.snap similarity index 100% rename from webapp/src/features/adminUserTab/__snapshots__/AdminUserTab.test.js.snap rename to webapp/src/features/adminUserTab/__snapshots__/AdminUserTab.test.tsx.snap diff --git a/webapp/src/features/adminUserTab/adminUserTabSlice.test.ts b/webapp/src/features/adminUserTab/adminUserTabSlice.test.ts index 02337e89b..13f6bbdce 100644 --- a/webapp/src/features/adminUserTab/adminUserTabSlice.test.ts +++ b/webapp/src/features/adminUserTab/adminUserTabSlice.test.ts @@ -22,6 +22,7 @@ import { } from './adminUserTabSlice' import apiHelper from '../../apis/api-helper' import EnvironmentVars from '../../EnvironmentVars' +import { RootState } from '../../store' describe('admin User tab reducer', () => { it('should handle initial state', () => { @@ -38,7 +39,7 @@ describe('admin User tab reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['adminUserTab'] = { loading: null, value: { activeDiv: null, @@ -156,7 +157,7 @@ describe('async thunks', () => { }) describe('reducers', () => { - const initialState = { + const initialState: RootState['adminUserTab'] = { loading: null, value: { activeDiv: null, @@ -244,7 +245,7 @@ describe('selectors', () => { editUserRowData: 'editUserRowData', }, } - const state = { adminUserTab: initialState } + const state = { adminUserTab: initialState } as any it('selectors return the correct value', async () => { expect(selectLoading(state)).toEqual('loading') diff --git a/webapp/src/features/menu/ConfigureRSU.test.ts b/webapp/src/features/menu/ConfigureRSU.test.tsx similarity index 100% rename from webapp/src/features/menu/ConfigureRSU.test.ts rename to webapp/src/features/menu/ConfigureRSU.test.tsx diff --git a/webapp/src/features/menu/DisplayCounts.test.ts b/webapp/src/features/menu/DisplayCounts.test.tsx similarity index 100% rename from webapp/src/features/menu/DisplayCounts.test.ts rename to webapp/src/features/menu/DisplayCounts.test.tsx diff --git a/webapp/src/features/menu/Menu.test.ts b/webapp/src/features/menu/Menu.test.tsx similarity index 93% rename from webapp/src/features/menu/Menu.test.ts rename to webapp/src/features/menu/Menu.test.tsx index 225e9f84c..4246c0b19 100644 --- a/webapp/src/features/menu/Menu.test.ts +++ b/webapp/src/features/menu/Menu.test.tsx @@ -4,6 +4,7 @@ import Menu from './Menu' import { Provider } from 'react-redux' import { setupStore } from '../../store' import { replaceChaoticIds } from '../../utils/test-utils' +import ReactDOM from 'react-dom' it('should take a snapshot', () => { const { container } = render( diff --git a/webapp/src/features/menu/__snapshots__/ConfigureRSU.test.js.snap b/webapp/src/features/menu/__snapshots__/ConfigureRSU.test.tsx.snap similarity index 100% rename from webapp/src/features/menu/__snapshots__/ConfigureRSU.test.js.snap rename to webapp/src/features/menu/__snapshots__/ConfigureRSU.test.tsx.snap diff --git a/webapp/src/features/menu/__snapshots__/DisplayCounts.test.js.snap b/webapp/src/features/menu/__snapshots__/DisplayCounts.test.tsx.snap similarity index 100% rename from webapp/src/features/menu/__snapshots__/DisplayCounts.test.js.snap rename to webapp/src/features/menu/__snapshots__/DisplayCounts.test.tsx.snap diff --git a/webapp/src/features/menu/__snapshots__/Menu.test.js.snap b/webapp/src/features/menu/__snapshots__/Menu.test.tsx.snap similarity index 100% rename from webapp/src/features/menu/__snapshots__/Menu.test.js.snap rename to webapp/src/features/menu/__snapshots__/Menu.test.tsx.snap diff --git a/webapp/src/features/menu/menuSlice.test.ts b/webapp/src/features/menu/menuSlice.test.ts index ee7121bef..cd39c2f26 100644 --- a/webapp/src/features/menu/menuSlice.test.ts +++ b/webapp/src/features/menu/menuSlice.test.ts @@ -8,18 +8,16 @@ import { setCurrentSort, setSortedCountList, setDisplay, - setPreviousRequest, // selectors selectLoading, - selectPreviousRequest, - selectDisplay, selectCurrentSort, selectSortedCountList, selectDisplayCounts, selectView, } from './menuSlice' import apiHelper from '../../apis/api-helper' +import { RootState } from '../../store' const { DateTime } = require('luxon') describe('menu reducer', () => { @@ -38,10 +36,9 @@ describe('menu reducer', () => { }) describe('reducers', () => { - const initialState = { + const initialState: RootState['menu'] = { loading: null, value: { - previousRequest: null, currentSort: null, sortedCountList: null, displayCounts: false, @@ -78,14 +75,6 @@ describe('reducers', () => { value: { ...initialState.value, view, displayCounts: false }, }) }) - - it('setPreviousRequest reducer updates state correctly', async () => { - const previousRequest = 'previousRequest' - expect(reducer(initialState, setPreviousRequest(previousRequest))).toEqual({ - ...initialState, - value: { ...initialState.value, previousRequest }, - }) - }) }) describe('functions', () => { @@ -115,9 +104,8 @@ describe('functions', () => { const expected = { start: '2021-01-01T00:00:00.000-07:00' } const type = 'start' const requestOut = true - let previousRequest = { abort: jest.fn() } apiHelper._deleteData = jest.fn().mockReturnValue({ status: 200, data: 'data' }) - const resp = changeDate(e, type, requestOut, previousRequest)(dispatch) + const resp = changeDate(e, type, requestOut)(dispatch) expect(resp).toEqual(expected) expect(dispatch).toHaveBeenCalledTimes(2) }) @@ -128,11 +116,9 @@ describe('functions', () => { const expected = { end: '2021-01-01T00:00:00.000-07:00' } const type = 'end' const requestOut = true - let previousRequest = { abort: jest.fn() } apiHelper._deleteData = jest.fn().mockReturnValue({ status: 200, data: 'data' }) - const resp = changeDate(e, type, requestOut, previousRequest)(dispatch) + const resp = changeDate(e, type, requestOut)(dispatch) expect(resp).toEqual(expected) - expect(previousRequest.abort).toHaveBeenCalledTimes(1) expect(dispatch).toHaveBeenCalledTimes(2) }) }) @@ -149,12 +135,10 @@ describe('selectors', () => { view: 'view', }, } - const state = { menu: initialState } + const state = { menu: initialState } as any it('selectors return the correct value', async () => { expect(selectLoading(state)).toEqual('loading') - expect(selectPreviousRequest(state)).toEqual('previousRequest') - expect(selectDisplay(state)).toEqual('display') expect(selectCurrentSort(state)).toEqual('currentSort') expect(selectSortedCountList(state)).toEqual('sortedCountList') expect(selectDisplayCounts(state)).toEqual('displayCounts') diff --git a/webapp/src/generalSlices/configSlice.test.ts b/webapp/src/generalSlices/configSlice.test.ts index 46455b7bd..ca66b82cc 100644 --- a/webapp/src/generalSlices/configSlice.test.ts +++ b/webapp/src/generalSlices/configSlice.test.ts @@ -6,12 +6,12 @@ import reducer, { rebootRsu, // reducers - setMsgFwdConfig, setDestIp, setMsgType, toggleConfigPointSelect, } from './configSlice' import RsuApi from '../apis/rsu-api' +import { RootState } from '../store' describe('config reducer', () => { it('should handle initial state', () => { @@ -35,7 +35,7 @@ describe('config reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['config'] = { loading: null, value: { msgFwdConfig: null, @@ -47,15 +47,17 @@ describe('async thunks', () => { snmpFilterMsg: '', snmpFilterErr: false, addConfigPoint: false, + configCoordinates: null, + configList: null, }, } beforeAll(() => { - jest.mock('../apis/rsu-api.js') + jest.mock('../apis/rsu-api') }) afterAll(() => { - jest.unmock('../apis/rsu-api.js') + jest.unmock('../apis/rsu-api') }) describe('refreshSnmpFwdConfig', () => { @@ -399,7 +401,7 @@ describe('async thunks', () => { }) describe('reducers', () => { - const initialState = { + const initialState: RootState['config'] = { loading: null, value: { msgFwdConfig: null, @@ -411,17 +413,11 @@ describe('reducers', () => { snmpFilterMsg: '', snmpFilterErr: false, addConfigPoint: false, + configCoordinates: null, + configList: null, }, } - it('setMsgFwdConfig reducer updates state correctly', async () => { - const msgFwdConfig = 'updated' - expect(reducer(initialState, setMsgFwdConfig(msgFwdConfig))).toEqual({ - ...initialState, - value: { ...initialState.value, msgFwdConfig }, - }) - }) - it('setDestIp reducer updates state correctly', async () => { const destIp = 'updated' expect(reducer(initialState, setDestIp(destIp))).toEqual({ @@ -440,7 +436,7 @@ describe('reducers', () => { it('toggleConfigPointSelect reducer updates state correctly', async () => { const addConfigPoint = initialState.value.addConfigPoint - expect(reducer(initialState, toggleConfigPointSelect(addConfigPoint))).toEqual({ + expect(reducer(initialState, toggleConfigPointSelect())).toEqual({ ...initialState, value: { ...initialState.value, addConfigPoint: !addConfigPoint }, }) diff --git a/webapp/src/generalSlices/configSlice.ts b/webapp/src/generalSlices/configSlice.ts index f3ce19f90..cdf6b096c 100644 --- a/webapp/src/generalSlices/configSlice.ts +++ b/webapp/src/generalSlices/configSlice.ts @@ -2,10 +2,10 @@ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit' import RsuApi from '../apis/rsu-api' import { selectToken, selectOrganizationName } from './userSlice' import { RootState } from '../store' -import { RsuCommandPostBody } from '../apis/rsu-api-types' +import { RsuCommandPostBody, SnmpFwdWalkConfig } from '../apis/rsu-api-types' const initialState = { - msgFwdConfig: {}, + msgFwdConfig: {} as any, errorState: '', changeSuccess: false, rebootChangeSuccess: false, @@ -35,35 +35,37 @@ export const refreshSnmpFwdConfig = createAsyncThunk( return response.status === 200 ? { msgFwdConfig: response.body.RsuFwdSnmpwalk, errorState: '' } - : { msgFwdConfig: {}, errorState: response.body.RsuFwdSnmpwalk } + : { + msgFwdConfig: {} as { + [id: string]: SnmpFwdWalkConfig + }, + errorState: response.body.RsuFwdSnmpwalk, + } } ) -export const submitSnmpSet = createAsyncThunk( - 'config/submitSnmpSet', - async (ipList: string[], { getState, dispatch }) => { - const currentState = getState() as RootState - const token = selectToken(currentState) - const organization = selectOrganizationName(currentState) - const destIp = selectDestIp(currentState) - const snmpMsgType = selectSnmpMsgType(currentState) +export const submitSnmpSet = createAsyncThunk('config/submitSnmpSet', async (ipList: string[], { getState }) => { + const currentState = getState() as RootState + const token = selectToken(currentState) + const organization = selectOrganizationName(currentState) + const destIp = selectDestIp(currentState) + const snmpMsgType = selectSnmpMsgType(currentState) - const body: RsuCommandPostBody = { - command: 'rsufwdsnmpset', - rsu_ip: ipList, - args: { - dest_ip: destIp, - msg_type: snmpMsgType, - }, - } + const body: RsuCommandPostBody = { + command: 'rsufwdsnmpset', + rsu_ip: ipList, + args: { + dest_ip: destIp, + msg_type: snmpMsgType, + }, + } - const response = await RsuApi.postRsuData(token, organization, body, '') + const response = await RsuApi.postRsuData(token, organization, body, '') - return response.status === 200 - ? { changeSuccess: true, errorState: '' } - : { changeSuccess: false, errorState: response.body.RsuFwdSnmpset } - } -) + return response.status === 200 + ? { changeSuccess: true, errorState: '' } + : { changeSuccess: false, errorState: response.body.RsuFwdSnmpset } +}) export const deleteSnmpSet = createAsyncThunk( 'config/deleteSnmpSet', @@ -73,7 +75,7 @@ export const deleteSnmpSet = createAsyncThunk( destIp: string snmpMsgType: string }, - { getState, dispatch } + { getState } ) => { const currentState = getState() as RootState const token = selectToken(currentState) @@ -96,7 +98,7 @@ export const deleteSnmpSet = createAsyncThunk( } ) -export const filterSnmp = createAsyncThunk('config/filterSnmp', async (ipList: string[], { getState, dispatch }) => { +export const filterSnmp = createAsyncThunk('config/filterSnmp', async (ipList: string[], { getState }) => { const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -117,7 +119,7 @@ export const filterSnmp = createAsyncThunk('config/filterSnmp', async (ipList: s } }) -export const rebootRsu = createAsyncThunk('config/rebootRsu', async (ipList: string[], { getState, dispatch }) => { +export const rebootRsu = createAsyncThunk('config/rebootRsu', async (ipList: string[], { getState }) => { const currentState = getState() as RootState const token = selectToken(currentState) const organization = selectOrganizationName(currentState) @@ -153,7 +155,7 @@ export const geoRsuQuery = createAsyncThunk( }, { // Will guard thunk from being executed - condition: (_, { getState, extra }) => { + condition: (_, { getState }) => { const currentState = getState() as RootState as RootState const configCoordinates = selectConfigCoordinates(currentState) @@ -170,9 +172,6 @@ export const configSlice = createSlice({ value: initialState, }, reducers: { - setMsgFwdConfig: (state, action) => { - state.value.msgFwdConfig = action.payload - }, setDestIp: (state, action) => { state.value.destIp = action.payload }, @@ -180,7 +179,6 @@ export const configSlice = createSlice({ state.value.snmpMsgType = action.payload }, toggleConfigPointSelect: (state) => { - console.debug('toggleConfigPointSelect') state.value.addConfigPoint = !state.value.addConfigPoint }, updateConfigPoints: (state, action) => { @@ -197,7 +195,9 @@ export const configSlice = createSlice({ builder .addCase(refreshSnmpFwdConfig.pending, (state) => { state.loading = true - state.value.msgFwdConfig = {} + state.value.msgFwdConfig = {} as { + [id: string]: SnmpFwdWalkConfig + } state.value.errorState = '' state.value.snmpFilterMsg = '' state.value.destIp = '' @@ -301,7 +301,6 @@ export const selectAddConfigPoint = (state: RootState) => state.config.value.add export const selectConfigCoordinates = (state: RootState) => state.config.value.configCoordinates export const selectConfigList = (state: RootState) => state.config.value.configList -export const { setMsgFwdConfig, setDestIp, setMsgType, toggleConfigPointSelect, updateConfigPoints, clearConfig } = - configSlice.actions +export const { setDestIp, setMsgType, toggleConfigPointSelect, updateConfigPoints, clearConfig } = configSlice.actions export default configSlice.reducer diff --git a/webapp/src/generalSlices/rsuSlice.test.ts b/webapp/src/generalSlices/rsuSlice.test.ts index 17ad15f8c..8cf2d7927 100644 --- a/webapp/src/generalSlices/rsuSlice.test.ts +++ b/webapp/src/generalSlices/rsuSlice.test.ts @@ -70,6 +70,7 @@ import { selectHeatMapData, } from './rsuSlice' import RsuApi from '../apis/rsu-api' +import { RootState } from '../store' describe('rsu reducer', () => { it('should handle initial state', () => { @@ -115,7 +116,7 @@ describe('rsu reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['rsu'] = { loading: null, requestOut: null, value: { @@ -155,11 +156,11 @@ describe('async thunks', () => { } beforeAll(() => { - jest.mock('../apis/rsu-api.js') + jest.mock('../apis/rsu-api') }) afterAll(() => { - jest.unmock('../apis/rsu-api.js') + jest.unmock('../apis/rsu-api') }) describe('getRsuData', () => { @@ -188,10 +189,10 @@ describe('async thunks', () => { it('Updates the state correctly pending', async () => { let loading = true - let rsuData = [] + let rsuData = [] as any let rsuOnlineStatus = {} let rsuCounts = {} - let countList = [] + let countList = [] as any const state = reducer(initialState, { type: 'rsu/getRsuData/pending', }) @@ -210,7 +211,7 @@ describe('async thunks', () => { it('Updates the state correctly fulfilled', async () => { let loading = false - let rsuCounts = { ipv4_address: { count: 4 } } + let rsuCounts = { ipv4_address: { count: 4 } } as any let rsuData = [ { properties: { @@ -220,7 +221,7 @@ describe('async thunks', () => { coordinates: [-104.999824, 39.750392], }, }, - ] + ] as any const state = reducer( { ...initialState, value: { ...initialState.value, rsuData, rsuCounts } }, { @@ -343,7 +344,7 @@ describe('async thunks', () => { it('Updates the state correctly fulfilled', async () => { let loading = false - let rsuOnlineStatus = { '1.1.1.1': {} } + let rsuOnlineStatus = { '1.1.1.1': {} as any } const payload = { last_online: '2021-03-01T00:00:00.000000Z', ip: '1.1.1.1' } const state = reducer( { @@ -416,7 +417,7 @@ describe('async thunks', () => { }) const action = _getRsuOnlineStatus({ rsuOnlineStatusState: 'rsuOnlineStatusState', - }) + } as any) const rsuOnlineStatus = 'rsuOnlineStatus' RsuApi.getRsuOnline = jest.fn().mockReturnValue(rsuOnlineStatus) @@ -435,9 +436,9 @@ describe('async thunks', () => { }, }, }) - const action = _getRsuOnlineStatus('rsuOnlineStatusState') + const action = _getRsuOnlineStatus('rsuOnlineStatusState' as any) - const rsuOnlineStatus = null + const rsuOnlineStatus = null as any RsuApi.getRsuOnline = jest.fn().mockReturnValue(rsuOnlineStatus) let resp = await action(dispatch, getState, undefined) expect(resp.payload).toEqual('rsuOnlineStatusState') @@ -656,7 +657,7 @@ describe('async thunks', () => { }) it('Updates the state correctly fulfilled default value', async () => { - const issScmsStatusData = 'issScmsStatus' + const issScmsStatusData = 'issScmsStatus' as any const state = reducer( { ...initialState, value: { ...initialState.value, issScmsStatusData } }, { @@ -688,7 +689,7 @@ describe('async thunks', () => { start: 1, end: 86400000, } - const action = updateRowData(data) + const action = updateRowData(data as any) const rsuCounts = { '1.1.1.1': { road: 'road', count: 'count' }, @@ -792,7 +793,7 @@ describe('async thunks', () => { }, }, ], - } + } as any const warningMessage = 'warningMessage' const requestOut = false const messageLoading = false @@ -915,8 +916,8 @@ describe('async thunks', () => { it('Updates the state correctly pending', async () => { const addBsmPoint = false const loading = true - const bsmStart = 1 - const bsmEnd = 86400000 + const bsmStart = 1 as any + const bsmEnd = 86400000 as any const bsmDateError = false const state = reducer( { @@ -938,8 +939,8 @@ describe('async thunks', () => { it('Updates the state correctly pending date error', async () => { const addBsmPoint = false const loading = true - const bsmStart = 1 - const bsmEnd = 86400002 + const bsmStart = 1 as any + const bsmEnd = 86400002 as any const bsmDateError = true const state = reducer( { @@ -1071,13 +1072,13 @@ describe('functions', () => { it('updateMessageType', async () => { const dispatch = jest.fn() - updateMessageType('messageType')(dispatch) + updateMessageType('messageType' as any)(dispatch) expect(dispatch).toHaveBeenCalledTimes(2) }) }) describe('reducers', () => { - const initialState = { + const initialState: RootState['rsu'] = { loading: null, requestOut: null, value: { @@ -1285,7 +1286,7 @@ describe('selectors', () => { selectedSrm: 'selectedSrm', }, } - const rsuState = { rsu: initialState } + const rsuState = { rsu: initialState } as any it('selectors return the correct value', async () => { expect(selectLoading(rsuState)).toEqual('loading') diff --git a/webapp/src/generalSlices/rsuSlice.ts b/webapp/src/generalSlices/rsuSlice.ts index 31ae3abc0..0f18c9388 100644 --- a/webapp/src/generalSlices/rsuSlice.ts +++ b/webapp/src/generalSlices/rsuSlice.ts @@ -16,6 +16,7 @@ import { MessageType } from '../constants' import { RootState } from '../store' import { selectToken, selectOrganizationName } from './userSlice' import { SelectedSrm } from '../types/Srm' +import { CountsListElement } from '../types/Rsu' const { DateTime } = require('luxon') const initialState = { @@ -244,16 +245,15 @@ export const updateBsmData = createAsyncThunk( const token = selectToken(currentState) try { - const bsmMapData: ApiMsgRespWithCodes & { body: Array> } = - await RsuApi.postBsmData( - token, - { - start: currentState.rsu.value.bsmStart, - end: currentState.rsu.value.bsmEnd, - geometry: currentState.rsu.value.bsmCoordinates, - }, - '' - ) + const bsmMapData: ApiMsgRespWithCodes>> = await RsuApi.postBsmData( + token, + { + start: currentState.rsu.value.bsmStart, + end: currentState.rsu.value.bsmEnd, + geometry: currentState.rsu.value.bsmCoordinates, + }, + '' + ) return bsmMapData } catch (err) { console.error(err) diff --git a/webapp/src/generalSlices/userSlice.test.ts b/webapp/src/generalSlices/userSlice.test.ts index 76094d124..0dd0a8900 100644 --- a/webapp/src/generalSlices/userSlice.test.ts +++ b/webapp/src/generalSlices/userSlice.test.ts @@ -24,6 +24,7 @@ import { } from './userSlice' import AuthApi from '../apis/auth-api' import { UserManager, LocalStorageManager } from '../managers' +import { RootState } from '../store' describe('user reducer', () => { it('should handle initial state', () => { @@ -40,54 +41,24 @@ describe('user reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['user'] = { loading: null, - bsmLoading: null, - requestOut: null, value: { - selectedRsu: null, - rsuData: null, - rsuOnlineStatus: null, - rsuCounts: null, - countList: null, - currentSort: null, - startDate: null, - endDate: null, - heatMapData: { - features: [], - type: 'FeatureCollection', - }, - messageLoading: null, - warningMessage: null, - msgType: null, - rsuMapData: null, - mapList: null, - mapDate: null, - displayMap: null, - bsmStart: null, - bsmEnd: null, - addPoint: null, - bsmCoordinates: null, - bsmData: null, - bsmDateError: null, - bsmFilter: null, - bsmFilterStep: null, - bsmFilterOffset: null, - issScmsStatusData: null, - ssmDisplay: null, - srmSsmList: null, - selectedSrm: null, + authLoginData: null, + organization: null, + loginFailure: null, + kcFailure: null, }, } beforeAll(() => { - jest.mock('../apis/auth-api.js') - jest.mock('../managers.js') + jest.mock('../apis/auth-api') + jest.mock('../managers') }) afterAll(() => { - jest.unmock('../apis/auth-api.js') - jest.unmock('../managers.js') + jest.unmock('../apis/auth-api') + jest.unmock('../managers') }) describe('login', () => { @@ -109,7 +80,7 @@ describe('async thunks', () => { }) expect(AuthApi.logIn).toHaveBeenCalledWith('token') } catch (e) { - Date.now.mockClear() + ;(Date.now as any).mockClear() throw e } }) @@ -161,25 +132,26 @@ describe('async thunks', () => { }) describe('reducers', () => { - const initialState = { + const initialState: RootState['user'] = { loading: null, value: { authLoginData: null, organization: null, loginFailure: null, + kcFailure: null, }, } it('logout reducer updates state correctly', async () => { - const authLoginData = null - const organization = null + const authLoginData = null as any + const organization = null as any LocalStorageManager.removeAuthData = jest.fn() expect( reducer( { ...initialState, value: { ...initialState.value, authLoginData: 'authLoginData', organization: 'organization' }, - }, + } as any, logout() ) ).toEqual({ @@ -197,7 +169,7 @@ describe('reducers', () => { { ...initialState, value: { ...initialState.value, authLoginData: 'authLoginData' }, - }, + } as any, changeOrganization('payload') ) ).toEqual({ @@ -212,7 +184,7 @@ describe('reducers', () => { { ...initialState, value: { ...initialState.value, organization, authLoginData: 'authLoginData' }, - }, + } as any, changeOrganization('payload') ) ).toEqual({ @@ -260,7 +232,7 @@ describe('selectors', () => { loginFailure: 'loginFailure', }, } - const state = { user: initialState, rsu: { loading: false }, config: { loading: false } } + const state = { user: initialState, rsu: { loading: false }, config: { loading: false } } as any it('selectors return the correct value', async () => { expect(selectAuthLoginData(state)).toEqual(initialState.value.authLoginData) @@ -281,7 +253,7 @@ describe('selectors', () => { rsu: { loading: false }, config: { loading: false }, abcdefg: { loading: false }, - } + } as any expect(selectLoadingGlobal(loadingState)).toEqual(false) expect(selectLoadingGlobal({ ...loadingState, user: { loading: true } })).toEqual(true) }) diff --git a/webapp/src/generalSlices/wzdxSlice.test.ts b/webapp/src/generalSlices/wzdxSlice.test.ts index c3834d510..7cf59b344 100644 --- a/webapp/src/generalSlices/wzdxSlice.test.ts +++ b/webapp/src/generalSlices/wzdxSlice.test.ts @@ -8,6 +8,7 @@ import { selectWzdxData, } from './wzdxSlice' import RsuApi from '../apis/rsu-api' +import { RootState } from '../store' describe('wzdx reducer', () => { it('should handle initial state', () => { @@ -19,17 +20,17 @@ describe('wzdx reducer', () => { }) describe('async thunks', () => { - const initialState = { + const initialState: RootState['wzdx'] = { loading: null, value: null, } beforeAll(() => { - jest.mock('../apis/rsu-api.js') + jest.mock('../apis/rsu-api') }) afterAll(() => { - jest.unmock('../apis/rsu-api.js') + jest.unmock('../apis/rsu-api') }) describe('getWzdxData', () => { @@ -95,7 +96,7 @@ describe('selectors', () => { const state = { wzdx: initialState } it('selectors return the correct value', async () => { - expect(selectLoading(state)).toEqual('loading') - expect(selectWzdxData(state)).toEqual('wzdxData') + expect(selectLoading(state as any)).toEqual('loading') + expect(selectWzdxData(state as any)).toEqual('wzdxData') }) }) diff --git a/webapp/src/index.tsx b/webapp/src/index.tsx index e454f5ed4..01b806d6c 100644 --- a/webapp/src/index.tsx +++ b/webapp/src/index.tsx @@ -2,8 +2,8 @@ import React from 'react' import ReactDOM from 'react-dom' import { Provider } from 'react-redux' import 'mapbox-gl/dist/mapbox-gl.css' -import { setupStore } from './store.js' -import App from './App.js' +import { setupStore } from './store' +import App from './App' ReactDOM.render( diff --git a/webapp/src/pages/Admin.test.ts b/webapp/src/pages/Admin.test.tsx similarity index 100% rename from webapp/src/pages/Admin.test.ts rename to webapp/src/pages/Admin.test.tsx diff --git a/webapp/src/pages/Admin.tsx b/webapp/src/pages/Admin.tsx index 766ee81f7..b01d2ee67 100644 --- a/webapp/src/pages/Admin.tsx +++ b/webapp/src/pages/Admin.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react' -import AdminFormManager from '../components/AdminFormManager.js' +import AdminFormManager from '../components/AdminFormManager' import { Tab, Tabs, TabList, TabPanel } from 'react-tabs' import { useDispatch } from 'react-redux' import { updateTableData as updateRsuTableData } from '../features/adminRsuTab/adminRsuTabSlice' @@ -7,7 +7,7 @@ import { getAvailableUsers } from '../features/adminUserTab/adminUserTabSlice' import '../features/adminRsuTab/Admin.css' import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store.js' +import { RootState } from '../store' function Admin() { const dispatch: ThunkDispatch = useDispatch() diff --git a/webapp/src/pages/Map.test.ts b/webapp/src/pages/Map.test.tsx similarity index 95% rename from webapp/src/pages/Map.test.ts rename to webapp/src/pages/Map.test.tsx index 0e35307fb..d3d9112d9 100644 --- a/webapp/src/pages/Map.test.ts +++ b/webapp/src/pages/Map.test.tsx @@ -2,14 +2,13 @@ import React from 'react' import { render, screen, fireEvent, queryByAttribute } from '@testing-library/react' import Map from './Map' import { Provider } from 'react-redux' -import { setupStore } from '../store' +import { RootState, setupStore } from '../store' import { replaceChaoticIds } from '../utils/test-utils' it('snapshot bsmCoordinates wzdx', () => { const initialState = { rsu: { value: { - bsmCoordinates: [], rsuCounts: {}, mapList: [], bsmData: [], @@ -48,10 +47,10 @@ it('snapshot bsmCoordinates wzdx', () => { ], }, }, - } + } as any const { container } = render( - + ) @@ -94,10 +93,10 @@ it('snapshot bsmData clicked', () => { addConfigPoint: false, }, }, - } + } as any const { container } = render( - + ) diff --git a/webapp/src/pages/RsuMapView.test.ts b/webapp/src/pages/RsuMapView.test.tsx similarity index 96% rename from webapp/src/pages/RsuMapView.test.ts rename to webapp/src/pages/RsuMapView.test.tsx index e4a31f89c..9473211e4 100644 --- a/webapp/src/pages/RsuMapView.test.ts +++ b/webapp/src/pages/RsuMapView.test.tsx @@ -35,7 +35,7 @@ it('should take a snapshot', () => { } const { container } = render( - + ) diff --git a/webapp/src/pages/RsuMapView.tsx b/webapp/src/pages/RsuMapView.tsx index c210c8587..1addc0359 100644 --- a/webapp/src/pages/RsuMapView.tsx +++ b/webapp/src/pages/RsuMapView.tsx @@ -18,6 +18,7 @@ import { toggleMapDisplay, toggleSsmSrmDisplay, getSsmSrmData, + setSelectedSrm, } from '../generalSlices/rsuSlice' import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' import { RootState } from '../store' @@ -204,7 +205,7 @@ function RsuMapView(props: RsuMapViewProps) {

    Display

    {msgList.map((index) => ( - + ))}

    Total Counts

    diff --git a/webapp/src/pages/__snapshots__/Admin.test.js.snap b/webapp/src/pages/__snapshots__/Admin.test.js.snap deleted file mode 100644 index 9cde05db8..000000000 --- a/webapp/src/pages/__snapshots__/Admin.test.js.snap +++ /dev/null @@ -1,724 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`should take a snapshot 1`] = ` -
    -
    -

    - CV Manager Admin Interface -

    -
    -
      - - - -
    -
    -
    -
    -
    -
    -

    - CV Manager RSUs - - -

    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - ​ - - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - -
    - - - - - - -
    - - Milepost - - - -
    -
    -
    - - IP Address - - - -
    -
    -
    - - Primary Route - - - -
    -
    -
    - - RSU Model - - - -
    -
    -
    - - Serial Number - - - -
    -
    - - Actions - -
    - No records to display -
    -
    -
    -
    -
    - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -`; diff --git a/webapp/src/pages/__snapshots__/Map.test.js.snap b/webapp/src/pages/__snapshots__/Map.test.tsx.snap similarity index 80% rename from webapp/src/pages/__snapshots__/Map.test.js.snap rename to webapp/src/pages/__snapshots__/Map.test.tsx.snap index 984edc22d..b8ca690dd 100644 --- a/webapp/src/pages/__snapshots__/Map.test.js.snap +++ b/webapp/src/pages/__snapshots__/Map.test.tsx.snap @@ -23,6 +23,7 @@ exports[`snapshot bsmCoordinates wzdx 1`] = ` class="legend-label" > @@ -72,6 +73,100 @@ exports[`snapshot bsmCoordinates wzdx 1`] = `
    +
    +

    + RSU Status +

    + + + +

    + RSU Configuration +

    +
    + +
    +
    + +
    +
    val.replace(/css-[0-9a-z]*?-/g, 'css-mocked-'), + updateFunc: (val: string) => val.replace(/css-[0-9a-z]*?-/g, 'css-mocked-'), }, ] diff --git a/webapp/tsconfig.json b/webapp/tsconfig.json index d77fd4083..f772d55c3 100644 --- a/webapp/tsconfig.json +++ b/webapp/tsconfig.json @@ -11,6 +11,7 @@ "noImplicitAny": true, "jsx": "react", "esModuleInterop": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "lib": ["ES2022", "DOM", "ScriptHost"] } } diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 8377eb3b4..f6ae76a2e 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2797,10 +2797,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^29.5.5": - version "29.5.5" - resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz" - integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== +"@types/jest@*", "@types/jest@^29.5.8": + version "29.5.8" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz" + integrity sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g== dependencies: expect "^29.0.0" pretty-format "^29.0.0" From a8995f5358303b082fed1db668c65202a7a32166 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Mon, 27 Nov 2023 11:55:53 -0700 Subject: [PATCH 16/70] Updating unit tests --- services/api/src/smtp_error_handler.py | 2 +- services/api/tests/src/test_admin_user.py | 25 ++++++++++--------- .../api/tests/src/test_smtp_error_handler.py | 12 ++++----- .../api/tests/src/test_unsub_error_emails.py | 6 ++--- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/services/api/src/smtp_error_handler.py b/services/api/src/smtp_error_handler.py index ebf4fe444..79020aa34 100644 --- a/services/api/src/smtp_error_handler.py +++ b/services/api/src/smtp_error_handler.py @@ -29,7 +29,7 @@ def unsubscribe_user(email: str): query = f"UPDATE public.users SET receive_error_emails='0' WHERE email = '{email}'" - pgquery.insert_db(query) + pgquery.write_db(query) return 200 diff --git a/services/api/tests/src/test_admin_user.py b/services/api/tests/src/test_admin_user.py index c852874b7..c1d9ce52f 100644 --- a/services/api/tests/src/test_admin_user.py +++ b/services/api/tests/src/test_admin_user.py @@ -7,8 +7,8 @@ ###################################### Testing Requests ########################################## -# OPTIONS endpoint test +# OPTIONS endpoint test def test_request_options(): info = admin_user.AdminUser() (body, code, headers) = info.options() @@ -16,8 +16,8 @@ def test_request_options(): assert code == 204 assert headers['Access-Control-Allow-Methods'] == 'GET,PATCH,DELETE' -# GET endpoint tests +# GET endpoint tests @patch('api.src.admin_user.get_modify_user_data') def test_entry_get(mock_get_modify_user_data): req = MagicMock() @@ -33,6 +33,7 @@ def test_entry_get(mock_get_modify_user_data): assert headers['Access-Control-Allow-Origin'] == "test.com" assert body == {} + # Test schema for string value def test_entry_get_schema_str(): req = MagicMock() @@ -43,8 +44,8 @@ def test_entry_get_schema_str(): with pytest.raises(HTTPException): status.get() -# PATCH endpoint tests +# PATCH endpoint tests @patch('api.src.admin_user.modify_user') def test_entry_patch(mock_modify_user): req = MagicMock() @@ -69,8 +70,8 @@ def test_entry_patch_schema(): with pytest.raises(HTTPException): status.patch() -# DELETE endpoint tests +# DELETE endpoint tests @patch('api.src.admin_user.delete_user') def test_entry_delete_user(mock_delete_user): req = MagicMock() @@ -97,13 +98,13 @@ def test_entry_delete_schema(): ###################################### Testing Functions ########################################## -# get_user_data +# get_user_data @patch('api.src.admin_user.pgquery.query_db') def test_get_user_data_all(mock_query_db): mock_query_db.return_value = admin_user_data.get_user_data_return expected_result = admin_user_data.get_user_data_expected - expected_query = admin_user_data.expected_get_user_qeury + expected_query = admin_user_data.expected_get_user_query actual_result = admin_user.get_user_data("all") mock_query_db.assert_called_with(expected_query) @@ -113,7 +114,7 @@ def test_get_user_data_all(mock_query_db): def test_get_user_data_email(mock_query_db): mock_query_db.return_value = admin_user_data.get_user_data_return expected_result = admin_user_data.get_user_data_expected[0] - expected_query = admin_user_data.expected_get_user_qeury_one + expected_query = admin_user_data.expected_get_user_query_one actual_result = admin_user.get_user_data("test@email.com") mock_query_db.assert_called_with(expected_query) @@ -124,14 +125,14 @@ def test_get_user_data_none(mock_query_db): # get user should return an empty object if there are no users with specified email mock_query_db.return_value = [] expected_result = {} - expected_query = admin_user_data.expected_get_user_qeury_one + expected_query = admin_user_data.expected_get_user_query_one actual_result = admin_user.get_user_data("test@email.com") mock_query_db.assert_called_with(expected_query) assert actual_result == expected_result -# get_modify_user_data +# get_modify_user_data @patch('api.src.admin_user.get_user_data') def test_get_modify_rsu_data_all(mock_get_user_data): mock_get_user_data.return_value = ["test user data"] @@ -155,8 +156,8 @@ def test_get_modify_rsu_data_rsu(mock_get_user_data, mock_get_allowed_selections assert actual_result == expected_rsu_data -# check_safe_input +# check_safe_input def test_check_safe_input(): expected_result = True actual_result = admin_user.check_safe_input(admin_user_data.request_json_good) @@ -167,8 +168,8 @@ def test_check_safe_input_bad(): actual_result = admin_user.check_safe_input(admin_user_data.request_json_unsafe_input) assert actual_result == expected_result -# modify_user +# modify_user @patch('api.src.admin_user.check_safe_input') @patch('api.src.admin_user.admin_new_user.check_email') @patch('api.src.admin_user.pgquery.write_db') @@ -242,8 +243,8 @@ def test_modify_user_sql_exception(mock_pgquery, mock_check_email, mock_check_sa assert actual_msg == expected_msg assert actual_code == expected_code -# delete_user +# delete_user @patch('api.src.admin_user.pgquery.write_db') def test_delete_user(mock_write_db): expected_result = {"message": "User successfully deleted"} diff --git a/services/api/tests/src/test_smtp_error_handler.py b/services/api/tests/src/test_smtp_error_handler.py index 0dc277f05..d45fc875a 100644 --- a/services/api/tests/src/test_smtp_error_handler.py +++ b/services/api/tests/src/test_smtp_error_handler.py @@ -37,8 +37,8 @@ def test_get_subscribed_users_success(mock_query_db): @patch('src.smtp_error_handler.pgquery.query_db') -@patch('src.smtp_error_handler.pgquery.insert_db') -def test_unsubscribe_user_success(mock_insert_db, mock_query_db): +@patch('src.smtp_error_handler.pgquery.write_db') +def test_unsubscribe_user_success(mock_write_db, mock_query_db): mock_query_db.return_value = ['test@gmail.com'] expected_code = 200 actual_code = smtp_error_handler.unsubscribe_user("test@gmail.com") @@ -50,13 +50,13 @@ def test_unsubscribe_user_success(mock_insert_db, mock_query_db): calls = [ call(smtp_error_handler_data.get_unsubscribe_user_remove_query) ] - mock_insert_db.assert_has_calls(calls) + mock_write_db.assert_has_calls(calls) assert actual_code == expected_code @patch('src.smtp_error_handler.pgquery.query_db') -@patch('src.smtp_error_handler.pgquery.insert_db') -def test_unsubscribe_user_failure(mock_insert_db, mock_query_db): +@patch('src.smtp_error_handler.pgquery.write_db') +def test_unsubscribe_user_failure(mock_write_db, mock_query_db): mock_query_db.return_value = [] expected_code = 400 actual_code = smtp_error_handler.unsubscribe_user("test@gmail.com") @@ -66,7 +66,7 @@ def test_unsubscribe_user_failure(mock_insert_db, mock_query_db): ] mock_query_db.assert_has_calls(calls) calls = [] - mock_insert_db.assert_has_calls(calls) + mock_write_db.assert_has_calls(calls) assert actual_code == expected_code diff --git a/services/api/tests/src/test_unsub_error_emails.py b/services/api/tests/src/test_unsub_error_emails.py index 7c582f2cb..0c2abaf26 100644 --- a/services/api/tests/src/test_unsub_error_emails.py +++ b/services/api/tests/src/test_unsub_error_emails.py @@ -26,7 +26,7 @@ def test_unsubscribe_user_success(mock_unsubscribe_user): mock_unsubscribe_user.assert_called_once() mock_unsubscribe_user.assert_called_with(email) assert code == 200 - assert headers['Access-Control-Allow-Origin'] == "*" + assert headers['Access-Control-Allow-Origin'] == "test.com" assert body == f"User {email} was successfully unsubscribed!" @@ -39,7 +39,7 @@ def test_unsubscribe_user_400(mock_unsubscribe_user): mock_unsubscribe_user.assert_not_called() assert code == 400 - assert headers['Access-Control-Allow-Origin'] == "*" + assert headers['Access-Control-Allow-Origin'] == "test.com" assert body == f"No unsubscribe email was specified" @@ -53,7 +53,7 @@ def test_unsubscribe_user_404(mock_unsubscribe_user): mock_unsubscribe_user.assert_called_once() mock_unsubscribe_user.assert_called_with(email) assert code == 400 - assert headers['Access-Control-Allow-Origin'] == "*" + assert headers['Access-Control-Allow-Origin'] == "test.com" assert body == f"User with email {email} does not exist" From 9de0414fdf546bd97522af2e7a311fed875d2a50 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Mon, 4 Dec 2023 12:09:14 -0700 Subject: [PATCH 17/70] Updating sample.env and environment_name env variable --- services/api/sample.env | 5 +++-- services/api/src/smtp_error_handler.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/services/api/sample.env b/services/api/sample.env index def58b20e..9f704e997 100644 --- a/services/api/sample.env +++ b/services/api/sample.env @@ -17,5 +17,6 @@ CSM_TARGET_SMTP_SERVER_ADDRESS= CSM_TARGET_SMTP_SERVER_PORT= # Error Email Contact Configuration -CLOUD_RUN_LOGS_LINK=https://console.cloud.google.com/run/detail/us-central1/rsu-manager-cloud-run-api/logs?authuser=1&project=cdot-oim-cv-dev -ERROR_EMAIL_CONTACT_EMAIL=jfrye@neaeraconsulting.com \ No newline at end of file +LOGS_LINK= #URL to logs for api, included in error email. Example: https://console.cloud.google.com/run/detail/us-central1/rsu-manager-cloud-run-api/logs?authuser=1&project=cdot-oim-cv-dev +ENVIRONMENT_NAME= #Environment name, just to display in email. Example: cdot-oim-cv-dev +ERROR_EMAIL_UNSUBSCRIBE_LINK= #URL to unsubscribe user, as Python format string to insert {email}. Example: https://...api.../unsubscribe-error-emails/{email}> \ No newline at end of file diff --git a/services/api/src/smtp_error_handler.py b/services/api/src/smtp_error_handler.py index 79020aa34..3e627ebd7 100644 --- a/services/api/src/smtp_error_handler.py +++ b/services/api/src/smtp_error_handler.py @@ -74,7 +74,7 @@ def emit(self, record): "./error_email/error_email_template.html").read() EMAIL_KEYS = { - 'ENVIRONMENT': get_environment_name(os.environ['INSTANCE_CONNECTION_NAME']), + 'ENVIRONMENT': get_environment_name(os.environ['ENVIRONMENT_NAME']), 'ERROR_MESSAGE': self.format(record).replace("\n", "
    "), 'ERROR_TIME': str(record.asctime), 'LOGS_LINK': os.environ["LOGS_LINK"], From 25b6bbe6f8eec179bd9dad99671d433deec3168a Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Mon, 4 Dec 2023 12:13:49 -0700 Subject: [PATCH 18/70] Fixing unit tests --- services/api/tests/src/test_smtp_error_handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/api/tests/src/test_smtp_error_handler.py b/services/api/tests/src/test_smtp_error_handler.py index d45fc875a..9a6ff75ef 100644 --- a/services/api/tests/src/test_smtp_error_handler.py +++ b/services/api/tests/src/test_smtp_error_handler.py @@ -75,7 +75,7 @@ def test_unsubscribe_user_failure(mock_write_db, mock_query_db): EMAIL_APP_PASSWORD = "test" DEFAULT_TARGET_SMTP_SERVER_ADDRESS = "smtp.gmail.com" DEFAULT_TARGET_SMTP_SERVER_PORT = 587 -INSTANCE_CONNECTION_NAME = "instance_connection:name" +ENVIRONMENT_NAME = "ENVIRONMENT" LOGS_LINK = "http://logs_link.com" ERROR_EMAIL_UNSUBSCRIBE_LINK = "http://unsubscribe-{email}" @@ -97,7 +97,7 @@ def test_configure_error_emails(): @patch.dict(os.environ, { "LOGS_LINK": LOGS_LINK, - "INSTANCE_CONNECTION_NAME": INSTANCE_CONNECTION_NAME, + "ENVIRONMENT_NAME": ENVIRONMENT_NAME, "ERROR_EMAIL_UNSUBSCRIBE_LINK": ERROR_EMAIL_UNSUBSCRIBE_LINK }, clear=True) @patch("builtins.open", new_callable=mock_open, read_data="data") From 37bb983af3fedbd0a50cf9104578f255638a863a Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Mon, 4 Dec 2023 12:14:20 -0700 Subject: [PATCH 19/70] Update smtp_error_handler.py --- services/api/src/smtp_error_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/api/src/smtp_error_handler.py b/services/api/src/smtp_error_handler.py index 3e627ebd7..99b1f2d63 100644 --- a/services/api/src/smtp_error_handler.py +++ b/services/api/src/smtp_error_handler.py @@ -74,7 +74,7 @@ def emit(self, record): "./error_email/error_email_template.html").read() EMAIL_KEYS = { - 'ENVIRONMENT': get_environment_name(os.environ['ENVIRONMENT_NAME']), + 'ENVIRONMENT': os.environ['ENVIRONMENT_NAME'], 'ERROR_MESSAGE': self.format(record).replace("\n", "
    "), 'ERROR_TIME': str(record.asctime), 'LOGS_LINK': os.environ["LOGS_LINK"], From 90935afede81a2a5861ebd446a1240fcf4379fbd Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Tue, 5 Dec 2023 09:18:06 -0700 Subject: [PATCH 20/70] Updating unit tests to run from services dir --- .../api/tests/src/test_smtp_error_handler.py | 20 +++++++++---------- .../api/tests/src/test_unsub_error_emails.py | 12 +++++------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/services/api/tests/src/test_smtp_error_handler.py b/services/api/tests/src/test_smtp_error_handler.py index 9a6ff75ef..725405051 100644 --- a/services/api/tests/src/test_smtp_error_handler.py +++ b/services/api/tests/src/test_smtp_error_handler.py @@ -1,9 +1,9 @@ from collections import namedtuple import os from unittest.mock import patch, MagicMock, call, mock_open -from src.smtp_error_handler import SMTP_SSLHandler -import src.smtp_error_handler as smtp_error_handler -import tests.data.smtp_error_handler_data as smtp_error_handler_data +from api.src.smtp_error_handler import SMTP_SSLHandler +import api.src.smtp_error_handler as smtp_error_handler +import api.tests.data.smtp_error_handler_data as smtp_error_handler_data import logging from unittest.mock import ANY @@ -23,7 +23,7 @@ def test_get_environment_name_fail(): ###################################### Testing Functions ########################################## -@patch('src.smtp_error_handler.pgquery.query_db') +@patch('api.src.smtp_error_handler.pgquery.query_db') def test_get_subscribed_users_success(mock_query_db): expected = ['test@gmail.com', 'test2@gmail.com'] mock_query_db.return_value = smtp_error_handler_data.get_subscribed_users_query_resp @@ -36,8 +36,8 @@ def test_get_subscribed_users_success(mock_query_db): assert actual == expected -@patch('src.smtp_error_handler.pgquery.query_db') -@patch('src.smtp_error_handler.pgquery.write_db') +@patch('api.src.smtp_error_handler.pgquery.query_db') +@patch('api.src.smtp_error_handler.pgquery.write_db') def test_unsubscribe_user_success(mock_write_db, mock_query_db): mock_query_db.return_value = ['test@gmail.com'] expected_code = 200 @@ -54,8 +54,8 @@ def test_unsubscribe_user_success(mock_write_db, mock_query_db): assert actual_code == expected_code -@patch('src.smtp_error_handler.pgquery.query_db') -@patch('src.smtp_error_handler.pgquery.write_db') +@patch('api.src.smtp_error_handler.pgquery.query_db') +@patch('api.src.smtp_error_handler.pgquery.write_db') def test_unsubscribe_user_failure(mock_write_db, mock_query_db): mock_query_db.return_value = [] expected_code = 400 @@ -101,8 +101,8 @@ def test_configure_error_emails(): "ERROR_EMAIL_UNSUBSCRIBE_LINK": ERROR_EMAIL_UNSUBSCRIBE_LINK }, clear=True) @patch("builtins.open", new_callable=mock_open, read_data="data") -@patch('src.smtp_error_handler.smtplib') -@patch('src.smtp_error_handler.get_subscribed_users') +@patch('api.src.smtp_error_handler.smtplib') +@patch('api.src.smtp_error_handler.get_subscribed_users') def test_send(mock_get_subscribed_users, mock_smtplib, mock_file): # prepare emailHandler = SMTP_SSLHandler(mailhost=[DEFAULT_TARGET_SMTP_SERVER_ADDRESS, DEFAULT_TARGET_SMTP_SERVER_PORT], diff --git a/services/api/tests/src/test_unsub_error_emails.py b/services/api/tests/src/test_unsub_error_emails.py index 0c2abaf26..d64436789 100644 --- a/services/api/tests/src/test_unsub_error_emails.py +++ b/services/api/tests/src/test_unsub_error_emails.py @@ -1,7 +1,7 @@ from unittest.mock import patch, MagicMock, call import pytest -import src.unsub_error_emails as unsub_error_emails -import tests.data.unsub_error_emails_data as unsub_error_emails_data +import api.src.unsub_error_emails as unsub_error_emails +import api.tests.data.unsub_error_emails_data as unsub_error_emails_data import sqlalchemy from werkzeug.exceptions import HTTPException @@ -16,7 +16,7 @@ def test_request_options(): assert headers['Access-Control-Allow-Methods'] == 'GET' -@patch('src.unsub_error_emails.unsubscribe_user') +@patch('api.src.unsub_error_emails.unsubscribe_user') def test_unsubscribe_user_success(mock_unsubscribe_user): email = "test@gmail.com" mock_unsubscribe_user.return_value = 200 @@ -30,7 +30,7 @@ def test_unsubscribe_user_success(mock_unsubscribe_user): assert body == f"User {email} was successfully unsubscribed!" -@patch('src.unsub_error_emails.unsubscribe_user') +@patch('api.src.unsub_error_emails.unsubscribe_user') def test_unsubscribe_user_400(mock_unsubscribe_user): email = None mock_unsubscribe_user.return_value = 200 @@ -43,7 +43,7 @@ def test_unsubscribe_user_400(mock_unsubscribe_user): assert body == f"No unsubscribe email was specified" -@patch('src.unsub_error_emails.unsubscribe_user') +@patch('api.src.unsub_error_emails.unsubscribe_user') def test_unsubscribe_user_404(mock_unsubscribe_user): email = "test@gmail.com" mock_unsubscribe_user.return_value = 400 @@ -58,7 +58,7 @@ def test_unsubscribe_user_404(mock_unsubscribe_user): ###################################### Testing Functions ########################################## -@patch('src.unsub_error_emails.smtp_error_handler.unsubscribe_user') +@patch('api.src.unsub_error_emails.smtp_error_handler.unsubscribe_user') def test_unsubscribe_user(mock_unsubscribe_user): mock_unsubscribe_user.return_value = "unsub_user_return" expected_result = "unsub_user_return" From 81207d6839aab1a8e5d9101a166d7b76ef3434ea Mon Sep 17 00:00:00 2001 From: Drew Johnston <31270488+drewjj@users.noreply.github.com> Date: Tue, 2 Jan 2024 09:54:39 -0700 Subject: [PATCH 21/70] Address pull request comments and additional docs --- README.md | 2 +- docker-compose-addons.yml | 28 ++++++ docker-compose.yml | 28 ------ resources/kubernetes/firmware-manager.yaml | 90 +++++++++++++++++++ services/README.md | 12 ++- services/addons/images/rsu_ping/README.md | 4 +- .../test_commsignia_upgrader.py | 4 +- .../tests/firmware_manager/test_upgrader.py | 4 +- services/api/README.md | 2 +- services/api/src/rsu_commands.py | 5 +- services/api/src/rsu_upgrade.py | 3 + 11 files changed, 139 insertions(+), 43 deletions(-) create mode 100644 resources/kubernetes/firmware-manager.yaml diff --git a/README.md b/README.md index c63d3c2fe..f0733158b 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ A debugging profile has been set up for use with VSCode to allow ease of debuggi - BSM_DB_NAME: The database name for BSM visualization data. - SSM_DB_NAME: The database name for SSM visualization data. - SRM_DB_NAME: The database name for SRM visualization data. -- RSU_REST_ENDPOINT: HTTPS endpoint of the deployed RSU REST API in GCP Kubernetes. +- FIRMWARE_MANAGER_ENDPOINT: Endpoint for the firmware manager deployment's API. - CSM_EMAIL_TO_SEND_FROM: Origin email address for the API. - CSM_EMAIL_APP_USERNAME: Username for the SMTP server. - CSM_EMAIL_APP_PASSWORD: Password for the SMTP server. diff --git a/docker-compose-addons.yml b/docker-compose-addons.yml index 45794e4d5..0fd71a75e 100644 --- a/docker-compose-addons.yml +++ b/docker-compose-addons.yml @@ -190,6 +190,34 @@ services: max-size: '10m' max-file: '5' + firmware_manager: + build: + context: services + dockerfile: Dockerfile.firmware_manager + image: jpo_firmware_manager:latest + restart: always + ports: + - '8089:8080' + environment: + PG_DB_HOST: ${PG_DB_HOST} + PG_DB_NAME: postgres + PG_DB_USER: ${PG_DB_USER} + PG_DB_PASS: ${PG_DB_PASS} + + BLOB_STORAGE_PROVIDER: ${BLOB_STORAGE_PROVIDER} + BLOB_STORAGE_BUCKET: ${BLOB_STORAGE_BUCKET} + + GCP_PROJECT: ${GCP_PROJECT} + GOOGLE_APPLICATION_CREDENTIALS: '/google/gcp_credentials.json' + + LOGGING_LEVEL: ${API_LOGGING_LEVEL} + volumes: + - ${GOOGLE_APPLICATION_CREDENTIALS}:/google/gcp_credentials.json + logging: + options: + max-size: '10m' + max-file: '5' + volumes: pgdb: driver: local diff --git a/docker-compose.yml b/docker-compose.yml index 6fdf35a81..ef3c87e45 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -137,34 +137,6 @@ services: options: max-size: '10m' - firmware_manager: - build: - context: services - dockerfile: Dockerfile.firmware_manager - image: jpo_firmware_manager:latest - restart: always - ports: - - '8089:8080' - environment: - PG_DB_HOST: ${PG_DB_HOST} - PG_DB_NAME: postgres - PG_DB_USER: ${PG_DB_USER} - PG_DB_PASS: ${PG_DB_PASS} - - BLOB_STORAGE_PROVIDER: ${BLOB_STORAGE_PROVIDER} - BLOB_STORAGE_BUCKET: ${BLOB_STORAGE_BUCKET} - - GCP_PROJECT: ${GCP_PROJECT} - GOOGLE_APPLICATION_CREDENTIALS: '/google/gcp_credentials.json' - - LOGGING_LEVEL: ${API_LOGGING_LEVEL} - volumes: - - ${GOOGLE_APPLICATION_CREDENTIALS}:/google/gcp_credentials.json - logging: - options: - max-size: '10m' - max-file: '5' - volumes: pgdb: driver: local diff --git a/resources/kubernetes/firmware-manager.yaml b/resources/kubernetes/firmware-manager.yaml new file mode 100644 index 000000000..a230bed1d --- /dev/null +++ b/resources/kubernetes/firmware-manager.yaml @@ -0,0 +1,90 @@ +apiVersion: v1 +kind: Service +metadata: + name: firmware-manager-svc + labels: + app: firmware-manager +spec: + type: LoadBalancer + ports: + - name: firmware-manager-api + port: 80 + protocol: TCP + targetPort: 8080 + selector: + app: firmware-manager +--- +# Limits the number of pods that are down simultaneously +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: firmware-manager-pdb +spec: + selector: + matchLabels: + app: firmware-manager + maxUnavailable: 0 +--- +apiVersion: 'apps/v1' +kind: 'Deployment' +metadata: + name: firmware-manager +spec: + replicas: 1 + selector: + matchLabels: + app: firmware-manager + template: + metadata: + labels: + app: firmware-manager + spec: + containers: + - name: firmware-manager + imagePullPolicy: Always + image: firmware-manager-image:tag + resources: + requests: + memory: '4Gi' + cpu: '2' + limits: + memory: '4Gi' + cpu: '2' + tty: true + stdin: true + ports: + - containerPort: 8080 + env: + - name: GOOGLE_APPLICATION_CREDENTIALS + value: "/home/secret/cv_credentials.json" + - name: GCP_PROJECT + value: "" + - name: PG_DB_HOST + value: "" + - name: PG_DB_NAME + value: "" + - name: PG_DB_USER + valueFrom: + secretKeyRef: + name: some-postgres-secret-user + key: some-postgres-secret-key + - name: PG_DB_PASS + valueFrom: + secretKeyRef: + name: some-postgres-secret-password + key: some-postgres-secret-key + - name: BLOB_STORAGE_PROVIDER + value: "" + - name: BLOB_STORAGE_BUCKET + value: "" + - name: LOGGING_LEVEL + value: "INFO" + volumeMounts: + - name: cv-manager-service-key + mountPath: /home/secret + tty: true + stdin: true + volumes: + - name: cv-manager-service-key + secret: + secretName: cv-manager-service-key diff --git a/services/README.md b/services/README.md index d79562a12..138ca8579 100644 --- a/services/README.md +++ b/services/README.md @@ -24,17 +24,23 @@ The count_metric service allows for the creation of count metrics for received V Read more about the deployment process in the [count_metric directory](addons/images/count_metric/README.md). +### firmware_manager + +The firmware_manager service monitors the CV Manager PostgreSQL database for RSU's with different firmware_version values than their target_firmware_version in the 'rsus' table and performs firmware upgrades accordingly. These checks occur on an hourly basis for all RSUs but can also be executed immediately for an individual RSU utilizing the hosted API endpoints. This feature is intended to be used by the CV Manager API but can also be done manually for test purposes. + +Read more about the deployment process in the [firmware_manager directory](addons/images/firmware_manager/README.md). + ### iss_health_check The iss_health_check service allows for RSU ISS SCMS certificate status information to be displayed on the CV Manager. This service has a dependency on the GCP Secret Manager but can be reworked to work with any secret manager. This service requires a service agreement with Greenhills ISS so an API key can be obtained to access a user's RSU profile. Read more about the deployment process in the [iss_health_check directory](addons/images/iss_health_check/README.md). -### rsu_ping_fetch +### rsu_ping -The rsu_ping_fetch service allows for RSU online status information to be displayed on the CV Manager. This service requires a Zabbix API endpoint to function. The Zabbix server must be configured to monitor all of the RSUs displayed on the CV Manager to successfully receive online status information for each device. +The rsu_ping directory can be built as the rsu_ping_fetch or rsu_pinger service. Both versions allows for RSU online status information to be displayed on the CV Manager. The rsu_ping_fetch service requires a Zabbix API endpoint to function. The Zabbix server must be configured to monitor all of the RSUs displayed on the CV Manager to successfully receive online status information for each device. The rsu_pinger allows for obtaining RSU online status information without the need of a Zabbix server. The rsu_pinger is a very streamlined option without any other use besides gathering online status information. For a more robust collector of RSU data, a Zabbix server is recommended. -Read more about the deployment process in the [rsu_ping_fetch directory](addons/images/rsu_ping_fetch/README.md). +Read more about the deployment process in the [rsu_ping directory](addons/images/rsu_ping/README.md). ## Testing diff --git a/services/addons/images/rsu_ping/README.md b/services/addons/images/rsu_ping/README.md index e093e8be0..66fb4098f 100644 --- a/services/addons/images/rsu_ping/README.md +++ b/services/addons/images/rsu_ping/README.md @@ -1,8 +1,8 @@ -# RSU Ping Fetch +# RSU Ping Services ## Table of Contents -- [RSU Ping Fetch](#rsu-ping-fetch) +- [RSU Ping Services](#rsu-ping-services) - [Table of Contents](#table-of-contents) - [About ](#about-) - [Requirements ](#requirements-) diff --git a/services/addons/tests/firmware_manager/test_commsignia_upgrader.py b/services/addons/tests/firmware_manager/test_commsignia_upgrader.py index afe42a68e..d295065f9 100644 --- a/services/addons/tests/firmware_manager/test_commsignia_upgrader.py +++ b/services/addons/tests/firmware_manager/test_commsignia_upgrader.py @@ -128,7 +128,7 @@ def test_commsignia_upgrader_upgrade_fail(mock_sshclient, mock_scpclient): def test_commsignia_upgrader_upgrade_exception(mock_sshclient, mock_scpclient, mock_logging): # Mock SSH Client and failed firmware upgrade return value sshclient_obj = mock_sshclient.return_value - sshclient_obj.connect.side_effect = Exception("Exception test successfully passed") + sshclient_obj.connect.side_effect = Exception("Exception occurred during upgrade") test_commsignia_upgrader = CommsigniaUpgrader(test_upgrade_info) test_commsignia_upgrader.download_blob = MagicMock() @@ -156,6 +156,6 @@ def test_commsignia_upgrader_upgrade_exception(mock_sshclient, mock_scpclient, m sshclient_obj.exec_command.assert_not_called() # Assert exception was cleaned up and firmware manager was notified of upgrade failure - mock_logging.error.assert_called_with("Failed to perform firmware upgrade: Exception test successfully passed") + mock_logging.error.assert_called_with("Failed to perform firmware upgrade: Exception occurred during upgrade") cleanup.assert_called_with() notify.assert_called_with(success=False) \ No newline at end of file diff --git a/services/addons/tests/firmware_manager/test_upgrader.py b/services/addons/tests/firmware_manager/test_upgrader.py index ff25bfeb0..619b22804 100644 --- a/services/addons/tests/firmware_manager/test_upgrader.py +++ b/services/addons/tests/firmware_manager/test_upgrader.py @@ -118,9 +118,9 @@ def test_notify_firmware_manager_fail(mock_requests, mock_logging): @patch('addons.images.firmware_manager.upgrader.logging') @patch('addons.images.firmware_manager.upgrader.requests') def test_notify_firmware_manager_exception(mock_requests, mock_logging): - mock_requests.post.side_effect = Exception('Exception test successfully passed') + mock_requests.post.side_effect = Exception('Exception occurred during upgrade') test_upgrader = TestUpgrader(test_upgrade_info) test_upgrader.notify_firmware_manager(success=True) - mock_logging.error.assert_called_with("Failed to connect to the Firmware Manager API for '8.8.8.8': Exception test successfully passed") \ No newline at end of file + mock_logging.error.assert_called_with("Failed to connect to the Firmware Manager API for '8.8.8.8': Exception occurred during upgrade") \ No newline at end of file diff --git a/services/api/README.md b/services/api/README.md index ff7876384..449d6f9f2 100644 --- a/services/api/README.md +++ b/services/api/README.md @@ -307,7 +307,7 @@ HTTP URL Arguments: - KEYCLOAK_REALM: Keycloak Realm name. - KEYCLOAK_API_CLIENT_ID: Keycloak API client name. - KEYCLOAK_API_CLIENT_SECRET_KEY: Keycloak API secret for the given client name. -- RSU_REST_ENDPOINT: HTTPS endpoint of the deployed RSU REST API in GCP Kubernetes. +- FIRMWARE_MANAGER_ENDPOINT: Endpoint for the firmware manager deployment's API. - LOGGING_LEVEL: The level of which the application will log. (DEBUG, INFO, WARNING, ERROR) - CSM_EMAIL_TO_SEND_FROM: Origin email address for the API. - CSM_EMAIL_APP_USERNAME: Username for the SMTP server. diff --git a/services/api/src/rsu_commands.py b/services/api/src/rsu_commands.py index a4f43b3ea..ee8f8054e 100644 --- a/services/api/src/rsu_commands.py +++ b/services/api/src/rsu_commands.py @@ -178,10 +178,7 @@ def perform_command(command, organization, role, rsu_list, args): return f"Unauthorized role to run {command}", 401 # Handle functions supporting multiple RSUs - if command == 'rsufwdsnmpset': - return execute_rsufwdsnmpset(command, organization, rsu_list, args), 200 - - if command == 'rsufwdsnmpset-del': + if command == 'rsufwdsnmpset' or command == 'rsufwdsnmpset-del': return execute_rsufwdsnmpset(command, organization, rsu_list, args), 200 if command == 'upgrade-rsu': diff --git a/services/api/src/rsu_upgrade.py b/services/api/src/rsu_upgrade.py index 58cdbfcd7..0cc324461 100644 --- a/services/api/src/rsu_upgrade.py +++ b/services/api/src/rsu_upgrade.py @@ -36,6 +36,9 @@ def check_for_upgrade(rsu_ip): return available_upgrade def mark_rsu_for_upgrade(rsu_ip): + if os.getenv("FIRMWARE_MANAGER_ENDPOINT") is None: + return {"message": "The firmware manager is not supported for this CV Manager deployment"}, 500 + # Verify requested target RSU is eligible for upgrade and determine next upgrade upgrade_info = check_for_upgrade(rsu_ip) From 56b2aff0dd629f9661f2925c4084f382963f1546 Mon Sep 17 00:00:00 2001 From: Drew Johnston <31270488+drewjj@users.noreply.github.com> Date: Tue, 2 Jan 2024 16:14:32 -0700 Subject: [PATCH 22/70] Remove firmware_upgrade from vs task --- .vscode/tasks.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 203f42bc1..e34b83b7f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -21,7 +21,7 @@ "up": { "detached": true, "build": true, - "services": ["cvmanager_keycloak", "cvmanager_postgres", "firmware_manager"] + "services": ["cvmanager_keycloak", "cvmanager_postgres"] }, "files": ["${workspaceFolder}/docker-compose.yml"], "envFile": "${workspaceFolder}/.env" From 0f25689fb4f3a27b8364c50deb39cee9a7350fa1 Mon Sep 17 00:00:00 2001 From: Drew Johnston <31270488+drewjj@users.noreply.github.com> Date: Thu, 4 Jan 2024 12:42:18 -0700 Subject: [PATCH 23/70] Added description to the snmp version update script --- resources/sql_scripts/update_scripts/snmp_version_update.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/sql_scripts/update_scripts/snmp_version_update.sql b/resources/sql_scripts/update_scripts/snmp_version_update.sql index cb1d71657..9318c2004 100644 --- a/resources/sql_scripts/update_scripts/snmp_version_update.sql +++ b/resources/sql_scripts/update_scripts/snmp_version_update.sql @@ -1,3 +1,7 @@ +-- Run this SQL update script if you already have a deployed CV Manager PostgreSQL database prior to the SNMP version addition +-- This file will create the 'snmp_versions' table and add 12.18 and 4.1 as SNMP versions +-- All RSUs are given the default of 4.1 as their SNMP version using this script + CREATE SEQUENCE public.snmp_versions_snmp_version_id_seq INCREMENT 1 START 1 From d8e28f7b7ef044b28036054cbc09c33db184d279 Mon Sep 17 00:00:00 2001 From: Drew Johnston <31270488+drewjj@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:24:26 -0700 Subject: [PATCH 24/70] Added mutex to the firmware_manager.py active_upgrades --- .../firmware_manager/firmware_manager.py | 148 +++++++++--------- 1 file changed, 77 insertions(+), 71 deletions(-) diff --git a/services/addons/images/firmware_manager/firmware_manager.py b/services/addons/images/firmware_manager/firmware_manager.py index 431675019..4f667d1a7 100644 --- a/services/addons/images/firmware_manager/firmware_manager.py +++ b/services/addons/images/firmware_manager/firmware_manager.py @@ -2,6 +2,7 @@ from common import pgquery from flask import Flask, jsonify, request from subprocess import Popen, DEVNULL +from threading import Lock from waitress import serve import json import logging @@ -30,6 +31,7 @@ # - target_firmware_version # - install_package active_upgrades = {} +active_upgrades_lock = Lock() # Function to query the CV Manager PostgreSQL database for RSUs that have: @@ -69,30 +71,31 @@ def init_firmware_upgrade(): if "rsu_ip" not in request_args: return jsonify({"error": "Missing 'rsu_ip' parameter"}), 400 - # Check if an upgrade is already occurring for the device + # Acquire lock and check if an upgrade is already occurring for the device logging.info(f"Checking if existing upgrade is running for '{request_args['rsu_ip']}'") - if request_args['rsu_ip'] in active_upgrades: - return jsonify({"error": f"Firmware upgrade failed to start for '{request_args['rsu_ip']}': an upgrade is already underway for the target device"}), 500 - - # Pull RSU data from the PostgreSQL database - logging.info(f"Querying RSU data for '{request_args['rsu_ip']}'") - rsu_to_upgrade = get_rsu_upgrade_data(request_args['rsu_ip']) - if len(rsu_to_upgrade) == 0: - return jsonify({"error": f"Firmware upgrade failed to start for '{request_args['rsu_ip']}': the target firmware is already installed or is an invalid upgrade from the current firmware"}), 500 - rsu_to_upgrade = rsu_to_upgrade[0] - - # Start upgrade process - logging.info(f"Initializing firmware upgrade for '{request_args['rsu_ip']}'") - try: - p = Popen(['python3', f'/home/{manufacturer_upgrade_scripts[rsu_to_upgrade["manufacturer"]]}', f"'{json.dumps(rsu_to_upgrade)}'"], stdout=DEVNULL) - rsu_to_upgrade['process'] = p - except Exception as err: - logging.error(f"Encountered error of type {type(err)} while starting automatic upgrade process for {request_args['rsu_ip']}: {err}") - return jsonify({"error": f"Firmware upgrade failed to start for '{request_args['rsu_ip']}': upgrade process failed to run"}), 500 - - # Remove redundant ipv4_address from rsu_to_upgrade since it is the key for active_upgrades - del rsu_to_upgrade['ipv4_address'] - active_upgrades[request_args['rsu_ip']] = rsu_to_upgrade + with active_upgrades_lock: + if request_args['rsu_ip'] in active_upgrades: + return jsonify({"error": f"Firmware upgrade failed to start for '{request_args['rsu_ip']}': an upgrade is already underway for the target device"}), 500 + + # Pull RSU data from the PostgreSQL database + logging.info(f"Querying RSU data for '{request_args['rsu_ip']}'") + rsu_to_upgrade = get_rsu_upgrade_data(request_args['rsu_ip']) + if len(rsu_to_upgrade) == 0: + return jsonify({"error": f"Firmware upgrade failed to start for '{request_args['rsu_ip']}': the target firmware is already installed or is an invalid upgrade from the current firmware"}), 500 + rsu_to_upgrade = rsu_to_upgrade[0] + + # Start upgrade process + logging.info(f"Initializing firmware upgrade for '{request_args['rsu_ip']}'") + try: + p = Popen(['python3', f'/home/{manufacturer_upgrade_scripts[rsu_to_upgrade["manufacturer"]]}', f"'{json.dumps(rsu_to_upgrade)}'"], stdout=DEVNULL) + rsu_to_upgrade['process'] = p + except Exception as err: + logging.error(f"Encountered error of type {type(err)} while starting automatic upgrade process for {request_args['rsu_ip']}: {err}") + return jsonify({"error": f"Firmware upgrade failed to start for '{request_args['rsu_ip']}': upgrade process failed to run"}), 500 + + # Remove redundant ipv4_address from rsu_to_upgrade since it is the key for active_upgrades + del rsu_to_upgrade['ipv4_address'] + active_upgrades[request_args['rsu_ip']] = rsu_to_upgrade return jsonify({"message": f"Firmware upgrade started successfully for '{request_args['rsu_ip']}'"}), 201 @@ -104,29 +107,30 @@ def init_firmware_upgrade(): @app.route("/firmware_upgrade_completed", methods=["POST"]) def firmware_upgrade_completed(): request_args = request.get_json() - if "rsu_ip" not in request_args: - return jsonify({"error": "Missing 'rsu_ip' parameter"}), 400 - elif request_args['rsu_ip'] not in active_upgrades: - return jsonify({"error": "Specified device is not actively being upgraded or was already completed"}), 400 - - if "status" not in request_args: - return jsonify({"error": "Missing 'status' parameter"}), 400 - elif request_args['status'] != "success" and request_args['status'] != "fail": - return jsonify({"error": "Wrong value for 'status' parameter - must be either 'success' or 'fail'"}), 400 - - # Update RSU firmware_version in PostgreSQL if the upgrade was successful - if request_args['status'] == "success": - try: - upgrade_info = active_upgrades[request_args['rsu_ip']] - query = f"UPDATE public.rsus SET firmware_version={upgrade_info['target_firmware_id']} WHERE ipv4_address='{request_args['rsu_ip']}'" - pgquery.write_db(query) - except Exception as err: - logging.error(f"Encountered error of type {type(err)} while querying the PostgreSQL database: {err}") - return jsonify({"error": "Unexpected error occurred while querying the PostgreSQL database - firmware upgrade not marked as complete"}), 500 - - # Remove firmware upgrade from active upgrades - logging.info(f"Marking firmware upgrade as complete for '{request_args['rsu_ip']}'") - del active_upgrades[request_args['rsu_ip']] + with active_upgrades_lock: + if "rsu_ip" not in request_args: + return jsonify({"error": "Missing 'rsu_ip' parameter"}), 400 + elif request_args['rsu_ip'] not in active_upgrades: + return jsonify({"error": "Specified device is not actively being upgraded or was already completed"}), 400 + + if "status" not in request_args: + return jsonify({"error": "Missing 'status' parameter"}), 400 + elif request_args['status'] != "success" and request_args['status'] != "fail": + return jsonify({"error": "Wrong value for 'status' parameter - must be either 'success' or 'fail'"}), 400 + + # Update RSU firmware_version in PostgreSQL if the upgrade was successful + if request_args['status'] == "success": + try: + upgrade_info = active_upgrades[request_args['rsu_ip']] + query = f"UPDATE public.rsus SET firmware_version={upgrade_info['target_firmware_id']} WHERE ipv4_address='{request_args['rsu_ip']}'" + pgquery.write_db(query) + except Exception as err: + logging.error(f"Encountered error of type {type(err)} while querying the PostgreSQL database: {err}") + return jsonify({"error": "Unexpected error occurred while querying the PostgreSQL database - firmware upgrade not marked as complete"}), 500 + + # Remove firmware upgrade from active upgrades + logging.info(f"Marking firmware upgrade as complete for '{request_args['rsu_ip']}'") + del active_upgrades[request_args['rsu_ip']] return jsonify({"message": "Firmware upgrade successfully marked as complete"}), 204 @@ -136,14 +140,15 @@ def firmware_upgrade_completed(): def list_active_upgrades(): # Remove all sensitive data from the response sanitized_active_upgrades = {} - for key, value in active_upgrades.items(): - sanitized_active_upgrades[key] = { - "manufacturer": value['manufacturer'], - "model": value['model'], - "target_firmware_id": value['target_firmware_id'], - "target_firmware_version": value['target_firmware_version'], - "install_package": value['install_package'] - } + with active_upgrades_lock: + for key, value in active_upgrades.items(): + sanitized_active_upgrades[key] = { + "manufacturer": value['manufacturer'], + "model": value['model'], + "target_firmware_id": value['target_firmware_id'], + "target_firmware_version": value['target_firmware_version'], + "install_package": value['install_package'] + } return jsonify({"active_upgrades": sanitized_active_upgrades}), 200 @@ -156,23 +161,24 @@ def check_for_upgrades(): # Start upgrade scripts for any results for rsu in rsus_to_upgrade: # Check if an upgrade is already occurring for the device - if rsu['ipv4_address'] in active_upgrades: - continue - - # Start upgrade script - logging.info(f"Running automated firmware upgrade for '{rsu['ipv4_address']}'") - try: - p = Popen(['python3', f'/home/{manufacturer_upgrade_scripts[rsu["manufacturer"]]}', f"'{json.dumps(rsu)}'"], stdout=DEVNULL) - rsu['process'] = p - except Exception as err: - logging.error(f"Encountered error of type {type(err)} while starting automatic upgrade process for {rsu['ipv4_address']}: {err}") - continue - - # Remove redundant ipv4_address from rsu since it is the key for active_upgrades - rsu_ip = rsu['ipv4_address'] - del rsu['ipv4_address'] - active_upgrades[rsu_ip] = rsu - logging.info(f"Firmware upgrade successfully started for '{rsu_ip}'") + with active_upgrades_lock: + if rsu['ipv4_address'] in active_upgrades: + continue + + # Start upgrade script + logging.info(f"Running automated firmware upgrade for '{rsu['ipv4_address']}'") + try: + p = Popen(['python3', f'/home/{manufacturer_upgrade_scripts[rsu["manufacturer"]]}', f"'{json.dumps(rsu)}'"], stdout=DEVNULL) + rsu['process'] = p + except Exception as err: + logging.error(f"Encountered error of type {type(err)} while starting automatic upgrade process for {rsu['ipv4_address']}: {err}") + continue + + # Remove redundant ipv4_address from rsu since it is the key for active_upgrades + rsu_ip = rsu['ipv4_address'] + del rsu['ipv4_address'] + active_upgrades[rsu_ip] = rsu + logging.info(f"Firmware upgrade successfully started for '{rsu_ip}'") def serve_rest_api(): From fa3e2dfcdc6f5359224e8d82e488e8598ef18045 Mon Sep 17 00:00:00 2001 From: Drew Johnston <31270488+drewjj@users.noreply.github.com> Date: Fri, 5 Jan 2024 08:59:55 -0700 Subject: [PATCH 25/70] SNMP reworked to use SNMP version instead of RSU manufacturer --- .../sql_scripts/CVManager_SampleData.sql | 4 +- .../update_scripts/snmp_version_update.sql | 8 +- services/api/src/rsu_commands.py | 16 +- services/api/src/rsufwdsnmpset.py | 46 +-- services/api/src/rsufwdsnmpwalk.py | 10 +- services/api/tests/src/test_rsu_commands.py | 7 +- services/api/tests/src/test_rsufwdsnmpset.py | 328 +++++------------- services/api/tests/src/test_rsufwdsnmpwalk.py | 47 +-- 8 files changed, 159 insertions(+), 307 deletions(-) diff --git a/resources/sql_scripts/CVManager_SampleData.sql b/resources/sql_scripts/CVManager_SampleData.sql index 4be2c2f2f..f28700c93 100644 --- a/resources/sql_scripts/CVManager_SampleData.sql +++ b/resources/sql_scripts/CVManager_SampleData.sql @@ -25,10 +25,10 @@ INSERT INTO public.snmp_credentials( INSERT INTO public.snmp_versions( version_code, nickname) - VALUES ('4.1', '4.1'); + VALUES ('41', 'RSU 4.1'); INSERT INTO public.snmp_versions( version_code, nickname) - VALUES ('12.18', '12.18'); + VALUES ('1218', 'NTCIP 1218'); INSERT INTO public.rsus( geography, milepost, ipv4_address, serial_number, iss_scms_id, primary_route, model, credential_id, snmp_credential_id, snmp_version_id, firmware_version, target_firmware_version) diff --git a/resources/sql_scripts/update_scripts/snmp_version_update.sql b/resources/sql_scripts/update_scripts/snmp_version_update.sql index 9318c2004..aa7b11614 100644 --- a/resources/sql_scripts/update_scripts/snmp_version_update.sql +++ b/resources/sql_scripts/update_scripts/snmp_version_update.sql @@ -1,6 +1,6 @@ -- Run this SQL update script if you already have a deployed CV Manager PostgreSQL database prior to the SNMP version addition --- This file will create the 'snmp_versions' table and add 12.18 and 4.1 as SNMP versions --- All RSUs are given the default of 4.1 as their SNMP version using this script +-- This file will create the 'snmp_versions' table and add NTCIP 1218 and RSU 4.1 as SNMP versions +-- All RSUs are given the default of RSU 4.1 as their SNMP version using this script CREATE SEQUENCE public.snmp_versions_snmp_version_id_seq INCREMENT 1 @@ -20,10 +20,10 @@ CREATE TABLE IF NOT EXISTS public.snmp_versions INSERT INTO public.snmp_versions( version_code, nickname) - VALUES ('4.1', '4.1'); + VALUES ('41', 'RSU 4.1'); INSERT INTO public.snmp_versions( version_code, nickname) - VALUES ('12.18', '12.18'); + VALUES ('1218', 'NTCIP 1218'); ALTER TABLE public.rsus ADD snmp_version_id integer NOT NULL diff --git a/services/api/src/rsu_commands.py b/services/api/src/rsu_commands.py index ee8f8054e..3834cc4b6 100644 --- a/services/api/src/rsu_commands.py +++ b/services/api/src/rsu_commands.py @@ -68,6 +68,7 @@ def execute_command(command, rsu_ip, args, rsu_info): if command_data[command]['snmp_required']: request_data["snmp_creds"] = {"username": rsu_info["snmp_username"], "password": rsu_info["snmp_password"]} + request_data["snmp_version"] = rsu_info["snmp_version"] logging.debug(f"Request data: {str(request_data)}") return command_data[command]['function'](request_data) @@ -77,13 +78,14 @@ def fetch_rsu_info(rsu_ip, organization): logging.info(f"Fetching RSU info for RSU {rsu_ip}") query = "SELECT to_jsonb(row) " \ "FROM (" \ - "SELECT man.name AS manufacturer_name, rcred.username AS ssh_username, rcred.password AS ssh_password, snmp.username AS snmp_username, snmp.password AS snmp_password " \ + "SELECT man.name AS manufacturer_name, rcred.username AS ssh_username, rcred.password AS ssh_password, snmp.username AS snmp_username, snmp.password AS snmp_password, sver.version_code AS snmp_version " \ "FROM public.rsus AS rd " \ "JOIN public.rsu_organization_name AS ron_v ON ron_v.rsu_id = rd.rsu_id " \ "JOIN public.rsu_models AS rm ON rm.rsu_model_id = rd.model " \ "JOIN public.manufacturers AS man ON man.manufacturer_id = rm.manufacturer " \ "LEFT JOIN public.rsu_credentials AS rcred ON rcred.credential_id = rd.credential_id " \ "LEFT JOIN public.snmp_credentials AS snmp ON snmp.snmp_credential_id = rd.snmp_credential_id " \ + "LEFT JOIN public.snmp_versions AS sver ON sver.snmp_version_id = rd.snmp_version_id " \ f"WHERE ron_v.name = '{organization}' AND rd.ipv4_address = '{rsu_ip}'" \ ") as row" @@ -97,7 +99,8 @@ def fetch_rsu_info(rsu_ip, organization): "ssh_username": row['ssh_username'], "ssh_password": row['ssh_password'], "snmp_username": row['snmp_username'], - "snmp_password": row['snmp_password'] + "snmp_password": row['snmp_password'], + "snmp_version": row['snmp_version'], } return rsu_info @@ -110,13 +113,18 @@ def fetch_index(command, rsu_ip, rsu_info, message_type=None, target_ip=None): data, code = execute_command('rsufwdsnmpwalk', rsu_ip, {}, rsu_info) if code == 200: walkResult = {} - if rsu_info["manufacturer"] == "Yunex": + if rsu_info["snmp_version"] == "1218": if message_type.upper() == 'BSM' or message_type.upper() == 'SSM': walkResult = data['RsuFwdSnmpwalk']['rsuReceivedMsgTable'] else: walkResult = data['RsuFwdSnmpwalk']['rsuXmitMsgFwdingTable'] - else: + elif rsu_info["snmp_version"] == "41": walkResult = data['RsuFwdSnmpwalk'] + else: + # SNMP version not supported + logging.error("Requested SNMP standard version is not supported") + return -1 + # finds the next available index if command == 'add': for entry in walkResult: diff --git a/services/api/src/rsufwdsnmpset.py b/services/api/src/rsufwdsnmpset.py index 0f0a61689..7b8efbb8d 100644 --- a/services/api/src/rsufwdsnmpset.py +++ b/services/api/src/rsufwdsnmpset.py @@ -51,7 +51,8 @@ def perform_snmp_mods(snmp_mods): output = output.stdout.decode("utf-8").split('\n')[:-1] logging.info(f'SNMPSET output: {output}') -def config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, tx): +# Configures message forwarding over SNMP based on the NTCIP 1218 standard +def config_txrxmsg(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, tx): try: logging.info('Running SNMP config on Yunex RSU {}'.format(dest_ip)) @@ -130,7 +131,8 @@ def config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, return response, code -def config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, udp_port, rsu_index, psid, raw = False): +# Configures message forwarding over SNMP based on the RSU v4.1 specification +def config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, udp_port, rsu_index, psid, raw = False): try: # Put RSU in standby rsu_mod_result = set_rsu_status(rsu_ip, snmp_creds, operate=False) @@ -205,8 +207,8 @@ def config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, udp_port, rsu_index return response, code -def config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index): - if manufacturer == 'Kapsch' or manufacturer == 'Commsignia': +def config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index): + if snmp_version == '41': try: # Put RSU in standby rsu_mod_result = set_rsu_status(rsu_ip, snmp_creds, operate=False) @@ -235,7 +237,7 @@ def config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index): # If the previous commands fail, this will probably fail # and we want to preserve the previous failure as the return message set_rsu_status(rsu_ip, snmp_creds, operate=True) - elif manufacturer == 'Yunex': + elif snmp_version == '1218': try: snmp_mods = 'snmpset -v 3 {auth} {rsuip} '.format(auth=snmpcredential.get_authstring(snmp_creds), rsuip=rsu_ip) if msg_type.lower() == 'bsm': @@ -265,43 +267,43 @@ def config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index): response = snmperrorcheck.check_error_type(output[-1]) code = 500 else: - response = "Supported RSU manufacturers are currently only Commsignia, Kapsch and Yunex" + response = "Supported SNMP versions are currently only RSU 4.1 and NTCIP 1218" code = 501 return response, code -def config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, index): +def config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, index): # Based on manufacturer, choose the right function call - if manufacturer == 'Kapsch' or manufacturer == 'Commsignia': + if snmp_version == '41': # Based on message type, choose the right port if msg_type.lower() == 'bsm': - return config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '46800', index, '20') + return config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '46800', index, '20') if msg_type.lower() == 'spat': - return config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44910', index, '8002') + return config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44910', index, '8002') if msg_type.lower() == 'map': - return config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44920', index, 'E0000017', raw=True) + return config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44920', index, 'E0000017', raw=True) if msg_type.lower() == 'ssm': - return config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44900', index, 'E0000015', raw=True) + return config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44900', index, 'E0000015', raw=True) if msg_type.lower() == 'srm': - return config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44930', index, 'E0000016', raw=True) + return config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44930', index, 'E0000016', raw=True) else: return "Supported message type is currently only BSM, SPaT, MAP, SSM and SRM", 501 - elif manufacturer == 'Yunex': + elif snmp_version == '1218': # Based on message type, choose the right port if msg_type.lower() == 'bsm': - return config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, '46800', index, '20', False) + return config_txrxmsg(rsu_ip, snmp_creds, dest_ip, '46800', index, '20', False) if msg_type.lower() == 'spat': - return config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, '44910', index, '8002', True) + return config_txrxmsg(rsu_ip, snmp_creds, dest_ip, '44910', index, '8002', True) if msg_type.lower() == 'map': - return config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, '44920', index, 'E0000017', True) + return config_txrxmsg(rsu_ip, snmp_creds, dest_ip, '44920', index, 'E0000017', True) if msg_type.lower() == 'ssm': - return config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, '44900', index, 'E0000015', True) + return config_txrxmsg(rsu_ip, snmp_creds, dest_ip, '44900', index, 'E0000015', True) if msg_type.lower() == 'srm': - return config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, '44930', index, 'E0000016', False) + return config_txrxmsg(rsu_ip, snmp_creds, dest_ip, '44930', index, 'E0000016', False) else: return "Supported message type is currently only BSM, SPaT, MAP, SSM and SRM", 501 else: - return "Supported RSU manufacturers are currently only Commsignia, Kapsch and Yunex", 501 + return "Supported SNMP versions are currently only RSU 4.1 and NTCIP 1218", 501 class SnmpsetSchema(Schema): dest_ip = fields.IPv4(required=True) @@ -316,7 +318,7 @@ def post(request): if errors: return f"The provided args does not match required values: {str(errors)}", 400 - response, code = config_init(request['rsu_ip'], request['manufacturer'], request['snmp_creds'], request['args']['dest_ip'], request['args']['msg_type'], request['args']['rsu_index']) + response, code = config_init(request['rsu_ip'], request['manufacturer'], request['snmp_version'], request['snmp_creds'], request['args']['dest_ip'], request['args']['msg_type'], request['args']['rsu_index']) return { "RsuFwdSnmpset": response }, code class SnmpsetDeleteSchema(Schema): @@ -331,5 +333,5 @@ def delete(request): if errors: return f"The provided args does not match required values: {str(errors)}", 400 - response, code = config_del(request['rsu_ip'], request['manufacturer'], request['snmp_creds'], request['args']['msg_type'], request['args']['rsu_index']) + response, code = config_del(request['rsu_ip'], request['snmp_version'], request['snmp_creds'], request['args']['msg_type'], request['args']['rsu_index']) return { "RsuFwdSnmpset": response }, code \ No newline at end of file diff --git a/services/api/src/rsufwdsnmpwalk.py b/services/api/src/rsufwdsnmpwalk.py index 3e38465d1..cf4728940 100644 --- a/services/api/src/rsufwdsnmpwalk.py +++ b/services/api/src/rsufwdsnmpwalk.py @@ -171,7 +171,7 @@ def snmpwalk_rsudsrcfwd(snmp_creds, rsu_ip): return { "RsuFwdSnmpwalk": snmp_config }, 200 -def snmpwalk_yunex(snmp_creds, rsu_ip): +def snmpwalk_txrxmsg(snmp_creds, rsu_ip): snmpwalk_results = { 'rsuReceivedMsgTable': {}, 'rsuXmitMsgFwdingTable': {} @@ -289,9 +289,9 @@ def snmpwalk_yunex(snmp_creds, rsu_ip): def get(request): logging.info(f'Running command, GET rsuFwdSnmpwalk') - if request['manufacturer'] == 'Kapsch' or request['manufacturer'] == 'Commsignia': + if request['snmp_version'] == '41': return snmpwalk_rsudsrcfwd(request['snmp_creds'], request["rsu_ip"]) - elif request['manufacturer'] == 'Yunex': - return snmpwalk_yunex(request['snmp_creds'], request["rsu_ip"]) + elif request['snmp_version'] == '1218': + return snmpwalk_txrxmsg(request['snmp_creds'], request["rsu_ip"]) else: - return "Supported RSU manufacturers are currently only Commsignia, Kapsch and Yunex", 501 \ No newline at end of file + return "Supported SNMP versions are currently only RSU 4.1 and NTCIP 1218", 501 \ No newline at end of file diff --git a/services/api/tests/src/test_rsu_commands.py b/services/api/tests/src/test_rsu_commands.py index 959615658..d16f4490f 100644 --- a/services/api/tests/src/test_rsu_commands.py +++ b/services/api/tests/src/test_rsu_commands.py @@ -9,6 +9,7 @@ 'manufacturer': 'test', 'snmp_username': 'test', 'snmp_password': 'test', + 'snmp_version': 'test', 'ssh_username': 'test', 'ssh_password': 'test' } @@ -120,7 +121,8 @@ def test_fetch_rsu_info(mock_query_db): "ssh_username": "mocked ssh_username", "ssh_password": "mocked ssh_password", "snmp_username": "mocked snmp_username", - "snmp_password": "mocked snmp_password" + "snmp_password": "mocked snmp_password", + "snmp_version": "mocked snmp_version" }, ), ] @@ -135,7 +137,8 @@ def test_fetch_rsu_info(mock_query_db): "ssh_username": "mocked ssh_username", "ssh_password": "mocked ssh_password", "snmp_username": "mocked snmp_username", - "snmp_password": "mocked snmp_password" + "snmp_password": "mocked snmp_password", + "snmp_version": "mocked snmp_version" } assert result == expected_result diff --git a/services/api/tests/src/test_rsufwdsnmpset.py b/services/api/tests/src/test_rsufwdsnmpset.py index e9470d400..5ca37488e 100644 --- a/services/api/tests/src/test_rsufwdsnmpset.py +++ b/services/api/tests/src/test_rsufwdsnmpset.py @@ -76,7 +76,7 @@ def test_perform_snmp_mods(subprocess_run): @patch('api.src.rsufwdsnmpset.subprocess.run') @patch('api.src.rsufwdsnmpset.perform_snmp_mods') -def test_config_msgfwd_yunex_tx(mock_perform_snmp_mods, mock_subprocess_run): +def test_config_txrxmsg_tx(mock_perform_snmp_mods, mock_subprocess_run): # mock mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -86,7 +86,7 @@ def test_config_msgfwd_yunex_tx(mock_perform_snmp_mods, mock_subprocess_run): udp_port = 1234 psid = 5678 tx = True - result = rsufwdsnmpset.config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, tx) + result = rsufwdsnmpset.config_txrxmsg(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, tx) # check mock_perform_snmp_mods.assert_called_once() @@ -95,7 +95,7 @@ def test_config_msgfwd_yunex_tx(mock_perform_snmp_mods, mock_subprocess_run): @patch('api.src.rsufwdsnmpset.subprocess.run') @patch('api.src.rsufwdsnmpset.perform_snmp_mods') -def test_config_msgfwd_yunex_no_tx(mock_perform_snmp_mods, mock_subprocess_run): +def test_config_txrxmsg_no_tx(mock_perform_snmp_mods, mock_subprocess_run): # mock mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -105,7 +105,7 @@ def test_config_msgfwd_yunex_no_tx(mock_perform_snmp_mods, mock_subprocess_run): udp_port = 1234 psid = 5678 tx = False - result = rsufwdsnmpset.config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, tx) + result = rsufwdsnmpset.config_txrxmsg(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, tx) # check mock_perform_snmp_mods.assert_called_once() @@ -113,13 +113,13 @@ def test_config_msgfwd_yunex_no_tx(mock_perform_snmp_mods, mock_subprocess_run): assert result == expected_result @patch('api.src.rsufwdsnmpset.set_rsu_status') -def test_config_msgfwd(mock_set_rsu_status): +def test_config_rsudsrcfwd(mock_set_rsu_status): manufacturer = 'test_manufacturer' udp_port = 1234 psid = 1 # call function - rsufwdsnmpset.config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, udp_port, rsu_index, psid) + rsufwdsnmpset.config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, udp_port, rsu_index, psid) # check calls mock_set_rsu_status.assert_has_calls([ @@ -130,7 +130,7 @@ def test_config_msgfwd(mock_set_rsu_status): @patch('api.src.rsufwdsnmpset.set_rsu_status') @patch('api.src.rsufwdsnmpset.subprocess.run') -def test_config_del_kapsch(mock_subprocess_run, mock_set_rsu_status): +def test_config_del_rsu41(mock_subprocess_run, mock_set_rsu_status): # mock subprocess.run mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -140,11 +140,11 @@ def test_config_del_kapsch(mock_subprocess_run, mock_set_rsu_status): mock_set_rsu_status.return_value = 'success' # prepare args - manufacturer = 'Kapsch' + snmp_version = '41' msg_type = 'test_msg_type' # call function - rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # check calls mock_set_rsu_status.assert_has_calls([ @@ -155,7 +155,7 @@ def test_config_del_kapsch(mock_subprocess_run, mock_set_rsu_status): @patch('api.src.rsufwdsnmpset.set_rsu_status') @patch('api.src.rsufwdsnmpset.subprocess.run') -def test_config_del_kapsch_set_rsu_status_failure(mock_subprocess_run, mock_set_rsu_status): +def test_config_del_rsu41_set_rsu_status_failure(mock_subprocess_run, mock_set_rsu_status): # mock subprocess.run mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -165,11 +165,11 @@ def test_config_del_kapsch_set_rsu_status_failure(mock_subprocess_run, mock_set_ mock_set_rsu_status.return_value = 'failure' # prepare args - manufacturer = 'Kapsch' + snmp_version = '41' msg_type = 'test_msg_type' # call function - result = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + result = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # check calls mock_set_rsu_status.assert_has_calls([ @@ -181,32 +181,7 @@ def test_config_del_kapsch_set_rsu_status_failure(mock_subprocess_run, mock_set_ @patch('api.src.rsufwdsnmpset.set_rsu_status') @patch('api.src.rsufwdsnmpset.subprocess.run') -def test_config_del_commsignia(mock_subprocess_run, mock_set_rsu_status): - # mock subprocess.run - mock_subprocess_run.return_value = Mock() - mock_subprocess_run.return_value.stdout = Mock() - mock_subprocess_run.return_value.stdout.decode.return_value = 'test_output' - - # mock set_rsu_status - mock_set_rsu_status.return_value = 'success' - - # prepare args - manufacturer = 'Commsignia' - msg_type = 'test_msg_type' - - # call function - rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) - - # check calls - mock_set_rsu_status.assert_has_calls([ - call(rsu_ip, snmp_creds, operate=False), - call(rsu_ip, snmp_creds, operate=True) - ]) - mock_subprocess_run.assert_called_once() - -@patch('api.src.rsufwdsnmpset.set_rsu_status') -@patch('api.src.rsufwdsnmpset.subprocess.run') -def test_config_del_yunex_bsm(mock_subprocess_run, mock_set_rsu_status): +def test_config_del_ntcip1218_bsm(mock_subprocess_run, mock_set_rsu_status): # mock mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -214,9 +189,9 @@ def test_config_del_yunex_bsm(mock_subprocess_run, mock_set_rsu_status): mock_set_rsu_status.return_value = 'success' # call - manufacturer = 'Yunex' + snmp_version = '1218' msg_type = 'bsm' - result = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + result = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # check mock_set_rsu_status.assert_not_called() @@ -225,7 +200,7 @@ def test_config_del_yunex_bsm(mock_subprocess_run, mock_set_rsu_status): @patch('api.src.rsufwdsnmpset.set_rsu_status') @patch('api.src.rsufwdsnmpset.subprocess.run') -def test_config_del_yunex_spat(mock_subprocess_run, mock_set_rsu_status): +def test_config_del_ntcip1218_spat(mock_subprocess_run, mock_set_rsu_status): # mock mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -233,9 +208,9 @@ def test_config_del_yunex_spat(mock_subprocess_run, mock_set_rsu_status): mock_set_rsu_status.return_value = 'success' # call - manufacturer = 'Yunex' + snmp_version = '1218' msg_type = 'spat' - result = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + result = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # check mock_set_rsu_status.assert_not_called() @@ -244,7 +219,7 @@ def test_config_del_yunex_spat(mock_subprocess_run, mock_set_rsu_status): @patch('api.src.rsufwdsnmpset.set_rsu_status') @patch('api.src.rsufwdsnmpset.subprocess.run') -def test_config_del_yunex_map(mock_subprocess_run, mock_set_rsu_status): +def test_config_del_ntcip1218_map(mock_subprocess_run, mock_set_rsu_status): # mock mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -252,9 +227,9 @@ def test_config_del_yunex_map(mock_subprocess_run, mock_set_rsu_status): mock_set_rsu_status.return_value = 'success' # call - manufacturer = 'Yunex' + snmp_version = '1218' msg_type = 'map' - result = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + result = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # check mock_set_rsu_status.assert_not_called() @@ -263,7 +238,7 @@ def test_config_del_yunex_map(mock_subprocess_run, mock_set_rsu_status): @patch('api.src.rsufwdsnmpset.set_rsu_status') @patch('api.src.rsufwdsnmpset.subprocess.run') -def test_config_del_yunex_ssm(mock_subprocess_run, mock_set_rsu_status): +def test_config_del_ntcip1218_ssm(mock_subprocess_run, mock_set_rsu_status): # mock mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -271,9 +246,9 @@ def test_config_del_yunex_ssm(mock_subprocess_run, mock_set_rsu_status): mock_set_rsu_status.return_value = 'success' # call - manufacturer = 'Yunex' + snmp_version = '1218' msg_type = 'ssm' - result = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + result = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # check mock_set_rsu_status.assert_not_called() @@ -282,7 +257,7 @@ def test_config_del_yunex_ssm(mock_subprocess_run, mock_set_rsu_status): @patch('api.src.rsufwdsnmpset.set_rsu_status') @patch('api.src.rsufwdsnmpset.subprocess.run') -def test_config_del_yunex_srm(mock_subprocess_run, mock_set_rsu_status): +def test_config_del_ntcip1218_srm(mock_subprocess_run, mock_set_rsu_status): # mock mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -290,9 +265,9 @@ def test_config_del_yunex_srm(mock_subprocess_run, mock_set_rsu_status): mock_set_rsu_status.return_value = 'success' # call - manufacturer = 'Yunex' + snmp_version = '1218' msg_type = 'srm' - result = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + result = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # check mock_set_rsu_status.assert_not_called() @@ -300,242 +275,119 @@ def test_config_del_yunex_srm(mock_subprocess_run, mock_set_rsu_status): assert result == ("Successfully deleted the Yunex SNMPSET configuration", 200) @patch('api.src.rsufwdsnmpset.set_rsu_status') -def test_config_del_unsupported_manufacturer(mock_set_rsu_status): +def test_config_del_unsupported_snmp_version(mock_set_rsu_status): # prepare args - manufacturer = 'test_manufacturer' + snmp_version = 'test_version' msg_type = 'test_msg_type' # call function - result = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + result = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # check result - expected_response = "Supported RSU manufacturers are currently only Commsignia, Kapsch and Yunex" + expected_response = "Supported SNMP versions are currently only RSU 4.1 and NTCIP 1218" expected_code = 501 assert result == (expected_response, expected_code) # check calls mock_set_rsu_status.assert_not_called() -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_kapsch_bsm(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd.return_value = 'success' - manufacturer = 'Kapsch' - msg_type = 'BSM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '46800', rsu_index, '20') - mock_config_msgfwd_yunex.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_kapsch_spat(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd.return_value = 'success' - manufacturer = 'Kapsch' - msg_type = 'SPaT' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '44910', rsu_index, '8002') - mock_config_msgfwd_yunex.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_kapsch_map(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd.return_value = 'success' - manufacturer = 'Kapsch' - msg_type = 'MAP' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '44920', rsu_index, 'E0000017', raw=True) - mock_config_msgfwd_yunex.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_kapsch_ssm(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd.return_value = 'success' - manufacturer = 'Kapsch' - msg_type = 'SSM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '44900', rsu_index, 'E0000015', raw=True) - mock_config_msgfwd_yunex.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_kapsch_srm(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd.return_value = 'success' - manufacturer = 'Kapsch' - msg_type = 'SRM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '44930', rsu_index, 'E0000016', raw=True) - mock_config_msgfwd_yunex.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_kapsch_unsupported_msg_type(mock_config_msgfwd_yunex, mock_config_msgfwd): - manufacturer = 'Kapsch' - msg_type = 'test_msg_type' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = "Supported message type is currently only BSM, SPaT, MAP, SSM and SRM", 501 - assert result == expected_result - mock_config_msgfwd.assert_not_called() - mock_config_msgfwd_yunex.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') +@patch('api.src.rsufwdsnmpset.config_rsudsrcfwd') +@patch('api.src.rsufwdsnmpset.config_txrxmsg') def test_config_init_commsignia_bsm(mock_config_msgfwd_yunex, mock_config_msgfwd): mock_config_msgfwd.return_value = 'success' + snmp_version = '41' manufacturer = 'Commsignia' msg_type = 'BSM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) + result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, rsu_index) expected_result = 'success' assert result == expected_result mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '46800', rsu_index, '20') mock_config_msgfwd_yunex.assert_not_called() -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') +@patch('api.src.rsufwdsnmpset.config_rsudsrcfwd') +@patch('api.src.rsufwdsnmpset.config_txrxmsg') def test_config_init_commsignia_spat(mock_config_msgfwd_yunex, mock_config_msgfwd): mock_config_msgfwd.return_value = 'success' + snmp_version = '41' manufacturer = 'Commsignia' msg_type = 'SPaT' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) + result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, rsu_index) expected_result = 'success' assert result == expected_result mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '44910', rsu_index, '8002') mock_config_msgfwd_yunex.assert_not_called() -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') +@patch('api.src.rsufwdsnmpset.config_rsudsrcfwd') +@patch('api.src.rsufwdsnmpset.config_txrxmsg') def test_config_init_commsignia_map(mock_config_msgfwd_yunex, mock_config_msgfwd): mock_config_msgfwd.return_value = 'success' + snmp_version = '41' manufacturer = 'Commsignia' msg_type = 'MAP' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) + result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, rsu_index) expected_result = 'success' assert result == expected_result mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '44920', rsu_index, 'E0000017', raw=True) mock_config_msgfwd_yunex.assert_not_called() -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') +@patch('api.src.rsufwdsnmpset.config_rsudsrcfwd') +@patch('api.src.rsufwdsnmpset.config_txrxmsg') def test_config_init_commsignia_ssm(mock_config_msgfwd_yunex, mock_config_msgfwd): mock_config_msgfwd.return_value = 'success' + snmp_version = '41' manufacturer = 'Commsignia' msg_type = 'SSM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) + result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, rsu_index) expected_result = 'success' assert result == expected_result mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '44900', rsu_index, 'E0000015', raw=True) mock_config_msgfwd_yunex.assert_not_called() -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') +@patch('api.src.rsufwdsnmpset.config_rsudsrcfwd') +@patch('api.src.rsufwdsnmpset.config_txrxmsg') def test_config_init_commsignia_srm(mock_config_msgfwd_yunex, mock_config_msgfwd): mock_config_msgfwd.return_value = 'success' + snmp_version = '41' manufacturer = 'Commsignia' msg_type = 'SRM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) + result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, rsu_index) expected_result = 'success' assert result == expected_result mock_config_msgfwd.assert_called_once_with(rsu_ip, manufacturer, snmp_creds, dest_ip, '44930', rsu_index, 'E0000016', raw=True) mock_config_msgfwd_yunex.assert_not_called() -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_commsignia_unsupported_msg_type(mock_config_msfwd_yunex, mock_config_msgfwd): - manufacturer = 'Commsignia' +@patch('api.src.rsufwdsnmpset.config_rsudsrcfwd') +@patch('api.src.rsufwdsnmpset.config_txrxmsg') +def test_config_init_unsupported_msg_type_rsu41(mock_config_msfwd_yunex, mock_config_msgfwd): + snmp_version = '41' + manufacturer = 'test' msg_type = 'test_msg_type' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) + result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, rsu_index) expected_result = "Supported message type is currently only BSM, SPaT, MAP, SSM and SRM", 501 assert result == expected_result mock_config_msgfwd.assert_not_called() mock_config_msfwd_yunex.assert_not_called() -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_yunex_bsm(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd_yunex.return_value = 'success' - manufacturer = 'Yunex' - msg_type = 'BSM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd_yunex.assert_called_once_with(rsu_ip, snmp_creds, dest_ip, '46800', rsu_index, '20', False) - mock_config_msgfwd.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_yunex_spat(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd_yunex.return_value = 'success' - manufacturer = 'Yunex' - msg_type = 'SPaT' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd_yunex.assert_called_once_with(rsu_ip, snmp_creds, dest_ip, '44910', rsu_index, '8002', True) - mock_config_msgfwd.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_yunex_map(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd_yunex.return_value = 'success' - manufacturer = 'Yunex' - msg_type = 'MAP' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd_yunex.assert_called_once_with(rsu_ip, snmp_creds, dest_ip, '44920', rsu_index, 'E0000017', True) - mock_config_msgfwd.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_yunex_ssm(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd_yunex.return_value = 'success' - manufacturer = 'Yunex' - msg_type = 'SSM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd_yunex.assert_called_once_with(rsu_ip, snmp_creds, dest_ip, '44900', rsu_index, 'E0000015', True) - mock_config_msgfwd.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_yunex_srm(mock_config_msgfwd_yunex, mock_config_msgfwd): - mock_config_msgfwd_yunex.return_value = 'success' - manufacturer = 'Yunex' - msg_type = 'SRM' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = 'success' - assert result == expected_result - mock_config_msgfwd_yunex.assert_called_once_with(rsu_ip, snmp_creds, dest_ip, '44930', rsu_index, 'E0000016', False) - mock_config_msgfwd.assert_not_called() - -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_yunex_unsupported_msg_type(mock_config_msfwd_yunex, mock_config_msgfwd): - manufacturer = 'Yunex' +@patch('api.src.rsufwdsnmpset.config_rsudsrcfwd') +@patch('api.src.rsufwdsnmpset.config_txrxmsg') +def test_config_init_unsupported_msg_type_ntcip1218(mock_config_msfwd_yunex, mock_config_msgfwd): + snmp_version = '1218' + manufacturer = 'test' msg_type = 'test_msg_type' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) + result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, rsu_index) expected_result = "Supported message type is currently only BSM, SPaT, MAP, SSM and SRM", 501 assert result == expected_result mock_config_msgfwd.assert_not_called() mock_config_msfwd_yunex.assert_not_called() -@patch('api.src.rsufwdsnmpset.config_msgfwd') -@patch('api.src.rsufwdsnmpset.config_msgfwd_yunex') -def test_config_init_unsupported_manufacturer(mock_config_msfwd_yunex, mock_config_msgfwd): +@patch('api.src.rsufwdsnmpset.config_rsudsrcfwd') +@patch('api.src.rsufwdsnmpset.config_txrxmsg') +def test_config_init_unsupported_snmp_version(mock_config_msfwd_yunex, mock_config_msgfwd): + snmp_version = 'test_snmp_version' manufacturer = 'test_manufacturer' msg_type = 'test_msg_type' - result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_creds, dest_ip, msg_type, rsu_index) - expected_result = "Supported RSU manufacturers are currently only Commsignia, Kapsch and Yunex", 501 + result = rsufwdsnmpset.config_init(rsu_ip, manufacturer, snmp_version, snmp_creds, dest_ip, msg_type, rsu_index) + expected_result = "Supported SNMP versions are currently only RSU 4.1 and NTCIP 1218", 501 assert result == expected_result mock_config_msgfwd.assert_not_called() mock_config_msfwd_yunex.assert_not_called() @@ -558,6 +410,7 @@ def test_post(mock_config_init, mock_validate): }, 'rsu_ip': '192.168.0.20', 'manufacturer': 'test_manufacturer', + 'snmp_version': 'test_snmp_version', 'snmp_creds': {'username': 'test_username', 'password': 'test_password'} } @@ -566,7 +419,7 @@ def test_post(mock_config_init, mock_validate): # check calls mock_validate.assert_called_once() - mock_config_init.assert_called_once_with(request['rsu_ip'], request['manufacturer'], request['snmp_creds'], request['args']['dest_ip'], request['args']['msg_type'], request['args']['rsu_index']) + mock_config_init.assert_called_once_with(request['rsu_ip'], request['manufacturer'], request['snmp_version'], request['snmp_creds'], request['args']['dest_ip'], request['args']['msg_type'], request['args']['rsu_index']) # check result expected_code = 200 @@ -588,6 +441,7 @@ def test_post_error(mock_config_init, mock_validate): }, 'rsu_ip': '192.168.0.20', 'manufacturer': 'test_manufacturer', + 'snmp_version': 'test_snmp_version', 'snmp_creds': {'username': 'test_username', 'password': 'test_password'}, } @@ -618,6 +472,7 @@ def test_delete(mock_config_del, mock_validate): }, 'rsu_ip': '192.168.0.20', 'manufacturer': 'test_manufacturer', + 'snmp_version': 'test_snmp_version', 'snmp_creds': {'username': 'test_username', 'password': 'test_password'} } @@ -626,7 +481,7 @@ def test_delete(mock_config_del, mock_validate): # check calls mock_validate.assert_called_once() - mock_config_del.assert_called_once_with(request['rsu_ip'], request['manufacturer'], request['snmp_creds'], request['args']['msg_type'], request['args']['rsu_index']) + mock_config_del.assert_called_once_with(request['rsu_ip'], request['snmp_version'], request['snmp_creds'], request['args']['msg_type'], request['args']['rsu_index']) # check result expected_code = 200 @@ -664,10 +519,10 @@ def test_delete_error(mock_config_del, mock_validate): @patch('api.src.rsufwdsnmpset.set_rsu_status', return_value='success') @patch('api.src.rsufwdsnmpset.perform_snmp_mods') -def test_config_msgfwd_raw_false( mock_perform_snmp_mods, mock_set_rsu_status): +def test_config_rsudsrcfwd_raw_false( mock_perform_snmp_mods, mock_set_rsu_status): # Set up test data rsu_ip = '192.168.1.1' - manufacturer = 'Kapsch' + manufacturer = 'Commsignia' snmp_creds = {'username': 'username', 'password': 'password'} dest_ip = '192.168.1.2' index = 1 @@ -675,7 +530,7 @@ def test_config_msgfwd_raw_false( mock_perform_snmp_mods, mock_set_rsu_status): raw = False # Call the function - response, code = rsufwdsnmpset.config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44920', index, psid, raw) + response, code = rsufwdsnmpset.config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44920', index, psid, raw) # Check the result assert code == 200, "Unexpected code" @@ -688,17 +543,17 @@ def test_config_msgfwd_raw_false( mock_perform_snmp_mods, mock_set_rsu_status): @patch('api.src.rsufwdsnmpset.set_rsu_status', return_value='success') @patch('api.src.rsufwdsnmpset.perform_snmp_mods') -def test_config_msgfwd_raw_true( mock_perform_snmp_mods, mock_set_rsu_status): +def test_config_rsudsrcfwd_raw_true( mock_perform_snmp_mods, mock_set_rsu_status): # Set up test data rsu_ip = '192.168.1.1' snmp_creds = {'username': 'username', 'password': 'password'} dest_ip = '192.168.1.2' index = 1 psid = '20' - manufacturer = 'Kapsch' + manufacturer = 'Commsignia' raw = True # Call the function - response, code = rsufwdsnmpset.config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44920', index, psid, raw) + response, code = rsufwdsnmpset.config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, '44920', index, psid, raw) # Check the result assert code == 200 @@ -728,7 +583,7 @@ def test_set_rsu_status_exception(mock_run, mock_check_error_type, mock_get_auth @patch('api.src.rsufwdsnmpset.snmpcredential.get_authstring', return_value='auth_string') @patch('api.src.rsufwdsnmpset.snmperrorcheck.check_error_type', return_value='error message') @patch('api.src.rsufwdsnmpset.perform_snmp_mods', side_effect=raise_called_process_error) -def test_config_msgfwd_yunex_exception(mock_perform_snmp_mods, mock_check_error_type, mock_get_authstring): +def test_config_txrxmsg_exception(mock_perform_snmp_mods, mock_check_error_type, mock_get_authstring): # Setup rsu_ip = '192.168.1.1' snmp_creds = {'username': 'username', 'password': 'password'} @@ -739,7 +594,7 @@ def test_config_msgfwd_yunex_exception(mock_perform_snmp_mods, mock_check_error_ tx = True # Call the function - response, code = rsufwdsnmpset.config_msgfwd_yunex(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, tx) + response, code = rsufwdsnmpset.config_txrxmsg(rsu_ip, snmp_creds, dest_ip, udp_port, rsu_index, psid, tx) mock_check_error_type.assert_called_once_with('any') # Assert the function result assert code == 500 @@ -749,7 +604,7 @@ def test_config_msgfwd_yunex_exception(mock_perform_snmp_mods, mock_check_error_ @patch('api.src.rsufwdsnmpset.snmperrorcheck.check_error_type', return_value='error message') @patch('api.src.rsufwdsnmpset.perform_snmp_mods', side_effect=raise_called_process_error) @patch('api.src.rsufwdsnmpset.set_rsu_status', return_value='success') -def test_config_msgfwd_exception(mock_set_rsu_status, mock_perform_snmp_mods, mock_check_error_type, mock_get_authstring): +def test_config_rsudsrcfwd_exception(mock_set_rsu_status, mock_perform_snmp_mods, mock_check_error_type, mock_get_authstring): # Setup rsu_ip = '192.168.1.1' manufacturer = 'manufacturer' @@ -761,7 +616,7 @@ def test_config_msgfwd_exception(mock_set_rsu_status, mock_perform_snmp_mods, mo raw = False # Call the function - response, code = rsufwdsnmpset.config_msgfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, udp_port, rsu_index, psid, raw) + response, code = rsufwdsnmpset.config_rsudsrcfwd(rsu_ip, manufacturer, snmp_creds, dest_ip, udp_port, rsu_index, psid, raw) # Assert that check_error_type was called with the last line of the error output mock_check_error_type.assert_called_once_with('any') @@ -774,16 +629,16 @@ def test_config_msgfwd_exception(mock_set_rsu_status, mock_perform_snmp_mods, mo @patch('api.src.rsufwdsnmpset.snmperrorcheck.check_error_type', return_value='error message') @patch('api.src.rsufwdsnmpset.subprocess.run', side_effect=raise_called_process_error) @patch('api.src.rsufwdsnmpset.set_rsu_status', return_value='success') -def test_config_del_exception(mock_set_rsu_status, mock_run, mock_check_error_type, mock_get_authstring): +def test_config_del_rsu41_exception(mock_set_rsu_status, mock_run, mock_check_error_type, mock_get_authstring): # Setup rsu_ip = '192.168.1.1' - manufacturer = 'Commsignia' + snmp_version = '41' snmp_creds = {'username': 'username', 'password': 'password'} msg_type = 'bsm' rsu_index = 1 # Call the function - response, code = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + response, code = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # Assert that check_error_type was called with the last line of the error output mock_check_error_type.assert_called_once_with('any') @@ -795,10 +650,10 @@ def test_config_del_exception(mock_set_rsu_status, mock_run, mock_check_error_ty @patch('api.src.rsufwdsnmpset.set_rsu_status', return_value='success') @patch('api.src.rsufwdsnmpset.subprocess.run') @patch('api.src.rsufwdsnmpset.snmperrorcheck.check_error_type', return_value='test error') -def test_config_del_yunex_manufacturer_exception(mock_check_error_type, mock_run, mock_set_rsu_status): +def test_config_del_ntcip1218_exception(mock_check_error_type, mock_run, mock_set_rsu_status): # Setup rsu_ip = '192.168.1.1' - manufacturer = 'Yunex' + snmp_version = '1218' snmp_creds = {'username': 'username', 'password': 'password'} msg_type = 'bsm' # This can be any of the following: ['bsm', 'spat', 'map', 'ssm', 'srm'] rsu_index = 1 @@ -810,13 +665,10 @@ def test_config_del_yunex_manufacturer_exception(mock_check_error_type, mock_run mock_run.side_effect = subprocess.CalledProcessError(1, cmd=['any'], stderr=b'\n error line') # Call the function - response, code = rsufwdsnmpset.config_del(rsu_ip, manufacturer, snmp_creds, msg_type, rsu_index) + response, code = rsufwdsnmpset.config_del(rsu_ip, snmp_version, snmp_creds, msg_type, rsu_index) # Assert the function result expected_response = 'test error' expected_code = 500 assert code == expected_code assert response == expected_response - - -# TODO: implement tests for exception/failure states \ No newline at end of file diff --git a/services/api/tests/src/test_rsufwdsnmpwalk.py b/services/api/tests/src/test_rsufwdsnmpwalk.py index 4d58b8ce0..3e66461bd 100644 --- a/services/api/tests/src/test_rsufwdsnmpwalk.py +++ b/services/api/tests/src/test_rsufwdsnmpwalk.py @@ -135,7 +135,7 @@ def test_snmpwalk_rsudsrcfwd_exception(): assert(output in expected_possible_outputs) @patch('api.src.rsufwdsnmpwalk.subprocess.run') -def test_snmpwalk_yunex(mock_subprocess_run): +def test_snmpwalk_txrxmsg(mock_subprocess_run): # mock mock_subprocess_run.return_value = Mock() mock_subprocess_run.return_value.stdout = Mock() @@ -147,21 +147,21 @@ def test_snmpwalk_yunex(mock_subprocess_run): rsu_ip = '192.168.0.20' # call function - output = rsufwdsnmpwalk.snmpwalk_yunex(snmp_creds, rsu_ip) + output = rsufwdsnmpwalk.snmpwalk_txrxmsg(snmp_creds, rsu_ip) # verify expected_snmp_results = {'rsuReceivedMsgTable': {}, 'rsuXmitMsgFwdingTable': {}} expected_output = ({'RsuFwdSnmpwalk': expected_snmp_results}, 200) assert(output == expected_output) -def test_snmpwalk_yunex_exception(): +def test_snmpwalk_txrxmsg_exception(): # prepare input source_ip = '192.168.0.10' snmp_creds = {'ip': source_ip, 'username': 'public', 'password': 'public'} rsu_ip = '192.168.0.20' # call function - output = rsufwdsnmpwalk.snmpwalk_yunex(snmp_creds, rsu_ip) + output = rsufwdsnmpwalk.snmpwalk_txrxmsg(snmp_creds, rsu_ip) # verify expected_possible_outputs = [ @@ -173,55 +173,42 @@ def test_snmpwalk_yunex_exception(): assert(output in expected_possible_outputs) @patch('api.src.rsufwdsnmpwalk.snmpwalk_rsudsrcfwd') -@patch('api.src.rsufwdsnmpwalk.snmpwalk_yunex') -def test_get_kapsch(mock_snmpwalk_yunex, mock_snmpwalk_rsudsrcfwd): +@patch('api.src.rsufwdsnmpwalk.snmpwalk_txrxmsg') +def test_get_rsu41(mock_snmpwalk_txrxmsg, mock_snmpwalk_rsudsrcfwd): # prepare input - request = {'snmp_creds': snmp_creds, 'rsu_ip': rsu_ip, 'manufacturer': 'Kapsch'} + request = {'snmp_creds': snmp_creds, 'rsu_ip': rsu_ip, 'manufacturer': 'Commsignia', 'snmp_version': '41'} # call function rsufwdsnmpwalk.get(request) # verify mock_snmpwalk_rsudsrcfwd.assert_called_once_with(snmp_creds, rsu_ip) - mock_snmpwalk_yunex.assert_not_called() + mock_snmpwalk_txrxmsg.assert_not_called() @patch('api.src.rsufwdsnmpwalk.snmpwalk_rsudsrcfwd') -@patch('api.src.rsufwdsnmpwalk.snmpwalk_yunex') -def test_get_commsignia(mock_snmpwalk_yunex, mock_snmpwalk_rsudsrcfwd): +@patch('api.src.rsufwdsnmpwalk.snmpwalk_txrxmsg') +def test_get_ntcip1218(mock_snmpwalk_txrxmsg, mock_snmpwalk_rsudsrcfwd): # prepare input - request = {'snmp_creds': snmp_creds, 'rsu_ip': rsu_ip, 'manufacturer': 'Commsignia'} - - # call function - rsufwdsnmpwalk.get(request) - - # verify - mock_snmpwalk_rsudsrcfwd.assert_called_once_with(snmp_creds, rsu_ip) - mock_snmpwalk_yunex.assert_not_called() - -@patch('api.src.rsufwdsnmpwalk.snmpwalk_rsudsrcfwd') -@patch('api.src.rsufwdsnmpwalk.snmpwalk_yunex') -def test_get_yunex(mock_snmpwalk_yunex, mock_snmpwalk_rsudsrcfwd): - # prepare input - request = {'snmp_creds': snmp_creds, 'rsu_ip': rsu_ip, 'manufacturer': 'Yunex'} + request = {'snmp_creds': snmp_creds, 'rsu_ip': rsu_ip, 'manufacturer': 'Yunex', 'snmp_version': '1218'} # call function rsufwdsnmpwalk.get(request) # verify mock_snmpwalk_rsudsrcfwd.assert_not_called() - mock_snmpwalk_yunex.assert_called_once_with(snmp_creds, rsu_ip) + mock_snmpwalk_txrxmsg.assert_called_once_with(snmp_creds, rsu_ip) @patch('api.src.rsufwdsnmpwalk.snmpwalk_rsudsrcfwd') -@patch('api.src.rsufwdsnmpwalk.snmpwalk_yunex') -def test_get_exception(mock_snmpwalk_yunex, mock_snmpwalk_rsudsrcfwd): +@patch('api.src.rsufwdsnmpwalk.snmpwalk_txrxmsg') +def test_get_exception(mock_snmpwalk_txrxmsg, mock_snmpwalk_rsudsrcfwd): # prepare input - request = {'snmp_creds': snmp_creds, 'rsu_ip': rsu_ip, 'manufacturer': 'Unknown'} + request = {'snmp_creds': snmp_creds, 'rsu_ip': rsu_ip, 'manufacturer': 'Unknown', 'snmp_version': 'Unknown'} # call function output = rsufwdsnmpwalk.get(request) # verify mock_snmpwalk_rsudsrcfwd.assert_not_called() - mock_snmpwalk_yunex.assert_not_called() - expected_output = ("Supported RSU manufacturers are currently only Commsignia, Kapsch and Yunex", 501) + mock_snmpwalk_txrxmsg.assert_not_called() + expected_output = ("Supported SNMP versions are currently only RSU 4.1 and NTCIP 1218", 501) assert(output == expected_output) \ No newline at end of file From b8dfab0eae2f3abe7e82d5c7b567f87856cfeff5 Mon Sep 17 00:00:00 2001 From: Drew Johnston <31270488+drewjj@users.noreply.github.com> Date: Fri, 5 Jan 2024 11:28:09 -0700 Subject: [PATCH 26/70] include mib for ntcip1218 --- services/api/resources/mibs/NTCIP1218-v01.txt | 3210 +++++++++++++++++ services/api/src/rsufwdsnmpset.py | 96 +- services/api/src/rsufwdsnmpwalk.py | 8 +- services/api/tests/src/test_rsufwdsnmpset.py | 20 +- 4 files changed, 3272 insertions(+), 62 deletions(-) create mode 100644 services/api/resources/mibs/NTCIP1218-v01.txt diff --git a/services/api/resources/mibs/NTCIP1218-v01.txt b/services/api/resources/mibs/NTCIP1218-v01.txt new file mode 100644 index 000000000..9021d8ebd --- /dev/null +++ b/services/api/resources/mibs/NTCIP1218-v01.txt @@ -0,0 +1,3210 @@ +-- 5.0 MIB Comment Header +-- The draft NTCIP 1218 v01.35 MIB is a Draft document, which is distributed +-- for review and comment purposes only. You may reproduce and distribute +-- this document within your organization, but only for the purposes of and +-- only to the extent necessary to facilitate review and comment to the +-- NTCIP Coordinator. +-- +-- Please ensure that all copies include this notice. This document contains +-- preliminary information that is subject to substantive change without +-- further notice, prior to NTCIP 1218 v01 publication. +-- © 2019 AASHTO / ITE / NEMA +-- +-- If you wish to reprint or excerpt this MIB (or portions) outside of your +-- organization (for example, as part works offered by other organizations or +-- publishers, per the MIB Distribution Permission in draft NTCIP 1218 v0119 +-- Notices), request prior written permission from ntcip@nema.org. +-- +--********************************************************************* +-- Filename: 1218v0135.MIB +-- Date: December 16, 2019 +-- Description: This MIB defines the Roadside Unit (RSU) Objects +--********************************************************************* + +-- 5.1 MIB Header +NTCIP1218-v01 DEFINITIONS ::= BEGIN + +-- the following OBJECT IDENTIFIERS are used in the RSU MIB: +IMPORTS +MODULE-IDENTITY, OBJECT-TYPE, Integer32, Counter32, NOTIFICATION-TYPE, enterprises + FROM SNMPv2-SMI +TEXTUAL-CONVENTION, DateAndTime, RowStatus, DisplayString, MacAddress + FROM SNMPv2-TC + SyslogSeverity +FROM SYSLOG-TC-MIB + Uri255, Uri1024 +FROM URI-TC-MIB; + +-- 1218v0129 MODULE-IDENTITY +-- LAST-UPDATED "201912160000Z" +-- ORGANIZATION "NTCIP - AASHTO/ITE/NEMA" +-- CONTACT-INFO "postal: NTCIP Coordinator +-- National Electrical Manufacturers Association +-- 1300 North 17th Street, Suite 900 +-- Rosslyn, Virginia 22209-3801 +-- email: ntcip@nema.org" +-- REVISION "20191216000Z" +-- DESCRIPTION "This MIB defines the Roadside Unit (RSU) Objects" +-- rsu OBJECT IDENTIFIER ::= { devices 18 } + +-- A.2 STRUCTURE INFORMATION +nema OBJECT IDENTIFIER ::= { enterprises 1206 } +-- NEMA has received ID 1206 from IANA +-- NEMA starts at { iso org dod internet private enterprises 1206 } in the +-- global naming tree. + +transportation OBJECT IDENTIFIER ::= { nema 4 } +-- The transportation subtree is used by the NTCIP to define +-- standard objects specific for the transportation industry. + +devices OBJECT IDENTIFIER ::= { transportation 2 } + +rsu OBJECT IDENTIFIER ::= { devices 18 } + +RsuTableIndex ::= TEXTUAL-CONVENTION + DISPLAY-HINT "d" + STATUS current + DESCRIPTION "A valid range of values for use in table indices" + SYNTAX Integer32 (1..2147483647) + +RsuPsidTC ::= TEXTUAL-CONVENTION + DISPLAY-HINT "4x" + STATUS current + DESCRIPTION "PSID associated with a SAE J2735 message. The PSID is formatted per IEEE1609.12-2016 Table 2 as P-encoded hex values, e.g. BSM = 0x20, TIM = 0x8003, WSA = 0x8007, IProuting = 0xEFFFFFFE. For those PSIDs less than 4 octets in length, the RSU should only require the significant octets be provided. For example, if the desired PSID is 0x20, then the RSU should accept a supplied value of 0x20. should not need to be padded to a 4-octet length." + SYNTAX OCTET STRING (SIZE(1..4)) + +-- For NTCIP 1218. +-- DateAndTime ::= TEXTUAL-CONVENTION +-- DISPLAY-HINT "2d-1d-1d,1d:1d:1d.1d" +-- STATUS current +-- DESCRIPTION "A date-time specification." +-- SYNTAX OCTET STRING (SIZE(8)) + +-- 5.2 RSU Radios +rsuRadio OBJECT IDENTIFIER ::= { rsu 1 } + +-- 5.2.1 Maximum Radios +maxRsuRadios OBJECT-TYPE + SYNTAX Integer32 (1..16) + UNITS "radio" + MAX-ACCESS read-only + STATUS current + DESCRIPTION " The maximum number of V2X radios this Roadside Unit supports. This object indicates the maximum rows which appears in the rsuRadioTable object. + 1.3.6.1.4.1.1.1206.4.2.18.1.1" +::= { rsuRadio 1 } + +-- 5.2.2 Radio Table +rsuRadioTable OBJECT-TYPE + SYNTAX SEQUENCE OF RsuRadioEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " A table containing the V2X radio parameters. The number of rows in this table is equal to the maxRsuRadios object. + static + 1.3.6.1.4.1.1.1206.4.2.18.1.2" +::= { rsuRadio 2 } + +rsuRadioEntry OBJECT-TYPE + SYNTAX RsuRadioEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Parameters for a specific roadside unit V2X radio. + 1.3.6.1.4.1.1.1206.4.2.18.1.2.1" + INDEX { rsuRadioIndex } +::= { rsuRadioTable 1 } + +RsuRadioEntry ::= SEQUENCE { + rsuRadioIndex Integer32, + rsuRadioDesc DisplayString, + rsuRadioEnable INTEGER, + rsuRadioType INTEGER, + rsuRadioMacAddress1 MacAddress, + rsuRadioMacAddress2 MacAddress, + rsuRadioChanMode INTEGER, + rsuRadioCh1 Integer32, + rsuRadioCh2 Integer32, + rsuRadioTxPower1 Integer32, + rsuRadioTxPower2 Integer32 } + +-- 5.2.2.1 RSU Radio Index +rsuRadioIndex OBJECT-TYPE + SYNTAX Integer32 (1..16) + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Roadside unit V2X radio index. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.1" +::= { rsuRadioEntry 1 } + +-- 5.2.2.2 RSU Radio Description +rsuRadioDesc OBJECT-TYPE + SYNTAX DisplayString (SIZE(0..144)) + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Name of the radio that the configuration relates to. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.2" +::= { rsuRadioEntry 2 } + +-- 5.2.2.3 RSU Radio Enable +rsuRadioEnable OBJECT-TYPE + SYNTAX INTEGER { off(0), on(1) } + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Set this bit to 1 to enable the V2X radio for transmission and reception of messages, and to 0 to disable the V2X radio. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.3" +::= { rsuRadioEntry 3 } + +-- 5.2.2.4 RSU Radio Type +rsuRadioType OBJECT-TYPE + SYNTAX INTEGER { other(1), + dsrc(2), + pC5(3) } + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Indicates the type of V2X Radio. pC5 is cellular V2X. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.4" +::= { rsuRadioEntry 4 } + +-- 5.2.2.5 RSU Radio MAC Address 1 +rsuRadioMacAddress1 OBJECT-TYPE + SYNTAX MacAddress + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Represents an 802 MAC address of the V2X Radio represented in the 'canonical' order defined by IEEE 802.1a, i.e., as if it were transmitted least significant bit first, even though 802.5 (in contrast to other 802.x protocols) requires MAC addresses to be transmitted most significant bit first. For a PC5 radio, use the least significant 24-bit for the MAC address (Layer 2 Source id). If the MacAddress is not available, set the MacAddress to all ones (1). + 1.3.6.1.4.1.1206.4.2.18.1.2.1.5" +::= { rsuRadioEntry 5 } + +-- 5.2.2.6 RSU Radio MAC Address 2 +rsuRadioMacAddress2 OBJECT-TYPE + SYNTAX MacAddress + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Represents the second IEEE 802 MAC address of the V2X Radio operating on a channel switch. The MAC address is as if the represented in the 'canonical' order defined by IEEE 802.1a, i.e., as if it were transmitted least significant bit first, even though 802.5 (in contrast to other 802.x protocols) requires MAC addresses to be transmitted most significant bit first. If the MacAddress is not available or if the radio doesn't have a second MAC, set the MacAddress to all ones (1). + 1.3.6.1.4.1.1206.4.2.18.1.2.1.6" +::= { rsuRadioEntry 6 } + +-- 5.2.2.7 RSU Radio Channel Mode +rsuRadioChanMode OBJECT-TYPE + SYNTAX INTEGER { other (1), + unknown (2), + cont (3), + alt (4), + immediate (5) } + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Represents the channel access mode for the radio. Supported values are continuous access (cont), alternating access (alt), and immediate access as defined in IEEE 1609.3-2016. A SET to a value of other (1) or unknown (2) shall return a badValue error. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.7" +::= { rsuRadioEntry 7 } + +-- 5.2.2.8 RSU Radio Channel 1 +rsuRadioCh1 OBJECT-TYPE + SYNTAX Integer32 (0..255) + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Represents the channel number for continuous mode as well as for time slot 0 when the radio is operating in alternating mode. For DSRC radios in the United States, the transmission channel is from 172 to 184, as defined by IEEE 802.11. For PC5 radios in the United States, the relationship between IEEE 802.11 and 3GPP channel numbers is found in Table 7 of NTCIP 1218 v01. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.8" +::= { rsuRadioEntry 8 } + +-- 5.2.2.9 RSU Radio Channel 2 +rsuRadioCh2 OBJECT-TYPE + SYNTAX Integer32 (0..255) + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Represents the channel number for channel slot 2. For DSRC radios in the United States, the transmission channel is from 172 to 184, as defined by IEEE 802.11. For PC5 radios in the United States, the relationship between IEEE 802.11 and 3GPP channel numbers is found in Table 7 of NTCIP 1218 v01. If the radio operates in continuous mode, this value is equal to rsuRadioCh1 and is ignored. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.9" +::= { rsuRadioEntry 9 } + +-- 5.2.2.10 RSU Radio Channel 1 - Default Transmit Power +rsuRadioTxPower1 OBJECT-TYPE + SYNTAX Integer32 (-128..127) + UNITS "dBm" + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Sets the output power for channel slot 1, in dBm, at the V2X antenna port. This object is considered a default transmit power level to be used if a power level is not defined by an application. The power level defined by the application would take precedence. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.10" + DEFVAL { -128 } +::= { rsuRadioEntry 10 } + +-- 5.2.2.11 RSU Radio Channel 2 - Default Transmit Power +rsuRadioTxPower2 OBJECT-TYPE + SYNTAX Integer32 (-128..127) + UNITS "dBm" + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Sets the output power for channel slot 2, in dBm, at the V2X antenna port. This object is considered a default transmit power level to be used if a power level is not defined by an application. The power level defined by the application would take precedence. If the radio operates in continuous mode, this value is equal to rsuRadioTxPower1 and is ignored. + 1.3.6.1.4.1.1206.4.2.18.1.2.1.11" + DEFVAL { -128 } +::= { rsuRadioEntry 11 } + +-- 5.3 RSU GNSS +rsuGnss OBJECT IDENTIFIER ::= { rsu 2 } + +-- 5.3.1 GNSS Status +rsuGnssStatus OBJECT-TYPE + SYNTAX Integer32 (0..128) + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Provides the number of GNSS satellites the RSU's internal GNSS receiver is tracking and using. + 1.3.6.1.4.1.1206.4.2.18.2.1" +::= { rsuGnss 1 } + +-- 5.3.2 GNSS Augmentation +rsuGnssAugmentation OBJECT-TYPE + SYNTAX INTEGER { other (1), + none (2), + waas (3) } + MAX-ACCESS read-only + STATUS current + DESCRIPTION " This object indicates if the position from a GNSS or similar geopositioning device is augmented, such as Wide Area Augmentation System (WAAS) corrections. + 1.3.6.1.4.1.1.1206.4.2.18.2.2" + DEFVAL { none } +::= { rsuGnss 2 } + +-- 5.4 Store and Repeat Messages +rsuMsgRepeat OBJECT IDENTIFIER ::= { rsu 3 } + +-- 5.4.1 Maximum Number of Store and Repeat Messages +maxRsuMsgRepeat OBJECT-TYPE + SYNTAX Integer32 (1..255) + MAX-ACCESS read-only + STATUS current + DESCRIPTION " The maximum number of Store and Repeat messages this Roadside Unit supports. This object indicates the maximum rows which appears in the rsuMsgRepeatStatusTable object. + 1.3.6.1.4.1.1206.4.2.18.3.1" +::= { rsuMsgRepeat 1 } + +-- 5.4.2 Store and Repeat Table +rsuMsgRepeatStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF RsuMsgRepeatStatusEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Provides configuration information for each Store and Repeat message to be sent by a Roadside Unit. + dynamic + 1.3.6.1.4.1.1206.4.2.18.3.2" +::= { rsuMsgRepeat 2 } + +rsuMsgRepeatStatusEntry OBJECT-TYPE + SYNTAX RsuMsgRepeatStatusEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " A row describing an RSU Store and Repeat Message. + 1.3.6.1.4.1.1206.4.2.18.3.2.1" + INDEX { rsuMsgRepeatIndex } +::= {rsuMsgRepeatStatusTable 1 } + +RsuMsgRepeatStatusEntry ::= SEQUENCE { + rsuMsgRepeatIndex RsuTableIndex, + rsuMsgRepeatPsid RsuPsidTC, + rsuMsgRepeatTxChannel Integer32, + rsuMsgRepeatTxInterval Integer32, + rsuMsgRepeatDeliveryStart DateAndTime, + rsuMsgRepeatDeliveryStop DateAndTime, + rsuMsgRepeatPayload OCTET STRING, + rsuMsgRepeatEnable INTEGER, + rsuMsgRepeatStatus RowStatus, + rsuMsgRepeatPriority Integer32, + rsuMsgRepeatOptions BITS } + +-- 5.4.2.1 Stored Message Index +rsuMsgRepeatIndex OBJECT-TYPE + SYNTAX RsuTableIndex + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Store and Repeat Message Index. This index shall not exceed maxRsuMsgRepeat. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.1" +::= { rsuMsgRepeatStatusEntry 1 } + +-- 5.4.2.2 Stored Message PSID +rsuMsgRepeatPsid OBJECT-TYPE + SYNTAX RsuPsidTC + MAX-ACCESS read-create + STATUS current + DESCRIPTION " The Provider Service Identifier (PSID) for the Store and Repeat Message. The current PSID assignments can be found at https://standards.ieee.org/products-services/regauth/psid/public.html. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.2" +::= { rsuMsgRepeatStatusEntry 2 } + +-- 5.4.2.3 Stored Message Transmission Channel +rsuMsgRepeatTxChannel OBJECT-TYPE + SYNTAX Integer32 (0..255) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " The transmission channel the Store and Repeat Message is to be transmitted. For DSRC radios in the United States, the transmission channel is from 172 to 184, as defined by IEEE 802.11. For PC5 radios in the United States, the channel number is found in Table 7 of NTCIP 1218 v01. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.3" +::= { rsuMsgRepeatStatusEntry 3 } + +-- 5.4.2.4 Stored Message Transmission Interval +rsuMsgRepeatTxInterval OBJECT-TYPE + SYNTAX Integer32 (1..2147483647) + UNITS "millisecond" + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Time interval in milliseconds between the transmission of two successive Store and Repeat Messages. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.4" +::= { rsuMsgRepeatStatusEntry 4 } + +-- 5.4.2.5 Stored Message Start Time +rsuMsgRepeatDeliveryStart OBJECT-TYPE + SYNTAX DateAndTime + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Store and Repeat Message delivery start time in UTC. DateAndTime of length 8 octets. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.5" +::= { rsuMsgRepeatStatusEntry 5 } + +-- 5.4.2.6 Stored Message Stop Time +rsuMsgRepeatDeliveryStop OBJECT-TYPE + SYNTAX DateAndTime + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Store and Repeat Message delivery stop time in UTC. DateAndTime of length 8 octets. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.6" +::= { rsuMsgRepeatStatusEntry 6 } + +-- 5.4.2.7 Stored Message Payload +rsuMsgRepeatPayload OBJECT-TYPE + SYNTAX OCTET STRING (SIZE(0..2302)) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Payload of Store and Repeat message. Length limit derived from IEEE1609dot3-MIB. For SAE J2735-201603 messages, this object is the UPER encoded MessageFrame. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.7" +::= { rsuMsgRepeatStatusEntry 7 } + +-- 5.4.2.8 Stored Message Enabled Transmission +rsuMsgRepeatEnable OBJECT-TYPE + SYNTAX INTEGER { off (0), on (1) } + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Set this bit to enable transmission of the message. 0=off/do not transmit, 1=on/transmit. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.8" +::= { rsuMsgRepeatStatusEntry 8 } + +-- 5.4.2.9 Stored Message Status +rsuMsgRepeatStatus OBJECT-TYPE + SYNTAX RowStatus + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Create (4) and (6) destroy row entry. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.9" +::= { rsuMsgRepeatStatusEntry 9 } + +-- 5.4.2.10 Stored Message Priority +rsuMsgRepeatPriority OBJECT-TYPE + SYNTAX Integer32 (0..63) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Priority assigned to the Store and Repeat message. Priority values are defined by IEEE 1609.3-2016 for DSRC radios. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.10" +::= { rsuMsgRepeatStatusEntry 10 } + +-- 5.4.2.11 Stored Message Options +rsuMsgRepeatOptions OBJECT-TYPE + SYNTAX BITS { bypass(0), + secure(1), + shortTerm(2), + longTerm(3) } + MAX-ACCESS read-create + STATUS current + DESCRIPTION " A bit-mapped value as defined below for configuring the message. + Bit 0 0=Bypass1609.2, 1=Process1609.2 + Bit 1 0=Secure, 1=Unsecure + Bit 2 0=ContXmit, 1=NoXmitShortTermXceeded + Bit 3 0=ContXmit, 1=NoXmitLongTermXceeded + + Bit 0 - Indicates if the RSU is to bypass 1609.2 processing of the message to the V2X interface. This allows the RSU to send the message that has been signed and/or encrypted by the TMC. Note the RSU would still wrap the message payload in a WSMP header. + Bit 1 - Indicates if the message should be secured (signed or encrypted) prior to transmission to the V2X Interface. How the message is to be secured is determined by its security profile. This bit is ignored if Bit 0=0 (bypass). + Bit 2 - Indicates if the message should continue to be transmitted if the short-term communications loss period (rsuShortCommLossTime) is exceeded. 0 indicates the message should continue to be transmitted. Default value is 0. + Bit 3 - Indicates if the message should continue to be transmitted if the long-term communications loss period (rsuLongCommLossTime) is exceeded. 0 indicates the message should continue to be transmitted. Default value is 0. + 1.3.6.1.4.1.1206.4.2.18.3.2.1.11" +::= { rsuMsgRepeatStatusEntry 11 } + +-- 5.4.3 Delete All Stored Messages +rsuMsgRepeatDeleteAll OBJECT-TYPE + SYNTAX INTEGER (0..1) + MAX-ACCESS read-write + STATUS current + DESCRIPTION " This object when set to TRUE (one) shall cause the Roadside Unit to delete (destroy) all stored messages in the rsuMsgRepeatStatusTable. This object shall automatically return to FALSE (zero) after all rows in the rsuMsgRepeatStatusTable have been deleted. + 1.3.6.1.4.1.1206.4.2.18.3.3" +::= { rsuMsgRepeat 3 } + +-- 5.5 Immediate Forward Messages +rsuIFM OBJECT IDENTIFIER ::= { rsu 4 } + +-- 5.5.1 Maximum Number of Immediate Forward Messages +maxRsuIFMs OBJECT-TYPE + SYNTAX Integer32 (1..255) + MAX-ACCESS read-only + STATUS current + DESCRIPTION " The maximum number of Immediate Forward messages this Roadside Unit supports. This object indicates the maximum rows which appears in the rsuIFMStatusTable object. + 1.3.6.1.4.1.1206.4.2.18.4.1" +::= { rsuIFM 1 } + +-- 5.5.2 Immediate Forward Table +rsuIFMStatusTable OBJECT-TYPE + SYNTAX SEQUENCE OF RsuIFMStatusEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Provides configuration parameters for each Immediate Forward message sent by a Roadside Unit. + dynamic + 1.3.6.1.4.1.1206.4.2.18.4.2" +::= { rsuIFM 2 } + +rsuIFMStatusEntry OBJECT-TYPE + SYNTAX RsuIFMStatusEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " A row describing an RSU Immediate Forward Message Status. + 1.3.6.1.4.1.1206.4.2.18.4.2.1" + INDEX { rsuIFMIndex } +::= {rsuIFMStatusTable 1 } + +RsuIFMStatusEntry ::= SEQUENCE { + rsuIFMIndex RsuTableIndex, + rsuIFMPsid RsuPsidTC, + rsuIFMTxChannel Integer32, + rsuIFMEnable INTEGER, + rsuIFMStatus RowStatus, + rsuIFMPriority Integer32, + rsuIFMOptions BITS, + rsuIFMPayload OCTET STRING } + +-- 5.5.2.1 Forward Message Index +rsuIFMIndex OBJECT-TYPE + SYNTAX RsuTableIndex + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Immediate Forward Message Index. This index shall not exceed maxRsuIFMs. + 1.3.6.1.4.1.1206.4.2.18.4.2.1.1" +::= { rsuIFMStatusEntry 1 } + +-- 5.5.2.2 Forward Message PSID +rsuIFMPsid OBJECT-TYPE + SYNTAX RsuPsidTC + MAX-ACCESS read-create + STATUS current + DESCRIPTION " The Provider Service Identifier (PSID) for the Immediate Forward Message. The current PSID assignments can be found at https://standards.ieee.org/products-services/regauth/psid/public.html. + 1.3.6.1.4.1.1206.4.2.18.4.2.1.2" +::= { rsuIFMStatusEntry 2} + +-- 5.5.2.3 Forward Message Transmission Channel +rsuIFMTxChannel OBJECT-TYPE + SYNTAX Integer32 (0..255) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " The transmission channel the Immediate Forward Message is to be transmitted. For DSRC radios in the United States, the transmission channel is from 172 to 184, as defined by IEEE 802.11. For PC5 radios in the United States, the channel number is found in Table 7 of NTCIP 1218 v01. + 1.3.6.1.4.1.1206.4.2.18.4.2.1.3" +::= { rsuIFMStatusEntry 3 } + +-- 5.5.2.4 Forward Message Enable +rsuIFMEnable OBJECT-TYPE + SYNTAX INTEGER { off (0), on (1) } + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Set this bit to enable transmission of the message. 1 is to enable transmission. + 1.3.6.1.4.1.1206.4.2.18.4.2.1.4" +::= { rsuIFMStatusEntry 4 } + +-- 5.5.2.5 Forward Message Status +rsuIFMStatus OBJECT-TYPE + SYNTAX RowStatus + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Create (4) and destroy (6) row entry. + 1.3.6.1.4.1.1206.4.2.18.4.2.1.5" +::= { rsuIFMStatusEntry 5 } + +-- 5.5.2.6 Forward Message Priority +rsuIFMPriority OBJECT-TYPE + SYNTAX Integer32 (0..63) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Priority assigned to the Immediate Forward message. Priority values defined by IEEE 1609.3-2016 for DSRC radios. + 1.3.6.1.4.1.1206.4.2.18.4.2.1.6" +::= { rsuIFMStatusEntry 6 } + +-- 5.5.2.7 Forward Message Options +rsuIFMOptions OBJECT-TYPE + SYNTAX BITS { bypass(0), + secure(1), + shortTerm(2), + longTerm(3) } + MAX-ACCESS read-create + STATUS current + DESCRIPTION " A bit-mapped value as defined below for configuring the message. + Bit 0 0=Bypass1609.2, 1=Process1609.2 + Bit 1 0=Secure, 1=Unsecure + Bit 2 0=ContXmit, 1=NoXmitShortTermXceeded + Bit 3 0=ContXmit, 1=NoXmitLongTermXceeded + + Bit 0 - Indicates if the RSU is to bypass 1609.2 processing of the message to the V2X interface. This allows the RSU to send the message that has been signed and/or encrypted by the TMC. Note the RSU would still wrap the message payload in a WSMP header. + Bit 1 - Indicates if the message should be secured (signed or encrypted) prior to transmission to the V2X Interface. How the message is to be secured is determined by its security profile. This bit is ignored if Bit 0=0 (bypass). + Bit 2 - Indicates if the message should continue to be transmitted if the short-term communications loss period (rsuShortCommLossTime) is exceeded. 0 indicates the message should continue to be transmitted. Default value is 0. + Bit 3 - Indicates if the message should continue to be transmitted if the long-term communications loss period (rsuLongCommLossTime) is exceeded. 0 indicates the message should continue to be transmitted. Default value is 0. + 1.3.6.1.4.1.1206.4.2.18.4.2.1.7" +::= { rsuIFMStatusEntry 7 } + +-- 5.5.2.8 Forward Message Payload +rsuIFMPayload OBJECT-TYPE + SYNTAX OCTET STRING (SIZE(0..2302)) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Payload of Immediate Forward message. Length limit derived from IEEE1609dot3-MIB. For SAE J2735-201603 messages, this object is the UPER encoded MessageFrame. This payload remains in this object until replaced by another payload. + 1.3.6.1.4.1.1206.4.2.18.4.2.1.8" +::= { rsuIFMStatusEntry 8 } + +-- 5.6 Received Messages +rsuReceivedMsg OBJECT IDENTIFIER ::= { rsu 5 } + +-- 5.6.1 Maximum Number of Messages +maxRsuReceivedMsgs OBJECT-TYPE + SYNTAX Integer32 (1..255) + MAX-ACCESS read-only + STATUS current + DESCRIPTION " The maximum number of received message types (from the V2X interface), times and destinations for forwarding this Roadside Unit supports. This object indicates the maximum rows which appears in the rsuReceivedMsgTable object. + 1.3.6.1.4.1.1206.4.2.18.5.1" +::= { rsuReceivedMsg 1 } + +-- 5.6.2 Received Messages Table +rsuReceivedMsgTable OBJECT-TYPE + SYNTAX SEQUENCE OF RsuReceivedMsgEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Contains the PSID being forwarded to a network host, the IP Address and port number of the destination host, as well as other configuration parameters as defined. + dynamic + 1.3.6.1.4.1.1206.4.2.18.5.2" +::= { rsuReceivedMsg 2 } + +rsuReceivedMsgEntry OBJECT-TYPE + SYNTAX RsuReceivedMsgEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " A row describing the RSU Message Forwarding types. + 1.3.6.1.4.1.1206.4.2.18.5.2.1" + INDEX { rsuReceivedMsgIndex } + ::= { rsuReceivedMsgTable 1 } + +RsuReceivedMsgEntry ::= SEQUENCE { + rsuReceivedMsgIndex RsuTableIndex, + rsuReceivedMsgPsid RsuPsidTC, + rsuReceivedMsgDestIpAddr DisplayString, + rsuReceivedMsgDestPort Integer32, + rsuReceivedMsgProtocol INTEGER, + rsuReceivedMsgRssi Integer32, + rsuReceivedMsgInterval Integer32, + rsuReceivedMsgDeliveryStart DateAndTime, + rsuReceivedMsgDeliveryStop DateAndTime, + rsuReceivedMsgStatus RowStatus, + rsuReceivedMsgSecure INTEGER, + rsuReceivedMsgAuthMsgInterval Integer32 } + +-- 5.6.2.1 Received Message Index +rsuReceivedMsgIndex OBJECT-TYPE + SYNTAX RsuTableIndex + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Message Forward Message Table Index. This value shall not exceed maxRsuReceivedMsgs. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.1" +::= { rsuReceivedMsgEntry 1 } + +-- 5.6.2.2 Received Message PSID +rsuReceivedMsgPsid OBJECT-TYPE + SYNTAX RsuPsidTC + MAX-ACCESS read-create + STATUS current + DESCRIPTION " The Provider Service Identifier (PSID) of a Message Received by the RSU via the V2X Interface to be forwarded. The current PSID assignments can be found at https://standards.ieee.org/products-services/regauth/psid/public.html. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.2" +::= { rsuReceivedMsgEntry 2 } + +-- 5.6.2.3 Received Message Destination Address +rsuReceivedMsgDestIpAddr OBJECT-TYPE + SYNTAX DisplayString (SIZE(0..64)) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Destination Server IP address to forward the message received by the RSU over the V2X Interface. For an IPv4 remote destination, this address can be represented as an IPv4 quad-dotted IP address, for example, 192.33.44.235. For IPv6 remote destination, this address can be represented as zero-compressed simplified IPv6 address, for example 2031:0:130F::9C0:876A:130B. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.3" +::= { rsuReceivedMsgEntry 3 } + +-- 5.6.2.4 Received Message Destination Port +rsuReceivedMsgDestPort OBJECT-TYPE + SYNTAX Integer32 (1024..65535) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Destination Server Port Number to forward the message received by the RSU over the V2X Interface. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.4" +::= { rsuReceivedMsgEntry 4 } + +-- 5.6.2.5 Received Message Destination Protocol +rsuReceivedMsgProtocol OBJECT-TYPE + SYNTAX INTEGER { other (1), udp (2) } + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Transport Protocol between RSU and Server to forward the message received by the RSU over the V2X Interface. The entire WSMP payload, including certificates and signature unless indicated by the rsuReceivedMsgSecure object, are to be forwarded. + + If udp is selected, the message contains the binary data (payload) defined by rsuReceivedMsgSecure. + + A SET to a value of 'other' shall return a badValue error. + + NOTE: If other is selected, this object allows for future extensions, possibly tcp. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.5" + DEFVAL { udp } +::= { rsuReceivedMsgEntry 5 } + +-- 5.6.2.6 Received Message Minimum Signal Strength +rsuReceivedMsgRssi OBJECT-TYPE + SYNTAX Integer32 (-100..-60) + UNITS "dBm" + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Minimum Received Signal Strength Level (in dbm units) of the SAE J2735 message received by the RSU over the V2X Interface before forwarding to the Server. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.6" +::= { rsuReceivedMsgEntry 6 } + +-- 5.6.2.7 Received Message Forwarding Interval +rsuReceivedMsgInterval OBJECT-TYPE + SYNTAX Integer32 (0..10) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Interval with which RSU forwards messages received by the RSU over the V2X Interface to Server. For example, a value of 3 indicates every 3rd message received is forwarded (33% of the messages received). A value of 0 disables the message forward for this particular entry. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.7" +::= { rsuReceivedMsgEntry 7 } + +-- 5.6.2.8 Received Message Forwarding Start Time +rsuReceivedMsgDeliveryStart OBJECT-TYPE + SYNTAX DateAndTime + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Start time for RSU to start forwarding SAE J2735 Messages to Server in UTC. DateAndTime is of length 8 octets. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.8" +::= { rsuReceivedMsgEntry 8 } + +-- 5.6.2.9 Received Message Forwarding Stop Time +rsuReceivedMsgDeliveryStop OBJECT-TYPE + SYNTAX DateAndTime + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Stop time for RSU to stop forwarding SAE J2735 Messages to Server in UTC. DateAndTime is of length 8 octets. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.9" +::= { rsuReceivedMsgEntry 9 } + +-- 5.6.2.10 Received Message Status +rsuReceivedMsgStatus OBJECT-TYPE + SYNTAX RowStatus + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Create (4) and destroy (6) row entry. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.10" +::= { rsuReceivedMsgEntry 10 } + +-- 5.6.2.11 Received Message Forward Secure Option +rsuReceivedMsgSecure OBJECT-TYPE + SYNTAX INTEGER (0..1) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " A value of 0 indicates the RSU is to forward only the WSM message payload without security headers. Specifically this means that either of the following is forwarded, depending on whether the message is signed (a) or unsigned (b): (a) Ieee1609Dot2Data.signedData.tbsData.payload.data.unsecuredData or (b) Ieee1609Dot2Data.unsecuredData. + + A value of 1 indicates the RSU is to forward the entire WSM including the security headers. Specifically this means that the entire Ieee1609Dot2Data frame is forwarded in COER format. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.11" +::= { rsuReceivedMsgEntry 11 } + +-- 5.6.2.12 Received Message Forward Secure Interval +rsuReceivedMsgAuthMsgInterval OBJECT-TYPE + SYNTAX Integer32 (0..10) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Interval with which the RSU authenticates messages received from a specific device over the V2X Interface and to be forwarded to the Server (as controlled by rsuDsrcFwdMsgInterval). If enabled, the RSU authenticates the first valid (e.g., as defined by rsuDsrcFwdRssi, rsuDsrcFwdDeliveryStart, rsuDsrcFwdDeliveryStop for this row) message received from a specific device. For a value of 4, the RSU then authenticates every 4th message (after the first message) for that specific device that is marked for forwarding (as determined by rsuDsrcFwdMsgInterval). A value of 0 disables authentication of message to be forward for this particular entry. + + For example, an RSU receives 12 messages that satisfies the criteria for this row (rsuDsrcFwdPsid, rsuDsrcFwdRssi, rsuDsrcFwdDeliveryStart, rsuDsrcFwdDeliveryStop). Messages 1, 2, 5, 6, 7, 10 and 12 are from device A and messages 3, 4, 8, 9 and 11 are from device B. Assuming rsuDsrcFwdMsgInterval has a value of 2, only messages 1, 3, 5, 7, 9, and 11 are 'marked' for forwarding. Of these messages, only messages 1 (the first message from device A), 3 (the first message from device B), 7 (the 2nd message from device A after the first message), and 11 (the 2nd message from device B after the first message) are authenticated. + 1.3.6.1.4.1.1206.4.2.18.5.2.1.12" +::= { rsuReceivedMsgEntry 12 } + +-- 5.7 GNSS Output +rsuGnssOutput OBJECT IDENTIFIER ::= { rsu 6 } + +-- 5.7.1 GNSS Output Port +rsuGnssOutputPort OBJECT-TYPE + SYNTAX Integer32 (1024..65535) + MAX-ACCESS read-write + STATUS current + DESCRIPTION " GNSS Out External Server Port Number. + 1.3.6.1.4.1.1206.4.2.18.6.1" + DEFVAL { 5115 } +::= { rsuGnssOutput 1 } + +-- 5.7.2 GNSS Output Address +rsuGnssOutputAddress OBJECT-TYPE + SYNTAX DisplayString (SIZE(0..64)) + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Remote host address to which to transmit the GNSS string. For an IPv4 remote destination, this address can be represented as an IPv4 quad-dotted IP address, for example, 192.33.44.235. For IPv6 remote destination, this address can be represented as zero-compressed simplified IPv6 address, for example 2031:0:130F::9C0:876A:130B. + 1.3.6.1.4.1.1206.4.2.18.6.2" +::= { rsuGnssOutput 2 } + +-- 5.7.3 GNSS Output Interface Description +rsuGnssOutputInterface OBJECT-TYPE + SYNTAX DisplayString (SIZE(0..100)) + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Local interface on the RSU which to output the GNSS string. E.g., eth0, eth1. + 1.3.6.1.4.1.1206.4.2.18.6.3" +::= { rsuGnssOutput 3 } + +-- 5.7.4 GNSS Output Interval +rsuGnssOutputInterval OBJECT-TYPE + SYNTAX Integer32 (0..18000) + UNITS "second" + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Interval at which to transmit the rsuGNSSOutputString value to the remote host in seconds. A value of 0 indicates the transmission is disabled. + 1.3.6.1.4.1.1206.4.2.18.6.4" + DEFVAL { 1 } +::= { rsuGnssOutput 4 } + +-- 5.7.5 GNSS Data Output +rsuGnssOutputString OBJECT-TYPE + SYNTAX DisplayString (SIZE(0..100)) + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Contains NMEA 0183 GPGGA or GNGGA output string including the $ starting character and the ending . + 1.3.6.1.4.1.1206.4.2.18.6.5" +::= { rsuGnssOutput 5 } + +-- 5.7.6 GNSS Reported Latitude +rsuGnssLat OBJECT-TYPE + SYNTAX Integer32 (-900000000..900000001) + UNITS "tenth of a microdegree" + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Contains the actual GNSS latitude for validation of reference GNSS latitude (rsuLocationLat) in 10^-7 degrees. The value 900000001 represents unknown. + 1.3.6.1.4.1.1206.4.2.18.6.6" + DEFVAL { 900000001 } +::= { rsuGnssOutput 6 } + +-- 5.7.7 GNSS Reported Longitude +rsuGnssLon OBJECT-TYPE + SYNTAX Integer32 (-1800000000..1800000001) + UNITS "tenth of a microdegree" + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Contains the actual GNSS longitude for validation of reference GNSS longitude (rsuLocationLong) in 10^-7 degrees. The value 1800000001 represents unknown. + 1.3.6.1.4.1.1206.4.2.18.6.7" + DEFVAL { 1800000001 } +::= { rsuGnssOutput 7 } + +-- 5.7.8 GNSS Reported Elevation +rsuGnssElv OBJECT-TYPE + SYNTAX Integer32 (-100000..1000001) + UNITS "centimeter" + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Contains the actual GNSS elevation for validation of reference GNSS elevation (rsuLocationElv) in centimeters above the reference ellipsoid as defined by the WGS-84. The value of 1000001 represents unknown. + 1.3.6.1.4.1.1206.4.2.18.6.8" + DEFVAL { 1000001 } +::= { rsuGnssOutput 8 } + +-- 5.7.9 GNSS Allowable Location Deviation +rsuGnssMaxDeviation OBJECT-TYPE + SYNTAX Integer32 (0..20000) + UNITS "meter" + MAX-ACCESS read-write + STATUS current + DESCRIPTION " Contains the maximum allowable deviation between the actual 2D GNSS coordinates of the RSU (rsuGnssLat, rsuGnssLon) and the reference GNSS coordinates (rsuLocationLat, rsuLocationLon). A value of 0 disables this feature. + 1.3.6.1.4.1.1206.4.2.18.6.9" +::= { rsuGnssOutput 9 } + +-- 5.7.10 GNSS Location Deviation +rsuLocationDeviation OBJECT-TYPE + SYNTAX Integer32 (0..20001) + UNITS "meter" + MAX-ACCESS read-only + STATUS current + DESCRIPTION " The 2D deviation, in centimeters, between the reported GNSS coordinates (rsuGnssLat, rsuGnssLon) and the RSU's reference location (rsuLocationLat, rsuLocationLon). + Values of 0 to 19,999 provides a range from 0 centimeters to 19,999 meters. The value of 20,000 represents 20,000 meters or more. The value of 200001 represents unknown. + 1.3.6.1.4.1.1206.4.2.18.6.10" +::= { rsuGnssOutput 10 } + +-- 5.7.11 RSU Position Error +rsuGnssPositionError OBJECT-TYPE + SYNTAX Integer32 (0..200001) + UNITS "tenth of a meter" + MAX-ACCESS read-only + STATUS current + DESCRIPTION " Contains the estimated average position error in centimeters, at 67% confidence ((1) standard deviation). Values of 0 to 200,000 provides a range from 0 meters to 20,000 meters. The value of 200,001 represents unknown. + 1.3.6.1.4.1.1.1206.4.2.18.6.11" + DEFVAL { 200001 } +::= { rsuGnssOutput 11 } + +-- 5.8 Interface Log +rsuInterfaceLog OBJECT IDENTIFIER ::= { rsu 7 } + +-- 5.8.1 Maximum Number of Interface Logs +maxRsuInterfaceLogs OBJECT-TYPE + SYNTAX Integer32 (1..255) + MAX-ACCESS read-only + STATUS current + DESCRIPTION " The maximum number of active Interface Logs this Roadside Unit supports. This object indicates the maximum rows which appears in the rsuInterfaceLogTable object. + 1.3.6.1.4.1.1206.4.2.18.7.1" +::= { rsuInterfaceLog 1 } + +-- 5.8.2 Interface Log Table +rsuInterfaceLogTable OBJECT-TYPE + SYNTAX SEQUENCE OF RsuInterfaceLogEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Provides configuration information for capturing log files for a communication interface. The index represents the interface for which these configurations apply. + dynamic + 1.3.6.1.4.1.1206.4.2.18.7.2" +::= { rsuInterfaceLog 2 } + +rsuInterfaceLogEntry OBJECT-TYPE + SYNTAX RsuInterfaceLogEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " A row describing RSU Interface Log. + 1.3.6.1.4.1.1206.4.2.18.7.2.1" + INDEX { rsuIfaceLogIndex } +::= {rsuInterfaceLogTable 1 } + +RsuInterfaceLogEntry ::= SEQUENCE { + rsuIfaceLogIndex RsuTableIndex, + rsuIfaceGenerate INTEGER, + rsuIfaceMaxFileSize Integer32, + rsuIfaceMaxFileTime Integer32, + rsuIfaceLogByDir INTEGER, + rsuIfaceName DisplayString, + rsuIfaceStoragePath DisplayString, + rsuIfaceLogName DisplayString, + rsuIfaceLogStart DateAndTime, + rsuIfaceLogStop DateAndTime, + rsuIfaceLogOptions BITS, + rsuIfaceLogStatus RowStatus } + +-- 5.8.2.1 Interface Log Index +rsuIfaceLogIndex OBJECT-TYPE + SYNTAX RsuTableIndex + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION " Interface Logging Index. This value shall not exceed maxRsuInterfaceLogs. + 1.3.6.1.4.1.1206.4.2.18.7.2.1.1" +::= { rsuInterfaceLogEntry 1 } + +-- 5.8.2.2 Interface Log Enable +rsuIfaceGenerate OBJECT-TYPE + SYNTAX INTEGER { off (0), + on (1) } + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Set this bit to Enable / Disable interface logging for this row. 1 is to enable interface logging. + 1.3.6.1.4.1.1206.4.2.18.7.2.1.2" +::= { rsuInterfaceLogEntry 2 } + +-- 5.8.2.3 Interface Log Maximum File Size +rsuIfaceMaxFileSize OBJECT-TYPE + SYNTAX Integer32 (1..40) + UNITS "megabyte" + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Maximum Interface Log File Size in megabytes, default is 5. + 1.3.6.1.4.1.1206.4.2.18.7.2.1.3" + DEFVAL { 5 } +::= { rsuInterfaceLogEntry 3 } + +-- 5.8.2.4 Interface Log Maximum Collection Time +rsuIfaceMaxFileTime OBJECT-TYPE + SYNTAX Integer32 (1..48) + UNITS "hour" + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Maximum Collection time for Interface Logging in hours, default is 24. + 1.3.6.1.4.1.1206.4.2.18.7.2.1.4" +::= { rsuInterfaceLogEntry 4 } + +-- 5.8.2.5 Interface Log Direction Separation +rsuIfaceLogByDir OBJECT-TYPE + SYNTAX INTEGER { inboundOnly (1), + outboundOnly (2), + biSeparate (3), + biCombined (4) } + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Sets which direction of communications traffic to capture in the interface data log. biSeparate (3) indicates both directions are to be captured but in separate interface data log files, while biCombined (4) indicates both directions are to be captured in the same interface data log file. + 1.3.6.1.4.1.1206.4.2.18.7.2.1.5" +::= { rsuInterfaceLogEntry 5 } + +-- 5.8.2.6 Interface Name +rsuIfaceName OBJECT-TYPE + SYNTAX DisplayString (SIZE(0..127)) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Identifies the name of the interface for which the logs defined by this row are to be managed. E.g., wlan0, gnss, dsrc. + 1.3.6.1.4.1.1206.4.2.18.7.2.1.6" +::= { rsuInterfaceLogEntry 6 } + +-- 5.8.2.7 Interface Log Storage Path +rsuIfaceStoragePath OBJECT-TYPE + SYNTAX DisplayString (SIZE(1..255)) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Indicates the storage path of the interface file logs. The path indicated here shall be relative to the base directory (see rsuSysDir). The base directory is specified by the string '/' (one forward slash). A subdirectory from the base may be specified by the string '/subdir'. + 1.3.6.1.4.1.1206.4.2.18.7.2.1.7" +::= { rsuInterfaceLogEntry 7 } + +-- 5.8.2.8 Interface Log Name +rsuIfaceLogName OBJECT-TYPE + SYNTAX DisplayString (SIZE(12..172)) + MAX-ACCESS read-create + STATUS current + DESCRIPTION " Indicates the filename used when storing new interface data logs. This parameter shall be in the format ___