From 2b8a1dfd7b5e7c919ea9b70740917a984b6ae04f Mon Sep 17 00:00:00 2001 From: ipatini Date: Mon, 7 Mar 2022 11:14:32 +0200 Subject: [PATCH 01/76] EMS: Baguette Server, Baguette Client: Fixed bug that prevented giving up EMS client recovery, after max retries have been reached. --- event-management/README-for-TESTING.md | 28 +++++++++----- .../baguette/client/CommandExecutor.java | 5 +++ .../plugin/recovery/SelfHealingPlugin.java | 15 +++++--- .../baguette/server/ClientShellCommand.java | 38 +++++++++++++++++++ 4 files changed, 71 insertions(+), 15 deletions(-) diff --git a/event-management/README-for-TESTING.md b/event-management/README-for-TESTING.md index ac63e6ece..54db44881 100644 --- a/event-management/README-for-TESTING.md +++ b/event-management/README-for-TESTING.md @@ -723,7 +723,8 @@ We distinguish between monitoring topologies: ``` *

EMS server log: Aggregator give up message

* ``` - ......................... BUG: No Give up message + e.m.e.b.server.ClientShellCommand : #00000--> Client notification: CMD=RECOVERY, ARGS=GIVE_UP node_3866738cb0f4_2002 @ 192.168.16.4 + e.m.e.b.server.ClientShellCommand : #00000--> Client Recovery Notification: GIVE_UP: node_3866738cb0f4_2002 @ 192.168.16.4 ``` Note: EMS client disconnection from EMS server will also be logged in EMS server logs, but no recovery action will be taken by EMS server. @@ -748,8 +749,9 @@ We distinguish between monitoring topologies: at sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:213) at sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:293) at java.lang.Thread.run(Thread.java:748) - - SelfHealingPlugin: Retry #0: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 + ......................... + ......................... + SelfHealingPlugin: Retry #3: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.16.4, port=22, username=ubuntu Connecting to server... SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=cecab3d4-4c09-43b1-b6fa-3534d37bbc8f, zone-id=IMU-ZONE, address=192.168.16.4,......................... @@ -762,7 +764,9 @@ We distinguish between monitoring topologies: at java.lang.Thread.run(Thread.java:748) ``` ``` - ......................... BUG: No Give up message + SelfHealingPlugin: Max retries reached. No more recovery retries for node: id=node_3866738cb0f4_2002, address=192.168.16.4 + SelfHealingPlugin: cancelRecoveryTask(): Cancelled recovery task for Node: id=node_3866738cb0f4_2002, address=192.168.16.4 + NOTIFY-X: RECOVERY GIVE_UP node_3866738cb0f4_2002 @ 192.168.16.4 ``` * ***Normal nodes that operate***, for logs about EMS client leaving cluster, and NO logs about recovery actions or EMS client joining back. @@ -920,7 +924,7 @@ We distinguish between monitoring topologies: **After Application deployment...** - * Terminate the VM of the Aggregator's + * Terminate the VM of the Aggregator **Next, check the logs of:** @@ -934,11 +938,12 @@ We distinguish between monitoring topologies: ``` *

EMS server log: New Aggregator queries for node's credentials

* ``` - e.m.e.b.server.ClientShellCommand : #00004==> PUSH : {"random":"4abf9ae2-b7fc-4e8c-b6d9-464623d1b05f","zone-id":"IMU-ZONE","address":"192.168.16.4","provider":"AWS","name":"vm2","ssh.port":"22","ssh.username":"ubuntu","ssh.password":"ubuntu",......................... + e.m.e.b.server.ClientShellCommand : #00004==> PUSH : {"random":"4abf9ae2-b7fc-4e8c-b6d9-464623d1b05f","zone-id":"IMU-ZONE","address":"192.168.16.4",......................... ``` *

EMS server log: New Aggregator give up message

* ``` - ......................... BUG: No give up message + e.m.e.b.server.ClientShellCommand : #00004--> Client notification: CMD=RECOVERY, ARGS=GIVE_UP node_3866738cb0f4_2002 @ 192.168.16.4 + e.m.e.b.server.ClientShellCommand : #00004--> Client Recovery Notification: GIVE_UP: node_3866738cb0f4_2002 @ 192.168.16.4 ``` Note: Aggregator disconnection from EMS server will also be logged in EMS server logs, but no recovery action will be taken by EMS server. @@ -994,8 +999,9 @@ We distinguish between monitoring topologies: at sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:213) at sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:293) at java.lang.Thread.run(Thread.java:748) - - SelfHealingPlugin: Retry #0: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 + ......................... + ......................... + SelfHealingPlugin: Retry #3: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.16.4, port=22, username=ubuntu Connecting to server... SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=4abf9ae2-b7fc-4e8c-b6d9-464623d1b05f, zone-id=IMU-ZONE, address=192.168.16.4,......................... @@ -1008,7 +1014,9 @@ We distinguish between monitoring topologies: at java.lang.Thread.run(Thread.java:748) ``` ``` - ......................... BUG: No give up message + SelfHealingPlugin: Max retries reached. No more recovery retries for node: id=node_3866738cb0f4_2002, address=192.168.16.4 + SelfHealingPlugin: cancelRecoveryTask(): Cancelled recovery task for Node: id=node_3866738cb0f4_2002, address=192.168.16.4 + NOTIFY-X: RECOVERY GIVE_UP node_3866738cb0f4_2002 @ 192.168.16.4 ``` * ***Normal nodes that operate***, for log messages about, (i) EMS client leaving cluster, (ii) Aggregator election, but NO logs about recovery actions, or EMS client joining back to cluster. diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/CommandExecutor.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/CommandExecutor.java index dc6ffde6a..4cc1c1679 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/CommandExecutor.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/CommandExecutor.java @@ -1243,6 +1243,11 @@ public class CommandExecutor { return ! isAggregator(); } + public void notifyEmsServer(String message) { + log.info("NOTIFY-X: {}", message); + out.println("-NOTIFY-X: "+message); + } + /*private static class StreamGobbler implements Runnable { private InputStream inputStream1; private InputStream inputStream2; diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java index 33be7c8fe..3720cef30 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java @@ -52,6 +52,7 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve private final NodeInfoHelper nodeInfoHelper; final static String SELF_HEALING_RECOVERY_FAILED = "SELF_HEALING_RECOVERY_FAILED"; + final static String SELF_HEALING_RECOVERY_GIVE_UP = "SELF_HEALING_RECOVERY_GIVE_UP"; final static String SELF_HEALING_RECOVERY_COMPLETED = "SELF_HEALING_RECOVERY_COMPLETED"; private boolean started; @@ -269,20 +270,24 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve final RecoveryTask recoveryTask = applicationContext.getBean(recoveryTaskClass); if (nodeInfo!=null && nodeInfo.size()>0) recoveryTask.setNodeInfo(nodeInfo); - AtomicInteger retries = new AtomicInteger(0); + final AtomicInteger retries = new AtomicInteger(0); ScheduledFuture future = taskScheduler.scheduleWithFixedDelay(() -> { try { log.info("SelfHealingPlugin: Retry #{}: Recovering node: id={}, address={}", retries.get(), nodeId, nodeAddress); recoveryTask.runNodeRecovery(); //NOTE: 'recoveryTask.runNodeRecovery()' must send SELF_HEALING_RECOVERY_COMPLETED or _FAILED event - if (retries.getAndIncrement() > clientRecoveryMaxRetries) { - log.warn("SelfHealingPlugin: Max retries reached. No more recovery retries for node: id={}, address={}", nodeId, nodeAddress); - cancelRecoveryTask(nodeId, nodeAddress, true); - } } catch (Exception e) { log.error("SelfHealingPlugin: EXCEPTION while recovering node: node-info={} -- Exception: ", recoveryTask.getNodeInfo(), e); eventBus.send(SELF_HEALING_RECOVERY_FAILED, nodeAddress); } + if (retries.getAndIncrement() >= clientRecoveryMaxRetries) { + log.warn("SelfHealingPlugin: Max retries reached. No more recovery retries for node: id={}, address={}", nodeId, nodeAddress); + cancelRecoveryTask(nodeId, nodeAddress, true); + eventBus.send(SELF_HEALING_RECOVERY_GIVE_UP, nodeAddress); + + // Notify EMS server about giving up recovery due to permanent failure + commandExecutor.notifyEmsServer("RECOVERY GIVE_UP "+nodeId+" @ "+nodeAddress); + } }, Instant.now().plusMillis(clientRecoveryDelay), Duration.ofMillis(clientRecoveryRetryDelay)); waitingTasks.put(nodeAddress, future); log.info("SelfHealingPlugin: createRecoveryTask(): Created recovery task for Node: id={}, address={}", nodeId, nodeAddress); diff --git a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/ClientShellCommand.java b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/ClientShellCommand.java index 7d26f99b5..ed7d40609 100644 --- a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/ClientShellCommand.java +++ b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/ClientShellCommand.java @@ -236,6 +236,44 @@ public class ClientShellCommand implements Command, Runnable, SessionAware { log.info("{}--> Client status changed: {} --> {}", getId(), clientNodeStatus, newNodeStatus); if (StringUtils.isNotBlank(newNodeStatus) && ! StringUtils.equals(clientNodeStatus, newNodeStatus)) this.clientNodeStatus = newNodeStatus; + } else if (line.startsWith("-NOTIFY-X:")) { + String message = line.substring("-NOTIFY-X:".length()).trim(); + String[] part = message.split(" ", 2); + String command = part[0].trim(); + String args = part.length>1 ? part[1] : null; + log.info("{}--> Client notification: CMD={}, ARGS={}", getId(), command, args); + + if ("DEBUG".equalsIgnoreCase(command)) { + log.debug("{}--> {}", getId(), args); + } else + if ("INFO".equalsIgnoreCase(command)) { + log.info("{}--> {}", getId(), args); + } else + if ("WARN".equalsIgnoreCase(command)) { + log.warn("{}--> {}", getId(), args); + } else + if ("ERROR".equalsIgnoreCase(command)) { + log.error("{}--> {}", getId(), args); + } else + if ("RECOVERY".equalsIgnoreCase(command)) { + args = args==null ? "" : args; + part = args.split(" ", 2); + String notificationType = part[0].trim(); + String clientData = part.length>1 ? part[1] : null; + if (StringUtils.isNotBlank(notificationType) && StringUtils.isNotBlank(clientData)) { + log.info("{}--> Client Recovery Notification: {}: {}", getId(), notificationType, clientData); + if ("GIVE_UP".equalsIgnoreCase(notificationType)) + eventBus.send("CLIENT_NOTIFICATION_RECOVERY_GIVE_UP", clientData, "Client_"+getId()); + else + log.warn("{}--> UNKNOWN Client Recovery Notification: {}", getId(), args); + } else { + log.warn("{}--> INVALID Client Recovery Notification: {}", getId(), args); + } + } else + { + log.warn("{}--> UNKNOWN Client Notification type: {}", getId(), message); + } + } else if (line.startsWith("-CLIENT-PROPERTY-CHANGE:")) { String[] part = line.substring("-CLIENT-PROPERTY-CHANGE:".length()).trim().split(" ", 2); String propertyName = part[0]; -- GitLab From b3a815e079fbfbf879351df76a3fe50c9ebad814 Mon Sep 17 00:00:00 2001 From: ipatini Date: Mon, 7 Mar 2022 14:23:52 +0200 Subject: [PATCH 02/76] EMS: Baguette Server, Baguette Client, Common: Fixed bug that prevented giving up Netdata agent recovery, after max retries have been reached. Updated README-for-TESTING.md --- event-management/README-for-TESTING.md | 89 ++++++------------- .../plugin/recovery/SelfHealingPlugin.java | 47 +++++----- .../plugin/recovery/ShellRecoveryTask.java | 2 +- .../plugin/recovery/VmNodeRecoveryTask.java | 2 +- .../collector/netdata/NetdataCollector.java | 70 +++++++++------ .../netdata/NetdataCollectorProperties.java | 3 +- .../common/recovery/RecoveryConstant.java | 19 ++++ 7 files changed, 115 insertions(+), 117 deletions(-) create mode 100644 event-management/common/src/main/java/eu/melodic/event/common/recovery/RecoveryConstant.java diff --git a/event-management/README-for-TESTING.md b/event-management/README-for-TESTING.md index 54db44881..af68db9b7 100644 --- a/event-management/README-for-TESTING.md +++ b/event-management/README-for-TESTING.md @@ -986,7 +986,7 @@ We distinguish between monitoring topologies: SEND: SERVER-GET-NODE-SSH-CREDENTIALS 192.168.16.4 SelfHealingPlugin: createRecoveryTask(): Created recovery task for Node: id=node_3866738cb0f4_2002, address=192.168.16.4 ``` - *

New Aggregator log: Failing recovery actions of old Aggregator and give up message

* + *

New Aggregator log: Failing recovery actions of old Aggregator

* ``` SelfHealingPlugin: Retry #0: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.16.4, port=22, username=ubuntu @@ -1013,6 +1013,7 @@ We distinguish between monitoring topologies: at sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:293) at java.lang.Thread.run(Thread.java:748) ``` + *

New Aggregator log: Recovery actions Give Up message

* ``` SelfHealingPlugin: Max retries reached. No more recovery retries for node: id=node_3866738cb0f4_2002, address=192.168.16.4 SelfHealingPlugin: cancelRecoveryTask(): Cancelled recovery task for Node: id=node_3866738cb0f4_2002, address=192.168.16.4 @@ -1064,7 +1065,6 @@ We distinguish between monitoring topologies: Collectors::Netdata: Collecting data from url: http://192.168.96.2:19999/api/v1/allmetrics?format=json Collectors::Netdata: Exception while collecting metrics from node: 192.168.96.2, #errors=3, exception: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://192.168.96.2:19999/api/v1/allmetrics": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused) -> java.net.ConnectException: Connection refused (Connection refused) Collectors::Netdata: Too many consecutive errors occurred while attempting to collect metrics from node: 192.168.96.2, num-of-errors=3 - Collectors::Netdata: Will pause metrics collection from node for 60 seconds: 192.168.96.2 ``` *

Aggregator log: Requesting RL node's credentials

* ``` @@ -1088,11 +1088,14 @@ We distinguish between monitoring topologies: VmNodeRecoveryTask: disconnectFromNode(): Disconnecting from node: address=192.168.96.2, port=22, username=ubuntu Stopping SSH client... SSH client stopped + Collectors::Netdata: Resuming collection from Node: 192.168.96.2 Collectors::Netdata: Collecting metrics from local node... Collectors::Netdata: Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json Collectors::Netdata: Metrics: extracted=0, published=0, failed=0 Collectors::Netdata: Collecting metrics from remote nodes (without EMS client): [192.168.96.2] - Collectors::Netdata: Node is in ignore list: 192.168.96.2 + Collectors::Netdata: Collecting data from url: http://192.168.96.2:19999/api/v1/allmetrics?format=json + Collectors::Netdata: Metrics: extracted=0, published=0, failed=0 + SelfHealingPlugin: cancelRecoveryTask(): Cancelled recovery task for Node: id=null, address=192.168.96.2 OUT> Last login: Sat Feb 12 10:40:09 2022 from 172.29.0.4 OUT> OUT> pwd @@ -1121,27 +1124,6 @@ We distinguish between monitoring topologies: ``` *

Aggregator log: Successful metrics collection from RL node's Netdata agent

* ``` - Collectors::Netdata: Collecting metrics from local node... - Collectors::Netdata: Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json - Collectors::Netdata: Metrics: extracted=0, published=0, failed=0 - Collectors::Netdata: Collecting metrics from remote nodes (without EMS client): [192.168.96.2] - Collectors::Netdata: Node is in ignore list: 192.168.96.2 - - Collectors::Netdata: Collecting metrics from local node... - Collectors::Netdata: Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json - Collectors::Netdata: Metrics: extracted=0, published=0, failed=0 - Collectors::Netdata: Collecting metrics from remote nodes (without EMS client): [192.168.96.2] - Collectors::Netdata: Node is in ignore list: 192.168.96.2 - - Collectors::Netdata: Collecting metrics from local node... - Collectors::Netdata: Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json - Collectors::Netdata: Metrics: extracted=0, published=0, failed=0 - Collectors::Netdata: Collecting metrics from remote nodes (without EMS client): [192.168.96.2] - Collectors::Netdata: Node is in ignore list: 192.168.96.2 - - Collectors::Netdata: Resumed metrics collection from node: 192.168.96.2 - SelfHealingPlugin: cancelRecoveryTask(): Cancelled recovery task for Node: id=null, address=192.168.96.2 - Collectors::Netdata: Collecting metrics from local node... Collectors::Netdata: Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json Collectors::Netdata: Metrics: extracted=0, published=0, failed=0 @@ -1187,7 +1169,8 @@ We distinguish between monitoring topologies: ``` *

EMS server log: Aggregator give up message

* ``` - ......................... BUG: No Give up message + e.m.e.b.server.ClientShellCommand : #00000--> Client notification: CMD=RECOVERY, ARGS=GIVE_UP null @ 192.168.96.2 + e.m.e.b.server.ClientShellCommand : #00000--> Client Recovery Notification: GIVE_UP: null @ 192.168.96.2 ``` * ***Aggregator***, for logs reporting (i) connection failures to a Netdata agent, (ii) a number of failed attempts to connect to VM, and (iii) a recovery give up message. *

Aggregator log: Failed metric collection attempts from a RL node's Netdata agent

* @@ -1213,19 +1196,17 @@ We distinguish between monitoring topologies: Collectors::Netdata: Collecting data from url: http://192.168.96.2:19999/api/v1/allmetrics?format=json Collectors::Netdata: Exception while collecting metrics from node: 192.168.96.2, #errors=3, exception: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://192.168.96.2:19999/api/v1/allmetrics": connect timed out; nested exception is java.net.SocketTimeoutException: connect timed out -> java.net.SocketTimeoutException: connect timed out Collectors::Netdata: Too many consecutive errors occurred while attempting to collect metrics from node: 192.168.96.2, num-of-errors=3 - Collectors::Netdata: Will pause metrics collection from node for 60 seconds: 192.168.96.2 ``` *

Aggregator log: Requesting RL node's credentials

* ``` SEND: SERVER-GET-NODE-SSH-CREDENTIALS 192.168.96.2 SelfHealingPlugin: createRecoveryTask(): Created recovery task for Node: id=null, address=192.168.96.2 ``` - *

Aggregator log: Netdata agent recovery actions

* + *

Aggregator log: Netdata agent (failing) recovery actions

* ``` SelfHealingPlugin: Retry #0: Recovering node: id=null, address=192.168.96.2 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.96.2, port=22, username=ubuntu Connecting to server... - Heartbeat 1645015873205 SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=4b676a58-e00e-4ddf-a21e-b1c0d1382cd6, zone-id=IMU-ZONE, address=192.168.96.2, provider=AWS,......................... java.net.NoRouteToHostException: No route to host at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) @@ -1241,47 +1222,30 @@ We distinguish between monitoring topologies: Collecting metrics from remote nodes (without EMS client): [192.168.96.2] Node is in ignore list: 192.168.96.2 ......................... - Collecting metrics from local node... - Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json - Metrics: extracted=0, published=0, failed=0 - Collecting metrics from remote nodes (without EMS client): [192.168.96.2] - Node is in ignore list: 192.168.96.2 - - Resumed metrics collection from node: 192.168.96.2 - ncelRecoveryTask(): Cancelled recovery task for Node: id=null, address=192.168.96.2 - - Collecting metrics from local node... - Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json - Metrics: extracted=0, published=0, failed=0 - Collecting metrics from remote nodes (without EMS client): [192.168.96.2] - Collecting data from url: http://192.168.96.2:19999/api/v1/allmetrics?format=json - Exception while collecting metrics from node: 192.168.96.2, #errors=1, exception: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://192.168.96.2:19999/api/v1/allmetrics": No route to host (Host unreachable); nested exception is java.net.NoRouteToHostException: No route to host (Host unreachable) -> java.net.NoRouteToHostException: No route to host (Host unreachable) - - Collecting metrics from local node... - Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json - Metrics: extracted=0, published=0, failed=0 - Collecting metrics from remote nodes (without EMS client): [192.168.96.2] - Collecting data from url: http://192.168.96.2:19999/api/v1/allmetrics?format=json - Exception while collecting metrics from node: 192.168.96.2, #errors=2, exception: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://192.168.96.2:19999/api/v1/allmetrics": No route to host (Host unreachable); nested exception is java.net.NoRouteToHostException: No route to host (Host unreachable) -> java.net.NoRouteToHostException: No route to host (Host unreachable) - - Collecting metrics from local node... - Collecting data from url: http://127.0.0.1:19999/api/v1/allmetrics?format=json - Metrics: extracted=0, published=0, failed=0 - Collecting metrics from remote nodes (without EMS client): [192.168.96.2] - Collecting data from url: http://192.168.96.2:19999/api/v1/allmetrics?format=json - Exception while collecting metrics from node: 192.168.96.2, #errors=3, exception: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://192.168.96.2:19999/api/v1/allmetrics": No route to host (Host unreachable); nested exception is java.net.NoRouteToHostException: No route to host (Host unreachable) -> java.net.NoRouteToHostException: No route to host (Host unreachable) - Too many consecutive errors occurred while attempting to collect metrics from node: 192.168.96.2, num-of-errors=3 - Will pause metrics collection from node for 60 seconds: 192.168.96.2 ......................... + SelfHealingPlugin: Retry #3: Recovering node: id=null, address=192.168.96.2 + VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.96.2, port=22, username=ubuntu + Connecting to server... + SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=4b676a58-e00e-4ddf-a21e-b1c0d1382cd6, zone-id=IMU-ZONE, address=192.168.96.2, provider=AWS,......................... + java.net.NoRouteToHostException: No route to host + at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) + at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:252) + at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:198) + at sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:213) + at sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:293) + at java.lang.Thread.run(Thread.java:748) ``` + *

Aggregator log: Netdata agent recovery Give Up message

* ``` - ......................... BUG: No Give up message + SelfHealingPlugin: Max retries reached. No more recovery retries for node: id=null, address=192.168.96.2 + SelfHealingPlugin: cancelRecoveryTask(): Cancelled recovery task for Node: id=null, address=192.168.96.2 + NOTIFY-X: RECOVERY GIVE_UP null @ 192.168.96.2 ``` * ***Normal nodes (that operate)***, for NO logs indicating connection failures or recovery actions. -**B.7) Successful recovery of Netdata agent in a clustered Normal node (including Aggregator)** +**B.7) Successful recovery of local Netdata agent, in a clustered Normal node (including Aggregator)** > Test Case Quick Notes: > - Kill Netdata agent of any Normal node. @@ -1351,10 +1315,9 @@ We distinguish between monitoring topologies: ------ -## Limitations and Bugs +## Limitations * Clustering is never used for 2-level monitoring topologies. -* ***Bug:*** EMS clients do not give up after many recovery failures. -- No message is sent to EMS server for failed recoveries. * When no Normal nodes (and hence no Aggregator) exist in a cluster, no one will collect metrics from the (orphan) RL nodes. * When no Normal nodes (and hence no Aggregator) exist in a cluster, no one will recover the (orphan) RL nodes. * If EMS server fails no one will recover it. diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java index 3720cef30..816c8191b 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java @@ -12,6 +12,7 @@ package eu.melodic.event.baguette.client.plugin.recovery; import eu.melodic.event.baguette.client.BaguetteClientProperties; import eu.melodic.event.baguette.client.CommandExecutor; import eu.melodic.event.baguette.client.collector.netdata.NetdataCollector; +import eu.melodic.event.common.recovery.RecoveryConstant; import eu.melodic.event.util.EventBus; import eu.melodic.event.util.PasswordUtil; import eu.melodic.event.util.Plugin; @@ -51,10 +52,6 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve private final PasswordUtil passwordUtil; private final NodeInfoHelper nodeInfoHelper; - final static String SELF_HEALING_RECOVERY_FAILED = "SELF_HEALING_RECOVERY_FAILED"; - final static String SELF_HEALING_RECOVERY_GIVE_UP = "SELF_HEALING_RECOVERY_GIVE_UP"; - final static String SELF_HEALING_RECOVERY_COMPLETED = "SELF_HEALING_RECOVERY_COMPLETED"; - private boolean started; private final HashMap> waitingTasks = new HashMap<>(); @@ -83,8 +80,8 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve eventBus.subscribe(CommandExecutor.EVENT_CLUSTER_NODE_ADDED, this); eventBus.subscribe(CommandExecutor.EVENT_CLUSTER_NODE_REMOVED, this); - eventBus.subscribe(NetdataCollector.NETDATA_NODE_PAUSED, this); - eventBus.subscribe(NetdataCollector.NETDATA_NODE_RESUMED, this); + eventBus.subscribe(NetdataCollector.NETDATA_NODE_OK, this); + eventBus.subscribe(NetdataCollector.NETDATA_NODE_FAILED, this); log.info("SelfHealingPlugin: Started"); } @@ -96,8 +93,8 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve eventBus.unsubscribe(CommandExecutor.EVENT_CLUSTER_NODE_ADDED, this); eventBus.unsubscribe(CommandExecutor.EVENT_CLUSTER_NODE_REMOVED, this); - eventBus.unsubscribe(NetdataCollector.NETDATA_NODE_PAUSED, this); - eventBus.unsubscribe(NetdataCollector.NETDATA_NODE_RESUMED, this); + eventBus.unsubscribe(NetdataCollector.NETDATA_NODE_OK, this); + eventBus.unsubscribe(NetdataCollector.NETDATA_NODE_FAILED, this); // Cancel all waiting recovery tasks waitingTasks.forEach((nodeAddress,future) -> { @@ -123,13 +120,13 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve } else // Self-healing for Netdata agents - if (NetdataCollector.NETDATA_NODE_PAUSED.equals(topic)) { + if (NetdataCollector.NETDATA_NODE_FAILED.equals(topic)) { log.debug("SelfHealingPlugin: onMessage(): NETDATA NODE PAUSED: message={}", message); - processNetdataNodePausedEvent(message); + processNetdataNodeFailedEvent(message); } else - if (NetdataCollector.NETDATA_NODE_RESUMED.equals(topic)) { + if (NetdataCollector.NETDATA_NODE_OK.equals(topic)) { log.debug("SelfHealingPlugin: onMessage(): NETDATA NODE RESUMED: message={}", message); - processNetdataNodeResumedEvent(message); + processNetdataNodeOkEvent(message); } else // Unsupported message @@ -182,18 +179,18 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve // ------------------------------------------------------------------------ - private void processNetdataNodePausedEvent(Object message) { - log.debug("SelfHealingPlugin: processNetdataNodePausedEvent(): BEGIN: message={}", message); + private void processNetdataNodeFailedEvent(Object message) { + log.debug("SelfHealingPlugin: processNetdataNodeFailedEvent(): BEGIN: message={}", message); if (!(message instanceof Map)) { - log.warn("SelfHealingPlugin: processNetdataNodePausedEvent(): Message is not a {} object. Will ignore it.", Map.class.getSimpleName()); + log.warn("SelfHealingPlugin: processNetdataNodeFailedEvent(): Message is not a {} object. Will ignore it.", Map.class.getSimpleName()); return; } // Get paused node address Object addressValue = ((Map) message).getOrDefault("address", null); - log.debug("SelfHealingPlugin: processNetdataNodePausedEvent(): node-address={}", addressValue); + log.debug("SelfHealingPlugin: processNetdataNodeFailedEvent(): node-address={}", addressValue); if (addressValue==null) { - log.warn("SelfHealingPlugin: processNetdataNodePausedEvent(): Node address is missing. Cannot recover node. Initial message: {}", message); + log.warn("SelfHealingPlugin: processNetdataNodeFailedEvent(): Node address is missing. Cannot recover node. Initial message: {}", message); return; } String nodeAddress = addressValue.toString(); @@ -222,18 +219,18 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve } } - private void processNetdataNodeResumedEvent(Object message) { - log.debug("SelfHealingPlugin: processNetdataNodeResumedEvent(): BEGIN: message={}", message); + private void processNetdataNodeOkEvent(Object message) { + log.debug("SelfHealingPlugin: processNetdataNodeOkEvent(): BEGIN: message={}", message); if (!(message instanceof Map)) { - log.warn("SelfHealingPlugin: processNetdataNodeResumedEvent(): Message is not a {} object. Will ignore it.", Map.class.getSimpleName()); + log.warn("SelfHealingPlugin: processNetdataNodeOkEvent(): Message is not a {} object. Will ignore it.", Map.class.getSimpleName()); return; } // Get resumed node address String nodeAddress = ((Map) message).getOrDefault("address", "").toString(); - log.debug("SelfHealingPlugin: processNetdataNodeResumedEvent(): node-address={}", nodeAddress); + log.debug("SelfHealingPlugin: processNetdataNodeOkEvent(): node-address={}", nodeAddress); /*if (StringUtils.isBlank(nodeAddress)) { - log.warn("SelfHealingPlugin: processNetdataNodeResumedEvent(): Node address is missing. Initial message: {}", message); + log.warn("SelfHealingPlugin: processNetdataNodeOkEvent(): Node address is missing. Initial message: {}", message); return; }*/ @@ -278,12 +275,12 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve //NOTE: 'recoveryTask.runNodeRecovery()' must send SELF_HEALING_RECOVERY_COMPLETED or _FAILED event } catch (Exception e) { log.error("SelfHealingPlugin: EXCEPTION while recovering node: node-info={} -- Exception: ", recoveryTask.getNodeInfo(), e); - eventBus.send(SELF_HEALING_RECOVERY_FAILED, nodeAddress); + eventBus.send(RecoveryConstant.SELF_HEALING_RECOVERY_FAILED, nodeAddress); } if (retries.getAndIncrement() >= clientRecoveryMaxRetries) { log.warn("SelfHealingPlugin: Max retries reached. No more recovery retries for node: id={}, address={}", nodeId, nodeAddress); cancelRecoveryTask(nodeId, nodeAddress, true); - eventBus.send(SELF_HEALING_RECOVERY_GIVE_UP, nodeAddress); + eventBus.send(RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP, nodeAddress); // Notify EMS server about giving up recovery due to permanent failure commandExecutor.notifyEmsServer("RECOVERY GIVE_UP "+nodeId+" @ "+nodeAddress); @@ -301,7 +298,7 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve nodeInfoHelper.remove(nodeId, nodeAddress); log.info("SelfHealingPlugin: cancelRecoveryTask(): Cancelled recovery task for Node: id={}, address={}", nodeId, nodeAddress); } else - log.warn("SelfHealingPlugin: cancelRecoveryTask(): No recovery task is scheduled for Node: id={}, address={}", nodeId, nodeAddress); + log.debug("SelfHealingPlugin: cancelRecoveryTask(): No recovery task is scheduled for Node: id={}, address={}", nodeId, nodeAddress); } } } diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/ShellRecoveryTask.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/ShellRecoveryTask.java index 05cae3af2..4e88c578d 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/ShellRecoveryTask.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/ShellRecoveryTask.java @@ -25,7 +25,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; -import static eu.melodic.event.baguette.client.plugin.recovery.SelfHealingPlugin.SELF_HEALING_RECOVERY_COMPLETED; +import static eu.melodic.event.common.recovery.RecoveryConstant.SELF_HEALING_RECOVERY_COMPLETED; /** * Client-side, Local-node Self-Healing diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/VmNodeRecoveryTask.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/VmNodeRecoveryTask.java index 4ab05b5ca..c7b398876 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/VmNodeRecoveryTask.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/VmNodeRecoveryTask.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; -import static eu.melodic.event.baguette.client.plugin.recovery.SelfHealingPlugin.SELF_HEALING_RECOVERY_COMPLETED; +import static eu.melodic.event.common.recovery.RecoveryConstant.SELF_HEALING_RECOVERY_COMPLETED; /** * Client-side, VM-node Self-Healing diff --git a/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java b/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java index e14238c95..5e3a459e2 100644 --- a/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java +++ b/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java @@ -26,26 +26,24 @@ import org.springframework.web.client.RestTemplate; import java.io.Serializable; import java.time.Duration; -import java.time.Instant; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.concurrent.ScheduledFuture; import java.util.stream.Collectors; +import eu.melodic.event.common.recovery.RecoveryConstant; + /** * Collects measurements from Netdata http server */ @Slf4j @RequiredArgsConstructor -public class NetdataCollector implements InitializingBean, Runnable { +public class NetdataCollector implements InitializingBean, Runnable, EventBus.EventConsumer { public final static String NETDATA_COLLECTION_START = "NETDATA_COLLECTION_START"; public final static String NETDATA_COLLECTION_END = "NETDATA_COLLECTION_END"; public final static String NETDATA_CONN_OK = "NETDATA_CONN_OK"; public final static String NETDATA_CONN_ERROR = "NETDATA_CONN_ERROR"; - public final static String NETDATA_NODE_PAUSED = "NETDATA_NODE_PAUSED"; - public final static String NETDATA_NODE_RESUMED = "NETDATA_NODE_RESUMED"; + public final static String NETDATA_NODE_OK = "NETDATA_NODE_OK"; + public final static String NETDATA_NODE_FAILED = "NETDATA_NODE_FAILED"; protected final NetdataCollectorProperties properties; protected final CollectorContext collectorContext; @@ -104,6 +102,10 @@ public class NetdataCollector implements InitializingBean, Runnable { log.info("Collectors::Netdata: configuration: {}", properties); + // Subscribe for SELF-HEALING plugin GIVE_UP events + eventBus.subscribe(RecoveryConstant.SELF_HEALING_RECOVERY_COMPLETED, this); + eventBus.subscribe(RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP, this); + // Schedule collection execution errorsMap.clear(); ignoredNodes.clear(); @@ -119,14 +121,42 @@ public class NetdataCollector implements InitializingBean, Runnable { return; } + // Unsubscribe from SELF-HEALING plugin GIVE_UP events + eventBus.unsubscribe(RecoveryConstant.SELF_HEALING_RECOVERY_COMPLETED, this); + eventBus.unsubscribe(RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP, this); + // Cancel collection execution started = false; runner.cancel(true); runner = null; - ignoredNodes.values().forEach(task -> task.cancel(true)); + ignoredNodes.values().stream().filter(Objects::nonNull).forEach(task -> task.cancel(true)); log.info("Collectors::Netdata: Stopped"); } + @Override + public void onMessage(String topic, Object message, Object sender) { + log.trace("Collectors::Netdata: onMessage: BEGIN: topic={}, message={}, sender={}", topic, message, sender); + if (RecoveryConstant.SELF_HEALING_RECOVERY_COMPLETED.equals(topic)) { + if (message!=null) { + String nodeAddress = message.toString(); + if (StringUtils.isNotBlank(nodeAddress)) { + log.info("Collectors::Netdata: Resuming collection from Node: {}", nodeAddress); + ignoredNodes.remove(nodeAddress); + } + } + } else + if (RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP.equals(topic)) { + if (message!=null) { + String nodeAddress = message.toString(); + if (StringUtils.isNotBlank(nodeAddress)) { + log.info("Collectors::Netdata: Pausing collection from Node: {}", nodeAddress); + ignoredNodes.put(nodeAddress, null); + } + } + } else + log.warn("Collectors::Netdata: onMessage: Event from unexpected topic. Ignoring it: {}", topic); + } + public void run() { if (!started) return; @@ -174,32 +204,22 @@ public class NetdataCollector implements InitializingBean, Runnable { //if (Optional.ofNullable(errorsMap.put(nodeAddress, 0)).orElse(0)>0) sendEvent(NETDATA_CONN_OK, nodeAddress); sendEvent(NETDATA_CONN_OK, nodeAddress); + sendEvent(NETDATA_NODE_OK, nodeAddress); return COLLECTION_RESULT.OK; } catch (Throwable t) { int errors = errorsMap.compute(nodeAddress, (k, v) -> Optional.ofNullable(v).orElse(0) + 1); int errorLimit = properties.getErrorLimit(); - int pausePeriod = properties.getPausePeriod(); log.warn("Collectors::Netdata: Exception while collecting metrics from node: {}, #errors={}, exception: {}", nodeAddress, errors, getExceptionMessages(t)); log.debug("Collectors::Netdata: Exception while collecting metrics from node: {}, #errors={}\n", nodeAddress, errors, t); sendEvent(NETDATA_CONN_ERROR, nodeAddress, "errors="+errors); - if (errorLimit>0 && pausePeriod>0) { - if (errors >= errorLimit) { - log.warn("Collectors::Netdata: Too many consecutive errors occurred while attempting to collect metrics from node: {}, num-of-errors={}", nodeAddress, errors); - log.warn("Collectors::Netdata: Will pause metrics collection from node for {} seconds: {}", pausePeriod, nodeAddress); - ignoredNodes.put(nodeAddress, taskScheduler.schedule(() -> { - errorsMap.put(nodeAddress, 0); - ignoredNodes.remove(nodeAddress); - log.info("Collectors::Netdata: Resumed metrics collection from node: {}", nodeAddress); - sendEvent(NETDATA_NODE_RESUMED, nodeAddress); - }, Instant.now().plusSeconds(pausePeriod))); - - sendEvent(NETDATA_NODE_PAUSED, nodeAddress); - } - } else - log.debug("Collectors::Netdata: Metrics collection pausing is disabled"); + if (errorLimit<=0 || errors >= errorLimit) { + log.warn("Collectors::Netdata: Too many consecutive errors occurred while attempting to collect metrics from node: {}, num-of-errors={}", nodeAddress, errors); + ignoredNodes.put(nodeAddress, null); + sendEvent(NETDATA_NODE_FAILED, nodeAddress); + } return COLLECTION_RESULT.ERROR; } } diff --git a/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollectorProperties.java b/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollectorProperties.java index b73c6cf53..2f1013218 100644 --- a/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollectorProperties.java +++ b/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollectorProperties.java @@ -29,6 +29,5 @@ public class NetdataCollectorProperties { private boolean createTopic; private List allowedTopics; - private int errorLimit; // num of consecutive errors. Zero or negative value disables collection pausing - private int pausePeriod; // in seconds. Zero or negative value disables collection pausing + private int errorLimit; // num of consecutive errors. Zero or negative value will immediately trigger self-healing } diff --git a/event-management/common/src/main/java/eu/melodic/event/common/recovery/RecoveryConstant.java b/event-management/common/src/main/java/eu/melodic/event/common/recovery/RecoveryConstant.java new file mode 100644 index 000000000..1b573e7e1 --- /dev/null +++ b/event-management/common/src/main/java/eu/melodic/event/common/recovery/RecoveryConstant.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2017-2022 Institute of Communication and Computer Systems (imu.iccs.gr) + * + * This Source Code Form is subject to the terms of the Mozilla Public License, v2.0, unless + * Esper library is used, in which case it is subject to the terms of General Public License v2.0. + * If a copy of the MPL was not distributed with this file, you can obtain one at + * https://www.mozilla.org/en-US/MPL/2.0/ + */ + +package eu.melodic.event.common.recovery; + +/** + * Recovery Constant + */ +public class RecoveryConstant { + public final static String SELF_HEALING_RECOVERY_FAILED = "SELF_HEALING_RECOVERY_FAILED"; + public final static String SELF_HEALING_RECOVERY_GIVE_UP = "SELF_HEALING_RECOVERY_GIVE_UP"; + public final static String SELF_HEALING_RECOVERY_COMPLETED = "SELF_HEALING_RECOVERY_COMPLETED"; +} \ No newline at end of file -- GitLab From ef40d673a697c89869edfe537e886fa441dcf175 Mon Sep 17 00:00:00 2001 From: ipatini Date: Mon, 7 Mar 2022 17:38:26 +0200 Subject: [PATCH 03/76] EMS: Baguette Server, Common: Added marking a node as 'Failed', when Aggreagtor notifies that gives up node recovery. Added 'NODE_FAILED' status in NodeRegistryEntry class. Updated README-for-TESTING.md --- event-management/README-for-TESTING.md | 4 +++ event-management/baguette-server/pom.xml | 5 ++++ .../event/baguette/server/BaguetteServer.java | 30 ++++++++++++++++++- .../baguette/server/ClientShellCommand.java | 13 ++++++-- .../baguette/server/NodeRegistryEntry.java | 9 +++++- .../collector/netdata/NetdataCollector.java | 25 ++++++++-------- 6 files changed, 68 insertions(+), 18 deletions(-) diff --git a/event-management/README-for-TESTING.md b/event-management/README-for-TESTING.md index af68db9b7..fb561e996 100644 --- a/event-management/README-for-TESTING.md +++ b/event-management/README-for-TESTING.md @@ -1065,6 +1065,7 @@ We distinguish between monitoring topologies: Collectors::Netdata: Collecting data from url: http://192.168.96.2:19999/api/v1/allmetrics?format=json Collectors::Netdata: Exception while collecting metrics from node: 192.168.96.2, #errors=3, exception: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://192.168.96.2:19999/api/v1/allmetrics": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused) -> java.net.ConnectException: Connection refused (Connection refused) Collectors::Netdata: Too many consecutive errors occurred while attempting to collect metrics from node: 192.168.96.2, num-of-errors=3 + Collectors::Netdata: Pausing collection from Node: 192.168.96.2 ``` *

Aggregator log: Requesting RL node's credentials

* ``` @@ -1171,6 +1172,7 @@ We distinguish between monitoring topologies: ``` e.m.e.b.server.ClientShellCommand : #00000--> Client notification: CMD=RECOVERY, ARGS=GIVE_UP null @ 192.168.96.2 e.m.e.b.server.ClientShellCommand : #00000--> Client Recovery Notification: GIVE_UP: null @ 192.168.96.2 + e.m.e.baguette.server.BaguetteServer : BaguetteServer.onMessage: Marked Node as Failed: 192.168.96.2 ``` * ***Aggregator***, for logs reporting (i) connection failures to a Netdata agent, (ii) a number of failed attempts to connect to VM, and (iii) a recovery give up message. *

Aggregator log: Failed metric collection attempts from a RL node's Netdata agent

* @@ -1196,6 +1198,7 @@ We distinguish between monitoring topologies: Collectors::Netdata: Collecting data from url: http://192.168.96.2:19999/api/v1/allmetrics?format=json Collectors::Netdata: Exception while collecting metrics from node: 192.168.96.2, #errors=3, exception: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://192.168.96.2:19999/api/v1/allmetrics": connect timed out; nested exception is java.net.SocketTimeoutException: connect timed out -> java.net.SocketTimeoutException: connect timed out Collectors::Netdata: Too many consecutive errors occurred while attempting to collect metrics from node: 192.168.96.2, num-of-errors=3 + Collectors::Netdata: Pausing collection from Node: 192.168.96.2 ``` *

Aggregator log: Requesting RL node's credentials

* ``` @@ -1239,6 +1242,7 @@ We distinguish between monitoring topologies: ``` SelfHealingPlugin: Max retries reached. No more recovery retries for node: id=null, address=192.168.96.2 SelfHealingPlugin: cancelRecoveryTask(): Cancelled recovery task for Node: id=null, address=192.168.96.2 + Collectors::Netdata: Giving up collection from Node: 192.168.96.2 NOTIFY-X: RECOVERY GIVE_UP null @ 192.168.96.2 ``` * ***Normal nodes (that operate)***, for NO logs indicating connection failures or recovery actions. diff --git a/event-management/baguette-server/pom.xml b/event-management/baguette-server/pom.xml index 2f0cf537d..7dc9d60ff 100644 --- a/event-management/baguette-server/pom.xml +++ b/event-management/baguette-server/pom.xml @@ -32,6 +32,11 @@ ${project.version} compile + + eu.melodic.event + common + ${project.version} + diff --git a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/BaguetteServer.java b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/BaguetteServer.java index 28cee7c66..82d7e8691 100644 --- a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/BaguetteServer.java +++ b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/BaguetteServer.java @@ -11,6 +11,7 @@ package eu.melodic.event.baguette.server; import eu.melodic.event.baguette.server.properties.BaguetteServerProperties; import eu.melodic.event.brokercep.BrokerCepService; +import eu.melodic.event.common.recovery.RecoveryConstant; import eu.melodic.event.translate.TranslationContext; import eu.melodic.event.util.*; import lombok.SneakyThrows; @@ -34,7 +35,7 @@ import java.util.stream.Collectors; */ @Slf4j @Service -public class BaguetteServer implements InitializingBean { +public class BaguetteServer implements InitializingBean, EventBus.EventConsumer { @Autowired private BaguetteServerProperties config; @Autowired @@ -148,6 +149,8 @@ public class BaguetteServer implements InitializingBean { // Server control methods public synchronized void startServer(ServerCoordinator coordinator) throws IOException { if (server == null) { + eventBus.subscribe(RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP, this); + log.info("BaguetteServer.startServer(): Starting SSH server instance..."); nodeRegistry.setCoordinator(coordinator); Sshd server = new Sshd(); @@ -162,6 +165,8 @@ public class BaguetteServer implements InitializingBean { public synchronized void stopServer() throws IOException { if (server != null) { + eventBus.unsubscribe(RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP, this); + log.info("BaguetteServer.setServerConfiguration(): stopping running instance of SSH server..."); server.stop(); this.server = null; @@ -181,6 +186,29 @@ public class BaguetteServer implements InitializingBean { return server != null; } + @Override + public void onMessage(String topic, Object message, Object sender) { + log.trace ("BaguetteServer.onMessage: BEGIN: topic={}, message={}, sender={}", topic, message, sender); + + String nodeAddress = (message!=null) ? message.toString() : null; + log.trace("BaguetteServer.onMessage: nodeAddress={}", nodeAddress); + + if (RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP.equals(topic)) { + if (StringUtils.isNotBlank(nodeAddress)) { + NodeRegistryEntry node = nodeRegistry.getNodeByAddress(nodeAddress); + if (node!=null) { + node.nodeFailed(null); + log.info("BaguetteServer.onMessage: Marked Node as Failed: {}", nodeAddress); + } else { + log.warn("BaguetteServer.onMessage: Node with Address not found: {}", nodeAddress); + log.debug("BaguetteServer.onMessage: Node addresses: {}", nodeRegistry.getNodeAddresses()); + } + } + } else { + log.warn("BaguetteServer.onMessage: Event from unexpected topic received. Ignoring it: {}", topic); + } + } + // Topology configuration methods public synchronized void setTopologyConfiguration( TranslationContext _TC, diff --git a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/ClientShellCommand.java b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/ClientShellCommand.java index ed7d40609..a9b57b674 100644 --- a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/ClientShellCommand.java +++ b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/ClientShellCommand.java @@ -10,6 +10,7 @@ package eu.melodic.event.baguette.server; import com.google.gson.Gson; +import eu.melodic.event.common.recovery.RecoveryConstant; import eu.melodic.event.util.ClientConfiguration; import eu.melodic.event.util.EventBus; import eu.melodic.event.baguette.server.coordinator.cluster.IClusterZone; @@ -262,9 +263,15 @@ public class ClientShellCommand implements Command, Runnable, SessionAware { String clientData = part.length>1 ? part[1] : null; if (StringUtils.isNotBlank(notificationType) && StringUtils.isNotBlank(clientData)) { log.info("{}--> Client Recovery Notification: {}: {}", getId(), notificationType, clientData); - if ("GIVE_UP".equalsIgnoreCase(notificationType)) - eventBus.send("CLIENT_NOTIFICATION_RECOVERY_GIVE_UP", clientData, "Client_"+getId()); - else + if ("GIVE_UP".equalsIgnoreCase(notificationType)) { + String[] tmp = clientData.split("@", 2); + String nodeId = tmp[0].trim(); + String nodeAddress = tmp.length>1 ? tmp[1].trim() : null; + if (StringUtils.isNotBlank(nodeAddress)) + eventBus.send(RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP, nodeAddress, "Client_" + getId()); + else + log.warn("{}--> Missing Node Address in Client Recovery Notification: {}", getId(), args); + } else log.warn("{}--> UNKNOWN Client Recovery Notification: {}", getId(), args); } else { log.warn("{}--> INVALID Client Recovery Notification: {}", getId(), args); diff --git a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/NodeRegistryEntry.java b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/NodeRegistryEntry.java index b9d572d03..fe20cc0f0 100644 --- a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/NodeRegistryEntry.java +++ b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/NodeRegistryEntry.java @@ -24,7 +24,7 @@ import java.util.UUID; @AllArgsConstructor public class NodeRegistryEntry { public enum STATE { PREREGISTERED, IGNORE_NODE, INSTALLING, NOT_INSTALLED, INSTALLED, INSTALL_ERROR, - WAITING_REGISTRATION, REGISTERED, NOT_REGISTERED, REGISTRATION_ERROR, DISCONNECTED + WAITING_REGISTRATION, REGISTERED, NOT_REGISTERED, REGISTRATION_ERROR, DISCONNECTED, NODE_FAILED }; @Getter private final String ipAddress; @Getter private final String clientId; @@ -114,6 +114,13 @@ public class NodeRegistryEntry { return this; } + public NodeRegistryEntry nodeFailed(Map failInfo) { + if (failInfo!=null) + registration.putAll(processMap("", failInfo)); + setState(STATE.NODE_FAILED); + return this; + } + private Map processMap(Map inMap) { Map outMap = new LinkedHashMap<>(); for (Map.Entry entry : inMap.entrySet()) { diff --git a/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java b/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java index 5e3a459e2..0d8013891 100644 --- a/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java +++ b/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java @@ -136,25 +136,23 @@ public class NetdataCollector implements InitializingBean, Runnable, EventBus.Ev @Override public void onMessage(String topic, Object message, Object sender) { log.trace("Collectors::Netdata: onMessage: BEGIN: topic={}, message={}, sender={}", topic, message, sender); + + String nodeAddress = (message!=null) ? message.toString() : null; + log.trace("Collectors::Netdata: nodeAddress={}", nodeAddress); + if (RecoveryConstant.SELF_HEALING_RECOVERY_COMPLETED.equals(topic)) { - if (message!=null) { - String nodeAddress = message.toString(); - if (StringUtils.isNotBlank(nodeAddress)) { - log.info("Collectors::Netdata: Resuming collection from Node: {}", nodeAddress); - ignoredNodes.remove(nodeAddress); - } + if (StringUtils.isNotBlank(nodeAddress)) { + log.info("Collectors::Netdata: Resuming collection from Node: {}", nodeAddress); + ignoredNodes.remove(nodeAddress); } } else if (RecoveryConstant.SELF_HEALING_RECOVERY_GIVE_UP.equals(topic)) { - if (message!=null) { - String nodeAddress = message.toString(); - if (StringUtils.isNotBlank(nodeAddress)) { - log.info("Collectors::Netdata: Pausing collection from Node: {}", nodeAddress); - ignoredNodes.put(nodeAddress, null); - } + if (StringUtils.isNotBlank(nodeAddress)) { + log.info("Collectors::Netdata: Giving up collection from Node: {}", nodeAddress); + ignoredNodes.put(nodeAddress, null); } } else - log.warn("Collectors::Netdata: onMessage: Event from unexpected topic. Ignoring it: {}", topic); + log.warn("Collectors::Netdata: onMessage: Event from unexpected topic received. Ignoring it: {}", topic); } public void run() { @@ -217,6 +215,7 @@ public class NetdataCollector implements InitializingBean, Runnable, EventBus.Ev if (errorLimit<=0 || errors >= errorLimit) { log.warn("Collectors::Netdata: Too many consecutive errors occurred while attempting to collect metrics from node: {}, num-of-errors={}", nodeAddress, errors); + log.warn("Collectors::Netdata: Pausing collection from Node: {}", nodeAddress); ignoredNodes.put(nodeAddress, null); sendEvent(NETDATA_NODE_FAILED, nodeAddress); } -- GitLab From 8ad07b0dd32dae21362835d9da686884cae22571 Mon Sep 17 00:00:00 2001 From: ipatini Date: Tue, 8 Mar 2022 12:57:46 +0200 Subject: [PATCH 04/76] EMS: Baguette Client, Common: Fixed bug in error counting in NetdataCollector. Fixed SelfHealingPlugin to not log the whole nodeInfo map but only the node address. Updated README-for-TESTING.md --- event-management/README-for-TESTING.md | 12 ++++++------ .../client/plugin/recovery/SelfHealingPlugin.java | 2 +- .../common/collector/netdata/NetdataCollector.java | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/event-management/README-for-TESTING.md b/event-management/README-for-TESTING.md index fb561e996..3cedbef4e 100644 --- a/event-management/README-for-TESTING.md +++ b/event-management/README-for-TESTING.md @@ -741,7 +741,7 @@ We distinguish between monitoring topologies: SelfHealingPlugin: Retry #0: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.16.4, port=22, username=ubuntu Connecting to server... - SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=cecab3d4-4c09-43b1-b6fa-3534d37bbc8f, zone-id=IMU-ZONE, address=192.168.16.4,......................... + SelfHealingPlugin: EXCEPTION while recovering node: node-address=192.168.16.4 -- Exception: java.net.NoRouteToHostException: No route to host at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:252) @@ -754,7 +754,7 @@ We distinguish between monitoring topologies: SelfHealingPlugin: Retry #3: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.16.4, port=22, username=ubuntu Connecting to server... - SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=cecab3d4-4c09-43b1-b6fa-3534d37bbc8f, zone-id=IMU-ZONE, address=192.168.16.4,......................... + SelfHealingPlugin: EXCEPTION while recovering node: node-address=192.168.16.4 -- Exception: java.net.NoRouteToHostException: No route to host at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:252) @@ -991,7 +991,7 @@ We distinguish between monitoring topologies: SelfHealingPlugin: Retry #0: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.16.4, port=22, username=ubuntu Connecting to server... - SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=4abf9ae2-b7fc-4e8c-b6d9-464623d1b05f, zone-id=IMU-ZONE, address=192.168.16.4,......................... + SelfHealingPlugin: EXCEPTION while recovering node: node-address=192.168.16.4 -- Exception: java.net.NoRouteToHostException: No route to host at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:252) @@ -1004,7 +1004,7 @@ We distinguish between monitoring topologies: SelfHealingPlugin: Retry #3: Recovering node: id=node_3866738cb0f4_2002, address=192.168.16.4 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.16.4, port=22, username=ubuntu Connecting to server... - SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=4abf9ae2-b7fc-4e8c-b6d9-464623d1b05f, zone-id=IMU-ZONE, address=192.168.16.4,......................... + SelfHealingPlugin: EXCEPTION while recovering node: node-address=192.168.16.4 -- Exception: java.net.NoRouteToHostException: No route to host at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:252) @@ -1210,7 +1210,7 @@ We distinguish between monitoring topologies: SelfHealingPlugin: Retry #0: Recovering node: id=null, address=192.168.96.2 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.96.2, port=22, username=ubuntu Connecting to server... - SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=4b676a58-e00e-4ddf-a21e-b1c0d1382cd6, zone-id=IMU-ZONE, address=192.168.96.2, provider=AWS,......................... + SelfHealingPlugin: EXCEPTION while recovering node: node-address=192.168.96.2 -- Exception: java.net.NoRouteToHostException: No route to host at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:252) @@ -1229,7 +1229,7 @@ We distinguish between monitoring topologies: SelfHealingPlugin: Retry #3: Recovering node: id=null, address=192.168.96.2 VmNodeRecoveryTask: connectToNode(): Connecting to node using SSH: address=192.168.96.2, port=22, username=ubuntu Connecting to server... - SelfHealingPlugin: EXCEPTION while recovering node: node-info={random=4b676a58-e00e-4ddf-a21e-b1c0d1382cd6, zone-id=IMU-ZONE, address=192.168.96.2, provider=AWS,......................... + SelfHealingPlugin: EXCEPTION while recovering node: node-address=192.168.96.2 -- Exception: java.net.NoRouteToHostException: No route to host at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:252) diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java index 816c8191b..9d82facb2 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java @@ -274,7 +274,7 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve recoveryTask.runNodeRecovery(); //NOTE: 'recoveryTask.runNodeRecovery()' must send SELF_HEALING_RECOVERY_COMPLETED or _FAILED event } catch (Exception e) { - log.error("SelfHealingPlugin: EXCEPTION while recovering node: node-info={} -- Exception: ", recoveryTask.getNodeInfo(), e); + log.error("SelfHealingPlugin: EXCEPTION while recovering node: node-address={} -- Exception: ", nodeAddress, e); eventBus.send(RecoveryConstant.SELF_HEALING_RECOVERY_FAILED, nodeAddress); } if (retries.getAndIncrement() >= clientRecoveryMaxRetries) { diff --git a/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java b/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java index 0d8013891..6199eddfb 100644 --- a/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java +++ b/event-management/common/src/main/java/eu/melodic/event/common/collector/netdata/NetdataCollector.java @@ -203,6 +203,7 @@ public class NetdataCollector implements InitializingBean, Runnable, EventBus.Ev //if (Optional.ofNullable(errorsMap.put(nodeAddress, 0)).orElse(0)>0) sendEvent(NETDATA_CONN_OK, nodeAddress); sendEvent(NETDATA_CONN_OK, nodeAddress); sendEvent(NETDATA_NODE_OK, nodeAddress); + errorsMap.put(nodeAddress, 0); return COLLECTION_RESULT.OK; } catch (Throwable t) { int errors = errorsMap.compute(nodeAddress, (k, v) -> Optional.ofNullable(v).orElse(0) + 1); -- GitLab From 0e1b59f4a3bdd93c0db7105bf154ae5a07a93ac9 Mon Sep 17 00:00:00 2001 From: ipatini Date: Tue, 8 Mar 2022 13:09:11 +0200 Subject: [PATCH 05/76] EMS: Baguette Client: Removed logging of nodeInfo because it might contain sensitive info --- .../event/baguette/client/plugin/recovery/NodeInfoHelper.java | 4 ++-- .../baguette/client/plugin/recovery/SelfHealingPlugin.java | 2 +- .../baguette/client/plugin/recovery/VmNodeRecoveryTask.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/NodeInfoHelper.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/NodeInfoHelper.java index dd7071c8b..5a34263ee 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/NodeInfoHelper.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/NodeInfoHelper.java @@ -62,13 +62,13 @@ public class NodeInfoHelper { throw ex; } } - log.debug("NodeInfoHelper: getNodeInfo(): Node info: {}", nodeInfo); + //log.debug("NodeInfoHelper: getNodeInfo(): Node info: {}", nodeInfo); return nodeInfo; } public void remove(String nodeId, @NonNull String nodeAddress) { log.debug("NodeInfoHelper: remove(): node-id={}, node-address={}", nodeId, nodeAddress); Map nodeInfo = nodeInfoCache.remove(nodeAddress); - log.trace("NodeInfoHelper: remove(): Removed: node-id={}, node-address={}, node-info={}", nodeId, nodeAddress, nodeInfo); + log.trace("NodeInfoHelper: remove(): Removed: node-id={}, node-address={}", nodeId, nodeAddress); } } diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java index 9d82facb2..f26ba27b4 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/SelfHealingPlugin.java @@ -258,7 +258,7 @@ public class SelfHealingPlugin implements Plugin, InitializingBean, EventBus.Eve log.warn("SelfHealingPlugin: createRecoveryTask(): Node info is null or empty. Cannot recover node."); return; } - log.trace("SelfHealingPlugin: createRecoveryTask(): Node info retrieved for node: id={}, address={}, node-info:\n{}", nodeId, nodeAddress, nodeInfo); + log.trace("SelfHealingPlugin: createRecoveryTask(): Node info retrieved for node: id={}, address={}", nodeId, nodeAddress); } else { log.debug("SelfHealingPlugin: createRecoveryTask(): Node address is blank. Node info will not be retrieved: id={}, address={}", nodeId, nodeAddress); } diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/VmNodeRecoveryTask.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/VmNodeRecoveryTask.java index c7b398876..1c0b4edb0 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/VmNodeRecoveryTask.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/plugin/recovery/VmNodeRecoveryTask.java @@ -61,7 +61,7 @@ public class VmNodeRecoveryTask implements RecoveryTask { } public void runNodeRecovery(List recoveryCommands) throws Exception { - log.debug("VmNodeRecoveryTask: runNodeRecovery(): node-info={}", nodeInfo); + log.debug("VmNodeRecoveryTask: runNodeRecovery(): BEGIN: recovery-command: {}", recoveryCommands); // Connect to Node (VM) Sshc sshc = connectToNode(); @@ -102,7 +102,7 @@ public class VmNodeRecoveryTask implements RecoveryTask { } private BaguetteClientProperties createBaguetteClientProperties() { - log.debug("VmNodeRecoveryTask: createBaguetteClientProperties(): node-info={}", nodeInfo); + log.debug("VmNodeRecoveryTask: createBaguetteClientProperties(): BEGIN:"); // Extract connection info and credentials String os = str(nodeInfo.get("operatingSystem")); -- GitLab From 91c78e8ab89e6c6bcd47896e8b0514b84bdd98a4 Mon Sep 17 00:00:00 2001 From: ipatini Date: Fri, 11 Mar 2022 14:08:03 +0200 Subject: [PATCH 06/76] EMS: Broker-CEP: Corrected a typo --- .../java/eu/melodic/event/brokercep/cep/CepEvalFunction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/cep/CepEvalFunction.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/cep/CepEvalFunction.java index b648a39b4..9e198c5f0 100644 --- a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/cep/CepEvalFunction.java +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/cep/CepEvalFunction.java @@ -53,7 +53,7 @@ public class CepEvalFunction { if (entryValue instanceof String) entryValue = Double.parseDouble((String)entryValue); args.put(entryName, (Double) entryValue); } - log.debug(">> eval(map): mp-args: {}", args); + log.debug(">> eval(map): map-args: {}", args); double result = MathUtil.eval(formula, args); log.debug(">> eval(map): result: {}", result); @@ -73,7 +73,7 @@ public class CepEvalFunction { throw new IllegalArgumentException("The num. of stream names provided is not equal to the num. of values provided"); Map args = new HashMap<>(); for (int i = 0; i < names.length; i++) args.put(names[i].trim(), v[i]); - log.debug(">> eval(double): mp-args: {}", args); + log.debug(">> eval(double): map-args: {}", args); double result = MathUtil.eval(formula, args); log.debug(">> eval(double): result: {}", result); -- GitLab From 27ce94af1a3ac0a12607d013fdb4d63c0e32f686 Mon Sep 17 00:00:00 2001 From: ipatini Date: Tue, 22 Mar 2022 12:21:41 +0200 Subject: [PATCH 07/76] EMS: Util: Improved NetUtil to be configured through environment variables (NET_UTIL_XXXX) --- .../java/eu/melodic/event/util/NetUtil.java | 62 ++++++++++++++----- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/event-management/util/src/main/java/eu/melodic/event/util/NetUtil.java b/event-management/util/src/main/java/eu/melodic/event/util/NetUtil.java index 7ebe1a019..295bb6490 100644 --- a/event-management/util/src/main/java/eu/melodic/event/util/NetUtil.java +++ b/event-management/util/src/main/java/eu/melodic/event/util/NetUtil.java @@ -15,6 +15,7 @@ import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.net.*; import java.util.*; +import java.util.stream.Collectors; /** * Network Utility @@ -22,19 +23,52 @@ import java.util.*; @Slf4j public class NetUtil { - private final static String[] addressFilter = { - "127.", - /*"192.168.", "10.", "172.16.", "172.31.", "169.254.",*/ - "224.", "239.", "255.255.255.255" - }; + private final static String[] ADDRESS_FILTERS; - private final static String DATAGRAM_ADDRESS = "8.8.8.8"; + private final static String DATAGRAM_ADDRESS; - private final static String[][] SERVICES = { - { "AWS", "http://checkip.amazonaws.com" }, - { "Ipify", "https://api.ipify.org/?format=text" }, - { "WhatIsMyIpAddress", "http://bot.whatismyipaddress.com/" } - }; + private final static String[][] PUBLIC_ADDRESS_DISCOVERY_SERVICES; + + static { + // Configure Address Filters + String filtersStr = System.getenv("NET_UTIL_ADDRESS_FILTERS"); + List filtersList = new ArrayList<>(); + if (StringUtils.isNotBlank(filtersStr)) { + filtersList = Arrays.stream(filtersStr.split("[;, \t]+")).map(String::trim).filter(s->!s.isEmpty()).collect(Collectors.toList()); + } else { + filtersList = Arrays.asList( + "127.", + /*"192.168.", "10.", "172.16.", "172.31.", "169.254.",*/ + "224.", "239.", "255.255.255.255" + ); + } + ADDRESS_FILTERS = filtersList.toArray(new String[0]); + + // Configure Datagram address + String datagramAddress = System.getenv("NET_UTIL_DATAGRAM_ADDRESS"); + DATAGRAM_ADDRESS = StringUtils.isNotBlank(datagramAddress) ? datagramAddress.trim() : "8.8.8.8"; + + // Configure Address discovery services + String servicesStr = System.getenv("NET_UTIL_ADDRESS_DISCOVERY_SERVICES"); + List servicesList = new ArrayList<>(); + if (StringUtils.isNotBlank(servicesStr)) { + if (!"-".equals(servicesStr)) { + Arrays.stream(servicesStr.split("[;, \t]+")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .map(s -> s.split("[:=]", 2)) + .filter(a -> a.length == 2) + .peek(a->{ a[0]=a[0].trim(); a[1]=a[1].trim(); }) + .filter(a->!a[0].isEmpty() && !a[1].isEmpty()) + .forEach(servicesList::add); + } + } else { + servicesList.add(Arrays.asList("AWS", "http://checkip.amazonaws.com").toArray(new String[0])); + servicesList.add(Arrays.asList("Ipify", "https://api.ipify.org/?format=text").toArray(new String[0])); + servicesList.add(Arrays.asList("WhatIsMyIpAddress", "http://bot.whatismyipaddress.com/").toArray(new String[0])); + } + PUBLIC_ADDRESS_DISCOVERY_SERVICES = servicesList.toArray(new String[0][]); + } // ------------------------------------------------------------------------ @@ -58,7 +92,7 @@ public class NetUtil { } } else { - for (String[] service : SERVICES) { + for (String[] service : PUBLIC_ADDRESS_DISCOVERY_SERVICES) { if (service[0].equalsIgnoreCase(arg)) { printAddress(queryService(service[1])); } @@ -114,7 +148,7 @@ public class NetUtil { if (inet instanceof java.net.Inet4Address) { String addr = inet.getHostAddress(); if (!inet.isLoopbackAddress() && !inet.isMulticastAddress() && inet.isSiteLocalAddress()) { - boolean ok = Arrays.stream(addressFilter) + boolean ok = Arrays.stream(ADDRESS_FILTERS) .noneMatch(addr::startsWith); if (ok) { log_debug("{}", addr); @@ -164,7 +198,7 @@ public class NetUtil { return publicIpAddress; } - for (String[] service : SERVICES) { + for (String[] service : PUBLIC_ADDRESS_DISCOVERY_SERVICES) { log_debug("NetUtil.getPublicIpAddress(): Contacting service {}", service[0]); String ip = getIpAddressUsingService(service[1]); if (StringUtils.isNotBlank(ip)) { -- GitLab From 9a3f12f8dde3103301d77acb249a009af780dccf Mon Sep 17 00:00:00 2001 From: ipatini Date: Wed, 6 Apr 2022 13:15:28 +0300 Subject: [PATCH 08/76] EMS: Control Service, conf: Minor improvements and corrections in configuration --- event-management/.gitignore | 8 +++++--- .../eu.melodic.event.brokercep.properties | 6 +++--- .../eu.melodic.event.control.properties | 11 +++++++++-- .../event/control/webconf/WebSecurityConfig.java | 14 +++++++++----- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/event-management/.gitignore b/event-management/.gitignore index 55c4463ac..58caaef46 100644 --- a/event-management/.gitignore +++ b/event-management/.gitignore @@ -1,6 +1,8 @@ .idea broker-client/*.js -config-files/broker*.p12 -config-files/broker*.crt +config-files/*.p12 +config-files/*.crt public_resources/** -tcnative* \ No newline at end of file +tcnative* +ems.log +server.pem \ No newline at end of file diff --git a/event-management/config-files/eu.melodic.event.brokercep.properties b/event-management/config-files/eu.melodic.event.brokercep.properties index 7a768f956..40aa32c78 100644 --- a/event-management/config-files/eu.melodic.event.brokercep.properties +++ b/event-management/config-files/eu.melodic.event.brokercep.properties @@ -27,17 +27,17 @@ brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${IP_SETTING}: # Must be a public IP address # Key store -brokercep.ssl.keystore-file = ${MELODIC_CONFIG_DIR}/broker-keystore.p12 +brokercep.ssl.keystore-file = ${MELODIC_CONFIG_DIR}/ems-keystore.p12 brokercep.ssl.keystore-type = PKCS12 #brokercep.ssl.keystore-password = melodic brokercep.ssl.keystore-password = ENC(ISMbn01HVPbtRPkqm2Lslg==) # Trust store -brokercep.ssl.truststore-file = ${MELODIC_CONFIG_DIR}/broker-truststore.p12 +brokercep.ssl.truststore-file = ${MELODIC_CONFIG_DIR}/ems-truststore.p12 brokercep.ssl.truststore-type = PKCS12 #brokercep.ssl.truststore-password = melodic brokercep.ssl.truststore-password = ENC(ISMbn01HVPbtRPkqm2Lslg==) # Certificate -brokercep.ssl.certificate-file = ${MELODIC_CONFIG_DIR}/broker.crt +brokercep.ssl.certificate-file = ${MELODIC_CONFIG_DIR}/ems.crt # Key-and-Cert data brokercep.ssl.key-entry-generate = ALWAYS brokercep.ssl.key-entry-name = ems diff --git a/event-management/config-files/eu.melodic.event.control.properties b/event-management/config-files/eu.melodic.event.control.properties index f69d2abd6..398373faf 100644 --- a/event-management/config-files/eu.melodic.event.control.properties +++ b/event-management/config-files/eu.melodic.event.control.properties @@ -108,16 +108,23 @@ control.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:%{DEFAULT_IP}%,ip: #control.ssl.default-ip-address = #control.ssl.public-ip-address = -### Enable JWT Web security ### +### Web configuration - JWT security ### #melodic.security.enabled=false #web.jwt-token-authentication.enabled=false +#web.jwt-print-sample-token=false -### Web configuration - API key +### Web configuration - API key security ### +#web.api-key-authentication.enabled=false #web.api-key.value=${random.uuid} #web.api-key.value=1234567890 #web.api-key.header=EMS-API-KEY #web.api-key.parameter=ems-api-key +### Web configuration - User Form security ### +#web.form-authentication.enabled=false +#web.form-authentication.username=admin +#web.form-authentication.password=ems + ### Web configuration - Resources spring.mvc.favicon.enabled=false static.favicon.path=file:${PUBLIC_DIR}/favicon.ico diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/webconf/WebSecurityConfig.java b/event-management/control-service/src/main/java/eu/melodic/event/control/webconf/WebSecurityConfig.java index f39b0e323..d1102d851 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/webconf/WebSecurityConfig.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/webconf/WebSecurityConfig.java @@ -110,15 +110,19 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @EventListener(ApplicationReadyEvent.class) public void applicationReady() { - if (userFormAuthEnabled && (StringUtils.isBlank(username) || password.isEmpty())) + if (securityEnabled && userFormAuthEnabled && (StringUtils.isBlank(username) || password.isEmpty())) throw new InvalidParameterException("User form authentication is enabled but username or password are blank"); - if (apiKeyAuthEnabled && StringUtils.isBlank(apiKeyValue)) + if (securityEnabled && apiKeyAuthEnabled && StringUtils.isBlank(apiKeyValue)) throw new InvalidParameterException("API Key authentication is enabled but no API Key provided or it is blank"); if (permittedUrls==null) permittedUrls = new String[0]; - log.info("afterPropertiesSet: Admin Username: {}", username); - log.info("afterPropertiesSet: Admin Password: {}", passwordUtil.encodePassword(password)); - log.info("afterPropertiesSet: API Key: {}", passwordUtil.encodePassword(apiKeyValue)); + if (securityEnabled && userFormAuthEnabled) { + log.info("afterPropertiesSet: Admin Username: {}", username); + log.info("afterPropertiesSet: Admin Password: {}", passwordUtil.encodePassword(password)); + } + if (securityEnabled && apiKeyAuthEnabled) { + log.info("afterPropertiesSet: API Key: {}", passwordUtil.encodePassword(apiKeyValue)); + } if (printSampleJwt) log.info("afterPropertiesSet:\n{}\nSample JWT Token: \nBearer {}\n{}", divider, jwtService(melodicSecurityProperties).create("USER"), divider); -- GitLab From 53611522fd40e6534b3f017bbb306fc82c7ae7d7 Mon Sep 17 00:00:00 2001 From: ipatini Date: Wed, 6 Apr 2022 16:35:54 +0300 Subject: [PATCH 09/76] EMS: Control Service: Minor change --- .../eu/melodic/event/control/ControlServiceApplication.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java index c993f9db0..dedac39a9 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java @@ -32,14 +32,14 @@ import org.springframework.scheduling.annotation.EnableAsync; import java.util.Timer; import java.util.TimerTask; +@Slf4j +@EnableAsync +@Configuration @SpringBootApplication( scanBasePackages = {"eu.melodic.event.baguette.server", "eu.melodic.event.baguette.client.install", "eu.melodic.event.baguette.client.selfhealing", "eu.melodic.event.brokercep", "eu.melodic.event.control", "eu.melodic.event.translate", "eu.melodic.event.common", "eu.melodic.event.util"}, exclude = { SecurityAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class } ) -@EnableAsync -@Configuration -@Slf4j public class ControlServiceApplication /*implements ApplicationContextAware*/ { private static ConfigurableApplicationContext applicationContext; private static Timer exitTimer; -- GitLab From b236ecce6a3f5ae56526d11e362cec3c4092833a Mon Sep 17 00:00:00 2001 From: ipatini Date: Wed, 6 Apr 2022 16:48:31 +0300 Subject: [PATCH 10/76] EMS: Control Service: Minor change --- .../eu/melodic/event/control/ControlServiceApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java index dedac39a9..f0c8804c5 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java @@ -40,7 +40,7 @@ import java.util.TimerTask; "eu.melodic.event.baguette.client.selfhealing", "eu.melodic.event.brokercep", "eu.melodic.event.control", "eu.melodic.event.translate", "eu.melodic.event.common", "eu.melodic.event.util"}, exclude = { SecurityAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class } ) -public class ControlServiceApplication /*implements ApplicationContextAware*/ { +public class ControlServiceApplication { private static ConfigurableApplicationContext applicationContext; private static Timer exitTimer; -- GitLab From aa2cc7733909812bb0613395b7afb903f6b95ddb Mon Sep 17 00:00:00 2001 From: ipatini Date: Thu, 7 Apr 2022 12:21:43 +0300 Subject: [PATCH 11/76] EMS: Control Service: Removed '@NonNullApi' annotations that cause compile time error, and also removed the 'com.google.code.findbugs-jsr305' workaround dependency. Marked dependencies in pom.xml that cause 'BeanPostProcessorChecker' to issue warnings. Commented out 'spring-boot-admin-starter-client' dependency --- event-management/control-service/pom.xml | 16 +++++----------- .../info/ControlServiceBuildInfoEndpoint.java | 2 -- .../control/info/ControlServiceMetrics.java | 2 -- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/event-management/control-service/pom.xml b/event-management/control-service/pom.xml index f3ad9d0bb..8cff12e16 100644 --- a/event-management/control-service/pom.xml +++ b/event-management/control-service/pom.xml @@ -40,15 +40,6 @@ - - - - com.google.code.findbugs - jsr305 - 3.0.2 - compile - - eu.melodic @@ -127,6 +118,7 @@ spring-boot-starter-webflux + org.springframework.boot spring-boot-starter-actuator @@ -138,11 +130,12 @@ ${micrometer.registry.prometheus.version} - + + com.github.ulisesbocchio @@ -171,6 +164,7 @@ + io.hawt hawtio-springboot diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/info/ControlServiceBuildInfoEndpoint.java b/event-management/control-service/src/main/java/eu/melodic/event/control/info/ControlServiceBuildInfoEndpoint.java index 2559ce366..5d5bed776 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/info/ControlServiceBuildInfoEndpoint.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/info/ControlServiceBuildInfoEndpoint.java @@ -9,7 +9,6 @@ package eu.melodic.event.control.info; -import io.micrometer.core.lang.NonNullApi; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; @@ -21,7 +20,6 @@ import java.util.Map; @Slf4j @Component -@NonNullApi @Endpoint(id = "emsBuildInfo") public class ControlServiceBuildInfoEndpoint { @Autowired diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/info/ControlServiceMetrics.java b/event-management/control-service/src/main/java/eu/melodic/event/control/info/ControlServiceMetrics.java index 973f4c4d6..ea3abdd06 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/info/ControlServiceMetrics.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/info/ControlServiceMetrics.java @@ -12,7 +12,6 @@ package eu.melodic.event.control.info; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.lang.NonNullApi; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; @@ -22,7 +21,6 @@ import org.springframework.stereotype.Component; @Slf4j @Component -@NonNullApi @RequiredArgsConstructor public class ControlServiceMetrics implements ApplicationContextAware { -- GitLab From fb3006d83bc68dc271487e3b50a72890b3e81613 Mon Sep 17 00:00:00 2001 From: ipatini Date: Thu, 7 Apr 2022 14:50:31 +0300 Subject: [PATCH 12/76] EMS: Util, Control Service, Baguette Client, config-files: Added 'NetUtilPostProcessor' class for registering 'NetUtilPostProcessor.NetUtilPropertySource' responsible for providing values to ${DEFAULT_IP} and ${PUBLIC_IP} config. placeholders. Added 'NetUtilPostProcessor' in 'spring.factories' files of EMS server and Baguette Client for automated inclusion by Spring Boot. Changed occurrences of %{DEFAULT_IP}% and %{PUBLIC_IP}% with ${DEFAULT_IP} and ${PUBLIC_IP} respectively (usages via ${IP_SETTING} were not considered). --- .../main/resources/META-INF/spring.factories | 1 + .../eu.melodic.event.brokercep.properties | 5 +- .../eu.melodic.event.brokercep.properties | 5 +- .../eu.melodic.event.control.properties | 5 +- event-management/control-service/pom.xml | 1 + .../main/resources/META-INF/spring.factories | 1 + .../event/util/NetUtilPostProcessor.java | 61 +++++++++++++++++++ 7 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 event-management/baguette-client/src/main/resources/META-INF/spring.factories create mode 100644 event-management/control-service/src/main/resources/META-INF/spring.factories create mode 100644 event-management/util/src/main/java/eu/melodic/event/util/NetUtilPostProcessor.java diff --git a/event-management/baguette-client/src/main/resources/META-INF/spring.factories b/event-management/baguette-client/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..7966109cf --- /dev/null +++ b/event-management/baguette-client/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.env.EnvironmentPostProcessor=eu.melodic.event.util.NetUtilPostProcessor \ No newline at end of file diff --git a/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties b/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties index 948092382..bbf0e8db0 100644 --- a/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties +++ b/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties @@ -46,10 +46,7 @@ brokercep.ssl.certificate-file = ${MELODIC_CONFIG_DIR}/client-broker.crt brokercep.ssl.key-entry-generate = IF-IP-CHANGED brokercep.ssl.key-entry-name = ${IP_SETTING} brokercep.ssl.key-entry-dname = CN=${IP_SETTING},OU=Information Management Unit (IMU),O=Institute of Communication and Computer Systems (ICCS),L=Athens,ST=Attika,C=GR -brokercep.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:%{DEFAULT_IP}%,ip:%{PUBLIC_IP}% -# Public and Default IP address defaults (if case NetUtil fails to detect any of them) -#control.ssl.default-ip-address = -#control.ssl.public-ip-address = +brokercep.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:${DEFAULT_IP},ip:${PUBLIC_IP} # Authentication and Authorization settings brokercep.authentication-enabled = true diff --git a/event-management/config-files/eu.melodic.event.brokercep.properties b/event-management/config-files/eu.melodic.event.brokercep.properties index 40aa32c78..652039dcc 100644 --- a/event-management/config-files/eu.melodic.event.brokercep.properties +++ b/event-management/config-files/eu.melodic.event.brokercep.properties @@ -42,10 +42,7 @@ brokercep.ssl.certificate-file = ${MELODIC_CONFIG_DIR}/ems.crt brokercep.ssl.key-entry-generate = ALWAYS brokercep.ssl.key-entry-name = ems brokercep.ssl.key-entry-dname = CN=ems,OU=Information Management Unit (IMU),O=Institute of Communication and Computer Systems (ICCS),L=Athens,ST=Attika,C=GR -brokercep.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:%{DEFAULT_IP}%,ip:%{PUBLIC_IP}% -# Public and Default IP address defaults (if case NetUtil fails to detect any of them) -#control.ssl.default-ip-address = -#control.ssl.public-ip-address = +brokercep.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:${DEFAULT_IP},ip:${PUBLIC_IP} # Authentication and Authorization settings brokercep.authentication-enabled = true diff --git a/event-management/config-files/eu.melodic.event.control.properties b/event-management/config-files/eu.melodic.event.control.properties index 398373faf..65c6a9cdb 100644 --- a/event-management/config-files/eu.melodic.event.control.properties +++ b/event-management/config-files/eu.melodic.event.control.properties @@ -103,10 +103,7 @@ control.ssl.key-entry-generate = NEVER control.ssl.key-entry-name = ems #control.ssl.key-entry-password = control.ssl.key-entry-dname = CN=ems,OU=Information Management Unit (IMU),O=Institute of Communication and Computer Systems (ICCS),L=Athens,ST=Attika,C=GR -control.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:%{DEFAULT_IP}%,ip:%{PUBLIC_IP}% -# Public and Default IP address defaults (if case NetUtil fails to detect any of them) -#control.ssl.default-ip-address = -#control.ssl.public-ip-address = +control.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:${DEFAULT_IP},ip:${PUBLIC_IP} ### Web configuration - JWT security ### #melodic.security.enabled=false diff --git a/event-management/control-service/pom.xml b/event-management/control-service/pom.xml index 8cff12e16..d779f59e1 100644 --- a/event-management/control-service/pom.xml +++ b/event-management/control-service/pom.xml @@ -180,6 +180,7 @@ true *.txt + META-INF/spring.factories diff --git a/event-management/control-service/src/main/resources/META-INF/spring.factories b/event-management/control-service/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..7966109cf --- /dev/null +++ b/event-management/control-service/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.env.EnvironmentPostProcessor=eu.melodic.event.util.NetUtilPostProcessor \ No newline at end of file diff --git a/event-management/util/src/main/java/eu/melodic/event/util/NetUtilPostProcessor.java b/event-management/util/src/main/java/eu/melodic/event/util/NetUtilPostProcessor.java new file mode 100644 index 000000000..175c57784 --- /dev/null +++ b/event-management/util/src/main/java/eu/melodic/event/util/NetUtilPostProcessor.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2017-2022 Institute of Communication and Computer Systems (imu.iccs.gr) + * + * This Source Code Form is subject to the terms of the Mozilla Public License, v2.0, unless + * Esper library is used, in which case it is subject to the terms of General Public License v2.0. + * If a copy of the MPL was not distributed with this file, you can obtain one at + * https://www.mozilla.org/en-US/MPL/2.0/ + */ + +package eu.melodic.event.util; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.boot.logging.DeferredLog; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.PropertySource; +import org.springframework.stereotype.Component; + +@Component +public class NetUtilPostProcessor implements EnvironmentPostProcessor { + private static final DeferredLog log = new DeferredLog(); + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + PropertySource ps = new NetUtilPropertySource(); + environment.getPropertySources().addFirst(ps); + log.info("NetUtilPostProcessor: NetUtilPropertySource registered (deferred log)"); + + application.addInitializers(ctx -> log.replayTo(NetUtilPostProcessor.class)); + } + + @Getter @Setter + public static class NetUtilPropertySource extends PropertySource { + private String defaultDefaultIp = "127.0.0.1"; + private String defaultPublicIp = "127.0.0.1"; + + public NetUtilPropertySource() { + super("ems-net-util-property-source"); + } + + public NetUtilPropertySource(String name) { + super(name); + } + + @Override + public String getProperty(String s) { + String address = null; + if ("DEFAULT_IP".equals(s)) { + address = NetUtil.getDefaultIpAddress(); + if (address==null) address = defaultDefaultIp; + } + if ("PUBLIC_IP".equals(s)) { + address = NetUtil.getPublicIpAddress(); + if (address==null) address = defaultPublicIp; + } + return address; + } + } +} -- GitLab From 89897aeb04a79d54416d341f8a358f23c3498116 Mon Sep 17 00:00:00 2001 From: ipatini Date: Thu, 7 Apr 2022 15:24:46 +0300 Subject: [PATCH 13/76] EMS: Control Service: Added 'getServerIpAddress()' method in ControlServiceCoordinator and replaced uses of 'coordinator.getControlServiceProperties().getIpSetting()' for determining the EMS server's IP address --- .../eu/melodic/event/control/ControlServiceController.java | 5 +---- .../melodic/event/control/ControlServiceCoordinator.java | 7 +++++++ .../eu/melodic/event/control/info/EmsInfoServiceImpl.java | 5 +---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java index 9c340e717..d2ec32a2c 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java @@ -21,7 +21,6 @@ import eu.melodic.event.control.properties.ControlServiceProperties; import eu.melodic.event.control.webconf.WebSecurityConfig; import eu.melodic.event.translate.TranslationContext; import eu.melodic.event.util.CredentialsMap; -import eu.melodic.event.util.NetUtil; import eu.melodic.models.commons.Watermark; import eu.melodic.models.interfaces.ems.*; import lombok.AllArgsConstructor; @@ -421,9 +420,7 @@ public class ControlServiceController { staticResourceContext = StringUtils.substringBeforeLast(staticResourceContext,"/*"); if (!staticResourceContext.startsWith("/")) staticResourceContext = "/"+staticResourceContext; String baseUrl = - (ControlServiceProperties.IpSetting.DEFAULT_IP == coordinator.getControlServiceProperties().getIpSetting()) - ? request.getScheme()+"://"+ NetUtil.getDefaultIpAddress() +":"+request.getServerPort()+staticResourceContext - : request.getScheme()+"://"+ NetUtil.getPublicIpAddress() +":"+request.getServerPort()+staticResourceContext; + request.getScheme()+"://"+ coordinator.getServerIpAddress() +":"+request.getServerPort()+staticResourceContext; log.debug("ControlServiceController.baguetteRegisterNode(): baseUrl={}", baseUrl); // Get IP Setting and Client ID diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceCoordinator.java b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceCoordinator.java index fe3bd0e94..7c2a25045 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceCoordinator.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceCoordinator.java @@ -26,6 +26,7 @@ import eu.melodic.event.translate.CamelToEplTranslator; import eu.melodic.event.translate.TranslationContext; import eu.melodic.event.translate.analyze.DAGNode; import eu.melodic.event.util.KeystoreUtil; +import eu.melodic.event.util.NetUtil; import eu.melodic.event.util.PasswordUtil; import eu.melodic.models.commons.NotificationResult; import eu.melodic.models.commons.NotificationResultImpl; @@ -126,6 +127,12 @@ public class ControlServiceCoordinator implements InitializingBean { } } + public String getServerIpAddress() { + return (properties.getIpSetting() == ControlServiceProperties.IpSetting.DEFAULT_IP) + ? NetUtil.getDefaultIpAddress() + : NetUtil.getPublicIpAddress(); + } + // ------------------------------------------------------------------------------------------------------------ public ControlServiceProperties getControlServiceProperties() { diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/info/EmsInfoServiceImpl.java b/event-management/control-service/src/main/java/eu/melodic/event/control/info/EmsInfoServiceImpl.java index 4199a670d..c1bc644dc 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/info/EmsInfoServiceImpl.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/info/EmsInfoServiceImpl.java @@ -118,10 +118,7 @@ public class EmsInfoServiceImpl implements IEmsInfoService { Map metrics = new LinkedHashMap<>(); - metrics.put("ip-address", - controlServiceCoordinator.getControlServiceProperties().getIpSetting()==ControlServiceProperties.IpSetting.PUBLIC_IP - ? NetUtil.getPublicIpAddress() - : NetUtil.getDefaultIpAddress()); + metrics.put("ip-address", controlServiceCoordinator.getServerIpAddress()); metrics.put("public-ip-address", NetUtil.getPublicIpAddress()); metrics.put("default-ip-address", NetUtil.getDefaultIpAddress()); metrics.put("reference", controlServiceCoordinator.getReference()); -- GitLab From 92f526e34d619fd6e630bef6915bba536a8a617f Mon Sep 17 00:00:00 2001 From: ipatini Date: Thu, 7 Apr 2022 19:11:43 +0300 Subject: [PATCH 14/76] EMS: Control Service, config-files: Changed 'ControlServiceProperties.IpSetting' enum values to DEFAULT_IP and PUBLIC_IP (from '%{DEFAULT_IP}%' and '%{PUBLIC_IP}%'), and updated occurrences in config. files. Added EMS_SERVER_ADDRESS and EMS_CLIENT_ADDRESS variables in config. files and replaced ${IP_SETTING} occurrences with them. From now on IP_SETTING will only store the IP discovery setting (and will not be used as an IP address setting). --- .../conf/baguette-client.properties | 1 + .../conf/eu.melodic.event.brokercep.properties | 6 +++--- ...ic.event.baguette-client-install.properties | 2 +- ...eu.melodic.event.baguette-server.properties | 2 +- .../eu.melodic.event.brokercep.properties | 4 ++-- .../eu.melodic.event.control.properties | 5 +++-- .../properties/ControlServiceProperties.java | 18 ++++-------------- 7 files changed, 15 insertions(+), 23 deletions(-) diff --git a/event-management/config-files/baguette-client/conf/baguette-client.properties b/event-management/config-files/baguette-client/conf/baguette-client.properties index dded92041..deb4020fc 100644 --- a/event-management/config-files/baguette-client/conf/baguette-client.properties +++ b/event-management/config-files/baguette-client/conf/baguette-client.properties @@ -16,6 +16,7 @@ exit-command-allowed = false #kill-delay = 10 IP_SETTING=${IP_SETTING} +EMS_CLIENT_ADDRESS=${${IP_SETTING}} # ----------------------------------------------------------------------------- # Client Id and Baguette Server credentials diff --git a/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties b/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties index bbf0e8db0..b9590d126 100644 --- a/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties +++ b/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties @@ -27,7 +27,7 @@ brokercep.broker-url-3 = brokercep.broker-url-properties = transport.daemon=true&transport.trace=false&transport.useKeepAlive=true&transport.useInactivityMonitor=false&transport.needClientAuth=${brokercep.ssl.client-auth.required}&transport.verifyHostName=true&transport.connectionTimeout=0&transport.keepAlive=true brokercep.ssl.client-auth.required = false brokercep.broker-url-for-consumer = tcp://127.0.0.1:61616?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true -brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${IP_SETTING}:${brokercep.broker-port}?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true +brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${EMS_CLIENT_ADDRESS}:${brokercep.broker-port}?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true # Must be a public IP address # Key store @@ -44,8 +44,8 @@ brokercep.ssl.truststore-password = ENC(ISMbn01HVPbtRPkqm2Lslg==) brokercep.ssl.certificate-file = ${MELODIC_CONFIG_DIR}/client-broker.crt # Key-and-Cert data brokercep.ssl.key-entry-generate = IF-IP-CHANGED -brokercep.ssl.key-entry-name = ${IP_SETTING} -brokercep.ssl.key-entry-dname = CN=${IP_SETTING},OU=Information Management Unit (IMU),O=Institute of Communication and Computer Systems (ICCS),L=Athens,ST=Attika,C=GR +brokercep.ssl.key-entry-name = ${EMS_CLIENT_ADDRESS} +brokercep.ssl.key-entry-dname = CN=${EMS_CLIENT_ADDRESS},OU=Information Management Unit (IMU),O=Institute of Communication and Computer Systems (ICCS),L=Athens,ST=Attika,C=GR brokercep.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:${DEFAULT_IP},ip:${PUBLIC_IP} # Authentication and Authorization settings diff --git a/event-management/config-files/eu.melodic.event.baguette-client-install.properties b/event-management/config-files/eu.melodic.event.baguette-client-install.properties index e7cac2b81..57600683a 100644 --- a/event-management/config-files/eu.melodic.event.baguette-client-install.properties +++ b/event-management/config-files/eu.melodic.event.baguette-client-install.properties @@ -21,7 +21,7 @@ baguette.client.install.touchFiles=${baguette.client.install.baseDir}/logs/outpu baguette.client.install.checkInstalledFile=${baguette.client.install.baseDir}/conf/ok.txt baguette.client.install.downloadUrl=%{BASE_URL}% -#baguette.client.install.downloadUrl=http://${IP_SETTING}:8111/resources +#baguette.client.install.downloadUrl=http://${EMS_SERVER_ADDRESS}:8111/resources baguette.client.install.apiKey=1234567890 baguette.client.install.installScriptUrl=${baguette.client.install.downloadUrl}/install.sh baguette.client.install.installScriptFile=${baguette.client.install.baseDir}/bin/install.sh diff --git a/event-management/config-files/eu.melodic.event.baguette-server.properties b/event-management/config-files/eu.melodic.event.baguette-server.properties index d8b999dae..97c6f83ab 100644 --- a/event-management/config-files/eu.melodic.event.baguette-server.properties +++ b/event-management/config-files/eu.melodic.event.baguette-server.properties @@ -40,7 +40,7 @@ baguette.server.coordinatorConfig.noop.coordinatorClass = eu.melodic.event.bague baguette.server.registration-window = 30000 # SSH Server settings -baguette.server.address = ${IP_SETTING} +baguette.server.address = ${EMS_SERVER_ADDRESS} baguette.server.port = 2222 baguette.server.key.file = ${MELODIC_CONFIG_DIR}/hostkey.ser baguette.server.heartbeat = on diff --git a/event-management/config-files/eu.melodic.event.brokercep.properties b/event-management/config-files/eu.melodic.event.brokercep.properties index 652039dcc..111daa9da 100644 --- a/event-management/config-files/eu.melodic.event.brokercep.properties +++ b/event-management/config-files/eu.melodic.event.brokercep.properties @@ -22,8 +22,8 @@ brokercep.broker-url-2 = tcp://0.0.0.0:61616?${brokercep.broker-url-properties} brokercep.broker-url-3 = stomp://0.0.0.0:61610 brokercep.broker-url-properties = transport.daemon=true&transport.trace=false&transport.useKeepAlive=true&transport.useInactivityMonitor=false&transport.needClientAuth=${brokercep.ssl.client-auth.required}&transport.verifyHostName=true&transport.connectionTimeout=0&transport.keepAlive=true brokercep.ssl.client-auth.required = false -brokercep.broker-url-for-consumer = tcp://${IP_SETTING}:61616?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true -brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${IP_SETTING}:${brokercep.broker-port}?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true +brokercep.broker-url-for-consumer = tcp://${EMS_SERVER_ADDRESS}:61616?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true +brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${EMS_SERVER_ADDRESS}:${brokercep.broker-port}?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true # Must be a public IP address # Key store diff --git a/event-management/config-files/eu.melodic.event.control.properties b/event-management/config-files/eu.melodic.event.control.properties index 65c6a9cdb..213ebd14a 100644 --- a/event-management/config-files/eu.melodic.event.control.properties +++ b/event-management/config-files/eu.melodic.event.control.properties @@ -12,8 +12,9 @@ #control.metasolver-configuration-url = ${METASOLVER_URL:http://metasolver:8092/updateConfiguration} ### Don't touch the next lines!! -#IP_SETTING=%{DEFAULT_IP}% -IP_SETTING=${EMS_IP_SETTING:%{PUBLIC_IP}%} +#IP_SETTING=DEFAULT_IP +IP_SETTING=${EMS_IP_SETTING:PUBLIC_IP} +EMS_SERVER_ADDRESS=${${IP_SETTING}} #EXECUTIONWARE=CLOUDIATOR EXECUTIONWARE=PROACTIVE diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/properties/ControlServiceProperties.java b/event-management/control-service/src/main/java/eu/melodic/event/control/properties/ControlServiceProperties.java index 52b96acc5..4475c7e42 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/properties/ControlServiceProperties.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/properties/ControlServiceProperties.java @@ -21,26 +21,16 @@ import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; +@Slf4j @Data @Validated @Configuration @ConfigurationProperties(prefix = "control") @PropertySource("file:${MELODIC_CONFIG_DIR}/eu.melodic.event.control.properties") -@Slf4j public class ControlServiceProperties { public enum IpSetting { - DEFAULT_IP("%{DEFAULT_IP}%"), - PUBLIC_IP("%{PUBLIC_IP}%"); - - private final String placeholder; - - IpSetting(String placeholder) { - this.placeholder = placeholder; - } - - public String toString() { - return placeholder; - } + DEFAULT_IP, + PUBLIC_IP } public enum ExecutionWare { @@ -49,7 +39,7 @@ public class ControlServiceProperties { @Value("${control.printBuildInfo:false}") private boolean printBuildInfo; - @Value("${IP_SETTING:}") + @Value("${IP_SETTING:PUBLIC_IP}") private IpSetting ipSetting; @Value("${EXECUTIONWARE:PROACTIVE}") private ExecutionWare executionware; -- GitLab From cfe7e0db8cbfb5a464086d402d2fe4fade8e050d Mon Sep 17 00:00:00 2001 From: ipatini Date: Fri, 8 Apr 2022 13:07:56 +0300 Subject: [PATCH 15/76] EMS: Web Admin: Updated npm dependencies --- event-management/web-admin/package-lock.json | 4042 ++++++++++++------ event-management/web-admin/package.json | 26 +- 2 files changed, 2640 insertions(+), 1428 deletions(-) diff --git a/event-management/web-admin/package-lock.json b/event-management/web-admin/package-lock.json index 736dc08c1..bdfaef7fd 100644 --- a/event-management/web-admin/package-lock.json +++ b/event-management/web-admin/package-lock.json @@ -4,6 +4,26 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@achrinza/node-ipc": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.2.tgz", + "integrity": "sha512-b90U39dx0cU6emsOvy5hxU4ApNXnE3+Tuo8XQZfiKTGelDwpMwBVgBP7QX6dGTcJgu/miyJuNJ/2naFBliNWEw==", + "dev": true, + "requires": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + } + }, + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", @@ -14,32 +34,144 @@ } }, "@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true }, "@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/generator": { @@ -54,64 +186,175 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", - "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz", - "integrity": "sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-split-export-declaration": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", @@ -124,13 +367,58 @@ "semver": "^6.1.2" } }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-explode-assignable-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", - "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-function-name": { @@ -163,93 +451,426 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "requires": { - "@babel/types": "^7.15.0" + "@babel/types": "^7.17.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", - "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-wrap-function": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.17.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { @@ -264,35 +885,260 @@ "@babel/helper-validator-identifier": { "version": "7.14.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", - "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helpers": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", - "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "dev": true, "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/highlight": { @@ -309,186 +1155,226 @@ "@babel/parser": { "version": "7.15.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.2.tgz", - "integrity": "sha512-bMJXql1Ss8lFnvr11TZDH4ArtwlAS5NG9qBmdiFW2UHHm6MVoR+GDc5XE2b9K938cyjc9O6/+vjjcffLDtfuDg==" + "integrity": "sha512-bMJXql1Ss8lFnvr11TZDH4ArtwlAS5NG9qBmdiFW2UHHm6MVoR+GDc5XE2b9K938cyjc9O6/+vjjcffLDtfuDg==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "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.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz", - "integrity": "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", - "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.5.tgz", - "integrity": "sha512-LYz5nvQcvYeRVjui1Ykn28i+3aUiXwQ/3MGoEy0InTaz1pJo/lAzmIDXX+BQny/oufgHzJ6vnEEiXQ8KZjEVFg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", + "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-decorators": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.17.9", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.17.0", + "charcodes": "^0.2.0" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", - "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" + "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-async-generators": { @@ -519,12 +1405,12 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz", - "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", + "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-dynamic-import": { @@ -555,12 +1441,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -636,357 +1522,526 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", - "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz", - "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", - "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz", - "integrity": "sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", - "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", - "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", - "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-runtime": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz", - "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", + "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", "semver": "^6.3.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz", - "integrity": "sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.9", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@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", @@ -1001,51 +2056,69 @@ "@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.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.9", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.15.0", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.15.0", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.16.0", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "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==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1056,9 +2129,9 @@ } }, "@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -1096,6 +2169,7 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" @@ -1140,15 +2214,37 @@ "@hapi/hoek": "^8.3.0" } }, - "@intervolga/optimize-cssnano-plugin": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", - "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", "dev": true, "requires": { - "cssnano": "^4.0.0", - "cssnano-preset-default": "^4.0.0", - "postcss": "^7.0.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@mrmlnc/readdir-enhanced": { @@ -1161,6 +2257,15 @@ "glob-to-regexp": "^0.3.0" } }, + "@node-ipc/js-queue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", + "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", + "dev": true, + "requires": { + "easy-stack": "1.0.1" + } + }, "@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", @@ -1168,65 +2273,90 @@ "dev": true }, "@soda/friendly-errors-webpack-plugin": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz", - "integrity": "sha512-RLotfx6k1+nfLacwNCenj7VnTMPxVwYKoGOcffMFoJDKM8tXzBiCN0hMHFJNnoAojduYAsxuiMm0EOMixgiRow==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", "dev": true, "requires": { - "chalk": "^2.4.2", - "error-stack-parser": "^2.0.2", - "string-width": "^2.0.0", - "strip-ansi": "^5" + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } @@ -1253,9 +2383,9 @@ } }, "@types/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "requires": { "@types/connect": "*", @@ -1281,12 +2411,6 @@ "@types/node": "*" } }, - "@types/estree": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", - "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", - "dev": true - }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -1300,9 +2424,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", - "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", "dev": true, "requires": { "@types/node": "*", @@ -1311,9 +2435,9 @@ } }, "@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -1321,18 +2445,18 @@ } }, "@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, "requires": { "@types/node": "*" } }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "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==", "dev": true }, "@types/mime": { @@ -1354,9 +2478,9 @@ "dev": true }, "@types/node": { - "version": "16.4.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.13.tgz", - "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "@types/normalize-package-data": { @@ -1423,9 +2547,9 @@ } }, "@types/webpack": { - "version": "4.41.30", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz", - "integrity": "sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA==", + "version": "4.41.32", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", + "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", "dev": true, "requires": { "@types/node": "*", @@ -1445,9 +2569,9 @@ } }, "@types/webpack-dev-server": { - "version": "3.11.5", - "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.5.tgz", - "integrity": "sha512-vjsbQBW3fE5FDICkF3w3ZWFRXNwQdKt7JRPLmRy5W0KXlcuew4wgpKWXhgHS71iLNv7Z2PlY9dSSIaYg+bk+9w==", + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", "dev": true, "requires": { "@types/connect-history-api-fallback": "*", @@ -1489,9 +2613,9 @@ "dev": true }, "@vue/babel-plugin-jsx": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.6.tgz", - "integrity": "sha512-RzYsvBhzKUmY2YG6LoV+W5PnlnkInq0thh1AzCmewwctAgGN6e9UFon6ZrQQV1CO5G5PeME7MqpB+/vvGg0h4g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -1528,9 +2652,9 @@ } }, "@vue/babel-preset-app": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.13.tgz", - "integrity": "sha512-pM7CR3yXB6L8Gfn6EmX7FLNE3+V/15I3o33GkSNsWvgsMp6HVGXKkXgojrcfUUauyL1LZOdvTmu4enU2RePGHw==", + "version": "4.5.17", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.17.tgz", + "integrity": "sha512-iFv9J3F5VKUPcbx+TqW5qhGmAVyXQxPRpKpPOuTLFIVTzg+iwJnrqVbL4kJU5ECGDxPESW2oCVgxv9bTlDPu7w==", "dev": true, "requires": { "@babel/core": "^7.11.0", @@ -1651,20 +2775,20 @@ } }, "@vue/cli-overlay": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.13.tgz", - "integrity": "sha512-jhUIg3klgi5Cxhs8dnat5hi/W2tQJvsqCxR0u6hgfSob0ORODgUBlN+F/uwq7cKIe/pzedVUk1y07F13GQvPqg==", + "version": "4.5.17", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.17.tgz", + "integrity": "sha512-QKKp66VbMg+X8Qh0wgXSwgxLfxY7EIkZkV6bZ6nFqBx8xtaJQVDbTL+4zcUPPA6nygbIcQ6gvTinNEqIqX6FUQ==", "dev": true }, "@vue/cli-plugin-babel": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.13.tgz", - "integrity": "sha512-ykvEAfD8PgGs+dGMGqr7l/nRmIS39NRzWLhMluPLTvDV1L+IxcoB73HNLGA/aENDpl8CuWrTE+1VgydcOhp+wg==", + "version": "4.5.17", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.17.tgz", + "integrity": "sha512-6kZuc3PdoUvGAnndUq6+GqjIXn3bqdTR8lOcAb1BH2b4N7IKGlmzcipALGS23HLVMAvDgNuUS7vf0unin9j2cg==", "dev": true, "requires": { "@babel/core": "^7.11.0", - "@vue/babel-preset-app": "^4.5.13", - "@vue/cli-shared-utils": "^4.5.13", + "@vue/babel-preset-app": "^4.5.17", + "@vue/cli-shared-utils": "^4.5.17", "babel-loader": "^8.1.0", "cache-loader": "^4.1.0", "thread-loader": "^2.1.3", @@ -1672,12 +2796,12 @@ } }, "@vue/cli-plugin-eslint": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.13.tgz", - "integrity": "sha512-yc2uXX6aBiy3vEf5TwaueaDqQbdIXIhk0x0KzEtpPo23jBdLkpOSoU5NCgE06g/ZiGAcettpmBSv73Hfp4wHEw==", + "version": "4.5.17", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.17.tgz", + "integrity": "sha512-bVNDP+SuWcuJrBMc+JLaKvlxx25XKIlZBa+zzFnxhHZlwPZ7CeBD3e2wnsygJyPoKgDZcZwDgmEz1BZzMEjsNw==", "dev": true, "requires": { - "@vue/cli-shared-utils": "^4.5.13", + "@vue/cli-shared-utils": "^4.5.17", "eslint-loader": "^2.2.1", "globby": "^9.2.0", "inquirer": "^7.1.0", @@ -1686,24 +2810,24 @@ } }, "@vue/cli-plugin-router": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.13.tgz", - "integrity": "sha512-tgtMDjchB/M1z8BcfV4jSOY9fZSMDTPgF9lsJIiqBWMxvBIsk9uIZHxp62DibYME4CCKb/nNK61XHaikFp+83w==", + "version": "4.5.17", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.17.tgz", + "integrity": "sha512-9r9CSwqv2+39XHQPDZJ0uaTtTP7oe0Gx17m7kBhHG3FA7R7AOSk2aVzhHZmDRhzlOxjx9kQSvrOSMfUG0kV4dQ==", "dev": true, "requires": { - "@vue/cli-shared-utils": "^4.5.13" + "@vue/cli-shared-utils": "^4.5.17" } }, "@vue/cli-plugin-vuex": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.13.tgz", - "integrity": "sha512-I1S9wZC7iI0Wn8kw8Zh+A2Qkf6s1M6vTGBkx8boXjuzfwEEyEHRxadsVCecZc8Mkpydo0nykj+MyYF96TKFuVA==", + "version": "4.5.17", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.17.tgz", + "integrity": "sha512-ck/ju2T2dmPKLWK/5QctNJs9SCb+eSZbbmr8neFkMc7GlbXw6qLWw5v3Vpd4KevdQA8QuQOA1pjUmzpCiU/mYQ==", "dev": true }, "@vue/cli-service": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.13.tgz", - "integrity": "sha512-CKAZN4iokMMsaUyJRU22oUAz3oS/X9sVBSKAF2/shFBV5xh3jqAlKl8OXZYz4cXGFLA6djNuYrniuLAo7Ku97A==", + "version": "4.5.17", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.17.tgz", + "integrity": "sha512-MqfkRYIcIUACe3nYlzNrYstJTWRXHlIqh6JCkbWbdnXWN+IfaVdlG8zw5Q0DVcSdGvkevUW7zB4UhtZB4uyAcA==", "dev": true, "requires": { "@intervolga/optimize-cssnano-plugin": "^1.0.5", @@ -1712,10 +2836,10 @@ "@types/minimist": "^1.2.0", "@types/webpack": "^4.0.0", "@types/webpack-dev-server": "^3.11.0", - "@vue/cli-overlay": "^4.5.13", - "@vue/cli-plugin-router": "^4.5.13", - "@vue/cli-plugin-vuex": "^4.5.13", - "@vue/cli-shared-utils": "^4.5.13", + "@vue/cli-overlay": "^4.5.17", + "@vue/cli-plugin-router": "^4.5.17", + "@vue/cli-plugin-vuex": "^4.5.17", + "@vue/cli-shared-utils": "^4.5.17", "@vue/component-compiler-utils": "^3.1.2", "@vue/preload-webpack-plugin": "^1.1.0", "@vue/web-component-wrapper": "^1.2.0", @@ -1770,63 +2894,6 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, - "optional": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -1835,43 +2902,21 @@ "requires": { "minipass": "^3.1.1" } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.8.3", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", - "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - } } } }, "@vue/cli-shared-utils": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.13.tgz", - "integrity": "sha512-HpnOrkLg42RFUsQGMJv26oTG3J3FmKtO2WSRhKIIL+1ok3w9OjGCtA3nMMXN27f9eX14TqO64M36DaiSZ1fSiw==", + "version": "4.5.17", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.17.tgz", + "integrity": "sha512-VoFNdxvTW4vZu3ne+j1Mf7mU99J2SAoRVn9XPrsouTUUJablglM8DASk7Ixhsh6ymyL/W9EADQFR6Pgj8Ujjuw==", "dev": true, "requires": { + "@achrinza/node-ipc": "9.2.2", "@hapi/joi": "^15.0.1", "chalk": "^2.4.2", "execa": "^1.0.0", "launch-editor": "^2.2.1", "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", "open": "^6.3.0", "ora": "^3.4.0", "read-pkg": "^5.1.1", @@ -1881,17 +2926,21 @@ } }, "@vue/compiler-core": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.1.5.tgz", - "integrity": "sha512-TXBhFinoBaXKDykJzY26UEuQU1K07FOp/0Ie+OXySqqk0bS0ZO7Xvl7UmiTUPYcLrWbxWBR7Bs/y55AI0MNc2Q==", - "requires": { - "@babel/parser": "^7.12.0", - "@babel/types": "^7.12.0", - "@vue/shared": "3.1.5", - "estree-walker": "^2.0.1", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz", + "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, "dependencies": { + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1900,81 +2949,66 @@ } }, "@vue/compiler-dom": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.1.5.tgz", - "integrity": "sha512-ZsL3jqJ52OjGU/YiT/9XiuZAmWClKInZM2aFJh9gnsAPqOrj2JIELMbkIFpVKR/CrVO/f2VxfPiiQdQTr65jcQ==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz", + "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==", "requires": { - "@vue/compiler-core": "3.1.5", - "@vue/shared": "3.1.5" + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/compiler-sfc": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.1.5.tgz", - "integrity": "sha512-mtMY6xMvZeSRx9MTa1+NgJWndrkzVTdJ1pQAmAKQuxyb5LsHVvrgP7kcQFvxPHVpLVTORbTJWHaiqoKrJvi1iA==", - "dev": true, - "requires": { - "@babel/parser": "^7.13.9", - "@babel/types": "^7.13.0", - "@types/estree": "^0.0.48", - "@vue/compiler-core": "3.1.5", - "@vue/compiler-dom": "3.1.5", - "@vue/compiler-ssr": "3.1.5", - "@vue/shared": "3.1.5", - "consolidate": "^0.16.0", - "estree-walker": "^2.0.1", - "hash-sum": "^2.0.0", - "lru-cache": "^5.1.1", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz", + "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.31", + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-ssr": "3.2.31", + "@vue/reactivity-transform": "3.2.31", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", "magic-string": "^0.25.7", - "merge-source-map": "^1.1.0", "postcss": "^8.1.10", - "postcss-modules": "^4.0.0", - "postcss-selector-parser": "^6.0.4", "source-map": "^0.6.1" }, "dependencies": { - "consolidate": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz", - "integrity": "sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==", - "dev": true, - "requires": { - "bluebird": "^3.7.2" - } + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" }, "postcss": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", - "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", - "dev": true, + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "@vue/compiler-ssr": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.1.5.tgz", - "integrity": "sha512-CU5N7Di/a4lyJ18LGJxJYZS2a8PlLdWpWHX9p/XcsjT2TngMpj3QvHVRkuik2u8QrIDZ8OpYmTyj1WDNsOV+Dg==", - "dev": true, + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz", + "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==", "requires": { - "@vue/compiler-dom": "3.1.5", - "@vue/shared": "3.1.5" + "@vue/compiler-dom": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/component-compiler-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz", - "integrity": "sha512-rAYMLmgMuqJFWAOb3Awjqqv5X3Q3hVr4jH/kgrFJpiU0j3a90tnNBplqbj+snzrgZhC9W128z+dtgMifOiMfJg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", "dev": true, "requires": { "consolidate": "^0.15.1", @@ -1983,7 +3017,7 @@ "merge-source-map": "^1.1.0", "postcss": "^7.0.36", "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2", + "prettier": "^1.18.2 || ^2.0.0", "source-map": "~0.6.1", "vue-template-es2015-compiler": "^1.9.0" }, @@ -2019,9 +3053,9 @@ } }, "@vue/devtools-api": { - "version": "6.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.15.tgz", - "integrity": "sha512-quBx4Jjpexo6KDiNUGFr/zF/2A4srKM9S9v2uHgMXSU//hjgq1eGzqkIFql8T9gfX5ZaVOUzYBP3jIdIR3PKIA==" + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.1.4.tgz", + "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" }, "@vue/preload-webpack-plugin": { "version": "1.1.2", @@ -2030,36 +3064,64 @@ "dev": true }, "@vue/reactivity": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", - "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz", + "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==", + "requires": { + "@vue/shared": "3.2.31" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz", + "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==", "requires": { - "@vue/shared": "3.1.5" + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + }, + "dependencies": { + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" + } } }, "@vue/runtime-core": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.1.5.tgz", - "integrity": "sha512-YQbG5cBktN1RowQDKA22itmvQ+b40f0WgQ6CXK4VYoYICAiAfu6Cc14777ve8zp1rJRGtk5oIeS149TOculrTg==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz", + "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==", "requires": { - "@vue/reactivity": "3.1.5", - "@vue/shared": "3.1.5" + "@vue/reactivity": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/runtime-dom": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.1.5.tgz", - "integrity": "sha512-tNcf3JhVR0RfW0kw1p8xZgv30nvX8Y9rsz7eiQ0dHe273sfoCngAG0y4GvMaY4Xd8FsjUwFedd4suQ8Lu8meXg==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz", + "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==", "requires": { - "@vue/runtime-core": "3.1.5", - "@vue/shared": "3.1.5", + "@vue/runtime-core": "3.2.31", + "@vue/shared": "3.2.31", "csstype": "^2.6.8" } }, + "@vue/server-renderer": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz", + "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==", + "requires": { + "@vue/compiler-ssr": "3.2.31", + "@vue/shared": "3.2.31" + } + }, "@vue/shared": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", - "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==" + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz", + "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==" }, "@vue/web-component-wrapper": { "version": "1.3.0", @@ -2255,13 +3317,13 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -2341,10 +3403,10 @@ } } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "ansi-html-community": { + "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==", "dev": true }, "ansi-regex": { @@ -2445,9 +3507,9 @@ "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -2552,18 +3614,26 @@ "dev": true }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", "dev": true, "requires": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + } } }, "aws-sign2": { @@ -2593,13 +3663,13 @@ } }, "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" } @@ -2614,39 +3684,40 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", - "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.14.0" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "base": { "version": "0.11.2", @@ -2762,21 +3833,21 @@ "dev": true }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dev": true, "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "dependencies": { "debug": { @@ -2795,9 +3866,9 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "dev": true } } @@ -2834,6 +3905,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2967,16 +4039,16 @@ } }, "browserslist": { - "version": "4.16.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", - "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001248", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.793", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.73" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "buffer": { @@ -3021,9 +4093,9 @@ "dev": true }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, "cacache": { @@ -3078,6 +4150,28 @@ "mkdirp": "^0.5.1", "neo-async": "^2.6.1", "schema-utils": "^2.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "call-bind": { @@ -3131,9 +4225,9 @@ } }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "caniuse-api": { @@ -3149,9 +4243,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001300", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", - "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "version": "1.0.30001327", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", + "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", "dev": true }, "case-sensitive-paths-webpack-plugin": { @@ -3177,6 +4271,12 @@ "supports-color": "^5.3.0" } }, + "charcodes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", + "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", + "dev": true + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3184,9 +4284,9 @@ "dev": true }, "chart.js": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.5.0.tgz", - "integrity": "sha512-J1a4EAb1Gi/KbhwDRmoovHTRuqT8qdF0kZ4XgwxpGethJHUdDrkqyPYwke0a+BuvSeUxPf8Cos6AX2AB8H8GLA==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.7.1.tgz", + "integrity": "sha512-8knRegQLFnPQAheZV8MjxIXc5gQEfDFD897BJgv/klO/vtIyFFmgMXrNfgrXpbTr/XbTturxRgxIXx/Y+ASJBA==" }, "check-types": { "version": "8.0.3", @@ -3195,9 +4295,9 @@ "dev": true }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "optional": true, "requires": { @@ -3307,9 +4407,9 @@ } }, "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -3323,15 +4423,6 @@ } } }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -3407,9 +4498,9 @@ } }, "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, "cli-width": { @@ -3541,21 +4632,15 @@ "dev": true }, "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3633,7 +4718,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -3675,12 +4761,20 @@ "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "content-type": { @@ -3699,9 +4793,9 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "cookie-signature": { @@ -3819,6 +4913,26 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -3889,17 +5003,17 @@ } }, "core-js": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.1.tgz", - "integrity": "sha512-AAkP8i35EbefU+JddyWi12AWE9f2N/qr/pwnDtWz4nyUIBGMJPX99ANFFRSw6FefM374lDujdtLDyhN2A/btHw==" + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", + "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==" }, "core-js-compat": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.1.tgz", - "integrity": "sha512-NHXQXvRbd4nxp9TEmooTJLUf94ySUG6+DSsscBpTftN1lQLQ4LjnWvc7AoIo4UjDsFF3hB8Uh5LLCRRdaiT5MQ==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", + "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", "dev": true, "requires": { - "browserslist": "^4.16.7", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "dependencies": { @@ -3914,7 +5028,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cosmiconfig": { "version": "5.2.1", @@ -4067,6 +5182,26 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } } } }, @@ -4229,9 +5364,9 @@ } }, "csstype": { - "version": "2.6.17", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", - "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" }, "cyclist": { "version": "1.0.1", @@ -4248,11 +5383,6 @@ "assert-plus": "^1.0.0" } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -4621,15 +5751,17 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, "requires": { "domelementtype": "^2.0.1", "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true } } }, @@ -4642,21 +5774,22 @@ "domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true }, "domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { "domelementtype": "^2.2.0" }, "dependencies": { "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true } } @@ -4739,9 +5872,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.799", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.799.tgz", - "integrity": "sha512-V2rbYWdGvSqrg+95KjkVuSi41bGfrhrOzjl1tSi2VLnm0mRe3FsSvhiqidSiSll9WiMhrQAhpDcW/wcqK3c+Yw==", + "version": "1.4.106", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", + "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", "dev": true }, "elliptic": { @@ -4820,7 +5953,8 @@ "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true }, "errno": { "version": "0.1.8", @@ -4841,32 +5975,35 @@ } }, "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", + "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", "dev": true, "requires": { "stackframe": "^1.1.1" } }, "es-abstract": { - "version": "1.18.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", - "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", + "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.11.0", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -5011,12 +6148,34 @@ "object-assign": "^4.0.1", "object-hash": "^1.1.4", "rimraf": "^2.6.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "eslint-plugin-vue": { - "version": "7.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.15.1.tgz", - "integrity": "sha512-4/r+n/i+ovyeW2gVRRH92kpy4lkpFbyPR4BMxGBTLtGnwqOKKzjSo6EMSaT0RhWPvEjK9uifcY8e7z5n8BIEgw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", + "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", "dev": true, "requires": { "eslint-utils": "^2.1.0", @@ -5195,11 +6354,6 @@ "strip-eof": "^1.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -5251,17 +6405,17 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dev": true, "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -5275,13 +6429,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -5304,9 +6458,15 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } @@ -5516,6 +6676,28 @@ "requires": { "loader-utils": "^1.2.3", "schema-utils": "^2.5.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "filesize": { @@ -5580,9 +6762,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "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==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -5639,9 +6821,9 @@ } }, "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, "for-in": { @@ -5724,7 +6906,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fsevents": { "version": "2.3.2", @@ -5745,15 +6928,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "generic-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", - "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5786,6 +6960,16 @@ "pump": "^3.0.0" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -5805,6 +6989,7 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5852,9 +7037,9 @@ } }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "gzip-size": { @@ -5911,9 +7096,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-tostringtag": { @@ -6098,9 +7283,9 @@ } }, "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true }, "html-webpack-plugin": { @@ -6184,15 +7369,15 @@ } }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { "dom-serializer": "^1.0.1", @@ -6209,30 +7394,22 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } + "toidentifier": "1.0.1" } }, "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", "dev": true }, "http-proxy": { @@ -6284,13 +7461,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "to-regex-range": { @@ -6336,12 +7513,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "icss-utils": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", @@ -6474,6 +7645,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -6482,7 +7654,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "inquirer": { "version": "7.3.3", @@ -6684,10 +7857,13 @@ "dev": true }, "is-bigint": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.3.tgz", - "integrity": "sha512-ZU538ajmYJmzysE5yU4Y7uIrPQ2j704u+hXFiIPQExpqzzUbpe5jCPdTfmz7jXRxZdvjY3KZ3ZNenoXQovX+Dg==", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } }, "is-binary-path": { "version": "2.1.0", @@ -6841,9 +8017,9 @@ } }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -6867,9 +8043,9 @@ } }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -6936,6 +8112,15 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-shared-array-buffer": { + "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==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -6966,6 +8151,15 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -7024,9 +8218,12 @@ "integrity": "sha1-G+i3twTdOFcVJwiu+x1KSzpp+zM=" }, "jquery-ui": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz", - "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE=" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", + "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", + "requires": { + "jquery": ">=1.8.0 <4.0.0" + } }, "js-message": { "version": "1.0.7", @@ -7034,15 +8231,6 @@ "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", "dev": true }, - "js-queue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", - "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", - "dev": true, - "requires": { - "easy-stack": "^1.0.1" - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7071,91 +8259,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "jshint": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.1.tgz", - "integrity": "sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==", - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=" - } - } - }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -7169,9 +8272,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -7192,20 +8295,11 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -7217,14 +8311,14 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -7254,22 +8348,22 @@ "dev": true }, "launch-editor": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", - "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.3.0.tgz", + "integrity": "sha512-3QrsCXejlWYHjBPFXTyGNhPj4rrQdB+5+r5r3wArpLH201aR+nWUgw/zKKkTmilCfY/sv6u8qo98pNvtg8LUTA==", "dev": true, "requires": { - "chalk": "^2.3.0", + "picocolors": "^1.0.0", "shell-quote": "^1.6.1" } }, "launch-editor-middleware": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", - "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.3.0.tgz", + "integrity": "sha512-GJR64trLdFFwCoL9DMn/d1SZX0OzTDPixu4mcfWTShQ4tIqCHCGvlg9fOEYQXyBlrSMQwylsJfUWncheShfV2w==", "dev": true, "requires": { - "launch-editor": "^2.2.1" + "launch-editor": "^2.3.0" } }, "leaflet": { @@ -7278,18 +8372,14 @@ "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" }, "leaflet-providers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.12.0.tgz", - "integrity": "sha512-pU/mR4B+NbayBGCg5/88dmRq7t1EGiNPhsVGV3yqHuDn594vIwus4CiPVW0RtiKJNKg8Vf1pILAbFl0i+yk+lQ==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/leaflet-providers/-/leaflet-providers-1.13.0.tgz", + "integrity": "sha512-f/sN5wdgBbVA2jcCYzScIfYNxKdn2wBJP9bu+5cRX9Xj6g8Bt1G9Sr8WgJAt/ckIFIc3LVVxCBNFpSCfTuUElg==" }, "leaflet.markercluster": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.1.tgz", - "integrity": "sha512-dRGndfMZibkWMBD7g8h+lJW0R0keTx1GGMErre7uhqnKiYBoMxR2VPX6Sy8oGNzg+FA7FKtTuO1hGh5HtV9s2g==", - "requires": { - "jshint": "^2.13.1", - "npm-ci": "0.0.2" - } + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", + "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==" }, "levn": { "version": "0.3.0", @@ -7302,9 +8392,9 @@ } }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "loader-fs-cache": { @@ -7365,25 +8455,14 @@ "dev": true }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } + "json5": "^2.1.2" } }, "locate-path": { @@ -7398,12 +8477,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.debounce": { @@ -7458,9 +8532,9 @@ } }, "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", "dev": true }, "lower-case": { @@ -7479,12 +8553,11 @@ } }, "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "requires": { - "sourcemap-codec": "^1.4.4" + "sourcemap-codec": "^1.4.8" } }, "make-dir": { @@ -7625,24 +8698,24 @@ } }, "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -7663,6 +8736,26 @@ "webpack-sources": "^1.1.0" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -7704,20 +8797,21 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -7838,10 +8932,9 @@ } }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" }, "nanomatch": { "version": "1.2.13", @@ -7869,9 +8962,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -7901,17 +8994,6 @@ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, - "node-ipc": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", - "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", - "dev": true, - "requires": { - "event-pubsub": "4.3.0", - "js-message": "1.0.7", - "js-queue": "2.0.2" - } - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -7952,9 +9034,9 @@ } }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, "normalize-package-data": { @@ -7995,11 +9077,6 @@ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, - "npm-ci": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/npm-ci/-/npm-ci-0.0.2.tgz", - "integrity": "sha1-n2t2IMKFeAL7baJoEGnkCinjEHI=" - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -8074,9 +9151,9 @@ "dev": true }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, "object-is": { @@ -8117,14 +9194,14 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" } }, "object.pick": { @@ -8137,14 +9214,14 @@ } }, "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" } }, "obuf": { @@ -8172,6 +9249,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -8438,7 +9516,8 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", @@ -8500,10 +9579,15 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { @@ -8574,30 +9658,26 @@ "dev": true }, "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -8709,6 +9789,26 @@ "schema-utils": "^1.0.0" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -8854,65 +9954,6 @@ } } }, - "postcss-modules": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.2.2.tgz", - "integrity": "sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==", - "dev": true, - "requires": { - "generic-names": "^2.0.1", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "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", - "string-hash": "^1.1.1" - }, - "dependencies": { - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "postcss-modules-extract-imports": { - "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==", - "dev": true - }, - "postcss-modules-local-by-default": { - "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==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - } - } - }, "postcss-modules-extract-imports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", @@ -9169,9 +10210,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -9209,9 +10250,9 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "prelude-ls": { @@ -9227,9 +10268,9 @@ "dev": true }, "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "dev": true, "optional": true }, @@ -9363,9 +10404,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "query-string": { @@ -9422,13 +10463,13 @@ "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -9477,12 +10518,12 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { @@ -9492,9 +10533,9 @@ "dev": true }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -9511,9 +10552,9 @@ } }, "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -9527,29 +10568,29 @@ "dev": true }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", "dev": true }, "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -9595,22 +10636,22 @@ "dev": true }, "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" } }, "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "dom-serializer": { @@ -9625,15 +10666,15 @@ } }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { "dom-serializer": "^1.0.1", @@ -9872,9 +10913,9 @@ "dev": true }, "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -9887,9 +10928,9 @@ "dev": true }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dev": true, "requires": { "debug": "2.6.9", @@ -9899,9 +10940,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -9931,9 +10972,9 @@ "dev": true }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -10004,15 +11045,15 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "set-blocking": { @@ -10051,9 +11092,9 @@ "dev": true }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "sha.js": { @@ -10082,16 +11123,11 @@ "dev": true }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=" - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -10274,28 +11310,35 @@ } }, "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "requires": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } } }, "sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", + "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", "dev": true, "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", + "debug": "^3.2.7", + "eventsource": "^1.1.0", + "faye-websocket": "^0.11.4", "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" + "url-parse": "^1.5.10" }, "dependencies": { "debug": { @@ -10339,10 +11382,9 @@ "dev": true }, "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "dev": true + "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-resolve": { "version": "0.5.3", @@ -10358,9 +11400,9 @@ } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "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==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -10384,8 +11426,7 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdx-correct": { "version": "3.1.1", @@ -10414,9 +11455,9 @@ } }, "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, "spdy": { @@ -10475,9 +11516,9 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -10507,9 +11548,9 @@ "dev": true }, "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", + "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==", "dev": true }, "static-extend": { @@ -10584,12 +11625,6 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -10941,6 +11976,28 @@ "loader-runner": "^2.3.1", "loader-utils": "^1.1.0", "neo-async": "^2.6.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "through": { @@ -10998,7 +12055,8 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-object-path": { "version": "0.3.0", @@ -11043,9 +12101,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, "toposort": { @@ -11171,31 +12229,31 @@ } }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "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==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "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==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, "union-value": { @@ -11352,12 +12410,34 @@ "loader-utils": "^1.2.3", "mime": "^2.4.4", "schema-utils": "^2.5.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "requires": { "querystringify": "^2.1.1", @@ -11469,19 +12549,21 @@ "dev": true }, "vue": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.1.5.tgz", - "integrity": "sha512-Ho7HNb1nfDoO+HVb6qYZgeaobt1XbY6KXFe4HGs1b9X6RhkWG/113n4/SrtM1LUclM6OrP/Se5aPHHvAPG1iVQ==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz", + "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==", "requires": { - "@vue/compiler-dom": "3.1.5", - "@vue/runtime-dom": "3.1.5", - "@vue/shared": "3.1.5" + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-sfc": "3.2.31", + "@vue/runtime-dom": "3.2.31", + "@vue/server-renderer": "3.2.31", + "@vue/shared": "3.2.31" } }, "vue-eslint-parser": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.10.0.tgz", - "integrity": "sha512-7tc/ewS9Vq9Bn741pvpg8op2fWJPH3k32aL+jcIcWGCTzh/zXSdh7pZ5FV3W2aJancP9+ftPAv292zY5T5IPCg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", + "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -11517,9 +12599,9 @@ "dev": true }, "vue-json-pretty": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-2.0.4.tgz", - "integrity": "sha512-17opXQveJOkxWu6NzjXqtIelm3DeQfeQUevbfRAw91eZXix2hNzGAwGrkqEDWhLMDVpENm2NhVpYqzB8eQzytg==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-2.0.6.tgz", + "integrity": "sha512-aVdxw8ZRGR/Uj8GEaJ1/W2Ks/MdCfv5t2HRbbd+ICp3nL7msKRLN+1qOkSzaMvDygbDPxGhwUHBxZz8nxP+r3A==" }, "vue-loader": { "version": "15.9.8", @@ -11539,15 +12621,104 @@ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, "vue-router": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.11.tgz", - "integrity": "sha512-sha6I8fx9HWtvTrFZfxZkiQQBpqSeT+UCwauYjkdOQYRvwsGwimlQQE2ayqUwuuXGzquFpCPoXzYKWlzL4OuXg==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.14.tgz", + "integrity": "sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==", "requires": { - "@vue/devtools-api": "^6.0.0-beta.14" + "@vue/devtools-api": "^6.0.0" } }, "vue-style-loader": { @@ -11565,6 +12736,26 @@ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } } } }, @@ -11771,6 +12962,26 @@ "webpack-sources": "^1.4.1" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -11837,12 +13048,12 @@ } }, "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -11948,9 +13159,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -12099,9 +13310,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -12145,9 +13356,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -12328,7 +13539,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write": { "version": "1.0.3", diff --git a/event-management/web-admin/package.json b/event-management/web-admin/package.json index 053649b6c..68c99c3de 100644 --- a/event-management/web-admin/package.json +++ b/event-management/web-admin/package.json @@ -9,33 +9,33 @@ }, "dependencies": { "@tip2tail/jqvmap": "^1.6.0", - "chart.js": "^3.5.0", - "core-js": "^3.6.5", + "chart.js": "^3.7.1", + "core-js": "^3.21.1", "jquery": "^3.6.0", "jquery-knob": "^1.2.11", "jquery-sparkline": "^2.4.0", - "jquery-ui": "^1.12.1", + "jquery-ui": "^1.13.1", "jvectormap-content": "^0.1.0", "jvectormap-next": "^3.1.1", "leaflet": "^1.7.1", - "leaflet-providers": "^1.12.0", - "leaflet.markercluster": "^1.5.1", + "leaflet-providers": "^1.13.0", + "leaflet.markercluster": "^1.5.3", "mitt": "^3.0.0", - "vue": "^3.0.0", + "vue": "^3.2.31", "vue-gauge": "^1.0.3", - "vue-json-pretty": "^2.0.4", - "vue-router": "^4.0.11", + "vue-json-pretty": "^2.0.6", + "vue-router": "^4.0.14", "vue-world-map": "^0.1.1", "vue3-blocks-tree": "^0.5.2" }, "devDependencies": { - "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "@vue/compiler-sfc": "^3.0.0", + "@vue/cli-plugin-babel": "^4.5.17", + "@vue/cli-plugin-eslint": "^4.5.17", + "@vue/cli-service": "^4.5.17", + "@vue/compiler-sfc": "^3.2.31", "babel-eslint": "^10.1.0", "eslint": "^6.7.2", - "eslint-plugin-vue": "^7.0.0" + "eslint-plugin-vue": "^7.20.0" }, "eslintConfig": { "root": true, -- GitLab From bbb13127ca5c3364ff14dacf71c55735a17e684c Mon Sep 17 00:00:00 2001 From: ipatini Date: Fri, 8 Apr 2022 13:45:01 +0300 Subject: [PATCH 16/76] EMS: Baguette Client: Updated config. files in 'baguette-client' module --- .../baguette-client/conf/baguette-client.properties | 1 + .../conf/eu.melodic.event.brokercep.properties | 12 ++++-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/event-management/baguette-client/conf/baguette-client.properties b/event-management/baguette-client/conf/baguette-client.properties index dded92041..deb4020fc 100644 --- a/event-management/baguette-client/conf/baguette-client.properties +++ b/event-management/baguette-client/conf/baguette-client.properties @@ -16,6 +16,7 @@ exit-command-allowed = false #kill-delay = 10 IP_SETTING=${IP_SETTING} +EMS_CLIENT_ADDRESS=${${IP_SETTING}} # ----------------------------------------------------------------------------- # Client Id and Baguette Server credentials diff --git a/event-management/baguette-client/conf/eu.melodic.event.brokercep.properties b/event-management/baguette-client/conf/eu.melodic.event.brokercep.properties index f6f46317c..7937665c5 100644 --- a/event-management/baguette-client/conf/eu.melodic.event.brokercep.properties +++ b/event-management/baguette-client/conf/eu.melodic.event.brokercep.properties @@ -27,8 +27,7 @@ brokercep.broker-url-3 = brokercep.broker-url-properties = transport.daemon=true&transport.trace=false&transport.useKeepAlive=true&transport.useInactivityMonitor=false&transport.needClientAuth=${brokercep.ssl.client-auth.required}&transport.verifyHostName=true&transport.connectionTimeout=0&transport.keepAlive=true brokercep.ssl.client-auth.required = false brokercep.broker-url-for-consumer = tcp://127.0.0.1:61616?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true -brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${IP_SETTING}:${brokercep.broker-port}?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true -#brokercep.broker-url-for-clients = tcp://127.0.0.1:61616?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true +brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${EMS_CLIENT_ADDRESS}:${brokercep.broker-port}?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true # Must be a public IP address # Key store @@ -45,12 +44,9 @@ brokercep.ssl.truststore-password = ENC(ISMbn01HVPbtRPkqm2Lslg==) brokercep.ssl.certificate-file = ${MELODIC_CONFIG_DIR}/client-broker.crt # Key-and-Cert data brokercep.ssl.key-entry-generate = IF-IP-CHANGED -brokercep.ssl.key-entry-name = ${IP_SETTING} -brokercep.ssl.key-entry-dname = CN=${IP_SETTING},OU=Information Management Unit (IMU),O=Institute of Communication and Computer Systems (ICCS),L=Athens,ST=Attika,C=GR -brokercep.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:%{DEFAULT_IP}%,ip:%{PUBLIC_IP}% -# Public and Default IP address defaults (if case NetUtil fails to detect any of them) -#control.ssl.default-ip-address = -#control.ssl.public-ip-address = +brokercep.ssl.key-entry-name = ${EMS_CLIENT_ADDRESS} +brokercep.ssl.key-entry-dname = CN=${EMS_CLIENT_ADDRESS},OU=Information Management Unit (IMU),O=Institute of Communication and Computer Systems (ICCS),L=Athens,ST=Attika,C=GR +brokercep.ssl.key-entry-ext-san = dns:localhost,ip:127.0.0.1,ip:${DEFAULT_IP},ip:${PUBLIC_IP} # Authentication and Authorization settings brokercep.authentication-enabled = true -- GitLab From 1213268a149cd6c778ce9426fae1c136fa292307 Mon Sep 17 00:00:00 2001 From: ipatini Date: Fri, 8 Apr 2022 16:14:03 +0300 Subject: [PATCH 17/76] EMS: Control Service: Minor code improvement --- .../melodic/event/control/ControlServiceController.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java index d2ec32a2c..57ddb3c47 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java @@ -35,6 +35,7 @@ import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.BadRequestException; @@ -419,8 +420,12 @@ public class ControlServiceController { staticResourceContext = StringUtils.substringBeforeLast(staticResourceContext,"/**"); staticResourceContext = StringUtils.substringBeforeLast(staticResourceContext,"/*"); if (!staticResourceContext.startsWith("/")) staticResourceContext = "/"+staticResourceContext; - String baseUrl = - request.getScheme()+"://"+ coordinator.getServerIpAddress() +":"+request.getServerPort()+staticResourceContext; + /*String baseUrl = + request.getScheme()+"://"+ coordinator.getServerIpAddress() +":"+request.getServerPort()+staticResourceContext;*/ + String baseUrl = ServletUriComponentsBuilder.fromRequestUri(request) + .host(coordinator.getServerIpAddress()) + .replacePath(staticResourceContext) + .build().toUriString(); log.debug("ControlServiceController.baguetteRegisterNode(): baseUrl={}", baseUrl); // Get IP Setting and Client ID -- GitLab From a92a0256b548c4e4216ec651cda87165168d5e95 Mon Sep 17 00:00:00 2001 From: ipatini Date: Fri, 8 Apr 2022 16:52:13 +0300 Subject: [PATCH 18/76] EMS: Baguette Server: Removed unneeded methods from 'BaguetteServerProperties' class. --- .../install/helper/VmInstallationHelper.java | 3 ++- .../properties/BaguetteServerProperties.java | 23 ------------------- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/VmInstallationHelper.java b/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/VmInstallationHelper.java index d72f9ab26..71e6921b1 100644 --- a/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/VmInstallationHelper.java +++ b/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/VmInstallationHelper.java @@ -19,6 +19,7 @@ import eu.melodic.event.baguette.client.install.instruction.Instruction; import eu.melodic.event.baguette.server.BaguetteServer; import eu.melodic.event.baguette.server.NodeRegistryEntry; import eu.melodic.event.util.CredentialsMap; +import eu.melodic.event.util.NetUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringSubstitutor; @@ -167,7 +168,7 @@ public class VmInstallationHelper extends AbstractInstallationHelper { // Load client config. template and prepare configuration nodeMap.put("BAGUETTE_CLIENT_ID", clientId); nodeMap.put("BAGUETTE_SERVER_ADDRESS", baguette.getConfiguration().getServerAddress()); - nodeMap.put("BAGUETTE_SERVER_HOSTNAME", baguette.getConfiguration().getServerHostname()); + nodeMap.put("BAGUETTE_SERVER_HOSTNAME", NetUtil.getHostname()); nodeMap.put("BAGUETTE_SERVER_PORT", ""+baguette.getConfiguration().getServerPort()); nodeMap.put("BAGUETTE_SERVER_PUBKEY", baguette.getServerPubkey()); nodeMap.put("BAGUETTE_SERVER_PUBKEY_FINGERPRINT", baguette.getServerPubkeyFingerprint()); diff --git a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/properties/BaguetteServerProperties.java b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/properties/BaguetteServerProperties.java index 36fe7b760..8a01e3fc5 100644 --- a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/properties/BaguetteServerProperties.java +++ b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/properties/BaguetteServerProperties.java @@ -11,10 +11,8 @@ package eu.melodic.event.baguette.server.properties; import eu.melodic.event.baguette.server.ServerCoordinator; import eu.melodic.event.util.CredentialsMap; -import eu.melodic.event.util.NetUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -71,30 +69,9 @@ public class BaguetteServerProperties { @Min(-1) private int NumberOfSegments; - //@Value("#{ '${baguette.server.address}'!='' ? '${baguette.server.address}' : T(eu.melodic.event.util.NetUtil).getPublicIpAddress() }") @Value("${baguette.server.address:}") private String serverAddress; - public String getServerAddress() { - String oldVal = serverAddress; - if (StringUtils.isEmpty(serverAddress) || "%{PUBLIC_IP}%".equals(serverAddress.trim())) { - serverAddress = NetUtil.getPublicIpAddress(); - log.info("BaguetteServerProperties: Set serverAddress to PUBLIC: {} -> {}", oldVal, serverAddress); - } else if ("%{DEFAULT_IP}%".equals(serverAddress.trim())) { - serverAddress = eu.melodic.event.util.NetUtil.getDefaultIpAddress(); - log.info("BaguetteServerProperties: Set serverAddress to DEFAULT: {} -> {}", oldVal, serverAddress); - } - return serverAddress; - } - - public String getServerHostname() { - return NetUtil.getHostname(); - } - - public String getCanonicalHostName() { - return NetUtil.getCanonicalHostName(); - } - @Value("${baguette.server.port:2222}") @Min(value = 1, message = "Valid server ports are between 1 and 65535. Please prefer ports higher than 1023.") @Max(value = 65535, message = "Valid server ports are between 1 and 65535. Please prefer ports higher than 1023.") -- GitLab From e5b36bce48d714e2343d2ed639b381f2d6572e99 Mon Sep 17 00:00:00 2001 From: ipatini Date: Fri, 8 Apr 2022 16:53:10 +0300 Subject: [PATCH 19/76] EMS: Baguette Client Install: Removed occurrences of '%{DEFAULT_IP/PUBLIC_IP}%' from AbstractInstallationHelper class --- .../client/install/helper/AbstractInstallationHelper.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/AbstractInstallationHelper.java b/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/AbstractInstallationHelper.java index 3f332ae02..4b87ca660 100644 --- a/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/AbstractInstallationHelper.java +++ b/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/AbstractInstallationHelper.java @@ -271,8 +271,6 @@ public abstract class AbstractInstallationHelper implements InitializingBean, Ap protected String _prepareUrl(String urlTemplate, String baseUrl) { return urlTemplate - .replace("%{BASE_URL}%", Optional.ofNullable(baseUrl).orElse("")) - .replace("%{PUBLIC_IP}%", Optional.ofNullable(NetUtil.getPublicIpAddress()).orElse("")) - .replace("%{DEFAULT_IP}%", Optional.ofNullable(NetUtil.getDefaultIpAddress()).orElse("")); + .replace("%{BASE_URL}%", Optional.ofNullable(baseUrl).orElse("")); } } -- GitLab From 86aae4748c6018dfaa51e1b1b684790004bae5ef Mon Sep 17 00:00:00 2001 From: ipatini Date: Fri, 8 Apr 2022 17:56:11 +0300 Subject: [PATCH 20/76] EMS: Broker-CEP, Util: Removed code related to replacing occurrences of '%{DEFAULT_IP/PUBLIC_IP}%' to their actual values. Removed unused methods from 'IKeystoreAndCertificateProperties' and 'KeystoreAndCertificateProperties'. Few minor code improvements. --- .../event/brokercep/broker/BrokerConfig.java | 4 +- .../properties/BrokerCepProperties.java | 4 -- .../IKeystoreAndCertificateProperties.java | 9 +-- .../KeystoreAndCertificateProperties.java | 38 ------------ .../eu/melodic/event/util/KeystoreUtil.java | 62 +++++++------------ 5 files changed, 25 insertions(+), 92 deletions(-) diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/broker/BrokerConfig.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/broker/BrokerConfig.java index 4b10425f1..54faa77af 100644 --- a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/broker/BrokerConfig.java +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/broker/BrokerConfig.java @@ -167,11 +167,11 @@ public class BrokerConfig implements InitializingBean { this.brokerCert = KeystoreUtil .getKeystore(properties.getSsl().getKeystoreFile(), properties.getSsl().getKeystoreType(), properties.getSsl().getKeystorePassword()) .passwordUtil(passwordUtil) - .getEntryCertificateAsPEM(properties.getSsl().getKeyEntryNameValue()); + .getEntryCertificateAsPEM(properties.getSsl().getKeyEntryName()); log.trace("BrokerConfig.initializeKeyAndCert(): Retrieving certificate for Broker-SSL: file={}, type={}, password={}, alias={}, cert=\n{}", properties.getSsl().getKeystoreFile(), properties.getSsl().getKeystoreType(), passwordUtil.encodePassword(properties.getSsl().getKeystorePassword()), - properties.getSsl().getKeyEntryNameValue(), this.brokerCert); + properties.getSsl().getKeyEntryName(), this.brokerCert); log.info("BrokerConfig.initializeKeyAndCert(): Initializing keystore, truststore and certificate for Broker-SSL... done"); } diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java index 667fe90c1..5a0c762a1 100644 --- a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java @@ -38,10 +38,6 @@ public class BrokerCepProperties { @Value("#{ '${brokercep.broker-url-for-clients}'!='' ? '${brokercep.broker-url-for-clients}' : 'ssl://'+T(eu.melodic.event.util.NetUtil).getPublicIpAddress()+':61616' }") private String brokerUrlForClients; - public String getBrokerUrl() { return KeystoreAndCertificateProperties.prepareUrl(brokerUrl); } - public String getBrokerUrlForConsumer() { return KeystoreAndCertificateProperties.prepareUrl(brokerUrlForConsumer); } - public String getBrokerUrlForClients() { return KeystoreAndCertificateProperties.prepareUrl(brokerUrlForClients); } - @Value("${default-ip-address:}") private String defaultIpAddress; @Value("${public-ip-address:}") diff --git a/event-management/util/src/main/java/eu/melodic/event/util/IKeystoreAndCertificateProperties.java b/event-management/util/src/main/java/eu/melodic/event/util/IKeystoreAndCertificateProperties.java index 17b686d8b..803c77c46 100644 --- a/event-management/util/src/main/java/eu/melodic/event/util/IKeystoreAndCertificateProperties.java +++ b/event-management/util/src/main/java/eu/melodic/event/util/IKeystoreAndCertificateProperties.java @@ -11,10 +11,7 @@ package eu.melodic.event.util; public interface IKeystoreAndCertificateProperties { - public enum KEY_ENTRY_GENERATE { YES, ALWAYS, NO, NEVER, IF_MISSING, IF_IP_CHANGED }; - - String getDefaultIpAddress(); - String getPublicIpAddress(); + enum KEY_ENTRY_GENERATE { YES, ALWAYS, NO, NEVER, IF_MISSING, IF_IP_CHANGED }; String getKeystoreFile(); String getKeystoreType(); @@ -28,8 +25,4 @@ public interface IKeystoreAndCertificateProperties { String getKeyEntryName(); String getKeyEntryDName(); String getKeyEntryExtSAN(); - - public String getKeyEntryNameValue(); - public String getKeyEntryDNameValue(); - public String getKeyEntryExtSANValue(); } diff --git a/event-management/util/src/main/java/eu/melodic/event/util/KeystoreAndCertificateProperties.java b/event-management/util/src/main/java/eu/melodic/event/util/KeystoreAndCertificateProperties.java index 01dbb8556..7a2e23ec9 100644 --- a/event-management/util/src/main/java/eu/melodic/event/util/KeystoreAndCertificateProperties.java +++ b/event-management/util/src/main/java/eu/melodic/event/util/KeystoreAndCertificateProperties.java @@ -19,9 +19,6 @@ import org.apache.commons.lang3.StringUtils; @ToString(exclude = {"truststorePassword", "keystorePassword"}) public class KeystoreAndCertificateProperties implements IKeystoreAndCertificateProperties { - private String defaultIpAddress; - private String publicIpAddress; - private String keystoreFile; private String keystoreType; private String keystorePassword; @@ -36,39 +33,4 @@ public class KeystoreAndCertificateProperties implements IKeystoreAndCertificate private String keyEntryName; private String keyEntryDName; private String keyEntryExtSAN; - - public String getKeyEntryNameValue() { return prepareValue(keyEntryName, this.publicIpAddress, this.defaultIpAddress, "127.0.0.1"); } - public String getKeyEntryDNameValue() { return prepareValue(keyEntryDName, this.publicIpAddress, this.defaultIpAddress, "127.0.0.1"); } - public String getKeyEntryExtSANValue() { return prepareValue(keyEntryExtSAN, this.publicIpAddress, this.defaultIpAddress, "127.0.0.1"); } - - // ------------------------------------------------------------------------ - // Helper methods - // ------------------------------------------------------------------------ - - public static String prepareUrl(String url) { - return prepareValue(url, ""); - } - - public static String prepareValue(String value, String defaultValue) { return prepareValue(value, null, null, ""); } - - public static String prepareValue(String value, String publicIpAddress, String defaultIpAddress, String defaultValue) { - if (value==null) return null; - String pubIpAddr = ""; - if (value.contains("%{PUBLIC_IP}%")) { - pubIpAddr = NetUtil.getPublicIpAddress(); - pubIpAddr = StringUtils.isNotBlank(pubIpAddr) - ? pubIpAddr - : StringUtils.isNotBlank(publicIpAddress) ? publicIpAddress : defaultValue; - } - String defIpAddr = ""; - if (value.contains("%{DEFAULT_IP}%")) { - defIpAddr = NetUtil.getDefaultIpAddress(); - defIpAddr = StringUtils.isNotBlank(defIpAddr) - ? defIpAddr - : StringUtils.isNotBlank(defaultIpAddress) ? defaultIpAddress : defaultValue; - } - return value - .replace("%{PUBLIC_IP}%", pubIpAddr) - .replace("%{DEFAULT_IP}%", defIpAddr); - } } diff --git a/event-management/util/src/main/java/eu/melodic/event/util/KeystoreUtil.java b/event-management/util/src/main/java/eu/melodic/event/util/KeystoreUtil.java index 9d2eaedbf..0efcf3bba 100644 --- a/event-management/util/src/main/java/eu/melodic/event/util/KeystoreUtil.java +++ b/event-management/util/src/main/java/eu/melodic/event/util/KeystoreUtil.java @@ -50,9 +50,9 @@ public class KeystoreUtil { private static boolean bcProviderInitialized = false; - private String keystoreFile; - private String keystoreType; - private String keystorePassword; + private final String keystoreFile; + private final String keystoreType; + private final String keystorePassword; private PasswordUtil passwordUtil; // KeystoreUtil instance methods @@ -110,9 +110,6 @@ public class KeystoreUtil { } public KeystoreUtil createKeyAndCert(String entryName, String keyGenAlg, int keySize, String sigAlg, int startDateOffset, int endDateOffset, String dn, String extSAN) throws Exception { - // Replace PUBLIC_IP and DEFAULT_IP placeholders with actual values - dn = _processPlaceholders(dn, "127.0.0.1"); - extSAN = _processPlaceholders(extSAN, "127.0.0.1"); boolean hasExt = StringUtils.isNotBlank(extSAN); // Read keystore from file or create it @@ -209,22 +206,6 @@ public class KeystoreUtil { return this; } - // Replace PUBLIC_IP and DEFAULT_IP placeholders with actual values - private String _processPlaceholders(String s, String defaultValue) { - if (s==null) return null; - if (s.contains("%{PUBLIC_IP}%")) { - String publicIp = NetUtil.getPublicIpAddress(); - if (StringUtils.isBlank(publicIp)) publicIp = defaultValue; - s = s.replace("%{PUBLIC_IP}%", publicIp); - } - if (s.contains("%{DEFAULT_IP}%")) { - String defaultIp = NetUtil.getDefaultIpAddress(); - if (StringUtils.isBlank(defaultIp)) defaultIp=defaultValue; - s = s.replace("%{DEFAULT_IP}%", defaultIp); - } - return s; - } - public KeystoreUtil createOrReplaceKeyAndCert(String entryName, String keyGenAlg, int keySize, String sigAlg, int startDateOffset, int endDateOffset, String dn, String ext) throws Exception { return this .deleteEntry(entryName) @@ -232,7 +213,8 @@ public class KeystoreUtil { } public KeystoreUtil createKeyAndCertWithSAN(String entryName, String dn) throws Exception { - String sanExt = "dns:localhost,ip:127.0.0.1,ip:%{DEFAULT_IP}%,ip:%{PUBLIC_IP}%"; + String sanExt = String.format("dns:localhost,ip:127.0.0.1,ip:%s,ip:%s", + NetUtil.getDefaultIpAddress(), NetUtil.getPublicIpAddress()); return createKeyAndCert(entryName, dn, sanExt); } @@ -435,9 +417,9 @@ public class KeystoreUtil { log.debug(" Trust store type: {}", properties.getTruststoreType()); log.debug(" Trust store password: {}", truststorePassword); log.debug(" Certificate file: {}", properties.getCertificateFile()); - log.debug(" Entry name: {}", properties.getKeyEntryNameValue()); - log.debug(" Entry DName: {}", properties.getKeyEntryDNameValue()); - log.debug(" Entry SAN: {}", properties.getKeyEntryExtSANValue()); + log.debug(" Entry name: {}", properties.getKeyEntryName()); + log.debug(" Entry DName: {}", properties.getKeyEntryDName()); + log.debug(" Entry SAN: {}", properties.getKeyEntryExtSAN()); log.debug(" Entry Gen.: {}", properties.getKeyEntryGenerate()); IKeystoreAndCertificateProperties.KEY_ENTRY_GENERATE keyGen = properties.getKeyEntryGenerate(); @@ -459,11 +441,11 @@ public class KeystoreUtil { boolean containsEntry = KeystoreUtil .getKeystore(properties.getKeystoreFile(), properties.getKeystoreType(), properties.getKeystorePassword()) .passwordUtil(passwordUtil) - .containsEntry(properties.getKeyEntryNameValue()); + .containsEntry(properties.getKeyEntryName()); if (containsEntry) { - log.debug(" Keystore already contains entry: {}", properties.getKeyEntryNameValue()); + log.debug(" Keystore already contains entry: {}", properties.getKeyEntryName()); } else { - log.debug(" Keystore does not contain entry: {}", properties.getKeyEntryNameValue()); + log.debug(" Keystore does not contain entry: {}", properties.getKeyEntryName()); gen = true; } } @@ -484,7 +466,7 @@ public class KeystoreUtil { List addrList = KeystoreUtil .getKeystore(properties.getKeystoreFile(), properties.getKeystoreType(), properties.getKeystorePassword()) .passwordUtil(passwordUtil) - .getEntryNames(properties.getKeyEntryNameValue(), true); + .getEntryNames(properties.getKeyEntryName(), true); log.debug(" Entry addresses: {}", addrList); // get current Default and Public IP addresses @@ -501,30 +483,30 @@ public class KeystoreUtil { // Generate new key pair and certificate, and update keystore and trust store if (gen) { - log.debug(" Generating new Key pair and Certificate for: {}", properties.getKeyEntryNameValue()); + log.debug(" Generating new Key pair and Certificate for: {}", properties.getKeyEntryName()); KeystoreUtil ksUtil = KeystoreUtil .getKeystore(properties.getKeystoreFile(), properties.getKeystoreType(), properties.getKeystorePassword()) .passwordUtil(passwordUtil) .createIfNotExist(); - if (StringUtils.isBlank(properties.getKeyEntryExtSANValue())) { - log.debug(" Create/Replace entry (with SAN auto-generate): {}", properties.getKeyEntryNameValue()); - ksUtil.createOrReplaceKeyAndCertWithSAN(properties.getKeyEntryNameValue(), properties.getKeyEntryDNameValue()); + if (StringUtils.isBlank(properties.getKeyEntryExtSAN())) { + log.debug(" Create/Replace entry (with SAN auto-generate): {}", properties.getKeyEntryName()); + ksUtil.createOrReplaceKeyAndCertWithSAN(properties.getKeyEntryName(), properties.getKeyEntryDName()); } else { log.debug(" Create/Replace entry and SAN: entry={}, san={}", - properties.getKeyEntryNameValue(), properties.getKeyEntryExtSANValue()); - String extSAN = properties.getKeyEntryExtSANValue().trim(); - ksUtil.createOrReplaceKeyAndCert(properties.getKeyEntryNameValue(), properties.getKeyEntryDNameValue(), extSAN); + properties.getKeyEntryName(), properties.getKeyEntryExtSAN()); + String extSAN = properties.getKeyEntryExtSAN().trim(); + ksUtil.createOrReplaceKeyAndCert(properties.getKeyEntryName(), properties.getKeyEntryDName(), extSAN); } log.debug(" Exporting certificate to: {}", properties.getCertificateFile()); - ksUtil.exportCertToFile(properties.getKeyEntryNameValue(), properties.getCertificateFile()); + ksUtil.exportCertToFile(properties.getKeyEntryName(), properties.getCertificateFile()); KeystoreUtil tsUtil = KeystoreUtil .getKeystore(properties.getTruststoreFile(), properties.getTruststoreType(), properties.getTruststorePassword()) .passwordUtil(passwordUtil) .createIfNotExist(); log.debug(" Importing certificate to trust store: {}", properties.getTruststoreFile()); - tsUtil.importAndReplaceCertFromFile(properties.getKeyEntryNameValue(), properties.getCertificateFile()); + tsUtil.importAndReplaceCertFromFile(properties.getKeyEntryName(), properties.getCertificateFile()); log.debug(" Key pair and Certificate generation completed"); } else { @@ -536,7 +518,7 @@ public class KeystoreUtil { String certPemStr = KeystoreUtil .getKeystore(properties.getKeystoreFile(), properties.getKeystoreType(), properties.getKeystorePassword()) .passwordUtil(passwordUtil) - .getEntryCertificateAsPEM(properties.getKeyEntryNameValue()); + .getEntryCertificateAsPEM(properties.getKeyEntryName()); log.debug(" Certificate (PEM):\n{}", certPemStr); } } -- GitLab From fc4d2839a9d4562705e09eab66434864a4df35fe Mon Sep 17 00:00:00 2001 From: ipatini Date: Fri, 8 Apr 2022 21:28:43 +0300 Subject: [PATCH 21/76] EMS: Broker-CEP, config-files: Changed 'brokerUrl' field in 'BrokerCepProperties' class (i.e. 'brokercep.broker-url' property), into List of broker connector URLs (the 1st is the main connector). Removed 'brokerUrlProperties' and 'clientAuthRequired' properties and related code (they were appended to the main connnector URL). Removed unneeded fields 'defaultIpAddress' and 'publicIpAddress'. Extended 'BrokerConfig' class to initialize all connectors in 'brokerUrl' (not only the main and 2 additional as before). Connectors can arbitrarily be either SSL or non-SSL. Updated configuration files (eu.melodic.event.brokercep.properties). --- .../event/brokercep/broker/BrokerConfig.java | 75 ++++++++++--------- .../properties/BrokerCepProperties.java | 21 +++--- .../eu.melodic.event.brokercep.properties | 17 +++-- .../eu.melodic.event.brokercep.properties | 17 +++-- 4 files changed, 67 insertions(+), 63 deletions(-) diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/broker/BrokerConfig.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/broker/BrokerConfig.java index 54faa77af..56808de7c 100644 --- a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/broker/BrokerConfig.java +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/broker/BrokerConfig.java @@ -30,7 +30,6 @@ import org.apache.activemq.usage.SystemUsage; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -80,12 +79,7 @@ public class BrokerConfig implements InitializingBean { private KeyStore truststore; - @Value("${brokercep.broker-url-2}") - private String brokerUrl2; - @Value("${brokercep.broker-url-3}") - private String brokerUrl3; - - private HashMap connectionFactoryCache = new HashMap<>(); + private final HashMap connectionFactoryCache = new HashMap<>(); @Override public void afterPropertiesSet() throws Exception { @@ -238,31 +232,41 @@ public class BrokerConfig implements InitializingBean { /** * Creates an embedded JMS server - * - * @return - * @throws Exception */ - @Bean//(initMethod = "start", destroyMethod = "stop") + @Bean public BrokerService createBrokerService() throws Exception { // Create new broker service instance String brokerUrl = getBrokerUrl(); log.info("BrokerConfig: Creating new Broker Service instance: url={}", brokerUrl); - BrokerService brokerService; - if (brokerUrl.startsWith("ssl")) { - brokerService = _createSslBrokerService(); - } else { - brokerService = new BrokerService(); - brokerService.addConnector(brokerUrl); - } + SslBrokerService brokerService = new SslBrokerService();; brokerService.setBrokerName(getBrokerName()); - // Start additional connectors (non-SSL) - log.debug("BrokerConfig: 2nd connector: {}", brokerUrl2); - log.debug("BrokerConfig: 3rd connector: {}", brokerUrl3); - if (StringUtils.isNotEmpty(brokerUrl2)) brokerService.addConnector(brokerUrl2); - if (StringUtils.isNotEmpty(brokerUrl3)) brokerService.addConnector(brokerUrl3); + // Initialize keystore and truststore for broker SSL connectors + KeyManager[] keystore = null; + TrustManager[] truststore = null; + if (secureConnectorsExist()) { + keystore = readKeystore(); + truststore = readTruststore(); + } + + // Start broker connectors + if (properties.getBrokerUrlList()!=null) { + int i = 1; + for (String url : properties.getBrokerUrlList()) { + if (StringUtils.isNotBlank(url)) { + String num = (i==1 ? "st" : (i==2 ? "nd" : "rd")); + log.info("BrokerConfig: {}{} connector: {}", i++, num, url); + if (isSecureUrl(url)) + // Add an SSL broker connector + brokerService.addSslConnector(url, keystore, truststore, null); + else + // Add a non-SSL broker connector + brokerService.addConnector(url); + } + } + } // Set authentication and authorization plugins List plugins = new ArrayList<>(); @@ -284,7 +288,7 @@ public class BrokerConfig implements InitializingBean { brokerService.setEnableStatistics(properties.isEnableStatistics()); // Change the JMX connector port - if (properties != null && properties.getConnectorPort() > 0) { + if (properties.getConnectorPort() > 0) { if (brokerService.getManagementContext() != null) { log.info("BrokerConfig.createBrokerService(): Setting connector port to: {}", properties.getConnectorPort()); brokerService.getManagementContext().setConnectorPort(properties.getConnectorPort()); @@ -372,18 +376,19 @@ public class BrokerConfig implements InitializingBean { log.info("BrokerConfig: Registering message interceptors... done"); } - private BrokerService _createSslBrokerService() throws Exception { - // Create new SSL broker service instance - SslBrokerService brokerService = new SslBrokerService(); - - // Add ActiveMQ SSL connector using configured keystore and truststore - final KeyManager[] keystore = readKeystore(); - final TrustManager[] truststore = readTruststore(); - String props = Optional.ofNullable(properties.getBrokerUrlProperties()).orElse("").trim(); - if (!props.isEmpty() && !props.startsWith("?")) props = "?" + props; - brokerService.addSslConnector(properties.getBrokerUrl() + props, keystore, truststore, null); + private boolean isSecureUrl(String url) { + int p = url.indexOf(":"); + if (p<=0) return false; + String scheme = url.substring(0, p); + return scheme.startsWith("ssl") || scheme.contains("+ssl") || scheme.startsWith("https:"); + } - return brokerService; + private boolean secureConnectorsExist() { + if (properties.getBrokerUrlList()!=null) { + for (String url : properties.getBrokerUrlList()) + if (isSecureUrl(url.trim())) return true; + } + return false; } private KeyManager[] readKeystore() throws Exception { diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java index 5a0c762a1..b53d1f1d6 100644 --- a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java @@ -18,35 +18,32 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +@Slf4j @Data @Configuration @ConfigurationProperties(prefix = "brokercep") @PropertySource("file:${MELODIC_CONFIG_DIR}/eu.melodic.event.brokercep.properties") -@Slf4j public class BrokerCepProperties { @Value("${broker-name:broker}") private String brokerName; - @Value("${broker-url:ssl://0.0.0.0:61616}") - private String brokerUrl; + + // Broker connector URLs + private List brokerUrl = Collections.singletonList("ssl://0.0.0.0:61616"); + + public String getBrokerUrl() { return brokerUrl.get(0); } + public List getBrokerUrlList() { return brokerUrl; } + @Value("${broker-url-for-consumer:ssl://127.0.0.1:61616}") private String brokerUrlForConsumer; @Value("#{ '${brokercep.broker-url-for-clients}'!='' ? '${brokercep.broker-url-for-clients}' : 'ssl://'+T(eu.melodic.event.util.NetUtil).getPublicIpAddress()+':61616' }") private String brokerUrlForClients; - @Value("${default-ip-address:}") - private String defaultIpAddress; - @Value("${public-ip-address:}") - private String publicIpAddress; - - @Value("${broker-url-properties:}") - private String brokerUrlProperties; - @Value("${brokercep.ssl.client-auth.required:false}") - private boolean clientAuthRequired; @Value("${connector-port:-1}") private int connectorPort; @Value("${bypass-local-broker:false}") diff --git a/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties b/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties index b9590d126..72ed85e16 100644 --- a/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties +++ b/event-management/config-files/baguette-client/conf/eu.melodic.event.brokercep.properties @@ -20,14 +20,15 @@ brokercep.broker-protocol = ssl #brokercep.bypass-local-broker = true # Common Broker settings -#brokercep.ssl.enable = false -brokercep.broker-url = ${brokercep.broker-protocol}://0.0.0.0:${brokercep.broker-port} -brokercep.broker-url-2 = tcp://127.0.0.1:61616?${brokercep.broker-url-properties} -brokercep.broker-url-3 = -brokercep.broker-url-properties = transport.daemon=true&transport.trace=false&transport.useKeepAlive=true&transport.useInactivityMonitor=false&transport.needClientAuth=${brokercep.ssl.client-auth.required}&transport.verifyHostName=true&transport.connectionTimeout=0&transport.keepAlive=true -brokercep.ssl.client-auth.required = false -brokercep.broker-url-for-consumer = tcp://127.0.0.1:61616?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true -brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${EMS_CLIENT_ADDRESS}:${brokercep.broker-port}?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true +BROKER_URL_PROPERTIES = transport.daemon=true&transport.trace=false&transport.useKeepAlive=true&transport.useInactivityMonitor=false&transport.needClientAuth=${CLIENT_AUTH_REQUIRED}&transport.verifyHostName=true&transport.connectionTimeout=0&transport.keepAlive=true +CLIENT_AUTH_REQUIRED = false +brokercep.broker-url[0] = ${brokercep.broker-protocol}://0.0.0.0:${brokercep.broker-port}?${BROKER_URL_PROPERTIES} +brokercep.broker-url[1] = tcp://127.0.0.1:61616?${BROKER_URL_PROPERTIES} +brokercep.broker-url[2] = + +CLIENT_URL_PROPERTIES=daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true +brokercep.broker-url-for-consumer = tcp://127.0.0.1:61616?${CLIENT_URL_PROPERTIES} +brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${EMS_CLIENT_ADDRESS}:${brokercep.broker-port}?${CLIENT_URL_PROPERTIES} # Must be a public IP address # Key store diff --git a/event-management/config-files/eu.melodic.event.brokercep.properties b/event-management/config-files/eu.melodic.event.brokercep.properties index 111daa9da..9b5017517 100644 --- a/event-management/config-files/eu.melodic.event.brokercep.properties +++ b/event-management/config-files/eu.melodic.event.brokercep.properties @@ -16,14 +16,15 @@ brokercep.broker-protocol = ssl #brokercep.bypass-local-broker = true # Common Broker settings -#brokercep.ssl.enable = false -brokercep.broker-url = ${brokercep.broker-protocol}://0.0.0.0:${brokercep.broker-port} -brokercep.broker-url-2 = tcp://0.0.0.0:61616?${brokercep.broker-url-properties} -brokercep.broker-url-3 = stomp://0.0.0.0:61610 -brokercep.broker-url-properties = transport.daemon=true&transport.trace=false&transport.useKeepAlive=true&transport.useInactivityMonitor=false&transport.needClientAuth=${brokercep.ssl.client-auth.required}&transport.verifyHostName=true&transport.connectionTimeout=0&transport.keepAlive=true -brokercep.ssl.client-auth.required = false -brokercep.broker-url-for-consumer = tcp://${EMS_SERVER_ADDRESS}:61616?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true -brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${EMS_SERVER_ADDRESS}:${brokercep.broker-port}?daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true +BROKER_URL_PROPERTIES = transport.daemon=true&transport.trace=false&transport.useKeepAlive=true&transport.useInactivityMonitor=false&transport.needClientAuth=${CLIENT_AUTH_REQUIRED}&transport.verifyHostName=true&transport.connectionTimeout=0&transport.keepAlive=true +CLIENT_AUTH_REQUIRED = false +brokercep.broker-url[0] = ${brokercep.broker-protocol}://0.0.0.0:${brokercep.broker-port}?${BROKER_URL_PROPERTIES} +brokercep.broker-url[1] = tcp://0.0.0.0:61616?${BROKER_URL_PROPERTIES} +brokercep.broker-url[2] = stomp://0.0.0.0:61610 + +CLIENT_URL_PROPERTIES=daemon=true&trace=false&useInactivityMonitor=false&connectionTimeout=0&keepAlive=true +brokercep.broker-url-for-consumer = tcp://${EMS_SERVER_ADDRESS}:61616?${CLIENT_URL_PROPERTIES} +brokercep.broker-url-for-clients = ${brokercep.broker-protocol}://${EMS_SERVER_ADDRESS}:${brokercep.broker-port}?${CLIENT_URL_PROPERTIES} # Must be a public IP address # Key store -- GitLab From e0cc4d02afcb866089caf2e727544c99f70b7acf Mon Sep 17 00:00:00 2001 From: ipatini Date: Sat, 9 Apr 2022 16:49:49 +0300 Subject: [PATCH 22/76] EMS: Broker-CEP: Added queuing and retrying, for event publishing to local broker and event forwarding to the next groupings. This applies to generated events captured by 'BrokerCepStatementSubscriber' instances. By default, failed publish/forward attempts will be repeated forever. A retry limit (num. of retries or max retry duration) can be set in 'eu.melodic.event.brokercep.properties' by setting either 'brokercep.max-event-forward-retries' or 'brokercep.max-event-forward-duration' (in millis). --- .../baguette/client/CommandExecutor.java | 1 - .../event/brokercep/BrokerCepService.java | 4 +- .../BrokerCepStatementSubscriber.java | 28 +-- .../event/brokercep/EventForwarder.java | 196 ++++++++++++++++++ .../properties/BrokerCepProperties.java | 6 +- 5 files changed, 212 insertions(+), 23 deletions(-) create mode 100644 event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/EventForwarder.java diff --git a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/CommandExecutor.java b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/CommandExecutor.java index 4cc1c1679..ea1f41730 100644 --- a/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/CommandExecutor.java +++ b/event-management/baguette-client/src/main/java/eu/melodic/event/baguette/client/CommandExecutor.java @@ -16,7 +16,6 @@ import eu.melodic.event.brokercep.BrokerCepService; import eu.melodic.event.brokercep.BrokerCepStatementSubscriber; import eu.melodic.event.brokercep.cep.CepService; import eu.melodic.event.brokercep.event.EventMap; -import eu.melodic.event.brokerclient.BrokerClient; import eu.melodic.event.brokerclient.event.EventGenerator; import eu.melodic.event.brokerclient.properties.BrokerClientProperties; import eu.melodic.event.util.*; diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/BrokerCepService.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/BrokerCepService.java index ca31e6288..28786803f 100644 --- a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/BrokerCepService.java +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/BrokerCepService.java @@ -42,9 +42,9 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -@AllArgsConstructor(onConstructor = @__({@Autowired})) -@Service @Slf4j +@Service +@AllArgsConstructor(onConstructor = @__({@Autowired})) public class BrokerCepService { private BrokerCepProperties properties; private BrokerConfig brokerConfig; diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/BrokerCepStatementSubscriber.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/BrokerCepStatementSubscriber.java index 651836e5c..22a650374 100644 --- a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/BrokerCepStatementSubscriber.java +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/BrokerCepStatementSubscriber.java @@ -53,40 +53,30 @@ public class BrokerCepStatementSubscriber implements StatementSubscriber { String password = brokerCep.getBrokerPassword(); String passwordEncoded = passwordUtil.encodePassword(password); try { - // Publish new event to Local Broker topic - log.trace("- Publishing event to local broker: subscriber={}, local-broker={}, username={}, password={}, topic={}, payload={}", + // Queue new event for publishing to Local Broker topic + EventForwarder.getInstance().addLocalPublishTask(name, topic, eventMap, ()->countLocalPublish(true), ()->countLocalPublish(false)); + log.trace("- Event queued for publishing to local broker: subscriber={}, local-broker={}, username={}, password={}, topic={}, payload={}", name, localBrokerUrl, username, passwordEncoded, topic, eventMap); - brokerCep.publishEvent(localBrokerUrl, username, password, topic, eventMap); - log.debug("- Event published to local broker: subscriber={}, local-broker={}, username={}, password={}, topic={}, payload={}", - name, localBrokerUrl, username, passwordEncoded, topic, eventMap); - countLocalPublish(true); - } catch (Exception ex) { - log.error("- New event: ERROR while publishing to local broker: subscriber={}, local-broker={}, username={}, password={}, topic={}, exception=", + log.error("- New event: ERROR while queueing event for publishing to local broker: subscriber={}, local-broker={}, username={}, password={}, topic={}, exception=", name, localBrokerUrl, username, passwordEncoded, topic, ex); countLocalPublish(false); } } protected void forwardToGroupings(Map eventMap) { - // Send new event to the next grouping(s) + // Queue event for forwarding to the next grouping(s) log.trace("- Forwarding event to groupings: subscriber={}, forward-to-groupings={}, payload={}", name, forwardToGroupings, eventMap); if (forwardToGroupings==null) return; for (GroupingConfiguration.BrokerConnectionConfig fwdToGrouping : forwardToGroupings) { try { - String brokerUrl = fwdToGrouping.getUrl(); - String username = fwdToGrouping.getUsername(); - String password = fwdToGrouping.getPassword(); - log.debug("- Forwarding event to grouping: subscriber={}, forward-to-grouping={}, url={}, username={}, topic={}, payload={}", - name, fwdToGrouping, brokerUrl, username, topic, eventMap); - brokerCep.publishEvent(brokerUrl, username, password, topic, eventMap); - log.debug("- Event forwarded to grouping: subscriber={}, forwarded-to-grouping={}, url={}, username={}, topic={}, payload={}", - name, fwdToGrouping, brokerUrl, username, topic, eventMap); - countForward(true); + EventForwarder.getInstance().addEventForwardTask(name, fwdToGrouping, topic, eventMap, ()->countForward(true), ()->countForward(false)); + log.debug("- Event queued for forwarding to grouping: subscriber={}, forward-to-grouping={}, topic={}, payload={}", + name, fwdToGrouping, topic, eventMap); } catch (Exception ex) { - log.error("- Error while sending event: subscriber={}, forward-to-groupings={}, payload={}, exception: ", + log.error("- ERROR while queuing event in forward queue: subscriber={}, forward-to-groupings={}, payload={}, exception: ", name, forwardToGroupings, eventMap, ex); countForward(false); } diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/EventForwarder.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/EventForwarder.java new file mode 100644 index 000000000..339d808b6 --- /dev/null +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/EventForwarder.java @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2017-2022 Institute of Communication and Computer Systems (imu.iccs.gr) + * + * This Source Code Form is subject to the terms of the Mozilla Public License, v2.0, unless + * Esper library is used, in which case it is subject to the terms of General Public License v2.0. + * If a copy of the MPL was not distributed with this file, you can obtain one at + * https://www.mozilla.org/en-US/MPL/2.0/ + */ + +package eu.melodic.event.brokercep; + +import eu.melodic.event.brokercep.properties.BrokerCepProperties; +import eu.melodic.event.util.GroupingConfiguration; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.task.TaskExecutor; +import org.springframework.stereotype.Service; + +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingDeque; + +@Slf4j +@Service +@RequiredArgsConstructor +public class EventForwarder implements InitializingBean, Runnable { + @Getter @Setter + private static EventForwarder instance; + + private final BrokerCepProperties properties; + private final BrokerCepService brokerCepService; + private final LinkedBlockingDeque eventForwardingQueue = new LinkedBlockingDeque<>(); + + public void addEventForwardTask(String senderName, GroupingConfiguration.BrokerConnectionConfig brokerConnectionConfig, String topic, Map eventMap, Runnable success, Runnable failure) { + boolean isLocalPublish = + brokerCepService.getBrokerCepProperties().getBrokerUrlForConsumer() + .equals(brokerConnectionConfig.getUrl()); + eventForwardingQueue.add(new EventForwardTask(senderName, isLocalPublish, brokerConnectionConfig, topic, eventMap, success, failure)); + log.debug("EventForwarder: {} task in the queue", eventForwardingQueue.size()); + } + + public void addEventForwardTask(String senderName, String brokerUrl, String certificate, String username, String password, String topic, Map eventMap, Runnable success, Runnable failure) { + GroupingConfiguration.BrokerConnectionConfig brokerConnectionConfig = + new GroupingConfiguration.BrokerConnectionConfig(null, brokerUrl, certificate, username, password); + addEventForwardTask(senderName, brokerConnectionConfig, topic, eventMap, success, failure); + } + + public void addLocalPublishTask(String senderName, String topic, Map eventMap, Runnable success, Runnable failure) { + String brokerUrl = brokerCepService.getBrokerCepProperties().getBrokerUrlForConsumer(); + String username = brokerCepService.getBrokerUsername(); + String password = brokerCepService.getBrokerPassword(); + GroupingConfiguration.BrokerConnectionConfig brokerConnectionConfig = + new GroupingConfiguration.BrokerConnectionConfig(null, brokerUrl, null, username, password); + eventForwardingQueue.add(new EventForwardTask(senderName, true, brokerConnectionConfig, topic, eventMap, success, failure)); + log.debug("EventForwarder: {} task in the queue", eventForwardingQueue.size()); + } + + @Override + public void afterPropertiesSet() throws Exception { + if (instance==null) instance = this; + Executors.newFixedThreadPool(1).submit(this); + log.info("EventForwarder: Starting event publish/forward worker"); + } + + @Override + public void run() { + while (true) { + try { + processEventForwardTask(eventForwardingQueue.take()); + } catch (Throwable t) { + log.warn("EventForwarder: Exception thrown in task processing loop: ", t); + } + } + } + + private void processEventForwardTask(EventForwardTask task) { + String senderName = task.getSenderName(); + String topic = task.getTopic(); + Map eventMap = task.getEventMap(); + + // Check if max task processing duration has been exceeded + long duration = System.currentTimeMillis() - task.getCreation(); + if (properties.getMaxEventForwardDuration()>0 && duration > properties.getMaxEventForwardDuration()) { + log.error("- Max event publish/forward duration exceeded. Dropping event: subscriber={}, forward-to-groupings={}, topic={}, payload={}", + senderName, task.getBrokerConnectionConfig(), topic, eventMap); + + runIfNotNull(task.getFailure()); + return; + } + + // Process event publish/forward task + try { + String brokerUrl = task.getBrokerConnectionConfig().getUrl(); + String username = task.getBrokerConnectionConfig().getUsername(); + String password = task.getBrokerConnectionConfig().getPassword(); + + if (task.isLocalPublish()) { + log.trace("- Publishing event to local broker: subscriber={}, local-broker={}, username={}, password={}, topic={}, retry={}, payload={}", + senderName, brokerUrl, username, "passwordEncoded", topic, task.getRetries(), eventMap); + } else { + log.debug("- Forwarding event to grouping: subscriber={}, forward-to-grouping={}, url={}, username={}, topic={}, retry={}, payload={}", + senderName, task.getBrokerConnectionConfig(), brokerUrl, username, topic, task.getRetries(), eventMap); + } + + task.newRetry(); + brokerCepService.publishEvent(brokerUrl, username, password, topic, eventMap); + task.completed(); + + if (task.isLocalPublish()) { + log.debug("- Event published to local broker: subscriber={}, local-broker={}, username={}, topic={}, payload={}, duration={}ms", + senderName, brokerUrl, username, topic, eventMap, task.getTotalDuration()); + } else { + log.debug("- Event forwarded to grouping: subscriber={}, forwarded-to-grouping={}, url={}, username={}, topic={}, payload={}, duration={}ms", + senderName, task.brokerConnectionConfig, brokerUrl, username, topic, eventMap, task.getTotalDuration()); + } + + runIfNotNull(task.getSuccess()); + + } catch (Exception ex) { + task.increaseRetries(); + log.error("- Error while sending event: subscriber={}, forward-to-groupings={}, topic={}, retry={}, duration={}ms, payload={}, exception: ", + senderName, task.getBrokerConnectionConfig(), topic, task.getRetries()-1, task.getTotalDuration(), eventMap, ex); + + if (properties.getMaxEventForwardRetries()>=0 && task.getRetries() > properties.getMaxEventForwardRetries()) { + log.error("- Max event publish/forward retries exceeded. Dropping event: subscriber={}, forward-to-groupings={}, topic={}, payload={}", + senderName, task.getBrokerConnectionConfig(), topic, eventMap); + + runIfNotNull(task.getFailure()); + + } else + if (properties.getMaxEventForwardDuration()>0 && task.getTotalDuration() > properties.getMaxEventForwardDuration()) { + log.error("- Max event publish/forward duration exceeded. Dropping event: subscriber={}, forward-to-groupings={}, topic={}, payload={}", + senderName, task.getBrokerConnectionConfig(), topic, eventMap); + + runIfNotNull(task.getFailure()); + + } else { + eventForwardingQueue.add(task); + log.debug("- Event placed back in queue: subscriber={}, forward-to-groupings={}, topic={}, payload={}", + senderName, task.getBrokerConnectionConfig(), topic, eventMap); + } + } + } + + protected void runIfNotNull(Runnable r) { + if (r==null) return; + r.run(); + } + + @Getter + @RequiredArgsConstructor + protected static class EventForwardTask { + private final String senderName; + private final boolean localPublish; + private final GroupingConfiguration.BrokerConnectionConfig brokerConnectionConfig; + private final String topic; + private final Map eventMap; + private final Runnable success; + private final Runnable failure; + private final long creation = System.currentTimeMillis(); + + private long lastRetryStart; + private long lastRetryEnd; + private boolean completed; + private int retries = 0; + + public void newRetry() { + if (completed) return; + lastRetryStart = System.currentTimeMillis(); + } + + public void completed() { + if (completed) return; + completed = true; + lastRetryEnd = System.currentTimeMillis(); + } + + public void increaseRetries() { + if (completed) return; + lastRetryEnd = System.currentTimeMillis(); + ++retries; + } + + public long getLastRetryDuration() { + return lastRetryEnd - lastRetryStart; + } + + public long getTotalDuration() { + return lastRetryEnd - creation; + } + } +} diff --git a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java index b53d1f1d6..93d960a34 100644 --- a/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java +++ b/event-management/broker-cep/src/main/java/eu/melodic/event/brokercep/properties/BrokerCepProperties.java @@ -35,7 +35,6 @@ public class BrokerCepProperties { // Broker connector URLs private List brokerUrl = Collections.singletonList("ssl://0.0.0.0:61616"); - public String getBrokerUrl() { return brokerUrl.get(0); } public List getBrokerUrlList() { return brokerUrl; } @@ -88,6 +87,11 @@ public class BrokerCepProperties { @Value("${brokercep.usage.memory.size:-1}") private long memorySize; + @Value("${brokercep.max-event-forward-retries:-1}") + private int maxEventForwardRetries; + @Value("${brokercep.max-event-forward-duration:-1}") + private long maxEventForwardDuration; + @Data public static class MessageInterceptorSpec { private String className; -- GitLab From 3b30e0739b25a7f3daec5de456fc94703355bc9d Mon Sep 17 00:00:00 2001 From: ipatini Date: Sat, 9 Apr 2022 21:21:53 +0300 Subject: [PATCH 23/76] EMS: Control Service: Added new profile 'dev-docker-image-build' in 'pom.xml' used for local docker image builds. It turns off the old 'com.spotify:docker-maven-plugin' and uses 'io.fabric8:docker-maven-plugin' instead. Few other improvements. --- event-management/control-service/pom.xml | 219 ++++++++++++++++++----- 1 file changed, 176 insertions(+), 43 deletions(-) diff --git a/event-management/control-service/pom.xml b/event-management/control-service/pom.xml index 65f00695a..7f44af5e5 100644 --- a/event-management/control-service/pom.xml +++ b/event-management/control-service/pom.xml @@ -27,7 +27,11 @@ ${maven.build.timestamp} yyyy-MM-dd HH:mm:ss - + + ${project.build.finalName}.jar + esper-${esper-version}.jar + + ems-server - esper-${esper-version}.jar + + + 0.39.1 + ems-server:2022-apr @@ -410,56 +417,93 @@ + + + maven-resources-plugin + 3.2.0 + + + copy-resources-to-docker-context + package + + copy-resources + + + ${project.build.directory}/docker + + + ${project.basedir}/src/main/docker + + + + /jars + ${project.build.directory} + ${docker.controlServiceJar} + ${docker.esperJar} + false + + + /bin + ${project.basedir}/../bin/ + run.sh + sysmon.sh + detect.sh + false + + + /config + ${project.basedir}/../config-files + + false + + + + + /public_resources + ${project.basedir}/../public_resources + false + + + + + /jars + ${project.basedir}/../broker-client/target + broker-client-jar-with-dependencies.jar + false + + + + + /bin + ${project.basedir}/../bin/ + client.sh + false + + + + + + + com.spotify docker-maven-plugin - - /jars - ${project.build.directory} - ${docker.jarToInclude} - ${docker.esperJarToInclude} - + /bin ${project.basedir}/../bin/ run.sh - sysmon.sh - detect.sh - - - /config - ${project.basedir}/../config-files - - - - - - /public_resources - ${project.basedir}/../public_resources - - - - - /jars - ${project.basedir}/../broker-client/target - broker-client-jar-with-dependencies.jar - - - - - /bin - ${project.basedir}/../bin/ - client.sh @@ -487,6 +531,95 @@ + + + dev-docker-image-build + + + + + com.spotify + docker-maven-plugin + + + execution + none + + + + + + + maven-clean-plugin + + true + + + ${project.build.directory}/docker-context + false + + + + + + remove-old-docker-context + install + + clean + + + + + + com.coderplus.maven.plugins + copy-rename-maven-plugin + 1.0.1 + + + rename-docker-context-dir + install + + rename + + + ${project.build.directory}/docker + ${project.build.directory}/docker-context + + + + + + + + io.fabric8 + docker-maven-plugin + ${docker-maven-plugin.version} + + + true + true + + + ${docker-maven-plugin.imageName} + + ${project.build.directory}/docker-context + + + + + + + docker-image-build + install + + build + + + + + + + -- GitLab From f44b594c556c0c4d4afff694406f866a72af6726 Mon Sep 17 00:00:00 2001 From: ipatini Date: Sat, 9 Apr 2022 22:17:52 +0300 Subject: [PATCH 24/76] EMS: Control Service: Improved profile 'dev-docker-image-build' in pom.xml, to get activated when file 'control-service/.dev-local-docker-image-build' exists. --- event-management/.gitignore | 3 ++- event-management/control-service/pom.xml | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/event-management/.gitignore b/event-management/.gitignore index 58caaef46..f12b562cb 100644 --- a/event-management/.gitignore +++ b/event-management/.gitignore @@ -5,4 +5,5 @@ config-files/*.crt public_resources/** tcnative* ems.log -server.pem \ No newline at end of file +server.pem +.dev-* \ No newline at end of file diff --git a/event-management/control-service/pom.xml b/event-management/control-service/pom.xml index 7f44af5e5..7e7a2de75 100644 --- a/event-management/control-service/pom.xml +++ b/event-management/control-service/pom.xml @@ -533,7 +533,12 @@ - dev-docker-image-build + dev-local-docker-image-build + + + .dev-local-docker-image-build + + -- GitLab From 77b20fd7db5646d704235b4f0106518a8c1b3122 Mon Sep 17 00:00:00 2001 From: ipatini Date: Sat, 9 Apr 2022 22:23:50 +0300 Subject: [PATCH 25/76] EMS: Control Service, Baguette Client Install: Changed JRE8 installation instruction set to download JRE8 from EMS server. Fixed instruction set placeholder processing to trim the ending '/' from BASE_URL and DOWNLOAD_URL variables. --- .../baguette/client/install/helper/VmInstallationHelper.java | 2 +- .../config-files/baguette-client-install/linux/jre8.json | 2 +- event-management/control-service/src/main/docker/Dockerfile | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/VmInstallationHelper.java b/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/VmInstallationHelper.java index 71e6921b1..c418fa247 100644 --- a/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/VmInstallationHelper.java +++ b/event-management/baguette-client-install/src/main/java/eu/melodic/event/baguette/client/install/helper/VmInstallationHelper.java @@ -134,7 +134,7 @@ public class VmInstallationHelper extends AbstractInstallationHelper { Map nodeMap = entry.getPreregistration(); BaguetteServer baguette = entry.getBaguetteServer(); - String baseUrl = nodeMap.get("BASE_URL"); + String baseUrl = StringUtils.removeEnd(nodeMap.get("BASE_URL"), "/"); String clientId = nodeMap.get("CLIENT_ID"); String ipSetting = nodeMap.get("IP_SETTING"); log.debug("VmInstallationHelper.prepareInstallationInstructionsForLinux(): Invoked: base-url={}", baseUrl); diff --git a/event-management/config-files/baguette-client-install/linux/jre8.json b/event-management/config-files/baguette-client-install/linux/jre8.json index 3a9094088..220b2f0d7 100644 --- a/event-management/config-files/baguette-client-install/linux/jre8.json +++ b/event-management/config-files/baguette-client-install/linux/jre8.json @@ -29,7 +29,7 @@ { "description": "Download JRE package", "taskType": "CMD", - "command": "curl https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jre8.0.282-linux_x64.tar.gz --output /tmp/jre8.282.tar.gz", + "command": "curl -v -k ${DOWNLOAD_URL}/resources/zulu8.52.0.23-ca-jre8.0.282-linux_x64.tar.gz --output /tmp/jre8.282.tar.gz", "executable": false, "exitCode": 0, "match": false diff --git a/event-management/control-service/src/main/docker/Dockerfile b/event-management/control-service/src/main/docker/Dockerfile index c601ff096..380a43b95 100644 --- a/event-management/control-service/src/main/docker/Dockerfile +++ b/event-management/control-service/src/main/docker/Dockerfile @@ -27,7 +27,8 @@ RUN apt-get update && apt-get install -y \ iputils-ping \ && rm -rf /var/lib/apt/lists/* -# XXX: TODO: Remove after tests and update url at 'config-files/baguette-client-install/jre8.json' +# Download a JRE8 suitable for running EMS clients, and +# offer it for download during EMS client installations RUN mkdir -p ${PUBLIC_DIR}/resources RUN curl https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jre8.0.282-linux_x64.tar.gz --output ${PUBLIC_DIR}/resources/zulu8.52.0.23-ca-jre8.0.282-linux_x64.tar.gz -- GitLab From b9d69c5b039be1bb22eed68721d7f16f96441a44 Mon Sep 17 00:00:00 2001 From: ipatini Date: Sat, 9 Apr 2022 23:11:26 +0300 Subject: [PATCH 26/76] EMS: Control Service, pom.xml: Changed profile 'dev-docker-image-build' in 'control-service/pom.xml', to get activated when file '.dev-local-docker-image-build' exists at top-level EMS folder (not in control-service folder). Changed profile '.dev-skip-build-web-admin' in top-level 'pom.xml' to get activated when when file '.dev-skip-build-web-admin' does *NOT* exist in top-level EMS folder. --- event-management/control-service/pom.xml | 2 +- event-management/pom.xml | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/event-management/control-service/pom.xml b/event-management/control-service/pom.xml index 7e7a2de75..831c44332 100644 --- a/event-management/control-service/pom.xml +++ b/event-management/control-service/pom.xml @@ -536,7 +536,7 @@ dev-local-docker-image-build - .dev-local-docker-image-build + ../.dev-local-docker-image-build diff --git a/event-management/pom.xml b/event-management/pom.xml index 460bcebfc..e7f259683 100644 --- a/event-management/pom.xml +++ b/event-management/pom.xml @@ -81,10 +81,14 @@ extra + build-web-admin - true + false + + .dev-skip-build-web-admin + web-admin -- GitLab From d6c5d0daa1881320997a5ef65730504352c37695 Mon Sep 17 00:00:00 2001 From: ipatini Date: Sun, 10 Apr 2022 17:08:53 +0300 Subject: [PATCH 27/76] EMS: Web Admin: Fixed a colouring error in Topology Tree (Candidate nodes are now coloured cyan as in the LeafletJS map). Fix legend in LeafletJS map (Initializing or Non-clustered). --- .../web-admin/src/views/admin/admin-2-topology.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/event-management/web-admin/src/views/admin/admin-2-topology.vue b/event-management/web-admin/src/views/admin/admin-2-topology.vue index e97673beb..1f526f6fc 100644 --- a/event-management/web-admin/src/views/admin/admin-2-topology.vue +++ b/event-management/web-admin/src/views/admin/admin-2-topology.vue @@ -223,7 +223,12 @@ />
-
+
 {{getShorterNodeName(data.label)}}
{{data.nodeId}}
@@ -298,8 +303,8 @@  EMS Server    Aggregator    Candidate   -  Initializing    Not Candidate   +  Initializing or Non-clustered    Ignored  
-- GitLab From 9ba05bec320675091f5450b4665e8b047a271661 Mon Sep 17 00:00:00 2001 From: ipatini Date: Mon, 11 Apr 2022 17:34:03 +0300 Subject: [PATCH 28/76] EMS: Web Admin: Modified 'admin-2-topology.vue' to update LeafletJS map with the (broker) connections between EMS server and resource-limited nodes without an aggregator responsible for collecting their metrics. --- .../web-admin/src/views/admin/admin-2-topology.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/event-management/web-admin/src/views/admin/admin-2-topology.vue b/event-management/web-admin/src/views/admin/admin-2-topology.vue index 1f526f6fc..faf0e7b40 100644 --- a/event-management/web-admin/src/views/admin/admin-2-topology.vue +++ b/event-management/web-admin/src/views/admin/admin-2-topology.vue @@ -303,7 +303,7 @@  EMS Server    Aggregator    Candidate   -  Not Candidate   +  Not Candidate / Resource-Limited    Initializing or Non-clustered    Ignored  
@@ -641,6 +641,7 @@ export default { // ------------------------------------------------------------------------------------------------------------- updateClientMarkers(clients) { + // Update markers of EMS server and clients let markers = [ ]; for (let c of clients) { if (!c.lat || !c.lon) { @@ -663,7 +664,7 @@ export default { //console.log('NEW MARKERS: ', markers); this.clientMarkers = markers; - // Update connections between EMS and clients + // Update SSH connections between EMS server and clients let controlConns = this.clientMarkers.filter(cc => cc.id!=='ems' && cc.type!=='IGNORED' && cc.type!=='NOT_CANDIDATE') .map(function(cc) { return { @@ -672,10 +673,11 @@ export default { line: { color: '#696969', weight: 1, dashArray: '8 6' } }; }); + // Update broker connections between nodes (EMS server, nodes with client, and nodes without client) let eventConns = this.clientMarkers.filter(cc => cc.id!=='ems') .map(function(cc) { return { - startMarker: cc.nextLevel, + startMarker: cc.nextLevel ?? 'ems', endMarker: cc.id, line: { color: cc.nextLevel=='ems' ? 'magenta' : 'blue', weight: 0.5 } }; -- GitLab From 06da4278c59d4196d877f7f8762bb5c4989b6516 Mon Sep 17 00:00:00 2001 From: ipatini Date: Mon, 11 Apr 2022 17:36:33 +0300 Subject: [PATCH 29/76] EMS: Baguette Server: Minor improvements in Baguette Server and README-for-TESTING.md --- event-management/README-for-TESTING.md | 2 +- .../java/eu/melodic/event/baguette/server/BaguetteServer.java | 2 +- .../baguette/server/properties/BaguetteServerProperties.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/event-management/README-for-TESTING.md b/event-management/README-for-TESTING.md index 3cedbef4e..af72125b6 100644 --- a/event-management/README-for-TESTING.md +++ b/event-management/README-for-TESTING.md @@ -52,7 +52,7 @@ We also distinguish between ***Monitoring Topologies***: ## A) Support for Resource-Limited nodes > Feature Quick Notes: > - EMS server will NOT install EMS client and JRE8 in RL nodes. -> - EMS server will install Netda in RL nodes. +> - EMS server will install Netdata in RL nodes. > - EMS server or an Aggregator will periodically query Netdata agents of RL nodes for metrics. > - Normal nodes will periodically query their Local Netdata agent for metrics. diff --git a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/BaguetteServer.java b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/BaguetteServer.java index 82d7e8691..a51cb4194 100644 --- a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/BaguetteServer.java +++ b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/BaguetteServer.java @@ -299,7 +299,7 @@ public class BaguetteServer implements InitializingBean, EventBus.EventConsumer< } if (coordinatorClass == null) - throw new IllegalArgumentException("Either coordinator class or configuration id must be specified"); + throw new IllegalArgumentException("Either coordinator class or coordinator id must be specified"); // Initialize coordinator class and parameters for backward compatibility ServerCoordinator coordinator = createServerCoordinator(null, coordinatorClass, coordinatorParams, _TC, upperwareGrouping); diff --git a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/properties/BaguetteServerProperties.java b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/properties/BaguetteServerProperties.java index 8a01e3fc5..b896b2bdc 100644 --- a/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/properties/BaguetteServerProperties.java +++ b/event-management/baguette-server/src/main/java/eu/melodic/event/baguette/server/properties/BaguetteServerProperties.java @@ -51,11 +51,11 @@ public class BaguetteServerProperties { }*/ //@Size(min = 1, message = "Please provide a valid Coordinator class (use Fully-Qualified Class Name)") - @Value("${baguette.server.coordinator.class}") + @Value("${baguette.server.coordinator.class:}") private Class coordinatorClass; private Map coordinatorParameters = new HashMap<>(); - @Value("${baguette.server.coordinator.id}") + @Value("${baguette.server.coordinator.id:}") private List coordinatorId; private Map coordinatorConfig = new HashMap<>(); -- GitLab From 50e319e82106e699b8f29ff8dedea32761251a42 Mon Sep 17 00:00:00 2001 From: ipatini Date: Tue, 12 Apr 2022 13:16:49 +0300 Subject: [PATCH 30/76] EMS: Web Admin: Fixed 'SSH console' dialog to open above page widgets (esp. LeafletJS map) --- .../web-admin/src/views/admin/admin-2-topology.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/event-management/web-admin/src/views/admin/admin-2-topology.vue b/event-management/web-admin/src/views/admin/admin-2-topology.vue index faf0e7b40..6407b369b 100644 --- a/event-management/web-admin/src/views/admin/admin-2-topology.vue +++ b/event-management/web-admin/src/views/admin/admin-2-topology.vue @@ -426,6 +426,9 @@ export default { let h = $('#ssh-console-dialog').css('height'); $('#ssh-console-dialog').html(``); $('#ssh-console-dialog').dialog('option', "title", `SSH console: ${address} [ref=${ref}]`); + + // Move dialog on top of other page widgets (i.e. LeafletJS map) + $('#ssh-console-object').parent().parent().css('z-index', 1000); }, close: function() { $('#ssh-console-dialog').html(' '); -- GitLab From 22a813ed8ae1d91ff47d64ce0952419f7312b71e Mon Sep 17 00:00:00 2001 From: ipatini Date: Tue, 12 Apr 2022 16:27:48 +0300 Subject: [PATCH 31/76] EMS: Web Admin: Changed Webssh URL from http to https in SSH console dialog --- .../web-admin/src/views/admin/admin-2-topology.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/event-management/web-admin/src/views/admin/admin-2-topology.vue b/event-management/web-admin/src/views/admin/admin-2-topology.vue index 6407b369b..04725dcc9 100644 --- a/event-management/web-admin/src/views/admin/admin-2-topology.vue +++ b/event-management/web-admin/src/views/admin/admin-2-topology.vue @@ -367,7 +367,8 @@ export default { const winLocation = window.location.hostname; return { someVariableUnderYourControl: 0, - websshProxyUrl: `http://${winLocation}:2121`, + /*websshProxyUrl: `http://${winLocation}:2121`,*/ + websshProxyUrl: `https://${winLocation}:4433`, treeData : { }, clients: [ -- GitLab From 9f8bd29dadd3b7420ad7aa6d0e3d3ae875a9c5c2 Mon Sep 17 00:00:00 2001 From: ipatini Date: Tue, 12 Apr 2022 17:01:01 +0300 Subject: [PATCH 32/76] EMS: Web Admin: Added an 'Open in a new tab' link in SSH console (useful for debugging, but not only) --- .../web-admin/src/views/admin/admin-2-topology.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/event-management/web-admin/src/views/admin/admin-2-topology.vue b/event-management/web-admin/src/views/admin/admin-2-topology.vue index 04725dcc9..82b6ec5e1 100644 --- a/event-management/web-admin/src/views/admin/admin-2-topology.vue +++ b/event-management/web-admin/src/views/admin/admin-2-topology.vue @@ -425,7 +425,10 @@ export default { console.log('SSH-console: url: ', url); let h = $('#ssh-console-dialog').css('height'); - $('#ssh-console-dialog').html(``); + $('#ssh-console-dialog').html(` + + Open in a new tab + `); $('#ssh-console-dialog').dialog('option', "title", `SSH console: ${address} [ref=${ref}]`); // Move dialog on top of other page widgets (i.e. LeafletJS map) -- GitLab From bf12e8827a0e2955fef9554d383e04b565286c34 Mon Sep 17 00:00:00 2001 From: ipatini Date: Wed, 13 Apr 2022 17:03:21 +0300 Subject: [PATCH 33/76] EMS: Control Service: Added method 'addMetricsFromEnvVars()' in 'InfoServiceController' class for including environment variables with configured prefixes in 'metrics' map sent to Web Admin. Added 'envVarPrefixes' property in ControlServiceProperties for setting the env. var. prefixes. --- .../control/info/InfoServiceController.java | 57 +++++++++++++++++-- .../properties/ControlServiceProperties.java | 4 ++ 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/info/InfoServiceController.java b/event-management/control-service/src/main/java/eu/melodic/event/control/info/InfoServiceController.java index 954b436a0..0aaa1ab65 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/info/InfoServiceController.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/info/InfoServiceController.java @@ -183,12 +183,9 @@ public class InfoServiceController { public Map createServerMetricsResult(String sid, long sequence) { log.trace("createServerMetricsResult: BEGIN: sid={}, seq={}", sid, sequence); Map metrics = new LinkedHashMap<>(emsInfoService.getServerMetricValues()); - metrics.put("WEBSSH-BASE-URL", System.getenv("WEBSSH_BASE_URL")); - System.getenv().forEach((property,value) -> { - if (property.startsWith("WEB_ADMIN_")) { - metrics.put(property.substring("WEB_ADMIN_".length()), value); - } - }); + + addMetricsFromEnvVars(metrics); + metrics.put(".stream-id", sid); metrics.put(".sequence", sequence); log.trace("createMetricsResult: {}", metrics); @@ -229,4 +226,52 @@ public class InfoServiceController { log.trace("createClientMetricsResult: END: sid={}, seq={} ==> {}", sid, sequence, clientMetrics); return clientMetrics; } + + protected void addMetricsFromEnvVars(Map metrics) { + // Process configured env. var. prefixes + for (String prefix : properties.getEnvVarPrefixes()) { + prefix = prefix.trim(); + if (StringUtils.isNotBlank(prefix)) { + // Check for processing switches (at the end of the prefix) + boolean trimPrefix = false; + boolean underscoreToDash = false; + boolean uppercase = false; + boolean lowercase = false; + int len = prefix.length(); + while (len>0) { + char ch = prefix.charAt(len-1); + if (ch=='/') { trimPrefix = true; len--; } + else if (ch=='-') { underscoreToDash = true; len--; } + else if (ch=='^') { uppercase = true; len--; } + else if (ch=='~') { lowercase = true; len--; } + else break; + } + + // Check env. vars against the prefix (and its switches) + if (len>0) { + if (prefix.length()!=len) prefix = prefix.substring(0, len); + + final String _prefix = prefix; + final boolean _trimPrefix = trimPrefix; + final boolean _underscoreToDash = underscoreToDash; + final boolean _uppercase = uppercase; + final boolean _lowercase = lowercase; + System.getenv().forEach((varName,varValue) -> { + if (StringUtils.startsWithIgnoreCase(varName, _prefix)) { + // Process switches + String varNameOriginal = varName; + if (_trimPrefix) varName = varName.substring(_prefix.length()); + if (_underscoreToDash) varName = varName.replace("_", "-"); + if (_uppercase) varName = varName.toUpperCase(); + if (_lowercase) varName = varName.toLowerCase(); + + // Add env. var. in the metrics map + log.debug("addMetricsFromEnvVars: Adding env. var. {} in metrics map as: {} = {}", varNameOriginal, varName, varValue); + metrics.put(varName, varValue); + } + }); + } + } + } + } } diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/properties/ControlServiceProperties.java b/event-management/control-service/src/main/java/eu/melodic/event/control/properties/ControlServiceProperties.java index 4475c7e42..053ca9569 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/properties/ControlServiceProperties.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/properties/ControlServiceProperties.java @@ -20,6 +20,7 @@ import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; +import java.util.List; @Slf4j @Data @@ -99,6 +100,9 @@ public class ControlServiceProperties { private int metricsStreamUpdateInterval; // in seconds @Value("${info.metrics.stream.event.name:ems-metrics-event}") @NotBlank private String metricsStreamEventName; + @Value("${info.metrics.include.env-vars-with-prefixes: WEBSSH_SERVICE_-^, WEB_ADMIN_!^}") + private List envVarPrefixes; // ! at the end means to trim off the prefix; - at the end means to convert '_' to '-'; + // ^ at the end means convert to upper case; ~ at the end means convert to lower case; // control.ssl.** settings private KeystoreAndCertificateProperties ssl; -- GitLab From b2e03c604be8fc04925a8b70c7377718d16dc746 Mon Sep 17 00:00:00 2001 From: ipatini Date: Wed, 13 Apr 2022 17:07:55 +0300 Subject: [PATCH 34/76] EMS: Web Admin: Improved the SSH console dialog: added 'Open in a new tab' button, replaced the webssh target DOM node to an iframe (better than 'object' as it was before), renamed occurrences of 'websshProxyUrl' to 'websshServiceUrl' --- .../src/views/admin/admin-2-topology.vue | 121 +++++++++++------- 1 file changed, 74 insertions(+), 47 deletions(-) diff --git a/event-management/web-admin/src/views/admin/admin-2-topology.vue b/event-management/web-admin/src/views/admin/admin-2-topology.vue index 82b6ec5e1..26a4e16a3 100644 --- a/event-management/web-admin/src/views/admin/admin-2-topology.vue +++ b/event-management/web-admin/src/views/admin/admin-2-topology.vue @@ -332,9 +332,7 @@ -
- -
+
diff --git a/event-management/web-admin/src/components/chartjs/chartjs.vue b/event-management/web-admin/src/components/chartjs/chartjs.vue index 3f6aa6e57..062924c5e 100644 --- a/event-management/web-admin/src/components/chartjs/chartjs.vue +++ b/event-management/web-admin/src/components/chartjs/chartjs.vue @@ -1,3 +1,12 @@ + + diff --git a/event-management/web-admin/src/components/clock/clock.vue b/event-management/web-admin/src/components/clock/clock.vue index 6fb9d52dd..0656e0bf9 100644 --- a/event-management/web-admin/src/components/clock/clock.vue +++ b/event-management/web-admin/src/components/clock/clock.vue @@ -1,3 +1,11 @@ +